Rate limits are enforced per API key based on your subscription tier. Exceeding your limit returns aDocumentation Index
Fetch the complete documentation index at: https://docs.backquant.com/llms.txt
Use this file to discover all available pages before exploring further.
429 response with the
RATE_LIMIT_EXCEEDED error code and a Retry-After header.
Limits by tier
| Tier | Requests per minute | Annual savings |
|---|---|---|
| Monthly | 60 | — |
| Yearly | 120 | ~15% off monthly × 12 |
| Enterprise | Unlimited | Custom |
Rate limit headers
Every response — success or error — includes:| Header | Description |
|---|---|
X-RateLimit-Limit | Your per-minute cap |
X-RateLimit-Remaining | Calls left in the current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds until safe to retry (on 429 only) |
meta.rate_limit in the response
body, so browser-based dashboards can read it without inspecting
headers.
What happens at the limit
-
The 121st request in a minute (on the Yearly tier) returns:
-
HTTP status is
429. -
Retry-After: 32header tells you exactly how long to wait. -
X-RateLimit-Remaining: 0confirms you’re out for the window.
Strategy: how to think about throttling
Cache aggressively at your end. The data refreshes every 30s server-side anyway. If you’re showing GEX levels in a dashboard, polling once every 30 seconds (= 2 req/min per panel) gives you the freshest possible data without burning quota. Polling every second is wasted — you’d see the samecomputed_at 30 times in a row.
Use multi-symbol bundling. Hitting
/v2/multi/gex/levels once for all four
symbols counts as one request, not four. For desk dashboards
watching the universe, this is the difference between 240/min (4
symbols × 60s) and 60/min on the Monthly tier.
Use composable ?include=. /v2/gex/levels?include=ranked,max_pain, expected_move,zones returns four blocks of data in one request that
would otherwise take four separate calls.
Project payloads with ?fields and ?include. Heavy endpoints
like /v2/options/chain support both top-level (?fields=contracts)
and per-row (?include=oi,iv) projection. Lighter responses = faster
parsing client-side and lower egress on our side.
Implement exponential backoff on 429. Wait Retry-After seconds,
then if you 429 again, wait 2× as long. Don’t hammer.
X-RateLimit-Remaining. When it drops below ~10% of your
limit, throttle yourself rather than waiting for a 429. Better to slow
down voluntarily than to handle errors after the fact.
Endpoint cost notes
Most endpoints are pure cache reads (~1ms server-side). A handful do on-the-fly computation:/v2/options/chainwith novel filter combos — first call computes, subsequent calls (same filters) hit a 30s cache/v2/gex/max-pain?expiry=all— computes per-expiry max-pain across the chain, cached 30s/v2/options/greeks/{greek}?dte_max=N— recomputes from raw chain for the DTE-filtered slice, cached 30s/v2/options/greeks/3d/surface— strike × expiry matrix per greek, cached 30s
Need more throughput?
If 120 req/min isn’t enough — typically when you’re powering a paid product downstream, or running >100 concurrent dashboards — contact dev@backquant.com about Enterprise. Enterprise removes the per-minute limit and includes:- Dedicated capacity
- Custom symbol additions (e.g. SUI, AVAX)
- Historical bulk export (CSV / Parquet)
- SLA + priority support
See also
Errors
Full error code list with recommended retry strategies.
Multi-symbol bundle
The cheapest way to watch the universe.
Data freshness
Why polling faster than 30s wastes quota.
