Verify licensing

Checks a license token online: signature, schema, expiry, app_id and the revocation list.

POST /v1/licensing/verify

Addresshttps://api.hanzo.ai/v1/licensing/verify
MethodPOST
Operationpost_licensing_verify
AuthAuthorization: Bearer $HANZO_API_KEY

Checks a license token online: signature, schema, expiry, app_id and the revocation list.

It is UNAUTHENTICATED and always answers 200 — a bad token is valid:false with a reason rather than an error status, because "is this token good" is a question anyone may ask about a credential they already hold and the answer is the same either way. It is also OPTIONAL: the engine verifies OFFLINE against the published public key (GET /v1/licensing/pubkey) and needs this endpoint only to learn about revocation, so an outage here never stops a paid customer working.

Request

2 fields, body application/json (required).

FieldInTypeRequiredDescription
appbodystring—App overrides the app_id the token is expected to carry.
tokenbodystringyesToken is the license token to check.

Response

StatusBodyMeaning
200licensing.VerifyResponseok
defaultproblem-detailsrefused

200 body — 9 fields.

FieldInTypeAlwaysDescription
app_idbodystring—AppID is the brand the token runs under.
expbodyinteger (int64)—Exp is the token's expiry, Unix seconds.
featuresbodystring[]—Features are the capability grants the token carries.
fingerprint_boundbodyboolean—Bound reports that the token carries a device binding.
holderbodystring—Holder is who the token was issued to.
noncebodystring—Nonce uniquely identifies the token.
reasonbodystring—Reason says why an invalid token was rejected.
revokedbodyboolean—Revoked reports that the signature was good but the token has been revoked.
validbodyboolean—Valid is the single answer: signature, schema, expiry, app and revocation all passed.

Failure carries the platform error shape — see Errors.

Examples

hanzo licensing verify --token <token>
import { Configuration, LicensingApi } from 'hanzoai';

const api = new LicensingApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postLicensingVerify({ token: "<token>" });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import LicensingApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = LicensingApi(client).post_licensing_verify(token="<token>")
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.LicensingAPI.PostLicensingVerify(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, licensing_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = licensing_api::post_licensing_verify(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.LicensingApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new LicensingApi(client).postLicensingVerify();
curl -X POST https://api.hanzo.ai/v1/licensing/verify \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "token": "<token>"
     }'

MCP reaches licensing through the licensing tool, which names its 9 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "get_licensing_download"
         }
       }
     }'

Licensing API · All Hanzo APIs · Interactive reference

Was this page useful?