API

Limits and errors

AI rate limits, validation rules, the error response shape, and every error code you can hit.

Not verified yet

Rate limits

Requests that start AI translation share one budget: the manual translation endpoint, single-cell recommendations, batch auto-translate, and adding a term or finishing an import with translate automatically on. Each request counts once, however many cells it translates. Adding terms or importing without automatic translation doesn't count. Sync jobs aren't rate-limited; the billing gate below applies to them.

LimitValue
Per organization200 AI requests per hour
Per user50 AI requests per hour

Both must pass; exceeding either returns 429 TOO_MANY_REQUESTS. The window is rolling — wait and retry.

Public-API translation reads are not rate-limited this way; they're metered as API usage for billing. See Platform → Limits for platform-wide quotas and where to see your current usage.

Billing gate

While your organization is blocked over unpaid invoices, these are refused with 402 ORG_BLOCKED: creating a namespace or an API key, starting a sync, and every request that starts AI translation (the ones listed under rate limits above). A sync that was already accepted keeps pushing your strings but skips AI translation and lists that in its failures. Reads and other edits keep working. See Platform → Billing → Dunning.

Validation rules

FieldRule
Namespace nameLetters, digits, hyphens, underscores (^[a-zA-Z0-9\-_]+$); unique per organization; case-sensitive.
Custom language codeStarts with a lowercase letter; lowercase letters, digits, hyphens, underscores; 1–32 chars; unique per organization; immutable.
Custom language name1–128 characters.
Term markNon-empty; unique per namespace.
Glossary item value / translationNon-empty after trimming.
Custom prompt name / textNon-empty.

Error response shape

Every error is JSON with two fields:

{
  "type": "INVALID_PAYLOAD",
  "msg": "The payload is invalid."
}

type is stable and meant for your code; msg is human-readable detail that may change.

Error codes

HTTPtypeMeaning
400INVALID_PAYLOAD / INVALID_REQUESTMalformed body or parameters — msg says what.
400INVALID_NAMEA name field fails its validation rule (see above).
400NO_TRANSLATION_SOURCEAI translation requested for a term that has no non-empty value in any language — fill in the source first.
400EMPTY_VALUEA required value was empty.
401INVALID_TOKENSession token missing, malformed, or expired.
401UNAUTHORIZEDAPI key missing, revoked, or unrecognised; or the namespace isn't accessible.
402ORG_BLOCKEDOrganization blocked for unpaid invoices.
403FORBIDDEN / INSUFFICIENT_PERMISSIONSAuthenticated, but you lack permission — including reading someone else's private custom prompt or a resource in another organization.
404NOT_FOUNDThe resource doesn't exist — including a glossary that hasn't been created yet.
409CONFLICTDuplicate: namespace name, term mark, custom language code, second glossary — or deleting a custom language still attached to a namespace.
429TOO_MANY_REQUESTSAI rate limit exceeded (see above).
500INTERNAL_SERVER_ERRORUnexpected server error — safe to retry with backoff.

Behaviour during platform incidents

Live status: status.norcube.com. Reads are prioritised during degradation; background work (batch translation, sync jobs, imports) is resumable by design and picks up where it left off — see Sync jobs.

On this page