Skip to content

Errors

Consistent JSON error bodies. Production omits validation details.

HTTP status codes

cURL
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

cURL
{
  "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:

cURL
{
  "error": "forbidden",
  "message": "API key lacks required scopes.",
  "required_scopes": ["write:matches"]
}