Saltar al contenido

Referencia

Referencia de la API

API REST de e-Payouts para comercios: crear pagos (paymentbox hospedado), consultar su estado, métodos disponibles, saldo y devoluciones. JSON sobre HTTPS; autenticación exclusivamente por cabeceras firmadas con HMAC-SHA256. Los montos viajan siempre como texto con dos decimales y punto ("49.90"), y las fechas en UTC (ISO 8601).

URL base: https://api.e-payouts.com · Todas las rutas requieren las cabeceras firmadas salvo las marcadas "sin autenticación". Autenticación →

Cuenta

Probar las credenciales, consultar el saldo y ver tus módulos y sus métodos de pago.

GET /v2/ping

Probar credenciales

Verifica que tu Key ID, tu secreto y la firma estén bien, sin hacer nada más. Devuelve el nombre del comercio dueño de la clave y la hora del servidor: si la firma falla por timestamp_out_of_range, compará server_time con el reloj de tu servidor. Es la primera llamada recomendada al integrar.

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.object"ping"
data.merchantstringNombre del comercio dueño de la clave.
data.uidinteger | nullTu id de comercio de v1, si la cuenta viene de v1; si no, null.
data.server_timestringHora del servidor (UTC).
Ejemplo
{
    "data": {
        "object": "ping",
        "merchant": "Mi Tienda SL",
        "uid": 73,
        "server_time": "2026-09-30T15:04:05Z"
    }
}
GET /v2/balance

Saldo por moneda

Devuelve tu saldo en cada moneda en la que tenés cuenta: lo disponible para retirar, lo pendiente (pagos cobrados que esperan su fecha de disponibilidad) y lo retenido (reservas de garantía). Es el mismo saldo que ves en tu panel de comercio.

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioarray
data.[].object"balance"
data.[].currencystring · ^[A-Z]{3}$Moneda del saldo.
data.[].availablestring · ^\d+\.\d{2}$Disponible para retirar.
data.[].pendingstring · ^\d+\.\d{2}$Pendiente: pagos cobrados que todavía esperan su fecha de disponibilidad.
data.[].reservedstring · ^\d+\.\d{2}$Retenido: reservas de garantía, hasta su fecha de devolución.
data.[].updated_atstringÚltimo movimiento (UTC).
Ejemplo
{
    "data": [
        {
            "object": "balance",
            "currency": "EUR",
            "available": "1250.40",
            "pending": "486.15",
            "reserved": "62.30",
            "updated_at": "2026-09-30T14:35:10Z"
        }
    ]
}
GET /v2/modules

Listar módulos

Devuelve todos los módulos de tu cuenta con su sitio. Un módulo es una integración de pago (una tienda o un formulario): cada pago se crea para un módulo, que define los métodos habilitados, la URL de notificación y si está en producción (live) o en prueba (sandbox). Usalo para obtener el id del módulo que necesitás al crear pagos.

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioarray
data.[].idstringId del módulo (UUID): el que mandás en module al crear pagos.
data.[].object"module"
data.[].midinteger | nullmid de v1, si el módulo viene de v1.
data.[].namestringNombre que le pusiste.
data.[].modestring (live | sandbox)live = cobra de verdad; sandbox = prueba con simulador.
data.[].statusstring (created | enabled | disabled | off)Solo enabled puede cobrar.
data.[].pricestring | nullPrecio por defecto, si tiene.
data.[].currencystring | nullMoneda del precio, si tiene.
data.[].siteobjectSitio al que pertenece.
data.[].site.namestring
data.[].site.urlstring
data.[].site.statusstring (created | enabled | disabled | locked | off)Solo enabled puede cobrar.
Ejemplo
{
    "data": [
        {
            "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
            "object": "module",
            "mid": 55,
            "name": "Tienda principal",
            "mode": "live",
            "status": "enabled",
            "price": null,
            "currency": null,
            "site": {
                "name": "tienda.example.com",
                "url": "https://tienda.example.com",
                "status": "enabled"
            }
        }
    ]
}
GET /v2/modules/{module}

Ver un módulo

Devuelve un módulo de tu cuenta: nombre, modo (live o sandbox), estado, precio por defecto si tiene y su sitio. Sirve, por ejemplo, para comprobar antes de cobrar que el módulo y su sitio están habilitados.

Parámetros

NombreEnTipoDescripción
module obligatorio pathstring Id del módulo (UUID) o mid de v1.

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.idstringId del módulo (UUID): el que mandás en module al crear pagos.
data.object"module"
data.midinteger | nullmid de v1, si el módulo viene de v1.
data.namestringNombre que le pusiste.
data.modestring (live | sandbox)live = cobra de verdad; sandbox = prueba con simulador.
data.statusstring (created | enabled | disabled | off)Solo enabled puede cobrar.
data.pricestring | nullPrecio por defecto, si tiene.
data.currencystring | nullMoneda del precio, si tiene.
data.siteobjectSitio al que pertenece.
data.site.namestring
data.site.urlstring
data.site.statusstring (created | enabled | disabled | locked | off)Solo enabled puede cobrar.
Ejemplo
{
    "data": {
        "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
        "object": "module",
        "mid": 55,
        "name": "Tienda principal",
        "mode": "live",
        "status": "enabled",
        "price": null,
        "currency": null,
        "site": {
            "name": "tienda.example.com",
            "url": "https://tienda.example.com",
            "status": "enabled"
        }
    }
}
GET /v2/modules/{module}/methods

Métodos disponibles

Devuelve los métodos de pago que el paymentbox le ofrecería al cliente para ese módulo, monto y país, con el código que usa tu integración, el mínimo y el máximo de cada uno y la comisión estimada. Sirve para mostrar los métodos en tu propia tienda o para preseleccionar uno al crear el pago (campo method). amount y currency son obligatorios si el módulo no tiene precio fijo.

Parámetros

NombreEnTipoDescripción
module obligatorio pathstring Id del módulo (UUID) o mid de v1.
amount querystring · ^\d+\.\d{2}$ Monto, con punto decimal.
currency querystring · ^[A-Z]{3}$ Moneda del monto (ISO 4217). Por defecto: "EUR"
country querystring · ^[A-Za-z]{2}$ País del cliente (ISO 3166-1 alfa-2). Algunos métodos solo se ofrecen en ciertos países.
lang querystring (en | es | fr | de | it | pt) Idioma del nombre de cada método (el que ve el cliente en el checkout). Sin este parámetro, el idioma de tu cuenta.

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 403 IP no permitida o comercio deshabilitado.
  • 404 No existe o pertenece a otro comercio.
  • 422 Validación fallida: ver error.fields.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
dataarray
data.[].object"method"
data.[].codestringEl código que usa tu integración (con el ruteo aplicado); es el que mandás en method.
data.[].namestringNombre para mostrar.
data.[].minstring | nullMonto mínimo; null = sin mínimo.
data.[].maxstring | nullMonto máximo; null = sin máximo.
data.[].commissionobjectComisión estimada para ese monto.
data.[].commission.amountstring · ^\d+\.\d{2}$
data.[].commission.currencystring
data.[].requires_phonebooleantrue si el cliente tiene que dar su teléfono (MB WAY).
amountstring · ^\d+\.\d{2}$Monto usado para el cálculo (el precio fijo del módulo, si tiene).
currencystring · ^[A-Z]{3}$Moneda del monto.
sandboxbooleantrue si el módulo está en modo prueba.
Ejemplo
{
    "data": [
        {
            "object": "method",
            "code": "safetypay",
            "name": "SafetyPay",
            "min": "10.00",
            "max": "2000.00",
            "commission": {
                "amount": "8.74",
                "currency": "EUR"
            },
            "requires_phone": false
        },
        {
            "object": "method",
            "code": "multibanco",
            "name": "Multibanco",
            "min": "5.00",
            "max": "1000.00",
            "commission": {
                "amount": "3.17",
                "currency": "EUR"
            },
            "requires_phone": false
        },
        {
            "object": "method",
            "code": "mbway",
            "name": "MB WAY",
            "min": "5.00",
            "max": "1000.00",
            "commission": {
                "amount": "3.17",
                "currency": "EUR"
            },
            "requires_phone": true
        }
    ],
    "amount": "49.90",
    "currency": "EUR",
    "sandbox": false
}

Pagos

Crear pagos (obtener el enlace del paymentbox) y consultar su estado.

POST /v2/payments

Crear un pago

Prepara un cobro y devuelve checkout_url, la dirección del paymentbox donde el cliente elige el método y paga: redirigilo ahí (o abrila en un iframe). Todavía no existe un pago: se crea cuando el cliente elige el método y paga. El resultado llega por webhook a la URL de notificación del módulo, con el mismo ucode. El enlace vence en 60 minutos.

Parámetros

NombreEnTipoDescripción
Idempotency-Key headerstring Opcional (8 a 64 caracteres [A-Za-z0-9_-]). Sirve para reintentar sin duplicar: si repetís la llamada con la misma clave y el mismo cuerpo dentro de 24 h, se devuelve la respuesta original (con la cabecera Idempotent-Replayed: true) en vez de crear otro recurso. Usá una clave nueva por cada operación distinta.

Cuerpo application/json

CampoTipoDescripción
module obligatoriostringId del módulo (UUID) o mid de v1.
amountstring · ^\d+\.\d{2}$Obligatorio si el módulo no tiene precio por defecto. Si el módulo tiene precio fijo, omitilo o mandá ese valor; si no, reemplaza al precio por defecto.
currencystring · ^[A-Z]{3}$Por defecto, la moneda de tu cuenta. Si es otra, el pago se convierte a la de tu cuenta.
ucodestring · ^[A-Za-z0-9._:/#-]{1,64}$Tu código de pedido; vuelve en el webhook y en la redirección.
methodstringPreseleccionar un método (ver /methods). Si no está disponible: 422 method_unavailable.
localestring (en | es | fr | de | it | pt)Idioma del paymentbox. Por defecto: "es"
customerobjectDatos del cliente para completar el formulario del paymentbox (opcional).
customer.namestringNombre y apellido.
customer.emailstringAhí recibe el comprobante.
customer.countrystring · ^[A-Za-z]{2}$País (ISO 3166-1 alfa-2); define qué métodos se ofrecen. Sin país, el paymentbox lo detecta por la IP del cliente y deja que lo cambie.
customer.phonestringMóvil de Portugal (+351 9XXXXXXXX) para MB WAY. Si mandás también method, name y email, el cliente va directo al proveedor, salvo en MB WAY: ahí ve la pantalla con los datos cargados y confirma con un clic.
Ejemplo de cuerpo
{
    "module": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
    "amount": "49.90",
    "currency": "EUR",
    "ucode": "PEDIDO-1042",
    "locale": "es",
    "customer": {
        "name": "Ana García",
        "email": "[email protected]",
        "country": "ES"
    }
}

Respuestas

  • 201 Creado
  • 400 Parámetro inválido o JSON mal formado.
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 403 IP no permitida o comercio deshabilitado.
  • 404 No existe o pertenece a otro comercio.
  • 409 El estado actual no permite la operación.
  • 415 Content-Type incorrecto.
  • 422 Validación fallida: ver error.fields.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.object"checkout"
data.checkout_urlstringEnlace del paymentbox: llevá al cliente ahí.
data.expires_atstringVencimiento del enlace (UTC).
data.sandboxbooleantrue si el módulo está en modo prueba (no se cobra dinero real).
data.moduleobjectMódulo al que pertenece.
data.module.idstringId del módulo (UUID).
data.module.midinteger | nullmid de v1, si el módulo viene de v1.
data.amountstring · ^\d+\.\d{2}$Monto a cobrar.
data.currencystring · ^[A-Z]{3}$Moneda del monto.
data.ucodestring | nullTu código de pedido, si lo mandaste.
data.methodstring | nullMétodo preseleccionado, si pediste uno.
data.methodsarrayCódigos de los métodos que va a ver el cliente.
Ejemplo
{
    "data": {
        "object": "checkout",
        "checkout_url": "http://paymentbox2.e-payouts.local/pagar?t=Xk3v9QpL2mZ7wR4tY8bN1cF6hJ0sD5aG",
        "expires_at": "2026-09-30T16:04:05Z",
        "sandbox": false,
        "module": {
            "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
            "mid": 55
        },
        "amount": "49.90",
        "currency": "EUR",
        "ucode": "PEDIDO-1042",
        "method": null,
        "methods": [
            "sofort",
            "safetypay",
            "ppal",
            "16cards",
            "multibanco",
            "mbway"
        ]
    }
}
GET /v2/payments

Listar pagos

Busca pagos de tu cuenta y los devuelve del más nuevo al más viejo. Sirve para conciliar: por ejemplo, encontrar el pago de un pedido (ucode), revisar los completados de un día o recuperar el estado si se perdió un webhook. Los filtros se combinan. Devuelve hasta limit pagos por página: si has_more es true, pedí la siguiente pasando next_cursor en cursor. Los pagos de prueba (sandbox) se listan aparte, con sandbox=true.

Parámetros

NombreEnTipoDescripción
ucode querystring Solo los pagos de ese código de pedido.
module querystring Solo los de ese módulo: id (UUID) o mid.
status querystring (created | pending | completed | failed | cancelled | refunded | charged_back) Solo los que están en ese estado.
created_from querystring Creados desde esta fecha (UTC), inclusive: YYYY-MM-DD o YYYY-MM-DDTHH:MM:SSZ.
created_to querystring Creados antes de esta fecha (UTC), exclusiva.
sandbox queryboolean true = listar los pagos de prueba de módulos en modo sandbox en vez de los reales. Por defecto: false
limit queryinteger Cantidad de resultados por página (1 a 100). Por defecto: 20
cursor querystring Para pedir la página siguiente: el next_cursor de la respuesta anterior.

Respuestas

  • 200 OK
  • 400 Parámetro inválido o JSON mal formado.
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioarray
data.[].codestringCódigo del pago (UUID).
data.[].object"payment"
data.[].sandboxbooleantrue = pago de prueba (no movió dinero).
data.[].statusstring (created | pending | completed | failed | cancelled | refunded | charged_back)Solo completed significa cobrado. pending = esperando que el cliente termine (p. ej. referencia Multibanco sin pagar).
data.[].ucodestring | nullTu código de pedido.
data.[].methodstringCódigo del método que eligió el cliente.
data.[].effective_methodstringMétodo que efectivamente cobró el pago. Distinto de method solo si ese método tiene un ruteo (p. ej. method ppal, effective_method 16cards).
data.[].amountstring · ^\d+\.\d{2}$Monto que pediste cobrar.
data.[].currencystring · ^[A-Z]{3}$Moneda de amount.
data.[].chargedobject | nullSolo si el método elegido no acepta la moneda del pago (p. ej. MB WAY y Multibanco cobran en EUR): lo que se le cobró al cliente y la tasa usada (mercado + margen). amount y currency siguen siendo lo que pediste. Si no, null.
data.[].charged.amountstring · ^\d+\.\d{2}$
data.[].charged.currencystring
data.[].charged.exchange_ratestring
data.[].moduleobjectMódulo al que pertenece.
data.[].module.idstringId del módulo (UUID).
data.[].module.midinteger | nullmid de v1, si el módulo viene de v1.
data.[].customerobjectDatos que dejó el cliente (cada uno puede ser null).
data.[].customer.namestring | null
data.[].customer.emailstring | null
data.[].customer.countrystring | null
data.[].commissionobjectComisión de e-Payouts. Solo pagos reales.
data.[].commission.amountstring · ^\d+\.\d{2}$
data.[].commission.currencystring
data.[].net_amountstring | nullMonto menos comisión, en la moneda de amount (solo pagos reales; null si se cobró en otra moneda: ver settlement).
data.[].settlementobject | nullLo que se acredita en tu saldo: monto en la moneda de tu cuenta y tasa aplicada (con margen; null si no hubo conversión). Solo pagos reales.
data.[].settlement.amountstring · ^\d+\.\d{2}$
data.[].settlement.currencystring (EUR | USD)
data.[].settlement.exchange_ratestring | null
data.[].completed_atstring | nullCuándo se cobró; null si todavía no. Solo pagos reales.
data.[].created_atstringCuándo se creó el pago (UTC).
has_more obligatoriobooleantrue si hay más resultados después de esta página.
next_cursor obligatoriostring | nullPasalo como cursor para pedir la página siguiente; null en la última página.
Ejemplo
{
    "data": [
        {
            "code": "8a2c4e6f-1b3d-4f5a-9c7e-0d2f4a6b8c1e",
            "object": "payment",
            "sandbox": false,
            "status": "pending",
            "ucode": "PEDIDO-1043",
            "method": "multibanco",
            "effective_method": "multibanco",
            "amount": "12.00",
            "currency": "USD",
            "charged": {
                "amount": "10.65",
                "currency": "EUR",
                "exchange_rate": "0.8877599005"
            },
            "module": {
                "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
                "mid": 55
            },
            "customer": {
                "name": "João Silva",
                "email": "[email protected]",
                "country": "PT"
            },
            "commission": {
                "amount": "0.82",
                "currency": "EUR"
            },
            "net_amount": null,
            "settlement": {
                "amount": "11.93",
                "currency": "USD",
                "exchange_rate": "1.120629575"
            },
            "completed_at": null,
            "created_at": "2026-09-30T14:35:10Z"
        },
        {
            "code": "3f6b2d10-9a4c-4e21-8b7f-5c0d1e2f3a4b",
            "object": "payment",
            "sandbox": false,
            "status": "completed",
            "ucode": "PEDIDO-1042",
            "method": "sofort",
            "effective_method": "sofort",
            "amount": "49.90",
            "currency": "EUR",
            "charged": null,
            "module": {
                "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
                "mid": 55
            },
            "customer": {
                "name": "Ana García",
                "email": "[email protected]",
                "country": "ES"
            },
            "commission": {
                "amount": "2.15",
                "currency": "EUR"
            },
            "net_amount": "47.75",
            "settlement": {
                "amount": "49.90",
                "currency": "EUR",
                "exchange_rate": null
            },
            "completed_at": "2026-09-18T14:35:02Z",
            "created_at": "2026-09-18T14:33:22Z"
        }
    ],
    "has_more": true,
    "next_cursor": "MTAyNA"
}
GET /v2/payments/{code}

Ver un pago

Devuelve el estado actual y el detalle de un pago: método, montos, comisión, neto y liquidación. Usalo para confirmar un webhook antes de entregar el pedido (consultá el pago por su id y verificá status y amount) o para mostrar el estado en tu sistema. Sirve para pagos reales y de prueba; los de prueba no traen commission, net_amount, settlement ni completed_at.

Parámetros

NombreEnTipoDescripción
code obligatorio pathstring Código del pago (UUID, el campo code del pago).

Respuestas

  • 200 OK
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.codestringCódigo del pago (UUID).
data.object"payment"
data.sandboxbooleantrue = pago de prueba (no movió dinero).
data.statusstring (created | pending | completed | failed | cancelled | refunded | charged_back)Solo completed significa cobrado. pending = esperando que el cliente termine (p. ej. referencia Multibanco sin pagar).
data.ucodestring | nullTu código de pedido.
data.methodstringCódigo del método que eligió el cliente.
data.effective_methodstringMétodo que efectivamente cobró el pago. Distinto de method solo si ese método tiene un ruteo (p. ej. method ppal, effective_method 16cards).
data.amountstring · ^\d+\.\d{2}$Monto que pediste cobrar.
data.currencystring · ^[A-Z]{3}$Moneda de amount.
data.chargedobject | nullSolo si el método elegido no acepta la moneda del pago (p. ej. MB WAY y Multibanco cobran en EUR): lo que se le cobró al cliente y la tasa usada (mercado + margen). amount y currency siguen siendo lo que pediste. Si no, null.
data.charged.amountstring · ^\d+\.\d{2}$
data.charged.currencystring
data.charged.exchange_ratestring
data.moduleobjectMódulo al que pertenece.
data.module.idstringId del módulo (UUID).
data.module.midinteger | nullmid de v1, si el módulo viene de v1.
data.customerobjectDatos que dejó el cliente (cada uno puede ser null).
data.customer.namestring | null
data.customer.emailstring | null
data.customer.countrystring | null
data.commissionobjectComisión de e-Payouts. Solo pagos reales.
data.commission.amountstring · ^\d+\.\d{2}$
data.commission.currencystring
data.net_amountstring | nullMonto menos comisión, en la moneda de amount (solo pagos reales; null si se cobró en otra moneda: ver settlement).
data.settlementobject | nullLo que se acredita en tu saldo: monto en la moneda de tu cuenta y tasa aplicada (con margen; null si no hubo conversión). Solo pagos reales.
data.settlement.amountstring · ^\d+\.\d{2}$
data.settlement.currencystring (EUR | USD)
data.settlement.exchange_ratestring | null
data.completed_atstring | nullCuándo se cobró; null si todavía no. Solo pagos reales.
data.created_atstringCuándo se creó el pago (UTC).
Ejemplo
{
    "data": {
        "code": "3f6b2d10-9a4c-4e21-8b7f-5c0d1e2f3a4b",
        "object": "payment",
        "sandbox": false,
        "status": "completed",
        "ucode": "PEDIDO-1042",
        "method": "sofort",
        "effective_method": "sofort",
        "amount": "49.90",
        "currency": "EUR",
        "charged": null,
        "module": {
            "id": "7c1e4a52-5d0b-4f7e-9a1d-3b8f2c6d9e10",
            "mid": 55
        },
        "customer": {
            "name": "Ana García",
            "email": "[email protected]",
            "country": "ES"
        },
        "commission": {
            "amount": "2.15",
            "currency": "EUR"
        },
        "net_amount": "47.75",
        "settlement": {
            "amount": "49.90",
            "currency": "EUR",
            "exchange_rate": null
        },
        "completed_at": "2026-09-18T14:35:02Z",
        "created_at": "2026-09-18T14:33:22Z"
    }
}

Devoluciones y contracargos

Pedir la devolución de un pago y consultar devoluciones y contracargos.

POST /v2/payments/{code}/refunds

Solicitar devolución

Pide la devolución total de un pago completado. Queda en estado created hasta que e-Payouts la procesa; solo una devolución viva por pago. Solo se puede pedir dentro del plazo configurado por e-Payouts desde que se completó el pago (hoy, 2 meses); pasado el plazo responde 409 refund_window_expired y hay que pedirla por ticket en tu panel de comercio. Los pagos de prueba no se devuelven.

Parámetros

NombreEnTipoDescripción
code obligatorio pathstring Código del pago (UUID, el campo code del pago).
Idempotency-Key headerstring Opcional (8 a 64 caracteres [A-Za-z0-9_-]). Sirve para reintentar sin duplicar: si repetís la llamada con la misma clave y el mismo cuerpo dentro de 24 h, se devuelve la respuesta original (con la cabecera Idempotent-Replayed: true) en vez de crear otro recurso. Usá una clave nueva por cada operación distinta.

Cuerpo application/json

CampoTipoDescripción
reasonstringMotivo (opcional), para tu registro y el de e-Payouts.
Ejemplo de cuerpo
{
    "reason": "El cliente canceló el pedido"
}

Respuestas

  • 201 Creada
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 409 El estado actual no permite la operación.
  • 422 Validación fallida: ver error.fields.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.idstringId de la devolución o del contracargo (UUID).
data.objectstring (refund | chargeback)refund = devolución; chargeback = contracargo (el cliente reclamó el cobro a su banco).
data.statusstring (created | processing | completed | rejected)created = pedida; processing = en curso; completed = hecha; rejected = rechazada.
data.amountstring · ^\d+\.\d{2}$Monto devuelto o reclamado.
data.currencystring · ^[A-Z]{3}$Moneda de amount.
data.reasonstring | nullMotivo, si hay.
data.paymentstringId del pago (UUID).
data.created_atstringCuándo se creó (UTC).
data.resolved_atstring | nullCuándo terminó (completed o rejected); null mientras sigue en curso.
Ejemplo
{
    "data": {
        "id": "c4d5e6f7-0a1b-4c2d-8e3f-4a5b6c7d8e9f",
        "object": "refund",
        "status": "created",
        "amount": "49.90",
        "currency": "EUR",
        "reason": "El cliente canceló el pedido",
        "payment": "3f6b2d10-9a4c-4e21-8b7f-5c0d1e2f3a4b",
        "created_at": "2026-09-20T09:12:44Z",
        "resolved_at": null
    }
}
GET /v2/payments/{code}/adjustments

Devoluciones y contracargos de un pago

Devuelve las devoluciones y los contracargos de un pago, del más nuevo al más viejo, con su estado. Sirve para seguir una devolución que pediste o ver si el cliente reclamó el cobro a su banco.

Parámetros

NombreEnTipoDescripción
code obligatorio pathstring Código del pago (UUID, el campo code del pago).
limit queryinteger Cantidad de resultados por página (1 a 100). Por defecto: 20
cursor querystring Para pedir la página siguiente: el next_cursor de la respuesta anterior.

Respuestas

  • 200 OK
  • 400 Parámetro inválido o JSON mal formado.
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioarray
data.[].idstringId de la devolución o del contracargo (UUID).
data.[].objectstring (refund | chargeback)refund = devolución; chargeback = contracargo (el cliente reclamó el cobro a su banco).
data.[].statusstring (created | processing | completed | rejected)created = pedida; processing = en curso; completed = hecha; rejected = rechazada.
data.[].amountstring · ^\d+\.\d{2}$Monto devuelto o reclamado.
data.[].currencystring · ^[A-Z]{3}$Moneda de amount.
data.[].reasonstring | nullMotivo, si hay.
data.[].paymentstringId del pago (UUID).
data.[].created_atstringCuándo se creó (UTC).
data.[].resolved_atstring | nullCuándo terminó (completed o rejected); null mientras sigue en curso.
has_more obligatoriobooleantrue si hay más resultados después de esta página.
next_cursor obligatoriostring | nullPasalo como cursor para pedir la página siguiente; null en la última página.
Ejemplo
{
    "data": [
        {
            "id": "c4d5e6f7-0a1b-4c2d-8e3f-4a5b6c7d8e9f",
            "object": "refund",
            "status": "created",
            "amount": "49.90",
            "currency": "EUR",
            "reason": "El cliente canceló el pedido",
            "payment": "3f6b2d10-9a4c-4e21-8b7f-5c0d1e2f3a4b",
            "created_at": "2026-09-20T09:12:44Z",
            "resolved_at": null
        }
    ],
    "has_more": false,
    "next_cursor": null
}
GET /v2/adjustments

Listar devoluciones y contracargos

Devuelve las devoluciones y los contracargos de toda tu cuenta, del más nuevo al más viejo. Sirve para conciliar los montos que se descontaron de tu saldo. Se puede filtrar por tipo, estado o pago, y se pagina igual que los pagos.

Parámetros

NombreEnTipoDescripción
type querystring (refund | chargeback) refund = devoluciones; chargeback = contracargos.
status querystring (created | processing | completed | rejected) Solo los que están en ese estado.
payment querystring Solo los de ese pago (id UUID).
limit queryinteger Cantidad de resultados por página (1 a 100). Por defecto: 20
cursor querystring Para pedir la página siguiente: el next_cursor de la respuesta anterior.

Respuestas

  • 200 OK
  • 400 Parámetro inválido o JSON mal formado.
  • 401 Firma ausente, inválida, vencida o reutilizada.
  • 404 No existe o pertenece a otro comercio.
  • 429 Límite de solicitudes superado (ver Retry-After).
  • 503 Mantenimiento o API desactivada.
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioarray
data.[].idstringId de la devolución o del contracargo (UUID).
data.[].objectstring (refund | chargeback)refund = devolución; chargeback = contracargo (el cliente reclamó el cobro a su banco).
data.[].statusstring (created | processing | completed | rejected)created = pedida; processing = en curso; completed = hecha; rejected = rechazada.
data.[].amountstring · ^\d+\.\d{2}$Monto devuelto o reclamado.
data.[].currencystring · ^[A-Z]{3}$Moneda de amount.
data.[].reasonstring | nullMotivo, si hay.
data.[].paymentstringId del pago (UUID).
data.[].created_atstringCuándo se creó (UTC).
data.[].resolved_atstring | nullCuándo terminó (completed o rejected); null mientras sigue en curso.
has_more obligatoriobooleantrue si hay más resultados después de esta página.
next_cursor obligatoriostring | nullPasalo como cursor para pedir la página siguiente; null en la última página.
Ejemplo
{
    "data": [
        {
            "id": "c4d5e6f7-0a1b-4c2d-8e3f-4a5b6c7d8e9f",
            "object": "refund",
            "status": "created",
            "amount": "49.90",
            "currency": "EUR",
            "reason": "El cliente canceló el pedido",
            "payment": "3f6b2d10-9a4c-4e21-8b7f-5c0d1e2f3a4b",
            "created_at": "2026-09-20T09:12:44Z",
            "resolved_at": null
        },
        {
            "id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
            "object": "chargeback",
            "status": "completed",
            "amount": "30.00",
            "currency": "EUR",
            "reason": null,
            "payment": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
            "created_at": "2026-09-10T16:40:00Z",
            "resolved_at": "2026-09-12T10:05:31Z"
        }
    ],
    "has_more": false,
    "next_cursor": null
}

Compatibilidad v1

Mismos parámetros y respuestas que api.e-payouts.com (v1), con la autenticación nueva. Para migrar sin reescribir la integración. Solo disponibles si la integración v1 está habilitada en tu cuenta.

POST /v1/createCode

createCode (v1): crear pago

Lo mismo que POST /v2/payments con los parámetros de v1: devuelve el enlace del paymentbox al que tenés que llevar al cliente. Con direct presente, en vez de responder JSON redirige (302) directamente a ese enlace. Ojo: a diferencia de las demás rutas v1, la respuesta no trae message ni data.

Cuerpo application/x-www-form-urlencoded

CampoTipoDescripción
uid obligatoriostringId de comercio de v1 (el de tu cuenta).
mid obligatoriostringId de módulo de v1 (mid).
pricestringMonto (moneda de tu cuenta). Obligatorio si el módulo no tiene precio por defecto; si su precio es fijo, se cobra ese.
typestringCódigo de método para preseleccionarlo (opcional).
ccstringPaís del cliente (2 letras).
emailstringEmail del cliente.
namestringNombre del cliente.
lastnamestringApellido del cliente.
ucodestringTu código de pedido.
directstringSi está presente (cualquier valor), redirige (302) al paymentbox.
Ejemplo de cuerpo
uid=73&mid=55&price=49.90&cc=es&email=ana%40example.com&name=Ana&lastname=Garc%C3%ADa&ucode=PEDIDO-1042

Respuestas

  • 200 Siempre HTTP 200. Si salió bien, error = 0 con el enlace; si no, error trae el número de error de v1 (ver Errores).
  • 302 Con direct: redirección al paymentbox (cabecera Location).
Esquema y ejemplo de respuesta
CampoTipoDescripción
errorinteger0 = salió bien.
codestringCódigo de la sesión de pago (la parte final de url).
urlstringEnlace del paymentbox al que llevás al cliente.
expires_atstringVencimiento del enlace (UTC).
Ejemplo
{
    "error": 0,
    "code": "Xk3v9QpL2mZ7wR4tY8bN1cF6hJ0sD5aG",
    "url": "http://paymentbox2.e-payouts.local/pagar?t=Xk3v9QpL2mZ7wR4tY8bN1cF6hJ0sD5aG",
    "expires_at": "2026-09-30T16:04:05Z"
}
POST /v1/getData

getData (v1): sitio, módulo y métodos

Devuelve el estado del sitio y del módulo y los métodos disponibles para un país, con su mínimo y máximo, y la dirección para crear pagos. Equivale a GET /v2/modules/{module}/methods en el formato de v1.

Cuerpo application/x-www-form-urlencoded

CampoTipoDescripción
uid obligatoriostringId de comercio de v1 (el de tu cuenta).
mid obligatoriostringId de módulo de v1 (mid).
cc obligatoriostringPaís del cliente (2 letras).
pricestringMonto; obligatorio si el módulo no tiene precio fijo.
Ejemplo de cuerpo
uid=73&mid=55&cc=pt&price=49.90

Respuestas

  • 200 Siempre HTTP 200. Si salió bien, error = 0 y los datos en data; si no, error trae el número de error de v1 (ver Errores).
Esquema y ejemplo de respuesta
CampoTipoDescripción
errorinteger0 = salió bien.
messagestringTexto fijo de v1.
dataobject
data.errorintegerSiempre 0 (se repite dentro de data, como en v1).
data.sitesobjectEstado y URL del sitio del módulo.
data.modulesobjectPrecio, estado, moneda, IPs permitidas (api_ip, separadas por coma) y métodos por país (price, pmin, pmax, name).
data.gatewayobjectURL de createCode.
Ejemplo
{
    "error": 0,
    "message": "API response -> successful request.",
    "data": {
        "error": 0,
        "sites": {
            "status": "enabled",
            "url": "https://tienda.example.com"
        },
        "modules": {
            "price": null,
            "status": "enabled",
            "currency": "EUR",
            "country": "pt",
            "api_ip": "",
            "methods": {
                "pt": [
                    {
                        "method": "multibanco",
                        "country": "pt",
                        "price": "49.90",
                        "pmin": "5.00",
                        "pmax": "1000.00",
                        "name": "Multibanco"
                    },
                    {
                        "method": "mbway",
                        "country": "pt",
                        "price": "49.90",
                        "pmin": "5.00",
                        "pmax": "1000.00",
                        "name": "MB WAY"
                    }
                ]
            }
        },
        "gateway": {
            "url": "http://api2.e-payouts.local/v1/createCode"
        }
    }
}

Sin autenticación

Estado del servicio.

GET /health sin autenticación

Estado del servicio

Indica si la API está en línea. No necesita firma: sirve para monitoreo (por ejemplo, un chequeo periódico desde tu servidor).

Respuestas

  • 200 OK
Esquema y ejemplo de respuesta
CampoTipoDescripción
data obligatorioobject
data.status"ok"Siempre "ok" si la API responde.
Ejemplo
{
    "data": {
        "status": "ok"
    }
}