Projection reports which console apps the CALLER's org may open, and the plan…
Projection reports which console apps the CALLER's org may open, and the plan slug that decides it.
GET /v1/entitlement
| Address | https://api.hanzo.ai/v1/entitlement |
| Method | GET |
| Operation | get_entitlement |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Projection reports which console apps the CALLER's org may open, and the plan slug that decides it. It is the READ side of the unified paywall: the org's plan tier resolved from commerce, which is a different authority from the enablement store behind GET /v1/entitlement/orgs/{org} (that one is the org's own on/off intent).
It fails SAFE-TO-LOCKED, never 500: an unvalidated principal is a 403, but a commerce outage reports every app locked at 200 rather than breaking the shell. The ENFORCEMENT path still fails open, so functionality survives the same outage even while the UI conservatively shows locked.
Request
GET /v1/entitlement takes no parameters and no body — the credential is the whole request.
Response
| Status | Body | Meaning |
|---|---|---|
200 | projectionView | ok |
200 body — 3 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
apps | body | object | — | Apps says, per console app, whether the org may open it. |
apps.* | body | boolean | — | |
tier | body | string | — | Tier is the plan slug commerce resolved for the org, or "" when the org has no active licensing subscription — which the console treats as its free default. |
Failure carries the platform error shape — see Errors.
Examples
hanzo entitlements getimport { Configuration, EntitlementApi } from 'hanzoai';
const api = new EntitlementApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getEntitlement();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import EntitlementApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = EntitlementApi(client).get_entitlement()cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.EntitlementAPI.GetEntitlement(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, entitlement_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = entitlement_api::get_entitlement(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EntitlementApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new EntitlementApi(client).getEntitlement();The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →
curl https://api.hanzo.ai/v1/entitlement \
-H "Authorization: Bearer $HANZO_API_KEY"The door reaches entitlement through the entitlements tool, which names its 3 operations with its own verbs — this one among them, under a name only the door 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": "list_entitlements"
}
}
}'How is this guide?