Skip to main content
Version: 1.13.0-dev

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, 1 account and 1 team, and 100,000 governed calls a month. This is the Development posture. A signed licence removes these 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.

From 1.8.2

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)
FeaturesAll of them, including the MCP and A2A planesAll of them
WorkspacesUp to 3. The 4th is refused with WORKSPACE_LIMIT_REACHED.No limit
Accounts and teams1 of each (the defaults). Another is refused with ACCOUNT_LIMIT_REACHED / TEAM_LIMIT_REACHED.No limit
Governed calls100,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
UseNon-production onlyProduction, as the agreement covers
SupportNoneIncluded

A refused call gets 402 with the plane's own code: license_token_cap_exceeded on /v1/*, mcp_cap_exceeded on the /mcp/* REST paths, a2a_cap_exceeded on /a2a/*. The native MCP endpoint, POST /mcp, answers 200 with a JSON-RPC error instead: code -32004, with data.dvara_code set to MCP_CAP_EXCEEDED and data.http_status to 402. 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". Platform-role pages add the workspace and call counts.

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_KEY out of .env and use the License page (see the Quickstart).
  • Kubernetes — use the License page. The chart still accepts secrets.enterpriseLicenseKey and passes it only to Flightdeck, for the one-time copy (see Kubernetes).

Verify the license​

Open Settings → License at the foot of the DVARA Flightdeck sidebar (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,
"daysRemaining": 0,
"gracePeriodActive": false,
"nonProduction": true,
"standing": "NONE",
"workspaces": 2,
"workspaceLimit": 3,
"callsThisMonth": 40000,
"callLimit": 100000
}

The limit fields follow the licence:

FieldNo licenceValid licenceExpired licence (after the 14-day grace)
postureDEVELOPMENTPRODUCTIONPRODUCTION
standingNONEVALIDEXPIRED
nonProductiontruefalsefalse
workspaceLimit3absent3
callsThisMonththis month's countthis month's count (from 1.8.6; absent before)this month's count
callLimit100000absentabsent

During the 14-day grace the endpoint still reports standing: VALID and no limits, as for a valid licence.

A licensed response also fills in licensee, licenseId, type, status, expiresAt, and daysRemaining. Fields with no value are left out of the body, not sent as null. So a count that cannot be read is absent, 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:

StatusWhenWhat changes
VALIDMore than 30 days remainingNothing.
EXPIRING_SOON30 days or fewer remainingOwners see "Licence expires in N days" in the Flightdeck.
GRACE_PERIODExpired, within the 14-day grace windowFrom 1.8.3, every Flightdeck user sees an expired banner that says traffic is not affected. Renew now.
DEGRADEDExpired beyond the 14-day graceTraffic still flows on /v1/*, /mcp/* and /a2a/*. From 1.8.3, compliance reports are stamped "Expired licence" from this point.

Once the grace period has ended (status DEGRADED):

  • 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.
  • Accounts and teams: no new account or team can be added. Existing ones keep working.
  • 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 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 expired licence is never worse than no licence

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​

  1. Request the renewed envelope (production: through your account contact; trial → production: talk to us).
  2. 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.