Skip to main content
Every error response has this body. Handling errors explains how to use it.
string
required
The kind of error, which sets the HTTP status: invalid_request (400), authentication (401), permission (403), not_found (404), conflict (409), unprocessable (422), rate_limited (429), internal (500), unavailable (503).
string
required
A stable identifier for the error, listed below. Branch on this. New codes may be added.
string
required
What was wrong, with the values involved.
string | null
required
The request field at fault, as a JSON path such as metadata.reason, or null.
string | null
required
One concrete way to fix the request.
object
required
The values the message quotes, as fields. Each code below lists its fields.
object[]
required
Every field error, each a full error object, when code is invalid_fields. Otherwise empty.
boolean
required
Whether the same request can succeed later, unchanged.
string
When a retry can succeed, if known. Present only then.
string
required
This code’s entry on this page.
An error means nothing was recorded, except after 500 and 503, where an order may have been recorded just before the failure. Retrying with the same client_order_id is safe in every case.

Invalid request (400)

invalid_json

The body is not valid JSON, or not a JSON object. details.position is the byte offset of the problem, when known. Send a JSON object.

invalid_fields

More than one field is invalid. errors holds one error for each, with its own code, param and hint. Fix them all and send the request again.

missing_field

A required field is missing. param names it, and hint shows an example value.

unknown_field

The request has a field this endpoint doesn’t take. When the name is close to a real field, hint suggests it: amount, qty and quantity suggest value; symbol suggests market. Remove the field or rename it.

invalid_value

A field’s value is not allowed: the wrong type, format or enum value, a decimal with too many places, or a number out of range. message says what the field accepts. For example, side is "buy" or "sell"; "long" and "short" describe positions, not orders.

not_applicable

A field was sent that doesn’t apply to this kind of request, such as price on a market order. Remove it, or change type.

conflicting_fields

Two fields were sent that can’t be used together, such as both value and percent on a close. details.fields lists them. Send one.

order_below_minimum

After rounding down to the market’s size step, the order would be worth less than the $10 minimum. details: value (what you sent; null for a close by percent), value_after_rounding, min_value, and smallest_passing_value, the smallest value that would pass at the current price (absent for a close by percent). For a partial close, hint suggests closing the whole position, which is exempt.

order_above_maximum

The order would be worth more than the market’s max_value. details: value, max_value. Send a smaller value, or split the order.

invalid_expand

expand[] names something that can’t be expanded here. details.valid lists what can.

invalid_cursor

cursor is not one this API returned for this list. Start again without cursor.

Authentication (401)

missing_api_key

No Authorization header, or not in the form Bearer tapi_….

invalid_api_key

The key is unknown or has been revoked. Create a new key on the account page.

Permission (403)

These are the calling key’s limits, set by the account owner on the account page. The API can’t change them.

key_limits_not_set

The key was created before keys had limits, so it can’t trade. Set its limits on the account page.

key_market_not_allowed

The key may not trade this market, and that includes closing positions in it. details: market, allowed_markets.

key_order_limit_exceeded

The order is larger than the key’s maximum order. details: value, max_order_value. Send a smaller value.

key_daily_limit_exceeded

The order doesn’t fit in what remains of the key’s 24-hour limit. details: limit, used, remaining, and next_release (at, value), when the oldest order in the window leaves it and how much that frees. retryable is true, and retry_after is set, when waiting would make room for this order. Reduce-only orders and closes don’t count against this limit, so the key can always get out of positions.

Not found (404)

market_not_found

No market has this symbol. details.suggestions lists the closest matches (symbol, name), and hint names the best one. Orders need the exact symbol. Search with GET /v1/markets?q=.

order_not_found

You have no order with this ID. From GET /v1/orders/by-client-id/{client_order_id}, it means no order was recorded under that client_order_id, so nothing traded, and sending the original request again is safe.

position_not_found

You have no position in this market.

route_not_found

No endpoint has this method and path. Check the path in this reference.

Conflict (409)

client_order_id_reused

The client_order_id already names a different order. details: order_id (the existing order), differs (the fields that differ). If you are retrying, send the original body unchanged. If this is a new order, use a new client_order_id.

account_not_active

Trading has not been activated for this account. Activate it on the account page.

trading_approval_expired

The account’s trading activation has ended. Renew it on the account page. GET /v1/account shows when it ends, in trading.valid_until.

Unprocessable (422)

The request is valid, but can’t be carried out given your account or the market right now.

insufficient_balance

Your available balance doesn’t cover the order and its estimated fee. details: required, available, and max_value, the largest value that fits. Send a smaller value, or deposit more.

no_position

The order is reduce_only, or a close, and you have no position in this market.

reduce_only_would_increase

The order is reduce_only, but it is in the same direction as your position, so it would increase it. To reduce a long, sell; to reduce a short, buy.

market_reduce_only

The market accepts only orders that reduce a position right now. Set reduce_only: true, or close the position.

market_halted

The market is not accepting orders right now. GET /v1/markets/{symbol} shows its status.

Rate limited (429)

rate_limited

The key made too many requests at once. Each key may make 10 requests at once, then 5 a second. retryable is true, and retry_after says when to try again (the Retry-After header says the same, in seconds).

Server (500, 503)

unavailable

A service we depend on, such as the exchange, failed or didn’t answer in time. retryable is true. Retry the same request with the same client_order_id, after a short wait. An order may already have been recorded, and the retry returns it rather than placing another.

internal_error

Something failed on our side. Retry the same request with the same client_order_id, after a short wait.

Order status reasons

When an order is recorded but doesn’t fill, it isn’t an error. The order comes back with status: "canceled" or "rejected", and a status_reason with its own codes. See Why an order was canceled or rejected.