Skip to main content
Every API key carries a set of scopes. Scopes are the only permissions the public API recognizes. Role permissions from the dashboard do not expand API-key access.

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:
Consequences:
  • files:write without buckets:write cannot upload.
  • folders:delete without buckets:write cannot delete a folder.
  • buckets:read alone cannot read files, because files also require files:read.
  • A key restricted to bucket A cannot use any operation against bucket B, regardless of scopes.
Deletion is a common trap: there is no bucket-level delete scope, so file and folder deletion require 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:
  1. GET /buckets/all — proves buckets:read.
  2. GET /folders/findAll/{bucketId} — proves buckets:read + folders:read.
  3. GET /files/findAll/{bucketId} — proves buckets:read + files:read.
Write access must be tested against a disposable resource, not production data.