BitqueryBitqueryData Store
Hyperliquid logoHyperliquidOrdersEvents

Hyperliquid Order Book

L4 order-book data from HyperCore: every order status including cancels and rejects, per-order book deltas, and the oracle and mark price pushes behind them.

Coverage
Latest monthto Oct 13, 2026 · yesterday
Tables
3Parquet, one prefix each
Columns
107across 3 tables
Coverage ends yesterday, UTC

Overview

Hyperliquid order book data from the HyperCore L1, not HyperEVM. The order_updates table keeps every order through its lifecycle: open, canceled, filled, triggered and the *Rejected states, with time in force, reduce-only, trigger conditions and position TP/SL flags. The book_updates table is L4, one row per new, update or remove of a single order with its owner, order id, price and size, so the book can be rebuilt at any block rather than at snapshot boundaries. The price_updates table records each mark, oracle and external perp price per coin, and the inputs behind them.

Hyperliquid's own S3 archive publishes L2 snapshots and asset contexts and nothing else. Rejects and cancels are invisible in any trades-only dataset, and they are most of the signal in microstructure work. Money and sizes are decimal strings, addresses are 0x-prefixed hex, and Order_PlacedTime is epoch milliseconds while Block_Time and Order_EventTime are epoch nanoseconds.

Use cases

  • Order-book microstructure research at L4: queue position, order lifetime, cancel and reject rates
  • Rebuild the book at any block from per-order new, update and remove deltas
  • Market-maker behaviour: quoting, time in force, reduce-only and ALO reject patterns by wallet
  • Mark and oracle price studies on HIP-3 markets

3 tables

107 columns · free sample for each table

order_updates

51 columns

One row per order status change: open, canceled, filled, triggered and every *Rejected state, with time in force, reduce-only and trigger fields. Order_EventTime is epoch nanoseconds.

hyperliquid/<start_date>_<end_date>/order_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies
Browse columns Sample fileSample updated Sep 30, 2026

book_updates

36 columns

L4 order-book deltas: one row per new, update or remove of a single order, with owner, order id, price and size.

hyperliquid/<start_date>_<end_date>/book_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies
Browse columns Sample fileSample updated Sep 30, 2026

price_updates

20 columns

One row per coin and price kind in each oracle push: the resulting mark, oracle and external perp prices, and the inputs behind them.

hyperliquid/<start_date>_<end_date>/price_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies
Browse columns Sample fileSample updated Sep 30, 2026

Schema reference

copies a column name
107 columns
order_updates51 columnsOne row per order status change: open, canceled, filled, triggered and every *Rejected state, with time in force, reduce-only and trigger fields. Order_EventTime is epoch nanoseconds.
ColumnTypeDescription
Block3
Block_NumberUInt64HyperCore block number; the join key across the Hyperliquid datasets
Block_TimeInt64Block time, epoch nanoseconds
Block_DateDateUTC date of the block; pipeline bookkeeping, handy for partitioning
Order_Trader5
Order_Trader_AddressStringAccount address, 0x-prefixed hex
Order_Trader_SignerStringAddress that signed the order action, 0x-prefixed hex, such as an API wallet; can be empty
Order_Trader_VaultStringVault or subaccount address when the node reports one, 0x-prefixed hex; in current data it equals the trader address when filled; can be empty
Order_Trader_BroadcasterStringAddress that broadcast the signed action, 0x-prefixed hex; can be empty
Order_Trader_SignedAtInt64Nonce of the signed action, which Hyperliquid sets to epoch milliseconds; 0 when unknown
Order22
Order_StatusStringopen, canceled, filled, triggered, or one of the *Rejected states such as badAloPxRejected
Order_EventTimeInt64Status time, epoch nanoseconds
Order_SideStringBuy or Sell
Order_LimitPxStringLimit price, decimal string
Order_SizeStringRemaining size at this status, in base units, decimal string
Order_OrigSzStringOriginal size when the order was placed, in base units, decimal string
Order_OidUInt64Order id
Order_PlacedTimeInt64Order placement time, epoch milliseconds
Order_OrderTypeStringLimit, Market, Stop Market, Take Profit Limit, and so on
Order_TriggerConditionStringTrigger condition for trigger orders, N/A otherwise
Order_TriggerPxStringTrigger price, decimal string; 0.0 for non-trigger orders
Order_IsTriggerBool1 for stop and take-profit orders, else 0
Order_IsPositionTpslBool1 when the order is a position-level take-profit or stop-loss, else 0
Order_ReduceOnlyBool1 when the order can only reduce a position, else 0
Order_CloidStringClient order id, 0x-prefixed hex
Order_TifStringTime in force: Gtc, Ioc, Alo, or FrontendMarket
Order_HashStringL1 transaction hash, 0x-prefixed hex; not a join key, one transaction spans many events
Order_BuilderStringBuilder address when the order came through a builder, else empty
Order_IsRejectBool1 when Order_Status is one of the *Rejected states, else 0
Order_ParentOidUInt64Order id of the parent order on take-profit and stop orders attached to it; 0 otherwise
Order_LegUInt32Which attached order this is under Order_ParentOid, from 1; 0 for orders without a parent
Order_BuilderFeeUInt32Builder fee as the node reports it; 0 when the order has no builder, can be empty
Order_Market6
Order_Market_CoinRawStringMarket as the node names it: plain perp (HYPE), HIP-3 perp (xyz:DRAM), spot (@107) or outcome token (#1890)
Order_Market_SymbolStringReadable market name: HYPE, DRAM for xyz:DRAM, or the spot pair name when known (raw @107 otherwise)
Order_Market_KindStringperp, hip3, spot or outcome
Order_Market_ProtocolStringhypercore for plain perps, spot and outcome tokens; the deploying dex (such as xyz) for HIP-3 markets
Order_Market_IsPerpBool1 for plain perps and HIP-3 perps, 0 for spot and outcome tokens
Order_Market_MaxLeverageUInt32Maximum margin multiple on the market (40 means 40x); 0 when unknown, can be empty
Other1
ChainIdStringChain identifier, always hyperliquid-core; pipeline bookkeeping
Order_Position9
Order_Position_SideStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_SizeStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_SizeBeforeStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_EntryPriceStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_RealizedPnlStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_FundingStringNot filled in this table, always empty; part of the shared Hyperliquid schema
Order_Position_LeverageUInt32Account's margin multiple on this market (20 means 20x) when known; 0 otherwise, can be empty
Order_Position_IsCrossBool1 when the account uses cross margin on this market, when known; can be empty
Order_Position_ClosedBoolNot filled in this table, always empty; part of the shared Hyperliquid schema
Indexing3
Indexing_TimeInt64When our pipeline indexed the block, epoch nanoseconds; pipeline bookkeeping
Indexing_OnTreeBool1 when the block was on our block tree at indexing time; pipeline bookkeeping
Indexing_OnTrunkBool1 when the block was on the finalized chain at indexing time; pipeline bookkeeping
Recording2
Recording_TimeUInt32When the row was written, epoch seconds; pipeline bookkeeping
Recording_HashUInt64Row hash used to drop duplicates; pipeline bookkeeping
Sample file
book_updates36 columnsL4 order-book deltas: one row per new, update or remove of a single order, with owner, order id, price and size.
ColumnTypeDescription
Block3
Block_NumberUInt64HyperCore block number; the join key across the Hyperliquid datasets
Block_TimeInt64Block time, epoch nanoseconds
Block_DateDateUTC date of the block; pipeline bookkeeping, handy for partitioning
BookUpdate_Trader5
BookUpdate_Trader_AddressStringAccount address, 0x-prefixed hex
BookUpdate_Trader_SignerStringAddress that signed the order action, 0x-prefixed hex, such as an API wallet; can be empty
BookUpdate_Trader_VaultStringVault or subaccount address when the node reports one, 0x-prefixed hex; in current data it equals the trader address when filled; can be empty
BookUpdate_Trader_BroadcasterStringAddress that broadcast the signed action, 0x-prefixed hex; can be empty
BookUpdate_Trader_SignedAtInt64Nonce of the signed action, which Hyperliquid sets to epoch milliseconds; 0 when unknown
BookUpdate7
BookUpdate_OidUInt64Order id
BookUpdate_SideStringBuy or Sell
BookUpdate_PxStringPrice, decimal string
BookUpdate_KindStringnew, update or remove
BookUpdate_SizeStringSize in base units, decimal string: the order's size for new, the size after the change for update
BookUpdate_SizeBeforeStringSize before an update, in base units, decimal string; empty otherwise
BookUpdate_IndexUInt32Position of this change among the block's book changes, from 0; sort by Block_Number, then this, to replay the book in order
BookUpdate_Market6
BookUpdate_Market_CoinRawStringMarket as the node names it: plain perp (HYPE), HIP-3 perp (xyz:DRAM), spot (@107) or outcome token (#1890)
BookUpdate_Market_SymbolStringReadable market name: HYPE, DRAM for xyz:DRAM, or the spot pair name when known (raw @107 otherwise)
BookUpdate_Market_KindStringperp, hip3, spot or outcome
BookUpdate_Market_ProtocolStringhypercore for plain perps, spot and outcome tokens; the deploying dex (such as xyz) for HIP-3 markets
BookUpdate_Market_IsPerpBool1 for plain perps and HIP-3 perps, 0 for spot and outcome tokens
BookUpdate_Market_MaxLeverageUInt32Maximum margin multiple on the market (40 means 40x); 0 when unknown, can be empty
Other1
ChainIdStringChain identifier, always hyperliquid-core; pipeline bookkeeping
BookUpdate_Position9
BookUpdate_Position_SideStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_SizeStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_SizeBeforeStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_EntryPriceStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_RealizedPnlStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_FundingStringNot filled in this table, always empty; part of the shared Hyperliquid schema
BookUpdate_Position_LeverageUInt32Account's margin multiple on this market (20 means 20x) when known; 0 otherwise, can be empty
BookUpdate_Position_IsCrossBool1 when the account uses cross margin on this market, when known; can be empty
BookUpdate_Position_ClosedBoolNot filled in this table, always empty; part of the shared Hyperliquid schema
Indexing3
Indexing_TimeInt64When our pipeline indexed the block, epoch nanoseconds; pipeline bookkeeping
Indexing_OnTreeBool1 when the block was on our block tree at indexing time; pipeline bookkeeping
Indexing_OnTrunkBool1 when the block was on the finalized chain at indexing time; pipeline bookkeeping
Recording2
Recording_TimeUInt32When the row was written, epoch seconds; pipeline bookkeeping
Recording_HashUInt64Row hash used to drop duplicates; pipeline bookkeeping
Sample file
price_updates20 columnsOne row per coin and price kind in each oracle push: the resulting mark, oracle and external perp prices, and the inputs behind them.
ColumnTypeDescription
Block_NumberUInt64HyperCore block number; the join key across the Hyperliquid datasets
Block_TimeInt64Block time, epoch nanoseconds
PriceUpdate_UpdateClassStringUpdate class as the node emits it, such as Normal or Fallback
PriceUpdate_Market_CoinRawStringMarket as the node names it: plain perp (HYPE), HIP-3 perp (xyz:DRAM), spot (@107) or outcome token (#1890)
PriceUpdate_KindStringWhich price this row is: mark, oracle or extPerp for the resulting prices; markInput, spotInput or extPerpInput for the inputs behind them
PriceUpdate_PriceStringPrice, decimal string
PriceUpdate_DailyPxStringDaily reference price for resulting prices, decimal string; empty on input rows
PriceUpdate_UpdateTimeInt64Last update time the node reports for resulting prices; 0 on input rows
ChainIdStringChain identifier, always hyperliquid-core; pipeline bookkeeping
PriceUpdate_Market_SymbolStringReadable market name: HYPE, DRAM for xyz:DRAM, or the spot pair name when known (raw @107 otherwise)
PriceUpdate_Market_KindStringperp, hip3, spot or outcome
PriceUpdate_Market_ProtocolStringhypercore for plain perps, spot and outcome tokens; the deploying dex (such as xyz) for HIP-3 markets
PriceUpdate_Market_IsPerpBool1 for plain perps and HIP-3 perps, 0 for spot and outcome tokens
PriceUpdate_Market_MaxLeverageUInt32Maximum margin multiple on the market (40 means 40x); 0 when unknown, can be empty
Indexing_TimeInt64When our pipeline indexed the block, epoch nanoseconds; pipeline bookkeeping
Indexing_OnTreeBool1 when the block was on our block tree at indexing time; pipeline bookkeeping
Indexing_OnTrunkBool1 when the block was on the finalized chain at indexing time; pipeline bookkeeping
Recording_TimeUInt32When the row was written, epoch seconds; pipeline bookkeeping
Recording_HashUInt64Row hash used to drop duplicates; pipeline bookkeeping
Block_DateDateUTC date of the block; pipeline bookkeeping, handy for partitioning
Sample file

Ask an AI about this data

Send this dataset’s full schema to an assistant and ask it anything. It reads the plain-text brief first, so the answer comes from the real column list rather than a guess.

Start with

Opens a new chat with the question filled in. Nothing about you is sent to Bitquery, and the assistant sees only the public brief.

Delivery

Parquet files in a Requester Pays S3 bucket or a Cloudflare R2 bucket, chosen at checkout. On S3 you download with your own AWS account and AWS bills the transfer; on R2 you download with a read-only API key and pay no egress. Layout:

# order_updates
hyperliquid/<start_date>_<end_date>/order_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies

# book_updates
hyperliquid/<start_date>_<end_date>/book_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies

# price_updates
hyperliquid/<start_date>_<end_date>/price_updates<start_block>-<end_block>-<random suffix>.parquet; file size varies
  1. Download a free sampleNo email needed.
  2. Pay nowName, work email and licence check.
  3. Pay the invoiceBy card or bank transfer.
  4. Download from S3 or R2The team prepares the export and emails the bucket path, plus a read-only API key for R2 orders.

Price

Latest month
Sep 13, 2026 → Oct 13, 2026
$500one-time, USD
  • All 3 tables, 107 columns
  • Parquet files in the layout under Delivery
  • S3 or R2 download, chosen at checkout
  • Licensed under the Data License
Pay now

FAQ

11 questions
What is included in Hyperliquid Order Book?

Three Parquet tables from HyperCore: order_updates, book_updates and price_updates, with 107 documented columns. Every row carries Block_Number and Block_Time, so the tables join on block with each other and with the Hyperliquid Trades and Funding datasets.

How big is it?

Large, and driven by quoting activity. In a measured hour of HyperCore on 29 September 2026 (50,417 blocks) we counted 76.6 million order statuses and 56.0 million book diffs, about 1.5 million and 1.1 million per 1,000 blocks, plus a few dozen oracle updates per 1,000 blocks. Scaled to a day that is roughly 1.8 billion order statuses and 1.3 billion book diffs. Volume moves with market activity; the file count and total size come with the delivery, and these figures are estimates.

How is this different from Hyperliquid's free S3 archive?

Hyperliquid's archive holds L2 book snapshots and asset contexts, uploaded roughly monthly, and states that no other historical data is provided that way. This dataset is L4: each book_updates row names the order and the address behind it, and every open, cancel and reject is in order_updates.

How do I rebuild the book?

Replay book_updates in Block_Number order per BookUpdate_Market_CoinRaw: Kind new adds an order at BookUpdate_Px with BookUpdate_Size, update changes its size from BookUpdate_SizeBefore to BookUpdate_Size, remove deletes it. Aggregate by price for an L2 view at any block, or keep order ids for queue position.

Where are the fills?

In the Hyperliquid Trades dataset. A filled status here tells you an order completed; the match price, fee and realized PnL are in its trades table, and liquidation fills in perp_liquidations, joined on Block_Number and the order id.

How far back does it go?

30 days. HyperCore history is kept as a rolling 30-day window, so a purchase covers the 30 days up to the day before we prepare the files, and there is no longer window to buy. For a continuous feed beyond that, ask about the live stream.

Why are there two time units?

Because the node emits them that way and we keep the values as emitted. Block_Time and Order_EventTime are epoch nanoseconds; Order_PlacedTime is epoch milliseconds. Divide by 1e9 or 1e3 respectively when converting to timestamps.

How do I load a file?

With DuckDB: SELECT * FROM read_parquet('order_updates/*.parquet'). With pandas: pd.read_parquet('order_updates/'). Parse Order_LimitPx, Order_Size, BookUpdate_Px and the other price and size columns with Decimal rather than float; they are stored as decimal strings on purpose.

Does this match the live stream?

Yes. These field definitions are the ones Bitquery's Hyperliquid Kafka topics use, so a backtest reading this archive and a production consumer reading the live stream decode with the same code.

How is the data delivered, and how current is it?

As Parquet files, one folder per delivery window and one prefix per table, for example hyperliquid/2026-08-31_2026-09-29/order_updates/. File names carry the block range they cover. We send the file count and total size with the delivery. We prepare the files within 7 business days of purchase, covering the 30 days up to the day before. You choose at checkout where to collect them: a Requester Pays S3 bucket, downloaded with your own AWS account, or a Cloudflare R2 bucket with a read-only API key and no egress fees. Files stay available for 7 days from delivery.

Can I try before I buy?

Yes. Every table links to a public sample Parquet file with the first 100 rows of a real slice and every column the export writes. The sample repository on GitHub shows the first records of each table as readable JSON. No email address required.