401 session_required here.
Get your organization
$SESSION is the session token sign-in
returns.
Rename your organization
{owner_slug}:{space_name}, for example
acme:demo), which is an address customers already write down and share, so
changing it would silently break every one of those addresses.
Projects
Projects group API keys under an organization. Every organization needs at least one project before it can create an API key.POST returns the created project in the same shape as the list items above.
Members
GET /v1/members returns every member in your organization, as a list of the same
shape.
Invite a member
POST /v1/members/invite is restricted to the owner.
role must be one of the roles in your organization’s role set, excluding owner.
Nobody can be invited directly as an owner.
Remove a member
DELETE /v1/members/{member_id} returns 204 No Content. Owner only.
Space invitations
When someone shares a space with you (from the dashboard’s space members page), the invitation is addressed to your email and waits for you to act on it. These endpoints back that flow; any signed-in member can call them.GET /v1/invitations/pending
403 invite_email_mismatch otherwise, so a forwarded invitation email does not hand
over the seat), and an org-level invitation token is rejected with
400 not_a_space_invite — joining an organization goes through the signup flow the
invitation email links to.
Choosing an organization per request
A person can belong to several organizations: their personal one, plus any shared organization they have joined. Most requests need no extra input. A request runs in your personal organization unless it names another, and it names another in one of three ways: theX-Anona-Org header (or an org_id field on record, batch record,
retrieve and reason), an API key minted in that organization, or a dashboard session
switched into it.
What naming an organization does depends on the credential:
Send
X-Anona-Org once, as a UUID. A repeated header, or a value that is not a UUID,
is 400 invalid_org_id, as is an MCP tool call’s org_id argument that is not a UUID.
A malformed org_id in a request body is 422 validation_error. When both the header
and org_id are sent and differ, the request is 400 org_mismatch.
org_id or the header to work in a shared organization afterwards.
Slack and GitHub integrations
A non-owner who installs or disconnects gets
403 integration_owner_only; a member who is neither owner nor admin who binds, unbinds or backfills gets 403 slack_admin_only or 403 github_admin_only.
These rules take effect once shared organizations are enabled. Until then, owners and
admins install and disconnect (anyone else gets 403 slack_admin_only or
403 github_admin_only), and any member can bind, unbind and backfill.
Organizations that have never created an API key can still share spaces out and run
connectors. A connector resolves the person who spoke to their membership in the
organization it is installed in, and falls back to the membership their linked account
holds when that one has no grant.
Error responses
See the full error reference.