Keyword → Blog API

Reference

Error codes

Every non-2xx response (and any failed job) uses the same ErrorResponseV1 shape with one of the codes below.

CodeHTTP statusMeaning
AUTH_MISSING401No Authorization header was provided.
AUTH_INVALID401The API key is malformed, unrecognized, or revoked.
SCOPE_INSUFFICIENT403The API key is valid but lacks a required scope.
QUOTA_EXCEEDED429The plan's monthly word or request quota has been reached.
RATE_LIMITED429The plan's requests-per-minute or requests-per-day limit was exceeded.
VALIDATION_ERROR400The request body failed schema or constraint validation.
PROHIBITED_INPUT422Input matched a prohibited-content filter and was rejected.
JOB_NOT_FOUND404No job exists with the given jobId for this account.
JOB_FAILED200The job record itself reports status: failed (not an HTTP error).
CONTENT_QUALITY_FAILED422Every 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_FAILED422For 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_ERROR500An 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"
      ]
    }
  }
}