Every HyperCore fill from both sides of the match, with realized PnL, fees, taker flag and liquidation details, plus TWAP order statuses.
Coverage
Latest monthto Sep 23, 2026 · yesterday
Tables
2Parquet, one prefix each
Columns
43across 2 tables
Coverage ends yesterday, UTC
Overview
Hyperliquid trades from the HyperCore L1 order-book exchange, not HyperEVM. The fills table carries one row per counterparty per match with Px, Sz, Dir, ClosedPnl, Fee, StartPosition and a Crossed flag for the taker, so maker and taker attribution and per-wallet realized PnL come straight out of the file. Liquidations carry the liquidated user, mark price and method. The twap_statuses table records each TWAP order as it activates, fills and finishes.
A match appears twice, once per side, keyed by (Block_Number, Coin, Tid); Hash is not a join key because one L1 transaction spans many matches and TWAP trades carry 32 zero bytes. Money and sizes are decimal strings, addresses are 0x-prefixed hex, and Fill.Time is epoch milliseconds while Block_Time is epoch nanoseconds.
Use cases
Per-wallet realized PnL, fees and liquidation history from both sides of every fill
Taker and maker attribution by wallet, market and hour
Volume and open-interest change by market across plain perps, HIP-3 markets and spot
TWAP execution analysis: size, notional and completion state per TWAP order
2 tables
43 columns · free sample for each table
fills
25 columns
One row per counterparty per match: price, size, direction, realized PnL, fees, taker flag and liquidation details. A match appears twice, keyed by (Block_Number, Coin, Tid). Time is epoch milliseconds.
hyperliquid/fills<start_block>_<end_block>.parquet200 blocks per file
fills25 columnsOne row per counterparty per match: price, size, direction, realized PnL, fees, taker flag and liquidation details. A match appears twice, keyed by (Block_Number, Coin, Tid). Time is epoch milliseconds.
ColumnTypeDescription
Block2
Block_NumberUInt64HyperCore block number; the join key across all seven tables
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.
Two Parquet tables from HyperCore: fills and twap_statuses, with 43 documented columns. Every row carries Block_Number and Block_Time, so the tables join on block with each other and with the Hyperliquid Order Book and Ledger datasets.
How big is it?
In a measured 1,000-block slice (about 73 seconds) we counted 1,552 fills and 3 TWAP statuses. Scaled to a day that is roughly 1.8 million fill rows; exact row counts and sizes come with the delivery manifest, and these figures are estimates.
How do I compute a wallet's realized PnL?
Filter fills on User, then sum ClosedPnl and Fee. Each match appears twice, once per counterparty, so filtering by one User never double counts. Crossed tells you whether that side was the taker, and StartPosition is the signed position before the fill (negative is short).
Which markets does Coin cover?
Plain perps such as HYPE, HIP-3 perps with a dex prefix such as xyz:DRAM, spot pairs by index such as @107, and outcome tokens such as #1890, all in the same stream. Filter on the prefix to separate them.
Where are the orders that never traded?
In the Hyperliquid Order Book dataset. This product holds matches only; opens, cancels, rejects and L4 book deltas are sold separately because they are about a hundred times larger.
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 yesterday 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 the Time column on statuses and events are epoch nanoseconds; Fill.Time and Order.Timestamp are epoch milliseconds. Divide by 1e9 or 1e3 respectively when converting to timestamps.
What does a non-empty Extra column mean?
The node emitted a field that the schema does not model yet, and we kept it rather than dropping it. Extra is empty on nearly every row. When a new field appears it lands there first, so nothing is silently lost between schema versions.
How do I load a file?
With DuckDB: SELECT * FROM read_parquet('fills/*.parquet'). With pandas: pd.read_parquet('fills/'). Parse Px, Sz, Fee and the other money 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 flat Parquet files under a stable S3 layout, one prefix per table and one file per 200-block range, with a JSON manifest listing every file and its sha256. Signed HTTPS links are emailed once the files are prepared. Refreshed daily with T+1 latency; a purchase made today includes everything up to yesterday.
Can I try before I buy?
Yes. Every table links to a public sample Parquet file from a real 1,000-block slice, and the sample repository on GitHub shows the first records of each table as readable JSON. No email address required.