Skip to main content

v15.37.0 — 2026-08-21

v15.36.0 — 2026-08-18

  • DELETE /api-keys now 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), a subscribe_candles or subscribe_bbo_candles request for an unknown or delisted symbol now returns an error response with code 404 on the same connection. Before, an unknown symbol in subscribe_candles closed the connection and dropped all other subscriptions.
  • Order gateway requests that omit account_id (aid) now return 400 account_id is required when the user has no default trading account, instead of 404 trading account not found. This applies to all order gateway REST endpoints (for example GET /open-orders, GET /orders, POST /place-order), the /orders/ws connection handshake, and the WebSocket order messages.
  • POST /logout now revokes the session token sent in the Authorization: Bearer header, as it already did for the token in the browser session cookie.

v15.32.0 — 2026-08-05

  • GET /risk-snapshot now returns mark_price and signed_usd_notional for each symbol; signed_usd_notional is the signed USD value of the position at the mark price.
  • GET /positions and GET /risk-snapshot now return signed_cost_basis. It replaces signed_notional, which is deprecated but still returned with the same value.

v15.25.0 — 2026-07-28

  • Fixed the fill events (t="f" and t="p") on the order gateway WebSocket (/orders/ws): the fill’s side field xs.d now always reports B or S. Some fills previously reported Buy or Sell.

v15.24.0 — 2026-07-25

  • POST /place-order, POST /replace-order, and the WebSocket place-order message now accept an optional rb (reprice behavior) field for post-only (po: true) orders that would cross the book on entry: rej (the default) rejects the order, bo reprices it one tick less aggressive than the opposite-side order it would have matched, and tbl reprices 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, and POST /mfa/disable (and their SDK request/response types); Clerk now handles interactive login. POST /authenticate now accepts only api_key and api_secret. Creating an API key (POST /api-keys) and updating its IP allowlist (PATCH /api-keys/allowed-ips) no longer take username, password, or totp. API-key authentication is otherwise unchanged.

v15.11.0 — 2026-07-06

  • New GET /funding-slots endpoint returns a full trading day’s funding settlements for a perpetual symbol. It takes a required symbol and an optional date (defaults to the current date in the symbol’s funding-schedule timezone). The response reports the funding variant (daily_close, a single settlement at the close, or intraday_twap, a fixed number of intraday slots each charging its share of the day’s TWAP premium), the schedule timezone, the scheduled interval_count, and an optional per-slot cap_bps. Each slot carries its index, funding_time, a status of realized / projected / skipped / pending, the mark and underlying TWAPs, premium_bps and funding_rate_bps (positive means longs pay shorts), a capped flag, and a reason on skipped slots. Two running totals — realized_sum_bps (realized so far) and projected_eod_bps (realized plus the projection for remaining slots) — give the projected end-of-day funding.

v15.10.0 — 2026-07-06

  • GET /open-orders now supports limit/offset pagination and a sort_ts timestamp sort direction (asc or desc, default desc). limit defaults to 100 and offset to 0; responses include total_count alongside the resolved limit and offset.
  • GET /funding-rates now supports cursor-based pagination via limit, cursor, and sort_ts (asc/desc, default desc) query parameters, returning next_cursor and total_count for paging through large result sets.

v15.8.0 — 2026-07-04

  • Added GET /underlying-prices and deprecated GET /index-prices. The new endpoint takes a required symbol plus an optional time range (start_timestamp_ns / end_timestamp_ns), cursor pagination (cursor, limit — default 1000), and sort_ts (asc/desc, default desc); it returns an underlying_prices array of { symbol, timestamp, price } entries with next_cursor, limit, and total_count page metadata. GET /index-prices remains served as a deprecated alias that returns identical data under the legacy index_prices key — migrate by switching the path and reading underlying_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 /orders now supports order_id and order_ids filters. order_id takes a single ID; order_ids takes 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_id field from fills, positions, transactions, funding transactions, and admin trades; use account_id instead. Renamed the risk-snapshot response type to AccountRiskSnapshot.

v14.24.0 — 2026-06-16

  • The GET /tickers endpoint now supports limit, offset, and symbol sort query parameters and returns total_count plus 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) subscribe message now supports streaming only what you need. A new level: "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 optional trades and ticker fields (both default true) independently suppress trade (t = "t") or ticker (t = "s") delivery — set both to false for 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 optional account_id query parameter to scope the stream to a single account; omitting it defaults to your own account. An account_id you are not authorized to read returns 403, and a malformed value returns 400.

v14.13.0 — 2026-06-03

  • GET /fills, GET /liquidations, GET /transactions, and GET /funding-transactions now require an explicit time range no wider than 7 days (both start_timestamp_ns and end_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 (both start_timestamp_ns and end_timestamp_ns); requests that omit the range or exceed 7 days return 400.

v14.11.0 — 2026-06-02

  • New GET /estimated-funding-rate endpoint 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 GetEstimatedFundingRate request (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_id field is now included on every FillDetails event and every Balance entry 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 o field, matching the shape of other order events.

v14.5.0 — 2026-05-25

  • The order-gateway WebSocket login response now includes a cod field 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 OrderReplacedOrAmended WebSocket event whose replacement_order reported FILLED with filled_quantity = 0 when the new order matched immediately on cancel-replace. The replacement’s filled/remaining quantities now match its order state.
  • GET /funding-transactions now supports cursor-based pagination via start_timestamp_ns, end_timestamp_ns, sort_ts, limit, and cursor query parameters; responses include next_cursor, limit, and total_count. The endpoint also accepts an optional symbol filter.

v14.1.0 — 2026-05-12

  • Added request type t="s" to /ws/orders to get order status by oid or cid; matches GET /order-status REST equivalent.
  • Cancel requests sent before the exchange has acknowledged the original order now return error code 409 order not yet acknowledged by exchange; retry shortly instead of 500 internal server error.

v14.0.1 — 2026-05-07

  • GET /order-status now accepts only query parameters oid and cid, matching POST /cancel-order and POST /replace-order. The previous parameter names order_id / client_order_id are no longer accepted and will result in HTTP 400 response 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.