error: código estable ensnake_case— úsalo en tu lógica.message: explicación legible — puede cambiar, no lo parsees.
Mensajes de error saneados. El
message de un error nunca expone nombres de proveedores, detalles de infraestructura, URLs, bodies crudos del proveedor (JSON/HTML) ni configuración interna — ni en respuestas de la API, ni en webhooks, ni en los campos de estado persistidos. Los rechazos de negocio del procesador conservan su motivo accionable (por ejemplo, por qué se rechazó un documento o una cuenta); las fallas de infraestructura se reemplazan por el mensaje genérico fijo "the payment provider could not process the request" — reintenta esas operaciones con la misma idempotency_key.payin_corridor_unsupported | El corredor solicitado no tiene un proveedor de payin activo — vuelve a leer GET /v1/payins/methods |
| 502 | deposit_account_failed | No se pudo aprovisionar la cuenta receptora dedicada; lee la lista antes de reintentar |
Códigos por categoría
Autenticación y permisos
OTP / 2FA
Detalle y flujo completo en seguridad y 2FA.Login social (OAuth)
Detalle y flujo completo en login social.Panel de administración de organización
Estos códigos provienen de superficies de administración de organización (el panel CBPay Admin), no de la API a nivel cuenta documentada arriba — nunca aparecen en los endpoints/v1/* de cuenta.
Validación (400)
Idempotencia de payins QR
EnPOST /v1/payins con method: "qr", idempotency_key es opcional.
Puedes enviarla en el body JSON o como Idempotency-Key; si envías ambas,
gana la del body. La clave admite hasta 256 caracteres y no puede contener
CR/LF. La plataforma la scopea por cuenta del lado servidor; el integrador
envía su clave sin modificarla.
400 invalid_idempotency_key: la clave supera 256 caracteres o contiene CR/LF. Acórtala o elimina esos caracteres y reintenta el mismo request corregido.409 idempotency_conflict: la misma clave se usó con otro país, moneda, método o monto numérico. Conserva el payload original para replay o usa una clave nueva para crear otro cobro.
idempotency_hit: true y no crea otro. Los montos se comparan por valor
(100 equivale a 100.00); glosa es texto de presentación y no forma parte
de la identidad del replay. Consulta el estado vivo con
GET /v1/payins/{payinID}.
Dinero y estado (402 / 404 / 409 / 422 / 429)
| 422 |
deposit_account_not_recoverable | El destino pendiente no es un instrumento MX/MXN/bank_transfer recuperable |
| 422 | export_rejected | El procesador rechazó el export de la llave de la wallet segregada |
| 422 | stored_card_corridor_mismatch | La tarjeta guardada pertenece a otro corredor país/moneda distinto del cobro |
| 409 | subscription_state | La suscripción no está en un estado que permita esa acción (ej. pausar un plan cancelado) |
| 409 | email_required | El login no tiene un email real; configura uno con POST /v1/me/email/change |
| 422 | payin_not_refundable | El cobro no está acreditado o no tiene credencial del procesador; no se puede devolver |
| 422 | refund_not_supported | Ese rail no admite devoluciones (QR, transferencia anunciada, cuenta dedicada, collect). Los cobros POS se devuelven por el riel crypto |
| 422 | refund_exceeds_payin | La devolución supera lo que queda por devolver del cobro; tu saldo no se tocó |
| 422 | settlement_pending | El saldo del cobro sigue programado para settlement y no se puede devolver hasta liberarse (a settle_at o por liberación del admin de la organización) |
| 400 | invalid_amount | El amount de la devolución debe ser un decimal positivo en la moneda del cobro |
| 503 | refund_event_pending | El resultado de la devolución quedó guardado, pero todavía se está persistiendo su evento final. Reintenta con la misma clave de idempotencia; no envíes otra devolución |
| 503 | payin_event_pending | El payin quedó acreditado, pero su evento final todavía se está reconciliando. Reintenta con la misma clave de idempotencia; no crees un nuevo payin |
Cumplimiento (403 / 503)
Qscore
Errores de los endpoints del buró de crédito (guía).Firewall transaccional
Errores de la revisión de operaciones retenidas por el firewall transaccional (guía). La retención en sí no es un error: el create responde202 Accepted con status: in_review y review_id.
Eventos en tiempo real (SSE)
Códigos deGET /v1/events y su historial.
Firma de mensajes y vinculación de wallets
Códigos de la firma de mensajes con wallets (EIP-191 en EVM, TIP-191 en TRON): firma server-side con wallets segregadas (POST /v1/segregated-wallets/{id}/signatures, que emite un comprobante de firma verificable públicamente) y vinculación de wallets externas por desafío (POST /v1/wallet-links/challenges → firmas el desafío con tu wallet → POST /v1/wallet-links/verify).
Servicio (5xx)
Cómo manejarlos
- 4xx de validación: corrige el request. No reintentes igual.
- 402: fondea la cuenta y reintenta (clave de idempotencia nueva solo si la operación nunca se creó).
- 5xx / timeouts: reintenta con la misma clave de idempotencia; la operación nunca se duplicará.
Qscore fraude e Index
Ciclo de vida del corredor
Banking creation recovery errors
Errores de recuperación de creaciones banking
Errores de Banking EUR y vIBAN
Códigos de mensajería masiva
Estos códigos provienen de los endpoints de administración de organización. Se incluyen aquí para que los SDK compartidos mantengan un solo catálogo.Errores de Banking EUR y wallets de empresa
Política de integraciones de cuenta
Disputas y fraude
Errores de cuenta de fondeo SEPA
Estos errores se devuelven antes de debitar o despachar un payout cliente o una operación Banking EUR:Errores de límites money-out
dispute_fiat_unsupported
No se puede abrir una controversia para un payin acreditado en BOB, MXN o ARS retenidos. Usa un crédito USDT soportado o espera soporte para controversias fiat.
Aliases bancarios argentinos y alias del perfil
Ceremonia del Contrato Marco Grupo CB
Estos errores aplican aPOST /v1/me/contracts/envelopes/{envelopeID}/sign y
a los recursos de sobres. El mensaje puede generalizarse por privacidad; el
código es el contrato estable para la integración.
Handoff de ambiente
2FA y passkeys
Documentos de checkout y de payouts
destination_recently_rejected
El acuse solo es válido para el rechazo más reciente de ese destino. Reutilizar
la misma clave con
options diferentes devuelve idempotency_conflict
(409). Los demás métodos y los destinos sin un rechazo reciente siguen su
flujo normal de validación y despacho.
Errores de endurecimiento antiataques de autenticación
POST /v1/auth/password/forgot siempre responde 200 para evitar enumeración. Silencia envíos reales después de 5 por cuenta por hora; POST /v1/auth/password/reset permite 8 intentos de código por cuenta cada 15 minutos.