Exchange Wire Formats

Aster Futures wire format

How Aster Perpetual 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 Aster Perpetual 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.

Aster's market data API uses Binance USDⓈ-M Futures message formats, and the same conversions apply. Aster's documentation does not list the <symbol>@trade and <symbol>@depth@0ms streams the collector subscribes to; both send Binance-format trade and depthUpdate events.

  • Trades WebSocket: wss://fstream.asterdex.com/stream?streams=<symbol>@trade/…
  • Depth WebSocket: wss://fstream.asterdex.com/stream?streams=<symbol>@depth@0ms/…
  • Ticker WebSocket: wss://fstream.asterdex.com/stream?streams=!ticker@arr
  • Mark price WebSocket: wss://fstream.asterdex.com/stream?streams=!markPrice@arr@1s
  • Liquidations WebSocket: wss://fstream.asterdex.com/stream?streams=!forceOrder@arr
  • REST: https://fapi.asterdex.com

Exchange API reference: github.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
WebSocket message · <symbol>@tradereceived 2026-10-05 19:16:13.423571 UTC
{
"stream": "btcusdt@trade",
"data": {
"e": "trade",
"E": 1791227773292,
"T": 1791227773250,
"s": "BTCUSDT",
"t": 148500896,
"p": "85600.9",
"q": "0.002",
"X": "MARKET",
"m": false
}
}

Published row

received_time1791227773423571000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Aster.
event_time1791227773292data.ECopied. Milliseconds.
symbolBTCUSDTdata.sCopied.
trade_id148500896data.tCopied.
price85600.9data.pCopied as the exact decimal string Aster sent.
quantity0.002data.qCopied as the exact decimal string. Base asset units.
trade_time1791227773250data.TCopied. Milliseconds.
is_buyer_makerfalsedata.mCopied. true means the seller was the aggressor.
order_typeMARKETdata.XCopied. MARKET if Aster omits the field.

Notes

  • Trades with a zero or negative quantity are dropped and not published.

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

WebSocket message · <symbol>@depth@0msreceived 2026-10-05 19:16:13.512476 UTC
{
"stream": "btcusdt@depth@0ms",
"data": {
"e": "depthUpdate",
"E": 1791227773380,
"T": 1791227773350,
"s": "BTCUSDT",
"U": 585621556224,
"u": 585621557091,
"pu": 585621555794,
"b": [
["85590.6", "4.298"]
],
"a": [
["85599.7", "0.000"],
["85604.3", "6.949"],
["85648.6", "0.000"]
]
}
}

Published rows · 4

received_time1791227773512476000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Aster.
event_time1791227773380data.ECopied. Milliseconds.
transaction_time1791227773350data.TCopied. Milliseconds.
symbolBTCUSDTdata.sCopied.
event_typeupdatedata.eupdate for every depthUpdate message.
first_update_id585621556224data.UCopied.
final_update_id585621557091data.uCopied.
prev_final_update_id585621555794data.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.
price85599.7data.b[][0]data.a[][0]Copied as the exact decimal string.
quantity0.000data.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. Aster 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 19:16:12.809647 UTC
GET https://fapi.asterdex.com/fapi/v1/depth?symbol=BTCUSDT&limit=5
{
"lastUpdateId": 585621541676,
"E": 1791227772674,
"T": 1791227772650,
"bids": [
["85600.8", "0.109"],
["85599.6", "0.058"],
["85594.3", "0.025"],
["85594.2", "0.263"],
["85594.1", "0.722"]
],
"asks": [
["85600.9", "0.963"],
["85604.0", "0.125"],
["85604.1", "0.025"],
["85604.2", "6.206"],
["85604.3", "6.949"]
]
}

Published rows · 10

received_time1791227772809647978—Our collector's clock when the REST response arrived, in nanoseconds since the Unix epoch.
event_time1791227772674ECopied. Milliseconds.
transaction_time1791227772650TCopied. Milliseconds.
symbolBTCUSDT—The symbol the collector requested.
event_typesnapshot—snapshot for every REST snapshot.
first_update_idnull—Null for snapshots.
final_update_id585621541676lastUpdateIdCopied.
prev_final_update_idnull—Null for snapshots.
last_update_id585621541676lastUpdateIdCopied. 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.
price85600.9bids[][0]asks[][0]Copied as the exact decimal string.
quantity0.963bids[][1]asks[][1]Copied as the exact decimal string.
order_countnull—Null. Aster does not report order counts.

Notes

  • Aster 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 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.
  • 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 symbol whose statistics changed, from the !ticker@arr stream, at most one per symbol per second.

  • WebSocket !ticker@arr

The all-market frame carries only the tickers that changed in the last second; this one carried 2. Each entry becomes its own row.

WebSocket message · !ticker@arrreceived 2026-10-05 19:16:13.823719 UTC
{
"stream": "!ticker@arr",
"data": [
{
"e": "24hrTicker",
"E": 1791227773292,
"s": "BTCUSDT",
"p": "254.9",
"P": "0.299",
"w": "85953.6",
"c": "85600.9",
"Q": "0.002",
"o": "85346.0",
"h": "86964.9",
"l": "84942.4",
"v": "7310.230",
"q": "628340740.71",
"O": 1791141360000,
"C": 1791227773250,
"F": 148456821,
"L": 148500896,
"n": 44075
},
{
"e": "24hrTicker",
"E": 1791227772893,
"s": "TRADOORUSDT",
"p": "0.0106000",
"P": "1.529",
"w": "0.6992235",
"c": "0.7038000",
"Q": "1",
"o": "0.6932000",
"h": "0.7055000",
"l": "0.6880000",
"v": "87356",
"q": "61081.3700000",
"O": 1791147960000,
"C": 1791227772850,
"F": 384877,
"L": 385481,
"n": 605
}
]
}

Published rows · 2

received_time1791227773823719000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Aster.
event_time1791227773292data[].ECopied. Milliseconds.
symbolBTCUSDTdata[].sCopied.
price_change254.9data[].pCopied.
price_change_percent0.299data[].PCopied. Percent: 0.299 means +0.299 %.
weighted_average_price85953.6data[].wCopied.
last_price85600.9data[].cCopied.
last_quantity0.002data[].QCopied. Base asset units.
open_price85346.0data[].oCopied.
high_price86964.9data[].hCopied.
low_price84942.4data[].lCopied.
base_asset_volume7310.230data[].vCopied. Base asset units.
quote_asset_volume628340740.71data[].qCopied. Quote asset units.
statistics_open_time1791141360000data[].OCopied. Milliseconds.
statistics_close_time1791227773250data[].CCopied. Milliseconds.
first_trade_id148456821data[].FCopied.
last_trade_id148500896data[].LCopied.
total_trades44075data[].nCopied.

Notes

  • A symbol whose statistics did not change gets no row for that second. Carry the last row forward.

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 771 symbols; only BTCUSDT is shown. Each entry becomes its own row.

WebSocket message · !markPrice@arr@1sreceived 2026-10-05 19:16:13.403169 UTC
{
"stream": "!markPrice@arr@1s",
"data": [
{
"e": "markPriceUpdate",
"E": 1791227773000,
"s": "BTCUSDT",
"p": "85606.06731160",
"P": "85585.57423237",
"i": "85630.89804348",
"r": "0.00006494",
"T": 1791244800000
}
]
}

Published row

received_time1791227773403169000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Aster.
event_time1791227773000data[].ECopied. Milliseconds.
symbolBTCUSDTdata[].sCopied.
mark_price85606.06731160data[].pCopied.
index_price85630.89804348data[].iCopied.
estimated_settle_price85585.57423237data[].PCopied. Aster documents it as only useful in the last hour before settlement.
funding_rate0.00006494data[].rCopied. A fraction per funding period: 0.00006494 is 0.006494 %.
next_funding_time1791244800000data[].TCopied. Milliseconds.

Column types and descriptions: Mark Price schema.

Liquidations

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

  • WebSocket !forceOrder@arr
WebSocket message · !forceOrder@arrreceived 2026-10-05 19:24:36.372586 UTC
{
"stream": "!forceOrder@arr",
"data": {
"e": "forceOrder",
"E": 1791228276231,
"o": {
"s": "PAIDUSDT",
"S": "SELL",
"o": "LIMIT",
"f": "IOC",
"q": "14270",
"p": "0.0037107",
"ap": "0.0040600",
"X": "FILLED",
"l": "14270",
"z": "14270",
"T": 1791228276200
}
}
}

Published row

received_time1791228276372586000—Our collector's clock when the message arrived, in nanoseconds since the Unix epoch. Not sent by Aster.
event_time1791228276231data.ECopied. Milliseconds.
symbolPAIDUSDTdata.o.sCopied.
sideSELLdata.o.SCopied. BUY closes a liquidated short, SELL a liquidated long.
order_typeLIMITdata.o.oCopied.
time_in_forceIOCdata.o.fCopied.
quantity14270data.o.qCopied. Original order quantity, base asset units.
price0.0037107data.o.pCopied. The liquidation order's limit price.
average_price0.0040600data.o.apCopied. Average fill price.
order_statusFILLEDdata.o.XCopied.
last_filled_quantity14270data.o.lCopied. Quantity of the order's last fill.
filled_quantity14270data.o.zCopied. Accumulated filled quantity.
trade_time1791228276200data.o.TCopied. Milliseconds.

Notes

  • Aster pushes at most one liquidation per symbol per 1,000 ms: the latest in each window. Rows are a sample, not every liquidation: counts and totals are a lower bound.

Column types and descriptions: Liquidations schema.

Not published

  • Open Interest: The collector does not poll Aster's open interest, so no open interest files are published.