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
add:tradingCredits on each GET /api/v1/balanceiso 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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: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
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
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
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
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