vike

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.

cURL
# 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.parquet

Then load it in DuckDB. Nearly every trade appears twice, once per side, sharing a trade_id, and crossed marks the taker side.

DuckDB
-- 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.

Example response
{
  "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.

cURL — the index
# 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.

cURL — schema
# 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.

cURL — link only
# 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.

Example response
{  "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}