Recipe 60 of 65
Who bought and sold the most of a coin on Hyperliquid over a month?
Download a month of daily fills files from the archive, filter one asset, and sum size_token per wallet by side; net = bought - sold ranks the top buyers and sellers.
GET /v1/hyperliquid/archive/url answers it with one download per day, because every fill of every wallet is in the
archive's daily fills file, one row per wallet and fill, with side (buy or
sell) and size_token. For a month, download its 30 files, filter the coin, group by wallet and sum each side.
September 2026 was 9.1 GB of fills files, inside the 20 GB of links a user may ask for in 24 hours;
GET /v1/hyperliquid/archive/datasets gives the sizes first. The full parameter lists are on
Archive download link and Archive file index.
Quick answer
Check the month's size, download each day, then sum per wallet in Polars.
# size of the month's fills files, before you ask for any link
curl -s -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/archive/datasets" \
| jq '[.dates[] | select(.date | startswith("2026-09")) | .streams.fills.bytes] | {days: length, gb: (add / 1e9)}'# one day of every fill; repeat per date of the month
curl -s -L -H "X-API-Key: $VIKE_API_KEY" -o fills-2026-09-01.parquet \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-09-01&redirect=1"import polars as pl
by_wallet = (
pl.scan_parquet("fills-2026-09-*.parquet") # the month's 30 files, read as one table
.filter(pl.col("asset") == "BTC")
.group_by("wallet")
.agg(
bought=pl.col("size_token").filter(pl.col("side") == "buy").sum(),
sold=pl.col("size_token").filter(pl.col("side") == "sell").sum(),
bought_usd=pl.col("size_usd").filter(pl.col("side") == "buy").sum(),
sold_usd=pl.col("size_usd").filter(pl.col("side") == "sell").sum(),
)
.with_columns(net=pl.col("bought") - pl.col("sold"))
.collect()
)
print(by_wallet.sort("net", descending=True).head(10)) # top net buyers
print(by_wallet.sort("net").head(10)) # top net sellersExample response
Computed with the Polars code on the free fills sample, captured from the live API on 2026-10-24 at 17:16 UTC (every BTC fill of 2026-10-21 00:00 to 01:00 UTC), shown as JSON: the top 3 net buyers and the top 3 net sellers of 1,800 wallets. The budget call for September returned 30 days and 9.09 GB on the 2026-10-24 index.
bought and sold are BTC, the _usd fields USD. In that hour one wallet bought exactly 100 BTC ($8.3M) and sold
none. Across all 1,800 wallets, buys and sells summed to the same 662.38531 BTC, as they must: every buy has a seller.
{
"top_buyers": [
{"wallet": "0x5986347c1d0133d02d307f08bb1efd44c2eb89d9", "bought": 100.0, "sold": 0.0, "bought_usd": 8317577.46232, "sold_usd": 0.0, "net": 100.0},
{"wallet": "0xf517639a8872e756ac98d3c65507d2ebc25cc032", "bought": 33.10495, "sold": 8.41903, "bought_usd": 2749334.36248, "sold_usd": 700000.08735, "net": 24.68592},
{"wallet": "0x2cff40d1fccf6779a1a6f40ba7aa57e3d967d2a0", "bought": 24.64538, "sold": 0.0, "bought_usd": 2050048.05209, "sold_usd": 0.0, "net": 24.64538}
],
"top_sellers": [
{"wallet": "0xf5d81a135f756ca16544e53c20fc20643ec3ad53", "bought": 44.58989, "sold": 95.15986, "bought_usd": 3704816.93437, "sold_usd": 7907980.76127, "net": -50.56997},
{"wallet": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00", "bought": 5.96419, "sold": 49.75734, "bought_usd": 494521.50335, "sold_usd": 4136563.59667, "net": -43.79315},
{"wallet": "0xcf3f419d08a5bdc2c6e5fbd9ad70904c5420f95f", "bought": 0.0, "sold": 31.85382, "bought_usd": 0.0, "sold_usd": 2648254.40722, "net": -31.85382}
]
}Variations
Rank by notional instead of coins. Sort on bought_usd - sold_usd to compare across coins, or on bought_usd + sold_usd for the most active wallets.
print(by_wallet.with_columns(net_usd=pl.col("bought_usd") - pl.col("sold_usd")).sort("net_usd", descending=True).head(10))Takers only. Who crossed the spread to buy, as opposed to whose resting orders were hit: keep the taker rows.
takers = pl.scan_parquet("fills-2026-09-*.parquet").filter((pl.col("asset") == "BTC") & ~pl.col("is_maker"))Who the top buyer is. A top wallet's account, positions and cohort labels.
# the sample hour's top buyer
curl -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/wallets/0x5986347c1d0133d02d307f08bb1efd44c2eb89d9"Before you rely on it
A month is 30 downloads and about 9 GB
There is one file per UTC day, and each needs its own link, valid for 300 seconds: ask for it right before its download.
The 20 GB allowance counts the size of every link issued in a rolling 24 hours, used or not, so a month of fills fits
once a day; positions files are far larger. Read the budget from /archive/datasets first.
Net flow is not profit, and HIP-3 names differ
net says which wallet accumulated or shed the coin, not who made money; realized PnL per fill is in closed_pnl.
Filter on the exact asset spelling: BTC on the core venue, xyz:GOLD style names for builder dexes, @107 style
indexes for spot pairs. The archive starts on 2026-05-01.
Ask your agent
No MCP tool reads the archive: use the files.
Related
- 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
- Classify each Hyperliquid fill as open, add, reduce, close or flip
- Show whale fills above $100k on a Hyperliquid coin in the last hour, with each buyer's cohort