Get and apply a license
The Enterprise DVARA platform runs without a licence. Every feature runs, including the MCP and A2A planes, for non-production use, within 3 workspaces and 100,000 governed calls a month. This is the Development posture. A signed licence removes both limits and adds production rights and support. This page covers requesting, applying, verifying, renewing, and replacing that licence. The Open Source distribution has no licence lifecycle.
Before 1.8.2, a licence was needed to turn on the MCP and A2A planes, each app read DVARA_LICENSE_KEY at startup, and an expired licence refused /mcp/* and /a2a/* with 402. From 1.8.2 the planes run without a licence, the licence lives in Flightdeck, and an expired licence refuses no traffic.
What does an install without a licence get?
| No licence (Development) | Valid licence (Production) | |
|---|---|---|
| Features | All of them, including the MCP and A2A planes | All of them |
| Workspaces | Up to 3. The 4th is refused with WORKSPACE_LIMIT_REACHED. | No limit |
| Governed calls | 100,000 a month: LLM calls, MCP tool calls and A2A hops counted together. Calls are refused once the month's count reaches 110,000. | No limit. From 1.8.6 every call is still counted, for the monthly usage report |
| Use | Non-production only | Production, as the agreement covers |
| Support | None | Included |
A refused call gets 402 with the plane's own code: license_token_cap_exceeded on /v1/*, mcp_cap_exceeded on /mcp/*, a2a_cap_exceeded on /a2a/*. On /v1/* the body also reports "tier": "unlicensed". The message names the limit, this month's count, and the two ways out: the 1st of the month, or a licence added in Flightdeck. A refused call is not counted. Both numbers are fixed; no setting changes them. See Error handling for the response.
Flightdeck shows where the install stands. Without a licence, a bar on every page reads "Non-production licence", with the workspace and call counts in the Flightdeck.
From 1.8.6 a licensed install counts every governed call too, and never refuses one. Your agreement sets the volume and any over-use; Flightdeck's monthly usage report gives the month's governed-call total to measure them with. No usage data leaves your environment. Compliance reports generated without a licence carry a "Non-production licence" line in the footer.
Request a license
There is no trial licence: evaluate without a key, inside the non-production limits above. For production, an annual license is issued with your plan and emailed as a DVARA--prefixed envelope, usually the same business day. Talk to us to start a production license or renew an existing one.
The licence is install-wide: one envelope covers Flightdeck and every Gateway pod. There are no per-workspace or per-node keys to mint. Apply a key only to environments covered by its agreement.
Apply the license
Paste the envelope on the License page in DVARA Flightdeck (/license, owner role only). Flightdeck verifies the Ed25519 signature against the public key shipped in the image and checks the expiry date before it stores the licence. A value that does not verify is refused and nothing is stored.
Flightdeck stores the licence and sends it to every Gateway pod in the signed configuration bundle. No app needs a restart:
- Flightdeck applies it at once.
- Each Gateway pod applies it with its next configuration bundle. The workspace and call limits lift on the next request after that.
Saving a licence writes a LICENSE_UPDATED audit event.
Upgrading an install that set DVARA_LICENSE_KEY
Until 1.8.2 every app read the licence from the DVARA_LICENSE_KEY environment variable. From 1.8.2 Flightdeck copies that value into its store once, when nothing is stored yet and the value verifies. An expired value is copied too, because it is still the install's licence. The copy writes LICENSE_UPDATED with source: DVARA_LICENSE_KEY.
After that the variable is ignored. A licence stored on the License page always wins, so an old value left in a deployment never replaces it. A Gateway pod does not read the variable at all; it logs a warning that the variable is no longer read. You can remove the variable from Gateway pods.
- Docker Compose — leave
DVARA_LICENSE_KEYout of.envand use the License page (see the Quickstart). - Kubernetes — use the License page. The chart still accepts
secrets.enterpriseLicenseKeyand passes it only to Flightdeck, for the one-time copy (see Kubernetes).
Verify the license
Open License from the DVARA Flightdeck user menu (or go to /license). It shows whether a licence is stored and, if so, the licensee, type (TRIAL / PRODUCTION), expiry date with days remaining, and a runtime status badge. Without a valid licence it also shows the workspace count against 3, and with no licence at all this month's calls against 100,000. See Operations → License status for the full page.
Programmatically, call the Enterprise Gateway's licence endpoint. Replace <actuator-api-key> with the operator key configured as DVARA_ACTUATOR_API_KEY:
curl --fail --silent --show-error \
--header 'Authorization: Bearer <actuator-api-key>' \
http://localhost:8080/actuator/license
An Enterprise Gateway with no licence returns the Development posture and its limits as a normal 200 response:
{
"posture": "DEVELOPMENT",
"licensed": false,
"licensee": null,
"licenseId": null,
"type": null,
"status": null,
"expiresAt": null,
"daysRemaining": 0,
"gracePeriodActive": false,
"nonProduction": true,
"standing": "NONE",
"workspaces": 2,
"workspaceLimit": 3,
"callsThisMonth": 40000,
"callLimit": 100000
}
The limit fields follow the licence:
| Field | No licence | Valid licence | Expired licence |
|---|---|---|---|
posture | DEVELOPMENT | PRODUCTION | PRODUCTION |
standing | NONE | VALID | EXPIRED |
nonProduction | true | false | false |
workspaceLimit | 3 | null | 3 |
callsThisMonth | this month's count | this month's count (from 1.8.6; absent before) | this month's count |
callLimit | 100000 | absent | absent |
A licensed response also fills in licensee, licenseId, type, status, expiresAt, and daysRemaining. A count that cannot be read is null, not 0. The endpoint never returns the signed licence envelope. The Open Source distribution does not register /actuator/license; use it only with the Enterprise distribution. /actuator/gateway-status does not return posture or licence fields.
What happens as a license expires
An expired licence refuses no traffic, on any plane. The runtime tracks four states:
| Status | When | What changes |
|---|---|---|
VALID | More than 30 days remaining | Nothing. |
EXPIRING_SOON | 30 days or fewer remaining | Owners see "Licence expires in N days" in the Flightdeck. |
GRACE_PERIOD | Expired, within the 14-day grace window | From 1.8.3, every Flightdeck user sees an expired banner that says traffic is not affected. Renew now. |
DEGRADED | Expired beyond the 14-day grace | Traffic still flows on /v1/*, /mcp/* and /a2a/*. From 1.8.3, compliance reports are stamped "Expired licence" from this point. |
Once the licence has expired, whatever the grace:
- Traffic is served on every plane. Calls are counted against 100,000 a month but never refused.
- Workspaces you already have are kept. A new workspace above 3 is refused with
WORKSPACE_LIMIT_REACHED. - Posture stays
PRODUCTION, because the licence was a production licence. Reports are not stamped "Non-production licence". - Flightdeck (from 1.8.3) shows every signed-in user, in the Flightdeck, a banner with the expiry date. Owners are told to paste a new key on the License page.
From 1.8.3, a compliance report generated after the 14-day grace carries "Expired licence" in its footer. A report generated during the grace carries no stamp, so a renewal a few days late leaves no marked report on file. A licence that was set and then removed counts as expired, with no grace.
Status transitions emit LICENSE_EXPIRY_WARNING, LICENSE_EXPIRED, and LICENSE_DEGRADED audit events, and Flightdeck sends expiry emails. Alert on the gateway_license_days_remaining metric or on those audit events.
An install with no licence serves every plane, so an expired one must not serve less. Otherwise the fastest fix for an outage would be to delete your licence, which is the wrong incentive. Expiry keeps your traffic running and brings back the 3-workspace limit for new workspaces.
This changed in 1.8.2. From 1.7.0 to 1.8.1, /mcp/* and /a2a/* returned 402 LICENSE_EXPIRED once a licence passed its grace. Before 1.7.0, /v1/* did too.
Renew a license
- Request the renewed envelope (production: through your account contact; trial → production: talk to us).
- Replace it on the License page in Flightdeck. Flightdeck applies it at once, and Gateway pods apply it with the next configuration bundle. No restart is needed. The expired banner and the workspace limit go away.
Renewing before expiry avoids the warning, the banner and the report stamp entirely. The same replacement upgrades a trial to a production license.
Related
- Operations → License status — the Flightdeck License page in detail.
- Error handling → licence limits — the
402returned when an install without a licence passes 110,000 calls in a month. - Deployment models — self-managed vs managed hosting.