Recipe 39 of 65
Download every Hyperliquid fill for a day as Parquet and load it in DuckDB
Ask /v1/hyperliquid/archive/url?dataset=fills&date=YYYY-MM-DD for a 5-minute link to the day's Parquet file, download it whole, and query it in DuckDB.
GET /v1/hyperliquid/archive/url answers it in one call: every UTC day of Hyperliquid fills, every wallet and every
coin, is one Parquet file from 2026-05-01, and with dataset=fills&date=YYYY-MM-DD the route answers with a link to one
file that needs no key and works for 300 seconds; with redirect=1, curl downloads the file in the same step.
GET /v1/hyperliquid/archive/datasets lists the days with each file's rows and bytes and the column schema. The full
parameter lists are on Archive download link and
Archive file index.
Quick answer
Ask for the link with redirect=1 and let curl follow it.
# ask for the link and download the 2026-10-23 fills file in one step
curl -L -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-10-23&redirect=1" \
-o fills-2026-10-23.parquetThen load it in DuckDB. Nearly every trade appears twice, once per side, sharing a trade_id, and crossed marks the
taker side.
-- taker volume per coin for the day: one side of each trade only
SELECT asset, sum(size_usd) AS taker_usd, count(*) AS trades
FROM 'fills-2026-10-23.parquet'
WHERE crossed
GROUP BY asset
ORDER BY taker_usd DESC
LIMIT 10;Example response
Captured from the live API on 2026-10-24 at 17:16 UTC without redirect, all fields; the signed token in url is replaced with
<exp>.<kid>.<sig>, because a live link is a credential for five minutes. The file is 357.5 MB with 11,936,174
fills.
{
"url": "https://data.vike.io/dl/<exp>.<kid>.<sig>/venue=hyperliquid/date=2026-10-23/fills.parquet",
"expires_at": "2026-10-24T17:21:48Z",
"expires_in": 300,
"dataset": "fills",
"date": "2026-10-23",
"bytes": 357514873,
"rows": 11936174
}Variations
Which days exist. The index lists every published day, newest first.
# every published day with each file's rows and bytes, newest first
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/datasets" \
| jq '.dates[:7] | map({date, fills: .streams.fills})'The columns. The index also carries the schema of each file type.
# name, type and meaning of every column of the fills files
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/datasets" \
| jq '.schema.fills'Just the link. Hand the link to a downloader of your own; it must start within 300 seconds.
# the temporary link alone
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-10-23" \
| jq -r '.url'Before you rely on it
Download the whole file, then query it
The link is accepted for 300 seconds from the start of each request. DuckDB or pyarrow reading over HTTP opens new
requests as it goes, and each one after expires_at fails with a 403, so download the file first and query the local
copy. A running download is not cut at expiry, and curl -C - with a fresh link resumes a broken one.
A day appears the morning after, and links count against a quota
A day is published once it is complete, in the early UTC morning after it ends; a date not yet published is a 400 that names the published range. Links are limited to 20 GB per user per rolling 24 hours, counted by the size of each file asked for, used or not: a fills day is about 0.4 GB.
Ask your agent
No MCP tool reads the Parquet archive: download the file with the Quick answer call and query it locally.
Related
- Try Hyperliquid fills and positions Parquet with no API key
- 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
- Download the current open positions of every Hyperliquid asset, refreshed every 5 minutes