vike

Recipe 33 of 65

Positions of 50 Hyperliquid watchlist wallets in one call

/v1/hyperliquid/positions takes one wallet per call; for 50 at once, download the 5-minute file of every open position through /v1/hyperliquid/archive/url and filter it to your wallets.

GET /v1/hyperliquid/archive/url answers it in one call with dataset=positions&date=latest: a link to the file of every open position of every wallet, about 30 MB of Parquet, replaced about every 5 minutes. Download it and keep the rows of your 50 wallets. GET /v1/hyperliquid/positions with wallet answers one wallet per call, so 50 wallets there are 50 calls. The full parameter lists are on Archive download link and Positions.

Quick answer

Ask for the link with redirect=1 and let curl follow it.

cURL
# ask for the link and download the current open positions of every wallet 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.parquet

Then keep your wallets' rows, for example in DuckDB.

DuckDB
SELECT wallet, asset, direction, size_usd, entry_price, leverage, account_value
FROM 'positions-latest.parquet'
WHERE wallet IN ('0x25773676902085225ae5751075e4161369334897', '0x5b5d51203a0f9079f8aeb098a6523a13f298c060')
  AND snapshot_ts = (SELECT max(snapshot_ts) FROM 'positions-latest.parquet')
ORDER BY wallet, size_usd DESC;

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 link needs no key and works for 300 seconds. The file held 423,011 rows: one per open position of every wallet on every coin, with the same 19 columns as the daily positions files, account_value included.

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

One wallet through the API. The per-wallet call, when the list is short. 50 calls fit inside the 200 requests per minute cap.

cURL — one wallet
# everything one wallet holds right now
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/positions?wallet=0x25773676902085225ae5751075e4161369334897&limit=200"

Check the file before you download. The index says when the file was written, its size and how many assets it covers.

cURL — freshness
# snapshot time, write time, rows and bytes of the latest positions 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}'

Before you rely on it

Keep the newest cycle only

A position closed in the last 15 minutes can still be in the file with an older snapshot_ts, so keep the rows whose snapshot_ts is the file's newest. Addresses are lowercase in the file. direction is 1 for long and -1 for short. account_value is the wallet's main-venue equity as of the start of the clock hour, and null when unknown; there is no opened_at (the API adds it per page).

Each link counts against a daily allowance

Links are limited to 20 GB per user per rolling 24 hours, counted by the size of each file you ask for. The latest file is about 32 MB, so asking every 5 minutes all day is about 9 GB. Download the whole file: it is replaced about every 5 minutes, and a ranged read can straddle a replacement and fail.

Ask your agent

Connected to the Vike MCP server (https://vike.io/mcp) in Claude, ChatGPT or Cursor, ask it in plain words. The hl_market tool answers with view: positions and the wallet, one wallet per call, at 1 credit a call.

Ask your agent
What positions does 0x25773676902085225ae5751075e4161369334897 hold on Hyperliquid right now?
Example response
{  "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}