Get a free key
Hyperliquid · Whale tracker

Hyperliquid whale tracker: whale positions, wallets and PnL

Track any Hyperliquid wallet: its open positions every 5 minutes, its PnL, closed trades, fills and ledger; see who holds each coin's largest positions as they change; find the wallet behind a PnL card; and get a whale alert by e-mail or webhook.

Ask your AI · Claude, ChatGPT, CursorConnect in a minute →

“What is this wallet holding on Hyperliquid right now, and what is its PnL? (paste an address)”

hl_wallet

“Whose position is this: a BTC short at 5x, entered at 76,327.4?”

hl_position_match
Ranked by size, not by skill. This page follows the biggest positions and accounts, and what they do now. Who trades best, by PnL, ROI, win rate and drawdown, is the Hyperliquid leaderboard →
Largest positions

Whale positions: the largest open positions, every 5 minutes

Every open position on Hyperliquid, captured every 5 minutes: the biggest of any coin now, or what was open at any snapshot back to the history floor.

Hyperliquid · API dataset · 5-min

Position snapshots

Open Hyperliquid positions captured every 5 minutes — the latest snapshot, or history by window.

Route
/v1/hyperliquid/positions
Cadence
Snapshot every 5 minutes; archive one file per UTC day
Coverage
API: latest open positions (freshness-gated to the newest 15 minutes of snapshots) or historical 5-minute snapshots: pass start (and optionally end), and bound the read by symbol or wallet. Every row says which pnl-cohort label it carries (pnl_cohort_basis). Keyset pagination: nextCursor back as cursor, limit up to 5,000. Archive: positions.parquet per UTC day from 2026-05-08 (CC BY 4.0), every open position at every snapshot of the day, plus one file of the current open positions replaced every 5 minutes (date=latest). Each file comes as a temporary link from /archive/url; /archive/datasets lists the days and the file's own columns.
Rows
Free APIArchiveStreamMCP

Real rows: The 10 largest BTC positions now

The 10 largest BTC positions now · /positions

GET/v1/hyperliquid/positions?symbol=BTC&sort=size&limit=10
Open this side to see the captured response.

    

Pass start (and optionally end) for history from 2026-05-01, bounded by symbol or wallet: resolution=5m every snapshot, resolution=1h the last of each hour. Every row says which PnL label it carries: pnl_cohort_basis (point_in_time or current) and pnl_cohort_as_of.

Fields

FieldTypeDescription
walletstringAccount address, 0x-prefixed
symbolstringSymbol; HIP-3 DEX symbols carry their DEX prefix, e.g. xyz:SILVER
directionstringlong | short
size_tokennumberPosition size in coin units
size_usdnumberNotional at mark, USD
entry_pricenumberAverage entry price
mark_pricenumberMark price at the snapshot
liquidation_pricenumberLiquidation price as reported; 0.0 when none is reported
unrealized_pnlnumberMark-to-market PnL, USD
leveragenumberPosition leverage as reported
leverage_typestringcross | isolated
margin_usednumberMargin backing the position, USD
size_cohortstringAccount-value rung, e.g. whale (size ladder)
pnl_cohortstringRealized-PnL percentile rung, or unknown under 10 closed trades
pnl_abs_cohortstringRealized-PnL dollar band, e.g. -$10k-$0
liq_progressnumberHow far price has moved toward liquidation (0 = none); > 0.5 counts as at risk
dex_namestringHL, or the HIP-3 DEX the position is on
snapshot_tsstringSnapshot instant, ISO-8601 UTC
pnl_cohort_basisstringpoint_in_time | current — which label the row carries
pnl_cohort_as_ofstring|nullHour the point-in-time label was computed at; null for current
opened_atstring|nullWhen the position was first seen open, ISO-8601 UTC; null when unknown

Load it

symbol
sort
cohort
limit
GET/v1/hyperliquid/positions?symbol={symbol}&sort={sort}&cohort={cohort}&limit={limit}

    
Press Send ▶ — the captured response appears here

    

GET /v1/hyperliquid/positions · The largest open positions of a coin, now

CLI
vike-data hl market
MCP
hl_market · 1 credit
Cost
1 request of the hourly limit

Position rows, current or historical.

open_only=true reads the latest-state table. Passing start/end switches to the historical snapshot table, which is 8.7 billion rows — bound it by symbol or wallet, or expect it to be slow.

Rows come in key order, not by size. The cursor pages on the table's primary key, so current positions are ordered by wallet, symbol, direction and historical ones by symbol, snapshot_ts, wallet (resolution=1h with wallet: by snapshot_ts, then symbol): limit=10 is the first ten wallets in address order, never the ten biggest positions. For the biggest, pass sort=size (below), or read /v1/hl-cohorts/symbols/{symbol}/size-breakdown (positioning by position-size bucket), /positions/symbols (open interest per symbol) or /v1/hl-cohorts/symbols/{symbol}/cohort-metrics (by cohort).

sort=size returns the limit biggest current positions of one symbol, ordered by size_usd descending, then wallet, then direction, from the same latest-state read as the default. It is a top-N, not a page: symbol is required, limit is at most 500, there is no cursor (nextCursor is always null), and start/end are refused; each violation is a 400 with a one-line reason. Every row additionally carries account_value: the wallet's NATIVE perp account value in USD at the newest snapshot (the same figure as equity.account_value on /wallets/{address}, so it leaves out a builder DEX's separate account), or null when it is unknown (a repaired value, or no row in the newest snapshot). It is never 0 for unknown. No per-position cumulative funding is served, because no per-position source exists that avoids scanning the funding table.

Every row declares its pnl-label provenance: pnl_cohort_basis (point_in_time | current, the same vocabulary labelBasis uses elsewhere) and pnl_cohort_as_of (the ISO hour the label was computed at, or null). Historical rows carry the point-in-time label from the hourly label table — not today's dictionary standing — with the current unlabelled tail (the newest hour or two) falling back to the dictionary and saying so per row; the envelope's label_computed block states the mode's source once. A historical pnl/pnl_abs cohort filter is answered from the same label table and therefore requires symbol or wallet alongside it.

A historical row's own label counts fills up to the end of its hour (label_computed.lookahead is true). For a backtest read label_causal instead: an object with the same keys (pnl_cohort, pnl_abs_cohort, pnl_cohort_as_of, pnl_cohort_basis) computed at the PREVIOUS hour, so it holds no later fill. It is null where that hour has no label for the wallet and is absent on current rows. The row's own label values are unchanged.

Parameters

ParameterInDescription
symbolqueryHL ticker, e.g. BTC
walletqueryOne wallet
cohortqueryOne label on axis
axisquerysize | pnl | pnl_abs. Default size
open_onlyqueryBoolean, default true. Latest open positions only
startqueryISO-8601 UTC. Setting either switches to history. Not before 2026-05-01
endqueryISO-8601 UTC. Setting either switches to history
limitqueryDefault 100, max 5000 (500 with sort=size)
cursorqueryKeyset cursor. Refused with sort=size
sortquerysize = the biggest positions of one symbol first. Default: key order. Current mode only; needs symbol; limit at most 500; no cursor
resolutionqueryHistory only (needs start). 5m = every snapshot, ~5 minutes apart. 1h = the last snapshot of each hour, ~12x fewer rows. Default: 1h when wallet is given (served from a wallet-sorted copy), 5m otherwise. A 5m read of one wallet is limited to 48 hours per request.

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/positions?symbol=BTC&limit=10&sort=size"
PnL card

Whose position is this? The wallet behind a PnL card

A Hyperliquid PnL card shows a coin, a side, the leverage and the entry price: enough to find the open positions that match.

Hyperliquid · REST · CLI · MCP

Match a PnL card: coin, side, leverage, entry price

Route
GET /v1/hyperliquid/positions/match
CLI
vike-data perp find-position
MCP
hl_position_match · 2 credits
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Find open positions matching a symbol/side/leverage/entry profile — the 'who else is in this trade' query.

Parameters

ParameterInDescription
symbolrequiredqueryHL ticker as listed, e.g. BTC, kPEPE, xyz:TSLA; case-insensitive for those spellings
siderequiredquerylong | short
leveragerequiredqueryNumeric, 0 or more. Matched within ±0.5 absolute. 0 finds cross-margin positions with no leverage recorded
entry_pricerequiredqueryNumeric, positive
mark_pricequeryTie-break among equally close entries (matches are ranked by entry-price distance first). Defaults to entry_price when omitted
limitqueryNumber of matches, 1–500

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=short&leverage=5&entry_price=76327.4&limit=3"
Any wallet

Track any Hyperliquid wallet: positions, PnL, trades, fills, funding, ledger, orders

Paste an address: open it live on vike.io, follow it with an alert, or call it from code.

The wallet
On vike.io · free, no key

Open the wallet live

Its equity, open positions, PnL, closed trades and fills on one page.

Alert · hl_wallet

Get an e-mail when it trades

Its opens, closes, flips and adds, by e-mail or webhook.

Hyperliquid · REST · CLI · MCP

Equity, open positions, PnL and lifetime flow

Route
GET /v1/hyperliquid/wallets/{address}
CLI
vike-data hl wallet
MCP
hl_wallet · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

One wallet: equity, cohorts, risk metrics, lifetime external flow.

openedWithin bounds the open-positions block only — the equity, lifetime and metrics blocks are wallet-level totals with nothing per-position to filter, and bounding them would return a number that looks bounded and is not. Positions with no known open time are excluded from every bounded bucket, matching what /v1/hl-cohorts/segments and /v1/hl-cohorts/heatmap do, so cohort comparisons stay like-for-like.

open_positions.perp_bias = (long - short) / equity.account_value and open_positions.equity_exposure = (long + short) / equity.account_value, native perp account only: positions on the main dex over the native perp account value; builder-DEX positions are not included. Unbounded ratios, null with no main-dex position or no positive equity.

A wallet we hold nothing for (no equity snapshot, open position, trade, fill or ledger event) is a 400 naming it, not a block of zeros.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
windowquery1d | 7d | 30d | all. Default all
openedWithinquery24h | 7d | 30d | all. Default all

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1"
Hyperliquid · REST · CLI · MCP

Win rate, average win and loss, overall and per coin

Route
GET /v1/hyperliquid/wallets/{address}/trades/summary
CLI
vike-data hl wallet
MCP
hl_wallet · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Trade statistics for one wallet, overall and per coin.

Medians as well as means: one $4M outlier drags the mean trade size far from anything the wallet typically does, and the mean is where most leaderboards stop.

A wallet with no trade at all is a 400 naming it, not zeros. A wallet that has traded and was quiet in the requested window gets the zeros, which are true.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
windowquery1d | 7d | 30d | all. Default all

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/trades/summary?window=30d"
Hyperliquid · REST · CLI · MCP

Closed trades: entry, exit, size and PnL

Route
GET /v1/hyperliquid/wallets/{address}/trades
CLI
vike-data hl wallet-trades
MCP
hl_wallet_trades · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Closed round-trip trades for one wallet.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
symbolqueryHL ticker, e.g. BTC. Omit for all
startqueryISO-8601 UTC bounds
endqueryISO-8601 UTC bounds
limitqueryDefault 100, max 5000
cursorquerynextCursor from the previous page, verbatim

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/trades?limit=20"
Hyperliquid · REST · CLI · MCP

Every fill, newest first

Route
GET /v1/hyperliquid/wallets/{address}/fills
CLI
vike-data hl wallet-activity
MCP
hl_wallet_activity · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Raw fills for one wallet.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
symbolqueryHL ticker
startqueryISO-8601 UTC bounds
endqueryISO-8601 UTC bounds
sidequerybuy | sell
limitqueryDefault 100, max 5000
cursorqueryKeyset cursor

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/fills?limit=50"
Hyperliquid · REST · CLI · MCP

Funding paid and received

Route
GET /v1/hyperliquid/wallets/{address}/funding
CLI
vike-data hl wallet-activity
MCP
hl_wallet_activity · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Funding paid and received by one wallet.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
symbolqueryHL ticker
startqueryISO-8601 UTC bounds
endqueryISO-8601 UTC bounds
limitqueryDefault 100, max 5000
cursorqueryKeyset cursor

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/funding?limit=100"
Hyperliquid · REST · CLI · MCP

Deposits, withdrawals and transfers

Route
GET /v1/hyperliquid/wallets/{address}/ledger
CLI
vike-data hl wallet-activity
MCP
hl_wallet_activity · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Deposits, withdrawals, transfers and vault events for one wallet.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
event_typequeryOne of accountClassTransfer, borrowLend, deposit, internalTransfer, rewardsClaim, send, spotTransfer, subAccountTransfer, vaultCreate, vaultDeposit, vaultDistribution, vaultLeaderCommission, vaultWithdraw, withdraw. Validated against this fixed set
startqueryISO-8601 UTC bounds
endqueryISO-8601 UTC bounds
limitqueryDefault 100, max 5000
cursorqueryKeyset cursor

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/ledger?event_type=deposit&limit=20"
Hyperliquid · REST · CLI · MCP

What became of its orders: open, filled, canceled

Route
GET /v1/hyperliquid/wallets/{address}/orders
CLI
vike-data hl orders
MCP
hl_orders · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

What became of one wallet's orders in a window: each order seen resting in it or filled in it, with its fills in the window and a status. Newest placement first; notes says what a snapshot cannot tell.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
fromqueryISO-8601 UTC. Default: 7 days before to
toqueryISO-8601 UTC. Default: the newest order snapshot. At most 30 days after from
symbolqueryHL perp ticker
statusqueryopen | filled | partially_filled | canceled_or_expired
limitqueryDefault 100, max 1000
cursorquerynextCursor from the previous page, verbatim

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/orders?limit=20"
TWAPs

Big orders being worked: Hyperliquid TWAPs

A TWAP order is executed in slices over minutes or hours: which wallets are working one, on which coin, and how much of it is done.

Hyperliquid · REST · CLI · MCP

TWAPs being worked now, across every wallet

Route
GET /v1/hyperliquid/twaps
CLI
vike-data hl twaps
MCP
hl_twaps · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

TWAP orders across wallets, one row per status line, newest first.

A line is a status CHANGE (activated, waitingForTrigger, then finished, terminated or stopped), not a slice fill: executed_size and executed_notional_usd are the cumulative totals when the line was written. Rejected placements (error) are hidden unless status=error. Rows sharing a ts keep a stable order, so a cursor never skips or repeats one.

Parameters

ParameterInDescription
walletqueryOne wallet, 0x plus 40 hex, any case
twap_idqueryOne TWAP id: every status line of that TWAP
symbolqueryHL ticker, e.g. BTC or xyz:AAPL
statusqueryOne of activated, waitingForTrigger, finished, terminated, stopped, error. Default: every status except error, a rejected placement rather than an order; status=error shows those rows
startqueryISO-8601 UTC. Default: the 24 hours before end (before now when end is empty), unless wallet or twap_id is given. Resuming an order=asc cursor starts from the cursor instead; a desc cursor keeps the 24-hour floor
endqueryISO-8601 UTC. Default: now. A window wider than 31 days is a 400 unless wallet or twap_id is given
orderqueryasc | desc. Default desc, newest first. order=asc returns the oldest events first and is the mode for following a feed: pass each nextCursor back verbatim. It orders by key, so a row the writer inserts late with an older key is not seen by a poller already past it: re-read a small overlap. An asc page with rows always carries a cursor; an empty one returns the cursor you sent, or on a first call with no start or wallet or twap_id, a cursor at the lower bound of the default window (null when one of them already pins the place). So stop on an empty page, not on a null cursor. A desc page that comes back short carries no cursor. Anything else is a 400
limitqueryDefault 100, max 5000
cursorquerynextCursor from the previous page, verbatim. It pins the call that returned it: the feed, order, every filter and the start and end you sent. Changing or dropping any of them, start included, is a 400. Without wallet or twap_id, an asc cursor more than 31 days before end (before now when end is empty) is a 400 too: restart with start. /twaps?wallet= and the per-wallet TWAP route are one feed: with the same parameters their cursors are interchangeable

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/twaps?status=activated&limit=20"
Hyperliquid · REST · CLI · MCP

Its TWAP orders

Route
GET /v1/hyperliquid/wallets/{address}/twaps
CLI
vike-data hl twaps
MCP
hl_twaps · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

One wallet's TWAP orders: /twaps with the wallet pinned, wrapped as wallet, items, nextCursor.

Parameters

ParameterInDescription
addressrequiredpathThe wallet
twap_idqueryOne TWAP id: every status line of that TWAP
symbolqueryHL ticker, e.g. BTC or xyz:AAPL
statusqueryOne of activated, waitingForTrigger, finished, terminated, stopped, error. Default: every status except error, a rejected placement rather than an order; status=error shows those rows
startqueryISO-8601 UTC. Default: no lower bound
endqueryISO-8601 UTC. Default: now. The window has no 31-day cap
orderqueryasc | desc. Default desc, newest first. order=asc returns the oldest events first and is the mode for following a feed: pass each nextCursor back verbatim. It orders by key, so a row the writer inserts late with an older key is not seen by a poller already past it: re-read a small overlap. An asc page with rows always carries a cursor; an empty one returns the cursor you sent, or on a first call null (the wallet already pins the place). So stop on an empty page, not on a null cursor. A desc page that comes back short carries no cursor. Anything else is a 400
limitqueryDefault 100, max 5000
cursorquerynextCursor from the previous page, verbatim. It pins the call that returned it: the feed, order, every filter and the start and end you sent. Changing or dropping any of them, start included, is a 400. It is also valid on /twaps?wallet= with the same parameters

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/twaps?limit=20"

Live on vike.io: the TWAP tracker →

Ledger

Large deposits, withdrawals and transfers

Money moving in and out of every Hyperliquid wallet; one wallet's own ledger is in the wallet section above.

Hyperliquid · REST · CLI · MCP

Large deposits, withdrawals and transfers, across every wallet

Route
GET /v1/hyperliquid/ledger
CLI
vike-data hl ledger
MCP
hl_ledger · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Deposits, withdrawals, transfers and vault events across wallets, newest first.

The cross-wallet twin of /wallets/{address}/ledger, with wallet on every row. A transfer between two wallets is one row per affected wallet with the same hash.

Parameters

ParameterInDescription
walletqueryOne wallet, 0x plus 40 hex, any case
event_typequeryOne of accountClassTransfer, borrowLend, deposit, internalTransfer, rewardsClaim, send, spotTransfer, subAccountTransfer, vaultCreate, vaultDeposit, vaultDistribution, vaultLeaderCommission, vaultWithdraw, withdraw. Validated against this fixed set
min_usdqueryMinimum absolute amount_usd, 0 or more. Default 0: no floor
startqueryISO-8601 UTC. Default: the 24 hours before end (before now when end is empty), unless wallet is given. Resuming an order=asc cursor starts from the cursor instead; a desc cursor keeps the 24-hour floor
endqueryISO-8601 UTC. Default: now. A window wider than 31 days is a 400 unless wallet is given
orderqueryasc | desc. Default desc, newest first. order=asc returns the oldest events first and is the mode for following a feed: pass each nextCursor back verbatim. It orders by key, so a row the writer inserts late with an older key is not seen by a poller already past it: re-read a small overlap. An asc page with rows always carries a cursor; an empty one returns the cursor you sent, or on a first call with no start or wallet, a cursor at the lower bound of the default window (null when one of them already pins the place). So stop on an empty page, not on a null cursor. A desc page the read finds short carries no cursor, but duplicate rows are dropped from a page after it is read, so a page with fewer than limit rows can still carry one: stop on an empty page. Anything else is a 400
limitqueryDefault 100, max 5000
cursorquerynextCursor from the previous page, verbatim. It pins the call that returned it: the feed, order, every filter and the start and end you sent. Changing or dropping any of them, start included, is a 400. Without wallet, an asc cursor more than 31 days before end (before now when end is empty) is a 400 too: restart with start

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/ledger?min_usd=1000000&limit=20"

Vault deposits and withdrawals, vault by vault: Vaults →

HYPE holders

Who holds HYPE: the largest holders, staked and spot

Each wallet's spot HYPE plus staked HYPE at one current price, with its perp account value and PnL cohort.

Hyperliquid · REST · CLI · MCP

The largest HYPE holders, staked and spot

Route
GET /v1/hyperliquid/hype/holders
CLI
vike-data hl hype-holders
MCP
hl_hype_holders · 1 credit
Cost
1 request of the hourly limit
Free APIArchiveStreamMCP

Real rows

The largest HYPE holders · /hype/holders

GET/v1/hyperliquid/hype/holders?limit=10
Open this side to see the captured response.

    

Load it

limit
GET/v1/hyperliquid/hype/holders?limit={limit}

    
Press Send ▶ — the captured response appears here

    

HYPE holder leaderboard — spot balance plus staked, per wallet.

pnl_cohort is resolved at query time and the envelope declares it (label_basis='current' + label_computed). Correct here, not a fallback: the leaderboard has no time axis — every row is last-known state, so a current label has no earlier row to contaminate. The caveat runs the other way: balances are last-known, so a stale balance can sit beside a fresh label. account_value is the wallet's perp account value and is null for a holder with no perp account on record (it used to read 0.0, the same as an account that really holds nothing).

Parameters

ParameterInDescription
orderqueryasc | desc. Default desc
limitqueryDefault 100, max 500
cursorqueryKeyset cursor

Call it

bash
curl -H "X-API-KEY: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/hype/holders?limit=10"
Live

Follow the whales live

5 WebSocket channels at wss://stream.vike.io/v1/stream/hl, on the same free key.

ChannelWhat it sendsFilters
hl.top_positionsWho holds each coin's 10 largest positions, for the 50 coins whose top 10 is worth the most: a position that entered the top, left it or moved rank, at every 5-minute capture.coin, direction, event, min_usd, pnl_cohort, size_cohort, wallet
hl.positionsA whale's fill that opens, adds to, reduces, closes or flips a position, with its leverage and liquidation price: a wallet with an account of $250,000 or more, or a position worth $250,000 or more before or after the fill.action, coin, min_leverage, min_usd, pnl_cohort, side, size_cohort, tag, wallet
hl.order_wallsResting orders of $1,000,000 or more that appeared on the book or disappeared from it, from the 5-minute order snapshots.coin, event, min_usd, pnl_cohort, side, size_cohort, wallet
hl.twapsTWAP orders of every wallet, one event per status line (activated, finished, terminated, ...).coin, min_usd, pnl_cohort, side, size_cohort, status, wallet
hl.ledgerDeposits, withdrawals, transfers and vault events of every wallet, as they are recorded.event_type, min_usd, pnl_cohort, size_cohort, wallet
python
import json, os
from websockets.sync.client import connect   # websockets >= 14

with connect("wss://stream.vike.io/v1/stream/hl",
             additional_headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}) as ws:
    ws.send(json.dumps({"action": "subscribe", "id": "top", "channel": "hl.top_positions",
                        "filter": {"coin": ["BTC", "ETH"], "event": "entered"}}))
    for message in ws:
        frame = json.loads(message)
        if frame["type"] == "ping":
            ws.send(json.dumps({"action": "pong"}))
        elif frame["type"] == "event":
            e = frame["event"]
            print(e["ts"], e["subject"], e["data"], e["labels"])
  • Who enters the top 10 of BTC or ETH: vike-data stream hl --channel hl.top_positions --filter coin=BTC,ETH --filter event=entered
  • Every position change of one wallet: vike-data stream hl --channel hl.positions --filter wallet=0x7fdafde5cfb5465924316eced2d3715494c517d1
  • Whale position changes of $1,000,000 or more: vike-data stream hl --channel hl.positions --filter min_usd=1000000
  • Order walls appearing on BTC: vike-data stream hl --channel hl.order_walls --filter coin=BTC --filter event=appeared
  • TWAPs activated by whales: vike-data stream hl --channel hl.twaps --filter status=activated --filter 'size_cohort=4x whale,3x whale,2x whale,whale'
  • Deposits and withdrawals of $1,000,000 or more: vike-data stream hl --channel hl.ledger --filter event_type=deposit,withdraw --filter min_usd=1000000
  • A wallet filter takes up to 1,000 wallets on one subscription.

Every channel's fields, a real event and every filter value: AI & API →

Alerts

Whale alerts by e-mail or webhook

No code: create one on your account page, or ask your AI to.

Alert · hl_wallet

Follow one wallet

An e-mail or a webhook when the wallet's fills open, close, flip, increase a position (and, if you like, reduce), for every coin or one, from a dollar size up. Up to 200 wallets per account.

text
E-mail me when Hyperliquid wallet 0x7fdafde5cfb5465924316eced2d3715494c517d1 opens, closes, flips or adds to a position.
Alert · hl_cohort_fill

The whale alert

Every fill of $10,000 or more by any wallet in the size or PnL cohorts you pick (here whale and up: 4x whale, 3x whale, 2x whale, whale), on every coin or one, by e-mail or webhook.

text
E-mail me every Hyperliquid fill of $10,000 or more by a whale-sized account (4x whale, 3x whale, 2x whale, whale).
Open live

The same data on vike.io, no key

Long vs short by cohort, as data: HL Cohorts →

Routes

Every route on this page

Each with its parameters above, and in the full API reference.

RouteWhat it answersReference
GET /v1/hyperliquid/positionsThe largest open positions of a coin, nowReference →
GET /v1/hyperliquid/positions/matchMatch a PnL card: coin, side, leverage, entry priceReference →
GET /v1/hyperliquid/wallets/{address}Equity, open positions, PnL and lifetime flowReference →
GET /v1/hyperliquid/wallets/{address}/trades/summaryWin rate, average win and loss, overall and per coinReference →
GET /v1/hyperliquid/wallets/{address}/tradesClosed trades: entry, exit, size and PnLReference →
GET /v1/hyperliquid/wallets/{address}/fillsEvery fill, newest firstReference →
GET /v1/hyperliquid/wallets/{address}/fundingFunding paid and receivedReference →
GET /v1/hyperliquid/wallets/{address}/ledgerDeposits, withdrawals and transfersReference →
GET /v1/hyperliquid/wallets/{address}/ordersWhat became of its orders: open, filled, canceledReference →
GET /v1/hyperliquid/wallets/{address}/twapsIts TWAP ordersReference →
GET /v1/hyperliquid/twapsTWAPs being worked now, across every walletReference →
GET /v1/hyperliquid/ledgerLarge deposits, withdrawals and transfers, across every walletReference →
GET /v1/hyperliquid/hype/holdersThe largest HYPE holders, staked and spotReference →
12 studies

Whale and wallet questions, answered with code

Each with the sentence to ask your AI instead. Every block was run against the live API on 2026-11-03.

Hyperliquid · API

Every open position on a Hyperliquid coin: who holds the biggest longs and shorts, and how much equity do they have?

The biggest open positions of one coin, largest first, each with the wallet's account value, from /v1/hyperliquid/positions?symbol=BTC&sort=size.

Uses
/positions
Verified
live API, 2026-11-03: 5 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Who are the 20 biggest BTC longs and shorts on Hyperliquid right now, and how much account value does each wallet have?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the 20 biggest open BTC positions, longs and shorts together, largest first
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/positions?symbol=BTC&sort=size&limit=20",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Which wallet is behind this Hyperliquid PnL share card?

Pass the card's coin, side, leverage and entry price to /v1/hyperliquid/positions/match; it returns the open positions that fit, closest entry first.

Uses
/positions, /positions/match
Verified
live API, 2026-11-03: 4 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Whose Hyperliquid share card is this: BTC short, 5x, entry 76,327.4?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# who holds a 5x BTC short entered at 76,327.4
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=short&leverage=5&entry_price=76327.4&limit=3",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Positions of 50 Hyperliquid watchlist wallets in one call

Track the open positions of a watchlist of Hyperliquid wallets from the 5-minute positions file.

Uses
/archive/datasets, /archive/url, /positions
Verified
live API, 2026-11-03: 3 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “What positions does 0x25773676902085225ae5751075e4161369334897 hold on Hyperliquid right now?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# ask for the link and download the current open positions of every wallet in one step
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/archive/url?dataset=positions&date=latest&redirect=1",
    headers={"X-API-Key": API_KEY},
)
with open("positions-latest.parquet", "wb") as f:
    f.write(r.content)
Hyperliquid · API

Show one Hyperliquid wallet's hourly position history for 30 days

A wallet's positions at the last snapshot of every hour over 30 days, from /v1/hyperliquid/positions with wallet, start and end; resolution=5m gives every snapshot, 48 hours per request.

Uses
/archive/url, /positions
Verified
live API, 2026-11-03: 6 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Show the hourly position history of 0x25773676902085225ae5751075e4161369334897 on Hyperliquid for the last 30 days”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# one wallet's positions at the end of every hour for 30 days
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/positions?wallet=0x25773676902085225ae5751075e4161369334897&start=2026-09-24T00:00:00Z&end=2026-10-24T00:00:00Z&limit=5000",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Closed trades of a wallet: win rate, hold time, best and worst coin

A wallet's closed round trips with hold time and realized PnL, from /wallets/{address}/trades, and /trades/summary totals them overall and per coin, which gives the win rate, the median hold and the best and worst coin.

Uses
/wallets/{…}/trades, /wallets/{…}/trades/summary
Verified
live API, 2026-11-03: 4 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “What is the win rate, typical hold time and best and worst coin of Hyperliquid wallet 0xfc667adba8d4837586078f4fdcdc29804337ca06 over the last 30 days?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the newest closed round trips of one wallet
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06/trades?limit=5",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Hyperliquid wallet ledger: deposits, withdrawals, transfers

A wallet's deposits, withdrawals, transfers and vault events, newest first, with a USD amount, the token and the counterparty, from /wallets/{address}/ledger; event_type filters to one kind.

Uses
/wallets/{…}, /wallets/{…}/ledger
Verified
live API, 2026-11-03: 4 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Show the deposits and withdrawals of Hyperliquid wallet 0x7fdafde5cfb5465924316eced2d3715494c517d1”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the wallet's newest ledger events
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/wallets/0x7fdafde5cfb5465924316eced2d3715494c517d1/ledger?limit=5",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Export a Hyperliquid wallet's fills, funding and ledger for taxes

Export a Hyperliquid wallet's fills, funding payments and ledger entries to CSV for taxes; funding and ledger are kept one year, fills have no expiry.

Uses
/wallets/{…}, /wallets/{…}/fills, /wallets/{…}/funding, /wallets/{…}/ledger
Verified
live API, 2026-11-03: 7 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “List the funding payments of 0xbf342cf5d1e4a4bb91b171c15e3cdbe82da3fcff on Hyperliquid in October 2026”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the newest fills of one wallet; repeat with /funding and /ledger
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/wallets/0xbf342cf5d1e4a4bb91b171c15e3cdbe82da3fcff/fills?limit=3",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

HyperCore ↔ HyperEVM transfers of a user

Read the user's spotTransfer and send ledger events and keep the ones whose counterparty is a Hyperliquid system address, such as 0x2222…2222 for HYPE; the sign of amount_usd gives the direction.

Uses
/wallets/{…}/ledger
Verified
live API, 2026-11-03: 4 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Has Hyperliquid wallet 0xbf49ffdc3008791900bb96ebccb61118f70c1bc9 moved HYPE or USDC between HyperCore and HyperEVM?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the user's spot transfers, where the Core and EVM moves sit
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/wallets/0xbf49ffdc3008791900bb96ebccb61118f70c1bc9/ledger?event_type=spotTransfer&limit=5",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Wash trading between two Hyperliquid addresses: did they trade with each other?

Fetch both wallets' fills for the same coin and window from /v1/hyperliquid/wallets/{address}/fills and join them on trade_id, which both sides of one trade share.

Uses
/archive/url, /wallets/{…}/fills
Verified
live API, 2026-11-03: 5 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Fetch the BTC fills of 0x53136b4a7c432585f28903b77c7816a723e0271f and 0xb371766bcdcd556ce6b6cf164be6019d01441042 between 2026-10-24 17:13:32 and 17:13:35 UTC and list the trade_ids they share”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# wallet A's BTC fills in a three-second window
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/wallets/0x53136b4a7c432585f28903b77c7816a723e0271f/fills?symbol=BTC&start=2026-10-24T17:13:32Z&end=2026-10-24T17:13:35Z&limit=5000",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

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.

Uses
/archive/datasets, /archive/url, /wallets/{…}
Verified
live API, 2026-11-03: 3 calls, all 200
Free APIArchiveStreamMCP

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# size of the month's fills files, before you ask for any link
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/archive/datasets",
    headers={"X-API-Key": API_KEY},
)
# then: jq '[.dates[] | select(.date | startswith("2026-09")) | .streams.fills.bytes] | {days: length, gb: (add / 1e9)}'
Hyperliquid · API

What are the latest large trades on a Hyperliquid coin, including HIP-3 and spot?

A coin's newest fills of $50,000 or more, with wallet, side, price, market or limit, and cohort labels, from /v1/hl-cohorts/symbols/{symbol}/large-fills; smaller trades are only in the daily fills file of the archive.

Uses
/archive/url, /ohlcv, /v1/hl-cohorts/symbols/{…}/large-fills
Verified
live API, 2026-11-03: 5 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Show the latest BTC trades over $100,000 on Hyperliquid with each wallet's cohort”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the newest BTC fills of $50,000 or more
r = requests.get(
    "https://data.vike.io/v1/hl-cohorts/symbols/BTC/large-fills?limit=3",
    headers={"X-API-Key": API_KEY},
)
Hyperliquid · API

Who holds HYPE? Top holders

Wallets ranked by HYPE held on Hyperliquid spot plus HYPE staked, with USD at one current price and each wallet's cohort labels, from /v1/hyperliquid/hype/holders.

Uses
/hype/holders
Verified
live API, 2026-11-03: 5 calls, all 200
Free APIArchiveStreamMCP
Ask your AI agent: “Who are the three largest HYPE holders, counting staked HYPE?”

The code

python
import os
import requests

API_KEY = os.environ["VIKE_API_KEY"]  # your key, read from the environment

# the three biggest HYPE holders, spot plus staked
r = requests.get(
    "https://data.vike.io/v1/hyperliquid/hype/holders?limit=3",
    headers={"X-API-Key": API_KEY},
)
FAQ

Hyperliquid whale tracker FAQ

How often are Hyperliquid positions captured?
Every 5 minutes, and the snapshots are kept for one year. /positions serves the latest by default (the newest 15 minutes of snapshots) and history from 2026-05-01 when you pass start / end.
Is there a free Hyperliquid whale tracker?
Yes. One free key reads any wallet's positions, PnL, trades and ledger, each coin's largest positions and the whale alerts, over MCP, REST, the CLI and a live WebSocket, 20,000 requests an hour. On vike.io, the wallet list needs no key at all.
Can I look up a single wallet?
Yes: /v1/hyperliquid/wallets/{address} and its sub-routes cover its positions, closed trades, fills, funding, ledger, orders and TWAPs. Or paste the address into the box above.
How do I find the wallet behind a Hyperliquid PnL card?
Send the card's coin, side, leverage and entry price to /v1/hyperliquid/positions/match: it returns the open positions that match, closest entry price first. In Claude or ChatGPT, just describe the card.
How do I get a Hyperliquid whale alert?
Create a whale alert: every fill of $10,000 or more by wallets in the size or PnL cohorts you pick, by e-mail or webhook. To follow one wallet, the wallet alert sends its opens, closes, flips and adds.
What is the difference between the whale tracker and the leaderboard?
The whale tracker ranks by size: the largest positions and accounts, and what they do now. The leaderboard ranks by skill: realized PnL, ROI, win rate and drawdown over a day, a week, a month or all time.