Scopes
Every API key carries a list of scopes. A scope is written <resource>:<level>, for example experts:read.
Scopes are deny by default. A key can call a route only when the route names a scope the key holds. A route that names no scope can’t be called with a key at all, whatever the key holds.
You choose scopes under Permissions when you create or edit a key. See Authentication.
The rules
- Write includes read.
experts:writealso allows everythingexperts:readallows. Nothing else is implied. - Runtime scopes stand alone.
chat:write,voice_sessions:write,meetings:joinandmcp:useare separate switches. In particular,meetings:writenever grantsmeetings:join: sending an expert into a call costs money and puts it in front of people outside your workspace. - MCP needs two scopes per tool.
mcp:useopens the MCP endpoint. Each MCP tool also needs its own scope (chat:write,knowledge:readorconversations:read). A tool the key can’t use isn’t listed. See MCP. - Expert limits apply on top. A key limited to some experts is refused for every other expert, whatever its scopes. See Expert-restricted keys.
When a key lacks a scope, the API answers 403 with error: "insufficient_scope" and names what is missing:
Resource scopes
In the app these rows offer None, Read or Write.
Runtime scopes
In the app these rows are a single on/off switch.
There is no webhook scope. Webhook endpoints are managed in the app only. See Webhooks.
Common routes by scope
The API reference lists every route with the scope it needs. These are the ones most integrations start with.
The API calls experts “agents” in its paths: /v1/agents/{id} is an expert.
What keys can’t do
Some routes are for people signed in to the app, never for keys. They include:
- creating, rotating or revealing API keys, and managing service accounts;
- managing webhook endpoints and reading their delivery log;
- deleting or duplicating an expert, and resetting its public link;
- phone numbers, phone calls and campaigns;
- emailing a meeting summary;
- members, billing and workspace settings.
A key sent to one of them is refused with 403 and error: "not_available_to_api_keys". That goes for single routes next to key-accessible ones (deleting an expert, for example) and for whole app-only sections (Developers, billing, workspace settings).
Pick the smallest set
Give each key only what its job needs: