Hyperliquid order book API: L2 depth and L4 orders with their wallets
Every order waiting on Hyperliquid's book with the wallet that placed it, the size at each price, what became of any wallet's orders, the $1M walls and who pulls them, where a move would squeeze, and whose money holds the book. A snapshot every 5 minutes now and about every 12 minutes back to July 2026, kept for a year. Ask it in Claude or ChatGPT, or call it from code.
Ask the order book in plain words
Connect once, then ask Claude, ChatGPT or Cursor. The agent reads the book as it stands now, or at any past moment.
https://data.vike.io/mcp“Whose bid wall is under BTC right now?”
hl_orders open“Which orders did this wallet place, and what happened to them? (paste an address)”
hl_orders wallet“Where would stops and liquidations squeeze BTC?”
hl_orders squeeze“Who keeps pulling big walls on BTC?”
hl_orders walls order_statshl_orders
The agent picks the view from your question. Each view is the same data as one route below.
| View | What it answers | Same data as |
|---|---|---|
open | Every order waiting at one moment, for a coin and/or a wallet, each with its owner's size and PnL group | GET /v1/hyperliquid/orders |
book | The size waiting at each price, best price first, at one moment | GET /v1/hyperliquid/symbols/{symbol}/book |
clusters | Orders and untriggered stops grouped into price bands around the mid; one group's only, if you ask | GET /v1/hyperliquid/symbols/{symbol}/order-clusters |
wallet | What became of one wallet's orders over up to 30 days: filled, partly filled, canceled or expired | GET /v1/hyperliquid/wallets/{address}/orders |
walls | The orders of $1M or more of a coin or a wallet, and how each ended: filled, pulled with no fill, or still open | GET /v1/hyperliquid/walls |
order_stats | One wallet's walls, in totals and per coin: how many it pulled and how many were filled | GET /v1/hyperliquid/wallets/{address}/order-stats |
squeeze | The book, the stops waiting to fire and the liquidation prices on one price ladder: where a move would feed itself | GET /v1/hyperliquid/symbols/{symbol}/squeeze-map |
book_cohorts | Who owns the bids and asks near the price, by size or PnL group, over time | GET /v1/hyperliquid/symbols/{symbol}/book-cohorts |
# any MCP client; or from the terminal:
vike-data call hl_orders --args '{"view": "open", "symbol": "BTC", "cohort_axis": "size", "cohort": "4x whale"}'
L1, L2 and L4: three ways to look at an order book
| Level | What you see | The question it answers | Here |
|---|---|---|---|
| L1 | The best bid and the best ask: the top of the book | “What is the spread on BTC?” | /symbols/{symbol}/book?levels=1 |
| L2 | The total size waiting at each price, best price first | “How much is bid within 1% of the price?” | /symbols/{symbol}/book, up to 1,000 prices a side |
| L4 | Every single order, with the wallet that placed it, its type, size and when it was placed | “Whose order is that $10M bid?” | /orders, with the owner's size and PnL group |
L4 order book data: every order with its wallet
Every order waiting on the book at one moment, who placed it, and which group that wallet is in.
Open orders (L4)
The orders waiting on the book at one moment: every one in a 5-minute snapshot.
- Route
GET /v1/hyperliquid/orders- Snapshots
- Every 5 minutes from 2026-10-23 21:45 UTC; about every 12 minutes back to 2026-07-29
- Past moments
at, any time since 2026-07-29, rounded down to 5 minutes- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
- A coin, a wallet, or both:
symbol=BTC, a HIP-3 marketsymbol=xyz:TSLA,wallet=0x…. - Any past moment:
at=2026-11-12T14:30:00Zgives the book as it stood then, and grades each owner by the labels of the hour before it, so a backtest never sees what was learned later. - One group of traders:
cohort_axis=size&cohort=4x whale(accounts of $10M or more) orcohort_axis=pnl&cohort=3x smart(the top 1% by realized PnL). - Spot books:
market=spot&symbol=HYPE/USDC. Perp and spot are never mixed: HYPE is both. - Narrower: one order (
oid), one type (order_type=Stop Market), orders placed in a window (created_from,created_to). - Pages: 100 orders a page by default, up to 1,000;
nextCursorpages through the same snapshot.
A real answer: BTC orders of 4x whales, placed since 12:00 UTC
GET /v1/hyperliquid/orders?symbol=BTC&cohort_axis=size&cohort=4x%20whale&created_from=2026-11-13T12:00:00Z&limit=3 · captured 2026-11-13 16:01 UTC
| Wallet | Side | Type | Price | Size, BTC | Value | PnL group | Placed, UTC |
|---|---|---|---|---|---|---|---|
0xca49…53c8 | sell | Limit | 68,926 | 0.02995 | $2,064 | 3x smart | 11-13 15:59:54 |
0xecb6…2b00 | sell | Limit | 68,924 | 0.94401 | $65,065 | 3x smart | 11-13 15:59:54 |
0xecb6…2b00 | sell | Limit | 68,912 | 0.94416 | $65,064 | 3x smart | 11-13 15:59:55 |
The JSON
{
"snapshotTs": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"labelBasis": "current",
"labelsAsOf": null,
"labelComputed": {
"sizeCohort": {
"grading": null,
"label_basis": "current",
"when": "the newest wallet snapshot",
"lookahead": false,
"source": "latest wallet snapshot (size rung)",
"detail": "The orders are the newest snapshot and each wallet's label is its current one: row and label are both 'now', so a current label has no earlier row to contaminate. A past snapshot (`at`) is graded by the labels of its own time instead.",
"caveat": "The order snapshot and the label source refresh on their own cadences (minutes apart), so a wallet that changed cohort in between is graded by its newer label."
},
"pnlCohort": {
"grading": "realized",
"label_basis": "current",
"when": "at query time",
"lookahead": false,
"source": "live wallet realized-PnL ladder",
"detail": "The orders are the newest snapshot and each wallet's label is its current one: row and label are both 'now', so a current label has no earlier row to contaminate. A past snapshot (`at`) is graded by the labels of its own time instead.",
"caveat": "The order snapshot and the label source refresh on their own cadences (minutes apart), so a wallet that changed cohort in between is graded by its newer label."
}
},
"orders": [
{
"oid": 604141529978,
"wallet": "0xca4903c207a0df58bf37d4bc8bbc5210726f53c8",
"symbol": "BTC",
"side": "sell",
"orderType": "Limit",
"limitPx": 68926.0,
"triggerPx": null,
"isTrigger": false,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x0000000000000000687568c1e7012000",
"origSz": 0.02995,
"sz": 0.02995,
"placedAt": "2026-11-13T15:59:54.070000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"sizeCohort": "4x whale",
"pnlCohort": "3x smart",
"pnlCumUsd": 1675824.057700992
},
{
"oid": 604141550205,
"wallet": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
"symbol": "BTC",
"side": "sell",
"orderType": "Limit",
"limitPx": 68924.0,
"triggerPx": null,
"isTrigger": false,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x51094585594542311ff11fffffffffff",
"origSz": 0.94401,
"sz": 0.94401,
"placedAt": "2026-11-13T15:59:54.755000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"sizeCohort": "4x whale",
"pnlCohort": "3x smart",
"pnlCumUsd": 35058411.14513373
},
{
"oid": 604141556631,
"wallet": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
"symbol": "BTC",
"side": "sell",
"orderType": "Limit",
"limitPx": 68912.0,
"triggerPx": null,
"isTrigger": false,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x51094585594915355ff10fffffffffff",
"origSz": 0.94416,
"sz": 0.94416,
"placedAt": "2026-11-13T15:59:55.103000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"sizeCohort": "4x whale",
"pnlCohort": "3x smart",
"pnlCumUsd": 35058411.14513373
}
],
"nextCursor": "eyJhIjoiQlRDIiwiZCI6IkhMIiwiaiI6MSwiayI6IkJUQ3x8fDB8fDIwMjYtMTEtMTMgMTI6MDA6MDB8fHNpemV8NHggd2hhbGUiLCJsNCI6MSwibSI6Im9yZGVycyIsIm8iOjYwNDE0MTU1NjYzMSwicSI6IlVTREMiLCJzIjoibDRfNW0iLCJzZCI6LTEsInQiOiIyMDI2LTExLTEzIDE2OjAwOjAwIn0"
}
Each order
| Field | Type | Description |
|---|---|---|
oid | number | The order id |
wallet | string | The wallet that placed it |
symbol | string | BTC, a HIP-3 market like xyz:TSLA, or a spot pair like HYPE/USDC |
side | string | buy | sell |
orderType | string | Limit, Stop Market, Stop Limit, Take Profit Market, Take Profit Limit or Trailing Stop Market |
limitPx | number | Its limit price |
triggerPx | number|null | The price that fires a stop or take-profit |
isTrigger | boolean | A stop or take-profit not fired yet |
isPositionTpsl | boolean | A take-profit or stop for the whole position: it has no size until it fires |
reduceOnly | boolean | Can only shrink a position |
tif | string|null | Time in force, e.g. Gtc, Alo |
cloid | string|null | The trader's own id for the order |
origSz | number|null | Size when placed, in the coin |
sz | number|null | Size still waiting, in the coin |
placedAt | string | When it was placed, UTC |
firstSeen / lastSeen | string | The first and last snapshot that saw it |
builder | string|null | The front-end or bot that sent it, when it named one |
builderFeeTenthsBp | number|null | That builder's fee, in tenths of a basis point |
sizeCohort | string|null | The owner's size group, by account value: shrimp to 4x whale; null where unknown |
pnlCohort | string|null | The owner's PnL group, by realized PnL: 3x rekt to 3x smart; null where unknown |
pnlCumUsd | number|null | The owner's realized PnL to date, USD |
The answer around them: snapshotTs (the snapshot's own time), source (l4_5m, the 5-minute snapshot, or state_12m, rebuilt from the 12-minute checkpoints), labelBasis (current without at, point_in_time with it), labelsAsOf, labelComputed and nextCursor.
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/orders?symbol=BTC&created_from=2026-11-13T12%3A00%3A00Z&cohort_axis=size&cohort=4x+whale&limit=3"
import os, requests
URL = "https://data.vike.io/v1/hyperliquid/orders"
KEY = {"X-API-KEY": os.environ["VIKE_API_KEY"]}
params = {"symbol": "BTC", "cohort_axis": "size", "cohort": "4x whale", "limit": 1000}
orders = []
while True: # every page of the same snapshot
page = requests.get(URL, params=params, headers=KEY, timeout=60).json()
orders += page["orders"]
if not page["nextCursor"]:
break
params["cursor"] = page["nextCursor"]
# the biggest bids, and whose they are
bids = [o for o in orders if o["side"] == "buy" and not o["isTrigger"] and o["sz"]]
for o in sorted(bids, key=lambda o: o["limitPx"] * o["sz"], reverse=True)[:5]:
print(o["wallet"], f'{o["limitPx"]:,.0f}', f'${o["limitPx"] * o["sz"]:,.0f}', o["pnlCohort"])
print(page["snapshotTs"], page["source"])
Ask your AI (Claude, ChatGPT, Cursor, with Vike connected):
Which BTC orders have Hyperliquid's 4x whales placed since 12:00 UTC today, and are they still on the book?
It calls the tool hl_orders with:
{"view": "open", "symbol": "BTC", "cohort_axis": "size", "cohort": "4x whale", "created_from": "2026-11-13T12:00:00Z", "limit": 3}
L2 order book: the size waiting at each price
The book as most charts draw it: each price with the total size waiting there and how many orders make it up.
Order book (L2)
The waiting limit orders summed per price: bids highest first, asks lowest first.
- Route
GET /v1/hyperliquid/symbols/{symbol}/book- Snapshots
- Every 5 minutes from 2026-11-13 08:40 UTC; about every 12 minutes back to 2026-07-28
- Levels
levels: 1 to 1,000 prices a side, best first (default 100);side: both, bid, ask- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
A real answer: BTC book, 5 prices a side
GET /v1/hyperliquid/symbols/BTC/book?levels=5 · captured 2026-11-13 16:02 UTC
The JSON
{
"symbol": "BTC",
"market": "perp",
"snapshotTs": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"bids": [
{
"px": 68880.0,
"sz": 0.37871,
"n": 3
},
{
"px": 68877.0,
"sz": 0.58003,
"n": 4
},
{
"px": 68876.0,
"sz": 0.46316,
"n": 4
},
{
"px": 68875.0,
"sz": 0.03629,
"n": 1
},
{
"px": 68874.0,
"sz": 2.69543,
"n": 2
}
],
"asks": [
{
"px": 68881.0,
"sz": 5.38383,
"n": 9
},
{
"px": 68887.0,
"sz": 1.89278,
"n": 1
},
{
"px": 68889.0,
"sz": 2.73145,
"n": 9
},
{
"px": 68890.0,
"sz": 0.45778,
"n": 5
},
{
"px": 68891.0,
"sz": 1.29833,
"n": 4
}
],
"notes": [
"Each level is the resting limit orders at one price: px the price, sz their remaining size in the base asset, n how many orders. Untriggered stop and take-profit orders are not in the book.",
"levels counts price levels on each side from the best price outward: bids highest first, asks lowest first.",
"snapshotTs is the snapshot's own time, at or before `at`: every 5 minutes (l4_5m) or about every 12 minutes (state_12m)."
]
}
snapshotTs is the snapshot's own time, at or before at. Stops and take-profits that have not fired are not in the book: price bands count them. An unknown symbol, or no snapshot of it in the hour up to at, is a 404.
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/symbols/BTC/book?levels=5"
import os, requests
book = requests.get(
"https://data.vike.io/v1/hyperliquid/symbols/BTC/book",
params={"levels": 1000},
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=60,
).json()
mid = (book["bids"][0]["px"] + book["asks"][0]["px"]) / 2
bid_usd = sum(l["px"] * l["sz"] for l in book["bids"] if l["px"] >= mid * 0.99)
ask_usd = sum(l["px"] * l["sz"] for l in book["asks"] if l["px"] <= mid * 1.01)
print(book["snapshotTs"], f"bids within 1%: ${bid_usd:,.0f}", f"asks within 1%: ${ask_usd:,.0f}")
Ask your AI (Claude, ChatGPT, Cursor, with Vike connected):
Show me the Hyperliquid BTC order book, 5 prices a side.
It calls the tool hl_orders with:
{"view": "book", "symbol": "BTC", "levels": 5}
Price bands, by group: where the orders and stops sit
The book cut into price bands around the mid: bids and asks by their limit price, stop-losses and take-profits by the price that fires them. Ask for one group, and you see where that group's orders and stops sit.
Order clusters
One symbol's waiting orders and stops within a range of the mid, summed per price band.
- Route
GET /v1/hyperliquid/symbols/{symbol}/order-clusters- Bands
step_bpswide (default 10 = 0.1%), withinrange_pctof the mid (default 10%)- One group
cohort_axis+cohort, e.g.size·4x whale; withat, the labels of the hour before- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
Each band: price_low, price_high, n_orders, n_wallets, n_position_tpsl, cluster_size (in the coin) and cluster_notional (USD), under buckets.bid, ask, sl and tp. Trailing stops are not counted: they have no trigger price until the trail starts.
A real answer: BTC in 0.25% bands: the busiest band of each kind
GET /v1/hyperliquid/symbols/BTC/order-clusters?step_bps=25 · captured 2026-11-13 16:02 UTC
| Kind | Band | Orders | Wallets | Size, BTC | Value |
|---|---|---|---|---|---|
| Bids, by limit price | 68,708-68,880 | 607 | 112 | 476.96 | $32,817,750 |
| Asks, by limit price | 68,880-69,053 | 723 | 175 | 447.82 | $30,878,138 |
| Stop-losses, by trigger price | 70,430-70,603 | 87 | 77 | 49.70 | $3,505,698 |
| Take-profits, by trigger price | 74,908-75,080 | 103 | 86 | 89.63 | $6,722,529 |
The JSON
{
"symbol": "BTC",
"snapshot_ts": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"reference_price": 68880.5,
"best_bid": 68880.0,
"best_ask": 68881.0,
"step_bps": 25,
"range_pct": 10,
"buckets": {
"ask": [
{
"price_low": 69052.70125,
"price_high": 69224.9025,
"n_orders": 312,
"n_wallets": 146,
"n_position_tpsl": 0,
"cluster_size": 418.69664,
"cluster_notional": 28936776.44
},
{
"price_low": 68880.5,
"price_high": 69052.70125,
"n_orders": 723,
"n_wallets": 175,
"n_position_tpsl": 0,
"cluster_size": 447.8244,
"cluster_notional": 30878138.36
}
],
"bid": [
{
"price_low": 68708.29875,
"price_high": 68880.5,
"n_orders": 607,
"n_wallets": 112,
"n_position_tpsl": 0,
"cluster_size": 476.95808,
"cluster_notional": 32817750.02
},
{
"price_low": 67502.89,
"price_high": 67675.09125,
"n_orders": 366,
"n_wallets": 202,
"n_position_tpsl": 0,
"cluster_size": 389.63867,
"cluster_notional": 26343839.51
}
],
"sl": [
{
"price_low": 70430.31125,
"price_high": 70602.5125,
"n_orders": 87,
"n_wallets": 77,
"n_position_tpsl": 26,
"cluster_size": 49.69844,
"cluster_notional": 3505698.296
},
{
"price_low": 64403.2675,
"price_high": 64575.46875,
"n_orders": 17,
"n_wallets": 17,
"n_position_tpsl": 7,
"cluster_size": 50.82892,
"cluster_notional": 3278415.226
}
],
"tp": [
{
"price_low": 74907.54375,
"price_high": 75079.74500000001,
"n_orders": 103,
"n_wallets": 86,
"n_position_tpsl": 40,
"cluster_size": 89.63381,
"cluster_notional": 6722529.315
},
{
"price_low": 73185.53125,
"price_high": 73357.7325,
"n_orders": 32,
"n_wallets": 25,
"n_position_tpsl": 11,
"cluster_size": 31.16531,
"cluster_notional": 2281992.322
}
]
},
"notes": [
"bid/ask bucket resting orders by limit price, tp/sl bucket untriggered stops by trigger price; cluster_size is the remaining size in the base asset, cluster_notional is size x that price.",
"Whole-position TP/SL orders have no size of their own until they fire: they are counted in n_orders and n_position_tpsl and add 0 to cluster_size.",
"Trailing stops are not bucketed: they have no trigger price until the trail activates."
]
}
Each list of the JSON trimmed to its 2 largest bands by value, of 40 bid, 40 ask, 80 stop-loss and 80 take-profit bands.
- bid/ask bucket resting orders by limit price, tp/sl bucket untriggered stops by trigger price; cluster_size is the remaining size in the base asset, cluster_notional is size x that price.
- Whole-position TP/SL orders have no size of their own until they fire: they are counted in n_orders and n_position_tpsl and add 0 to cluster_size.
- Trailing stops are not bucketed: they have no trigger price until the trail activates.
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/symbols/BTC/order-clusters?step_bps=25"
import os, requests
r = requests.get(
"https://data.vike.io/v1/hyperliquid/symbols/BTC/order-clusters",
params={"step_bps": 25},
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=60,
).json()
print("mid", r["reference_price"], "at", r["snapshot_ts"])
for kind in ("bid", "ask", "sl", "tp"): # the busiest band of each kind
b = max(r["buckets"][kind], key=lambda b: b["cluster_notional"] or 0, default=None)
if b:
print(kind, f'{b["price_low"]:,.0f}-{b["price_high"]:,.0f}', f'${b["cluster_notional"] or 0:,.0f}',
b["n_wallets"], "wallets")
Ask your AI (Claude, ChatGPT, Cursor, with Vike connected):
Where do the Hyperliquid BTC orders, stop-losses and take-profits cluster, in 0.25% price bands?
It calls the tool hl_orders with:
{"view": "clusters", "symbol": "BTC", "step_bps": 25}
What happened to a wallet's orders
Every order a wallet had on the book or filled in a window, and how each one ended.
A wallet's orders and their outcome
Newest placement first, each with its fills in the window and a status.
- Route
GET /v1/hyperliquid/wallets/{address}/orders- Window
from/to: the last 7 days by default, at most 30- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
| Status | In plain words |
|---|---|
open | Still waiting on the book at the newest snapshot |
filled | Its fills cover the whole size |
partially_filled | Some of it traded, the rest did not |
canceled_or_expired | It left the book with no fill in the window. A cancel by the trader, a margin cancel and an expiry look the same in the snapshots, so they are not told apart |
What each order adds
| Field | Type | Description |
|---|---|---|
status | string | open | filled | partially_filled | canceled_or_expired |
seenInSnapshots | boolean | false: placed and filled between two snapshots, never seen waiting, so its price, size and placement time are unknown |
nFills / filledSz | number | How many fills in the window, and their total size |
avgFillPx | number|null | The average fill price |
makerShare | number|null | The share of the filled value that waited on the book (maker) |
firstFillAt / lastFillAt | string|null | The first and last fill in the window |
closedPnl | number | PnL booked by those fills, USD |
fillFees / feeToken | number / string | Fees paid on them |
Plus the order's own fields from L4 (type, prices, sizes, placement, builder) and, around them, wallet, from, to, snapshotTs, source, notes and nextCursor.
A real answer: the newest orders of one busy wallet, in the last 7 days
GET /v1/hyperliquid/wallets/0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00/orders?limit=3 · captured 2026-11-13 16:02 UTC
| Market | Side | Status | Type | Price | Size | Placed, UTC | Fills |
|---|---|---|---|---|---|---|---|
| xyz:MU | buy | open | Limit | 756.22 | 115.958 | 11-13 16:00:00 | 0 |
| xyz:MU | buy | open | Limit | 760.79 | 23.755 | 11-13 16:00:00 | 0 |
| xyz:CL | buy | open | Limit | 87.773 | 48.788 | 11-13 16:00:00 | 0 |
The JSON
{
"wallet": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00",
"from": "2026-11-06T16:00:00+00:00",
"to": "2026-11-13T16:00:00+00:00",
"snapshotTs": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"orders": [
{
"oid": 604141637837,
"symbol": "xyz:MU",
"side": "buy",
"status": "open",
"seenInSnapshots": true,
"orderType": "Limit",
"limitPx": 756.22,
"triggerPx": null,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x27353293390802176ff17fffffffffff",
"origSz": 115.958,
"placedAt": "2026-11-13T16:00:00.312000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"nFills": 0,
"filledSz": 0.0,
"avgFillPx": null,
"makerShare": null,
"firstFillAt": null,
"lastFillAt": null,
"closedPnl": 0.0,
"fillFees": 0.0,
"feeToken": null
},
{
"oid": 604141637836,
"symbol": "xyz:MU",
"side": "buy",
"status": "open",
"seenInSnapshots": true,
"orderType": "Limit",
"limitPx": 760.79,
"triggerPx": null,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x27353293390801920ff14fffffffffff",
"origSz": 23.755,
"placedAt": "2026-11-13T16:00:00.312000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"nFills": 0,
"filledSz": 0.0,
"avgFillPx": null,
"makerShare": null,
"firstFillAt": null,
"lastFillAt": null,
"closedPnl": 0.0,
"fillFees": 0.0,
"feeToken": null
},
{
"oid": 604141637831,
"symbol": "xyz:CL",
"side": "buy",
"status": "open",
"seenInSnapshots": true,
"orderType": "Limit",
"limitPx": 87.773,
"triggerPx": null,
"isPositionTpsl": false,
"reduceOnly": false,
"tif": "Alo",
"cloid": "0x27353293390754048ff10fffffffffff",
"origSz": 48.788,
"placedAt": "2026-11-13T16:00:00.312000+00:00",
"firstSeen": "2026-11-13T16:00:00+00:00",
"lastSeen": "2026-11-13T16:00:00+00:00",
"builder": null,
"builderFeeTenthsBp": null,
"nFills": 0,
"filledSz": 0.0,
"avgFillPx": null,
"makerShare": null,
"firstFillAt": null,
"lastFillAt": null,
"closedPnl": 0.0,
"fillFees": 0.0,
"feeToken": null
}
],
"notes": [
"canceled_or_expired: the order left the book with no fill in the window. A manual cancel, a margin cancel, a reduce-only cancel and an expiry look the same in the snapshots, so they are not told apart.",
"Fill figures count only fills inside the window: an order filled partly before `from` and canceled in the window reads as canceled_or_expired, and one filled before `from` as partially_filled.",
"seenInSnapshots=false: placed and filled between two snapshots, never seen resting, so its original size, limit price and placement time are unknown; it is reported as filled.",
"open: present in the newest snapshot (snapshotTs). Snapshots are 5 minutes apart (l4_5m) or ~12 minutes (state_12m), so an order can have filled or been canceled since."
],
"nextCursor": "eyJMIjoiMjAyNi0xMS0xMyAxNjowMDowMCIsImYiOiIyMDI2LTExLTA2IDE2OjAwOjAwIiwiayI6IjB4ZWNiNjNjYWE0N2M3YzRlNzdmNjBmMWNlODU4Y2YyOGRjMmI4MmIwMHx8fHwiLCJsNCI6MSwibSI6IndhbGxldF9vcmRlcnMiLCJvIjo2MDQxNDE2Mzc4MzEsInMiOiJsNF81bSIsInRvIjoiMjAyNi0xMS0xMyAxNjowMDowMCIsInRzIjoiMjAyNi0xMS0xMyAxNjowMDowMC4zMTIifQ"
}
- canceled_or_expired: the order left the book with no fill in the window. A manual cancel, a margin cancel, a reduce-only cancel and an expiry look the same in the snapshots, so they are not told apart.
- Fill figures count only fills inside the window: an order filled partly before `from` and canceled in the window reads as canceled_or_expired, and one filled before `from` as partially_filled.
- seenInSnapshots=false: placed and filled between two snapshots, never seen resting, so its original size, limit price and placement time are unknown; it is reported as filled.
- open: present in the newest snapshot (snapshotTs). Snapshots are 5 minutes apart (l4_5m) or ~12 minutes (state_12m), so an order can have filled or been canceled since.
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/wallets/0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00/orders?limit=3"
import os, requests
from collections import Counter
ADDRESS = "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00"
r = requests.get(
f"https://data.vike.io/v1/hyperliquid/wallets/{ADDRESS}/orders",
params={"limit": 1000}, # the last 7 days; from/to for up to 30
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=60,
).json()
print(Counter(o["status"] for o in r["orders"]))
pulled = [o for o in r["orders"] if o["status"] == "canceled_or_expired" and o["origSz"]]
print("left with no fill:", len(pulled), f'${sum(o["limitPx"] * o["origSz"] for o in pulled):,.0f}')
Ask your AI (Claude, ChatGPT, Cursor, with Vike connected):
What happened to the orders of Hyperliquid wallet 0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00 this week?
It calls the tool hl_orders with:
{"view": "wallet", "address": "0xecb63caa47c7c4e77f60f1ce858cf28dc2b82b00", "limit": 3}
$1M order walls: when they appear, and how they leave
A live WebSocket channel: every order of $1M or more, waiting or a stop, as soon as a 5-minute snapshot finds it new or gone, with how it left and who placed it.
hl.order_walls
A large resting order or stop order that appeared on the book or left it, and when it left, whether it was filled, partly filled or pulled.
- Path
- wss://stream.vike.io/v1/stream/hl
- Filters
- coin, event, kind, min_usd, pnl_cohort, side, size_cohort, wallet
- Checked
- Every 5-minute snapshot of the book
- From
- $1M: a waiting order at its limit price, a stop at the price that fires it
- Each event:
event(appeared|disappeared),kind(resting|trigger),coin,side,limit_px,size_usd,remaining_usd,ts_placed,first_seen,last_seen,oid; a stop addstrigger_type(sl | tp | trailing) andtrigger_px; a gone wall addsoutcomeandfilled_usd. - Who placed it:
subject.walletand the owner's labels:size_cohort,pnl_cohort,pnl_cum_usd. - How many: about 70 to 100 resting walls appear, and about as many leave, every 5 minutes (measured 2026-11-13).
- Catch up: events are kept 3 days;
stream_eventsin your AI client, orGET /v1/hyperliquid/stream-events, reads what a socket missed. The channel runs while someone is subscribed: a spell with no subscriber comes back as agapwith reasonchannel_idle.
Filters
| Field | Type | Description |
|---|---|---|
coin | list ≤ 200 | The symbol, e.g. BTC or xyz:TSLA. |
event | one value | appeared (new on the book) or disappeared (gone from it). One of: appeared, disappeared. |
kind | one value | resting (a limit order on the book) or trigger (a stop or take-profit not fired yet). One of: resting, trigger. |
min_usd | number | The event's dollar size is at least this. |
pnl_cohort | list ≤ 50 | The wallet's realized-PnL cohort; unknown also matches a wallet with no label. One of: 2x loser, 2x rekt, 2x smart, 2x winner, 3x loser, 3x rekt, 3x smart, 3x winner, loser, rekt, smart, unknown, winner. |
side | one value | The wall's side: buy or sell. One of: buy, sell. |
size_cohort | list ≤ 50 | The wallet's account-size cohort; unknown also matches a wallet with no label. One of: 2x dolphin, 2x fish, 2x shark, 2x shrimp, 2x whale, 3x whale, 4x whale, dolphin, fish, shark, shrimp, unknown, whale. |
wallet | list ≤ 1,000 | The event's wallet. |
A real event captured 2026-11-13 16:02 UTC
{
"schema": "vike.event.v1",
"event_id": "hl.order_walls:603860917080:disappeared",
"source": "hl.order_walls",
"kind": "order_wall",
"ts": "2026-11-13T11:30:00.000Z",
"cursor": "1794569400-00000000603860917080",
"chain": "hyperliquid",
"subject": {
"wallet": "0x71d0e11ebb6150cebe20cf62f798be1a50108c26",
"symbol": "BTC"
},
"data": {
"event": "disappeared",
"kind": "resting",
"dex": "HL",
"coin": "BTC",
"side": "buy",
"limit_px": 69016.0,
"size_usd": 1164648.45,
"remaining_usd": 1164648.45,
"ts_placed": "2026-11-13T11:18:42.199Z",
"first_seen": "2026-11-13T11:20:00.000Z",
"last_seen": "2026-11-13T11:25:00.000Z",
"oid": 603860917080,
"source": "l4_5m",
"outcome": "canceled",
"filled_usd": 0.0
},
"labels": {
"pnl_cohort": "3x smart",
"pnl_cohort_basis": "live",
"pnl_cum_usd": 4023485.4348433744,
"size_cohort": "3x whale"
}
}
Subscribe
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": "walls", "channel": "hl.order_walls",
"filter": {"coin": ["BTC"], "event": "disappeared", "kind": "resting"}}))
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"]
d = e["data"]
print(e["ts"], d["side"], d["limit_px"], d["size_usd"], d.get("outcome"), e["labels"].get("size_cohort"))
{
"action": "subscribe",
"id": "walls",
"channel": "hl.order_walls",
"filter": {
"coin": [
"BTC"
],
"event": "disappeared",
"kind": "resting"
}
}
| Outcome of a gone wall | In plain words |
|---|---|
filled | Taken in full |
partially_filled | Partly filled: some of it traded, the rest was pulled |
canceled | Pulled: gone with no fill (a cancel, an expiry, or a stop whose position closed) |
unknown | The fills had not arrived 10 minutes after the wall left |
The history of these walls, who pulls them and how often a wall is pulled before any fill: Walls history ↓ · Every Hyperliquid channel →
Walls history: how each big order ended, and who pulls them
Every big order the 5-minute snapshots found on the book, with how it left: filled, partly filled or pulled with no fill. Per wallet, how many it placed and how many it pulled.
Big orders and how each one ended
- Route
GET /v1/hyperliquid/walls- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
How a wall ends
| Outcome | In plain words |
|---|---|
filled | Taken in full: its own fills reach its size |
partially_filled | Some of it traded, then it left the book |
pulled | It left the book with no fill at all: a cancel, an expiry or a margin cancel, which look the same in the snapshots |
open | Still waiting on the book at the newest snapshot |
unknown | It left the book a few minutes ago and its fills are not stored yet; never called pulled until they are. Ask again a few minutes later |
A real answer
GET /v1/hyperliquid/walls?symbol=BTC&from=2026-11-13T14:00:00Z&to=2026-11-13T15:00:00Z&outcome=pulled&limit=5 · captured 2026-11-13 16:03 UTC
| Wallet | Side | Price | Size | Lived | Outcome | Price within 0.1% | Owner (size · PnL) |
|---|---|---|---|---|---|---|---|
| 0x31de…13f2 | sell | 69,124 | $1.73M | 5 min | pulled | no | 3x whale · 3x smart |
| 0x31de…13f2 | sell | 69,712 | $6.44M | 5 min | pulled | no | 3x whale · 3x smart |
| 0x2025…840e | buy | 68,365 | $1.00M | 5 min | pulled | no | whale · 3x smart |
| 0x7b7f…dee2 | sell | 69,396 | $1.32M | 5 min | pulled | no | 2x whale · 3x smart |
| 0x0fd4…e0c7 | buy | 68,813 | $1.25M | 5 min | pulled | no | whale · 3x smart |
The JSON
{
"from": "2026-11-13T14:00:00+00:00",
"to": "2026-11-13T15:00:00+00:00",
"snapshot_ts": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"min_usd": 1000000.0,
"touch_bps": 10,
"walls": [
{
"oid": 604053406764,
"wallet": "0x31dea2516beee92135b96f464eeec3cf292a13f2",
"symbol": "BTC",
"side": "sell",
"kind": "resting",
"trigger_type": null,
"trigger_px": null,
"limit_px": 69124.0,
"size_usd": 1731093.0691999998,
"placed_at": "2026-11-13T15:00:02.981000+00:00",
"first_seen": "2026-11-13T15:00:00+00:00",
"last_seen": "2026-11-13T15:00:00+00:00",
"lifetime_s": 300,
"outcome": "pulled",
"filled_usd": 0.0,
"near_touch": false,
"size_cohort": "3x whale",
"pnl_cohort": "3x smart",
"pnl_cum_usd": 5293109.309956033,
"label_basis": "point_in_time",
"labels_as_of": "2026-11-13T14:00:00+00:00"
},
{
"oid": 604053393427,
"wallet": "0x31dea2516beee92135b96f464eeec3cf292a13f2",
"symbol": "BTC",
"side": "sell",
"kind": "resting",
"trigger_type": null,
"trigger_px": null,
"limit_px": 69712.0,
"size_usd": 6440843.65216,
"placed_at": "2026-11-13T15:00:02.590000+00:00",
"first_seen": "2026-11-13T15:00:00+00:00",
"last_seen": "2026-11-13T15:00:00+00:00",
"lifetime_s": 300,
"outcome": "pulled",
"filled_usd": 0.0,
"near_touch": false,
"size_cohort": "3x whale",
"pnl_cohort": "3x smart",
"pnl_cum_usd": 5293109.309956033,
"label_basis": "point_in_time",
"labels_as_of": "2026-11-13T14:00:00+00:00"
}
],
"nextCursor": "eyJMIjoiMjAyNi0xMS0xMyAxNjowMDowMCIsImYiOiIyMDI2LTExLTEzIDE0OjAwOjAwIiwiayI6IkhMfEJUQ3x8fDIwMjYtMTEtMTMgMTQ6MDA6MDB8MjAyNi0xMS0xMyAxNTowMDowMHwxMDAwMDAwLjB8Ym90aHxwdWxsZWR8MTAiLCJtIjoid2FsbHMiLCJvIjo2MDQwNTMzNDYxNjQsInMiOiJsNF81bSIsInRvIjoiMjAyNi0xMS0xMyAxNTowMDowMCIsInRzIjoiMjAyNi0xMS0xMyAxNTowMDowMCJ9"
}
The JSON trimmed to 2 of its 5 walls, without label_computed and notes; nextCursor leads to the next page.
Large standing orders (walls) of a symbol and/or a wallet last seen in a window, and what became of each: filled, partly filled, pulled before any fill, or still open.
A wall is a resting order of at least min_usd (limit price x original size), or an untriggered stop or take-profit of at least min_usd at its trigger price, as of the last 5-minute snapshot it was seen in. Each carries oid, wallet, symbol, side, kind, trigger_type and trigger_px (stops), limit_px, size_usd, placed_at, first_seen, last_seen, lifetime_s (from its placement, or the snapshot before its first sighting, to the one after its last; notes says how), outcome, filled_usd, near_touch (whether the other side of the book was within touch_bps of its price when it was last seen) and its owner's size_cohort, pnl_cohort and pnl_cum_usd: current for an open wall, else those of the hour before its last sighting, as each row's label_basis (current | point_in_time) and labels_as_of say; label_computed describes both. outcome is unknown while the fills are not yet stored past the wall's disappearance, never pulled. The window holds the walls whose last sighting falls in it; snapshot_ts is the newest snapshot, source l4_5m (5-minute snapshots, from 2026-10-23 21:45 UTC) or state_12m (about 12 minutes). Newest last sighting first; notes says what a snapshot cannot tell.
Parameters
| Parameter | In | Description |
|---|---|---|
symbol | query | HL perp ticker, e.g. BTC or xyz:TSLA; with market=spot a spot pair, e.g. HYPE/USDC. symbol and/or wallet is required |
wallet | query | One wallet. symbol and/or wallet is required |
from | query | ISO-8601 UTC. Default: 24 hours before to. Not before 2026-07-29 |
to | query | ISO-8601 UTC. Default, and at the latest: the newest order snapshot. At most 7 days after from |
min_usd | query | Smallest wall in USD: limit price x original size, a stop or take-profit at its trigger price. At least 100,000. Default 1,000,000 |
kind | query | both | resting | trigger (untriggered stops and take-profits). Default both |
outcome | query | filled | partially_filled | pulled | open | unknown. Default: every outcome |
market | query | perp | spot. Default perp. A spot symbol is a pair, HYPE/USDC, or HYPE-USDC in a URL path; a bare HYPE is HYPE/USDC |
touch_bps | query | How close, in basis points, the other side of the book must have been for near_touch. Default 10 |
limit | query | Default 100, max 1000 |
cursor | query | nextCursor from the previous page, verbatim |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/walls?symbol=BTC&from=2026-11-13T14%3A00%3A00Z&to=2026-11-13T15%3A00%3A00Z&outcome=pulled&limit=5"
import os, requests
from collections import Counter
params = {"symbol": "BTC", "limit": 1000} # the last 24 hours, walls of $1M and up
headers = {"X-API-KEY": os.environ["VIKE_API_KEY"]}
walls = []
while True: # page until nextCursor is null
page = requests.get("https://data.vike.io/v1/hyperliquid/walls", params=params, headers=headers, timeout=60).json()
walls += page["walls"]
if not page["nextCursor"]:
break
params["cursor"] = page["nextCursor"]
print(Counter(w["outcome"] for w in walls))
pulled = Counter(w["wallet"] for w in walls if w["outcome"] == "pulled")
for wallet, n in pulled.most_common(5):
print(wallet, n, "walls pulled with no fill")
# Ask Claude, ChatGPT or Cursor, with https://data.vike.io/mcp connected:
Which big BTC walls were pulled today without a fill, and whose were they?
# The agent calls hl_orders (1 credit):
{"view": "walls", "symbol": "BTC", "outcome": "pulled"}
One wallet's walls in totals: how many it pulled
- Route
GET /v1/hyperliquid/wallets/{address}/order-stats- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
In the newest 5 BTC walls at 16:00 UTC (GET /v1/hyperliquid/walls?symbol=BTC&limit=5), 3 were one wallet's: a $7.95M bid at 67,621, a $4.04M ask at 69,064, a $2.03M bid at 68,762. Its week, in totals:
A real answer
GET /v1/hyperliquid/wallets/0x31dea2516beee92135b96f464eeec3cf292a13f2/order-stats · captured 2026-11-13 16:01 UTC
| Symbol | Walls | Pulled | Filled | Pulled share | Wall value |
|---|---|---|---|---|---|
| BTC | 37,353 | 37,333 | 1 | 99.997% | $158.36B |
| ETH | 29,061 | 29,045 | 0 | 100.000% | $75.44B |
| SOL | 28,542 | 28,524 | 2 | 99.993% | $21.53B |
| HYPE | 22,378 | 22,366 | 0 | 100.000% | $8.33B |
| xyz:SNDK | 18,352 | 18,341 | 0 | 99.995% | $6.67B |
The JSON
{
"wallet": "0x31dea2516beee92135b96f464eeec3cf292a13f2",
"from": "2026-11-06T16:00:00+00:00",
"to": "2026-11-13T16:00:00+00:00",
"snapshot_ts": "2026-11-13T16:00:00+00:00",
"source": "l4_5m",
"min_usd": 100000.0,
"touch_bps": 10,
"n_walls": 226712,
"n_open": 128,
"n_filled": 4,
"n_partial": 2,
"n_pulled": 226578,
"n_unknown": 0,
"pulled_share": 0.9999735197542633,
"median_lifetime_s": 300,
"total_wall_usd": 307240450998.76666,
"filled_usd": 1172218.151418,
"cancel_to_fill_ratio": 56644.5,
"pulled_near_touch_share": 0.027,
"n_pulled_touch_checked": 1000,
"by_symbol": [
{
"symbol": "BTC",
"n_walls": 37353,
"n_open": 19,
"n_filled": 1,
"n_partial": 0,
"n_pulled": 37333,
"n_unknown": 0,
"pulled_share": 0.9999732147640221,
"median_lifetime_s": 300,
"total_wall_usd": 158358677525.4441,
"filled_usd": 136188.857419,
"cancel_to_fill_ratio": 37333.0
},
{
"symbol": "ETH",
"n_walls": 29061,
"n_open": 16,
"n_filled": 0,
"n_partial": 0,
"n_pulled": 29045,
"n_unknown": 0,
"pulled_share": 1.0,
"median_lifetime_s": 300,
"total_wall_usd": 75443186613.93536,
"filled_usd": 0.0,
"cancel_to_fill_ratio": null
}
]
}
The JSON trimmed to its first 2 per-symbol rows, without notes.
One wallet's walls last seen in a window, in totals: n_walls, n_open, n_filled, n_partial, n_pulled, n_unknown, pulled_share (pulled / walls that left the book with a known outcome), pulled_near_touch_share (of its newest 1,000 pulled walls with a stored book, the share pulled with the other side of the book within 10 basis points), median_lifetime_s, total_wall_usd, filled_usd, cancel_to_fill_ratio (pulled / filled walls) and the same per symbol for the 20 symbols with the most walls (by_symbol). The walls and their outcomes are those of /walls with this wallet.
Parameters
| Parameter | In | Description |
|---|---|---|
addressrequired | path | The wallet |
from | query | ISO-8601 UTC. Default: 7 days before to. Not before 2026-07-29 |
to | query | ISO-8601 UTC. Default, and at the latest: the newest order snapshot. At most 7 days after from |
min_usd | query | Smallest wall in USD: limit price x original size, a stop or take-profit at its trigger price. At least 100,000. Default 100,000 |
market | query | perp | spot. Default perp |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/wallets/0x31dea2516beee92135b96f464eeec3cf292a13f2/order-stats"
import os, requests
WALLET = "0x31dea2516beee92135b96f464eeec3cf292a13f2"
s = requests.get(f"https://data.vike.io/v1/hyperliquid/wallets/{WALLET}/order-stats",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=120).json()
print(f'{s["n_walls"]:,} walls, {s["n_pulled"]:,} pulled with no fill, {s["n_filled"]} filled')
print("pulled share", s["pulled_share"], "· pulled per filled wall", s["cancel_to_fill_ratio"])
for x in s["by_symbol"][:5]:
print(x["symbol"], x["n_walls"], "walls,", x["n_pulled"], "pulled")
# Ask Claude, ChatGPT or Cursor, with https://data.vike.io/mcp connected:
How many of its big orders did 0x31dea2516beee92135b96f464eeec3cf292a13f2 pull without a fill this week?
# The agent calls hl_orders (1 credit):
{"view": "order_stats", "address": "0x31dea2516beee92135b96f464eeec3cf292a13f2"}
Squeeze map: where stops and liquidations outweigh the book
One price ladder around the price: the orders waiting in each bucket, the stops that would fire into it and the positions that would be liquidated there.
The book, stops and liquidations on one price ladder
- Route
GET /v1/hyperliquid/symbols/{symbol}/squeeze-map- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
A real answer, in short
GET /v1/hyperliquid/symbols/BTC/squeeze-map · captured 2026-11-13 16:02 UTC
| Price bucket | Where | Orders waiting | Stops firing into it | Liquidated into it | Pressure |
|---|---|---|---|---|---|
| 63,714 to 63,887 | 7.25% below | $1.65M | $164.4K | $20.58M | 12.58 |
| 74,219 to 74,391 | 7.75% above | $756.8K | $210.8K | $5.62M | 7.71 |
| 64,059 to 64,231 | 6.75% below | $3.31M | $18.1K | $18.83M | 5.70 |
The JSON
{
"symbol": "BTC",
"snapshotTs": "2026-11-13T16:00:00+00:00",
"sources": {
"book": {
"snapshotTs": "2026-11-13T16:00:00+00:00",
"source": "l4_5m"
},
"stops": {
"snapshotTs": "2026-11-13T16:00:00+00:00",
"source": "l4_5m"
},
"liquidations": {
"snapshotTs": "2026-11-13T15:57:00+00:00"
}
},
"mid": 68880.5,
"step_bps": 25,
"range_pct": 8,
"buckets": [
{
"price_low": 63714.4625,
"price_high": 63886.66375,
"bid_sz": 25.84835,
"ask_sz": 0.0,
"bid_usd": 1649044.479,
"ask_usd": 0.0,
"stop_sell_usd": 164443.7586,
"stop_buy_usd": 18755.1967,
"liq_long_usd": 20581912.29,
"liq_short_usd": 0.0,
"pressure": 12.58083473
},
{
"price_low": 74218.73874999999,
"price_high": 74390.94,
"bid_sz": 0.0,
"ask_sz": 10.18401,
"bid_usd": 0.0,
"ask_usd": 756753.1817,
"stop_sell_usd": 11747.36858,
"stop_buy_usd": 210782.5573,
"liq_long_usd": 0.0,
"liq_short_usd": 5622582.914,
"pressure": 7.708412218
},
{
"price_low": 64058.865,
"price_high": 64231.066249999996,
"bid_sz": 51.50799,
"ask_sz": 0.0,
"bid_usd": 3305266.73,
"ask_usd": 0.0,
"stop_sell_usd": 18128.13542,
"stop_buy_usd": 114267.9369,
"liq_long_usd": 18830845.0,
"liq_short_usd": 0.0,
"pressure": 5.702708639
}
]
}
The 3 buckets with the highest pressure, of the 64 in the answer; the JSON holds those 3 (the answer lists every bucket, highest price first), without notes.
Where a move would be forced along: one perp's price ladder at one instant, each bucket with the resting book, the stop orders that would trade into it and the open positions that would be liquidated into it.
Returns symbol, snapshotTs, sources (the book, the stop orders and the positions, each with its own snapshot time, the newest at or before snapshotTs), mid (of the best bid and ask), buckets (highest price first, only buckets with something in them) and notes. Per bucket: bid_sz and ask_sz (resting size, base asset), bid_usd and ask_usd (the same resting orders' value in USD), stop_sell_usd and stop_buy_usd (untriggered stop-loss and take-profit orders by the side they trade when they fire), liq_long_usd and liq_short_usd (positions liquidated there; a long is sold, a short bought) and pressure: below the mid (stop_sell_usd + liq_long_usd) / bid_usd, above it (stop_buy_usd + liq_short_usd) / ask_usd, so it can be checked by hand. Above 1 more would be forced through the bucket than stands in it. Perps only: spot has no liquidations. An unknown symbol, or no book of it in the hour up to at, is a 404.
Parameters
| Parameter | In | Description |
|---|---|---|
symbolrequired | path | HL perp ticker, e.g. BTC or xyz:TSLA |
at | query | ISO-8601 UTC, floored to 5 minutes. Default: the newest snapshot. Not before 2026-07-29, not in the future |
step_bps | query | Bucket width in basis points of the mid. Default 25 |
range_pct | query | Half-width of the price range around the mid, percent. Default 8 |
cohort_axis | query | size | pnl | pnl_abs. Default size |
cohort | query | One label on cohort_axis: only that cohort's stops and liquidations (the book is always the whole book). Without at by the current labels, with at by the labels of the hour before the snapshot's own hour |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/symbols/BTC/squeeze-map"
import os, requests
r = requests.get("https://data.vike.io/v1/hyperliquid/symbols/BTC/squeeze-map",
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=60).json()
def pressure(b): # null: nothing waits in the bucket, yet something would be forced into it
return float("inf") if b["pressure"] is None else b["pressure"]
print("mid", r["mid"], "at", r["snapshotTs"])
for b in sorted(r["buckets"], key=pressure, reverse=True)[:3]:
side = "above" if b["price_low"] >= r["mid"] else "below"
print(f'{b["price_low"]:,.0f}-{b["price_high"]:,.0f}', side, "pressure", pressure(b))
# Ask Claude, ChatGPT or Cursor, with https://data.vike.io/mcp connected:
Where would stops and liquidations squeeze BTC?
# The agent calls hl_orders (1 credit):
{"view": "squeeze", "symbol": "BTC"}
Whose liquidity: which traders own the book near the price
The orders near the price split by their owner's size or PnL group, every 5 minutes, hour or day, each owner labelled as of that snapshot.
Who owns the book near the price, over time
- Route
GET /v1/hyperliquid/symbols/{symbol}/book-cohorts- MCP
hl_orders· 1 credit- Cost
- 1 credit, one request of the hourly limit
A real answer
GET /v1/hyperliquid/symbols/BTC/book-cohorts?interval=5m · captured 2026-11-13 16:02 UTC
| Group | Wallets (bid / ask) | Bids | Share of bids | Asks | Share of asks |
|---|---|---|---|---|---|
| 3x whale | 9 / 9 | $62.75M | 44.1% | $62.58M | 43.9% |
| unknown | 116 / 60 | $29.67M | 20.8% | $30.60M | 21.5% |
| 2x whale | 8 / 11 | $15.51M | 10.9% | $26.00M | 18.2% |
| 2x dolphin | 31 / 28 | $9.46M | 6.6% | $9.78M | 6.9% |
| whale | 9 / 7 | $11.52M | 8.1% | $2.30M | 1.6% |
The JSON
{
"symbol": "BTC",
"market": "perp",
"cohort_axis": "size",
"band_bps": 200,
"interval": "5m",
"from": "2026-11-12T16:00:00+00:00",
"to": "2026-11-13T16:00:00+00:00",
"label_basis": "point_in_time",
"points": [
{
"ts": "2026-11-13T16:00:00+00:00",
"n_snapshots": 1,
"bid_usd": 142443873.6,
"ask_usd": 142464902.0,
"cohorts": [
{
"cohort": "3x whale",
"bid_usd": 62753646.99,
"ask_usd": 62579530.03,
"bid_share": 0.4405499893,
"ask_share": 0.439262788,
"n_wallets_bid": 9,
"n_wallets_ask": 9
},
{
"cohort": "unknown",
"bid_usd": 29670236.73,
"ask_usd": 30603948.31,
"bid_share": 0.2082942283,
"ask_share": 0.2148174595,
"n_wallets_bid": 116,
"n_wallets_ask": 60
}
]
}
]
}
The 5 largest groups at 16:00 UTC. The JSON trimmed to that last of its 4 points and its 2 largest groups, without label_computed and notes.
The same answer over its 4 points: the book within 2% and the 3x whale share
| Time | Bids | Asks | 3x whale: share of bids | 3x whale: share of asks |
|---|---|---|---|---|
| 15:45 UTC | $192.98M | $146.71M | 34.3% | 44.6% |
| 15:50 UTC | $160.29M | $157.66M | 36.3% | 39.4% |
| 15:55 UTC | $162.22M | $150.15M | 39.2% | 41.2% |
| 16:00 UTC | $142.44M | $142.46M | 44.1% | 43.9% |
Who owns the resting book near the mid, over time: per point and owner cohort, the bid and ask notional within band_bps of the mid and the cohort's share of it.
Returns symbol, market, cohort_axis, band_bps, interval, from, to, label_basis and label_computed (when and from what the owners' labels were taken), points (oldest first: ts, n_snapshots, the band's bid_usd and ask_usd, and cohorts, each with bid_usd, ask_usd, bid_share, ask_share, n_wallets_bid, n_wallets_ask) and notes. Each owner is labelled as of the 5-minute snapshot itself, so a past point never uses later knowledge. The series starts with the first recorded snapshot (November 2026); an interval with no snapshot is absent, not zero.
Parameters
| Parameter | In | Description |
|---|---|---|
symbolrequired | path | HL perp ticker, e.g. BTC or xyz:TSLA; with market=spot a spot pair, e.g. HYPE-USDC |
from | query | ISO-8601 UTC. Default: 24 hours before to |
to | query | ISO-8601 UTC. Default: now. At most 7 days after from |
cohort_axis | query | size | pnl. Default size |
band_bps | query | 50 | 200 | 1000: the orders within 0.5%, 2% or 10% of the mid. Default 200 |
interval | query | 5m | 1h | 1d. Default 1h: hours and days average the 5-minute snapshots |
market | query | perp | spot. Default perp. A spot symbol is a pair, HYPE/USDC, or HYPE-USDC in a URL path; a bare HYPE is HYPE/USDC |
Call it
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/symbols/BTC/book-cohorts?interval=5m"
import os, requests
r = requests.get("https://data.vike.io/v1/hyperliquid/symbols/BTC/book-cohorts", params={"interval": "5m"},
headers={"X-API-KEY": os.environ["VIKE_API_KEY"]}, timeout=60).json()
for p in r["points"]: # oldest first; each owner labelled as of that snapshot
top = max(p["cohorts"], key=lambda c: c["bid_usd"] + c["ask_usd"])
print(p["ts"], top["cohort"], f'{top["bid_share"]:.0%} of bids', f'{top["ask_share"]:.0%} of asks',
f'within {r["band_bps"] / 100:g}% of the mid')
# Ask Claude, ChatGPT or Cursor, with https://data.vike.io/mcp connected:
Which traders own BTC's order book near the price today, whales or small accounts?
# The agent calls hl_orders (1 credit):
{"view": "book_cohorts", "symbol": "BTC", "interval": "5m"}
Order book history, and why it matters
418 of 420. Of 420 walls of $1M or more that left the book on the live walls stream (11:30 to 11:50 UTC), 418 were pulled with no fill.
Today's walls, in plain words captured 2026-11-13, 16:01 to 16:03 UTC
- One wallet, one week: 226,578 of 226,712 big orders pulled with no fill.
0x31de…13f2placed them in the seven days to 16:00 UTC, each worth $100K or more; 4 were filled and 2 partly. Its median wall lived 5 minutes: seen in one snapshot, gone by the next. Only 2.7% of its last 1,000 pulled walls went with the price within 0.1%. - The newest pulled walls never met the price. The 5 newest pulled BTC walls of $1M or more that left the book between 14:00 UTC and 15:00 UTC were each seen in one snapshot, none with the price within 0.1%.
- BTC's squeeze map at 16:00 UTC: 37 of 64 buckets within 8% of the price had pressure above 1; the nearest sat 1.25% below and 1.25% above the price. The strongest, 12.6, sat 7.25% below: $20.58M of positions would be liquidated into $1.65M of waiting orders.
- Whose liquidity at 16:00 UTC: 9 wallets in the 3x whale group (accounts of $5M to $10M) owned 44% of the bids and 44% of the asks within 2% of BTC's price. Owners with no size label held 21% of the bids.
Why it matters
- A wall that is never hit is not support. History shows which walls are pulled as the price comes near (
near_touchon each wall), and which wallets do it again and again (pulled_near_touch_share). - Backtests see the book as it was. With
at, each owner is graded by the labels of the hour before the snapshot, never with what was learned later; a wall that left the book carries the labels of the hour before it left. - Any moment, many ways:
atworks on orders, the L2 book, price bands and the squeeze map; walls and whose liquidity take a window (fromandto).
source says which: l4_5m or state_12m.How the big BTC walls that left the book in one hour ended
# one past hour: any hour back to 2026-07-29 works
curl -H "X-API-KEY: $VIKE_API_KEY" \
"https://data.vike.io/v1/hyperliquid/walls?symbol=BTC&from=2026-11-13T15:00:00Z&to=2026-11-13T16:00:00Z&limit=1000"
import os, requests
from collections import Counter
from datetime import datetime, timedelta, timezone
start = datetime.now(timezone.utc) - timedelta(hours=1)
params = {"symbol": "BTC", "from": start.strftime("%Y-%m-%dT%H:%M:%SZ"), "limit": 1000}
headers = {"X-API-KEY": os.environ["VIKE_API_KEY"]}
walls = []
while True:
page = requests.get("https://data.vike.io/v1/hyperliquid/walls", params=params, headers=headers, timeout=60).json()
walls += page["walls"]
if not page["nextCursor"]:
break
params["cursor"] = page["nextCursor"]
gone = [w for w in walls if w["outcome"] != "open"]
print(len(gone), "walls of $1M or more left the book:", Counter(w["outcome"] for w in gone))
# Ask Claude, ChatGPT or Cursor, with https://data.vike.io/mcp connected:
How did the big BTC walls that left the book in the last hour end?
# The agent calls hl_orders (1 credit):
{"view": "walls", "symbol": "BTC", "from": "2026-11-13T15:00:00Z", "to": "2026-11-13T16:00:00Z"}
Hyperliquid order book API FAQ
Can I ask about the Hyperliquid order book in Claude or ChatGPT?
hl_orders (views open, book, clusters, wallet, walls, order_stats, squeeze and book_cohorts), 1 credit a call.Is there a Hyperliquid L2 order book API?
GET /v1/hyperliquid/symbols/{symbol}/book returns the size waiting at each price, up to 1,000 prices a side, at any past moment back to 2026-07-28: every 5 minutes from 2026-11-13 08:40 UTC, about every 12 minutes before.Is there Hyperliquid L4 data with wallet addresses?
GET /v1/hyperliquid/orders lists every order waiting at one moment with the wallet that placed it, and that wallet's size and PnL group.Can I see which walls are fake, and who pulls them?
GET /v1/hyperliquid/walls lists the orders of $1M or more of a coin or a wallet seen in a window (the last 24 hours by default, up to 7 days) and how each one ended: filled, partly filled, pulled with no fill, or still open. GET /v1/hyperliquid/wallets/{address}/order-stats adds up one wallet's walls: how many it pulled and how many were filled.What is the squeeze map?
GET /v1/hyperliquid/symbols/{symbol}/squeeze-map puts the resting book, the stop orders waiting to fire and the liquidation prices of open positions on one price ladder. For each price band it says how much forced buying or selling would hit the book there: above 1, a move would feed itself.Can I see whose money is on the book?
GET /v1/hyperliquid/symbols/{symbol}/book-cohorts splits the bids and asks near the price by size group (whales, sharks, dolphins …) or by PnL group, over time, so you see when whales or the best traders step in and when they step away.Is this a live, tick-by-tick feed of the book?
hl.order_walls channel as each snapshot finds them new or gone.