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 — no Authorization: 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 (a 404, also returned for a malformed id).
  • parent_not_found — the parentId chapter 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's enabledLocales first.
  • 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".

Was this helpful?