Recipe 40 of 65
Download the current open positions of every Hyperliquid asset, refreshed every 5 minutes
/v1/hyperliquid/archive/url?dataset=positions&date=latest links to one Parquet file of every open position of every wallet, replaced about every 5 minutes.
GET /v1/hyperliquid/archive/url answers it in one call with dataset=positions&date=latest: a link (no key needed,
valid 300 seconds) to the latest positions file, which holds every open position of every wallet on every asset, one
row per wallet, asset and direction, about 30 MB of Parquet rebuilt about every 5 minutes. Add redirect=1 and curl
downloads it. latest.positions in GET /v1/hyperliquid/archive/datasets says which snapshot the current file holds.
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 current open positions of every asset in one step
curl -L -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=positions&date=latest&redirect=1" \
-o positions-latest.parquetThen query it, for example open interest per asset in DuckDB.
SELECT asset, sum(size_usd) AS open_interest_usd, count(*) AS positions
FROM 'positions-latest.parquet'
WHERE snapshot_ts = (SELECT max(snapshot_ts) FROM 'positions-latest.parquet')
GROUP BY asset
ORDER BY open_interest_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. bytes and rows describe the version
that existed when you asked. At that moment the index said the file held the 17:07 UTC snapshot, written at 17:12:20,
with 423,011 positions on 342 assets. The columns are those of the daily positions files, account_value and
pnl_cohort included.
{
"url": "https://data.vike.io/dl/<exp>.<kid>.<sig>/venue=hyperliquid/latest/positions.parquet",
"expires_at": "2026-10-24T17:21:51Z",
"expires_in": 300,
"dataset": "positions",
"date": "latest",
"bytes": 32142106,
"rows": 423011
}Variations
Has the file changed? Read the index first and download only when snapshot_ts moved, which saves your link allowance.
# the snapshot, write time, rows, bytes and asset count of the current file
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/datasets" \
| jq '.latest.positions | {snapshot_ts, generated_at, rows, bytes, assets}'The same rows through the API. For one coin, the API pages the same current positions without a file.
# every open BTC position, 5,000 per page, in wallet order
curl -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/positions?symbol=BTC&limit=5000"Before you rely on it
Keep the newest cycle, and read snapshot_ts right
A position closed in the last 15 minutes can still be in the file with an older snapshot_ts; keep the rows at the
file's newest snapshot_ts. That time is the start of the cycle that wrote the row, and the position state it
describes is typically 5 to 10 minutes older. There is no opened_at column. direction is 1 for long and -1 for
short.
The file is replaced under you
Download the whole file: it is replaced about every 5 minutes, and a ranged read can straddle a replacement and fail, so retry it. Every link counts its file size against 20 GB per user per rolling 24 hours: about 32 MB here, about 9 GB a day if you fetch every 5 minutes.
Ask your agent
No MCP tool reads the Parquet archive: download the file with the Quick answer call and query it locally.