Errors & rate limits
Error response
All error responses use this JSON shape:
{
"error": {
"type": "authentication_error",
"code": "invalid_auth",
"message": "Human-readable explanation.",
"request_id": "unique-id-for-support"
}
}Common type values:
type | HTTP | Meaning |
|---|---|---|
invalid_request | 400 | Malformed input |
authentication_error | 401 | Missing/invalid Bearer token |
permission_error | 403 | Forbidden or insufficient scope |
not_found | 404 | Resource missing |
conflict_error | 409 | Conflict (e.g. idempotency) |
validation_error | 422 | Validation failed |
rate_limit_error | 429 | Too many requests |
billing_error | 402 | Billing / entitlement |
internal_error | 500 | Unexpected server error |
Include request_id when contacting support.
Rate limiting
When Upstash Redis is configured:
| Auth | Window | Limit |
|---|---|---|
| Session JWT | 1 minute | ~100 requests |
| API key | 1 minute | ~60 requests |
If Redis env vars are not set, limits may be disabled in development.
Response 429
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too many requests. Please try again later.",
"request_id": "req_01abc..."
}
}