Error Codes
Every error response follows the same JSON shape, with an HTTP status code and a machine-readable error field for programmatic handling.
Error shape
{
"error": "rate_limited",
"message": "Rate limit exceeded for plan 'free'. Upgrade for higher limits.",
"retry_after_seconds": 60
}Status codes
400
bad_requestMalformed request body — missing or invalid fields.
401
unauthorizedMissing, invalid, or revoked API key / JWT.
403
forbiddenValid credentials, but not permitted for this action or role.
404
not_foundThe session, org, or resource doesn't exist.
429
rate_limitedRequests-per-minute cap exceeded for your plan. See Retry-After header.
429
quota_exceededMonthly session quota exceeded for your plan — distinct from rate limiting. Enforced at ingestion (POST /v1/ingest) only, not on read endpoints.
500
internal_errorUnexpected server-side failure. Safe to retry with backoff.
⚠️
rate_limited and quota_exceeded are both HTTP 429 but mean different things — see Rate Limits for the distinction and how to handle each.