Scopes
A key holds a fixed set of scopes, chosen when you create it. Scopes cannot be widened later; to change what a key can do, create a new one and revoke the old.
An operation the key lacks a scope for returns 403 with missing_scope, naming what is missing.
The scopes
| Scope | What it opens |
|---|---|
todos:read | Todos and todo lists, with their titles, descriptions, assignees, schedules and run history. |
todos:write | Creating, updating, archiving, restoring and deleting todos and lists, and starting agent runs on a todo. |
chats:read | Chats and every message in them, including agent replies and the tool calls the agent made. |
chats:write | Starting chats, sending messages, cancelling a running chat, and archiving, restoring or deleting chats. |
agents:read | The agents in the workspace with their instructions, skills and working hours. |
agents:write | Creating agents, changing their instructions, permissions, skills and working hours, and archiving or restoring them. |
captures:read | Captures in full: the transcript of a recording, the notes taken during it, and the generated summary. |
captures:write | Creating notes, starting and stopping recordings, editing capture titles, content and tags, and archiving, restoring or deleting captures. |
The reference marks every operation with the scopes it needs, and GET /api-keys/scopes returns this same list from the server if you are building a screen around it.
Which ones you need
Grant the least that works.
- A dashboard that shows outstanding work:
todos:read. - A tool that files todos from another system:
todos:read,todos:write. - An assistant that answers questions about meetings: add
captures:read, and know what you are granting. - Something that configures agents:
agents:read,agents:write.
Write access implies the matching read in practice, since a create returns the thing it created, but the scopes are still separate: grant both when you need both.
Leaving transcripts out of it
If your integration does not need meeting content, do not grant captures:read. Nothing else stops working. A key with todos:read, chats:read and agents:read can work across the whole workspace and never read a transcript, and the key creation screen offers Read only, no capture content as a preset for exactly that.
The split exists because a capture holds what was actually said in a meeting. That is the most sensitive material in a workspace, and an integration that pipes API responses into a language model sends it somewhere you did not choose.
What scopes do not stop
Two things are worth knowing before you hand a write scope to someone else:
- A key with
agents:writecan turn off an agent’s approval requirement. - A key with
todos:writecan start agent runs, which spend Doozy Minutes.
Neither is a bug, and both are things you would want to know a third party could do. Every state change made with a key is recorded against that key, so there is a trail of what it did.