DOCS
Limits & errors
What counts against you, what doesn't, and how errors are shaped.
Streaming limits
- Messages are unlimited on all paid plans — there are no per-tick fees or overage charges.
- Connections: up to 5 concurrent WebSocket connections per key. Need more? Ask us.
- Symbols: subscribe to as many symbols as you like on a single connection.
REST rate limits
There is currently no hard per-key REST rate limit, and no X-RateLimit-*
headers. This page used to publish 60 requests/minute with those headers; a customer
asked us to confirm it on 17 August 2026 and it turned out to be documentation for something
that was never built. We would rather correct the page than let you design a backoff around a
number that does not exist.
What is actually true today:
- Live connections are capped, not requests. Your package's connection count is the real limit — see your plan on pricing.
- Deep options and historical-GEX queries are the expensive ones. They fan out to our options source, which has its own concurrency ceiling; we absorb that server-side with backoff, so a burst gets slower rather than rejected.
- Please still be reasonable. REST is for snapshots and backfill — stream what you need continuously over the WebSocket instead of polling
/quotein a tight loop. If we ever do need a hard limit, it will be published here first, with the headers to match.
Error shape
All errors share the same JSON envelope with a stable code:
{
"error": {
"code": "plan_required",
"message": "'trade_quote' needs the Options Pro package",
"status": 403
}
} Status codes
| Status | Code | Meaning |
|---|---|---|
400 | bad_request | Malformed parameters (e.g. bad date range). |
401 | unauthorized | Missing or invalid API key. |
402 | no_subscription | No active subscription for live data. |
403 | plan_required | Your packages don't include this feed or symbol. The message names what would. |
404 | unknown_symbol | Symbol not found — see symbols. |
429 | rate_limited | Too many REST requests — back off. |
5xx | internal | Our fault. Retry with backoff; we're paged. |
tip
The SDKs raise typed exceptions/errors carrying the code, so you can branch on it without parsing strings.