Skip to main content

List Roles

Returns your tenant’s permission roles. This is the endpoint that makes role_ids usable from code: a Terraform module or a provisioning script cannot hard-code a per-tenant UUID, and before this existed the only way to find one was to open the admin UI and copy it out of the URL bar. Read-only, permanently. There is no POST, PATCH or DELETE on /v1/roles.
Only the seeded key roles (seeded: true) are accepted in role_ids. Custom roles are being retired in favour of per-key permissions: no new one can be created, and this list still returns any your tenant already has (seeded: false) — POST /v1/api-keys refuses those with 403 forbidden. Filter on seeded when choosing a role.
Requires the role:list permission, which all four seeded machine roles carry.

Query Parameters

Response

The rules a role grants are deliberately not returned. Enumerating them would hand every machine credential in the tenant a map of your authorization surface. To see what a role grants, open it in the admin UI.

The seeded machine roles

No role restricts which routes a key can call. Roles are enforced on the /v1 management API. The proxy does not evaluate them: any active key can call any enabled route in its mode (Live or Test), whatever roles it holds — so Key — Invoke and Key — Read-only behave identically on proxied calls today. Contain proxied use with each route’s Require authorized clients setting and IP allowlist, and with routes:invoke scopes on OAuth access tokens, which the proxy does enforce.
Key — Infrastructure deliberately excludes, and explicitly denies:
  • secret:reveal — a provisioning credential never needs the plaintext of a secret it created. KnoxCall holds the plaintext; that is the product.
  • secret:custody_enable / custody_disable / custody_rotate — custody transitions decrypt the current administrative credential server-side.
  • workload_binding:create / delete — a binding is a permanent route to a live credential for anyone presenting a matching JWT.
  • ephemeral_proxy:invoke — one-shot runtime invocation against live credentials. It is not infrastructure state, and no Terraform resource models it.
None of those four can be reached by a wildcard rule either: they require an exact (resource_type, action) allow, so a legacy *:* key does not silently hold them.
Excluding secret:reveal does not make an Infrastructure key plaintext-free. It still holds operations that return plaintext or mint live credentials by design — transit:decrypt, vault:detokenize, secret:oauth_token_get, pki:issue (the leaf certificate’s private key), dyn_db_cred:mint and ai_gateway:mint — and it can create and update routes and workflows, which inject your secrets into the requests they send. Re-pointing one at another host sends the secret there. Treat an Infrastructure key as able to reach your secrets, and store it accordingly.

Examples

Errors