Skip to main content

Base URL

Everything is JSON over HTTPS. Send Content-Type: application/json with every request body.

Authentication

Send an API key from the account page as a bearer token:
A missing, unknown or revoked key gets 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": 25 are 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: btc is BTC.
  • 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 object field naming its type: market, order, order_preview, position, fill, account, api_key, withdrawal or list.
  • Decimals are strings, so no precision is lost: "84012.4". USD amounts have two decimal places ("248.68"), except fee, 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:
Results are newest first. Pass ?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 with expand[]. Orders take expand[]=timeline:

Idempotency

Placing an order and closing a position both require a client_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 the Prefer header, from 0 to 15 seconds:
The response’s 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.
Write clients that ignore fields they don’t know, and treat an unknown status as not final. A breaking change would come as a new version, /v2, with notice.