Free Hyperliquid cohort data — who is long, who is short, every hour
Each wallet with an open Hyperliquid position sits on a rung of a size ladder and a PnL ladder, and each open position on a notional tier. /v1/hl-cohorts/symbols/{symbol}/cohort-metrics returns every cohort of one coin, hourly, up to 8,760 hours in one request — free, 20,000 requests an hour and 200 a minute per key.
Hyperliquid long vs short, by cohort
One coin, one axis: every cohort on that axis at the latest hour of the capture. Switch the coin (BTC, ETH, SOL, HYPE), the axis (size, tier, pnl) and — on pnl only — labelBasis; size and tier are always point_in_time.
Cohort board · /symbols/{symbol}/cohort-metrics
/v1/hl-cohorts/symbols/BTC/cohort-metrics?axis=size&hours=1https://data.vike.io/v1/hl-cohorts/symbols/BTC/cohort-metrics?axis=size&hours=1The board reads hours=1. The same request with hours=8760 returns a year of hourly matrices — every cohort in every returned hour, paged by hour and never by row, so an hour's cohorts always sum to its total.
Hyperliquid whale heatmap: every coin × cohort
GET /v1/hl-cohorts/heatmap — every coin × every bucket of one wallet ladder at the latest snapshot, in one call. Each cell is bias = (long − short) / (long + short) by value; an empty cell is blank, never 0.
Coin × cohort heatmap · /heatmap
/v1/hl-cohorts/heatmap?axis=sizeCaptured for axis=size and axis=pnl. The route also takes pnl_abs, and rejects tier — a wallet holds positions in several tiers at once.
Cohort ladders: account size, PnL, position tier
Three ladders grade a wallet, one grades a position. The labels are the exact strings the API returns; the slug is the URL-safe alias every cohort filter also accepts.
| axis | What it grades | Rungs | Label basis on cohort-metrics | Where it is accepted |
|---|---|---|---|---|
size | The wallet's account value (USD) | 12 | always point_in_time — a stored column | cohort-metrics, metrics, heatmap, segment summary, positions, leaderboard, liquidation risk |
pnl | Percentile of the wallet's cumulative realized PnL; under 10 closed trades = unknown | 12 + unknown | current (default) or point_in_time | the same as size |
pnl_abs | The same cumulative realized PnL, banded in dollars | 8 + unknown | always current — look-ahead on history | the same as size |
tier | One position's notional (USD) | 10 | always point_in_time — derived from the row's own size | cohort-metrics (axis=tier) and size-breakdown. /segments lists it as axis=trade_size, groupable: false |
axis=size12 buckets
Account value of the wallet. Bounds are [min, max) in USD.
| 1 | 4x whale 4x_whale |
≥ $10,000,000 |
| 2 | 3x whale 3x_whale |
$5,000,000 – $10,000,000 |
| 3 | 2x whale 2x_whale |
$2,500,000 – $5,000,000 |
| 4 | whale |
$1,000,000 – $2,500,000 |
| 5 | 2x shark 2x_shark |
$500,000 – $1,000,000 |
| 6 | shark |
$250,000 – $500,000 |
| 7 | 2x dolphin 2x_dolphin |
$100,000 – $250,000 |
| 8 | dolphin |
$50,000 – $100,000 |
| 9 | 2x fish 2x_fish |
$25,000 – $50,000 |
| 10 | fish |
$10,000 – $25,000 |
| 11 | 2x shrimp 2x_shrimp |
$1,000 – $10,000 |
| 12 | shrimp |
$0 – $1,000 |
Every wallet has an account value, so this ladder has no unknown bucket.
axis=pnl13 buckets
Percentile rank of cumulative realized PnL among graded wallets; 0% is the best.
| 1 | 3x smart 3x_smart |
0–1% |
| 2 | 2x smart 2x_smart |
1–5% |
| 3 | smart |
5–10% |
| 4 | 3x winner 3x_winner |
10–20% |
| 5 | 2x winner 2x_winner |
20–30% |
| 6 | winner |
30–40% |
| 7 | loser |
40–60% |
| 8 | 2x loser 2x_loser |
60–70% |
| 9 | 3x loser 3x_loser |
70–80% |
| 10 | rekt |
80–90% |
| 11 | 2x rekt 2x_rekt |
90–95% |
| 12 | 3x rekt 3x_rekt |
95–100% |
unknown |
under 10 closed trades |
Stable in population: the top rung is always the top 1% of graded wallets.
axis=pnl_abs9 buckets
The same cumulative realized PnL in dollar bands. Bounds are [min, max).
| 1 | $1m+ 1m_plus |
≥ $1,000,000 |
| 2 | $100k-$1m 100k_to_1m |
$100,000 – $1,000,000 |
| 3 | $10k-$100k 10k_to_100k |
$10,000 – $100,000 |
| 4 | $0-$10k 0_to_10k |
$0 – $10,000 |
| 5 | -$10k-$0 neg10k_to_0 |
-$10,000 – $0 |
| 6 | -$100k--$10k neg100k_to_neg10k |
-$100,000 – -$10,000 |
| 7 | -$1m--$100k neg1m_to_neg100k |
-$1,000,000 – -$100,000 |
| 8 | <-$1m below_neg1m |
< -$1,000,000 |
unknown |
not in the PnL dictionary |
Stable in meaning: $1m is $1m in any month. unknown here is only a wallet the PnL dictionary has never seen.
axis=tier10 buckets
One position's notional. A small account can hold a large position at leverage.
| 1 | >$2.5m above_2_5m |
≥ $2,500,000 |
| 2 | $1m-$2.5m 1m_to_2_5m |
$1,000,000 – $2,500,000 |
| 3 | $500k-$1m 500k_to_1m |
$500,000 – $1,000,000 |
| 4 | $250k-$500k 250k_to_500k |
$250,000 – $500,000 |
| 5 | $100k-$250k 100k_to_250k |
$100,000 – $250,000 |
| 6 | $50k-$100k 50k_to_100k |
$50,000 – $100,000 |
| 7 | $25k-$50k 25k_to_50k |
$25,000 – $50,000 |
| 8 | $10k-$25k 10k_to_25k |
$10,000 – $25,000 |
| 9 | $1k-$10k 1k_to_10k |
$1,000 – $10,000 |
| 10 | <$1k below_1k |
$0 – $1,000 |
Ask for it as axis=tier on cohort-metrics, or read /symbols/{symbol}/size-breakdown.
Rendered from the same function GET /v1/hl-cohorts/segments serves — each row there also carries basis, applies_to and groupable.
Point-in-time cohort labels for backtests
A wallet's PnL rung moves as it trades. A backtest needs the rung it had at that hour, not the one it has today.
labelBasis=point_in_timeonaxis=pnlof/symbols/{symbol}/cohort-metricsgrades every hour with the label as it was that hour. Point-in-time labels exist from 2026-04-07.labelBasis=current, the default onaxis=pnl, resolves the label when the request runs: right for "who is smart now", look-ahead for a backtest — and the response says so inlabel_computed.lookahead.sizeandtierare always point-in-time (a stored account value; a position's own size).pnl_absis always current here. Each rejects a conflictinglabelBasiswith a 400 rather than ignoring it.- Every row and the envelope carry
label_basis. Underpoint_in_time, five fields the frozen source does not carry are left out and named inunavailable_fields:position_count,position_count_long,total_unrealized_pnl,total_position_size,total_position_size_long. /symbols/{symbol}/metricsresolves pnl labels at query time only and refuseslabelBasis=point_in_timeby name — usecohort-metricsfor history.- A window reaching the present carries
freshness(newest_ts,behind_hours,stale), so a live consumer can tell a healthy hour from a stale one without knowing the rollup's cadence.
The 10 HL Cohorts API endpoints
Each builder composes a real request. Send shows the response captured today when the URL matches one; otherwise it gives you the curl to run with your free key.
/v1/hl-cohorts/cohorts
The three ladders' label sets (size, pnl, tier) in axis order — the exact strings a cohort filter accepts.
/v1/hl-cohorts/segments
The cohort catalogue: every bucket on every axis with its bounds, slug, rank and groupable flag.
/v1/hl-cohorts/segments/{cohort}/summary
Aggregate positioning for one cohort at the latest snapshot; openedWithin = 24h | 7d | 30d | all.
/v1/hl-cohorts/heatmap
Coin × cohort positioning at the latest snapshot — the whole board in one call.
/v1/hl-cohorts/symbols/{symbol}/cohort-metrics
One coin's full cohort matrix, hourly — up to 8,760 hours per request, paged by hour.
/v1/hl-cohorts/symbols/{symbol}/metrics
Hourly open interest, position count and bias for one coin, all cohorts combined or one.
/v1/hl-cohorts/symbols/{symbol}/size-breakdown
One coin's open positioning split into the ten position-notional tiers.
/v1/hl-cohorts/segments/{cohort}/history
One cohort's long / short / bias per hour, summed over every coin, on the size or pnl ladder; include=leverage adds the equity ratios.
/v1/hl-cohorts/symbols/{symbol}/indices
Smart Money Index and Whale-vs-Shrimp Index for one coin: the latest snapshot and the settled hourly series, as ratios in [-1, +1].
/v1/hl-cohorts/symbols/{symbol}/large-fills
One coin's large fills (from $50,000), newest first: the newest 200, at most 24 hours back.
Cohort metrics by coin · /v1/hl-cohorts/symbols/{symbol}/cohort-metrics
axis = size | tier | pnl | pnl_abs · hours ≤ 8,760 · labelBasis on pnl only · optional start / end, openedWithin, cursor.
/v1/hl-cohorts/symbols/{symbol}/cohort-metrics?axis={axis}&hours={hours}&labelBasis={labelBasis}Coin × cohort heatmap · /v1/hl-cohorts/heatmap
axis = size | pnl | pnl_abs · openedWithin = 24h | 7d | 30d | all (the default) — counts only positions opened inside the window.
/v1/hl-cohorts/heatmap?axis={axis}&openedWithin={openedWithin}Cohort bounds · /v1/hl-cohorts/segments
No parameters. Rows carry axis, cohort, slug, rank, basis, applies_to, groupable and the bounds (min_usd / max_usd, percentile_min / percentile_max, min_closed_trades).
/v1/hl-cohorts/segmentsCohort labels · /v1/hl-cohorts/cohorts
No parameters. {"size": [12 labels], "pnl": [12 labels, "unknown"], "tier": [10 labels]} — verbatim from the module the axes group by.
/v1/hl-cohorts/cohortsOne cohort's summary · /v1/hl-cohorts/segments/{cohort}/summary
cohort = a label or its slug, valid on the chosen axis (size | pnl | pnl_abs). tier is rejected here: a wallet straddles position tiers.
/v1/hl-cohorts/segments/{cohort}/summary?axis={axis}&openedWithin={openedWithin}Hourly coin metrics · /v1/hl-cohorts/symbols/{symbol}/metrics
One row per hour — omit axis for all cohorts combined, or pass axis + cohort for one. The newest row, covering the hour still in progress, is flagged provisional.
/v1/hl-cohorts/symbols/{symbol}/metrics?axis={axis}&cohort={cohort}&limit={limit}Position-size breakdown · /v1/hl-cohorts/symbols/{symbol}/size-breakdown
The ten position-notional tiers, largest first; an empty tier comes back zero-filled so the table shape never changes.
/v1/hl-cohorts/symbols/{symbol}/size-breakdownChoosing a Hyperliquid whale tracker: what to check
The questions that decide whether a cohort series is usable for research. The right column is what this API does; ask the same of any Hyperliquid tracker you compare it with.
| Question to ask | vike · /v1/hl-cohorts |
|---|---|
| How often are positions sampled? | Every 5 minutes, snapshots kept for one year; the cohort series are hourly rollups of them. |
| Is the PnL ladder a percentile or dollar bands? | Both, named apart. pnl is the percentile of cumulative realized PnL (stable in population); pnl_abs is dollar bands (stable in meaning). /segments publishes every bound. |
| Is a past hour graded with the label it had then? | Yes, on request: labelBasis=point_in_time, from 2026-04-07. Every row declares label_basis; a look-ahead answer says lookahead: true. |
| How many requests for one coin's full cohort history? | One. /symbols/{symbol}/cohort-metrics returns every cohort × every hour, up to 8,760 hours per request. |
| What happens to wallets that cannot be ranked? | They are a real unknown bucket, served and queryable — not dropped, so the axes agree on a coin's total. |
| What does it cost? | Nothing. A free key, 20,000 requests an hour and 200 a minute, up to 3 keys per account. |