Scopes

Every API key carries a list of scopes. Without the right scope you get a 403:

{
  "error": {
    "code": "missing_scope",
    "message": "api key is missing required scope 'notes:write'",
    "details": {
      "required": ["notes:write"],
      "missing": ["notes:write"]
    }
  }
}

Convention

<module>:<verb>. Three verbs:

  • read — every GET endpoint in that module
  • write — POST / PUT / PATCH (creates and updates)
  • admin — DELETE + role/share management + lock toggling

Catalog

ScopeWhat it covers
notes:readTree, detail, search
notes:writeCreate + update; no root deletion
notes:adminDelete folders, manage shares, lock toggling
sheets:readWorkbooks, tables, rows
sheets:writeCreate tables and rows, edit cells
sheets:adminDelete tables and columns
files:readBrowse and download
files:writeUpload and edit metadata
files:adminPermanent delete (hard delete)
inbox:readInbox reads
inbox:sendSend email from connected accounts
workspaces:readList + detail of workspaces
users:readList users

Principle of least privilege

Mint a key with only what the AI / script actually needs. If an agent just reads notes, don't give it write. Keys without expiry can be revoked any time at Settings → Account → API keys.

God-mode (*)

There's a special scope * that bypasses every check. It's not exposed through the UI — only env-admin tooling (break-glass) can mint it. Regular users never get it.