License Verification API
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"
}| Field | Required | Notes |
|---|---|---|
license_key | Yes | The key from your vinzapanel.com account |
server_ip | Yes | Must be a valid IPv4 or IPv6 address |
hardware_uuid | Yes | The server's hardware fingerprint; the token is bound to it |
panel_version | No | Recorded on the activation |
panel_url | No | Recorded 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": "…"}.
| HTTP | Error message |
|---|---|
| 400 | Invalid JSON., license_key and server_ip are required., server_ip must be a valid IP address., A valid hardware_uuid is required. |
| 403 | License has expired., License is suspended., License is invalid., or Server migration limit reached… |
| 404 | License key not found. |
| 405 | Method not allowed. (only POST is accepted) |
| 429 | Too many requests. Try again later. (30 requests per minute per client IP) |