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.
INVALID_WALLET_ADDRESS400The wallet address is invalid for the given network.
TOKEN_NOT_SUPPORTED_ON_NETWORK400The crypto currency is not supported on the given network.

Amounts and limits​

CodeHTTPWhen
BUY_AMOUNT_BELOW_MIN400The crypto amount is below the minimum.
BUY_AMOUNT_ABOVE_MAX400The crypto amount is above the maximum.
SELL_AMOUNT_BELOW_MIN400The fiat or crypto amount is below the minimum.
SELL_AMOUNT_ABOVE_MAX400The fiat or crypto 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.
WEEKLY_AMOUNT_LIMIT_EXCEEDED400The weekly amount 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 Scan-to-Pay & Cashout.

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.