The gates, in order
Gates that run before the handler — 1 through 7 — do not consume trial API quota. That matters when you are debugging: a burst of
403s is not the same as a burst of successful calls.
Company boundary
The REST storage API is company-scoped. A key authenticates as the company workspace and can only reach that company’s buckets, folders, and files. Individual EverSpark accounts are rejected at gate 3. The one first-party exception is a device-bound backup key used by the enrolled desktop agent. It is not a general-purpose path for third-party integrations and it cannot be created through the public API.Scopes
Scopes are named capabilities, not HTTP verbs. The set is small on purpose:
The bucket scope is a ceiling. A key with
files:read but no buckets:read still fails on a file read. In practice, storage scopes come in pairs:
Bucket restriction
A key can be unrestricted or limited to explicit bucket IDs.- Unrestricted: the key can target any bucket in the company, subject to scopes.
- Restricted: the key can target only the listed buckets.
403 API_BUCKET_SCOPE_DENIED.
This is the single most effective way to limit blast radius. Prefer a per-service key restricted to the buckets that service actually needs.
Company roles versus API scopes
Do not confuse them.
An API key cannot create or delete buckets, manage sharing, change billing, or administer the company, regardless of scopes. See Scopes and permissions.
Step-up authentication
Sensitive account actions require re-verification of the human user:- creating an API key,
- rotating an API key,
- revoking an API key,
- deleting the account,
- changing password or email.
Session authentication is separate
The dashboard uses browser sessions and JWTs. Those credentials do not authenticate the REST API. Conversely, an API key does not authenticate dashboard routes. This separation is intentional: a stolen browser cookie does not become a machine credential, and a leaked API key does not become a dashboard login.Operational guidance
Diagnosing a 403
- Read the response body. If it has a
code, the gate is explicit. - No code usually means a missing scope. Compare required scopes for the operation.
API_BUCKET_SCOPE_DENIEDmeans the key is restricted to other buckets. Check the bucket ID.API_KEY_SURFACE_DENIEDmeans the route family is not part of the storage surface.API_COMPANY_ONLYmeans the account is individual, not a company workspace.
Related
Scopes and permissions
Full scope reference and presets.
API keys
Creation, rotation, and revocation.
Error codes
What each stable code means.
Encryption architecture
What encryption does and does not protect.