Authentication
Keys are minted in the Dev tab of the app by workspace owners, admins and analysts. Each key is bound to the member who created it and to exactly one workspace.
Send the key in either header. Both are equivalent.
Authorization: Bearer ghost_... # or X-Api-Key: ghost_...
The workspace comes only from the verified key - it is never read from input. On every request the server re-checks that the key is enabled, that its owner is still a member, and that workspace API access is on. A revoked key, a departed member or a paused workspace loses access on the next call.
Scopes
Scopes are selected when a key is created and are independent - none implies another, including admin. Select each grant the integration needs. Workspace role restrictions apply on top: an admin-scoped key does not make its owner a workspace administrator. The /compute/* refresh endpoints require both the admin grant and owner/admin membership; graph.agent_run instead permits owners, admins and analysts with graph:read, graph:write and research:run.
Who can do what
Change an existing key's grants
A Ghost system administrator can update a specific existing developer API key's grants in place through an audited operator change. The key secret stays the same; rotation is not required just to add or remove a grant. The current Dev UI supports creating and revoking keys, not editing grants, and there is no public API endpoint for a key to change its own permissions. Give the administrator the workspace, key name or ID, and exact grants to add or remove; never send the key secret.
After an update, GET /me returns the current grants and workspace role, and GET /capabilities shows authorization for catalog operations. The server reads current grants on each request and revalidates queued execution; removing a grant does not undo effects already applied. Changing key grants does not change workspace membership.