Skip to main content
CID222 Docs

License

Read the appliance's licence state, tier, expiry and warnings, understand what a lapse blocks, and install a renewal without leaving the dashboard.

  • Version: 0.4
  • Role: admin_user
  • Type: task

License is where the appliance states what it is entitled to run, until when, and what it will do when that lapses. The page works offline, it works on an expired licence, and it is deliberately never blocked — the page that fixes a licensing problem can never be hidden by one.

What do I need?

Licence
Any
Role
admin_user

Prerequisites

  • You sign in with a role that reaches the page — superadmin, admin_user, or the read-only viewer.
  • The appliance host clock is correct and disciplined by NTP. Licence validity is bounded by dates, and a clock that moves backwards invalidates a good licence.
  • For an activation or a renewal, a path to your CID222 contact from any machine — the appliance itself needs none.

Read the page

Open the licence page

Select License in the navigation.

The page reads This appliance runs under a signed, time-limited license. Renewals are installed here — works fully offline. Four tiles summarise the state; the page refreshes itself every 30 seconds.

Read the state badge

Read the License state tile.

It shows one of Valid, Expiring soon, Expired — grace period, Expired, Trial, Trial expired, Invalid, or Licensing not active (dev). Under it the tile names what the state is bound to: the installation id, or the date a trial must be activated by.

Read the tier and the expiry

Read Tier and Expires.

Tier names your package and the licence id and customer it was issued to. Expires counts the days remaining, and turns amber inside 30 days.

Read the fourth tile

Read Accounts, or Capabilities where the licence carries no seat cap.

Accounts shows active accounts against the licensed seat cap and warns when the cap is reached. Capabilities counts how many of the product's capabilities this tier enables.

Read the warnings

Read the Warnings tile if it is present.

Each line is the appliance's own sentence about something it noticed — a self-generated installation identity, a clock rollback, a licence file it could not read, a licensed capability whose service is not running.

What the states mean

BadgeStateWhat the product does
TrialtrialA built-in 30-day trial from first boot, at the Starter capability set. Fully usable.
ValidvalidNormal operation.
Expiring soonexpiringNormal operation, inside the last 30 days.
Expired — grace periodgraceNormal operation, past expiry but inside the grace period the licence file itself names.
ExpiredexpiredProduct routes answer 402 LICENSE_EXPIRED.
Trial expiredtrial_expiredThe same, with the trial elapsed and no licence installed.
InvalidinvalidNothing verifiable: no trust anchor, a wrong installation, a bad signature, or the host clock moved backwards. Product routes answer 402.
Licensing not active (dev)disabledNo trust anchor is installed and enforcement is not required. Nothing is blocked.

Each transition into expiring, grace, expired or trial-expired writes an event — LICENSE_EXPIRING, LICENSE_GRACE, LICENSE_EXPIRED, LICENSE_TRIAL_EXPIRED — so a lapse can be alerted on in your SIEM rather than discovered by someone opening this page.

What a lapse actually blocks

A 402 is narrow by design. It blocks the product paths — chat, guardrails, gateway API-key validation, the inline-proxy inspection intake, image analysis, document analysis, and posting a message into a session — and leaves everything else working. Sign-in, the dashboard, the whole administrative surface, this page and the upload on it are never blocked, so an appliance can always be re-licensed without a rescue procedure.

The body is explicit about the remedy:

{
  "statusCode": 402,
  "code": "LICENSE_EXPIRED",
  "state": "expired",
  "message": "CID license is expired or invalid. An administrator can install a renewal in the dashboard under Settings → License."
}

In the dashboard the same condition raises one banner: This appliance's licence has expired — chat, the proxy and inspection are blocked. An administrator can install a renewal under Settings → License.

Danger

Release images ship with licence enforcement switched on (CID_REQUIRE_LICENSE). On such an appliance a missing trust anchor is not a permissive state — it fails closed, and the warnings tile says so.

Capabilities and grandfathering

The licence file carries a tier, and the tier carries a capability set. The appliance grants the union of the capabilities named in the file and the capabilities of its tier. A capability added to the product after your licence was signed therefore works without a re-issue, and the page says so in its own words under Capabilities: a licence keeps every capability its tier includes, including ones added after it was issued.

An endpoint outside your package answers 403 FEATURE_NOT_LICENSED, naming the capability and your tier. In the dashboard that becomes Not included in this installation's licence package. Contact your CID222 representative to add it. Which capability belongs to which package is generated from the code on the licence tiers reference.

Install a renewal

The full procedure, including the air-gapped path, is on Licensing and activation. From this page it is three actions.

Export the activation request

Select Export activation request.

A file named cid-activation-<installation-id>.json downloads. It carries the installation id, the appliance fingerprint and how strongly the identity is bound — nothing else.

Send it and receive a signed file

Send the file to your CID222 contact and collect the .lic they return.

The appliance contacts no licence server at any point.

Upload it

Drop the file on Drop your .lic file here, or select Upload license (.lic).

A toast reports License installed — valid until date, and the tiles switch to the new tier within seconds. Nothing restarts and no setting is lost.

Fields reference

GET /admin/license/status returns what the page shows.

Field on the pageResponse fieldNotes
License statestateThe eight states above.
Tiertierstarter, professional, enterprise, or none.
Expireslicense.expires_at, license.days_leftFrom the signed payload.
License ID, Customerlicense.license_id, license.customerWho the licence was issued to.
Installation, Fingerprintinstallation.installation_id, installation.fingerprintWhat the licence is bound to. A soft binding is labelled (self-generated).
Accountsaccounts.used, accounts.limitThe seat cap, when the licence carries one.
Capabilitiesentitlements, feature_catalogThe resolved union, and the labels for each capability.
WarningswarningsThe appliance's own sentences, rendered verbatim.
trialTrial start, end and days remaining.

A separate read, GET /admin/license/entitlements, is what every screen consults to know what is licensed. It carries no role guard on purpose — gating it would make the answer depend on itself.

Verify

  1. License state reads Valid, Tier names your package, and Expires is in the future.
  2. The Warnings tile is absent, or names only the soft-binding notice.
  3. Make one chat request. It succeeds rather than returning 402.
  4. Open a page that belongs to your tier. It opens instead of reporting that the capability is not licensed.
  5. Sign in as a viewer and confirm the page renders read-only: the upload is refused with READ_ONLY_ROLE, not with a licence error.

If it fails

The upload is refused with a 400 naming the signature:

Runbooklicensing

License upload fails with 400 "rejected: signature"

You might see: 400 rejected: signature · 400 rejected: ENOENT · License upload → 400 · licence file will not upload

Before you start

Checks

  1. 1

    Verify the licence trust anchor exists on the host

    diagnostics · appliance.license.trustAnchorPresent = true

  2. 2

    Verify the appliance reports an installation id

    diagnostics · appliance.license.installationId

  3. 3

    Verify the host clock is disciplined by NTP

    diagnostics · host.timeSynced = true

  4. 4

    Read the licence state the gateway reports

    GET /admin/license/status → {"state":"active|trial"}

Everything answers 402 although the setup wizard completed:

Runbooklicensing

Every request returns 402 LICENSE_EXPIRED after the wizard completes

You might see: 402 LICENSE_EXPIRED · chat returns 402 after finishing setup · the dashboard loads but every action fails with payment required · product blocked immediately after setup

Before you start

Checks

  1. 1

    Read whether licence enforcement is switched on for this deployment

    diagnostics · appliance.license.requireLicense = true

  2. 2

    Read the licence state the gateway resolved at boot

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

  3. 3

    Verify the licence trust anchor exists, since without it no licence can ever resolve as active

    diagnostics · appliance.license.trustAnchorPresent = true

  4. 4

    Check how long the installed licence has left

    diagnostics · appliance.license.expiresAt

Shorter answers:

  • license is for installation X, this box is Y → the file was issued against a different appliance. Export the activation request again and ask for a re-issue.
  • license is already expired → the file's term ended before you uploaded it.
  • A page or endpoint reports FEATURE_NOT_LICENSED → the capability is not in your package.
  • Creating a user is refused with LIMIT_EXCEEDED → the seat cap is reached. The refusal names the limit and how many are in use. Deactivating a leaver frees a seat, and existing users are never blocked from signing in. The refusal also writes LICENSE_LIMIT_EXCEEDED.
  • The warnings tile reports a clock rollback → fix the host clock and NTP. The appliance keeps a high-water mark and treats a large backward jump as tampering.
  • The warnings tile reports that the installation identity is self-generated → the licence is bound to a file rather than to the machine. It is enforced normally; bind it to the hardware before the next renewal.

Next steps

  • Licensing and activation — the full activation procedure, online and across an air gap.
  • Licence tiers — the generated table of which capability each package entitles.
  • System updates — updates never change your package; the licence file is what defines capabilities.

Last updated on

On this page

Download PDF