Getting started

Errors

Errors return a real HTTP status and { error: { code, message } }. Branch on error.code, never on the message text.

HTTP/1.1 404
{ "error": { "code": "not_found", "message": "resource not found" } }
StatusCodeMeaning
400bad_requestinvalid id, unknown sport, missing or invalid date, season, round or query, invalid type or page (the message names the allowed values)
401unauthorizedmissing, invalid or revoked API key
403ws_not_availablestream ticket requested on a plan without WebSocket access
403origin_not_alloweda widget key used from a site its list does not include (or without an Origin header — widget keys are for browsers)
403ip_not_allowedthe call came from an address outside your account’s IP allowlist (Business; set in the dashboard — an empty list allows every address); not counted against the quota
403endpoint_not_in_planthe endpoint is outside your key’s plan: the premium endpoints (win probability, AI commentary, match and player analytics — marked Pro + Business) on Free and Starter
403history_not_in_planthe fixture, race, day or season is older than your plan’s history (Free 7 days, Starter 30 days, Pro 12 months, Business no limit); historyFrom in the error is the first day you can read
404not_foundno such resource (an id we never issued, an unknown ranking type, a session or season of another race or series, or a route that does not exist)
404no_datathe ids are ours but the source has no such data: standings, team / player season statistics, the player-statistics explorer, a league’s or series’ seasons (since 2026-10-23; not_found before)
404not_supportedwin probability or AI commentary of a fixture that is not football; the player-statistics explorer of a league that is not football
429rate_limitedper-minute rate exceeded — wait Retry-After seconds
429quota_exceededrequest quota used up — per UTC month on Starter, Pro and Business (resets 00:00 UTC on the 1st), per UTC day on Free (resets 00:00 UTC); the message names the period and the reset time, Retry-After gives the seconds until the reset
500internal_errorour fault; safe to retry (the message is always generic)
503upstream_unavailabledata temporarily unavailable; retry after the Retry-After seconds (503 since 2026-10-27 — it was 502, which Cloudflare replaced with its own page, so the JSON never arrived)