Error reference#
REST#
Failed requests return an HTTP error status; order-level failures also carry an error_code (ApiErrorCode) in the response body (OrderSummary.error_code, order status messages).
HTTP statuses#
| Status | Meaning |
|---|---|
400 |
Bad signature — X-SIGN does not match the request. The body is plain text, Invalid Signature (7003), not JSON |
401 |
Unauthorized — missing/invalid API key |
403 |
Forbidden — the API key is read-only and the endpoint creates or cancels orders (see Get started) |
429 |
Rate limit exceeded — the JSON body gives reason and retry_after_ms, the Retry-After header the wait in seconds; see Rate limits |
- A bad signature returns
400on every endpoint, with the plain-text body above. The per-endpoint pages of the API Reference do not list this case; their401row means a missing or unknown API key. - A request whose
X-TIMESTAMPis more thanX-RECV-WINDOWms (default 5000) in the past is rejected before it reaches the endpoint, but not with401: the gateway currently answers it with a generic server error (5xx). If every request fails that way, check your clock first.
error_code values#
Authentication / request
| Code | Description |
|---|---|
AUTHENTICATION_ERROR |
Key not recognized or not permitted |
INVALID_SIGNATURE |
X-SIGN does not match the payload |
INVALID_API_KEY |
Unknown API key |
INVALID_TIMESTAMP |
X-TIMESTAMP outside the receive window |
INVALID_REQUEST |
Malformed request |
INVALID_PARAM |
A parameter failed validation |
BATCH_OVERSIZE |
Too many orders in one batch call |
Order validation
| Code | Description |
|---|---|
INVALID_ORDER |
Order rejected at validation |
INVALID_QUANTITY |
Quantity missing, non-positive, or below exchange minimum |
QUANTITY_EXCEED |
Quantity above the allowed maximum |
INVALID_SYMBOL |
Symbol unknown on the target exchange |
INVALID_EXCHANGE |
Exchange not supported or not connected for the account |
INVALID_TRADE_STRATEGY |
Unknown strategy value |
INVALID_LIMIT_PRICE |
Limit price fails validation |
INVALID_WOULD_PRICE |
Would price fails validation |
INVALID_TRIGGER_PRICE |
Trigger price fails validation |
INVALID_END_TIME |
End time in the past or before start time |
INVALID_TRADE_TIME |
Execution window fails validation |
INVALID_FEE |
Fee parameter fails validation |
Execution / exchange
| Code | Description |
|---|---|
INSUFFICIENT_FUNDS |
Not enough balance on the venue |
EXCHANGE_ERROR |
Exchange rejected the request (unmapped venue error) |
EXCHANGE_NOT_AVAILABLE |
Venue unreachable or in maintenance |
NETWORK_ERROR |
Transient connectivity failure |
SLIPPAGE_EXCEEDED |
Fill would exceed the slippage tolerance |
EXPIRY_REACHED |
Order expired before completing |
PARENT_ORDER_WAS_TERMINATED |
Child rejected because the parent was cancelled/finished |
MAX_FEE_PER_GAS_IS_TOO_LOW |
DEX: gas fee cap too low |
MAX_PRIORITY_FEE_PER_GAS_IS_TOO_LOW |
DEX: priority fee too low |
Platform
| Code | Description |
|---|---|
RATE_LIMIT_EXCEEDED |
Account request budget exhausted |
DDOS_PROTECTION |
Venue anti-abuse triggered — reduce request rate |
EMS_INSTANCES_DOWN |
Execution engine temporarily unavailable |
SYSTEM_ERROR |
Internal error |
SYSTEM_BUSY |
Platform under load — retry |
OTHER |
Unclassified |
WebSocket#
Every subscribe/unsubscribe gets a {code, message} response:
| Code | Meaning |
|---|---|
0 |
OK — ack; message echoes your request |
5 |
RATE_LIMIT_EXCEEDED — a message limit, a subscription limit, or the account's connection limit (connection limit reached (N per account), then close 1008); see Rate limits |
8054 |
exchange missing or invalid |
7002 |
Invalid request — unparseable message or missing method |
7001 |
Internal error — the subscription stream terminated; re-subscribe |
Close codes: 1001 idle timeout (no client message for 5 min), 1008 policy violation (rate limits, invalid listenKey).