Hyperliquid Futures wire format
How Hyperliquid perpetuals 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 Hyperliquid perpetuals 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.
The collector covers every listed perpetual market, including builder-deployed dexes, whose coins carry a dex prefix such as xyz:XYZ100. All examples use BTC.
- Public WebSocket:
wss://api.hyperliquid.xyz/ws - Info REST (market metadata):
https://api.hyperliquid.xyz/info
Exchange API reference: hyperliquid.gitbook.io. Conventions shared by every exchange are on the wire formats overview.
Trades
One row per fill from the trades subscription for each coin.
- WebSocket trades
Trade
{"channel": "trades","data": [{"coin": "BTC",→ symbol"side": "A",→ is_buyer_maker"px": "85628.0",→ price"sz": "0.00046",→ quantity"time": 1791227797187,→ event_time · trade_time"hash": "0x2e861874c0b73d972fff0445ea12f4020157005a5bba5c69d24ec3c77fbb1781","tid": 910713520736797,→ trade_id"users": ["0x368a9c423d0ce3d9887950125b1db4bb306c1b7d", "0x2332a66e6bdf9606d2fd63eed619357536612d4d"]}]}
Published row
event_time equals trade_time.kPEPE is published as KPEPE); builder-dex coins such as xyz:XYZ100 keep their case.tid is a hash of the buyer's and seller's order IDs, not a sequence number: it does not increase and cannot reveal gaps.side is the aggressor: A (ask, seller aggressed) gives true, B (bid, buyer aggressed) gives false.market. Hyperliquid does not send an order type; the constant marks the row as a taker fill.One taker order, several fills
A taker order that fills against several resting orders arrives as one message with one element per fill.
Abridged: The message held 39 fills; the first three are shown.
{"channel": "trades","data": [{"coin": "BTC",→ symbol"side": "B",→ is_buyer_maker"px": "85629.0",→ price"sz": "0.0009",→ quantity"time": 1791227799116,→ event_time · trade_time"hash": "0x55b2f804bb3995b3572c0445ea130d02030200ea563cb485f97ba3577a3d6f9d","tid": 590087756771268,→ trade_id"users": ["0xe60a6f40ad907263441fe89236bb67b1a47683dc", "0x4c6988b39fc0904628c2959e7606ef5f8518c152"]},{"coin": "BTC",→ symbol"side": "B",→ is_buyer_maker"px": "85629.0",→ price"sz": "0.00064",→ quantity"time": 1791227799116,→ event_time · trade_time"hash": "0x55b2f804bb3995b3572c0445ea130d02030200ea563cb485f97ba3577a3d6f9d","tid": 775060480000248,→ trade_id"users": ["0xe60a6f40ad907263441fe89236bb67b1a47683dc", "0x338e1b3dbdd72c6601a99e34f2ec6881b89d9c8d"]},{"coin": "BTC",→ symbol"side": "B",→ is_buyer_maker"px": "85629.0",→ price"sz": "0.00064",→ quantity"time": 1791227799116,→ event_time · trade_time"hash": "0x55b2f804bb3995b3572c0445ea130d02030200ea563cb485f97ba3577a3d6f9d","tid": 146242069110799,→ trade_id"users": ["0xe60a6f40ad907263441fe89236bb67b1a47683dc", "0xf86a91bda299b36c7d4fc8a7b57f5e32c34e748f"]}]}
Published rows · 3
event_time equals trade_time.kPEPE is published as KPEPE); builder-dex coins such as xyz:XYZ100 keep their case.tid is a hash of the buyer's and seller's order IDs, not a sequence number: it does not increase and cannot reveal gaps.side is the aggressor: A (ask, seller aggressed) gives true, B (bid, buyer aggressed) gives false.market. Hyperliquid does not send an order type; the constant marks the row as a taker fill.Notes
hashandusers(buyer and seller addresses) are not published. Some fills carry an all-zerohash.- One message can hold several fills of one taker order (same
time,sideandhash); each fill is its own row with its owntid. - After every subscribe, Hyperliquid first sends the market's most recent trades (about 30), however old, without marking them as a replay. On a reconnect the collector drops replayed trades it already wrote. The postprocessor drops trades timed more than 5 seconds before the start of the file's hour, exact duplicates, and trades already published in an earlier hour.
- Before the 2026-09 data-integrity release, a replayed trade could be published again in a later hour's file. Deduplicate older history on (
symbol,trade_id,trade_time): Hyperliquid documentstidas unique only together with the coin and the time.
Column types and descriptions: Trades schema.
Order Book
One row per price level of each l2Book snapshot.
- WebSocket l2Book
Every l2Book message is a full snapshot of the top of the book, not a delta. Each one becomes one snapshot row per level.
Abridged: Hyperliquid sent 20 bid and 20 ask levels; the best 3 of each are shown.
{"channel": "l2Book","data": {"coin": "BTC",→ symbol"time": 1791227796735,→ event_time · transaction_time · final_update_id · last_update_id"levels": [[→ side{→ side"px": "85628.0",→ side · price"sz": "5.71229",→ side · quantity"n": 19→ side · order_count},{→ side"px": "85627.0",→ side · price"sz": "0.005",→ side · quantity"n": 1→ side · order_count},{→ side"px": "85626.0",→ side · price"sz": "0.75919",→ side · quantity"n": 1→ side · order_count}],[→ side{→ side"px": "85629.0",→ side · price"sz": "4.37963",→ side · quantity"n": 39→ side · order_count},{→ side"px": "85630.0",→ side · price"sz": "0.58198",→ side · quantity"n": 23→ side · order_count},{→ side"px": "85631.0",→ side · price"sz": "3.85701",→ side · quantity"n": 9→ side · order_count}]]}}
Published rows · 6
time. Milliseconds.kPEPE is published as KPEPE); builder-dex coins such as xyz:XYZ100 keep their case.snapshot for every l2Book message.time. Hyperliquid has no update ID, so the time identifies the snapshot.time, as in final_update_id.bid for levels in levels[0], ask for levels in levels[1]. One row per level.Notes
- Each snapshot replaces the whole book: rebuild your book from the rows of each
final_update_id. A snapshot holds at most 20 levels per side at full price precision. Hyperliquid documents at most one push per 0.5 seconds; in October 2026 a market's snapshots arrive about every 5.4 seconds (about 670 per hour). - A snapshot with no levels on either side publishes one row with
sidenoopandpriceandquantity0, which clears the book. Files written before the October 2026 pipeline update have no row for an empty snapshot. - A snapshot holding a level with a zero, negative or unparsable price or size is withheld whole instead of being published as a partial book. Before the October 2026 pipeline update such a snapshot could be published as a partial or empty book.
- Files can start with a checkpoint snapshot of the book carried over from the previous hour: its
received_timeis the hour start,transaction_timeis null, andevent_time,final_update_idandlast_update_idare thetimeof the snapshot the book came from.
Column types and descriptions: Order Book schema.
Mark Price
One row per market per allDexsAssetCtxs message.
- WebSocket allDexsAssetCtxs
One allDexsAssetCtxs subscription covers every perpetual market on every dex. The message has no market names: each dex's array is in the order of the allPerpMetas universe, which the collector reads at startup and on every symbol refresh to name each entry. Delisted markets are skipped.
Abridged: The frame carried 534 markets across 11 perp dexes; only BTC, the first market of the main dex "", is shown. The collector splits every frame into one record per market.
{"channel": "allDexsAssetCtxs","data": {"ctxs": [["",→ symbol[{"funding": "0.0000125",→ funding_rate"openInterest": "38976.50654","prevDayPx": "85366.0","dayNtlVlm": "2807065618.8274302483","premium": "-0.0001214394","oraclePx": "85639.4",→ index_price"markPx": "85623.0",→ mark_price"midPx": "85628.5","impactPxs": ["85628.0", "85629.0"],"dayBaseVlm": "32630.96689"}]]]}}
Published row
received_time / 1,000,000). Asset contexts carry no exchange timestamp.allPerpMetas metadata: BTC is the first market of the main dex "". Main-dex coins are uppercased; builder-dex coins such as xyz:XYZ100 keep their case.oraclePx, the oracle price. For main-dex markets Hyperliquid computes it as a weighted median of prices on centralized exchanges.0.0000125 is 0.00125 % per hour.Notes
- Hyperliquid does not document how often it pushes
allDexsAssetCtxs. In October 2026 a push arrives about every 15 seconds, so a market has about 240 rows per hour. Every push becomes a row, whether or not a value changed. - The 24h fields (
prevDayPx,dayNtlVlm,dayBaseVlm),midPx,premiumandimpactPxsare not published. - Files written before the October 2026 pipeline update have
event_timein nanoseconds (the receive clock, equal toreceived_time). Divide those values by 1,000,000.
Column types and descriptions: Mark Price schema.
Open Interest
One row per market per allDexsAssetCtxs message, from the same entries as mark price.
- WebSocket allDexsAssetCtxs
One allDexsAssetCtxs subscription covers every perpetual market on every dex. The message has no market names: each dex's array is in the order of the allPerpMetas universe, which the collector reads at startup and on every symbol refresh to name each entry. Delisted markets are skipped.
Abridged: The frame carried 534 markets across 11 perp dexes; only BTC, the first market of the main dex "", is shown. The collector splits every frame into one record per market.
{"channel": "allDexsAssetCtxs","data": {"ctxs": [["",→ symbol[{"funding": "0.0000125","openInterest": "38976.50654",→ sum_open_interest"prevDayPx": "85366.0","dayNtlVlm": "2807065618.8274302483","premium": "-0.0001214394","oraclePx": "85639.4","markPx": "85623.0","midPx": "85628.5","impactPxs": ["85628.0", "85629.0"],"dayBaseVlm": "32630.96689"}]]]}}
Published row
allPerpMetas metadata: BTC is the first market of the main dex "". Main-dex coins are uppercased; builder-dex coins such as xyz:XYZ100 keep their case.mark_price for a notional.received_time / 1,000,000). Asset contexts carry no exchange timestamp.Notes
- Negative or unparsable open interest values are not published; the mark price row of the same entry still is.
- Files written before the October 2026 pipeline update have
timestampin nanoseconds (the receive clock, equal toreceived_time). Divide those values by 1,000,000.
Column types and descriptions: Open Interest schema.
Not published
- Ticker: Hyperliquid has no 24h ticker channel; the 24h fields of the asset contexts are not published.
- Liquidations: Hyperliquid has no public liquidation stream.