Platform
Errors
Errors are returned as a structured envelope with a machine-readable code.
Error envelope
Every non-2xx response carries a JSON body with an error object: a stable code, a human-readable message, and a request_id you can quote when contacting support.
JSON
{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests. Retry after the window in the Retry-After header.",
"request_id": "req_01h2x9k4m7q8"
}
}HTTP status codes
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | Malformed JSON, bad query values, or missing required parameters. |
| 401 | authentication_failed | Missing, malformed or revoked API key. |
| 403 | forbidden | Key is valid but not permitted for this sport or endpoint. |
| 404 | sport_not_found | Unknown sport key. |
| 404 | event_not_found | Unknown event ID. |
| 422 | market_not_supported | The market key is not offered for this sport. |
| 429 | rate_limit_exceeded | Request rate exceeded. Honor Retry-After. |
| 500 | internal_error | Unexpected server error. Retry with backoff. |
| 503 | upstream_unavailable | One or more bookmaker feeds are unreachable. |
NOTEMatch on
code, not the HTTP status alone: two different 404s (sport_not_found vs event_not_found) mean different things to a caller.Retrying
Retry 429 only after Retry-After. For 500 and 503, retry with exponential backoff starting at 1 second, doubling up to 30 seconds, and cap total retries at 5.