Hyperliquid table reference
Full schema for the Supanode Hyperliquid Historical Data Indexer — raw block fills plus order, wallet and position views, with every column, type and partition key.
// updated 2026-08-22
The hyperliquid database holds perpetual exchange activity: one row per fill, plus derived order and wallet rollups. This page documents every table, column, type, and description. For runnable patterns see Query examples; for connection details see Indexer overview.
Schema snapshot: 1 September 2026. History starts 27 July 2025 and runs to the present. Row counts grow continuously - raw_node_fills_by_block added roughly 190 million rows between the August and September snapshots.
Summary
| Table | Kind | Rows | Size |
|---|---|---|---|
raw_node_fills_by_block | table | 3,131,968,443 | 225.58 GB |
agg_fulfilled_order | order rollup | not reported | not reported |
view_perpetual_wallet | view | not reported | not reported |
view_wallet_position | view | not reported | not reported |
Why three tables say "not reported". The wallet and position surfaces are views - they hold no rows of their own and are computed from the fill data when you query them, so the catalog reports nothing for them. Query them directly and you get rows back. agg_fulfilled_order is an aggregating rollup on a 90-day window and the catalog currently reports 0 rows for it, so ask us about its state before you build a pipeline on it.
raw_node_fills_by_block
Raw, per-fill records as read from the node, ordered by block. This is the table almost every query starts from.
Partition key: utc_fill_dt
Rows: 3,131,968,443 · Size: 225.58 GB
History: 27 July 2025 to the present
| Column | Type | Description |
|---|---|---|
utc_fill_dttm | DateTime64(3, 'UTC') | UTC datetime of the fill (millisecond precision) |
utc_fill_dt | Date | UTC date of the fill (for partitioning) |
fill_id | Int64 | Unique fill identifier |
fill_hash | String | Hash of the fill |
fill_type | String | Type of fill (trade, liquidation, etc.) |
utc_block_dttm | DateTime64(9, 'UTC') | UTC datetime of the block (nanosecond precision) |
block_id | Int64 | Hyperliquid block number |
block_tx_idx | UInt16 | Transaction index within the block |
wallet_address | String | Wallet address of the trader |
coin | String | Trading pair symbol (e.g. BTC, ETH) |
price | Float64 | Execution price |
size | Float64 | Fill size (in contracts) |
side | String | Trade side (Buy/Sell) |
start_position | Float64 | Position size before the fill |
closed_pnl | Float64 | Realized PnL from this fill, in USD |
order_id | Int64 | Order identifier |
order_crossed_spread_flg | Bool | Whether the order crossed the spread (taker) |
fee | Float64 | Trading fee |
fee_token | String | Token used for fee payment |
client_order_id | Nullable(String) | Client-provided order ID |
builder_fee | Nullable(Float64) | Builder / API fee |
builder | Nullable(String) | Builder / API identifier |
liquidation_user | Nullable(String) | User being liquidated (if a liquidation) |
liquidation_mark_px | Nullable(Float64) | Mark price at liquidation |
liquidation_method | Nullable(String) | Liquidation method used |
twap_id | Nullable(Int64) | TWAP order identifier |
deployer_fee | Nullable(Float64) | Deployer fee for spot tokens |
priority_gas | Nullable(Float64) | Priority gas paid for inclusion, in USDC |
closed_pnl and fee are already denominated in USD. They are Float64, not integer base units - do not divide by 1e6 or 1e8. Hyperliquid is the exception here; the Solana tables use raw base units.
agg_fulfilled_order
Fill-level activity aggregated up to the fulfilled order, so one row covers every fill that belonged to the same order_id.
Partition key: toYYYYMM(utc_first_fill_dt)
Retention: 90 days
| Column | Type | Description |
|---|---|---|
utc_first_fill_dttm | SimpleAggregateFunction(min, DateTime64(3, 'UTC')) | UTC datetime of the first fill for this order |
utc_first_fill_dt | Date | UTC date of the first fill (for partitioning) |
order_id | Int64 | Unique order identifier |
wallet_address | String | Wallet address of the trader |
coin | String | Trading pair symbol |
side | String | Trade side (Buy/Sell) |
twap_id | Nullable(Int64) | TWAP order identifier, if part of a TWAP |
size | SimpleAggregateFunction(sum, Float64) | Total filled size, in contracts |
volume | SimpleAggregateFunction(sum, Float64) | Total filled volume, in USD |
closed_pnl | SimpleAggregateFunction(sum, Float64) | Realized PnL from this order |
Aggregate columns need their combinator. size, volume and closed_pnl are SimpleAggregateFunction(sum, ...) - read them through sum() in a GROUP BY, not as plain values.
view_perpetual_wallet
Per-wallet aggregate across all positions. Everything needed for a trader leaderboard without writing the aggregation yourself.
| Column | Type | Description |
|---|---|---|
wallet_address | String | Wallet address of the trader |
total_pnl | Float64 | Total realized profit and loss across all positions |
total_volume | Float64 | Total trading volume, in USD |
cnt_unique_orders | UInt64 | Count of unique orders placed |
last_utc_order_dt | SimpleAggregateFunction(max, Date) | UTC date of the most recent order |
win_count | UInt64 | Number of profitable trades |
total_count | UInt64 | Total number of completed trades |
sum_order_roi | Float64 | Sum of return on investment across all orders |
sum_profitable_pnl | Float64 | Sum of PnL from profitable trades |
cnt_profitable_orders | UInt64 | Count of profitable orders |
sum_unprofitable_pnl | Float64 | Sum of PnL from unprofitable trades (negative) |
cnt_unprofitable_orders | UInt64 | Count of unprofitable orders |
cnt_unique_coins | UInt64 | Number of unique trading pairs traded |
cnt_trade_days | UInt64 | Number of distinct days with trading activity |
roi_quantiles | Array(Float64) | ROI distribution quantiles for the wallet |
view_wallet_position
Latest position per wallet and market.
| Column | Type | Description |
|---|---|---|
wallet_address | String | Wallet address of the trader |
coin | String | Trading pair symbol |
last_position_size | Float64 | Current position size (positive = long, negative = short) |
last_position_update_dttm | DateTime64(3, 'UTC') | UTC datetime of the last position update |
What is not in the database
There is no funding-rate or funding-payment table. Funding is not part of this dataset - anything you read about funding history belongs to the Hyperliquid API, not to the Indexer. What the Indexer covers is fills, and everything hanging off a fill: liquidations, TWAP membership, builder codes, fees, priority gas, and position deltas.
Order-book depth is a separate surface - see Order-book archive.
Get started
Provision access or start a trial: @supanode_tgs.