Skip to main content

Changelog

Record of all API changes and updates for Derivatives Trading.

2026-05-07

REST API — Account / User Data Stream

  • New: POST / PUT / DELETE /fapi/v1/listenKey (HMAC SHA256). Issue, refresh, and revoke a 64-character listenKey for the user data stream. TTL 3600s, one active key per user (POST is idempotent). See User Data Stream.
  • New: GET / POST /fapi/v1/marginType (HMAC SHA256). Stub for Binance compatibility — GET always returns marginType=CROSSED, POST CROSSED is idempotent, POST ISOLATED is rejected with -4046 (the fapi/HMAC namespace runs cross-only). For genuine isolated mode, use the JWT-authenticated POST /api/v1/account/margin-mode. See Margin Type.

REST API — Market Data

  • Changed: GET /fapi/v1/exchangeInfo now populates symbols[*].filters (previously absent). Filters returned: PRICE_FILTER, LOT_SIZE, MARKET_LOT_SIZE, MIN_NOTIONAL. See Exchange Information.
  • Changed: GET /api/v1/markets (non-fapi list endpoint) now also exposes min_order_size_usd, lot_size, and tick_size so clients can size orders without round-tripping to the per-symbol detail endpoint.

REST API — Orders

  • Changed: POST /fapi/v1/order now bypasses the MIN_NOTIONAL filter when reduceOnly=true. A position bled below 10 USD by funding fees can now be closed via reduce-only — it could previously not be placed at all. LOT_SIZE and MAX_NOTIONAL are still enforced.
  • Changed: -1013 rejection messages now start with the standard Binance Filter failure: <FILTER>. prefix (LOT_SIZE, MIN_NOTIONAL, or MAX_NOTIONAL) so clients can switch on the failed filter type.

WebSocket — Authentication

  • New: WebSocket auth accepts a fapi listenKey: {"type":"auth","listenKey":"<key>"}. The lookup also refreshes the TTL on the underlying Redis keys, so a long-running WebSocket connection acts as implicit keepalive. See WebSocket General.

2026-04-28

REST API — Orders

  • New: PUT /fapi/v1/order (modify order). Implemented as cancel‑and‑resubmit with proper margin re‑freezing; preserves the orderId from the caller's perspective. The side field is optional (defaults to the existing order's side). See Modify Order.
  • New: Symbol‑sharded routing (Plan A) — write‑side requests are transparently forwarded to the pod that owns the symbol's shard. No client change required; clientOrderId round‑trips remain stable.
  • New: Listing helpers GET /orders, GET /orders/open, and GET /positions/active for clients that prefer non‑Binance‑style routes.
  • Changed: POST /fapi/v1/order now enforces lot size and the symbol's min/max notional before the matching engine is touched. Sub‑lot quantities are floored to the lot grid (no rejection); orders outside notional bounds return -1013.
  • Changed: timeInForce accepts GTX (post‑only). Crossing GTX orders are rejected with -2010 instead of being silently filled as takers. IOC / FOK / GTC semantics are now strictly honored at the engine layer (previously partially silent on IOC).
  • Changed: Trigger orders that would fire immediately (e.g. STOP with stopPrice already breached) are rejected with -2021 instead of executing on the next tick.
  • Changed: STOP_LIMIT and TAKE_PROFIT_LIMIT are accepted as aliases for STOP and TAKE_PROFIT respectively.
  • Changed: reduceOnly orders are clamped to the opposite‑side position size at admission. If a reduceOnly=true order would otherwise open or flip a position, it is rejected.
  • Changed: Trigger orders (trigger_orders) are now honored by the cancel paths — DELETE /fapi/v1/order, DELETE /fapi/v1/allOpenOrders, and DELETE /fapi/v1/batchOrders. Cancelling a parent order also cascade‑cancels its TP/SL trigger orders. Frozen margin attributable to fapi‑created orders is correctly released on cancel‑all and batch‑cancel paths.
  • Changed: Trigger orders submitted via POST /fapi/v1/order now honor stopPrice correctly (previously diverted to the resting book in some edge cases).
  • Fix: Persistence of newClientOrderId. avg_price is now stored per order so query-order/all-orders return consistent average fill prices instead of recomputing per request.
  • Fix: timeInForce is persisted; openOrder returns terminal status correctly; userTrades filter parameters (startTime, endTime, fromId) honored. Three pre‑existing P0 data‑integrity bugs in /fapi/v1 and /api/v1/account/trades plugged.
  • Fix: Sub‑lot fill drift — partially filled orders that drift below one lot size are clamped and transitioned to FILLED instead of remaining PARTIALLY_FILLED indefinitely.
  • Fix: Position partial‑vs‑flip branching is decided in token units (not USD), eliminating a class of phantom‑credit drift on flip‑close. Unspent collateral is credited back on flip‑close. Manual close / liquidation / ADL paths emit complete realized_pnl_events.

REST API — Account & Funds

  • New: GET /account/fee-info is reachable without authentication. Anonymous callers receive the public VIP tier schedule (VIP 0 baseline); authenticated callers additionally see their tier, 14d/30d rolling volume, pending downgrade, and effective discount stack.
  • New: Trader PnL leaderboard, backed by Timescale continuous aggregates for sub‑second response on whole‑population queries.
  • New: WITHDRAWALS_PAUSED operational kill switch — when enabled during incident‑reconciliation windows, POST /withdraw/request returns 503 SERVICE_UNAVAILABLE with code WITHDRAWALS_PAUSED. Cancel/confirm/history endpoints are unaffected.
  • Changed: /account/trades and /account/orders now support keyset pagination via an opaque cursor query parameter and a next_cursor response field. cursor mode returns total: -1 (the count is not computed); legacy offset paging is preserved for backward compatibility but is O(N) past offset > 5000.
  • Changed: POST /account/margin-mode accepts mode as an alias for margin_mode (so the same body works for the Binance‑style marginType switch).
  • Perf: /account/trades rewritten as UNION ALL — query time dropped from ~17.5 s to ~7 ms (≈2,500×) on hot accounts.

REST API — Margin / Leverage / Position Mode

  • Changed: POST /fapi/v1/leverage is now persisted per (user, symbol) and applied automatically when a subsequent order arrives without an explicit leverage value.
  • Changed: POST /fapi/v1/positionSide/dual rejects hedge‑mode toggles (dualSidePosition=true) with -4059. One‑way mode is the only supported mode. The field is accepted as bool or string for client compatibility.
  • New: GET /fapi/v2/positionRisk is registered as an alias of the v1 route.
  • Changed: /unified/account now includes the initial margin reserved by resting (open) orders in the snapshot, so equity / available‑balance / uniMMR reflect the same world that the order admission path sees.
  • Changed: Reduce‑only orders on /api/v1/orders are subject to the same cap+reject rule as the fapi path.

REST API — Market Data

  • Changed: GET /fapi/v1/ticker/24hr no longer emits a correlated subquery; symbol filter is pushed down. Multi‑symbol responses are materially faster.
  • Changed: GET /fapi/v1/income rewritten as UNION ALL over commission / funding / realized‑PnL sources.

Authentication

  • Changed: HMAC SHA‑256 signature verification accepts both raw and URL‑encoded payloads. Clients that emit one form versus the other (e.g. requests vs raw urllib3) no longer need to align before signing.

REST API — Input Tolerance

The following fields now accept Binance‑compatible bool or string input forms (previous strict typing rejected one form or the other):

EndpointFieldAccepted
POST /fapi/v1/orderreduceOnlytrue / false / "true" / "false"
POST /fapi/v1/orderdualSidePositionsame
POST /fapi/v1/leverageleverageint / "int" (numeric string)

WebSocket

  • New: Private channel balances — Postgres LISTEN/NOTIFY‑driven push of balance changes (decimal fields are emitted as strings to preserve precision). Eliminates the need for REST polling on GET /account/balances. See User Data Stream.
  • Changed: orderbook channel depth expanded from 20 to 30 levels.
  • Fix: Subscribe path no longer starves under high broadcast load — the WS handler was rewritten to use a writer task, biased select, bounded MPSC, and a snapshot semaphore. Initial subscribe snapshots now arrive promptly even when ~50 trade events/s are flowing.

2026-04-15

  • New: 6-tier VIP fee schedule (VIP 0 – VIP 5) with 14-day rolling volume windows. See VIP Tier Fee Schedule. Upgrades take effect immediately; downgrades are buffered until the next UTC 00:00.
  • New: GET /account/fee-info returns full tier schedule, user's current/effective rates, 14d/30d rolling volumes, progress to the next tier, and the active referral / token-staking discount stack.
  • New: Private WebSocket channel vip_tier pushes vip_tier_changed events (upgrade_immediate / downgrade_scheduled / downgrade_applied).
  • Changed: /fapi/v1/commissionRate now returns effective rates (base × discount_multiplier) instead of base rates.
  • Fix: POST /orders/preview est_slippage is now a real orderbook scan instead of hard-coded zero; max_slippage is actually enforced and rejects SLIPPAGE_EXCEEDED before reaching the matching engine for market orders.
  • Fix: next_funding_time on /external/markets/:symbol/ticker now returns the next UTC top-of-hour instead of 0.
  • Fix: Symbol path params (/funding-rates/:symbol, .../details, /markets/:symbol/...) accept both upper- and lower-case.

2026-03-26

  • Initial release of base documentation / USDⓈ-M Futures