Errors & limits

All errors use a consistent JSON envelope with a machine-readable code and request_id for support.

Error envelope

Error response
{
  "error": {
    "code": "insufficient_credits",
    "message": "Insufficient credits",
    "request_id": "uuid"
  }
}

Error codes

CodeStatusMeaning
unauthorized401Missing Authorization header
invalid_key401Key does not start with oo_live_
key_not_found401Revoked or unknown API key
org_inactive403Organization suspended or closed
scope_denied403Key lacks the required scope
model_not_allowed403Model outside your plan or key allowlist
insufficient_credits402Org pool cannot cover the request
rate_limit_exceeded429Per-key per-minute limit hit — retry after 60s
validation_error400Malformed body or unsupported model for endpoint
internal_error500Unexpected server error — include request_id with support

Rate limits

Limits are enforced per API key per rolling minute. Exceeded limits return HTTP 429 with rate_limit_exceeded.

TierLimit
standard60 requests / minute / key
elevated300 requests / minute / key

Request IDs

Every successful response includes request_id; errors include it in the error object. Log these when contacting support or correlating with usage reporting.