Recipe 63 of 65
How many traders were active on Hyperliquid each day, and what share were makers?
Count distinct wallets per UTC day in the archive's daily fills files, and per wallet the share of its notional filled as maker; the API itself does not serve a daily active-traders count.
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, with is_maker on each row. Distinct wallet values
in a day's file are that day's active traders. Group by wallet first to say what kind of trader each was: a wallet whose
notional is mostly maker fills provides liquidity, the rest take it. The full parameter list is on
Archive download link.
Quick answer
Download each day, then count wallets per day in Polars.
# download one UTC day of every fill; repeat per day
curl -s -L -H "X-API-Key: $VIKE_API_KEY" -o fills-2026-10-23.parquet \
"https://data.vike.io/v1/hyperliquid/archive/url?dataset=fills&date=2026-10-23&redirect=1"import polars as pl
per_wallet = (
pl.scan_parquet("fills-2026-10-*.parquet") # every day you downloaded, read as one table
.group_by(pl.col("fill_ts").dt.date().alias("day"), "wallet")
.agg(usd=pl.col("size_usd").sum(), maker_usd=pl.col("size_usd").filter(pl.col("is_maker")).sum())
)
daily = (
per_wallet.group_by("day")
.agg(
active_wallets=pl.len(),
with_a_maker_fill=(pl.col("maker_usd") > 0).sum(),
mostly_maker=(pl.col("maker_usd") > 0.5 * pl.col("usd")).sum(),
)
.sort("day")
.collect()
)
print(daily)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, shown as JSON. The sample is one BTC hour (2026-10-21 00:00 to 01:00 UTC), so this row is that hour of BTC, not the whole day of the venue.
1,800 wallets traded BTC in that hour. 518 had at least one fill resting on the book, and 485 did most of their notional that way; the other 1,315 only took liquidity. Each count is of wallets, not fills.
[
{"day": "2026-10-21", "active_wallets": 1800, "with_a_maker_fill": 518, "mostly_maker": 485}
]Variations
New wallets per day. A wallet's first day in the files you hold. The archive starts on 2026-05-01, so "new" means new since then.
first = (
pl.scan_parquet("fills-2026-*.parquet")
.group_by("wallet").agg(first_day=pl.col("fill_ts").min().dt.date())
.group_by("first_day").agg(new_wallets=pl.len())
.sort("first_day")
.collect()
)Per coin. Add asset to the first grouping to count active wallets per coin and day.
per_coin = (
pl.scan_parquet("fills-2026-10-*.parquet")
.group_by(pl.col("fill_ts").dt.date().alias("day"), "asset")
.agg(active_wallets=pl.col("wallet").n_unique())
.sort("day", "active_wallets", descending=[False, True])
.collect()
)What the API counts instead. /stats has count_wallets per hour: wallets with an account snapshot that hour, traded or not. It is not this number.
# venue-wide hourly equity, open interest and account counts
curl -H "X-API-Key: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/stats?limit=24"Before you rely on it
The maker share of fills is always one half
Every trade has a maker row and a taker row, so is_maker is true on 50% of the rows in any file (exactly 0.5 on the
sample) and says nothing about the market. Ask per wallet, as the Quick answer code does. The thresholds (any maker fill, or more than half
of the notional) are a choice; state the one you use.
One file per day, from 2026-05-01; no API count
The API does not serve a daily active-traders figure; this needs one download per day, 0.1 to 0.5 GB each (0.36 GB for 2026-10-23), and
links count against 20 GB per user per rolling 24 hours. A day's file is published in the early UTC morning after it
ends. Spot pairs (@ names) and builder dexes are in the same file; filter asset to count one market.
Ask your agent
No MCP tool reads the archive: use the files.