Order clusters
One symbol's standing orders within range_pct of the mid, bucketed by price: bids and asks by limit price, stops and take-profits by trigger price.
GET https://data.vike.io/v1/hyperliquid/symbols/{symbol}/order-clustersOne symbol's standing orders within range_pct of the mid of the best resting bid and ask, bucketed by price: bids and
asks by limit price, stop-loss and take-profit orders by trigger price. Each bucket carries the number of orders and wallets in it and
the size and notional behind them, which shows where a book and its stops are stacked. For the orders one by one use
/orders.
# BTC's standing orders in 10 bp buckets within 10% of the mid (the defaults)
curl -s "https://data.vike.io/v1/hyperliquid/symbols/BTC/order-clusters" \
-H "X-API-KEY: $VIKE_API_KEY"
# only whale wallets, by their current size label: 25 bp buckets within 5% of the mid
curl -s "https://data.vike.io/v1/hyperliquid/symbols/BTC/order-clusters?cohort_axis=size&cohort=whale&step_bps=25&range_pct=5" \
-H "X-API-KEY: $VIKE_API_KEY"
# the book at an earlier instant, in 50 bp buckets
curl -s "https://data.vike.io/v1/hyperliquid/symbols/BTC/order-clusters?at=2026-10-26T12:00:00Z&step_bps=50&range_pct=10" \
-H "X-API-KEY: $VIKE_API_KEY"symbolpathrequiredatqueryoptionalstep_bpsqueryoptionalrange_pctqueryoptionalcohort_axisqueryoptionalsize | pnl | pnl_abs. Default sizecohortqueryoptionalcohort_axis, by CURRENT labels: refused with atCaptured from the live API on 2026-10-27 at 10:55 UTC for the first call. The two buckets nearest the reference price are
shown for each kind, out of 100 ask, 100 bid, 199 sl and 200 tp buckets.
{
"symbol": "BTC",
"snapshot_ts": "2026-10-27T10:55:00+00:00",
"source": "l4_5m",
"reference_price": 79945.5,
"best_bid": 79945.0,
"best_ask": 79946.0,
"step_bps": 10,
"range_pct": 10,
"buckets": {
"ask": [
{
"price_low": 80025.44549999999,
"price_high": 80105.391,
"n_orders": 301,
"n_wallets": 132,
"n_position_tpsl": 0,
"cluster_size": 266.62837,
"cluster_notional": 21345492.21
},
{
"price_low": 79945.5,
"price_high": 80025.44549999999,
"n_orders": 611,
"n_wallets": 161,
"n_position_tpsl": 0,
"cluster_size": 375.937,
"cluster_notional": 30068873.63
}
],
"bid": [
{
"price_low": 79865.5545,
"price_high": 79945.5,
"n_orders": 660,
"n_wallets": 220,
"n_position_tpsl": 0,
"cluster_size": 352.62438,
"cluster_notional": 28175081.16
},
{
"price_low": 79785.609,
"price_high": 79865.5545,
"n_orders": 378,
"n_wallets": 184,
"n_position_tpsl": 0,
"cluster_size": 240.2841,
"cluster_notional": 19182201.56
}
],
"sl": [
{
"price_low": 79945.5,
"price_high": 80025.44549999999,
"n_orders": 1,
"n_wallets": 1,
"n_position_tpsl": 1,
"cluster_size": 0.0,
"cluster_notional": 0.0
},
{
"price_low": 79865.5545,
"price_high": 79945.5,
"n_orders": 6,
"n_wallets": 6,
"n_position_tpsl": 4,
"cluster_size": 5.6356,
"cluster_notional": 450234.44
}
],
"tp": [
{
"price_low": 79945.5,
"price_high": 80025.44549999999,
"n_orders": 17,
"n_wallets": 15,
"n_position_tpsl": 0,
"cluster_size": 0.65354,
"cluster_notional": 52283.20888
},
{
"price_low": 79865.5545,
"price_high": 79945.5,
"n_orders": 5,
"n_wallets": 5,
"n_position_tpsl": 0,
"cluster_size": 0.14723,
"cluster_notional": 11761.43696
}
]
},
"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."
]
}The buckets. reference_price is the mid of the best resting bid and the best resting ask. The range is range_pct
percent either side of it, cut into buckets step_bps basis points of the reference price wide; price_low and
price_high are a bucket's edges. Only buckets that hold an order are returned, each list highest price first.
step_bps takes 1 to 500 and range_pct 1 to 50; a value outside is refused with a 422. Without at the book is the
newest snapshot; at is resolved as on /orders, and snapshot_ts and source
say what answered. A call costs 1 credit (Rate limits).
The four kinds. ask and bid bucket resting limit orders by limit price; sl and tp bucket untriggered stop-loss
and take-profit orders by trigger price. cluster_size is the remaining size in the base asset and cluster_notional
is that size times the order's price. For the newest snapshot that is the size at that snapshot, except for a
whole-position stop or take-profit that has fired and rests as a limit order under the same order id: it adds 0, the
stored size of its pre-fire sightings. For a past at it can be a later, smaller remaining size than the orders had at
snapshot_ts, because an order's sightings are merged into one stored row; for the same reason an order's kind and price
can come from another sighting (one that was modified, or whose trigger fired), so a bucket's kind and price can be wrong
for a past at. n_wallets counts distinct wallets in the
bucket.
A cohort filter keeps the orders of the wallets in one cohort: cohort is a label on cohort_axis (size, pnl or
pnl_abs; size when omitted). The reference price and the best bid and ask still come from every order, so the filter
cannot move the mid. The response then carries cohort_axis, cohort, label_basis and a label_computed block;
Label basis says what a current label means.
Before 2026-10-23 21:45 UTC the book is rebuilt from checkpoints, and the mid moves with it
On state_12m with a past at, snapshot_ts is your at floored to 5 minutes, not a checkpoint instant, and only the
orders that a checkpoint at or before that instant saw, and another at or after it saw again, are bucketed. Short-lived
orders, such as quotes replaced within minutes, are the likeliest to be missing, so reference_price is then the mid of
the long-lived orders only and can sit far from the market's mid, and every bucket edge moves with it. The same holds for
an at inside an outage of either feed: source still reads l4_5m or state_12m. With l4_5m, outside an outage of
that feed, the book is every order seen in that snapshot.
Fields are snake_case here, camelCase on the other two order routes
This route returns snapshot_ts, price_low and n_orders. /orders and
/wallets/{address}/orders return snapshotTs, limitPx and
nextCursor. The names are published as the routes return them.
A whole-position stop or take-profit adds an order but no size
An order attached to a whole position has no size until it fires. It counts in n_orders and n_position_tpsl and adds
0 to cluster_size, so a bucket of only such orders reads a size of 0.
Trailing stops are not bucketed
A trailing stop has no trigger price until its trail activates, so it appears in no bucket.
A cohort filter uses current labels and is refused with at
The orders come from the snapshot and each wallet's label is its current one. A historical at with cohort would join an
old book to a new label, so the call is a 400. Omit at to filter by cohort.
A one-sided book has no mid
With resting bids but no asks, or asks but no bids, reference_price is null and every bucket list is empty.
best_bid and best_ask still report the side that exists.