Exchange Wire Formats

Binance Futures wire format

How Binance USDⓈ-M Futures messages become rows in our Parquet files. Each data type below shows a real message next to the rows we publish for it, with the source and the rule for every column. Hover a line or a column to see how they connect.

Checked against our pipeline

These messages were captured from Binance USDⓈ-M Futures on 2026-10-05. Our test suite replays each one through the production collector parser and postprocessor, and fails if the published rows differ from the rows on this page. Files written before a change to the pipeline can differ; see Known Gaps & Corrections.

  • Public WebSocket (depth, trades): wss://fstream.binance.com/public/stream?streams=<symbol>@depth@0ms/<symbol>@trade
  • Market WebSocket (ticker, mark price, liquidations): wss://fstream.binance.com/market/stream?streams=!ticker@arr/!markPrice@arr@1s/!forceOrder@arr
  • REST: https://fapi.binance.com

Exchange API reference: developers.binance.com. Conventions shared by every exchange are on the wire formats overview.

Trades

One row per trade from the <symbol>@trade stream.

  • WebSocket <symbol>@trade

Trade

WebSocket message · <symbol>@tradereceived 2026-10-05 19:01:48.989326 UTC
{
"stream": "btcusdt@trade",
"data": {
"e": "trade",
"E": 1791226908849,
"T": 1791226908849,
"s": "BTCUSDT",
"t": 8148200197,
"p": "85583.20",
"q": "0.064",
"X": "MARKET",
"m": true,
"st": 1
}
}

Published row

received_time1791226908989326000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226908849data.ECopied. Milliseconds.
symbolBTCUSDTdata.sCopied.
trade_id8148200197data.tCopied.
price85583.20data.pCopied as the exact decimal string Binance sent.
quantity0.064data.qCopied as the exact decimal string. Base asset units.
trade_time1791226908849data.TCopied. Milliseconds.
is_buyer_makertruedata.mCopied. true means the seller was the aggressor.
order_typeMARKETdata.XCopied. MARKET if Binance omits the field.

Non-market trade (X: "NA")

Binance also sends trade events with order type NA and price and quantity 0. Their trade IDs belong to the same sequence as market trades. We publish them unchanged.

WebSocket message · <symbol>@tradereceived 2026-10-05 18:54:51.658000 UTC
{
"stream": "btcusdt@trade",
"data": {
"e": "trade",
"E": 1791226491521,
"T": 1791226491521,
"s": "BTCUSDT",
"t": 8148193400,
"p": "0",
"q": "0",
"X": "NA",
"m": false,
"st": 1
}
}

Published row

received_time1791226491658000000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226491521data.ECopied. Milliseconds.
symbolBTCUSDTdata.sCopied.
trade_id8148193400data.tCopied.
price0data.pCopied as the exact decimal string Binance sent.
quantity0data.qCopied as the exact decimal string. Base asset units.
trade_time1791226491521data.TCopied. Milliseconds.
is_buyer_makerfalsedata.mCopied. true means the seller was the aggressor.
order_typeNAdata.XCopied. MARKET if Binance omits the field.

Notes

  • Rows with order_type NA have price and quantity 0. Exclude them before you compute volume, VWAP or price statistics. Keep them if you use trade_id to detect gaps.

Column types and descriptions: Trades schema.

Order Book

One row per price level. Updates come from the <symbol>@depth@0ms stream; REST snapshots anchor the book.

  • WebSocket <symbol>@depth@0ms
  • REST GET /fapi/v1/depth

Depth update

Abridged: Binance sent 14 bid and 8 ask levels in this message; the two highest bids and the three lowest asks are shown.

WebSocket message · <symbol>@depth@0msreceived 2026-10-05 19:01:38.340225 UTC
{
"stream": "btcusdt@depth@0ms",
"data": {
"e": "depthUpdate",
"E": 1791226898196,
"T": 1791226898194,
"s": "BTCUSDT",
"ps": "BTCUSDT",
"U": 11742309239582,
"u": 11742309241602,
"pu": 11742309239523,
"b": [
["85547.70", "0.020"],
["85580.30", "0.355"]
],
"a": [
["85601.90", "2.784"],
["85605.10", "0.001"],
["85723.10", "0.000"]
],
"st": 1
}
}

Published rows · 5

received_time1791226898340225000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226898196data.ECopied. Milliseconds.
transaction_time1791226898194data.TCopied. Milliseconds.
symbolBTCUSDTdata.sCopied.
event_typeupdatedata.eupdate for every depthUpdate message.
first_update_id11742309239582data.UCopied.
final_update_id11742309241602data.uCopied.
prev_final_update_id11742309239523data.puCopied. Equals the previous message's u; a mismatch is a gap.
last_update_idnull—Null. Depth updates carry no separate last update ID.
sideaskdata.bdata.abid for levels in b, ask for levels in a. One row per level.
price85601.90data.b[][0]data.a[][0]Copied as the exact decimal string.
quantity2.784data.b[][1]data.a[][1]Copied as the exact decimal string: the new total at that price. 0.000 removes the level.
order_countnull—Null. Binance does not report order counts.

REST depth snapshot

The collector fetches a REST snapshot when it connects and when it has to re-anchor the book after a sequence gap. Only snapshots the collector applied to its book are published, as one snapshot row per level.

Abridged: Requested with limit=5 to keep the example short; the collector requests limit=500.

REST responsereceived 2026-10-05 18:55:29.504069 UTC
GET https://fapi.binance.com/fapi/v1/depth?symbol=BTCUSDT&limit=5
{
"lastUpdateId": 11742279126574,
"E": 1791226529372,
"T": 1791226529369,
"bids": [
["85583.10", "4.900"],
["85583.00", "0.016"],
["85582.90", "0.002"],
["85582.50", "0.001"],
["85582.40", "0.002"]
],
"asks": [
["85583.20", "5.022"],
["85583.30", "0.003"],
["85583.40", "0.060"],
["85583.50", "0.006"],
["85583.70", "0.002"]
]
}

Published rows · 10

received_time1791226529504069515—Our collector's clock when the REST response arrived, in nanoseconds since the Unix epoch.
event_time1791226529372ECopied. Milliseconds.
transaction_time1791226529369TCopied. Milliseconds.
symbolBTCUSDT—The symbol the collector requested.
event_typesnapshot—snapshot for every REST snapshot.
first_update_idnull—Null for snapshots.
final_update_id11742279126574lastUpdateIdCopied.
prev_final_update_idnull—Null for snapshots.
last_update_id11742279126574lastUpdateIdCopied. Replay from the first later update whose first_update_id ≤ this value ≤ final_update_id, or whose prev_final_update_id equals it.
sideaskbidsasksbid for levels in bids, ask for levels in asks. One row per level.
price85583.20bids[][0]asks[][0]Copied as the exact decimal string.
quantity5.022bids[][1]asks[][1]Copied as the exact decimal string.
order_countnull—Null. Binance does not report order counts.

Notes

  • Update rows whose final_update_id equals a snapshot's lastUpdateId in the same hour are not published: the snapshot already contains them.
  • A depth update with no levels becomes one row with side noop and price and quantity 0. It carries the update IDs and does not change the book. An empty REST snapshot becomes one noop snapshot row: clear the book on it.
  • Binance can send a removal (quantity 0) for a level that is not in the book. Its documentation says this is normal; ignore it when you replay.
  • A file can start with a checkpoint: our replayed book at the hour boundary, as snapshot rows with received_time at the hour start, the event_time of the last exchange event before it, null transaction_time, and the last applied update ID in final_update_id and last_update_id. A checkpoint is written only when the book is proven current. Without one, continue from the previous hour's book or wait for the next snapshot.

Column types and descriptions: Order Book schema.

Ticker

One row per entry of each !ticker@arr frame. Binance includes only the symbols whose statistics changed, at most once per second.

  • WebSocket !ticker@arr

Abridged: The all-market frame carried 185 tickers; only BTCUSDT is shown. Each entry becomes its own row.

WebSocket message · !ticker@arrreceived 2026-10-05 19:01:46.148563 UTC
{
"stream": "!ticker@arr",
"data": [
{
"e": "24hrTicker",
"E": 1791226905514,
"s": "BTCUSDT",
"ps": "BTCUSDT",
"p": "283.20",
"P": "0.332",
"w": "85961.44",
"c": "85583.20",
"Q": "0.033",
"o": "85300.00",
"h": "86976.10",
"l": "84910.00",
"v": "175409.143",
"q": "15078422443.55",
"O": 1791140460000,
"C": 1791226905514,
"F": 8144678472,
"L": 8148200173,
"n": 3507274,
"st": 1
}
]
}

Published row

received_time1791226906148563000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226905514data[].ECopied. Milliseconds.
symbolBTCUSDTdata[].sCopied.
price_change283.20data[].pCopied.
price_change_percent0.332data[].PCopied. Percent: 0.332 means +0.332 %.
weighted_average_price85961.44data[].wCopied.
last_price85583.20data[].cCopied.
last_quantity0.033data[].QCopied.
open_price85300.00data[].oCopied.
high_price86976.10data[].hCopied.
low_price84910.00data[].lCopied.
base_asset_volume175409.143data[].vCopied. Base asset units.
quote_asset_volume15078422443.55data[].qCopied. Quote asset units.
statistics_open_time1791140460000data[].OCopied. Milliseconds.
statistics_close_time1791226905514data[].CCopied. Milliseconds.
first_trade_id8144678472data[].FCopied.
last_trade_id8148200173data[].LCopied.
total_trades3507274data[].nCopied.

Notes

  • A symbol whose statistics did not change gets no row for that second. Carry the last row forward.
  • Only symbols listed in USDⓈ-M exchangeInfo are published. Binance's all-market streams also carry COIN-M contracts (such as BTCUSD_PERP) and delisted symbols; their rows are dropped. Before the 2026-09 data-integrity release they were published.

Column types and descriptions: Ticker schema.

Mark Price

One row per symbol per !markPrice@arr@1s frame, about one per second.

  • WebSocket !markPrice@arr@1s

Abridged: The all-market frame carried 745 symbols; only BTCUSDT is shown. Each entry becomes its own row.

WebSocket message · !markPrice@arr@1sreceived 2026-10-05 19:01:42.216687 UTC
{
"stream": "!markPrice@arr@1s",
"data": [
{
"e": "markPriceUpdate",
"E": 1791226902000,
"s": "BTCUSDT",
"p": "85583.30000000",
"ap": "85583.30000000",
"P": "85612.13024722",
"i": "85633.04043478",
"r": "0.00000563",
"T": 1791244800000,
"st": 1
}
]
}

Published row

received_time1791226902216687000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226902000data[].ECopied. Milliseconds.
symbolBTCUSDTdata[].sCopied.
mark_price85583.30000000data[].pCopied.
index_price85633.04043478data[].iCopied.
estimated_settle_price85612.13024722data[].PCopied. Binance documents it as only useful in the last hour before settlement.
funding_rate0.00000563data[].rCopied. A fraction per funding period: 0.00000563 is 0.000563 %.
next_funding_time1791244800000data[].TCopied. Milliseconds.

Notes

  • Only symbols listed in USDⓈ-M exchangeInfo are published. Binance's all-market streams also carry COIN-M contracts (such as BTCUSD_PERP) and delisted symbols; their rows are dropped. Before the 2026-09 data-integrity release they were published.

Column types and descriptions: Mark Price schema.

Open Interest

One row per 5-minute open interest point from REST polling.

  • REST GET /futures/data/openInterestHist

Binance's USDⓈ-M WebSocket streams do not include open interest. The collector polls the 5-minute open interest history every 5 minutes. Each point is published once, in the hour of the first poll that returned it.

Abridged: Requested with limit=3 to keep the example short; the collector requests limit=500.

REST responsereceived 2026-10-05 18:55:29.795573 UTC
GET https://fapi.binance.com/futures/data/openInterestHist?symbol=BTCUSDT&period=5m&limit=3
[
{
"symbol": "BTCUSDT",
"sumOpenInterest": "95006.41500000",
"sumOpenInterestValue": "8130409421.87865450",
"CMCCirculatingSupply": "20093487.00000000",
"timestamp": 1791225600000
},
{
"symbol": "BTCUSDT",
"sumOpenInterest": "94973.61800000",
"sumOpenInterestValue": "8127186910.47580000",
"CMCCirculatingSupply": "20093487.00000000",
"timestamp": 1791225900000
},
{
"symbol": "BTCUSDT",
"sumOpenInterest": "94930.31000000",
"sumOpenInterestValue": "8122474649.37500000",
"CMCCirculatingSupply": "20093487.00000000",
"timestamp": 1791226200000
}
]

Published rows · 3

received_time1791226529795573655—Our collector's clock when the REST response arrived, in nanoseconds since the Unix epoch. Every point from one poll shares it.
symbolBTCUSDT[].symbolCopied.
sum_open_interest95006.41500000[].sumOpenInterestCopied. Base asset units.
sum_open_interest_value8130409421.87865450[].sumOpenInterestValueCopied. Notional value in the quote asset (USDT for BTCUSDT).
timestamp1791225600000[].timestampCopied. Binance's time for the 5-minute point. Milliseconds.

Notes

  • Each poll returns up to 500 points (about 41 hours). After a pause in polling, points that no earlier hour published appear in the next hour's file, so timestamp can be hours before received_time.

Column types and descriptions: Open Interest schema.

Liquidations

One row per forceOrder event on the !forceOrder@arr stream.

  • WebSocket !forceOrder@arr
WebSocket message · !forceOrder@arrreceived 2026-10-05 19:01:53.291380 UTC
{
"stream": "!forceOrder@arr",
"data": {
"e": "forceOrder",
"E": 1791226913155,
"o": {
"s": "RLCUSDT",
"S": "BUY",
"o": "LIMIT",
"f": "IOC",
"q": "809.3",
"p": "0.7135",
"ap": "0.7048",
"X": "FILLED",
"l": "0.8",
"z": "809.3",
"T": 1791226913110,
"ps": "RLCUSDT",
"st": 1
}
}
}

Published row

received_time1791226913291380000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Binance.
event_time1791226913155data.ECopied. Milliseconds.
symbolRLCUSDTdata.o.sCopied.
sideBUYdata.o.SCopied. BUY closes a liquidated short, SELL a liquidated long.
order_typeLIMITdata.o.oCopied.
time_in_forceIOCdata.o.fCopied.
quantity809.3data.o.qCopied. Original order quantity, base asset units.
price0.7135data.o.pCopied. The liquidation order's limit price.
average_price0.7048data.o.apCopied. Average fill price.
order_statusFILLEDdata.o.XCopied.
last_filled_quantity0.8data.o.lCopied. Quantity of the order's last fill.
filled_quantity809.3data.o.zCopied. Accumulated filled quantity.
trade_time1791226913110data.o.TCopied. Milliseconds.

Notes

  • Binance pushes at most one liquidation per symbol per 1,000 ms. Rows are a sample, not every liquidation: counts and totals are a lower bound.
  • Only symbols listed in USDⓈ-M exchangeInfo are published. Binance's all-market streams also carry COIN-M contracts (such as BTCUSD_PERP) and delisted symbols; their rows are dropped. Before the 2026-09 data-integrity release they were published.

Column types and descriptions: Liquidations schema.