Skip to main content
CID222 Docs

Licensing and activation

Turn the built-in 30-day trial into your purchased package, online or across an air gap, and know what the appliance does when a licence lapses.

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

A CID222 licence is a small signed file bound to one appliance. You export an activation request, send it to your CID222 contact, and upload the .lic file they return. The appliance never contacts a licence server, so the whole procedure works with no internet on either side.

What do I need?

Licence
Any
Role
admin_user

Prerequisites

  • The appliance has completed the first-boot setup wizard.
  • You can sign in to the dashboard with a tenant that has the admin_user role.
  • Settings → License shows a non-empty installation id. A licence cannot be issued against an empty one.
  • The appliance host clock is correct and disciplined by NTP — licence validity is bounded by dates.
  • For the air-gapped path, removable media or an email path between the appliance's operator and a machine that can reach your CID222 contact.

Which situation are you in

SituationWhat it takes
A new appliance, evaluatingNothing. The built-in trial runs for 30 days from first boot
A new appliance, licensedActivate the licence — export, send, upload
Evaluating a capability the trial does not includeA time-limited licence at that tier. The trial cannot be raised in place
Moving from Starter to Professional or EnterpriseA re-issued licence against the same installation id. Not a reinstall, and nothing restarts
The licence is close to expiryThe same upload, before the date rather than after
A page reports that a capability is not licensedThe tier does not include it
Creating a user is refusedA seat cap
The product answers 402As a licence lapses
The appliance is air-gappedNothing changes. Every path on this page is a file exchange
The appliance was restored onto new hardwareNothing, if the installation identity came back with it. A warning is expected; enforcement does not change

What the appliance enforces

A fresh appliance runs a built-in 30-day trial at the Starter capability set, stamped from first boot rather than from the day the image was built. The trial is fully usable, but it does not unlock Professional or Enterprise features — ask your CID222 contact for a time-limited licence at that tier if you need to evaluate them.

The licence carries a tier, and the tier decides the capabilities. The appliance grants the union of the capabilities named in the file and the capabilities of its tier, so a feature added to the product after your licence was signed still works without a re-issue. Which capability belongs to which tier is generated from the code on the licence tiers reference.

StateWhat it meansWhat the product does
trialNo licence installed yet, inside the trial windowRuns at the trial tier, with a countdown banner
validA licence verified and is inside its termNormal operation
expiringInside the warning window before expiryNormal operation, with a banner
gracePast expiry, inside the grace period the licence itself namesNormal operation, with a banner
expired / trial_expiredPast expiry and past grace, or the trial elapsedProduct routes answer 402 LICENSE_EXPIRED
invalidNothing verifiable — no trust anchor, or the host clock rolled backProduct routes answer 402 LICENSE_EXPIRED

A 402 is deliberately narrow. It blocks the product paths — chat, detection, inspection, image and document analysis, and the key-validation endpoint the extension and the proxy call — and leaves everything else working, including sign-in, the dashboard, the licence page and Settings → System Updates, so the appliance can always be re-licensed without a rescue procedure. Release images ship with licence enforcement switched on (CID_REQUIRE_LICENSE), which means an appliance that cannot verify a licence fails closed rather than running unlicensed.

Note

Each state change is written to the event log as LICENSE_EXPIRING, LICENSE_GRACE, LICENSE_EXPIRED or LICENSE_TRIAL_EXPIRED, so a lapse can be alerted on in your SIEM instead of waiting for someone to open a page.

Activate the licence

Open the licence page

Select Settings → License.

The page shows the current License state, Tier, Expires and Installation — the id your licence is bound to. On a trial it also shows how many days remain.

Export the activation request

Select Export activation request.

A file named cid-activation-<installation-id>.json downloads. It carries the installation id, the appliance's fingerprint, how strongly the identity is bound, whether the appliance generated that identity itself, and the time it was exported — no customer data of any kind.

Send the request to your CID222 contact

Send the downloaded file to your CID222 contact from the machine you are working on.

Your contact issues a signed .lic file for your purchased package, bound to that installation id.

Upload the licence file

Back on Settings → License, drop the .lic file on Drop your .lic file here, or select Upload license (.lic) and pick it.

The appliance verifies the signature and the installation binding, installs the file, and the page switches to the licensed tier within a few seconds.

Warning

Transfer the .lic file as a binary attachment or over a checksum-verified copy, and do not open it in an editor. A mail client that re-wraps the lines changes the bytes the signature covers, and the appliance then rejects a genuine licence.

Renew, or move to a different package

Request the new file before the current one lapses

Send your CID222 contact the same activation request. The installation id has not changed, so the renewal binds to the same appliance.

A renewal and a package upgrade are the same operation: Starter to Professional to Enterprise is a licence re-issue, not a reinstall.

Upload it the same way

Select Settings → License, then upload the new .lic.

Capabilities expand immediately and the expiry date on the page moves out. The appliance keeps every setting and every record; nothing restarts.

Danger

Changing the appliance's installation identity invalidates the licence bound to the old one, and there is no self-service recovery — it takes a re-issued licence. Do not regenerate the identity on an appliance that already holds a licence.

When the tier does not include what you need

A capability that is not in your package answers 403 with FEATURE_NOT_LICENSED, and the dashboard hides the surfaces it gates rather than showing a dead page. The fix is a re-issued licence at a tier that includes it, against the same installation id — the same upload as a renewal, and nothing restarts.

Three cases behave differently from a plain refusal:

  • A capability added to the product after your licence was signed still works. Entitlements are the union of the capabilities named in the file and the capabilities of its tier, so a new key grandfathers in rather than silently revoking the module it gates.
  • Code Safety on Enterprise without a GPU degrades rather than refuses. The licence page carries a warning that its machine-learning half is inactive; nothing is blocked.
  • The filter-testing lab belongs to no tier. It is hidden on every licensed build, whatever you bought. Only a development appliance exposes it.

The generated licence tiers reference is the authority on which capability belongs to which package.

Seat limits

A licence may carry a seat cap. When it does, creating an account past the cap is refused with 403 and LIMIT_EXCEEDED, and the refusal is written to the event log as LICENSE_LIMIT_EXCEEDED.

BehaviourDetail
What countsThe cap is on accounts, and a licence carrying both a tenant and a user limit is held to the lower of the two
No capA licence with no limit, a non-integer one, or one below 1 reads as no cap. Every licence issued before seat limits existed is in this group
What is never blockedSigning in. Only the creation of a new account is refused, so a cap can never lock out the people already on the appliance
Where it bites unattendedDirectory-driven account creation — a sync or a first sign-in that would provision a new user — fails the same way, with the same event
Freeing a seatDeactivating a leaver frees one. Raising the cap is a re-issued licence

As a licence lapses

The states are a timeline, not a switch, and every transition is written to the event log so a lapse can be alerted on in your SIEM rather than waiting for someone to open a page.

WhenStateWhat users seeWhat you do
More than 30 days before expiryvalidNothingNothing
The last 30 daysexpiringA banner for administrators, and a LICENSE_EXPIRING eventRequest the renewal now. Your contact's turnaround is the long pole
Past expiry, inside the grace period the licence itself namesgraceLoud banners, a LICENSE_GRACE event. The product still worksUpload the renewal. Nothing is lost by doing it in this window
Past graceexpiredProduct routes answer 402 LICENSE_EXPIREDUpload the renewal. The appliance recovers within seconds of the upload
30 days after first boot with no licencetrial_expiredThe same 402, with LICENSE_TRIAL_EXPIRED in the logUpload a licence
No trust anchor, or the clock rolled backinvalidThe same 402This appliance has no licence trust anchor

Banners are shown to administrators only: a normal user cannot upload a renewal, so the banner would give them an alarm and no action. Dismissing one is per session and per state, so a notice dismissed while expiring returns when the appliance reaches grace.

Note

A 402 never touches sign-in, the dashboard shell, Settings → License or Settings → System Updates. That is deliberate: an appliance must always be re-licensable without a rescue procedure.

Keep the clock right

Licence validity is a comparison against the appliance's own clock, with no network time source to correct it. Two failure modes follow, and both are avoided by pointing the appliance at an internal time source:

  • A drifting clock on an air-gapped appliance can flip a valid licence to invalid, with nothing on the network to save it.
  • A clock that rolls back is treated as tampering. The appliance keeps a high-water mark; a clock more than a day behind it puts the licence in invalid until time passes the mark again. Restoring a virtual-machine snapshot from before that mark is the innocent way to hit this.
Runbookinstall

The host clock is not synchronised

You might see: The host clock is not synchronised · clock is not synchronised — if the registry login fails on a certificate error, this is why · a valid licence is reported as expired · tokens are rejected as expired immediately after sign-in

Before you start

Checks

  1. 1

    Read whether the host clock is disciplined by a time service

    diagnostics · host.timeSynced = true

  2. 2

    Verify the appliance can reach a time source at all

    expected · The status reports the clock as synchronised, or names a server the network permits.

  3. 3

    Check whether the skew has already aged the licence out

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

Verify

  1. Settings → License shows License state as valid, the Tier tile naming your package, and an Expires date in the future.
  2. The Warnings tile is absent, or names only the soft-binding notice. A warning that the identity was generated by the appliance rather than derived from the machine is expected on a deployment where the host tooling never ran; it does not affect enforcement.
  3. Make one chat request. It succeeds rather than returning 402.
  4. Open a page that belongs to your tier — the MCP servers page on Professional, SIEM export on Enterprise. It opens instead of reporting that the capability is not licensed.

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 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

The licence has lapsed and licensed endpoints answer 402:

Runbooklicensing

The licence has expired and licensed endpoints answer 402

You might see: License expired / product locked · 402 LICENSE_EXPIRED · License state is "expired" · the trial ran out

Before you start

Checks

  1. 1

    Read the licence state the gateway resolved

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

  2. 2

    Verify the host clock is disciplined, because a skewed clock ages a valid licence out early

    diagnostics · host.timeSynced = true

  3. 3

    Verify the trust anchor exists, since without it no renewal can ever verify either

    diagnostics · appliance.license.trustAnchorPresent = true

  4. 4

    Read the licence status the API reports

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

This appliance can only ever run the trial, whatever you upload:

Runbooklicensing

This appliance has no licence trust anchor and can only run the trial

You might see: No license trust anchor (/etc/cid/license-pubkey.pem) · no licence can be verified on this box · the appliance only ever runs the built-in trial · every licence file is rejected, whichever one we upload

Before you start

Checks

  1. 1

    Read whether the licence-signing public key exists on the host

    diagnostics · appliance.license.trustAnchorPresent = true

  2. 2

    Read whether licence enforcement is switched on, which decides how bad the missing anchor is

    diagnostics · appliance.license.requireLicense = false

Two more symptoms have a shorter answer:

  • A page or endpoint answers not licensed (FEATURE_NOT_LICENSED) → the capability is not in your package. See When the tier does not include what you need.
  • Creating a user is refused with LIMIT_EXCEEDED → the licence carries a seat cap and this appliance has reached it. See Seat limits.

Next steps

  • Licence tiers — the generated table of which capability each package entitles.
  • Naming, DNS and TLS — the names and certificate your clients need before they will talk to the appliance.
  • Update the appliance — updates never change your package; the licence file is what defines capabilities.

Last updated on

On this page