Base URL
Content-Type: application/json with every request body.
Authentication
Send an API key from the account page as a bearer token:401. A key’s limits apply to every order it places; see API keys and limits.
Requests
- Decimals can be strings or JSON numbers:
"value": "25.00"and"value": 25are the same. We read the number exactly as written, so nothing is lost to floating point. - Enum values are case-insensitive:
"buy"and"BUY"are the same. - Market symbols are case-insensitive:
btcisBTC. - Unknown fields are refused, with a suggestion when the name is close to a real one. A typo never goes unnoticed.
Responses
- Every object has an
objectfield naming its type:market,order,order_preview,position,fill,account,api_key,withdrawalorlist. - Decimals are strings, so no precision is lost:
"84012.4". USD amounts have two decimal places ("248.68"), exceptfee, which is exact to six. Prices and sizes are exact. - Times are RFC 3339 in UTC with milliseconds:
"2026-09-27T14:30:00.123Z". - Missing values are
null, never omitted. Every field in an object’s schema is always present. - Enum values are lower case.
Lists
Lists share one shape:?limit= (1 to 100, default 50) and, for the next page, ?cursor= with the next_cursor you received. When next_cursor is null, there are no more results. Markets and positions are short lists and are never paged.
Expanding
Some objects have extra detail you can ask for withexpand[]. Orders take expand[]=timeline:
Idempotency
Placing an order and closing a position both require aclient_order_id. Sending the same request with the same client_order_id never creates a second order: you get the first one back with 200 and Idempotent-Replayed: true. A new order returns 201. See Retries and idempotency.
Waiting for a result
Placing an order waits up to 5 seconds for it to finish, so the response is almost always final. Change the wait with thePrefer header, from 0 to 15 seconds:
Preference-Applied header says which wait was used.
Status codes
Every error has the same body; see Errors.
Compatibility
/v1 changes only in ways that don’t break correct clients. We may add:
- new endpoints, and new optional request fields;
- new fields in responses;
- new values in enums, such as order statuses, error codes and note codes.
/v2, with notice.