Errores y reintentos
La API Transaccional usa dos familias de respuesta para señalizar
problemas: códigos HTTP (problemas de transporte, autenticación o
rate limit) y validación de negocio (problemas semánticos del
payload, devueltos como HTTP 200 con valid: false). Entender la
diferencia es clave para reintentar sin generar transacciones
duplicadas.
Códigos HTTP
Validación de negocio — 200 + valid: false
Cuando la petición está bien formada pero viola una regla de negocio
(monto fuera de rango, cuenta inválida, propósito bloqueado, etc.) la
API responde con HTTP 200 y un cuerpo con la lista de violaciones.
| Campo | Descripción |
|---|---|
valid | true cuando el payload pasa todas las validaciones; false en caso contrario. |
status | PROCESSING cuando se acepta; FAILED cuando se rechaza por validación. |
violations | Lista de violaciones. Vacía cuando valid: true. |
Errores de la versión 2
Los errores de v2 usan el mismo cuerpo que las violaciones de la
versión 1: externalReferenceId, status: "FAILED", valid: false y
la lista violations. Ninguno de estos rechazos cotiza ni debita saldo.
| HTTP | rule | field | source | Cuándo ocurre |
|---|---|---|---|---|
400 | NOT_NULL | walletId | REQUEST | Enviaste X-Api-Version: 2 sin walletId. |
400 | ORIGIN_WALLET_NOT_FOUND | walletId | ACCOUNT | El walletId no existe o no pertenece a la empresa autenticada. |
502 | ACCOUNT_ENRICHMENT_FAILED | — | ACCOUNT | No se pudo consultar la cuenta por un error interno. |
400 NOT_NULL en walletId
Incluye el walletId en el cuerpo, o quita el header
X-Api-Version: 2 si quieres seguir usando la versión 1.
400 ORIGIN_WALLET_NOT_FOUND
Vuelve a consultar GET /b2b/accounts y usa un walletId de una
cuenta de tu empresa.
502 ACCOUNT_ENRICHMENT_FAILED
La violación no trae field. Se devuelve cuando la cuenta no se pudo
consultar por un error interno, y también cuando el servicio interno de
cuentas responde un 400 o 403 al validarla: un 400/403 interno se
traduce en un 502 para ti. No es un error de tu payload; espera unos
segundos y envía el pago de nuevo con un externalReferenceId nuevo. Si
persiste, escribe a soporte con el externalReferenceId del intento.
Saldo y validación asíncrona
Los pagos REMITTANCE y P2P donde la moneda de origen es igual a la
de destino se procesan de forma asíncrona: se aceptan y se ponen en cola, y la API
responde 200 con status: PROCESSING, que significa “aceptado”, no
“validado”. El saldo, la cotización, el beneficiario y el propósito se
validan después; si algo falla, la transacción queda en FAILED. Por eso
un saldo insuficiente en estos pagos no llega como error en la
respuesta: consúltalo en GET /b2b/transactions/detail.
El 502 BALANCE_VALIDATION_FAILED solo se devuelve de forma sincrónica
en pagos EXCHANGE y en pagos entre monedas distintas.
Reintentos idempotentes
El externalReferenceId es el identificador único de cada transacción
del lado del cliente. La API lo busca por empresa, sin importar el estado
de la transacción, y rechaza un duplicado con 409 DUPLICATE_EXTERNAL_REFERENCE. Por eso reenviar el mismo ID nunca genera
un cargo doble, pero tampoco reintenta un pago que ya fue rechazado.
Reglas prácticas
- Rechazo explícito (
valid: falseo502de validación): corrige la causa y reintenta con unexternalReferenceIdnuevo, porque el mismo devuelve409. - Timeouts / errores de red: consulta el estado con
GET /b2b/transactions/detailantes de reintentar. Si la transacción no existe, puedes reenviar con el mismoexternalReferenceIdusando backoff exponencial: si ya existía, recibirás409y no se duplica. Si el segundo intento también falla, espera un poco más antes del tercero. - 5xx sin detalle de validación: trátalo como un timeout. Consulta el estado antes de reintentar.
- 409 Conflict: el
externalReferenceIdya existe, incluso si esa transacción quedóFAILED. Consulta su estado: si está enPROCESSINGo completada, no reenvíes; si fue rechazada, corrige la causa y envía un ID nuevo. - 429 Too Many Requests: respeta el header
Retry-Aftersi está presente. Si no, espera al menos 1 segundo y duplica el tiempo en cada reintento (1s → 2s → 4s → 8s, tope 30s). - 401 Unauthorized: intenta una sola vez refrescar el token. Si persiste, el problema es de credenciales, no de transporte.
- 403 Forbidden: no reintentes. Resuelve la causa raíz primero.
Backoff sugerido
| Intento | Espera mínima | Espera sugerida |
|---|---|---|
| 1 | — | primer intento fallido |
| 2 | 500 ms | 1 segundo |
| 3 | 1 s | 2 segundos |
| 4 | 2 s | 4 segundos |
| 5 | 4 s | 8 segundos |
| 6+ | 8 s | 16–30 segundos |
Soporte
Si necesitas ayuda para investigar un estado inesperado o una petición fallida, escríbenos a soporte.tech@global66.com indicando el clientId y un ejemplo de la petición fallida (timestamp, request id, status HTTP).