v15.37.0 — 2026-08-21
v15.36.0 — 2026-08-18
DELETE /api-keysnow also revokes every session token that was created from the revoked key. Before, those tokens stayed valid until they expired. Session tokens from other API keys or from interactive login are not affected.- On the market data WebSocket (
/md/ws), asubscribe_candlesorsubscribe_bbo_candlesrequest for an unknown or delisted symbol now returns an error response with code 404 on the same connection. Before, an unknown symbol insubscribe_candlesclosed the connection and dropped all other subscriptions. - Order gateway requests that omit
account_id(aid) now return400 account_id is requiredwhen the user has no default trading account, instead of404 trading account not found. This applies to all order gateway REST endpoints (for exampleGET /open-orders,GET /orders,POST /place-order), the/orders/wsconnection handshake, and the WebSocket order messages. POST /logoutnow revokes the session token sent in theAuthorization: Bearerheader, as it already did for the token in the browser session cookie.
v15.32.0 — 2026-08-05
GET /risk-snapshotnow returnsmark_priceandsigned_usd_notionalfor each symbol;signed_usd_notionalis the signed USD value of the position at the mark price.GET /positionsandGET /risk-snapshotnow returnsigned_cost_basis. It replacessigned_notional, which is deprecated but still returned with the same value.
v15.25.0 — 2026-07-28
- Fixed the fill events (
t="f"andt="p") on the order gateway WebSocket (/orders/ws): the fill’s side fieldxs.dnow always reportsBorS. Some fills previously reportedBuyorSell.
v15.24.0 — 2026-07-25
POST /place-order,POST /replace-order, and the WebSocket place-order message now accept an optionalrb(reprice behavior) field for post-only (po: true) orders that would cross the book on entry:rej(the default) rejects the order,boreprices it one tick less aggressive than the opposite-side order it would have matched, andtblreprices it to the best price on the same side of the book.
v15.14.0 — 2026-07-08
- Removed the legacy interactive-authentication endpoints:
POST /signup,POST /login,POST /change-password,POST /reset-password,POST /mfa/setup,POST /mfa/confirm, andPOST /mfa/disable(and their SDK request/response types); Clerk now handles interactive login.POST /authenticatenow accepts onlyapi_keyandapi_secret. Creating an API key (POST /api-keys) and updating its IP allowlist (PATCH /api-keys/allowed-ips) no longer takeusername,password, ortotp. API-key authentication is otherwise unchanged.
v15.11.0 — 2026-07-06
- New
GET /funding-slotsendpoint returns a full trading day’s funding settlements for a perpetual symbol. It takes a requiredsymboland an optionaldate(defaults to the current date in the symbol’s funding-schedule timezone). The response reports the fundingvariant(daily_close, a single settlement at the close, orintraday_twap, a fixed number of intraday slots each charging its share of the day’s TWAP premium), the scheduletimezone, the scheduledinterval_count, and an optional per-slotcap_bps. Each slot carries itsindex,funding_time, astatusofrealized/projected/skipped/pending, the mark and underlying TWAPs,premium_bpsandfunding_rate_bps(positive means longs pay shorts), acappedflag, and areasonon skipped slots. Two running totals —realized_sum_bps(realized so far) andprojected_eod_bps(realized plus the projection for remaining slots) — give the projected end-of-day funding.
v15.10.0 — 2026-07-06
GET /open-ordersnow supportslimit/offsetpagination and asort_tstimestamp sort direction (ascordesc, defaultdesc).limitdefaults to 100 andoffsetto 0; responses includetotal_countalongside the resolvedlimitandoffset.GET /funding-ratesnow supports cursor-based pagination vialimit,cursor, andsort_ts(asc/desc, defaultdesc) query parameters, returningnext_cursorandtotal_countfor paging through large result sets.
v15.8.0 — 2026-07-04
- Added
GET /underlying-pricesand deprecatedGET /index-prices. The new endpoint takes a requiredsymbolplus an optional time range (start_timestamp_ns/end_timestamp_ns), cursor pagination (cursor,limit— default 1000), andsort_ts(asc/desc, defaultdesc); it returns anunderlying_pricesarray of{ symbol, timestamp, price }entries withnext_cursor,limit, andtotal_countpage metadata.GET /index-pricesremains served as a deprecated alias that returns identical data under the legacyindex_priceskey — migrate by switching the path and readingunderlying_prices.
v15.4.0 — 2026-06-28
- API keys can now be scoped to specific accounts with granular per-key permissions (list / read / set-limits / reduce-or-close / trade), enforced as the intersection of the key’s permissions and your permissions on the requested account.
v15.2.0 — 2026-06-24
GET /ordersnow supportsorder_idandorder_idsfilters.order_idtakes a single ID;order_idstakes a comma-separated list (e.g.order_ids=ORD-1,ORD-2). The two are combined into one deduplicated set of up to 100 IDs (more returns 400) and are ANDed with the time range. Supplying an ID filter also relaxes the otherwise-mandatory bounded time range, so you can fetch specific orders without one.- Order reject and cancel-reject responses now surface a human-readable reason in
reject_message(e.g. “order price is above the exchange’s maximum price limit”, “post-only order would cross the book”, “too late to cancel”) instead of an opaque generic message.
v15.0.0 — 2026-06-19
- Removed the redundant
user_idfield from fills, positions, transactions, funding transactions, and admin trades; useaccount_idinstead. Renamed the risk-snapshot response type toAccountRiskSnapshot.
v14.24.0 — 2026-06-16
- The GET /tickers endpoint now supports
limit,offset, andsymbolsort query parameters and returnstotal_countplus the resolved limit and offset.
v14.22.0 — 2026-06-10
- Estimated funding rates are now available on marketdata ticker updates.
v14.21.0 — 2026-06-09
- The market data WebSocket (
/md/ws)subscribemessage now supports streaming only what you need. A newlevel: "TRADES"subscribes to trade prints only (t = "t"), with no ticker or order book events. For book-level subscriptions (LEVEL_1/LEVEL_2/LEVEL_3), the optionaltradesandtickerfields (both defaulttrue) independently suppress trade (t = "t") or ticker (t = "s") delivery — set both tofalsefor a book-only feed.
v14.18.0 — 2026-06-06
- Cancel-order and replace-order requests now accept an optional
account_id(aid) selecting which account’s client-order-id namespace the order reference resolves against; omit it to use your default account.
v14.17.0 — 2026-06-05
- The order-entry websocket (
/ws/orders) now accepts an optionalaccount_idquery parameter to scope the stream to a single account; omitting it defaults to your own account. Anaccount_idyou are not authorized to read returns403, and a malformed value returns400.
v14.13.0 — 2026-06-03
GET /fills,GET /liquidations,GET /transactions, andGET /funding-transactionsnow require an explicit time range no wider than 7 days (bothstart_timestamp_nsandend_timestamp_ns); requests that omit the range or exceed 7 days return 400.
v14.12.0 — 2026-06-03
GET /orders(order history) now requires an explicit time range no wider than 7 days (bothstart_timestamp_nsandend_timestamp_ns); requests that omit the range or exceed 7 days return 400.
v14.11.0 — 2026-06-02
- New
GET /estimated-funding-rateendpoint returns the live intraday estimated funding rate for a perpetual symbol. - The live estimated funding rate is also available over the WebSocket API via a
GetEstimatedFundingRaterequest (t="ef") on/ws/orders. - Order gateway WebSocket sessions accept an optional
client_heartbeat_timeout(seconds, up to 300). Send a heartbeat ({"t":"h"}) more often than this; if none arrives in the window, the exchange closes the session and cancels your orders (when cancel-on-disconnect is on), so you recover from a network drop in seconds rather than waiting on the TCP timeout. Only heartbeats reset the deadline.
v14.10.0 — 2026-06-01
- Orders rejected for breaching the exchange price-limit bands now return a clear “order price is above/below the exchange’s maximum/minimum price limit” message.
v14.8.0 — 2026-05-27
- The
account_idfield is now included on everyFillDetailsevent and everyBalanceentry returned by the balances endpoints. - Cancel-reject events on the order gateway websocket now include the full order details (symbol, side, quantity, etc.) under the
ofield, matching the shape of other order events.
v14.5.0 — 2026-05-25
- The order-gateway WebSocket login response now includes a
codfield indicating whether cancel-on-disconnect is active for the session.
v14.4.0 — 2026-05-20
- Available balances are now returned as an aggregate USD value.
- Latencies between matching engine timestamps and time of sending to the client are significantly improved.
- Fixed an order-gateway race that could send an
OrderReplacedOrAmendedWebSocket event whosereplacement_orderreportedFILLEDwithfilled_quantity = 0when the new order matched immediately on cancel-replace. The replacement’s filled/remaining quantities now match its order state. GET /funding-transactionsnow supports cursor-based pagination viastart_timestamp_ns,end_timestamp_ns,sort_ts,limit, andcursorquery parameters; responses includenext_cursor,limit, andtotal_count. The endpoint also accepts an optionalsymbolfilter.
v14.1.0 — 2026-05-12
- Added request type
t="s"to/ws/ordersto get order status byoidorcid; matchesGET /order-statusREST equivalent. - Cancel requests sent before the exchange has acknowledged the original order now return error code
409 order not yet acknowledged by exchange; retry shortlyinstead of500 internal server error.
v14.0.1 — 2026-05-07
GET /order-statusnow accepts only query parametersoidandcid, matchingPOST /cancel-orderandPOST /replace-order. The previous parameter namesorder_id/client_order_idare no longer accepted and will result in HTTP400response code.
v13.53.0 — 2026-05-05
- You can now cancel, replace, and query order status using your client order ID.
- Order placement and replacement now return actionable HTTP status codes (400/404/429/503/504) with human-readable error messages when the exchange rejects an order, instead of an opaque 500.
- Order rejections from the exchange now surface the actual reject reason instead of a generic 500 error.
- Cancel/replace requests with an invalid order id now return 400 with a clear message instead of 500.
- Fixed rare case where rejected orders could remain in Pending state until the next gateway restart.
v13.48.0 — 2026-04-23
- Order requests now accept a self-trade prevention behavior flag: cancel-resting, cancel-incoming, or cancel-both; defaults to cancel-incoming, which matches the previous behavior.
- Order status responses now include reject_reason and reject_message if applicable.
v13.47.0 — 2026-04-21
- Throttled marketdata WebSocket ticker events
{ "t": "s", ... }to at most 1/s.