This is the complete catalog of API scopes. Each scope follows
the grammar resource:action (dotted resources for the WordPress layer, like
wp.cli) and gates a specific set of endpoints. Use it as the authoritative list when
minting a key with POST /v1/api-keys or mf keys create.
Rows marked Preview are reserved: the scope is
defined in the grammar and accepted at mint time, but the endpoints it will gate
aren’t wired yet.
write implies read, admin implies write. Granting sites:write also
grants sites:read; you never list both.
Wildcards expand per resource.sites:* grants every action on sites; the
global * grants every scope in this catalog except the
isolated set at the bottom.
Standalone actions are never implied.exec and raw sit outside the
read/write/admin chain — only an exact grant of wp.cli:exec grants wp.cli:exec.
vulnerabilities:read is not implied by security:read. The vulnerability feed
is its own explicit grant.
Effective permission is a triple intersection:perms(your role) ∩ scopes(key) ∩ resource-constraint(key). A scope can never
lift a key above the role that minted it. See the
security model.
site get/list, config reads, branch routes, capabilities; create, config writes, restart, PHP-version switch; delete (typed confirm_domain) and transfer need :admin
deployments:read / :write
builds, deployments, artifacts, releases; trigger builds, deploy an artifact, promote, roll back
These are the scopes for the dynamic application layer — the depth a generic PaaS
won’t touch. They’re only meaningful where the runtime advertises the matching
capability; a call the runtime can’t fulfil
returns 409 capability.unsupported. Today, wp.cli:exec is the wired one — the rest
are reserved in the grammar for the endpoints that will follow.
Scope
Gates
Runtime gate
wp.cli:exec
denylisted WP-CLI via POST /sites/{site_id}/environments/{env_id}/exec — no eval, shell, db query, or the other escape hatches