Índice de la documentación

Manejo de errores

Formato de error estandar

Todas las respuestas de error siguen este formato:

json
{
  "success": false,
  "error": {
    "message": "Descripcion legible del error",
    "code": 12001,
    "statusCode": 400,
    "traceId": "abc123def456..."
  }
}
CampoDescripcion
messageDescripcion del error en ingles
codeCodigo interno de error (ver tabla abajo)
statusCodeCodigo HTTP de la respuesta
traceIdIdentificador unico para soporte tecnico
Nota de seguridad: Los errores internos del servidor (5xx) devuelven un mensaje generico ("An error has occurred...") para no exponer detalles de implementacion. El traceId permite al equipo de soporte investigar el error concreto.
Nota sobre entornos: Los codigos de error, formatos y mensajes son identicos en los entornos Live y Test. No hay diferencias en el manejo de errores entre entornos.

Catalogo de codigos de error

Errores de autenticacion y autorizacion (11xxx)

CodigoHTTPDescripcionAccion recomendada
11001403API key invalida o no proporcionadaVerifica la cabecera X-API-KEY
11002403IP no permitidaConfigura tu IP en el dashboard (Integraciones > Configuración > API keys)
11008403Acceso denegado al recursoEl webcode no coincide, el pago no pertenece a la External API, o error de entorno

Errores de validacion (12xxx)

CodigoHTTPDescripcionAccion recomendada
12001400Parametro requerido faltante o formato invalidoRevisa los campos obligatorios y sus formatos
12002400Fecha en formato incorrectoUsa formato ISO 8601 (ej: 2026-07-15T14:00:00Z)
12006400Formato de pais invalidoUsa ISO 3166-1 alpha-2 (ej: ES, FR, DE)
12009400Pais no soportadoConsulta con soporte la lista de paises disponibles

Errores de recurso (10xxx)

CodigoHTTPDescripcionAccion recomendada
10404404Recurso no encontradoVerifica que el sessionId o paymentReference sea correcto

Errores de POS (13xxx)

CodigoHTTPDescripcionAccion recomendada
13001500Error del proveedor de pagosReintenta despues de unos segundos. Si persiste, contacta soporte
13004502Error de comunicacion con el terminalVerifica que el terminal esta encendido y conectado
13005409Terminal ocupadoEspera a que termine la transaccion en curso e intenta de nuevo

Conflictos de idempotencia (409)

Estos conflictos no llevan un codigo numerico interno: el mensaje permite distinguirlos del 409 de POS ocupado (codigo 13005).

CasoHTTPMensaje (literal)Accion recomendada
Misma Idempotency-Key, body distinto409Idempotency key reused with a different request body.Usa una clave nueva o reenvia el mismo body que la peticion original
Misma Idempotency-Key, otro endpoint409Idempotency key already used for a different endpoint.No reutilizar la misma clave entre endpoints distintos

Errores internos (99xxx)

CodigoHTTPDescripcionAccion recomendada
99001500Error interno del servidorAnota el traceId y contacta soporte

Pagos recurrentes

Mensajes propios de /subscriptions (mismo formato de error). Usa el message y el HTTP para decidir; el code es el generico de validacion o de recurso.

Recurso no encontrado (404)

MensajeCuando
Subscription not foundNo existe, es de otro webcode o del otro entorno (Live/Test)
Subscription link not foundIgual, para links de pago recurrente

Accion no permitida en el estado actual (400)

MensajeCuando
Only active subscriptions can be paused. Current status: Xpause sobre uno que no esta active
Cancelled subscriptions cannot be reactivatedreactivate o update-card sobre uno cancelado (igual que en el panel)
Cancelled subscriptions cannot be updatedPATCH sobre uno cancelado
Payment link cannot be completed. Current status: XCancelar o simular un link que ya no esta pending

Validacion (400)

MensajeComo evitarlo
intervalCount must be at least 1Entero >= 1
billingDay is only allowed when intervalUnit is monthEnvia billingDay solo con intervalUnit: month
billingDay must be between 1 and 311-31
endAt must be a future dateY-m-d o Y-m-d H:i:s posterior a hoy
Invalid status filterstatus de los permitidos para ese listado
Invalid cursorReutiliza tal cual el nextCursor recibido
reason must be 1-64 charactersreason de cancel: minusculas, numeros y _
Fields not allowed: ...Solo los campos documentados en PATCH
No update data providedPATCH con al menos un campo
Invalid result. Allowed: ...Simuladores Test: success, declined, not_enough_balance, card_expired, error

Ejemplo de respuesta de error

json
{
  "success": false,
  "error": {
    "message": "External device is busy.",
    "code": 13005,
    "statusCode": 409,
    "traceId": "b2f3d36dc305249e8d1ebaa49ef616f1"
  }
}

Buenas practicas

Reintentos

  • Errores 4xx: No reintentes (el problema esta en la peticion)
  • Errores 5xx: Reintenta con backoff exponencial (1s, 2s, 4s, 8s...)
  • 409: si es 13005 (terminal ocupado), espera 5-10 segundos y reintenta. Si el mensaje empieza por Idempotency key…, no reintentes a ciegas: corrige la clave o el body de la peticion
  • Siempre usa Idempotency-Key para que los reintentos sean seguros

Logging

Registra el traceId de las respuestas de error para facilitar la comunicacion con soporte tecnico.

Validacion previa

Valida los datos antes de enviar la peticion para evitar errores 400:

  • amount.value debe ser un entero positivo (centimos)
  • amount.currency debe ser exactamente 3 letras mayusculas (EUR, GBP o USD)
  • webcode no puede estar vacio
  • URLs (urlOk, urlKo) deben ser URLs validas con protocolo
  • reason en reembolsos debe ser uno de los 5 valores exactos permitidos
  • Pagos recurrentes: intervalUnit en day, week, month, year; intervalCount >= 1; billingDay (1-31) solo con month; endAt futura; returnUrl http/https