Skip to content

Current license status

GET
/admin/license/status

Returns the cached, verified-at-boot snapshot of this install’s license — tier, features, caps, expiry, etc. When no .lic file is installed, returns a synthetic “community” status (tier: community, features: community defaults, days_until_expiry: 0).

The artist-alley app NEVER calls the license server at verification time. This endpoint just reads the in-memory cache populated at startup (and refreshed on POST /admin/license/upload).

License snapshot.

License snapshot returned by GET /admin/license/status. loaded: false means no .lic file is installed and the artist-alley app is running in community mode — community defaults apply, no license-server interaction needed.

days_until_expiry is derived (0 in community mode; negative when expired). Nullable cap fields (seats, asset_cap) → null = unlimited. Nullable temporal / identity fields are simply omitted in community mode.

object
loaded
required

True when a real .lic file is mounted + verified. False = community mode.

boolean
tier
required

“community” (unlicensed default) | “pro” | “enterprise” | “complementary” | “plugin” | “custom”.

string
features
required
Array<string>
owner

License owner email — surfaced for support routing.

string
org

Organization slug — same value across federated peers.

string
lid

License id (ULID); surface in support tickets.

string
seats

Max concurrent active seats; null = unlimited.

integer format: int64
nullable
seat_window_days

Rolling window for “active seat” counting.

integer
asset_cap

Asset cap (primary assets only); null = unlimited.

integer format: int64
nullable
nbf

Not-before timestamp (RFC3339).

string format: date-time
exp

Expiry timestamp.

string format: date-time
iat

Issued-at timestamp.

string format: date-time
days_until_expiry
required

Whole days until license expires. Negative when expired. Zero in community mode (no expiry).

integer
last_error

Last verification error if the loaded license failed (e.g. expired, wrong issuer). Surfaced verbatim in the admin UI so operators can react.

string
iss

Issuer string baked into the license — admins can confirm the .lic came from the canonical authority.

string
path

Filesystem path the verifier loaded the .lic from. Useful for diagnostics + support.

string
org_binding_required
required

True when the loaded license declares an org_pubkey claim — the customer must hold the matching org.key seed file on disk for the license to activate. False for community / trial / dev licenses that opted out of cross-binding at issuance time.

boolean
org_bound
required

True when the install satisfies cross-binding — either because org_binding_required is false (no binding to satisfy), or because the on-disk org.key derives to a public key matching the license’s org_pubkey. The cap-enforcement layer only treats the license as active when this is true.

boolean
org_binding_error

Human-readable reason cross-binding failed when org_binding_required is true and org_bound is false. One of: “org.key missing”, “org.key malformed”, “org.key does not match license org_pubkey”.

string
org_key_path

Filesystem path the verifier consults for the org.key seed. Echoed back to the admin UI so operators see exactly where to drop the file when cross-binding fails.

string

Authentication required, missing, or invalid

object
error
required

Human-readable error summary

string
Example
the request could not be completed
Example
{
"error": "authentication required: sign in and retry with a valid session or API token"
}

Authenticated but missing required capabilities

object
error
required

Human-readable error summary

string
Example
the request could not be completed