Skip to main content
Every error response follows the same JSON shape:
Handle this shape in your client — the HTTP status code tells you the category, the error field tells you the exact reason, and message is safe to surface to end users (no stack traces, no internal info).

HTTP status codes

Error codes

Authentication

Billing

Validation

Resources

Runtime

Handling errors in code

Debugging failed runs

Capture the run_id and task_id from any response (successful or not) and include them on support tickets — they’re the fastest way for us to pull the matching ledger / trace rows on our side. For terminal failed states on async tasks, the error field on GET /tasks/{task_id} carries the structured failure:

Rate limits

Every response includes rate-limit headers:
And on 429:
Limits are per API key, per minute. Tiers: Rate limiting kicks in at the gateway, before any agent / pool work. It’s effectively free to hit rate limits (no credits deducted).