/api/payments/hostedIdempotency-Key erforderlichZahlung erstellen
Liefert 201 mit der neuen Zahlung. Wird dieselbe Anfrage mit demselben Idempotency-Key erneut gesendet, lautet die Antwort 200 mit derselben Zahlung.
Anfrage-Body
| Feld | Typ | Erforderlich | Beschreibung | Beispiel |
|---|---|---|---|---|
merchant_order_id | string | Erforderlich | Ihre Bestellreferenz: 1–64 Zeichen aus A-Z a-z 0-9 . _ -. Jede Referenz kann pro Umgebung für genau eine Zahlung verwendet werden, auch wenn diese Zahlung fehlgeschlagen oder abgelaufen ist. Bei der Eindeutigkeitsprüfung wird nicht zwischen Groß- und Kleinschreibung unterschieden: ORDER-1 und order-1 gelten als dieselbe Referenz. | ORDER-2026-001 |
amount | string | Erforderlich | Positiver Betrag mit zwei Nachkommastellen und ohne führende Nullen, zum Beispiel "100.00". Muss innerhalb Ihrer Kontolimits liegen. | "100.00" |
currency | string | Optional | Fehlt die Angabe, gilt die Hauptwährung des Systems.USDEURAEDTRY | USD |
webhook_url | string · uri | Erforderlich | Endpunkt, der die Webhooks für diese Zahlung empfängt. Öffentliches HTTPS auf Port 443, höchstens 500 Zeichen, ohne Benutzerinformationen oder Fragment. Private und lokale Adressen werden nicht akzeptiert, auch nicht in der Sandbox; der Hostname muss zum Zeitpunkt der Anfrage auf eine öffentliche IP-Adresse auflösen, andernfalls 422 9000008. | https://merchant.example/webhooks/payments |
success_url | string · uri | Erforderlich | Weiterleitungsziel für den Browser nach einer erfolgreichen Zahlung. HTTPS, höchstens 2048 Zeichen, ohne Benutzerinformationen und Fragment. In der Sandbox werden zusätzlich http://localhost, 127.0.0.1 und [::1] akzeptiert. | https://merchant.example/payment/success |
fail_url | string · uri | Erforderlich | Weiterleitungsziel für den Browser, wenn die Zahlung fehlschlägt, abläuft oder abgebrochen wird. Es gelten dieselben Regeln wie für success_url. | https://merchant.example/payment/failure |
customer | object | Erforderlich | Kontaktdaten des Zahlenden; sie werden für das Zahlungsergebnis, den Beleg und die Prüfschritte der Bank verwendet. Nur email und phone werden akzeptiert; jedes andere Feld innerhalb von customer wird mit 422 1000001 abgelehnt. | { … } |
customer.email | string | Erforderlich | Die echte E-Mail-Adresse des Zahlenden: RFC 5322, höchstens 254 Zeichen, Domain mit Punkt. Sie wird in Kleinbuchstaben gespeichert. | [email protected] |
customer.phone | string | Erforderlich | Die echte Telefonnummer des Zahlenden im internationalen Format (+ Ländervorwahl, E.164), zum Beispiel +37061234567. Regel für die Türkei: +90 gefolgt von der 10-stelligen nationalen Nummer (5xx mobil, 2xx, 3xx, 4xx Festnetz, 8xx Sonderrufnummern). Eine Nummer ohne Ländervorwahl wird als türkische Nummer (+90) behandelt. | +37061234567 |
Diese drei URLs gelten nur für diese Zahlung und werden nicht aus Ihren Panel-Einstellungen übernommen.
Die Zahlungsseite fragt den Zahlenden nicht erneut nach E-Mail-Adresse und Telefonnummer. Aus Datenschutzgründen wird customer weder im Zahlungsobjekt noch in Webhooks zurückgegeben.
| Feld | Grund | Meldung in errors |
|---|---|---|
customer.email | Ungültiges Format oder länger als 254 Zeichen. | customer.email must be a valid e-mail address (max 254 characters). |
customer.email | Platzhalter-, Beispiel- oder Wegwerfadresse. | customer.email must be the payer's real address; placeholder, example or disposable addresses (example.com, test@…, mailinator…) are not accepted. |
customer.phone | Keine gültige Nummer im internationalen Format. | customer.phone must be a valid phone number in international format (e.g. +37061234567). |
customer.phone | Wiederholtes oder aufeinanderfolgendes Ziffernmuster. | customer.phone must be the payer's real number; repeated or sequential digit patterns (5555555555, 1234567890) are not accepted. |
customer.phone | Türkische Nummer nicht in der Form +90 gefolgt von 10 Ziffern, die mit 2, 3, 4, 5 oder 8 beginnen. | customer.phone for Türkiye must be +90 followed by a 10-digit number starting with 2, 3, 4, 5 or 8 (e.g. +905321234567). |
HTTP 422 · 1000001
{
"type": "https://payniko.com/problems/1000001",
"title": "Validation failed",
"status": 422,
"detail": "The submitted fields are not valid.",
"code": "1000001",
"correlation_id": "4c7a1e9d-2b3f-4d85-9a6e-0f1b2c3d4e5f",
"errors": {
"customer.email": [
"customer.email must be the payer's real address; placeholder, example or disposable addresses (example.com, test@…, mailinator…) are not accepted."
],
"customer.phone": [
"customer.phone must be the payer's real number; repeated or sequential digit patterns (5555555555, 1234567890) are not accepted."
]
}
}Wird eine Anfrage wegen customer abgelehnt, zeigen Sie dem Zahlenden den Grund klar an (zum Beispiel: Geben Sie Ihre eigene E-Mail-Adresse oder Telefonnummer ein) und lassen Sie ihn das Feld korrigieren, bevor Sie die Zahlung erneut erstellen. Die Meldungen in errors sind auf Englisch und für Ihre Protokolle und den Support gedacht.
Payniko-Zahlungslink-Seiten wenden dieselben Regeln auf die dort vom Zahlenden eingegebene E-Mail-Adresse und Telefonnummer an und zeigen dem Zahlenden den Grund einer Ablehnung.
Anfrage-Body · Beispiel
{
"merchant_order_id": "ORDER-2026-001",
"amount": "100.00",
"currency": "USD",
"webhook_url": "https://merchant.example/webhooks/payments",
"success_url": "https://merchant.example/payment/success",
"fail_url": "https://merchant.example/payment/failure",
"customer": {
"email": "[email protected]",
"phone": "+37061234567"
}
}KEY="$(openssl rand -hex 16)" # store with the order before sending; reuse it after network errors
./payniko.sh POST '/api/payments/hosted' '{
"merchant_order_id": "ORDER-2026-001",
"amount": "100.00",
"currency": "USD",
"webhook_url": "https://merchant.example/webhooks/payments",
"success_url": "https://merchant.example/payment/success",
"fail_url": "https://merchant.example/payment/failure",
"customer": {
"email": "[email protected]",
"phone": "+37061234567"
}
}' "$KEY"import {api, randomUUID} from './payniko.mjs';
const key = randomUUID(); // Store this key with the order before sending; reuse it after network errors.
const payment = await api('POST', '/api/payments/hosted', {
"merchant_order_id": "ORDER-2026-001",
"amount": "100.00",
"currency": "USD",
"webhook_url": "https://merchant.example/webhooks/payments",
"success_url": "https://merchant.example/payment/success",
"fail_url": "https://merchant.example/payment/failure",
"customer": {
"email": "[email protected]",
"phone": "+37061234567"
}
}, key);
console.log(payment);<?php
require __DIR__ . '/payniko.php';
$key = bin2hex(random_bytes(16)); // store with the order; reuse it after network errors
$payment = payniko_api('POST', '/api/payments/hosted', [
"merchant_order_id" => 'ORDER-2026-001',
"amount" => '100.00',
"currency" => 'USD',
"webhook_url" => 'https://merchant.example/webhooks/payments',
"success_url" => 'https://merchant.example/payment/success',
"fail_url" => 'https://merchant.example/payment/failure',
"customer" => [
"email" => '[email protected]',
"phone" => '+37061234567',
],
], $key);
print_r($payment);from payniko import api
import uuid
key = str(uuid.uuid4()) # store with the order; reuse it after network errors
payment = api("POST", "/api/payments/hosted", {
"merchant_order_id": "ORDER-2026-001",
"amount": "100.00",
"currency": "USD",
"webhook_url": "https://merchant.example/webhooks/payments",
"success_url": "https://merchant.example/payment/success",
"fail_url": "https://merchant.example/payment/failure",
"customer": {
"email": "[email protected]",
"phone": "+37061234567"
}
}, key)
print(payment)Antwort · 201
Liefert { "data": Payment } mit status: requires_action und next_action.url.
Antwort · Beispiel
{
"data": {
"payment_id": "LUVEI-PAYN-123456",
"merchant_order_id": "ORDER-2026-001",
"flow": "hosted",
"status": "requires_action",
"amount": "100.00",
"currency": "USD",
"environment": "sandbox",
"next_action": {
"type": "redirect",
"url": "https://payniko.com/l/example-checkout",
"expires_at": "2026-11-02T12:00:00.000Z"
},
"card": null,
"failure": null,
"created_at": "2026-11-01T12:00:00.000Z",
"expires_at": "2026-11-02T12:00:00.000Z",
"completed_at": null
}
}Weitere Antworten
200: Derselbe Idempotenzschlüssel und derselbe Body wurden erneut gesendet. Die ursprüngliche Zahlung wird zurückgegeben, und es wird keine neue Zahlung erstellt.4099000010: Dieser Idempotenzschlüssel wurde bereits mit einem anderen Body verwendet.4099000039: Die erste Anfrage mit diesem Schlüssel wird noch verarbeitet. Senden Sie dieselbe Anfrage nach einer kurzen Wartezeit erneut.4099000007: Für diesemerchant_order_idexistiert bereits eine Zahlung.4229000005: Der Betrag liegt außerhalb Ihrer Kontolimits;limitsenthält den zulässigen Bereich.4221000001mitcustomer,customer.emailodercustomer.phoneinerrors: Die Kontaktdaten fehlen oder sind ungültig.4221000001,1000020,1000021,9000008,9000038: Ein Feld ist ungültig; Einzelheiten enthaltenerrorsundintegration.violations.
HTTP 422 · 9000005
{
"type": "https://payniko.com/problems/9000005",
"title": "Invalid amount",
"status": 422,
"detail": "The amount is outside the account limits.",
"code": "9000005",
"correlation_id": "6d1f0c2e-8a4b-4c7d-9e21-3f5a7b9c1d20",
"limits": {
"currency_code": "USD",
"min_amount": "25.00",
"max_amount": null
}
}Limits werden in der Hauptwährung des Systems (limits.currency_code) geprüft, nachdem Ihr Betrag umgerechnet wurde. max_amount: null bedeutet, dass keine Obergrenze besteht. Die Limitwerte in diesem Beispiel dienen nur der Veranschaulichung.