Skip to main content
All errors share the same shape:
  • error: stable snake_case code — use it in your logic.
  • message: human-readable explanation — may change, don’t parse it.
Sanitized error messages. An error message will never expose provider names, infrastructure details, URLs, raw upstream bodies (JSON/HTML), or internal configuration — not in API responses, webhooks, or stored status fields. Business rejections from the payment processor keep their actionable reason (for example, why a document or account was rejected); infrastructure failures are replaced by the fixed generic message "the payment provider could not process the request" — retry those operations with the same idempotency_key.
| payin_corridor_unsupported | The requested country/currency/method has no active payin provider — re-read GET /v1/payins/methods | | 502 | deposit_account_failed | The dedicated receiving account could not be provisioned; read the account list before retrying |

Codes by category

Authentication and permissions

OTP / 2FA

Full flow and details in security and 2FA.

Social login (OAuth)

Full flow and details in social login.

Organization admin panel

These codes come from organization administration surfaces (the CBPay Admin panel), not from the account-level API documented above — they never appear on /v1/* account endpoints.

Validation (400)

QR payin idempotency

For POST /v1/payins with method: "qr", idempotency_key is optional. You may send it in the JSON body or as Idempotency-Key; when both are present, the body value wins. A key can be up to 256 characters and cannot contain CR/LF. The platform scopes the key to the account server-side; the integrator sends the key unchanged.
  • 400 invalid_idempotency_key: the key is longer than 256 characters or contains CR/LF. Shorten it or remove those characters, then retry with the same corrected request.
  • 409 idempotency_conflict: the same key was used with a different country, currency, method or numeric amount. Keep the original payload for a replay, or choose a new key for a new charge.
With the same key and payload, the API returns the original charge with idempotency_hit: true and does not create another charge. Numeric amounts are compared by value (100 equals 100.00); glosa is display-only and is not part of the replay identity. Read the live status with GET /v1/payins/{payinID}.

Money and state (402 / 404 / 409 / 422 / 429)

| 422 | deposit_account_not_recoverable | The pending destination is not an MX/MXN/bank_transfer instrument that can be recovered | | 422 | export_rejected | The processor rejected the segregated wallet key export | | 422 | stored_card_corridor_mismatch | The saved card belongs to a different country/currency corridor than the charge | | 409 | subscription_state | The subscription is not in a state that allows that action (e.g. pausing a canceled plan) | | 409 | email_required | The login has no real email address; set one with POST /v1/me/email/change | | 422 | payin_not_refundable | The payin is not credited or has no processor credential; it cannot be refunded | | 422 | refund_not_supported | That rail does not support refunds (QR, announced transfer, dedicated account, collect). POS charges are refunded through the crypto rail | | 422 | refund_exceeds_payin | The refund exceeds what is left to refund on the payin; your balance was not touched | | 422 | settlement_pending | The payin’s balance is still scheduled for settlement and cannot be refunded until it is released (at settle_at or by an org-admin release) | | 400 | invalid_amount | The refund amount must be a positive decimal in the payin currency | | 503 | refund_event_pending | The refund result is stored, but its final event is still being persisted. Retry with the same idempotency key; do not send a new refund | | 503 | payin_event_pending | The payin is credited, but its final event is still being reconciled. Retry with the same idempotency key; do not create a new payin |

Compliance (403 / 503)

Qscore

Errors from the credit bureau endpoints (guide).

Transactional firewall

Errors from the review of operations held by the transactional firewall (guide). The hold itself is not an error: the create call answers 202 Accepted with status: in_review and a review_id.

Real-time events (SSE)

Codes from GET /v1/events and its history.

Message signing & wallet linking

Codes from message signing with wallets (EIP-191 on EVM, TIP-191 on TRON): server-side signing with segregated wallets (POST /v1/segregated-wallets/{id}/signatures, which issues a publicly verifiable signature proof) and external wallet linking via challenge (POST /v1/wallet-links/challenges → sign the challenge with your wallet → POST /v1/wallet-links/verify).

Service (5xx)

How to handle them

  • Validation 4xx: fix the request. Don’t retry as-is.
  • 402: fund the account and retry (new idempotency key only if the operation was never created).
  • 5xx / timeouts: retry with the same idempotency key; the operation will never duplicate.

Qscore fraud and Index

Corridor lifecycle

Banking creation recovery errors

Banking creation recovery errors

EUR banking and virtual IBAN errors

Account broadcast error codes

These codes are returned by the organization administration broadcast endpoints. They are listed here so shared SDKs can keep one error catalog.

Banking EUR and company-wallet errors

Account integration policy

Disputes and fraud

SEPA funding-source errors

These errors are returned before a customer payout or EUR Banking operation is debited or dispatched:

Money-out limit errors

dispute_fiat_unsupported

A dispute cannot be opened for a payin credited in locally held BOB, MXN or ARS. The funds remain in the local balance; use a supported USD or USDT credit or wait for the product to support local-fiat disputes.

Argentine bank aliases and profile aliases

Grupo CB contract ceremony

These errors apply to POST /v1/me/contracts/envelopes/{envelopeID}/sign and the account contract resources. Messages may be generalized for privacy; the code is the stable integration contract.

Environment handoff

2FA and passkeys

Checkout and payout documents

destination_recently_rejected

The acknowledgement is valid only for the most recent rejection of that destination. A retry with the same key but different options is an idempotency_conflict (409). Other payout methods and destinations without a recent rejection continue through their normal validation and dispatch path.

Authentication attack-hardening errors

POST /v1/auth/password/forgot always returns 200 to prevent enumeration. It silently stops real sends after 5 per account per hour; POST /v1/auth/password/reset allows 8 code attempts per account per 15 minutes.

US/USD payout validation

These errors are returned before debit for ach, wire and swift payouts:

Resource identifier validation

Last modified on October 17, 2026