Errors & Limits

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

Error envelope

{
  "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_credits402Not enough credits for the request
rate_limit_exceeded429Per-key per-minute limit hit — retry after 60s
validation_error400Malformed body or unsupported model for endpoint
content_policy422Prompt blocked by content policy
idempotency_conflict422Idempotency-Key reused with a different payload
idempotency_in_progress409A request with this Idempotency-Key is still running

Send Idempotency-Key (8–256 chars) on POSTs. Replays return the stored response. 402s include checkout_url.

Responses include X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. 429s include Retry-After.

Rate limits

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

Exceeded limits return 429 with rate_limit_exceeded.

Markdown