vike

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.

cURL — budget
# 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)}'
cURL — one day
# 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"
Polars
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 sellers

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

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

Polars — by USD
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.

Polars — takers
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.

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

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