/api/payments/hostedRequiere Idempotency-KeyCrear un pago
Devuelve 201 con el pago nuevo. Si se reenvía la misma solicitud con el mismo Idempotency-Key, se devuelve 200 con el mismo pago.
Cuerpo de la solicitud
| Campo | Tipo | Obligatorio | Descripción | Ejemplo |
|---|---|---|---|---|
merchant_order_id | string | Obligatorio | Su referencia de pedido: de 1 a 64 caracteres de A-Z a-z 0-9 . _ -. Cada referencia puede utilizarse para un solo pago por entorno, aunque ese pago haya fallado o expirado. La unicidad no distingue entre mayúsculas y minúsculas: ORDER-1 y order-1 se consideran la misma referencia. | ORDER-2026-001 |
amount | string | Obligatorio | Importe positivo con dos decimales y sin ceros a la izquierda, por ejemplo "100.00". Debe estar dentro de los límites de su cuenta. | "100.00" |
currency | string | Opcional | Si se omite, se aplica la moneda principal del sistema.USDEURAEDTRY | USD |
webhook_url | string · uri | Obligatorio | Punto de conexión que recibe los webhooks de este pago. HTTPS público en el puerto 443, 500 caracteres como máximo, sin información de usuario ni fragmento. No se aceptan direcciones privadas ni locales, tampoco en sandbox; el nombre de host debe resolverse a una IP pública en el momento de la solicitud, de lo contrario 422 9000008. | https://merchant.example/webhooks/payments |
success_url | string · uri | Obligatorio | Destino de redirección del navegador tras un pago completado correctamente. HTTPS, 2048 caracteres como máximo, sin información de usuario ni fragmento. En sandbox también se admiten http://localhost, 127.0.0.1 y [::1]. | https://merchant.example/payment/success |
fail_url | string · uri | Obligatorio | Destino de redirección del navegador cuando el pago falla, expira o se cancela. Se aplican las mismas reglas que a success_url. | https://merchant.example/payment/failure |
customer | object | Obligatorio | Datos de contacto del pagador; se usan para el resultado del pago, el recibo y los pasos de verificación del banco. Solo se aceptan email y phone; cualquier otro campo dentro de customer se rechaza con 422 1000001. | { … } |
customer.email | string | Obligatorio | La dirección de correo electrónico real del pagador: RFC 5322, 254 caracteres como máximo, con dominio con punto. Se guarda en minúsculas. | [email protected] |
customer.phone | string | Obligatorio | El número de teléfono real del pagador en formato internacional (+ código de país, E.164), por ejemplo +37061234567. Regla específica para Turquía: +90 seguido del número nacional de 10 dígitos (5xx móvil, 2xx, 3xx, 4xx fijo, 8xx especial). Un número enviado sin código de país se trata como número turco (+90). | +37061234567 |
Estas tres URL se aplican únicamente a este pago y no se toman de la configuración de su panel.
La página de pago no vuelve a pedir al pagador el correo electrónico ni el número de teléfono. Por privacidad, customer no se devuelve en el objeto de pago ni en los webhooks.
| Campo | Motivo | Mensaje en errors |
|---|---|---|
customer.email | Formato no válido o más de 254 caracteres. | customer.email must be a valid e-mail address (max 254 characters). |
customer.email | Dirección de relleno, de ejemplo o desechable. | customer.email must be the payer's real address; placeholder, example or disposable addresses (example.com, test@…, mailinator…) are not accepted. |
customer.phone | No es un número válido en formato internacional. | customer.phone must be a valid phone number in international format (e.g. +37061234567). |
customer.phone | Patrón de dígitos repetidos o consecutivos. | customer.phone must be the payer's real number; repeated or sequential digit patterns (5555555555, 1234567890) are not accepted. |
customer.phone | Número turco que no tiene la forma +90 seguido de 10 dígitos que empiezan por 2, 3, 4, 5 u 8. | 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."
]
}
}Si una solicitud se rechaza por customer, muestre al pagador el motivo con claridad (por ejemplo: introduzca su propio correo electrónico o número de teléfono) y permítale corregir el campo antes de crear el pago de nuevo. Los mensajes de errors están en inglés y están pensados para sus registros y para soporte.
Las páginas de enlace de pago de Payniko aplican las mismas reglas al correo electrónico y al número de teléfono que el pagador introduce allí, y le muestran el motivo de un rechazo.
Cuerpo de la solicitud · Ejemplo
{
"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)Respuesta · 201
Devuelve { "data": Payment } con status: requires_action y next_action.url.
Respuesta · Ejemplo
{
"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
}
}Otras respuestas
200: se reenviaron la misma clave y el mismo cuerpo. Se devuelve el pago original y no se crea ningún pago nuevo.4099000010: esta clave ya se utilizó con un cuerpo distinto.4099000039: la primera solicitud con esta clave todavía se está procesando. Reenvíe la misma solicitud tras una breve espera.4099000007: ya existe un pago para estemerchant_order_id.4229000005: el importe está fuera de los límites de su cuenta;limitscontiene el rango permitido.4221000001concustomer,customer.emailocustomer.phoneenerrors: faltan los datos de contacto o no son válidos.4221000001,1000020,1000021,9000008,9000038: un campo no es válido; los detalles figuran enerrorsy enintegration.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
}
}Los límites se evalúan en la moneda principal del sistema (limits.currency_code) después de convertir su importe. max_amount: null significa que no hay límite superior. Los valores de límite de este ejemplo son ilustrativos.