Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Changelog

2026-10-20

REST API

  • add: GET /fapi/v1/userTransfers accepts an optional asset name and comma-separated action values, e.g. asset=USDC&action=DEPOSIT,WITHDRAWAL. Filters apply before pagination and persist in the cursor; omit asset for all assets
  • fix: GET /fapi/v1/userTransfers now matches the action filter against the stored movement kind. Previously, filtering by action always returned an empty page
  • change: the generated SDK userTransfers / user_transfers method gains an asset argument after address, shifting the positional endTime, limit, and startTime arguments. Pass null / undefined in WASM or None in Rust to keep querying all assets
  • add: POST /tx/submitDegen — the route for a User/DegenTrade call message, which is all it accepts. Same request envelope and response as POST /tx/submit, which still carries DegenTrade as well for now

2026-10-19

REST API

  • add: tradingCredits on each GET /api/v1/balance iso item: trading credits funding an isolated position on a cross-margin market. Moving cross margin into the position spends credits before USDC; any remaining credits return to cross when the position closes, or on a transfer back to cross once it has no position or open orders (a transfer with no USDC to move then ends there, with no Transfer event). A transfer to any other destination moves USDC only. They count as margin but are never withdrawable

2026-10-16

REST API

  • change: POST /tx/submit and POST /api/v1/solanaOffchainTx now relay only User, Vault and Public exchange call messages, plus Bank/TransferWithMemo and Warp/TransferRemote. Keeper and Admin call messages are rejected with 403 before reaching the sequencer and must be submitted to the sequencer directly

WebSocket

  • change: order.place applies the same call-message policy; a Keeper or Admin call message fails with error code -1020 (Unsupported operation)

2026-10-09

REST API

  • add: isDegen on every GET /fapi/v1/userTrades item, plus an optional isDegen=true|false query filter. Only the Degen user’s fill is true; ordinary counterparties in the same transaction and TWAP fills remain false

WebSocket

  • add: o.isDegen on orderTradeUpdate TRADE messages: true for the Degen user’s fills of a DegenTrade open or close and of the liquidation that sweeps the position; false for the counterparties and every other fill

2026-10-03

REST API

  • change: GET /fapi/v1/depth — limit maximum raised from 25 to 1000 (default still 20). Larger values are still clamped to the maximum rather than rejected

WebSocket

  • add: SYMBOL@depth100 — orderbook depth stream with 100 levels per side, same message format as the other depth topics
  • fix: depth updates now describe only the top N levels of the subscribed depth. Previously an update could carry changes from deeper in the book, or drop changes when more than N levels changed at once. A level leaving the top N now arrives with qty "0"; a level entering it arrives with its full qty
  • fix: the snapshot sent on subscribing to a depth topic now chains into the first update (its u equals that update’s pu). Previously, when the book had not changed since the last update, the snapshot carried the next, not-yet-published update id, so the first update looked like a sequence gap. GET /fapi/v1/depth’s lastUpdateId had the same off-by-one and now matches the stream

2026-09-29

REST API

  • remove: GET /api/v1/account, /api/v1/accounts, /api/v1/balance — account.unrealizedLossBorrow is no longer returned. The synthetic unrealized-loss borrow it reported was retired and the value was 0 for every account at the time of removal. Clients reading the field should drop it

2026-09-28

Transactions

  • change: transaction format for the accounts hard fork. TxDetails.chain_id is replaced by chain_hash_fragment (the first 8 bytes of chainHash as a little-endian u64; a decimal string in the Solana offchain JSON), UnsignedTransaction gains an optional address_override (send None), signatures cover the borsh-serialized SigningPayload::V0 (version byte, unsigned transaction, chain hash) instead of borsh(unsigned_tx) ++ chain_hash, and the Solana offchain JSON payload carries "version": 0. See Transaction Signing and Transaction Fields
  • note: each environment may keep accepting the previous encoding for single-signer transactions below a configured cutoff height announced with the upgrade schedule; above it the previous encoding is rejected. chainInfo.chainId remains in exchangeInfo but is no longer used in transactions

2026-09-24

REST API

  • add: accountVariant.kind may now be sub_vault on GET /api/v1/account, /api/v1/accounts, /api/v1/balance — one of a vault’s sub-accounts. For this kind accountVariant.master is the vault’s address and accountVariant.leader the vault leader’s. Clients branching on kind must accept the new value

2026-09-18

REST API

  • change: GET /fapi/v1/fundingRate — now returns funding rate history as on Binance: one row per hourly settlement with symbol, fundingRate (the dampened 8h-basis rate) and fundingTime (hour start, Unix microseconds), oldest first; markPrice is no longer returned. Optional symbol, startTime / endTime (inclusive Unix microseconds) and limit (default 100, max 1000); without startTime the most recent rows are returned. At most 2 * limit hours are searched from the given bound, so a gap in the snapshot feed shortens the page rather than reaching further back. Previously returned the live rate per symbol — clients wanting the live or estimated rate, or the mark price, should use GET /fapi/v1/premiumIndex. Responds 503 where historical data is not configured; Cache-Control: public, max-age=60

2026-09-10

REST API

  • add: GET /api/v1/oraclePrices — asset oracle prices, including collateral assets. Each row contains assetId, asset, oraclePrice (a decimal string), and nullable lastUpdateTimestamp (Unix microseconds). Optional assetId filters the result; the response is always an array sorted by asset ID. An explicit asset lookup returns 404 if the asset or its oracle price is unavailable; an unfiltered request omits assets without an oracle price. Responses use Cache-Control: public, max-age=1

2026-09-14

REST API

  • add: GET /fapi/v1/userTransfers — ledger of every value movement touching an address, newest first: wallet deposits and withdrawals, moves between cross, spot and isolated buckets, sends to other accounts or wallets, vault deposits and withdrawals, and Hyperlane bridge arrivals and departures. Each entry carries action, both from and to sides (address, bucket, symbol for isolated markets, vaultName for vaults), amount, fee, shares on vault movements and memo. Same address / startTime / endTime / limit / cursor parameters as userDeposits, plus an optional action filter
  • note: bridge and wallet-to-wallet entries have no on-chain execution time, so their time is the indexing time, typically a few seconds later. Bucket context (from / to) on deposits is only available from 2026-08-13; earlier deposits show as wallet to cross, spot or isolated

2026-09-11

REST API

  • change: GET /fapi/v1/userLiquidations — now returns orderbook, ADL, backstop and borrow-lend liquidations (previously backstop only); new liquidationType field (orderbook, backstop, adl, borrow_lend). markPrice renamed to price. liquidatorAddress, side, realizedPnl, liquidatorReward are nullable; symbol and marketId are null for borrow_lend
  • add: protocolReward, fee, orderId, tradeId, isMaker on GET /fapi/v1/userLiquidations — null where not applicable to the liquidationType
  • add: borrowLend object on GET /fapi/v1/userLiquidations with liabilityAsset, liabilityAssetId, collateralAsset, collateralAssetId, collateralSize; present only for liquidationType: borrow_lend, null otherwise

2026-09-03

REST API

  • change: GET /fapi/v3/account — marginDiscount can now also be "SUPER_LP", "ASSET_WEIGHT_LP" or "ASSET_WEIGHT_SUPER_LP" in addition to "NONE" and "LP". Clients branching on the old two values must accept the new ones. SUPER_LP accounts post no initial margin on open orders, only maintenance margin on the open position; ASSET_WEIGHT_* accounts value all collateral at full asset weight
  • fix: GET /fapi/v3/account — maxWithdrawAmount now reflects the account’s asset weight discount, and per-position initialMargin reflects the Super LP discount (no initial margin on open orders). totalMarginBalance and availableBalance are unweighted and unchanged

2026-08-05

REST API

  • change: GET /api/v1/account, /api/v1/accounts, /api/v1/balance — accountVariant.kind for a sub-account is now sub_v1 or legacy_sub instead of sub, and for a vault vault_v1 or protocol_vault_v1 instead of vault / protocol_vault. Clients branching on "sub", "vault" or "protocol_vault" must accept the new values. The unversioned kinds are transitional — they cover accounts that have not yet recorded their master or leader on-chain — and disappear once every account has been migrated
  • add: accountVariant.master on GET /api/v1/account, /api/v1/accounts, /api/v1/balance — the sub-account’s master address. Only present when kind is sub_v1; null otherwise
  • add: accountVariant.leader on the same endpoints — the vault’s leader address. Only present when kind is vault_v1 or protocol_vault_v1; null otherwise

Transactions

  • add: UserAction::SetAccountGroup { address, group, sub_account_index } — sets an account’s self-trade group. Accounts sharing a group are treated as one entity and cannot trade against each other. address: null targets the sender’s own account with sub_account_index applied; naming an address ignores sub_account_index and is permitted for the sender’s own account, a sub-account whose recorded master is the sender, a vault the sender leads, or any account if the sender is the Protocol admin. Delegates may not set a group. Setting the group to the account’s own address restores the ungrouped default
  • note: a master and its sub-accounts, two sub-accounts of one master, and a vault and its leader can never trade against each other regardless of their groups — that relationship is recorded on-chain and is not configurable

2026-07-23

REST API

  • add: maxUtilizationRate field on GET /fapi/v1/borrowLendPools — the pool’s hard cap on borrow utilization; borrows that would push utilization above this are rejected
  • change: GET /fapi/v1/borrowLendPools — rateParams.optimal_utilisation_rate renamed to rateParams.optimal_utilization_rate (American spelling, matching the exchange). Update clients reading the old key

2026-07-03

REST API

  • add: marginDiscount field on GET /fapi/v3/account — user’s margin discount ("NONE" or "LP" for liquidity-provider discount)
  • fix: GET /fapi/v3/account — per-position initialMargin now uses the account’s margin discount (LP users previously showed standard initial margin on each position row)

2026-05-23

WebSocket

  • change: @aggTrade — ua, oi, mk, ff, lq, fe, nf, fa, co, sd, ft, z, Z, rs are now deprecated empty/zero placeholders; treat the values as meaningless and use @user.orders for real fill data
  • add: o.ap (average price), o.N (commission asset), o.rp (realized PnL) on @user.orders TRADE fills
  • change: @user.orders — o.ua is now a deprecated empty-string placeholder; the address is implicit from the authenticated stream

2026-05-19

REST API

  • add: feeTier and feeDiscountBps fields on GET /fapi/v1/account — user’s fee tier (0–9) and additional per-user fee discount in basis points

2026-05-15

REST API

  • add: GET /api/v1/balance — Bullet account balance with per-asset gross assetAmount/liabilityAmount, account-level tradingCredits and unrealizedLossBorrow, and referral/liquidity rewards
  • fix: GET /fapi/v3/balance — maxWithdrawAmount now uses the configured USDC withdraw fee instead of zero

2026-05-14

REST API

  • add: GET /fapi/v1/premiumIndex — mark price, index price, last funding rate (8h), interest rate, estimated next funding rate (1h), and next funding time per symbol. Optional symbol query param; omit to return all markets

2026-05-13

REST API

  • add: GET /fapi/v1/openOrders — user TP/SL orders are now returned alongside regular limit orders, matching Binance’s response shape. New rows carry orderType of STOP or TAKE_PROFIT, populated stopPrice, and workingType (MARK_PRICE or CONTRACT_PRICE)
  • add: isTrigger boolean field on every open-order response row. TP/SL and regular orders draw from independent ID counters in the rollup, so clients should use (orderId, isTrigger) as the composite key
  • fix: GET /fapi/v1/openOrders — timeInForce, orderType, workingType, origType, priceMatch, selfTradePreventionMode no longer return the literal string "TODO"; populated with GTC / LIMIT / CONTRACT_PRICE / NONE
  • add: GET /fapi/v1/openOrders — timeInForce is now GTD and goodTillDate is populated when the order has an expiry timestamp
  • add: GET /fapi/v1/openOrder — new optional triggerOrderId query param to look up a specific user TP/SL order. Mutually exclusive with orderId / clientOrderId

WebSocket

  • add: o.m field on @user.orders TRADE fills — true if the fill was on the maker side, matching Binance ORDER_TRADE_UPDATE
  • add: o.t field on @user.orders TRADE fills — trade id, matching Binance ORDER_TRADE_UPDATE

2026-05-12

REST API

  • add: pendingTpsl field on GET /fapi/v1/openOrders and /fapi/v1/openOrder — reserved TP/SL pair attached to an unfilled parent limit order, with optional tp and sl legs (triggerOrderId, orderPrice, triggerPrice, priceCondition, orderType, timeInForce) and a dynamicSize flag. Omitted when the parent has no TP/SL reservation
  • change: stopPrice on /fapi/v1/openOrders and /fapi/v1/openOrder now derives from the SL leg trigger price when a pending TP/SL reservation exists

2026-05-10

REST API

  • fix: GET /fapi/v1/allOrders — resolved timeout errors for high-volume addresses; query now returns reliably regardless of order history size

2026-05-08

REST API

  • change: GET /fapi/v1/openOrders — symbol query parameter is now optional; omit it to return open orders across all markets
  • add: marketId field added to open order response objects
  • fix: OpenAPI schema for GET /fapi/v1/fundingRate corrected to return an array — was incorrectly documented as a single object
  • fix: OpenAPI schema for GET /fapi/v1/insuranceBalance corrected to return a single object — was incorrectly documented as an array

2026-05-07

REST API

  • fix: GET /fapi/v1/allOrders — avgPrice was incorrectly reported as a large negative number for orders where price × size > 170; all affected values are now correct

2026-05-04

REST API

  • fix: GET /fapi/v1/allOrders — unfilled IOC and FOK orders now correctly report status EXPIRED; previously they fell through to NEW or PARTIALLY_FILLED
  • fix: GET /fapi/v1/allOrders — if a fully-filled order also has a cancel record, status is now correctly FILLED rather than CANCELED

2026-05-01

Documentation

  • add: docs are now served as raw markdown at parallel .md URLs (e.g. /docs/getting-started.md) for programmatic access
  • add: llms.txt index served at /llms.txt listing all available REST and WebSocket API references

2026-04-30

REST API

  • add: GET /fapi/v1/fundingInfo — funding rate metadata per symbol: cap rate, floor rate, and funding interval. Accepts optional symbol query param; omit for all markets

2026-04-24

WebSocket

  • add: ft field on @aggTrade and @user.orders TRADE fills — fill type (o orderbook, l liquidation, b backstop liquidation, a ADL)
  • add: z, Z, rs fields on @aggTrade and @user.orders TRADE fills — cumulative filled size, cumulative filled cost, remaining size

2026-03-26

REST API

  • add: GET /fapi/v1/userLiquidations — query liquidation history by address, with optional symbol and time range filters
  • add: GET /fapi/v1/userDeposits — query deposit history by address, with time range filters
  • add: GET /fapi/v1/userWithdrawals — query withdrawal history by address, with time range filters

2026-03-25

Documentation

  • add: getting started page — step-by-step guide linking connectivity, account setup, signing, order fields, REST, and WebSocket docs
  • add: cross-links from WebSocket order methods to the corresponding transaction signing sections
  • add: tx status values table documenting processed, published, submitted, finalized, dropped, and unknown
  • fix: WebSocket table of contents structure and indentation

2026-03-24

REST API

  • add: GET /fapi/v1/openInterest — open interest per market
  • add: GET /fapi/v1/ticker/24hr — 24-hour rolling window price change statistics for all markets (price, volume, trade count)

2026-03-20

REST API

  • add: txHashes field to GET /fapi/v1/allOrders response — deduplicated list of tx hashes per order (place, fills, cancels)
  • add: address and txHash fields to GET /fapi/v1/userTrades response
  • fix: OpenAPI spec now uses Decimal types for prices and quantities instead of f64

Documentation

  • add: order types and fields page — reference for NewOrderArgs, order types, TP/SL, and sub-account index
  • note: @ticker and broadcast tickers topics marked as coming soon
  • add: user data stream note — use main account address, not delegate address

2026-03-18

REST API

  • add: GET /fapi/v1/allOrders — query order history (filled, cancelled, expired) by address, with optional symbol, time range, and orderId filters

2026-03-17

REST API

  • add: GET /fapi/v1/userTrades — query account fill history by address, with optional symbol and time range filters

2026-03-16

SDK

  • add: Rust SDK — type-safe client with REST, WebSocket, transaction signing, and keypair management

Documentation

  • add: connectivity page — environment hosts and endpoint URLs

2026-03-13

Documentation

  • add: transaction fields guide — documents all order fields, time-in-force options, and self-trade prevention modes
  • add: amend order example in transaction signing guide
  • add: comparison of amend vs cancel-replace order modification strategies
  • add: account setup guide — sign in, deposit, get a signing key, start trading
  • add: delegate accounts guide — generate a keypair, register via webapp, trade with scoped and revocable access

2026-03-12

REST API

  • fix: OpenAPI schema now uses correct unsigned integer types for IDs and quantities
  • fix: removed internal metrics endpoint from public OpenAPI spec

2026-03-10

Documentation

  • fix: decimal encoding guide — simplified examples to encode RustDecimal directly, removing redundant SurrogateDecimal wrapper (no wire format change)

2026-03-05

WebSocket

  • add: consistency guarantees page — documents snapshot delivery, backend reconnection behavior, and message ordering
  • change: idle timeout disconnect reason is now idle_timeout — server disconnects if no valid message is received within 60 seconds of connecting

2026-02-20

Documentation

  • add: CancelAllOrders and CancelMarketOrders transaction signing examples
  • add: decimal encoding guide with C++, Python, and JavaScript examples
  • add: guides landing page and sidebar section
  • fix: removed internal terminology from public docs

2026-02-19

Documentation

  • fix: OrderResult field table now matches actual response schema (results.tx_id, results.status, results.order_ids, results.client_order_ids)
  • fix: transaction signing guide uses correct camelCase field names (chainInfo.chainId, chainHash) matching REST API response
  • fix: ListSubscriptions and Error examples now use correct 16-digit microsecond timestamps
  • add: documented order.amend / order.modify WebSocket method
  • add: documented order.cancelAll WebSocket method
  • fix: topic tables now list all accepted aliases (SYMBOL@liquidations, !liquidations, !ticker, !markPrice, etc.)
  • fix: @liquidations is now the primary topic name, @forceOrder as alias
  • note: kline topics marked as coming soon
  • change: WebSocket method names default to lowercase (order.place, subscribe), uppercase accepted as alias

2026-02-18

Initial Release

  • WebSocket API specification with Binance FAPI-compatible format
    • connection lifecycle (status, keepalive, disconnect reasons)
    • subscription streams (subscribe, unsubscribe, list_subscriptions)
    • request-response operations (order.place, order.cancel)
    • market data streams (depthUpdate, aggTrade, bookTicker, markPrice, forceOrder, orderTradeUpdate)
    • topic format reference and error codes
  • Transaction signing guide with Rust reference implementation
    • borsh type definitions matching exchange schema
    • ed25519 signing flow
    • PlaceOrders and CancelOrders examples
    • REST and WebSocket submission
  • REST API docs (Swagger/OpenAPI) served at /docs/rest