Skip to main content

Error codes

On failure the envelope carries data: null and a code from the list below. Branch on the code; the HTTP status is only a hint.

Every endpoint in the API Explorer lists the codes that endpoint can return, under its responses. This page is the union of all of them.

Errors every endpoint can return

CodeHTTPWhen
INVALID_REQUEST_DATA400Request validation failed — a field is missing, malformed, or unknown.
INTERNAL_SERVER_ERROR500Unexpected server error. An internal alert is raised; retry is safe for reads.

ACCESS_TOKEN_INVALID (401) can be returned by every authenticated endpoint — the token is missing, invalid, or expired. The open endpoints listed under Authentication never return it.

Your account

These say something about you, not about the request. They will keep failing until you fix the account, so do not retry them in a loop.

CodeHTTPWhen
INVALID_SIGNATURE401The client assertion's signature or claims are invalid, or the assertion is stale.
PARTNER_NOT_FOUND404The partner for this token no longer exists.
PARTNER_ACCOUNT_LOCKED403The partner account is locked.
PARTNER_IP_NOT_ALLOWED403The caller IP is not in your allowlist.
PARTNER_INSUFFICIENT_BALANCE402Your crypto fund cannot cover the order. Top the fund up.
USER_EMAIL_INVALID400userEmail is missing or malformed.

The user and their KYC

A user must be verified before they can transact. See KYC.

CodeHTTPWhen
USER_REGISTRATION_REQUIRED400The user is not registered.
USER_KYC_VERIFICATION_REQUIRED400The user does not exist, has no KYC profile, or KYC is not verified.
USER_KYC_UNDER_PROCESSING400A KYC submission is already being processed.
KYC_PROFILE_UNDER_REVIEW400The KYC profile is pending review — the user cannot transact yet.
KYC_PROFILE_NOT_ELIGIBLE400The KYC profile was rejected.
KYC_DOCUMENT_ALREADY_REGISTERED400KYC is already verified, or the national ID belongs to another profile.
KYC_DOCUMENT_FORMAT_INVALID400One or more document images are not valid base64 data URLs.
HIGHER_KYC_LEVEL_REQUIRED400The service needs a higher KYC level than the user holds.
NATIONALITY_NOT_SUPPORTED400The user's nationality is missing, or not supported for this service.
HIGH_RISK_USER400The user is flagged as high risk.
REQUESTED_INFO_NOT_FOUND404No KYC profile exists for this user yet.

The recipient and the payout

CodeHTTPWhen
BANK_NOT_SUPPORTED400The bank code is not active. Fetch the current bank list.
INVALID_BANK_ACCOUNT400The bank account could not be verified.
HIGH_RISK_BANK_ACCOUNT400The recipient account or name is flagged as high risk.
INVALID_TRANSFER_CONTENT400The transfer description is invalid.
FIAT_CURRENCY_NOT_SUPPORTED400The fiat currency is not supported.
PAYMENT_CHANNEL_NOT_SUPPORTED400No payment channel is available for this fiat currency.
QR_CODE_NOT_SUPPORTED400No supported format could decode the QR code.
INVALID_PAYMENT_INFO400A PHP QR payout is missing the additionalData from the QR decoding step. Pass it through verbatim.

Amounts and limits

CodeHTTPWhen
SELL_AMOUNT_BELOW_MIN400The fiat amount is below the minimum.
SELL_AMOUNT_ABOVE_MAX400The fiat amount is above the maximum.
AMOUNT_OUT_OF_RANGE400The fiat amount is below the minimum allowed for this payout.
TRANSACTION_AMOUNT_LIMIT_EXCEEDED400The per-transaction amount limit was exceeded.
DAILY_AMOUNT_LIMIT_EXCEEDED400The daily amount or transaction-count limit was exceeded.
MONTHLY_AMOUNT_LIMIT_EXCEEDED400The monthly amount limit was exceeded.

The bounds themselves come back on every quote as minAmount and maxAmount — check against those before you create the order, and you will rarely see these.

Orders

CodeHTTPWhen
DUPLICATE_TRANSACTION_ID409The orderId already exists for your partner account.
TRANSACTION_NOT_FOUND404No order matches that orderId for your partner account.
TRANSACTION_CREATE_FAILED500The payout could not be completed after the order was created. The order is already refunded.
WEBHOOK_SECRET_NOT_FOUND400The webhookSecretKey matches no registered webhook endpoint.

DUPLICATE_TRANSACTION_ID usually means your retry worked the first time. Fetch the order rather than treating it as a failure — see Orders.

Temporary

These are the only codes worth retrying with backoff.

CodeHTTPWhen
SERVICE_NOT_AVAILABLE503The service is not available for your account or the requested currency.
SERVICE_UNDER_MAINTENANCE503Pricing is temporarily unavailable for this currency.