Skip to main content

Error Handling

Saturday uses one error format across all endpoints, modeled on Stripe’s error structure.

Error format

Error types

Branch on type for handling class, and on code for the specific case. A type can span more than one status.
A 404 carries one of two types. not_found_error means the URL itself found no endpoint (including endpoints not available to your key), always with code: "resource_not_found". resource_not_found as a type comes from an endpoint that could not find the thing you referenced, and its code narrows it: athlete_not_found, activity_not_found, key_not_found, webhook_not_found, conversation_not_found. Handle both types as the same case unless you need the distinction. A 429 carries type: "rate_limit_error" with code: "rate_limit_exceeded" or code: "rate_limited". Switching on type means using the values in the table above.
Safety ceilings do not surface as an error status. A prescription that runs into a guardrail returns 200 with the clamped values plus safety.warnings and safety.requires_human_review set. See Safety.

Retry logic

Exponential backoff

Retry-After is absent on some 429s, notably the daily call ceiling, so read it with a fallback rather than indexing it directly.

Request IDs

Every response carries an X-Request-Id header, and every error body repeats it as request_id. Quote it when reporting an issue and we can trace that exact request.

Error catalog

GET /v1/errors (no auth) lists the error codes for the features currently exposed to you.