Find a position
"Who else is in this trade" — open positions matching a coin/side/leverage/entry profile, the reverse lookup from a shared position card.
GET https://data.vike.io/v1/hyperliquid/positions/match"Who else is in this trade" — open positions matching a coin/side/leverage/entry profile, the
reverse lookup from a shared position card. Runs the same implementation as the hl_position_match
tool on the Data MCP server.
# who else holds this trade: a 40x BTC long entered at 78,001.68, closest entry first, the mark breaking ties
curl -s "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=long&leverage=40&entry_price=78001.68&mark_price=77710&limit=3" \
-H "X-API-KEY: $VIKE_API_KEY"
# the same lookup for a short; mark_price omitted, so ties break on distance from entry_price
curl -s "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=short&leverage=25&entry_price=78500&limit=10" \
-H "X-API-KEY: $VIKE_API_KEY"
# ask for what the route will actually serve: limit is clamped into 1-50
curl -s "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=long&leverage=10&entry_price=78000&limit=50" \
-H "X-API-KEY: $VIKE_API_KEY"
# how crowded is a low-leverage short: count the matches (at most 50)
curl -s "https://data.vike.io/v1/hyperliquid/positions/match?symbol=BTC&side=short&leverage=5&entry_price=78000&limit=50" \
-H "X-API-KEY: $VIKE_API_KEY" \
| jq '.matches | length'symbolqueryrequiredBTCsidequeryrequiredlong | shortleveragequeryrequiredentry_pricequeryrequiredmark_pricequeryoptionalentry_price when omittedlimitqueryoptional{
"matches": [
{
"address": "0x0000005178d55139ba21423218ea7290a7ccdc81",
"symbol": "BTC",
"side": "long",
"snapshot_ts": 1788422340,
"size_token": 0.00467,
"size_usd": 362.90569999999997,
"entry_price": 78001.6773019272,
"mark_price": 77710.0,
"leverage": 40.0,
"liquidation_price": 77064.4662131028,
"unrealized_pnl": -1.362132999999992,
"entry_dist_pct": 0.0
},
{
"address": "0xf94d1cfd380bbaa0d7ca33e00700e7e6be836ab1",
"symbol": "BTC",
"side": "long",
"snapshot_ts": 1788422340,
"size_token": 0.035,
"size_usd": 2719.8500000000004,
"entry_price": 78001.85714285714,
"mark_price": 77710.0,
"leverage": 40.0,
"liquidation_price": 0.0,
"unrealized_pnl": -10.215000000000074,
"entry_dist_pct": 0.0002
},
{
"address": "0x76d81fdfc8226f371529d596f52d208279127663",
"symbol": "BTC",
"side": "long",
"snapshot_ts": 1788422340,
"size_token": 0.00015,
"size_usd": 11.6565,
"entry_price": 78002.0,
"mark_price": 77710.0,
"leverage": 40.0,
"liquidation_price": 77077.3805907173,
"unrealized_pnl": -0.0438,
"entry_dist_pct": 0.0004
}
],
"match_count": 3,
"tolerance_used": "tight",
"query": {
"symbol": "BTC",
"side": "long",
"leverage": 40.0,
"entry_price": 78001.68,
"mark_price_hint": 77710.0
}
}limit is documented as max 500 and clamped to 50
The parameter is accepted up to 500 and then clamped into 1–50. A larger request is served at 50, not rejected.
It walks three widening tolerance bands on entry price — tight 0.05%, then 0.5%, then a 1.0% fallback — and returns the first band that matches. So a match is not necessarily a 0.05% match; check the reported band.
Matches are ranked by entry distance, closest first (entry_dist_pct); the distance of each
row's mark from mark_price only breaks ties. With mark_price omitted it defaults to
entry_price, so the tie-break becomes how far each position has moved since entry.
The symbol is upper-cased before the lookup
symbol is upper-cased before it is matched, while some tickers carry lower-case letters: a HIP-3
market such as xyz:TSLA becomes XYZ:TSLA and kPEPE becomes KPEPE, and neither matches
anything. For those markets this route answers no_match; read the market's positions with
Positions (symbol=xyz:TSLA&sort=size) and filter by side,
leverage and entry yourself.
Only positions seen within 15 minutes of the newest snapshot batch are matched, which is why this returns fewer rows than the history holds: Freshness.