Hyperliquid Historical Data — Fills and 5-Minute Position Snapshots as Parquet
Hyperliquid history as Parquet files, one per UTC day: every fill with its fee, maker flag and closed PnL, and every 5-minute snapshot of every open position, plus the current open positions of every asset as one file replaced every 5 minutes. Files are handed out as temporary download links, one API call each, with no folder to browse. The archive starts on 2026-05-01. Free with one API key.
Coverage: Two datasets · one Parquet file per UTC day · fills since 2026-05-01, 5-minute positions since 2026-05-08 · the current open positions as one file, since 2026-05-01. Free — API key — delivered via API · Archive.
Data summary
| Category | Hyperliquid Perps |
|---|---|
| Coverage | Two datasets · one Parquet file per UTC day · fills since 2026-05-01, 5-minute positions since 2026-05-08 · the current open positions as one file |
| Start date | 2026-05-01 |
| Delivery | APIArchiveStreamMCP |
| Access | Free — API key |
| REST | /v1/hyperliquid/archive/datasets/v1/hyperliquid/archive/url |
Getting started
# Which days exist, with rows, bytes and the snapshot count of each positions day:
curl -H "X-API-KEY: vk_..." "https://data.vike.io/v1/hyperliquid/archive/datasets"
# Ask for a temporary link to one file. It needs no key, names that file only and
# works for 300 seconds:
URL=$(curl -s -H "X-API-KEY: vk_..." \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-10-19" | jq -r .url)
# Download the whole file, then read it locally. -o names the file: every link ends in fills.parquet.
curl -f -o fills-2026-10-19.parquet "$URL"
import requests
import polars as pl
H = {"X-API-KEY": "vk_..."}
ask = requests.get(
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-10-19",
headers=H, timeout=30,
)
ask.raise_for_status()
# The link is the credential: no key header. Download the whole file, THEN query it.
with requests.get(ask.json()["url"], stream=True, timeout=(10, 120)) as r:
r.raise_for_status()
with open("fills-2026-10-19.parquet", "wb") as f:
for chunk in r.iter_content(1 << 20):
f.write(chunk)
print(pl.scan_parquet("fills-2026-10-19.parquet")
.filter(pl.col("asset") == "BTC")
.select(pl.len(), pl.col("size_usd").sum())
.collect())
Schema
fills
One row per fill and wallet, sorted by asset, fill_ts, trade_id, wallet. Both counterparties of a trade carry the same trade_id.
| Column | Type |
|---|---|
fill_ts | DateTime64(3, 'UTC') |
wallet | String |
asset | String |
side | String |
size_token | Float64 |
price | Float64 |
size_usd | Float64 |
fee | Float64 |
fee_token | String |
is_maker | Bool |
order_id | UInt64 |
trade_id | UInt64 |
crossed | Bool |
closed_pnl | Float64 |
dex_name | String |
start_position | Float64 (nullable) |
positions
One row per open position at every 5-minute snapshot, sorted by asset, wallet, snapshot_ts. The file of the current open positions has the same columns.
| Column | Type |
|---|---|
snapshot_ts | DateTime('UTC') |
wallet | String |
asset | String |
direction | Int8 |
size_token | Float64 |
size_usd | Float64 |
entry_price | Float64 |
mark_price | Float64 |
liquidation_price | Float64 |
unrealized_pnl | Float64 |
leverage | Float32 |
margin_used | Float64 |
size_cohort | String |
leverage_type | String |
dex_name | String |
state_ts | DateTime('UTC') |
liq_progress | Float64 |
Example applications
- Backtest on full-day fills
If you are testing a signal against what actually traded, the fills file is every fill of the day with price, size, fee, whether the wallet was maker or taker and the realized PnL the node booked, sorted by asset so one asset is a slice of the file.
- Positioning research without lookahead
If your question is how the crowd was positioned at a moment in the past, the positions files carry every snapshot with the size tier the wallet had when the row was written, so a historical row is not graded with today's label.
- Whole-book snapshots without paging the API
If you need every open position at once, the latest positions file is one download of the current book, replaced every 5 minutes, instead of paging the positions route for minutes.
Access
Free — get an API key at vike.io/account (up to 5 keys per account) and send it as X-API-KEY on every request.
Archive files are licensed CC BY 4.0 — use them for anything, credit Vike. API responses carry the same attribution ask. Keys, rate limits and errors: the API page.