Skip to content

Error reference

All error responses follow a standard JSON envelope with a detail field.

Error envelope

json
{ "detail": "Human-readable error message" }

For validation errors (FastAPI 422), the response body contains an array:

json
{
  "detail": [
    {
      "loc": ["path", "language"],
      "msg": "field required",
      "type": "value_error.missing"
    }
  ]
}

HTTP status codes

StatusNameWhen it occurs
200 OKSuccessRequest processed successfully
401 UnauthorizedInvalid API keyKey missing, malformed, or revoked
403 ForbiddenWrong projectKey is valid but belongs to a different project
404 Not FoundResource not foundLanguage, group, or key doesn't exist
402 Payment RequiredPlan limit reachedProject/key/language limit or monthly translation-unit quota exceeded
422 Unprocessable EntityValidation errorPath or query parameter validation failed
429 Too Many RequestsRate limit exceededDaily quota exhausted (beyond grace zone)
500 Internal Server ErrorServer errorUnexpected error; safe to retry once
503 Service UnavailableDependency failureDB or Redis unreachable

401 Unauthorized

json
{ "detail": "Invalid API key" }

Common causes:

  • X-API-Key header missing or misspelled
  • Key was revoked in the portal
  • Key copied with leading/trailing whitespace

404 Not Found

json
{ "detail": "Translation not found" }

Common causes:

  • Language code doesn't match any published language (check /v1/manifest)
  • Group or key doesn't exist, or it exists but is in draft status (not approved)
  • S3 cache hasn't been rebuilt yet after adding a new language

402 Payment Required

Two distinct causes share this status code:

Plan limit reached (projects, keys per project, or languages per project) — thrown by the portal API when creating a resource would exceed your plan's limits:

json
{ "detail": "Project limit reached for your plan" }

Monthly translation-unit quota exceeded — thrown by POST /cli/sync and the portal's AI-translate endpoints once you've used up to 2x your plan's monthly quota:

json
{
  "detail": {
    "code": "QUOTA_EXCEEDED",
    "used": 42000,
    "limit": 20000,
    "reset_date": "2026-09-01",
    "upgrade_url": "https://app.i18nme.com/billing"
  }
}

Translation memory hits (unchanged strings) never count against quota — see the CLI guide for how sync diffs against what's already been translated. Resolution: upgrade your plan, or wait for the quota to reset at the start of your next billing cycle.


429 Too Many Requests

json
{ "detail": "Rate limit exceeded: 11100/10000 requests today" }

Response headers:

HeaderExample valueDescription
Retry-After86400Seconds until midnight UTC reset
X-RateLimit-Limit10000Your plan's daily limit

Resolution: Switch to cached endpoints to share quota more efficiently, or upgrade your plan.


503 Service Unavailable

json
{ "status": "degraded", "db": "error", "redis": "ok" }

This is only returned from the /health endpoint. All other endpoints return 500 when a dependency is degraded.


Retry guidance

StatusRetry?How
401NoFix the API key
403NoCheck you're using the right key for this project
404NoCheck key/group/language exists and is approved
429After resetUse Retry-After header to know when
500Yes, onceWait 1–2 s, then retry once
503Yes, with backoffExponential backoff, 3 attempts

i18nme is provided on a best-effort basis. While we strive for reliability and rapid issue resolution, no specific uptime, response time, or bug-fix timeframe is guaranteed.
Translation content and AI-generated output should be reviewed before production use.