Rate limits & errors
Limits per plan
| Plan | Requests / min | Daily cap | WS connections |
|---|---|---|---|
| Developer | 60 | 1,000 | — |
| Starter | 200 | — | — |
| Live | 500 | — | 25 |
| Pro | 2,000 | — | 100 |
| Enterprise | Unlimited | — | Unlimited |
HTTP request limits are enforced per-minute via a sliding window. WebSocket traffic is not billed per-message; only concurrent connections are capped.
Response headers
Every REST response includes:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 42
When limited, the response is HTTP 429 with:
Retry-After: 35
Error codes
| HTTP | Code | Meaning |
|---|---|---|
| 400 | BAD_REQUEST | Malformed query / body |
| 401 | UNAUTHORIZED | Missing / invalid API key |
| 403 | FORBIDDEN | Plan tier doesn't include this endpoint |
| 404 | NOT_FOUND | Resource not found |
| 429 | RATE_LIMITED | Too many requests; see Retry-After |
| 429 | DAILY_CAP | Developer tier daily cap reached (resets at UTC midnight) |
| 403 | SPORT_NOT_IN_PLAN | Developer tier — sport not in the key's pick list, or sport is paid-only |
| 500 | INTERNAL | Something went wrong on our end |
Retry strategy
For 429 responses, respect the Retry-After header. For 5xx errors, retry with exponential backoff (e.g. 1s, 2s, 4s) up to 3 attempts. Do not retry 4xx errors other than 429.