Skip to content

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.

PlanRequests / secondRequests / monthIn-play odds
Free21,000no
Starter520,000no
Growth10100,000yes
Scale15500,000yes
Business205,000,000yes
Enterprise30By contractyes

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.

HeaderMeaning
X-RateLimit-LimitThis plan's speed limit, in requests per second.
X-RateLimit-RemainingRequests left in the current one-second window.
X-RateLimit-ResetSeconds until the speed-limit window resets.
Retry-AfterSeconds to wait before retrying on 429 SPEED_LIMIT or 503 ODDS_UNAVAILABLE.
x-requests-usedRequests used this billing period.
x-requests-remainingRequests remaining this billing period.
x-requests-lastWhat this one call cost against the allowance (0 for a free call).
X-Request-IdThis 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

CONTACT_UNAVAILABLE

  • contact submissions are temporarily unavailable; try again

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: unknown
  • Invalid 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.

ODDS_UNAVAILABLE

  • No built prices are available yet.

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 again
  • a payment is being checked; try again later

BILLING_NOT_CONFIGURED

  • billing is not configured on this deployment

BILLING_UNAVAILABLE

  • could not reach the billing provider; try again

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.