Scopes & permissions

The scope catalog, prefix scopes, and fail-closed semantics that make a key a permission boundary.

A scope is the unit of permission on a sky_ key. The key is the boundary: tools whose required_scopes are not present fail closed. Grant the fewest scopes an agent needs.

Scope catalog

ScopeGrants
account:readThe key's own workspace context and workspace overview — wallet, agents, numbers, calls, SMS, usage.
wallet:writeInitiate owner-approved purchased-wallet top-ups with create_wallet_topup on full MCP. OAuth consent does not approve a payment or grant REST billing/settings access.
coverage:readCoverage, number catalog, agent catalog, requirements.
agents:readRead agents, the public agent catalog, and safe configuration such as voice stacks and workflow drafts.
agents:writeCreate and configure agents; set voice stacks.
trial_calls:writeCreate offline synthetic trial fixtures; no live shared-number PIN calling.
numbers:readList numbers, read number rules, list phone servers.
numbers:writeRequest numbers, update rules, create/test phone servers.
calls:readList calls, read call status.
calls:writePlace policy-gated outbound calls.
recordings:readRead recording metadata, disclosure, and transcripts, including simulation conversation content.
sms:readRead SMS conversations and message text.
sms:sendSend policy-gated SMS.
policy:evaluateEvaluate outbound policy and authorize outbound.
onboarding:readRead the workspace capabilities.
onboarding:writeRequest workspace capabilities.

Content scopes are enforced field by field. A tool that mixes content with other data, such as send_sms or get_simulation_run, stays callable at its base scope and omits SMS text or conversation content without sms:read or recordings:read. account_overview never includes SMS message content. Subscribing a webhook to sms.received or call.extraction.ready needs the matching content scope, and changing a webhook address needs both. See Content fields.

Prefix scopes

A prefix scope covers every leaf under it. sms:* grants both sms:read and sms:send; grant the leaf for least privilege, the prefix when the whole group is genuinely needed.

API keys and OAuth grants

A delegated agent key cannot self-grant billing or control-plane permissions. Requested API-key scopes are clamped server-side to what the minting credential holds; workspace keys exclude operator:*, worker_jobs:read, worker_jobs:write and provider_mutations:*. An authorized workspace API key can carry wallet:write, so keep its billing access out of a delegated key unless needed.

OAuth grants are separate from API-key delegation. A full MCP connection can receive optional wallet:write through explicit consent; it is offered unticked when neither requested nor already granted. That OAuth token works only on MCP, not REST billing or settings routes. Each top-up still needs separate owner approval of the exact amount, currency and purpose. The read-only connector cannot receive this payment permission. See OAuth permissions.

Fail-closed

No partial execution

A tools/call for a tool whose required_scopes are missing returns missing MCP scopes: X and does nothing. There is no best-effort fallback. Every call is also pinned to the key's organization — a mismatched organization_id is rejected with MCP organization mismatch.

See Authentication & keys for minting, rotating, and revoking keys.