Skip to main content

Error codes

On failure the envelope carries success: false, data: null, and a pair of codes: semanticCode (a string, and the one to branch on) and errorCode (a number, kept for older integrations).

Branch on semanticCode. The HTTP status tells you nothing in v2.

Errors any signed endpoint can return

Signature verification runs before any business logic, so every signed endpoint can return all of these.

errorCodesemanticCodeWhen
1INTERNAL_SERVER_ERRORServer error. Also what you get if your key material is structurally unusable.
2INVALID_SIGNATUREThe signature does not match the canonical string, or your public key is missing.
3PARTNER_ACCOUNT_LOCKEDYour partner account is not active.
4PARTNER_NOT_FOUNDUnknown partnerCode.
5INVALID_REQUEST_DATARequest validation failed.
19PARTNER_IP_NOT_ALLOWEDThe calling IP is not on your allowlist.

The user and their KYC

errorCodesemanticCodeWhen
26USER_REGISTRATION_REQUIREDThe end user could not be provisioned.
27USER_EMAIL_INVALIDuserEmail is malformed.
34USER_KYC_VERIFICATION_REQUIREDThe user has no KYC profile, or it is not VERIFIED. Not-submitted, in-progress and rejected all collapse into this one code.
35USER_KYC_UNDER_PROCESSINGA KYC submission is already in flight — resubmission is blocked.
50REQUESTED_INFO_NOT_FOUNDNo user or KYC profile exists for that email under your partner account.
52KYC_DOCUMENT_ALREADY_REGISTEREDKYC is already verified, or that nationalId belongs to another of your users.
58KYC_DOCUMENT_FORMAT_INVALIDA document is not a valid base64 data URL.
59NATIONALITY_NOT_SUPPORTEDThe user's nationality is missing, or blocked for this service and currency.
60HIGHER_KYC_LEVEL_REQUIREDThe provider needs a higher KYC level than the profile carries.
61KYC_PROFILE_UNDER_REVIEWThe provider-side KYC profile is still pending.
62KYC_PROFILE_NOT_ELIGIBLEThe provider-side KYC profile was rejected.
63BANK_ACCOUNT_KYC_MISMATCHThe payout account must match the user's KYC identity.
64HIGH_RISK_USERThe user's email is blacklisted.

The recipient and the payout

errorCodesemanticCodeWhen
17INVALID_TRANSFER_CONTENTThe transfer content has accents or special characters.
18INVALID_BANK_ACCOUNTThe bank account could not be verified.
33QR_CODE_NOT_SUPPORTEDThe QR format is not supported.
44INVALID_PAYMENT_INFOA PHP payout is missing recipientName.
48PAYMENT_CHANNEL_NOT_SUPPORTEDNo payment channel for this fiat currency.
53FIAT_CURRENCY_NOT_SUPPORTEDThe fiat currency is not supported by this endpoint.
56BANK_NOT_SUPPORTEDThe bank code is not in the provider's list. Fetch the current list.
65HIGH_RISK_BANK_ACCOUNTThe recipient account or name is blacklisted.
67QR_CODE_UNREADABLEThe QR code could not be read. It carries no message — see below.

Amounts, limits, and your fund

errorCodesemanticCodeWhen
7PARTNER_INSUFFICIENT_BALANCEYour crypto fund cannot cover the order.
16AMOUNT_OUT_OF_RANGEThe amount is below the payment provider's own floor.
24SELL_AMOUNT_BELOW_MINBelow the minimum. The message carries the live limit.
25SELL_AMOUNT_ABOVE_MAXAbove the maximum. The message carries the live limit.
36TRANSACTION_AMOUNT_LIMIT_EXCEEDEDPer-transaction cap exceeded (in USD).
37DAILY_AMOUNT_LIMIT_EXCEEDEDDaily amount or transaction-count cap exceeded.
42MONTHLY_AMOUNT_LIMIT_EXCEEDEDMonthly cap exceeded.

The limits are not constants — they depend on the currency and the payment provider you route to. Read minSell / maxSell from POST /api/v2/orders/prices rather than hard-coding them.

Orders

errorCodesemanticCodeWhen
11DUPLICATE_TRANSACTION_IDexternalOrderId already exists for your account.
12TRANSACTION_CREATE_FAILEDThe payout failed after the order was created. You have already been refunded, and the order detail comes back in data.
13WEBHOOK_SECRET_NOT_FOUNDwebhookSecretKey matches no registered endpoint. The order is not created.
15TRANSACTION_NOT_FOUNDNo order with that externalOrderId under your account.

DUPLICATE_TRANSACTION_ID usually means your retry succeeded the first time. Fetch the order with POST /api/v2/orders/details instead of treating it as a failure.

Service availability

These are the ones worth retrying with backoff.

errorCodesemanticCodeWhen
9SERVICE_UNDER_MAINTENANCEFee configuration is missing for this partner, channel and currency.
20SERVICE_TEMPORARILY_UNAVAILABLEUnder maintenance.
46SERVICE_NOT_AVAILABLEThe service is off for your account, or no provider could be routed for this currency.
66SERVICE_NOT_ACTIVATEDThe service is not activated. Has no message — see below.

Two traps in the code table

Unmapped codes

These numeric codes are not in the mapping table, so they all arrive as semanticCode: "INTERNAL_SERVER_ERROR" while keeping their own distinct errorCode and message:

errorCodemessage
21The blockchain network requires a memo
28The service is in maintenance. Please contact us for more details
32The QR code is invalid. Please check and try again
39The amount is invalid
40This card type is no longer supported.
41Not available in your country
43Exceeding the daily limit
45The amount received must be greater than {{minimum}}
47Access denied. Please contact us for more details
49Information already exists in the system
51This email address has been bound to the registered account
54The card is not activated yet, please try again later.
55The cardholder information is being reviewed. Please try again later.
57The amount to be converted must be greater than {{fiatAmount}}

So a semanticCode of INTERNAL_SERVER_ERROR does not always mean a server fault. If you need to distinguish these — "not available in your country" is a very different thing from a crash — you must read errorCode.

Two codes have no message

errorCode 66 and 67 are in the mapping table but not in the message table, so message comes back as the literal string "msg.66" / "msg.67". Do not show message to an end user without a fallback.

Every code

The complete table, for looking up a number you were not expecting. Messages marked with {{…}} have the live value interpolated in.

errorCodesemanticCodemessage
0SUCCESSYour request has been successful
1INTERNAL_SERVER_ERRORThe request could not be processed at this time. Please try again later.
2INVALID_SIGNATUREInvalid signature
3PARTNER_ACCOUNT_LOCKEDYour account is locked. Please contact us for assistance
4PARTNER_NOT_FOUNDPartner code information does not exist
5INVALID_REQUEST_DATAYour data is invalid. Please check and try again
6TOKEN_NOT_SUPPORTED_ON_NETWORKToken does not supported on this network yet.
7PARTNER_INSUFFICIENT_BALANCEInsufficient balance
8NETWORK_FEE_UNAVAILABLENetwork fee not found.
9SERVICE_UNDER_MAINTENANCEThe service is in maintenance. Please contact us for more details
10INVALID_WALLET_ADDRESSThe wallet address is invalid. Please check and try again
11DUPLICATE_TRANSACTION_IDThe transaction id already exists.
12TRANSACTION_CREATE_FAILEDThe transaction has not created successfully. Please try again later
13WEBHOOK_SECRET_NOT_FOUNDThe webhook secret key does not exist
14UNKNOWN_SERVICE_TYPEThe service type is unidentified
15TRANSACTION_NOT_FOUNDTransaction information does not exist
16AMOUNT_OUT_OF_RANGEThe amount must be greater than 10,000 and less than 14,000,000
17INVALID_TRANSFER_CONTENTThe transfer content must be in unaccented letters and not contain special characters
18INVALID_BANK_ACCOUNTThe bank account information is incorrect
19PARTNER_IP_NOT_ALLOWEDIP address not allowed
20SERVICE_TEMPORARILY_UNAVAILABLEThe service is under maintenance. Please try again later
21(none — arrives as INTERNAL_SERVER_ERROR)The blockchain network requires a memo
22BUY_AMOUNT_BELOW_MINYou should buy an amount is greater than {{minBuy}}
23BUY_AMOUNT_ABOVE_MAXYou should buy an amount is less than {{maxBuy}}
24SELL_AMOUNT_BELOW_MINYou should sell an amount is greater than {{minSell}}
25SELL_AMOUNT_ABOVE_MAXYou should sell an amount is less than {{maxSell}}
26USER_REGISTRATION_REQUIREDYou have to register an account on our platform for continue using the service
27USER_EMAIL_INVALIDThe registration email is invalid.
28(none)The service is in maintenance. Please contact us for more details
29EMAIL_CONFIRMATION_CODE_INCORRECTThe confirmation code is incorrect. Please try again
30EMAIL_CONFIRMATION_CODE_EXPIREDThe confirmation code has expired. Please try again
31VERIFICATION_EMAIL_LIMIT_REACHEDYou are reach to daily limit. Please try again later
32(none)The QR code is invalid. Please check and try again
33QR_CODE_NOT_SUPPORTEDThe QR code has not support yet.
34USER_KYC_VERIFICATION_REQUIREDYou must verify your account on our platform to continue using the service.
35USER_KYC_UNDER_PROCESSINGYour information is being processed.
36TRANSACTION_AMOUNT_LIMIT_EXCEEDEDYou should make transactions with a total payment amount less than {{fiatAmount}} USD
37DAILY_AMOUNT_LIMIT_EXCEEDEDThe total transaction amount in a day must not exceed {{fiatAmount}} USD
38LOGIN_SESSION_EXPIREDThe login session has expired — the only code that changes the HTTP status (to 401).
39(none)The amount is invalid
40(none)This card type is no longer supported.
41(none)Not available in your country
42MONTHLY_AMOUNT_LIMIT_EXCEEDEDExceeding the monthly deposit limit
43(none)Exceeding the daily limit
44INVALID_PAYMENT_INFOInvalid payment information
45(none)The amount received must be greater than {{minimum}}
46SERVICE_NOT_AVAILABLEThe service is not available yet. Please contact us for support.
47(none)Access denied. Please contact us for more details
48PAYMENT_CHANNEL_NOT_SUPPORTEDThis channel is invalid or currently not available for use.
49(none)Information already exists in the system
50REQUESTED_INFO_NOT_FOUNDThe information does not exist in the system yet, please try again later.
51(none)This email address has been bound to the registered account
52KYC_DOCUMENT_ALREADY_REGISTEREDThis document number has already been registered. Please do not resubmit.
53FIAT_CURRENCY_NOT_SUPPORTEDThis function is not yet supported on this fiat currency.
54(none)The card is not activated yet, please try again later.
55(none)The cardholder information is being reviewed. Please try again later.
56BANK_NOT_SUPPORTEDThe bank is not supported yet.
57(none)The amount to be converted must be greater than {{fiatAmount}}
58KYC_DOCUMENT_FORMAT_INVALIDThe submitted document is invalid, please check again.
59NATIONALITY_NOT_SUPPORTEDThis service is not available for your current nationality.
60HIGHER_KYC_LEVEL_REQUIREDYou need to verify your profile at a higher level to continue using the service.
61KYC_PROFILE_UNDER_REVIEWYour profile is currently under review for this payment service.
62KYC_PROFILE_NOT_ELIGIBLEYour profile is currently not eligible to use this payment service.
63BANK_ACCOUNT_KYC_MISMATCHThe service only allows payments to the bank account that matches the KYC information.
64HIGH_RISK_USERCant operate high risk user. Please contact us for support.
65HIGH_RISK_BANK_ACCOUNTUnable to process due to a high-risk bank account. Please contact us for support.
66SERVICE_NOT_ACTIVATED(none — you receive the literal string msg.66)
67QR_CODE_UNREADABLE(none — you receive the literal string msg.67)