Skip to main content
This page lists every code the Partner API V2 can return today. The error tables on each endpoint page show the codes that endpoint returns most often; this page is the complete list.

Error response format

Every error response has this shape:

Handling errors

  • Branch on code, never on message. Messages are meant for people and change without notice.
  • Use the HTTP status as the fallback. If you get a code you don’t recognize, handle it by its status family: 4xx means fix the request (don’t retry it unchanged), 429 and 503 mean retry later with backoff, and 5xx means retry with backoff and contact support if it persists.
  • Expect new codes. We add codes as the API grows. An unknown code must never break your integration.
  • Some statuses will change. A few codes are returned with an HTTP status that doesn’t match their meaning (see Known inconsistencies). We will correct them only in a future API version, announced in advance, so you can rely on the values below until then.
  • Send an Idempotency-Key on the endpoints that support it, so you can retry safely after a timeout or a 5xx. See Idempotency.

General

Any endpoint can return these.

Users, KYC and KYB

Bank accounts

Wallets

Quotes and transactions

Cross-ramp

Webhooks

Known inconsistencies

These behaviors are not ideal, but integrations may already depend on them, so they stay as they are until a future API version:
  • INTERNAL_SERVER_ERROR with a 4xx status. A malformed JSON body returns 400 with INTERNAL_SERVER_ERROR; fix the body before retrying. A temporary failure of the idempotency store also returns 400 with this code; retry it. No response field tells these two apart, and message is not part of the contract: the idempotency-store case only happens when you sent an Idempotency-Key, so if your body is valid JSON, retry with the same key.
  • Server-side failures with a 400 status. STEP_EXECUTION_ERROR, COMMERCIAL_INVOICE_UPLOAD_FAILED and COMMERCIAL_INVOICE_PERSIST_FAILED are returned with 400 although they are not caused by the request. They can be retried.
  • Status doesn’t match the code. BAD_REQUEST comes with 409 when a user has already signed their documents, and INVALID_USER_INPUT_ERROR comes with 422 when an Idempotency-Key is reused with a different body.
  • Two codes are PascalCase: UserOnRampWalletDuplicateError and UserOnRampWalletDisabledError.
  • Generic codes. BAD_REQUEST, FORBIDDEN and NOT_FOUND_ERROR cover several different conditions; the cause is only in message. Treat them by status, and log message for support.
  • /kyc endpoints. GET /api/partner/v2/kyc/details (and the deprecated POST /kyc/verification-link and POST /kyc/send-verification) use an older error format: errors[] is never returned, and some errors come without code. Unexpected server errors (500), rate limiting (429) and malformed requests (400), and on send-verification also file upload errors (400, 413), have no code; use the HTTP status for those.