Errors
Consistent JSON error bodies. Production omits validation details.
HTTP status codes
401 unauthorized — missing/invalid API key 402 payment_required — subscription inactive 403 forbidden — key missing a required scope 403 plan_forbidden — your plan does not include this feature 404 not_found — player or match 409 duplicate_external_ref — match already ingested 409 slug_taken — roster slug already used 409 username_taken — that username is already registered 422 validation_error — bad input 422 unknown_participant — a match slot could not be resolved or is not readable by you 422 unknown_or_private_player — predict/pair cannot read that player 422 private_player — cannot roster another partner's private amateur 422 roster_too_large — pass a 4–16 player subset 429 rate_limit_exceeded — monthly request quota for your plan 503 service_unavailable — temporary outage
Example
{
"error": "plan_forbidden",
"message": "Your plan does not include this feature.",
"required_scopes": ["write:matches"],
"current_plan": "starter"
}Missing a scope the plan does include looks like this instead:
{
"error": "forbidden",
"message": "API key lacks required scopes.",
"required_scopes": ["write:matches"]
}