Endurance

Licence

The licence that decides how many services and which features the appliance will run.

Licence

What licenses this appliance: a verified portal licence, or the trial every installation starts on. type names which governs, isTrial whether it is an evaluation (the local trial or a portal-issued trial), and licensed is false once neither covers the box. position says whether that is a decided answer: licensed, unlicensed, or undetermined for an appliance that cannot verify the licence it holds — which is warned about but never enforced, and never disables the update repository.

GET /licence

curl
curl -X GET "https://appliance.example.com/api/v1/licence" \
  -H "Authorization: Bearer $TOKEN"
PHP
<?php

$url = 'https://appliance.example.com/api/v1/licence';
$headers = [
    'Authorization: Bearer ' . $token,
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests

headers = {"Authorization": f"Bearer {token}"}

response = requests.get("https://appliance.example.com/api/v1/licence", headers=headers)
response.raise_for_status()
print(response.json())
JavaScript
const response = await fetch('https://appliance.example.com/api/v1/licence', {
  method: 'GET',
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

const data = await response.json();
Bruno
meta {
  name: Get the licence
  type: http
  seq: 1
}

get {
  url: https://{{node-0}}:{{port}}/api/v1/licence
  body: none
  auth: bearer
}

auth:bearer {
  token: {{token}}
}
Response
{
  "status": "success",
  "message": "Licence Details",
  "data": {
    "platform": "vmware",
    "serial": "5df-136b976c35",
    "device": {
      "id": "sha256:9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08",
      "claim": {
        "type": "endurance-device-claim",
        "version": 1,
        "public_key": "...",
        "payload": "...",
        "signature": "..."
      }
    },
    "type": "trial",
    "isTrial": true,
    "licensed": true,
    "position": "licensed",
    "expired": false,
    "daysToExpire": 29,
    "expiresAt": "2026-10-03T09:12:44+00:00",
    "tier": "",
    "throughputGbps": 0,
    "modules": [],
    "trial": {
      "startedAt": "2026-09-03T09:12:44+00:00",
      "expiresAt": "2026-10-03T09:12:44+00:00",
      "daysToExpire": 29,
      "expired": false
    },
    "portalLease": null
  }
}

Install a licence file issued by the Portal for this appliance: the signed envelope, or the download bundle that wraps it with a revocation list. The file is verified against the trusted Portal signing keys and this appliance’s serial before it is stored. Refused while a transaction is open. Commit or roll back the transaction first.

PUT /licence

This change is staged. Send PUT /services/apply to apply it.

Body parameters
licence string Required

The portal licence file contents (JSON).

curl
curl -X PUT "https://appliance.example.com/api/v1/licence" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "licence": "<licence>"
}'
PHP
<?php

$url = 'https://appliance.example.com/api/v1/licence';
$headers = [
    'Authorization: Bearer ' . $token,
    'Content-Type: application/json',
];

$payload = [
    'licence' => '<licence>',
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => json_encode($payload),
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests

headers = {"Authorization": f"Bearer {token}"}
payload = {
    "licence": "<licence>"
}

response = requests.put("https://appliance.example.com/api/v1/licence", headers=headers, json=payload)
response.raise_for_status()
print(response.json())
JavaScript
const response = await fetch('https://appliance.example.com/api/v1/licence', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${token}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
  "licence": "<licence>"
}),
});

const data = await response.json();
Bruno
meta {
  name: Install a portal licence
  type: http
  seq: 1
}

put {
  url: https://{{node-0}}:{{port}}/api/v1/licence
  body: json
  auth: bearer
}

headers {
  Content-Type: application/json
}

auth:bearer {
  token: {{token}}
}

body:json {
  {
    "licence": "<licence>"
  }
}
Response
{
  "status": "success",
  "message": "Portal licence installed successfully"
}

Remove the Portal licence from this appliance, for decommissioning or when the wrong licence was installed. The Portal is told first so the seat returns to the pool; the licence is removed locally whether or not the Portal could be reached, and portal reports which. The appliance falls back to its trial if that still has days left, otherwise it is unlicensed. Refused while a transaction is open. Commit or roll back the transaction first.

DELETE /licence

This change is staged. Send PUT /services/apply to apply it.

curl
curl -X DELETE "https://appliance.example.com/api/v1/licence" \
  -H "Authorization: Bearer $TOKEN"
PHP
<?php

$url = 'https://appliance.example.com/api/v1/licence';
$headers = [
    'Authorization: Bearer ' . $token,
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests

headers = {"Authorization": f"Bearer {token}"}

response = requests.delete("https://appliance.example.com/api/v1/licence", headers=headers)
response.raise_for_status()
print(response.json())
JavaScript
const response = await fetch('https://appliance.example.com/api/v1/licence', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

const data = await response.json();
Bruno
meta {
  name: Remove the portal licence
  type: http
  seq: 1
}

delete {
  url: https://{{node-0}}:{{port}}/api/v1/licence
  body: none
  auth: bearer
}

auth:bearer {
  token: {{token}}
}
Response
{
  "status": "success",
  "message": "Portal licence removed",
  "data": {
    "portal": "released",
    "message": "The licence was released and its seat returned to the Portal.",
    "at": "2026-09-03T20:15:00+00:00"
  }
}

Check the licence with the Portal now

Ask the Portal whether the installed licence is still active, without waiting for the daily check-in. A renewed licence is installed; a revoked or released one stops being honoured. Reports what happened, including when the Portal could not be reached. Refused while a transaction is open. Commit or roll back the transaction first.

POST /licence/checkin

This change is staged. Send PUT /services/apply to apply it.

curl
curl -X POST "https://appliance.example.com/api/v1/licence/checkin" \
  -H "Authorization: Bearer $TOKEN"
PHP
<?php

$url = 'https://appliance.example.com/api/v1/licence/checkin';
$headers = [
    'Authorization: Bearer ' . $token,
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests

headers = {"Authorization": f"Bearer {token}"}

response = requests.post("https://appliance.example.com/api/v1/licence/checkin", headers=headers)
response.raise_for_status()
print(response.json())
JavaScript
const response = await fetch('https://appliance.example.com/api/v1/licence/checkin', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

const data = await response.json();
Bruno
meta {
  name: Check the licence with the Portal now
  type: http
  seq: 1
}

post {
  url: https://{{node-0}}:{{port}}/api/v1/licence/checkin
  body: none
  auth: bearer
}

auth:bearer {
  token: {{token}}
}
Response
{
  "status": "success",
  "message": "Licence check-in",
  "data": {
    "at": "2026-09-03T20:15:00+00:00",
    "status": "active",
    "message": "The Portal confirmed this licence.",
    "renewed": false
  }
}

Start the trial licence

Start this appliance’s 30-day trial when none has been recorded — for a box set up before trials existed, or one with no route to the Portal. An appliance gets one trial; a second request is refused. Refused while a transaction is open. Commit or roll back the transaction first.

POST /licence/trial

This change is staged. Send PUT /services/apply to apply it.

curl
curl -X POST "https://appliance.example.com/api/v1/licence/trial" \
  -H "Authorization: Bearer $TOKEN"
PHP
<?php

$url = 'https://appliance.example.com/api/v1/licence/trial';
$headers = [
    'Authorization: Bearer ' . $token,
];

$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_RETURNTRANSFER => true,
]);

$response = json_decode(curl_exec($ch), true);
curl_close($ch);
Python
import requests

headers = {"Authorization": f"Bearer {token}"}

response = requests.post("https://appliance.example.com/api/v1/licence/trial", headers=headers)
response.raise_for_status()
print(response.json())
JavaScript
const response = await fetch('https://appliance.example.com/api/v1/licence/trial', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

const data = await response.json();
Bruno
meta {
  name: Start the trial licence
  type: http
  seq: 1
}

post {
  url: https://{{node-0}}:{{port}}/api/v1/licence/trial
  body: none
  auth: bearer
}

auth:bearer {
  token: {{token}}
}
Response
{
  "status": "success",
  "message": "Trial licence started"
}