bad_request | 400 | Malformed payload, unparseable JSON, schema violation outside Pydantic. | No, fix the request. |
validation_error | 422 | Pydantic / FastAPI request validation failure. | No, fix the request. |
unauthorized | 401 | Missing, expired, or invalid credentials. | No, refresh credentials and retry. |
forbidden | 403 | Authenticated but not authorised for this resource. | No, request access. |
email_not_verified | 403 | JWT user has not verified their email. | No, verify your email. |
not_found | 404 | Resource does not exist or is not visible to this tenant. | No. |
method_not_allowed | 405 | HTTP method not supported on this path. | No. |
idempotency_conflict | 409 | Duplicate Idempotency-Key with a conflicting request body. | No, change the key. |
payload_too_large | 413 | Request body or token count exceeds the configured cap. | No, send a smaller payload. |
unsupported_api_version | 400 / 410 | The Agnes-Version header is older than the minimum supported version. | No, upgrade your SDK or pin a newer version. |
rate_limit_exceeded | 429 | Tenant has exceeded its per-minute or per-month request budget. | Yes, after Retry-After seconds. |
billing_required | 402 | Subscription is past due or in a state that blocks API access. | After resolving billing. |
billing_grace_period | 402 / 403 | Subscription has lapsed but is still inside the grace period. | Yes, but renew before grace expires. |
analyzer_unavailable | 503 | A specific analyzer’s upstream is degraded. | Yes, after Retry-After. SDKs retry automatically. |
service_unavailable | 503 | Generic temporary unavailability. | Yes, with backoff. |
internal_error | 500 | Unexpected server-side failure. Operators are paged automatically. | Optional retry. Quote request_id. |