Errors
The API uses standard HTTP status codes. Error responses have a JSON body with a
short, stable machine-readable code in detail:
{ "detail": "insufficient_scope:data:write:articles" }
Check the HTTP status first, then branch on detail for specifics. The codes
are stable strings you can match on.
Status codes
| Status | Meaning |
|---|---|
200 |
Success |
201 |
Created |
202 |
Accepted — queued for background processing (e.g. a message send or a channel sync) |
400 |
Bad request — a value was invalid or a required field was missing |
401 |
Not authenticated — missing, malformed, or revoked key |
403 |
Authenticated, but not allowed — missing scope or permission |
404 |
Not found — unknown resource, id, or an object not in your entity |
405 |
The operation isn't available for this resource |
409 |
Conflict — a uniqueness rule was violated (e.g. duplicate slug) |
422 |
The request was understood but could not be processed |
429 |
Rate limit exceeded (see Rate limits) |
Common error codes
Authentication (401)
missing_bearer_token— noAuthorization: Bearer …header.invalid_token— the token isn't a Zingasuite key.invalid_or_revoked_key— the key is unknown, revoked, or expired.
Authorization (403)
insufficient_scope:<scope>— the key lacks a required scope, e.g.
insufficient_scope:data:write:articles.permission_denied:<op>:<model>— the key's owner can't perform this
operation on this object type, e.g.permission_denied:update:solve:articles.app_not_in_key_scope:solve— the key is confined to other apps.membership_revoked— the key owner is no longer an active member of the
entity.
Requests (400 / 404 / 405 / 409 / 422)
space_not_found/collection_not_found/article_not_found/
ticket_not_found/domain_not_found/faq_not_found— no such row in your
workspace (a404, also returned for a malformed id).parent_not_found— theparentIdchapter is missing or in another space.slug_taken— a space, chapter or article already uses that slug in its scope
(409).invalid_slug— the slug had no usable characters.invalid_visibility/invalid_status/invalid_priority— a value outside
the allowed set for that field.locale_not_enabled— you published a locale that the space doesn't enable;
add it to the space'senabledLocalesfirst.no_conversation— you replied to a ticket that has no chat thread; add a note
instead.
Because codes are stable, you can build reliable handling — for example, treat
any insufficient_scope:* as "widen this key's scopes", 409 slug_taken as
"already exists, publish into it", and 400 locale_not_enabled as "enable the
language on the space first".