Speed limits and errors
Per-plan request speed, the rate-limit headers, and every error code.
Speed limits
Every plan's requests-per-second limit, monthly request allowance and whether in-play odds (a fixture that has already started) are included. In-play odds start at Growth: on Free and Starter, the /live lists (/odds/live, /events/live,/props/live) and a started fixture asked for directly by its id are refused with the same upgrade response player props and history give. The lists without /livereturn only fixtures that have not started, on every plan. Enterprise's request volume and speed limit are set by contract.
| Plan | Requests / second | Requests / month | In-play odds |
|---|---|---|---|
| Free | 2 | 1,000 | no |
| Starter | 5 | 20,000 | no |
| Growth | 10 | 100,000 | yes |
| Scale | 15 | 500,000 | yes |
| Business | 20 | 5,000,000 | yes |
| Enterprise | 30 | By contract | yes |
A spent monthly allowance is a hard stop on every plan: further priced calls answer429 ALLOWANCE_SPENT until the month turns or the account moves up a plan. There is no overage billing.
Headers
Every response, including error responses, carries these. The one exception: x-requests-used and x-requests-remaining are left out when the call never reached your usage record, which means a rejected key or a 429 SPEED_LIMIT. Keep your last known values in that case.
| Header | Meaning |
|---|---|
X-RateLimit-Limit | This plan's speed limit, in requests per second. |
X-RateLimit-Remaining | Requests left in the current one-second window. |
X-RateLimit-Reset | Seconds until the speed-limit window resets. |
Retry-After | Seconds to wait before retrying on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE. |
x-requests-used | Requests used this billing period. |
x-requests-remaining | Requests remaining this billing period. |
x-requests-last | What this one call cost against the allowance (0 for a free call). |
X-Request-Id | This request's id, for support and for matching against `error.request_id`. |
Retry-After also accompanies 503 ODDS_UNAVAILABLE when built prices are not ready. Live-feed BAD_MESSAGE and BAD_SUBSCRIPTION replies use the feed error message shape; they do not close a usable connection. Eight consecutive malformed frames close with 1008.
Error codes
Every error is a normal HTTP status with a JSON body: { error: { code, message, docs_url, request_id } }. A 403 naming a required_plan also names your key's current_plan.
ALLOWANCE_SPENT
- The month's allowance is used up:
Monthly allowance of 100000 requests used. Resets 2026-10-01.
AMBIGUOUS_EVENT
Select a stored kickoff with storedCommenceTime.
BAD_REQUEST
commenceTimeFrom is not a valid ISO-8601 timestamp.
CONTACT_RATE_LIMITED
too many contact submissions; try again later
INTERNAL_ERROR
Something went wrong on our side. It has been logged.
INVALID_BOOKMAKER
Unknown bookmaker 'DraftKings'; did you mean draftkings? Valid keys are listed in error.valid_bookmakers.
INVALID_CURSOR
Cursor is invalid or belongs to different filters.
INVALID_KEY
- Key does not exist or was revoked:
API key is not valid.
INVALID_MARKET
Invalid markets: unknownInvalid markets: not_a_market
INVALID_PARAMETER
Use an ISO timestamp with timezone or Unix seconds.
INVALID_SESSION
- Session is expired or invalid:
Your session has expired. Sign in again.
INVALID_STORED_COMMENCE_TIME
Select an exact stored kickoff.
KEY_NOT_FOUND
No API key with that id on this account.
MISSING_KEY
- No X-API-Key header sent:
X-API-Key header is missing.
MISSING_SESSION
- No Authorization: Bearer header sent:
Sign in and try again.
PLAN_REQUIRED
Props require the Growth plan or above.In-play odds require the Growth plan or above.- History is not on this plan:
History requires the Scale plan or above. - This fixture is older than the plan's 2-year window:
The Scale plan covers fixtures that started in the last 2 years. This one started 2024-09-02; the Business plan covers everything recorded.
SPEED_LIMIT
- Too many requests this second (Retry-After is set):
Speed limit exceeded: 10 requests/second on the Growth plan. Speed limit exceeded: 10 requests/second on the Growth plan.Too many board requests; try again in a few seconds
UNKNOWN_EVENT
- No fixture with this id under this sport key:
Unknown fixture id for nfl: nfl:atlantafalcons-carolinapanthers:2026-09-27
UNKNOWN_SPORT
Unknown sport key: basketbal_nba- Sport key does not exist:
Unknown sport key: basketbal_nba
Feed and billing errors
Returned by the /v1/billing/* routes, which take a signed-in website session and never an API key. PAYMENT_DECLINED is a 402 and nothing was changed; PAYMENT_PAST_DUE means the last renewal failed, so update the card first; BILLING_BUSY is safe to retry shortly.
BAD_MESSAGE
Live feed: send a text JSON object of at most 65536 characters.
BAD_SUBSCRIPTION
Live feed: correct invalid sport, filter or format fields and subscribe again.
ALREADY_SUBSCRIBED
this account already has a subscription; change it instead
BILLING_BUSY
a billing change is already in progress; try againa payment is being checked; try again later
BILLING_NOT_CONFIGURED
billing is not configured on this deployment
CHECKOUT_LIMIT
too many billing requests; wait before trying again
NO_SUBSCRIPTION
this account has no subscription
PAYMENT_DECLINED
the card was declined; nothing was changed
PAYMENT_PAST_DUE
update your card before changing plan
Need help with an error? Contact us.