Skip to main content
CID222 Docs

Error codes

What each machine-readable error code the gateway returns actually means, and the runbook that resolves it.

  • Version: 0.4
  • Role: admin_user
  • Type: troubleshooting

A CID error body carries a machine-readable code alongside its sentence. Clients key behaviour on the code and never on the text, because the text is rewritten and translated and the code is not. This page says what each of the sixteen codes means and where to go next.

The generated list — every code with its HTTP status, exception class and throw site — is the error codes reference. This page is the reading of it.

Note

A refusal with no code did not come from the licence guard, the setup guard or the role layer. Read the HTTP status and the response body instead, and start from A dashboard action fails.

The refusal family — 402, 403 and 423

These four decide whether the caller may act at all. They are deliberate refusals, not faults, and the dashboard renders several of them through the same generic failure toast — which is what makes them look like bugs.

CodeHTTPWhat it meansNext
SETUP_REQUIRED423First-boot setup has not completed. Every product route is locked; administration stays reachable so the wizard can be finished.The wizard loops
LICENSE_EXPIRED402Enforcement is on and no licence resolves as valid. Check the host clock before requesting a renewal — a drifting clock expires a valid licence.The licence has expired
FEATURE_NOT_LICENSED403The endpoint belongs to a module outside the installed tier. Entitlements resolve as the union of the features signed into the licence and the features of its tier, so a key added after the licence was signed still grandfathers in.402, 403 or 423
LIMIT_EXCEEDED403The licence's tenant or user limit is reached, so the account cannot be created.Licensing
Runbookaccess

The product refuses an action with 402, 403 or 423

You might see: READ_ONLY_ROLE · This is a read-only demo account (viewer role) — actions and changes are disabled. · ROLE_NOT_FOR_CHAT · FEATURE_NOT_LICENSED

Checks

  1. 1

    Read the machine-readable code in the error body, not the sentence

    expected · You can name the code.

  2. 2

    For a 423, check whether first-boot setup ever completed

    diagnostics · appliance.setupComplete = true

  3. 3

    For a 402, read the licence state

    diagnostics · appliance.license.state = "active|trial"

  4. 4

    For FEATURE_NOT_LICENSED, read which tier is installed and whether the feature is in it

    diagnostics · appliance.license.tier

  5. 5

    For a 403 naming a role, read what the account's role may do

    expected · The role holds the page or capability the action needs.

The read-only and role family

CodeHTTPWhat it meansNext
READ_ONLY_ROLE403The account holds the viewer role. It satisfies role checks on GET, HEAD and OPTIONS and is refused globally on everything that mutates. This is the demo account behaving correctly.Access control
READ_ONLY_ROLE_NO_SIGNED_MATERIAL403The same account asking to download signed licence material, which a read-only account never may.Access control
ROLE_NOT_FOR_CHAT403An audit role tried to use the chat. Auditors review the estate rather than adding traffic to it; use the dashboard.Chat and detections

The role-administration family

These come from editing the access model itself, not from using the product.

CodeHTTPWhat it meansNext
UNKNOWN_ROLE400The request named a role that does not exist.Correct the role name.
ROLE_NOT_RELEASED400The role exists but its capabilities are not enforced by the API yet, so an account holding it would be refused everywhere. The refusal is deliberate.Access control
SCOPE_NOT_ENABLED400Role assignments apply to the whole system in this release. Scoping one to a tenant or group is not enabled.Access control
INVALID_SCOPE400A scope was supplied in the wrong shape.Correct the request body.

Note

The capability model — 60 capabilities across 5 fixed roles — currently runs in shadow mode: it is computed, compared and enforces nothing. What enforces today is the shipped page matrix and the fixed roles. Do not plan access around capabilities until they leave shadow mode.

The concurrency family — 409

A 409 is almost always two people on the same screen, not a fault.

CodeHTTPWhat it meansNext
PAGE_ACCESS_STALE409Someone else changed page access while your screen was open. Reload, read their change, then save yours.A dashboard action fails
CAPABILITY_ACCESS_STALE409The same, for the capability table.A dashboard action fails
FINDING_ALREADY_OPEN409A compliance finding is already open for that detection; open the existing one rather than duplicating it.Compliance

The tenant-group family — 409

CodeHTTPWhat it meansNext
GROUP_NOT_EMPTY409The group still holds members or credentials. Move them before deleting it — deleting a group silently would move who can use which provider key.Tenant groups
GROUP_MAPPED_BY_SYNC_SCOPE409A directory sync scope targets this group. Re-point the scope or clear the mapping first, or the next sync fails on a group that no longer exists.Directory sync scopes
Runbookldap

A directory sync scope will not run, or imports the wrong people

You might see: Sync scope not found · This sync scope is disabled. Re-enable it before syncing. · Sync scope is mapped to a CID tenant group that no longer exists · Sync scope would assign a role which cannot be granted from a directory scope

Before you start

Checks

  1. 1

    Read the scope's state before anything else

    expected · The scope is enabled.

  2. 2

    Check the CID tenant group the scope maps into

    expected · The target group exists.

  3. 3

    Read the role the scope assigns

    expected · The role is one of those the message lists as allowed.

  4. 4

    Read the result counts of the last run

    expected · The run completed rather than reporting a partial answer.

Limits and known gaps

  • The registry does not exist yet. There is no consolidated common/error-codes.ts; the generated table is recovered by scanning the gateway's TypeScript for object literals carrying a code property. A code thrown in a shape the scan does not recognise is absent from both the table and this page.
  • Most gateway failures carry no code at all. Of the 638 user-visible messages in the catalogue, sixteen carry a code. For the rest, the status and the sentence are what you have — the message catalogue maps every one of them to a runbook or records why it needs none.

Last updated on

On this page

Download PDF