Save licensing and metering
PUT
/v1/setup/licensing
const url = 'http://localhost:8080/v1/setup/licensing';const options = { method: 'PUT', headers: {'Content-Type': 'application/json'}, body: '{"licenseKey":"example","heartbeatEndpoint":"example","airGapped":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url http://localhost:8080/v1/setup/licensing \ --header 'Content-Type: application/json' \ --data '{ "licenseKey": "example", "heartbeatEndpoint": "example", "airGapped": true }'Step 9. Validates and stores the license key (optional in the demo: blank runs as an unlicensed evaluation), the metering heartbeat endpoint and whether the install is air-gapped (which turns heartbeats off). Returns the licensed institution, tier and expiry. Administrators only. 400 when the key is not valid.
Request Bodyrequired
Section titled “Request Bodyrequired”Media typeapplication/json
object
licenseKey
Optional in the demo: blank runs as an unlicensed evaluation. Production installs require a key.
null | string
heartbeatEndpoint
string
airGapped
boolean
Examplegenerated
{ "licenseKey": "example", "heartbeatEndpoint": "example", "airGapped": true}Responses
Section titled “Responses”OK
Media typeapplication/json
object
hasKey
required
boolean
institution
required
null | string
tier
required
null | string
expiresAt
required
null | string format: date-time
heartbeatEndpoint
required
string
airGapped
required
boolean
Examplegenerated
{ "hasKey": true, "institution": "example", "tier": "example", "expiresAt": "2026-04-15T12:00:00Z", "heartbeatEndpoint": "example", "airGapped": true}