Particle Horizon | Message Operations requires a valid **platform license** to operate. The license is a signed document that authorises a specific installation and sets limits on how many **environments** and **queues** the platform may manage. This guide explains how to upload a license, read the license status, and understand what happens when a license is missing or expires.

## What a license controls

A license is bound to your installation and grants:

-   **Environments** — the maximum number of connected Solace environments.
-   **Queues** — the maximum number of queues the platform tracks across those environments.

Each license also carries an **expiry date**. After it expires, the platform locks until a new valid license is uploaded (see [When the platform is locked](#when-the-platform-is-locked)).

Licenses are cryptographically signed and tied to your **installation ID** — a stable identifier generated once for your deployment. A license issued for one installation cannot be used on another.

## Finding the License view

Open the **License** view from the admin area of the navigation. It shows:

<table><caption class="sr-only">Finding the License view</caption><thead><tr><th scope="col">Field</th><th scope="col">Meaning</th></tr></thead><tbody><tr><td><strong>Installation ID</strong></td><td>The identifier this installation is licensed against. Use the copy button to share it with your license issuer.</td></tr><tr><td><strong>Status</strong></td><td>Valid, Missing, Expired, or Invalid.</td></tr><tr><td><strong>Lockout state</strong></td><td>Unlocked when a valid license is active; Locked otherwise.</td></tr><tr><td><strong>Active license</strong></td><td>The current license’s ID, customer, and expiry.</td></tr><tr><td><strong>Limits</strong></td><td>Licensed maximum environments and queues.</td></tr><tr><td><strong>Usage</strong></td><td>Current environment count and queue count measured against the limits.</td></tr></tbody></table>

Reading the license status requires no special permission. **Uploading** a license requires the `license:manage` permission (platform administrators have it).

## Uploading or renewing a license

1.  Obtain a license file (JSON) from your license issuer. If they need your **installation ID**, copy it from the License view.
2.  In the License view, choose the license file to upload.
3.  Because replacing the active license is a sensitive operation, the API reuses a recent **multi-factor (step-up) verification** when one is still valid. If the absolute step-up window has expired, you are prompted before the preserved upload is retried.
4.  On success, the new license becomes the current license. Only one license is current at a time; uploading a new one replaces the previous record.

If the uploaded file fails validation (bad signature, wrong installation ID, malformed limits, or already expired), the upload is rejected and the current status is unchanged. The error explains which check failed.

Renewing before expiry is simply uploading the replacement license — there is no separate renewal flow.

## When the platform is locked

If there is **no valid license** — none has been uploaded, or the active one has expired or failed validation — the platform enters a **locked** state:

-   All API requests are rejected with `403` and a licensing error code, **except** the endpoints needed to recover: health checks, authentication/SSO, platform info, and the license endpoints themselves.
-   The web UI shows a **License remediation** screen that allows only signing in and uploading a new license.

Uploading a valid license immediately unlocks the platform; no restart is required.

## Measuring queue usage

Environment usage is simply the number of connected environments. Queue usage is measured from a per-environment **queue inventory** that the platform syncs from the broker. You can trigger a re-sync for an environment, and check its sync status, from the environment’s tools (or via the API below). Usage is compared against the licensed queue limit and surfaced in the License view.

## API reference

<table><caption class="sr-only">API reference</caption><thead><tr><th scope="col">Method &amp; path</th><th scope="col">Purpose</th><th scope="col">Permission</th></tr></thead><tbody><tr><td><code>GET /api/v1/license/status</code></td><td>Current license status, limits, and usage.</td><td>Authenticated</td></tr><tr><td><code>POST /api/v1/license</code></td><td>Upload/replace the platform license (requires step-up MFA).</td><td><code>license:manage</code></td></tr><tr><td><code>POST /api/v1/environments/{environmentId}/queue-inventory/sync</code></td><td>Trigger a queue-inventory re-sync.</td><td>Environment management</td></tr><tr><td><code>GET /api/v1/environments/{environmentId}/queue-inventory/status</code></td><td>Queue-inventory sync status for an environment.</td><td><code>environment:read</code> on the requested environment</td></tr></tbody></table>
