BitqueryBitqueryData Store
HyperliquidTrades

Hyperliquid Trades

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
Browse columns Sample fileSample updated Sep 2, 2026

twap_statuses

18 columns

One row per TWAP order status change: activated, finished, terminated or error, with size executed so far and notional.

hyperliquid/twap_statuses<start_block>_<end_block>.parquet200 blocks per file
Browse columns Sample fileSample updated Sep 2, 2026

Schema reference

copies a column name
43 columns
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
Block_TimeUInt64Block time, epoch nanoseconds
Other23
UserStringAccount address, 0x-prefixed hex
CoinStringMarket: plain perp (HYPE), HIP-3 perp (xyz:DRAM), spot (@107) or outcome token (#1890)
SideStringB for bid (buy), A for ask (sell)
PxDecimalPrice, decimal string
SzDecimalSize in base units, decimal string
StartPositionDecimalSigned position before the fill (negative is short), in base units
DirStringDirection label: Open Long, Close Short, Buy, and so on
ClosedPnlDecimalRealized PnL of this fill in USDC
FeeDecimalFee paid, negative when the maker received a rebate
FeeTokenStringToken the fee was paid in, usually USDC
HashStringL1 transaction hash, 0x-prefixed hex; not a join key, one transaction spans many events and TWAP trades carry 32 zero bytes
OidUInt64Order id
TidUInt64Trade id; the match key with Block_Number and Coin, appearing once per side
CrossedBoolTrue when this side was the taker
TimeUInt64Fill time, epoch milliseconds
CloidStringClient order id, 0x-prefixed hex
TwapIdUInt64TWAP id when the order is a TWAP child, else null
BuilderFeeDecimalBuilder fee charged on the fill, else null
LiquidationMapLiquidation details (liquidated user, mark price, method) when the fill was a liquidation, else null
BuilderStringBuilder address when the order came through a builder, else null
DeployerFeeDecimalHIP-3 deployer fee charged on the fill, else null
PriorityGasNullable(String)Priority gas attached to the order, else null
ExtraMapForward-compatibility map; non-empty when the node emitted a field not yet modelled
Sample file
twap_statuses18 columnsOne row per TWAP order status change: activated, finished, terminated or error, with size executed so far and notional.
ColumnTypeDescription
Block_NumberUInt64HyperCore block number; the join key across all seven tables
Block_TimeUInt64Block time, epoch nanoseconds
TimeUInt64Status time, epoch nanoseconds
TwapIdUInt64TWAP order id
State_CoinStringMarket: plain perp (HYPE), HIP-3 perp (xyz:DRAM), spot (@107) or outcome token (#1890)
State_UserStringAccount address, 0x-prefixed hex
State_SideStringB for bid (buy), A for ask (sell)
State_SzDecimalTotal TWAP size, in base units
State_ExecutedSzDecimalSize executed so far, in base units
State_ExecutedNtlDecimalNotional executed so far, in USDC
State_MinutesUInt64TWAP duration in minutes
State_TimestampUInt64TWAP start time, epoch milliseconds
State_ReduceOnlyBoolTrue when the TWAP can only reduce a position
State_RandomizeBoolTrue when sub-order timing is randomized
State_ExtraMapForward-compatibility map; non-empty when the node emitted a field not yet modelled
StatusStringactivated, finished, terminated or error
StatusErrorNullable(String)Error text when Status is error, else null
ExtraMapForward-compatibility map; non-empty when the node emitted a field not yet modelled
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, delivered as signed download links by email after payment, in this layout:

# fills — 200 blocks per file
hyperliquid/fills<start_block>_<end_block>.parquet

# twap_statuses — 200 blocks per file
hyperliquid/twap_statuses<start_block>_<end_block>.parquet
  1. Download a free sampleNo email needed.
  2. Pay nowName, work email and licence check.
  3. Pay the invoiceBy card or bank transfer.
  4. Get signed linksThe team prepares the export and emails the links.

Price

Latest month
Aug 23, 2026 → Sep 23, 2026
$100one-time, USD
  • All 2 tables, 43 columns
  • Parquet files in the layout under Delivery
  • Signed download links by email
  • Licensed under the Data License
Pay now

FAQ

12 questions
What is included in Hyperliquid Trades?

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.