Concepts
Errors
Every error has an HTTP status code and a JSON body with a slug you can branch on. Check the status code first, then the slug.
The error body
Attributes
statusstringerrorcodestringShort opaque token, stable across releases.
errorstringMachine-readable slug. Mostly a fixed set; amount-range failures interpolate the limit, e.g.
withdraw_amount_must_be_over_0.1_usd— match on the prefix.request_idstringCorrelates with the server log line.
One endpoint, /api/user/info, puts your account's state in status instead of success. The HTTP status code is always right.
{
"status": "error",
"code": "asd31",
"error": "user_balance_low",
"request_id": "1f8a0c2e4d6b8a0c2e4d6b8a0c2e4d6b"
}
Status codes
| Status | Meaning | Retry |
|---|---|---|
400Bad request | A parameter is missing or invalid, or no API key was sent. | No |
401Unauthorized | The API key is malformed or unknown. | No |
403Forbidden | Authenticated but not allowed, or the account is suspended. | No |
404Not found | No object with that id, or no such endpoint. | No |
409Conflict | The object is in the wrong state, or the same idempotency key is still running. | No |
413Payload too large | The request body is over 256 KB. | No |
422Unprocessable | Valid, but it cannot be done: balance too low, amount out of range. | No |
429Too many requests | Wait for Retry-After seconds. | Yes |
500Server error | Our bug. Quote the request_id. | Once |
503Unavailable | A price feed or a node is down. | Yes |
Error index
Grouped by status. Each entry is the error slug to branch on, then the older opaque code, which stays stable for integrations that already use it. Slugs with a {limit} carry the limit in the slug itself: match on the part before it.
400 Bad request
parameter_missingzOnNOA required parameter is missing or empty. Also the answer when no API key is sent at all.
parameter_invalid0ne4rA parameter is present but fails validation.
currency_not_foundwSjOpThe currency code does not exist, or has no usable rate.
invalid_recipient_addressadr01The address fails the format or checksum of that currency. A cross-chain address is rejected.
invalid_idempotency_keyidm01idempotency_keymust be 1 to 128 letters, digits,-and_.
401 Unauthorized
key_or_user_not_foundkGodCThe API key is malformed or unknown.
403 Forbidden
not_permitted7UV9yAuthenticated, but the object belongs to someone else, or
current_passwordwas missing or wrong.account_suspendedsus01The key is valid but the account is suspended. Do not rotate the key; contact support.
404 Not found
uid_not_foundy1sDMNo transaction or withdrawal with that id.
uid_not_foundHjVwPNo seller with that id.
404AMbNcNo such endpoint.
405 Method not allowed
405mth01The endpoint does not take that method. Every endpoint accepts GET and POST.
409 Conflict
payment_method_already_setaV9d9A payment method was already chosen for this transaction.
transaction_inactiveaV9W9The transaction is no longer pending.
transaction_already_completedaV9W9The transaction has already completed.
username_takenH7qZWAnother account already uses that username.
already_claimedanV8lThat reward was already claimed.
request_in_progressidm02A request with the same
idempotency_keyis still running.
413 Payload too large
413AMbNcThe request body is larger than 256 KB.
415 Unsupported media type
415ctp01The request body type is not accepted. Send parameters form-encoded or in the query string.
422 Unprocessable
idempotency_key_reused_with_different_parametersidm03That
idempotency_keywas already used for a request with different parameters.requirements_not_metanV82The reward's requirements are not met yet.
user_balance_lowasd31Your withdrawable balance is too low.
amount_out_of_rangeasd31The fees would consume the whole amount.
transaction_amount_must_be_over_{limit}_{currency}asd31The transaction is worth less than the minimum. The slug names the limit, as in
transaction_amount_must_be_over_0.1_usd; match on the prefix.transaction_amount_must_be_under_{limit}_{currency}asd31The transaction is worth more than the maximum. Match on the prefix.
withdraw_amount_must_be_over_{limit}_{currency}asd31The withdrawal is below the minimum. Match on the prefix.
exchange_amount_must_be_over_{limit}_{currency}asd31The exchange is below the minimum. Match on the prefix.
disabled_payment_methodwqtoJThe seller has switched that payment method off.
The platform has paused or retired that payment method.
invalid_payment_methodteyKZThat method is not allowed on this transaction, or is not on your account.
payouts_disabled_for_methodpay01Payouts in that currency are switched off for now. Your balance is unaffected.
no_active_paypal_accountjYC4MNo PayPal account is enabled to receive the payment.
expiredanV8lThe reward's claim window has closed.
429 Too many requests
rate_limitedgba3CToo many requests. Wait for the number of seconds in
Retry-After.
500 Server error
server_errorn1RgPA bug on our side. Quote the
request_idto support.
503 Unavailable
A dependency is down. Retry shortly.
A price feed is stale, so the request is refused rather than priced off an old rate. Retry shortly.
The node for that currency is unreachable. Retry shortly.
Retrying
429means wait. Retry after the number of seconds inRetry-After.503means a dependency is down. Retry with backoff; it usually clears within minutes.500is our bug. Retry once, then contact support with therequest_id.- Any other
4xxmeans the request is wrong and will stay wrong. Fix it before you retry. - Send an
idempotency_keyon anything that moves money, so a retry can never act twice. See Idempotency.