Skip to main content

Hyperliquid Long/Short Ratio: How to See Positioning by Account

Count the long and short accounts in any Hyperliquid market, compare the largest accounts with the crowd and list every holder. Tested 8 Nov 2026.

10 min read
Explore with your agent

Key findings

  1. Why count accounts on Hyperliquid$21.26MBNB long value and short value. Every long has a short, so the totals always match: the signal is in who holds them.
  2. Step 1: read the long/short ratio for one market1.05BNB long/short ratio by account: 2,056 long, 1,953 short, 16:03 UTC on 8 Nov 2026.
  3. Step 3: scan open interest and flow across every market179Active core perpetuals ranked in one request.
  4. Step 4: list the accounts behind the numbers43 / 57Long and short among BNB's 100 largest accounts, leaning against the crowd.

Exchanges usually hand you a long/short ratio they computed. On Hyperliquid, an onchain crypto exchange, every open position is public and carries the account that holds it, so you can count the traders on each side yourself, see whether the largest accounts agree with everyone else, and list every holder. This guide builds that view in six requests: every market at once, one market's summary, its hourly history and its full list of holders in three pages. Every request ran on 8 November 2026 between 16:08 and 16:11 UTC, and every output is what came back.

Short answer

  • Long/short ratio for a market: GET /v1/hyperliquid/positions/{symbol}/summary. BNB had 2,056 long accounts and 1,953 short accounts, a ratio of 1.05. That counts accounts holding BNB, one market, not the whole exchange.
  • What the big accounts are doing: the same response splits out the 100 largest accounts by position size. In BNB they leaned the other way: 43 long, 57 short.
  • Every market at once: GET /v1/hyperliquid/positioning returned all 179 active core perpetuals in one request, with open interest change, taker buy and sell volume and liquidations over 1, 4 or 24 hours.
  • Every holder: GET /v1/hyperliquid/positions/{symbol} returned all 4,009 BNB positions in 3 requests and 0.96 seconds. Hyperliquid's own API reads one known address at a time.

Why count accounts on Hyperliquid

In a perpetual market every long has a short on the other side, so long value always equals short value. In BNB both were $21,261,334. A ratio of value is always 1 and says nothing. What does vary is how many accounts sit on each side, where they entered, and how much of each side the largest accounts hold. On Hyperliquid you can measure all three, because the positions themselves are public.

What you need

  • Python 3 with requests, and a 0xArchive API key in OXARCHIVE_API_KEY.
  • The all-markets /positioning route is on the Build plan and above, per capabilities. A key on another plan gets a 403 that names the dataset and is not charged. The per-market position routes are on every plan, and the Free plan covers the last 30 days. See pricing.

The snippets are short prototypes with no retry logic.

Step 1: read the long/short ratio for one market

With no start or end, the summary route returns the latest snapshot: accounts per side, size and value per side, average entry per side, how much the ten largest positions hold, and the same split for the 100 largest accounts.

import os, requests

H = {"X-API-Key": os.environ["OXARCHIVE_API_KEY"]}
B = "https://api.0xarchive.io/v1/hyperliquid"

s = requests.get(f"{B}/positions/BNB/summary", headers=H, timeout=30).json()["data"][0]
top = s["top_accounts"]
print("snapshot", s["snapshot_ts"], "quality", s["quality"])
print("accounts  long", s["long_count"], "short", s["short_count"], "ratio", s["long_short_account_ratio"])
print(f"top {top['n']}   long", top["long_count"], "short", top["short_count"], "ratio", top["long_short_account_ratio"])
print("value     long", s["long_value"], "short", s["short_value"])
print("avg entry long", s["long_avg_entry_price"], "short", s["short_avg_entry_price"])
print("top-10 share of each side  long", s["long_top10_value_share"], "short", s["short_top10_value_share"])
snapshot 2026-11-08T16:03:35Z quality partial
accounts  long 2056 short 1953 ratio 1.052739
top 100   long 43 short 57 ratio 0.754386
value     long 21261334.267 short 21261334.267
avg entry long 724.051 short 719.949
top-10 share of each side  long 0.507241 short 0.400016

Across all BNB accounts, longs outnumbered shorts 1.05 to 1. Among the 100 largest, shorts outnumbered longs 57 to 43. The crowd leaned long and the big accounts leaned short. The long side was also more concentrated: its ten largest positions held 50.7% of it, against 40.0% for the short side. Both average entries sat above a mark near 698, so the average long was under water and the average short was in profit.

quality was partial on this snapshot. Show it, with snapshot_ts, next to any ratio you publish. Step 4 rebuilds the counts from the raw positions and they match.

Step 2: watch the ratio move hour by hour

Pass start and end and the same route returns one point per hour.

import time

end = int(time.time() * 1000) // 3_600_000 * 3_600_000
h = requests.get(f"{B}/positions/BNB/summary", headers=H, timeout=30,
                 params={"start": end - 24 * 3_600_000, "end": end}).json()["data"]
print(len(h), "hourly points")
for d in h[::4] + [h[-1]]:
    print(d["snapshot_ts"][:16], d["long_count"], d["short_count"],
          round(float(d["long_value"]) / 1e6, 2), round(float(d["top10_value_share"]) * 100, 1))
24 hourly points
2026-11-07T16:00 2009 1977 19.53 31.8
2026-11-07T20:00 2010 1977 19.61 31.9
2026-11-08T00:00 2035 1986 21.36 31.3
2026-11-08T04:00 2026 1995 21.47 31.1
2026-11-08T08:00 2020 1984 21.5 31.2
2026-11-08T12:00 2049 1955 21.25 31.4
2026-11-08T15:00 2054 1954 21.24 31.2

In 24 hours BNB gained 45 long accounts and lost 23 short accounts, while each side grew from $19.5 million to $21.2 million. One request took 0.19 seconds. Hourly summaries start on 7 June 2026 at 18:00 UTC. A window before that returns an empty page with no notice.

To chart it, add Plotly (pip install plotly) and plot the same 24 points. Keep the 100-largest split as its own line if you add it: its denominator is different.

import plotly.graph_objects as go

fig = go.Figure(go.Scatter(x=[d["snapshot_ts"] for d in h],
                           y=[d["long_count"] / d["short_count"] for d in h], mode="lines+markers"))
fig.update_layout(title="BNB long/short ratio by account, hourly",
                  yaxis_title="long accounts / short accounts")
fig.write_html("ratio.html")
print(len(h), "points, latest ratio", round(h[-1]["long_count"] / h[-1]["short_count"], 2))
24 points, latest ratio 1.02

That run was at 16:24 UTC on 9 November 2026, a day after the table above. It writes ratio.html, an interactive chart you can zoom.

Step 3: scan open interest and flow across every market

/positioning takes one parameter, window: 1h, 4h or 24h. It returns one record per listed perpetual with open interest and mark at the start and end of the window, taker buy and sell volume in USD, long and short liquidations, each market's typical move over windows of that length, and a state label. It does not carry account counts: for a ratio in every market, call the Step 1 route once per symbol. This ranks markets with at least $5 million of open interest by their 24-hour open interest change:

rows = requests.get(f"{B}/positioning", headers=H, params={"window": "24h"}, timeout=60).json()["data"]
out = []
for d in rows:
    if d["oi_start"] in (None, 0) or d["oi_end"] is None or d["mark_start"] is None:
        continue
    out.append({"sym": d["symbol"], "state": d["state"],
                "oi_usd": d["oi_end"] * d["mark_end"],          # open interest is in contracts
                "oi": d["oi_end"] / d["oi_start"] - 1,
                "px": d["mark_end"] / d["mark_start"] - 1,
                "flow": (d["buy_usd"] - d["sell_usd"]) / max(d["buy_usd"] + d["sell_usd"], 1)})
big = [o for o in out if o["oi_usd"] >= 5_000_000]
print("markets:", len(rows), "with OI >= $5M:", len(big))
print(f"{'sym':10}{'OI $M':>8}{'OI chg':>8}{'px chg':>8}{'flow':>7}  state")
for o in sorted(big, key=lambda o: -o["oi"])[:6]:
    print(f"{o['sym']:10}{o['oi_usd']/1e6:8.1f}{o['oi']*100:7.1f}%{o['px']*100:7.1f}%{o['flow']:7.2f}  {o['state']}")
markets: 179 with OI >= $5M: 61
sym          OI $M  OI chg  px chg   flow  state
BNB           42.5    8.1%    0.7%  -0.39  quiet
PONS           9.2    6.0%  -12.9%  -0.06  quiet
INJ            6.6    5.8%    0.6%  -0.04  quiet
ARB           14.9    5.0%    2.6%  -0.02  quiet
ETH         2219.1    2.3%    0.2%  -0.03  quiet
UNI           71.8    2.2%   -0.2%   0.11  quiet

Flow is buy minus sell over buy plus sell, so BNB's -0.39 means aggressive sellers dominated while open interest grew 8.1% on a flat price. That is why we opened BNB in Steps 1 and 2: new positions were being opened into selling, and the account counts show the crowd adding longs while the largest accounts held short.

Use the state label as a short list, not a ranking. On the 24-hour window 175 of 179 markets were quiet, including BNB. The other four were COMP and SYRUP (long-unwinding), SOPH (long-buildup) and SUPER (short-buildup). meta.as_of is the newest five-minute close at least four minutes old, so compare it before you diff two responses. HIP-3 markets have the same route at /v1/hyperliquid/hip3/positioning, which returned 168 records.

Step 4: list the accounts behind the numbers

/positions/{symbol} returns each open position with its account, size, entry, mark, value, unrealized PnL and margin type, largest first. Filter with side and min_value.

for side in ("long", "short"):
    for p in requests.get(f"{B}/positions/BNB", headers=H, timeout=30,
                          params={"side": side, "limit": 3}).json()["data"]:
        a = p["user_address"]
        print(side, a[:6] + ".." + a[-4:], p["size"], p["entry_price"],
              round(float(p["position_value"])), round(float(p["unrealized_pnl"])))
long 0xea00..a918 4098.429 787.235 2862507 -363920
long 0x07fd..689d 1780.924 713.225 1243869 -26331
long 0x645b..87b8 1709.036 747.337 1193659 -83567
short 0xc671..411d -2500 695.064 1746100 -8438
short 0x7d0c..1b28 -2157.685 698.3 1507014 -302
short 0x3640..3768 -1394.153 691.84 973732 -9201

The largest BNB long, 4,098 BNB entered at 787, was worth $2.9 million and down $364,000. Follow meta.next_cursor until has_more is false for the whole book: all 4,009 positions came back in 3 pages. Rebuilt from those rows, the counts were 2,056 long and 1,953 short, long value $21,247,221 and a top-ten share of 0.3124, matching the snapshot's meta.totals exactly. 80 positions were worth $100,000 or more and 6 were worth $1 million or more.

To follow one of these accounts and get alerts when it trades, see the whale tracker guide.

Side by side: Hyperliquid's API and 0xArchive

The same jobs, run on 8 November 2026:

JobHyperliquid's API (free)0xArchive
Open interest, funding and volume now, every marketmetaAndAssetCtxs: 1 request, 0.24 s/positioning: 1 request, 179 markets
Open interest change over 1, 4 or 24 hoursPoll and store it yourselfIn every record
Taker buy and sell volumeCandles carry volume, not sidebuy_usd and sell_usd per market
Accounts per side, average entry, top-account splitNo call. Market holder queries returned 422./positions/{symbol}/summary, hourly from 7 June 2026
Every holder of a marketclearinghouseState, one known address at a time4,009 BNB positions in 3 requests, 0.96 s

Use Hyperliquid's own API when you only need open interest, funding and volume right now. One free call covers every market, and it agreed with 0xArchive on BNB open interest within 8 contracts of 60,882. Use 0xArchive when you need change over a window, which side the flow came from, or the accounts themselves. Reading 4,009 known addresses through Hyperliquid's API would cost 8,018 weight, 6.7 minutes of one IP's budget, and the API cannot tell you which addresses to read. For the full comparison, see Hyperliquid's native API vs 0xArchive.

What to know before you build

  • Count accounts, never value. Value is equal on both sides of every perpetual market by construction.
  • Read the top-account split next to the crowd. In BNB the two disagreed, and that disagreement is the signal.
  • /positioning has no history. It describes the current window, and any parameter besides window returns 400. Store a response every five minutes to chart it, or use the hourly summaries for account history.
  • Nulls mean no reading. Open interest and mark are null, never 0, when a bucket has none. The typical_* fields are null for markets with under 288 windows of history.
  • Snapshots refresh every five minutes. A cursor belongs to one snapshot. An old one returns 409 snapshot_advanced, so restart without it. The route can return 503 upstream_unavailable with Retry-After while a snapshot is built.
  • Cost. /positioning is 1 credit per request. Position routes are 1 credit per 1,000 rows, at least 1 per request.
  • An address is an account, not a person. Do not publish one next to a claim about who owns it.

FAQ

How do I get the Hyperliquid long/short ratio?

Read /v1/hyperliquid/positions/{symbol}/summary and use long_short_account_ratio, or compare long_count with short_count. BNB was 1.05 at 16:03 UTC on 8 November 2026. Hyperliquid's own API has no call for it.

Do the largest Hyperliquid accounts lean the same way as the crowd?

Not always. At 16:03 UTC on 8 November 2026, all BNB accounts leaned long 1.05 to 1, while the 100 largest leaned short, 43 to 57. The summary route returns both splits on every snapshot.

Is this the same as the HYPE long/short ratio on other exchanges?

No. Hyperliquid is the exchange and HYPE is one token traded on it. A HYPE long/short ratio on another exchange covers that exchange's HYPE contract. This guide counts accounts on Hyperliquid, one market at a time: BTC, ETH, HYPE, BNB or any other listed perpetual.

Is a high long/short ratio bullish?

Not by itself. The ratio counts accounts, so a ratio above 1 says more accounts are long, not that more money is. Read it next to what the largest accounts hold and to open interest change, taker flow and liquidations, which the positioning route returns for every market in one request.

Why not use long value divided by short value?

In a perpetual market they are always equal, so the ratio is always 1. Count accounts instead.

Can I see which wallets hold a position on Hyperliquid?

Yes. Positions are public. Hyperliquid's API answers for one address you already know. 0xArchive lists every holder of a market, largest first.

Is there long/short ratio history?

Hourly, from 7 June 2026 at 18:00 UTC, on the summary route with start and end.

Next steps

Tested on 8 November 2026. The code is prototype code, and live numbers move by the minute.