Recipe 45 of 65
Try Hyperliquid fills and positions Parquet with no API key
The free samples at https://data.vike.io/archive/hl-samples/ need no key; manifest.json names the sample day and files, and each file has the exact columns and sort order of the paid daily files.
The free sample folder answers it with no key and no /v1 call: https://data.vike.io/archive/hl-samples/ holds one
BTC hour of fills and one BTC snapshot of open positions. A plain GET of its manifest.json names the sample day, the
files and the full schema of both datasets. The samples are cut with the same query as the daily files, so code that
works on them works on a full day. The keyed archive is described in
Download the Hyperliquid file archive.
Quick answer
Read the manifest first; it needs no key.
# what the free samples are: the sample day, the files and the schema; no API key
curl "https://data.vike.io/archive/hl-samples/manifest.json"Example response
Captured from the live API on 2026-10-24 at 17:16 UTC, trimmed: the two schema lists are cut to their first column and the long note
fields are left out.
sample.date is the day the files are cut from. published is the range of daily files as of generated_at, not of
today. On this capture the fills sample was 785,096 bytes: 16,830 fills, which are 8,415 BTC trades, each seen once from
each side.
{
"venue": "hyperliquid",
"generated_at": "2026-10-22T12:56:48Z",
"license": {
"name": "CC BY 4.0",
"url": "https://creativecommons.org/licenses/by/4.0/",
"attribution": "Hyperliquid archive (c) Vike (vike.io/data), CC BY 4.0"
},
"sample": {
"date": "2026-10-21",
"asset": "BTC",
"files": [
"fills-sample.parquet",
"positions-sample.parquet"
]
},
"datasets": {
"fills": {
"description": "Every fill of every wallet on the day, one row per (wallet, fill).",
"sorted_by": "asset, fill_ts, trade_id, wallet",
"published": {
"from": "2026-05-01",
"to": "2026-10-21",
"days": 174
},
"sample_file": "fills-sample.parquet",
"sample_covers": "one hour: every BTC row with `fill_ts` in 00:00-01:00 UTC",
"schema": [
{
"name": "fill_ts",
"type": "DateTime64(3, 'UTC')",
"description": "Execution time of the fill, UTC, millisecond precision."
}
]
},
"positions": {
"sorted_by": "asset, wallet, snapshot_ts",
"published": {
"from": "2026-05-08",
"to": "2026-10-21",
"days": 167
},
"sample_file": "positions-sample.parquet",
"sample_covers": "one instant: every BTC row of the day's first snapshot (the first `snapshot_ts` in 00:00-01:00 UTC), all wallets"
}
}
}Variations
Download the fills sample. Every BTC fill of the sample day's first UTC hour, with all 16 columns of a daily fills file.
# one BTC hour of fills; no API key
curl -o fills-sample.parquet "https://data.vike.io/archive/hl-samples/fills-sample.parquet"Read it with any Parquet reader; this is Polars.
import polars as pl
fills = pl.read_parquet("fills-sample.parquet")
print(fills.height, fills.columns) # 16830 rows on the 2026-10-21 sample
print(fills.filter(~pl.col("is_maker")).select(pl.col("size_usd").sum())) # taker side: each trade onceDownload the positions sample. Every open BTC position of every wallet at the sample day's first snapshot, with all 19 columns.
# one BTC snapshot of open positions; no API key
curl -o positions-sample.parquet "https://data.vike.io/archive/hl-samples/positions-sample.parquet"Where the samples are announced. The keyed archive index carries the same folder as samples_base, beside the list of every daily file.
# the archive index: daily files with rows and bytes, the schema, and samples_base
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/datasets" \
| jq '{samples_base, newest: .dates[0]}'Before you rely on it
The sample day moves about once a week
The samples are rebuilt about once a week from the newest day that has both datasets, so the file you download next
week covers a different day. Read sample.date from manifest.json rather than assuming one. The folder cannot be
listed and holds only these three files; a full day needs a key and a link from /v1/hyperliquid/archive/url.
One BTC hour is not a day
The fills sample is BTC only and one hour only. Sum it and you get an hour of BTC, not the venue's day. Both sides of
every trade are in the file, so a plain sum of size_usd is twice the traded notional; filter to is_maker = false
(the taker row) to count each trade once.
Ask your agent
No MCP tool reads the archive or its samples: the samples need only a plain download.
Related
- Download every Hyperliquid fill for a day as Parquet and load it in DuckDB
- Download the current open positions of every Hyperliquid asset, refreshed every 5 minutes
- Load a month of Hyperliquid fills into Polars or Postgres within the daily quota
- Who traded against whom? Pair both counterparties of every Hyperliquid trade