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
REST is intended for snapshots and backfill, so it's rate-limited per key:
| Endpoint | Limit |
|---|---|
/quote, /symbols, /options | 60 requests / minute |
/ticks (backfill) | 20 requests / minute |
Every response includes X-RateLimit-Remaining and X-RateLimit-Reset headers. Exceeding a limit returns 429 — back off and retry after the reset.
Error shape
All errors share the same JSON envelope with a stable code:
{
"error": {
"code": "plan_required",
"message": "Options data requires the Pro plan.",
"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 plan doesn't include this feed/symbol. |
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.