Reference
Error codes
Every non-2xx response (and any failed job) uses the same ErrorResponseV1 shape with one of the codes below.
| Code | HTTP status | Meaning |
|---|---|---|
| AUTH_MISSING | 401 | No Authorization header was provided. |
| AUTH_INVALID | 401 | The API key is malformed, unrecognized, or revoked. |
| SCOPE_INSUFFICIENT | 403 | The API key is valid but lacks a required scope. |
| QUOTA_EXCEEDED | 429 | The plan's monthly word or request quota has been reached. |
| RATE_LIMITED | 429 | The plan's requests-per-minute or requests-per-day limit was exceeded. |
| VALIDATION_ERROR | 400 | The request body failed schema or constraint validation. |
| PROHIBITED_INPUT | 422 | Input matched a prohibited-content filter and was rejected. |
| JOB_NOT_FOUND | 404 | No job exists with the given jobId for this account. |
| JOB_FAILED | 200 | The job record itself reports status: failed (not an HTTP error). |
| CONTENT_QUALITY_FAILED | 422 | Every generation is validated and, if needed, automatically revised by the content quality pipeline before being returned. This means the pipeline could not produce content clearing the quality bar within the configured revision limit. |
| SOURCE_VALIDATION_FAILED | 422 | For a freshness-sensitive topic, no sufficient, fresh (within 7 days), relevant, and verifiable source material could be found across all configured news providers after 3 retrieval attempts. The model was never called for this request — see the content quality pipeline docs. |
| INTERNAL_ERROR | 500 | An unexpected server error occurred. |
Example: auth missing
401
{
"error": {
"code": "AUTH_MISSING",
"message": "No Authorization header was provided.",
"requestId": "req_5c6d7e8f90"
}
}Example: auth invalid
401
{
"error": {
"code": "AUTH_INVALID",
"message": "The provided API key is not recognized or has been revoked.",
"requestId": "req_a1b2c3d4e5"
}
}Example: quota exceeded
429
{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "Monthly word quota exceeded for plan 'growth'. Upgrade your plan or wait for the next billing period.",
"requestId": "req_f6e5d4c3b2",
"details": {
"monthlyWords": 200000,
"consumedWords": 200000,
"periodEnd": "2026-10-01T00:00:00.000Z"
}
}
}Example: rate limited
429
{
"error": {
"code": "RATE_LIMITED",
"message": "Too many requests. Limit is 15 requests per minute on the 'growth' plan.",
"requestId": "req_11223344aa",
"details": {
"requestsPerMinute": 15,
"retryAfterSeconds": 12
}
}
}Example: validation error
Request exceeded the plan’s max words per request:
400
{
"error": {
"code": "VALIDATION_ERROR",
"message": "constraints.maxWords exceeds the plan limit of 2000 words per request.",
"requestId": "req_99887766bb",
"details": {
"field": "constraints.maxWords",
"maxAllowed": 2000,
"received": 5000
}
}
}Example: prohibited input
422
{
"error": {
"code": "PROHIBITED_INPUT",
"message": "Request content matched a prohibited-input filter and was rejected before generation.",
"requestId": "req_55443322cc",
"details": {
"field": "topic"
}
}
}Example: generation failure
500
{
"error": {
"code": "INTERNAL_ERROR",
"message": "Content generation is temporarily unavailable. Please try again shortly.",
"requestId": "req_33221100dd"
}
}Example: content quality failed
details.failedCheckCodes lists which internal quality checks were still failing when the revision limit was reached — see the content quality pipeline.
422
{
"error": {
"code": "CONTENT_QUALITY_FAILED",
"message": "Generated content did not meet the required quality standard after automatic revision.",
"requestId": "req_77889900ee",
"details": {
"revisionCount": 2,
"overallScore": 61,
"failedCheckCodes": [
"LOW_EXPERT_DEPTH",
"KEYWORD_STUFFING"
]
}
}
}