Available scopes
Unknown scopes are rejected. There are no sharing, billing, team, audit, or administration scopes for API keys.
Capabilities and required scopes
The backend checks a capability, then maps it to scopes. Every listed scope must be present (AND semantics):
Capabilities exercised only by undocumented surfaces are not listed here. Capabilities that are not available to API keys at all — sharing, tags, favorites, audit — are denied even when the key has broad file scopes.
Bucket scopes are a ceiling
Resource scopes cannot exceed the bucket scope:files:writewithoutbuckets:writecannot upload.folders:deletewithoutbuckets:writecannot delete a folder.buckets:readalone cannot read files, because files also requirefiles:read.- A key restricted to bucket A cannot use any operation against bucket B, regardless of scopes.
buckets:write as well as the matching files:delete or folders:delete.
Presets vs least privilege
For production, prefer explicit scopes over presets. Most integrations need one of these combinations:
The mcp scope
mcp is an integration flag, not a data permission. A key with only mcp can complete the MCP handshake but cannot read or write storage. MCP access also requires a paid subscription. See MCP server.
Changing scopes
Scopes are changed in the dashboard. A change takes effect on the next request; there is no cached token to expire. Removing a scope can break a running integration immediately. Treat scope changes like a deployment: announce them, update the consumer first where possible, then narrow the key.Diagnosing permission failures
Permission checks happen before the operation. A
403 does not mean the resource exists or does not exist.
Verify a key’s effective access
There is no public endpoint that returns a key’s scopes. Verify behavior with reads:GET /buckets/all— provesbuckets:read.GET /folders/findAll/{bucketId}— provesbuckets:read+folders:read.GET /files/findAll/{bucketId}— provesbuckets:read+files:read.