Everything goes through one endpoint, POST /api/, with an action field naming what to do. For the shape of the request and the reasoning behind a single entrypoint, see The API. This page is the catalogue.
Authentication is bearer-only (no cookies, which removes CSRF). A magic-link flow issues the token: request_code → email → verify_code → token in Authorization: Bearer …. Each row lists the permission the action requires; the rights themselves are defined in Access & permissions.
Response and error conventions
Success usually carries success: true. Queries return a single result (for resolve/byPath) or a plural results with a count. Error statuses you’ll meet:
Status
Meaning
400
Validation / bad request
401
Not authenticated
402
Plan limit reached (carries limitType)
403
Permission, feature gate, or coming-soon
404
Not found
409
Conflict — path in use, lock held, connector slug clash
413
Body too large
422
Operation failed
429
Rate limited (Retry-After on auth backoff)
A global ceiling of 120 requests/hour per IP applies; health and log_client_error have their own limits.
Auth
Action
Does
Permission
request_code
Request a six-digit login code by email
none (auth backoff)
verify_code
Exchange the code for a bearer token
none
revoke
Revoke the current session token
bearer
Node lifecycle
Action
Does
Permission
create
Create a node as a draft; routable when given a path
Server-side render a form or block (menu/page reserved)
write
collections
The type-picker vocabulary
view
browser
Drawer data — page, collection and media sections for the editor browser
bearer
Worker
Action
Does
Permission
rebuild
Rebuild registry/indexes and recompile all live nodes
manage.settings
maintain
Run cron maintenance now (stale locks, sessions, rate files)
manage.settings
cron_status
Cron state and log
manage.settings
wipe
Clear .index / .sessions and stale lock backups
manage.settings
reset
Reset worker state
manage.settings
Observability
Action
Does
Permission
health
Per-subsystem status; 200 healthy / 503 otherwise
none (60/min)
log_client_error
Browser error → runtime log
none (10/hour, 2 KB cap)
Wizard
The wizard picks AnthropicLLMClient when an AI connector is active, otherwise the built-in CtxrLLMClient.
Action
Does
Permission
wizard.turn
One chat cycle (ask → assess → execute)
view (execution gated deeper)
wizard.confirm
Typed confirmation for a destructive step
view
wizard.sessions / wizard.session
List sessions / fetch one
view
Connectors
Secrets are always redacted in responses, and every mutation emits an audit event.
Action
Does
Permission
connector.list
Instances, available kinds, categories, plan tier
view
connector.install
New instance (inactive)
manage.settings
connector.configure
Partial config update
manage.settings
connector.test
Run the kind’s test callable
manage.settings (10/hour)
connector.activate / connector.deactivate
Flip status; swap-confirmation on operation overlap
manage.settings
connector.uninstall
Remove the config
manage.settings
Incoming and OAuth (edge routes)
These sit outside the action map, with their own authentication.
POST /api/incoming/{provider} — webhooks. Signature-verified (not bearer), routed to a synthetic actor with a whitelisted set of operations, then mapped to an operation invoke.
GET /oauth/callback/{kind} — OAuth return, bound through the state parameter, handled by the connector’s adapter.
The openai connector is registered but marked coming-soon, so it can’t be installed yet.