Skip to main content
Relay is Apache-2.0, and routing, the catalog, key pooling, batch, usage tracking and payload logging all work without a license. A small set of features is gated behind a signed license file. Verification is offline. The release public key is compiled into the binary; Relay never contacts a license server, and an airgapped deployment verifies a license the same way a connected one does.

What is gated

OIDC sign-in and SCIM provisioning are not gated. A license may carry other feature names; a name the running version does not gate enables nothing. A gated action without a license is refused with 403 and the error license_required, through the API and through apply. Nothing else about the deployment changes.

Installing a license

Three sources, in precedence order: The environment wins over the stored value, so a deployment that sets either variable cannot be overridden from the UI. PUT /api/license verifies the value before storing it: a value that does not verify is refused with 400 and the previous license stays in effect. A stored license reaches every pod through the settings change notification, so installing or renewing one needs no restart. POST /api/reload verifies it again. Read the license in effect with GET /api/license. Under RELAY_AUTHZ=rbac it needs read on license, which among the built-in roles only admin grants; under single any authenticated caller may read it. GET /api/version carries the same block for authenticated callers.

Expiry

An expired license keeps working for 30 days. Through that window grace reads true and gated features stay on, so a renewal gap does not interrupt a running gateway. After the grace window the deployment runs as community: gated actions are refused with license_required, and a boot logs that the license is unusable. Custom roles that already exist keep their bindings working and can still be deleted. The deployment keeps booting and serving; a lapsed license never takes a gateway down.