What a customer is entitled to
The read your own backend gates on: one of your customers’ plan and overrides, already merged.
The key’s environment scopes it — a live id asked with a test key matches no row — and there is no environment parameter, ever: the environment comes off the stored key.
Cached, so calling it per request is reasonable. What it costs when the cache misses is two reads, and what it never costs is a call to your payment gateway: this answers from the local mirror, which is why it keeps working while the gateway does not.
Use GET /v1/contact/entitlements instead when the caller is the customer’s own browser holding a contact session — same answer, no server key in the page.
Authorizations
An organization API key, uk_sk_live_… or uk_sk_test_…. The environment is resolved from the stored key row on every request, never from a request parameter.
Every route behind this credential is rate limited per key — 1000 requests a minute — with a second ceiling of 3000 a minute across all the keys of one environment, so splitting your traffic across keys isolates it and minting more keys does not buy more of it. A test key can never spend a live key's allowance. Every response carries the current state in headers; see the rate-limits guide.
Path Parameters
The customer.
Response
The resolved grant.
What one of your customers may do, resolved: their subscription's plan, with the overrides you promised them applied on top. This is the answer your own gate should read — the merge is done here so you never reimplement it from the pieces.
Every feature in the environment's catalogue is present, including the ones the plan does not carry, so a client can render an offer rather than an absence. A feature the plan carries and an override withholds is present and "enabled": false.
The key of the plan behind this answer. none means the customer is on no plan — never subscribed, or the only subscription is cancelled — which is a complete answer and not an error. unknown never appears in a 200: an answer nobody could resolve is a 503, not a plan.
"pro"
Always true in a 200 here. The field exists because it is false on GET /v1/organization/entitlements, where an unresolved read still has a truthful body to send — see that operation.
Keyed by your feature key, the string your own code gates on.