Account Data
All account reads are open — no signature, no API key. They are keyed by either wallet or account_id, as defined in Account format; each endpoint below says which it takes.
Results are newest-first unless noted. Pagination is not uniform:
Response shapes
The key inside data differs per endpoint:
Balance
Returns account and free_balance. Funds locked by an in-flight withdrawal are already excluded from free_balance — they reappear only if the withdrawal is refunded.
free_balance excludes posted margin and unrealized PnL. There is no equity endpoint.
Positions
Eventually consistent with fills: an order can read FILLED while /positions is still empty. Poll until the position appears rather than reading once.
Returns data.positions[] — every OPEN position, each with:
There is no leverage on a position; leverage belongs to each order.
Open orders and triggers
They return the same item shape. The example below is a TRIGGER order — trigger_price, trigger_direction, tpsl, and is_trigger_market appear only on triggers:
is_modifying is true while a modify on this order is in flight — re-read rather than modifying again.
time_in_force is GTC, IOC, or ALO — ALO marks a post-only order.
parent_order_id appears only on a TP/SL attached to an entry that has not filled yet (a bracket leg). Such a leg reads open in /open-orders but is not armed and is absent from /position-triggers; once it arms, the field disappears and /position-triggers picks it up.
Status vocabularies
You write uppercase (BUY, SL); list reads return lowercase (sell, sl); GET /orders/{orderId} returns uppercase. The two order routes also report different sets of states:
History
Three history endpoints, all keyed by wallet and all accepting market, limit, and offset.
Order history
One entry per status change, so the same order_id appears once per transition — this is a log, not a list of orders. Rows carry avg_fill_price once filled.
status is one of:
A bracket TP/SL waiting for its entry (PENDING_PARENT) is logged as open. Rows also carry time_in_force (ALO marks a post-only order) and, on rejected or cancelled rows, the reason — for example post_only_would_take or a bracket_* code.
Trade history
Executed fills, one entry per fill:
Funding history
Hourly funding payments, one entry per position per hour:
funding_rate is a raw fraction, not a percentage: 0.000120 is 0.0120%.
Adjust isolated margin
Adds or removes isolated margin on the open (account, market) position. Signed by your trading key as:
amountis a signed canonical decimal: positive adds margin from your free balance, negative removes it.nonceis a JSON integer here — the order routes carry it as a string. See the signed actions table.
Getting the outcome
The adjustment applies asynchronously, in two stages.
The submit response is data: { request_id, status, reason? } where status is SUBMITTED or REJECTED. Note that a rejection arrives as a 200, not an HTTP error. Only shape is validated up front (amount must be a string); an unknown market comes back as a reason, not a 400.
Then poll for the outcome:
It returns status APPLIED or REJECTED, and 404 while the request is still pending.
Either stage can carry a reason:
Next: Deposits & Withdrawals