License Verification API

Updated 19 Oct 2026 Published

License Verification API

This is the endpoint your panel calls to verify its license and obtain a signed license token. You do not need it for normal use — Administration → Panel License → Save & Verify does it for you — but it is documented here for integrators and for troubleshooting.

Verification endpoint

POST https://vinzapanel.com/panel/api/v1/license/verify/

Request

POST /panel/api/v1/license/verify/ HTTP/1.1
Host: vinzapanel.com
Content-Type: application/json

{
  "license_key": "VZ-XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX",
  "server_ip": "203.0.113.42",
  "hardware_uuid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
  "panel_version": "1.3.51",
  "panel_url": "https://panel.example.com:2711"
}
FieldRequiredNotes
license_keyYesThe key from your vinzapanel.com account
server_ipYesMust be a valid IPv4 or IPv6 address
hardware_uuidYesThe server's hardware fingerprint; the token is bound to it
panel_versionNoRecorded on the activation
panel_urlNoRecorded on the activation

Response (success)

HTTP/1.1 200 OK
Content-Type: application/json

{
  "success": true,
  "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_at": "2027-06-24T00:00:00+00:00",
  "plan": "Starter",
  "ip_changes_used": 0,
  "ip_changes_max": 5,
  "ip_changes_remaining": 5
}

expires_at is the license expiry. The ip_changes_* fields count server moves (see Activating Your License).

The token

token is a JWT signed with RS256. It is short-lived (about 24 hours, never longer than the license), so a panel re-verifies regularly. Decoded, the payload looks like this:

{
  "license_key": "VZ-…",
  "ip_address": "203.0.113.42",
  "hardware_uuid": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
  "status": "ACTIVE",
  "licensed_to": "[email protected]",
  "plan": "Starter",
  "limits": { "max_accounts": 5, "…": "…" },
  "entitlements": {
    "version": 1,
    "capabilities": { "…": true },
    "limits": { "accounts.max": 5, "websites.max": -1, "databases.max": -1 },
    "paid": true
  },
  "ip_changes_used": 0,
  "ip_changes_max": 5,
  "ip_changes_remaining": 5,
  "iss": "vinzaweb",
  "aud": "VZ-…",
  "jti": "…",
  "iat": 1750723200,
  "exp": 1750809600,
  "grace_until": 1751068800,
  "expires_at": 1782259200,
  "license_expires_at": 1782259200
}

In entitlements.limits, -1 means unlimited. entitlements.capabilities lists the features the plan unlocks, and paid says whether it is a paid plan. The numbers above are an example, not a statement of any plan's limits.

Public key

Verify the token signature with the public key served at:

GET https://vinzapanel.com/api/public-key/

{
  "success": true,
  "public_key": "-----BEGIN PUBLIC KEY-----\n…\n-----END PUBLIC KEY-----"
}

Errors

Errors are JSON: {"success": false, "error": "…"}.

HTTPError message
400Invalid JSON., license_key and server_ip are required., server_ip must be a valid IP address., A valid hardware_uuid is required.
403License has expired., License is suspended., License is invalid., or Server migration limit reached…
404License key not found.
405Method not allowed. (only POST is accepted)
429Too many requests. Try again later. (30 requests per minute per client IP)
On this page