/api/v2/ is reachable with a machine credential and demands
a scope, named on the operation as x-required-scope in the generated reference.
Scopes do not imply one another
There is no hierarchy, no wildcard and no implication. A key that may read conversations cannot run an agent. A key that may edit an assistant cannot preview its drafts. A key that may replay a webhook delivery cannot rotate its signing secret. A request outside a key’s scopes is 403 naming the missing scope. The endpoint is never silently skipped and never quietly narrows to nothing:The registry
adminapi/services/developer.py::SCOPES is canonical — a key cannot be created
with a scope outside it, so a typo becomes a 400 rather than a key that silently
authorises nothing. There are 42 entries. They are listed here in full,
including the ones /api/v2/ never uses, because “what can this key do” should
have one answer and not two.
The v2 runtime
agent:preview is issued on its own and is implied by nothing. Asking for a
preview is free; being allowed is not. Without the scope the answer is 404,
not 403 — see Responses.logs:read is deliberately its own scope rather than a corner of usage:read
(a billing figure) or chat:read (transcript content). It reads the shape of
an execution — status, latency, model, tokens, tool names, error code — and a
key that may debug an integration should not thereby read what that
integration’s users said. There is no logs:write: nothing writes a log
through an API.Documents and intelligence
Jobs
Read and cancel are split from create so a read-only monitoring integration
cannot queue work.
Webhooks
Knowledge and the v1 platform surface
These predate v2 and are shared with/api/v1/. knowledge:read and
knowledge:write are the two that /api/v2/knowledge/ingestions uses.
tools:read exists so that listing tools does not have to demand write. The
write-only version failed closed but over-demanded, which teaches integrators
to ask for more scope than they need.Not issued on a workspace key
Three scopes are in the same registry but never granted to a customer key, because no customer surface declares them.
The
ops: pair is the second lock, never the first: every endpoint declaring one
also demands a live staff operator record, which no machine credential has.
Issuing one on a customer or partner key authorises nothing. They are in the
registry at all because a declared scope no key could ever hold is a permanently
locked door with a plausible-looking sign on it.
tenants:write is coarse on purpose — a partner that can provision a tenant can
already configure it, so splitting read from write there would be a distinction
without a difference. See the Reseller API tab.
These docs say reseller; the marketing site says Partner API. They are
the same product and the same
tgpk_ credential. The URLs here stay
/reseller/….Two endpoints take no key at all
POST|PUT /documents/uploads/{token} and GET /documents/downloads/{token} are
unauthenticated, and that is deliberate rather than an oversight. The signed
token in the path is the credential: it names one upload or one document, for
one purpose, inside one isolation boundary, for a bounded window — and it was
minted only after a credentialed caller passed both the scope check and the
credit gate.
They are documented rather than hidden. Half a flow in a public document is worse
than none: an integrator who can request an upload target and cannot find out
what to do with it will guess.
A grant is re-checked against the row on redemption, for something the signature
cannot cover. A valid grant for a document that has since been deleted is a 404.
A signature proves the link was issued; it does not prove the thing it points at
still exists and is still yours.

