ResourceGuide

Hyperliquid rate limits

Last updated: July 2026 · Hydromancer team

The official Hyperliquid API enforces three separate limit systems, and most rate-limit confusion comes from not knowing which one you hit: per-IP limits (a 1,200-weight-per-minute REST budget, 10 websocket connections, 10 unique users across user subscriptions), per-address limits (requests you literally earn by trading — 1 request per 1 USDC of volume), and congestion limits (block space allocated by maker share). On top of those sits a wall that isn't a rate limit at all: only the most recent 10,000 fills per address are retrievable, ever. This page explains each system with the actual numbers, then how a token-based provider changes the math.

System 1: per-IP limits

REST: a weight budget of 1,200 per minute

Every REST request costs weight against a 1,200-point-per-minute budget per IP:

  • Exchange (trading) requests cost 1 + floor(batch_length / 40). An unbatched order is 1 point; a batch of 79 orders is 2.
  • Cheap info requests cost 2 points: l2Book, allMids, clearinghouseState, orderStatus, spotClearinghouseState, exchangeStatus.
  • Most other info requests cost 20 points, and userRole costs 60.
  • History endpoints carry per-item surcharges. userFills, userFillsByTime, historicalOrders, fundingHistory, userFunding, recentTrades, and friends add 1 point per 20 items returned; candleSnapshot adds 1 per 60 items.
  • Explorer requests cost 40, with extra weight on blockList and on old, cold blocks — the official docs themselves say to use the S3 bucket for bulk instead. (Agreed. More on that below.)

The detail that actually hurts in production: reads and writes share the same budget. Info requests and exchange requests draw from one 1,200-point per-IP pool, so a data-hungry process starves your own order flow. Ten full-page userFills calls (120 points each: 20 base + 1 per 20 fills) consume the entire minute — and the next request from that IP gets throttled even if it's an order you badly need to place. You can exhaust your write allocation without writing anything.

Websocket: connection and subscription caps

Per IP: 10 connections, 30 new connections per minute, 1,000 total subscriptions, 2,000 messages sent per minute, 100 simultaneous inflight post messages — and the sleeper that breaks builder apps: a maximum of 10 unique users across all user-specific subscriptions. A dashboard tracking 50 wallets cannot exist on the official websocket, no matter how it shards connections from one IP.

EVM RPC

The public rpc.hyperliquid.xyz/evm endpoint allows 100 JSON-RPC requests per minute.

System 2: per-address limits (requests you earn by trading)

Trading actions — orders, cancels, modifies — are limited per address, not per IP, and the budget is cumulative: 1 request for every 1 USDC ever traded by that address, with a starting buffer of 10,000 requests. With 100 USDC average order size, you break even at a 1% fill rate. Run out, and the address is throttled to one request per 10 seconds.

Details that matter in production:

  • Cancels get extra headroom — the cancel budget is min(limit + 100,000, limit × 2), so a rate-limited account can still pull its open orders.
  • Batching doesn't help here. A batch of n orders counts as 1 request against the IP budget but n against the address budget.
  • This applies to actions only. Info requests never touch the address-based limit.
  • Open orders have their own cap: 1,000 per user, plus one per 5M USDC of volume, hard-capped at 5,000. Past 1,000 open orders, new reduce-only and trigger orders are rejected.

System 3: congestion limits (block space by maker share)

During high congestion, each address is limited to 2× its previous-day maker share of block space, computed once per UTC date and scaled the same way volume counts toward fee tiers (so HIP-3 assets in growth mode count less). Practical consequence: under load, don't resend cancels whose results already came back — you're spending scarce block space on no-ops.

The wall that isn't a rate limit: 10,000 fills

userFills and userFillsByTime paginate by recency in pages of up to 2,000 — and only the most recent 10,000 fills per address are retrievable at all. For an active trader that's days of history, sometimes hours. No amount of patience, batching, or IP rotation produces fill number 10,001. It's not a throughput limit; the data simply isn't served.

Where each limit actually bites

  • Wallet trackers and analytics dashboards hit the 10-unique-user websocket cap first, then the 10k fills wall.
  • Backfills and research hit the per-item weight surcharges, then the wall.
  • All-market consumers (every trade, every book) hit the 1,000-subscription cap — there is no official firehose.
  • Trading systems that poll their own data hit the read/write contention: every info request spends budget that order placement needs.
  • Market makers live inside the address-based and congestion systems, where request capacity is a function of volume and yesterday's maker share.

The token-based alternative

Hydromancer's limits attach to an API key, not an IP and not your trading volume. They're tiered (Starter / Growth / Scale), published in full in the docs, and sized for the workloads above:

Official Hyperliquid APIHydromancer
Limit basisPer IP + per address (volume-earned)Per API key, tiered
REST budget1,200 weight/min5,000 / 20,000 / 50,000 weight/min
userFills throughput~10 full-page calls/min500–5,000 calls/min (weight 10)
Historical fillsMost recent 10,000, recency-paginatedFull history, real time-range queries
WS connections1050 / 500 / 1,000
WS subscriptions1,000500 / 5,000 / 10,000
Unique users in user subs10Unlimited (userFills et al.); each address counts as one subscription
Books streamed concurrently10 / 50 / 100
All-market firehoseNot offeredAdd-on, $400/connection (trades / allFills with no coin filter)
Messages to server/min2,000300 / 3,000 / 6,000 *

* Lower on Starter by design: multi-coin and multi-address subscriptions mean one subscribe message does the work of dozens, so the message budget goes much further than the official one-coin-per-subscription model.

There's a second-order win hiding in the limit-basis row: reads move off your trading IP entirely. Every info request you send us is a point handed back to the official budget — which then does the only thing it must do: place and cancel orders.

To be clear about our side of the ledger: we have rate limits too, and we publish every number — default request weight is 2, heavier endpoints run 5–20 points, and the REST market-data endpoints (snapshots, l4Book) have a deliberately tight separate limiter (5 calls per 10 minutes; l4Book 10 per 5). You can't capacity-plan against “contact us,” so the full tables live in the docs, current as of today. Per-feed coin caps (e.g. l4BookUpdates up to 200 coins on Scale, tpslUpdates up to 200, bbo up to 200) are there too.

The requests you shouldn't be making at all

A chunk of rate-limit pain is polling for things that shouldn't be polled and backfilling through an API that was never meant for bulk:

Archive for the past, streams for the present, REST for point lookups. Most “rate limit problems” dissolve into that sentence.

FAQ

What is the Hyperliquid API rate limit?

1,200 weight per minute per IP for REST (most info requests cost 20 points plus per-item surcharges), plus per-address action limits earned at 1 request per 1 USDC traded, plus congestion-based block-space limits by maker share.

Do info requests and orders share the same rate limit?

On the official API, yes — reads and writes draw from the same 1,200-weight per-IP pool, so heavy polling throttles your own trading. (The separate address-based limit applies to actions only.) Moving reads to a provider hands that whole budget back to order flow.

How many websocket connections does Hyperliquid allow?

10 per IP, 30 new per minute, 1,000 subscriptions, 2,000 sent messages per minute — and at most 10 unique users across user-specific subscriptions.

Why am I rate limited when I'm barely sending requests?

Probably the address-based limit: trading actions are budgeted at 1 request per 1 USDC of cumulative volume, with a 10,000-request starting buffer. Exhausted addresses get one action per 10 seconds. Note this applies to actions, not info requests.

How do I get more than 10,000 historical fills for an address?

Not through the official API — that's a hard data-availability wall, not a rate limit. Use Reservoir (free S3 archive, complete history) or our userFillsByTime endpoint, which supports real time ranges with no fill cap.

Do batched orders help with rate limits?

Against the IP limit, yes — a batch of 79 orders costs 2 points instead of 79. Against the address-based limit, no — it still counts as 79 requests.

What are Hydromancer's rate limits?

Per-key, tiered: 5,000–50,000 REST weight/min, 50–1,000 websocket connections, 500–10,000 subscriptions, with per-feed coin caps published in the docs. Early-stage team? There's a program for that 🌱

If you're hitting a wall the official API won't move, the fix is usually one of three things: the archive, a stream, or a key. All three are a few minutes away — and if you're not sure which, describe the workload in Discord and we'll tell you straight, including when the official API is honestly enough.