Docs Reference Endpoints HTTP endpoints Every route, grouped by surface, with the permission each one needs.
Documents 0.13.1
Updated 27 Oct 2026
Edit this page
Report a problem
On this page
Surface Prefix Authenticates with Workspace Public API /api/v1/...Authorization: Bearer orthacms_… (API token)X-Workspace-Id, optional for a one-workspace tokenAdmin API /api/...orthacms_session cookie from POST /api/auth/login, plus RBACX-Workspace-Id on workspace-scoped routes
Build integrations against /api/v1. The admin API is not versioned.
A token’s scope decides which permissions it carries: read →
content:read, media:read, segments:read; full adds content:create,
content:update, content:publish, content:delete, media:create,
segments:manage. See permissions .
Example calls
X-Reader-Tags names the reader for segments ; send
it from your backend, never a browser. Without it the reader is anonymous.
Common errors:
Status When 400Unknown query parameter, malformed body, unknown locale 401No or invalid session / token 403Missing permission (Insufficient permissions), token scope, or workspace outside the token 404Unknown type, type the workspace cannot reach, entry not visible 409Conflict — restrict delete, duplicate translation, blocked publish (protection), a stale or busy schema-builder apply 422Validation — { "message": "Entry validation failed", "issues": [...] }
Public API
Content
Method Path Permission GET/api/v1/content-typescontent:readGET/api/v1/content-types/:namecontent:readGET/api/v1/content/:typecontent:readGET/api/v1/content/:type/:idcontent:readGET/api/v1/content/:type/:id/relations/:fieldcontent:readGET/api/v1/content/:type/:id/mediacontent:readGET/api/v1/content/:type/:id/translationscontent:readGET/api/v1/content/:type/group/:groupId (+ /relations/:field, /media, /translations)content:readPOST/api/v1/content/:typecontent:createPATCH/api/v1/content/:type/:id, /group/:groupIdcontent:updatePOST/api/v1/content/:type/:id/publish, /unpublish (also by group/:groupId)content:publishDELETE/api/v1/content/:type/:id, /group/:groupIdcontent:deletePOST/api/v1/content/:type/bulkcontent:create + content:updatePOST/api/v1/content/:type/bulk/publish, /bulk/unpublishcontent:publishPOST/api/v1/content/:type/bulk/deletecontent:delete
Reads serve published entries — for a Modified entry, its published
version. ?status=draft|any needs a full token (403 otherwise).
A type’s list includes published records from shared
workspaces the workspace takes
the type from.
Public PATCH merges over stored values.
Method Path Permission POST/api/v1/media/assets — multipart, field filemedia:createGET/api/v1/media/assets/:id/raw — ?variant=thumb|previewmedia:readGET/api/v1/content/:type/:id/accesssegments:readPUT/api/v1/content/:type/:id/accesssegments:managePOST/api/v1/graphqlcontent:read + per-operation checksGET/api/v1/graphql — the schema as SDLcontent:readGET/api/v1/graphql/playground — only when API_DOCS is onpublic page POST/api/v1/mcp — stateless JSON-RPC; GET/DELETE → 405token; each tool checks its own permission
MCP is off unless MCP_ENABLED=true. A multi-workspace token names the
workspace with X-Workspace-Id or ?workspaceId= on the URL.
curl -X POST https://cms.example.com/api/v1/mcp \
-H 'Authorization: Bearer orthacms_…' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "content_list", "arguments": { "typeName": "article", "pageSize": 5 } } }' Copy
Admin API
Authentication and account
Method Path Permission POST/api/auth/login, /api/auth/logoutpublic GET/api/auth/mesession GET/api/auth/invite/:tokenpublic POST/api/auth/invite/acceptpublic GET/api/auth/reset/:tokenpublic POST/api/auth/resetpublic GET/api/auth/password-recovery — { available }public POST/api/auth/password-recovery — 202 for any address, 404 without mailpublic GET, PUT/api/preferences — the theme and the admin’s panel layout; PUT is a partial patchsession GET/api/users/:id/sessionsusers:updateDELETE/api/users/:id/sessions/:sessionIdusers:updateDELETE/api/users/:id/sessions — sign out everywhereusers:update
Single sign-on
All public and rate-limited. See single sign-on .
Method Path What GET/api/auth/ssoRegistered providers, for the sign-in buttons. [] when none GET/api/auth/sso/:provider/startRedirects to the provider GET/api/auth/sso/:provider/callbackVerifies, opens a session, redirects into the admin POST/api/auth/sso/:provider/callbackThe same, for SAML’s form post POST/api/auth/sso/:provider/backchannel-logoutEnds sessions on the provider’s word
Content, revisions and schema
Method Path Permission GET/api/content-schema, /api/content-schema/:name, /:name/filter-fieldscontent:readGET/api/content/:type — ?source=own|shared|all, ?sourceWorkspaceId=content:readGET/api/content/:type/:id (+ /media, /relations, /relations/:field)content:readGET/api/content/:type/:id/usages — links from other workspacescontent:readGET/api/content/:type/:id/references — links from this workspace, and what a permanent delete does to themcontent:readPOST/api/content/:typecontent:createPATCH/api/content/:type/:id — replaces the values bagcontent:updatePOST/api/content/:type/:id/publish, /unpublishcontent:publishDELETE/api/content/:type/:id, /api/content/:type/:id/permanentcontent:deletePOST/api/content/:type/:id/restorecontent:deletePOST/api/content/:type/bulk/publish, /bulk/publish/preview, /bulk/unpublishcontent:publishPOST/api/content/:type/bulk/delete, /bulk/restore, /bulk/purgecontent:deleteGET/api/content/:type/:id/revisions, /revisions/:numbercontent:readPOST/api/content/:type/:id/revisions/:number/restorecontent:updatePOST/api/content/:type/:id/revisions/:number/publishcontent:publish
The create, the update and the two version routes take askBeforeSiblingSync
and allowInvalidSiblings (the create also skipReferrers): the way the admin
asks before a write that changes other languages or records. See
errors .
Saved views
See saved views . Sharing a view with the
workspace additionally needs views:share, checked per write.
Method Path Permission GET, POST/api/viewscontent:readPATCH, DELETE/api/views/:idcontent:readPUT, DELETE/api/views/:id/defaultcontent:read
Export and import
See export and import .
Method Path Permission POST/api/content/:type/export/preview, /exportcontent:exportPOST/api/content/:type/import/preview, /importcontent:import (+ create/update per write)GET/api/content/:type/import/templatecontent:read
Method Path Permission GET/api/media/assets, /api/media/foldersmedia:readGET/api/media/assets/:id/rawmedia:readPOST/api/media/assets, /api/media/folders, /api/media/assets/:id/duplicatemedia:createPATCH/api/media/assets/:id, /api/media/folders/:idmedia:updateDELETE/api/media/assets, /api/media/folders/:idmedia:delete
Users, tokens and activity
Method Path Permission GET/api/users, /api/users/:id, /api/users/rolesusers:readGET/api/users/:id/sign-inusers:updatePOST/api/users/invites, /api/users/:id/invites/resendusers:createPOST/api/users/invites/batch — all or nothingusers:create and users:readPATCH/api/users/:idusers:updatePOST/api/users/:id/disable, /enable, /password-resetusers:updateDELETE/api/users/:id/invitesusers:deletePOST/api/users/:id/reveal-link — 409 MAIL_NOT_CONFIGURED without mailusers:manageGET/api/api-tokenstokens:readPOST/api/api-tokenstokens:createDELETE/api/api-tokens/:idtokens:deleteGET/api/activity, /api/activity/export (CSV)activity:readGET/api/activity/entries/:entryIdcontent:readGET/api/activity/dead-lettersactivity:readPOST/api/activity/dead-letters/:id/retry — 404 unknown/delivered, 409 not parkedactivity:manage
Workspaces
Method Path Permission GET/api/workspacesworkspaces:readGET/api/workspaces/slug-availableworkspaces:createPOST/api/workspacesworkspaces:createPATCH/api/workspaces/:id — incl. { "isShared": true }workspaces:updatePOST/api/workspaces/:id/archive, /unarchiveworkspaces:updateGET/api/workspaces/:id/archive-impactworkspaces:updateDELETE/api/workspaces/:idworkspaces:deleteGET/api/workspaces/:id/entry-countworkspaces:deletePOST/api/workspaces/:id/membersworkspaces:updateDELETE/api/workspaces/:id/members/:userIdworkspaces:updatePOST/api/workspaces/:id/content — { slug, sourceWorkspaceId? }workspaces:updateDELETE/api/workspaces/:id/content/:slug — ?source= for a shared grantworkspaces:updateGET/api/workspaces/:id/content/:slug/entry-countworkspaces:updateGET/api/workspaces/:id/shared-sourcesworkspaces:updateGET/api/content-typesworkspaces:create or workspaces:update
shared-sources is new in 0.7.0: the shared workspaces this one can take a
shared grant from, each with the types it offers.
Alarms
See alarms .
Method Path Permission GET/api/alarms/rulesalarms:readPOST/api/alarms/rules, /api/alarms/rules/previewalarms:managePATCH, DELETE/api/alarms/rules/:idalarms:managePOST/api/alarms/rules/:id/rescanalarms:manageGET/api/alarms/findings, /findings/by-entry, /findings/summaryalarms:read
Segments
See segments .
Method Path Permission GET/api/segments, /api/segments/lookup, /api/segments/:idsegments:readPOST/api/segmentssegments:managePATCH, DELETE/api/segments/:idsegments:manageGET/api/segments/entries/:entryIdsegments:readGET/api/segments/:id/usage — per workspacesegments:read and content:readPUT/api/segments/entries/:entryIdsegments:manage
The admin itself sends audiences in the entry save’s extensions, so access
commits with the save and lands in its revision.
Publication protection
See publication protection .
Method Path Permission GET/api/protection/rulesprotection:managePUT, DELETE/api/protection/rules/:kind/:slugprotection:manageGET/api/protection/entries/:type/:idcontent:readGET/api/protection/entries/:type/statuscontent:readGET/api/protection/entries/:type/:id/reviewerscontent:updatePOST, DELETE/api/protection/entries/:type/:id/requestcontent:updatePOST, DELETE/api/protection/entries/:type/:id/approvecontent:approveGET/api/protection/types/:typecontent:readGET/api/protection/queue — ?mine=1content:readGET/api/protection/queue/approved — what you approved, last 30 dayscontent:read
A blocked publish is 409 (protection.insufficient_approvals,
protection.token_refused), never 403. { "bypass": true } on the publish
body without protection:manage is 403 protection.bypass_refused.
Webhooks
Global, not workspace-scoped. See webhooks .
Method Path Permission GET/api/webhook-eventswebhooks:readGET/api/webhooks, /api/webhooks/:idwebhooks:readPOST/api/webhooks — returns the secret once webhooks:managePATCH, DELETE/api/webhooks/:idwebhooks:managePOST/api/webhooks/:id/secret (rotate), /api/webhooks/:id/test (ping)webhooks:manageGET/api/webhooks/:id/deliveries — ?status=, ?eventKind=webhooks:readGET/api/webhooks/:id/deliveries/:deliveryIdwebhooks:readPOST/api/webhooks/:id/deliveries/:deliveryId/redeliverwebhooks:manage
A refused URL is 422 , not 400. A delivery id from another endpoint is 404.
Schema builder
Global, not workspace-scoped. See the schema builder .
Method Path Permission GET/api/schema-builder/documentcontent:readPOST/api/schema-builder/planschema:manage + an editable serverPOST/api/schema-builder/apply — 202 { operationId, bootId }schema:manage + an editable serverGET/api/schema-builder/operations/:idschema:manage
Plan and apply answer 403 schema-builder.disabled in production, with
SCHEMA_BUILDER off, or without the source tree — whatever the caller’s role.
A stale draft or a second apply is 409 (schema-builder.stale,
schema-builder.busy).
Localization, insights and copilot
Method Path Permission GET/api/i18n/localessession GET/api/i18n/content/:type/:id/localescontent:readPOST/api/i18n/content/:type/locale-summarycontent:readGET/api/insights/content/{totals,pipeline,velocity,stale,unshipped,punchcard}content:readGET/api/insights/content/stale/records, /unshipped/recordscontent:readGET/api/insights/media/{storage,uploads,alt}, /alt/missingmedia:readGET/api/insights/i18n/coveragecontent:readGET/api/insights/protection/reviewscontent:readPOST/api/copilot/runscopilot:usePOST/api/copilot/runs/:runId/permission, /permission/extendcopilot:useGET/api/copilot/conversations, /conversations/:idcopilot:usePATCH/api/copilot/conversations/:idcopilot:useGET/api/copilot/models, /proposals, /proposals/:idcopilot:useGET/api/copilot/skills, /api/copilot/suggestionscopilot:useGET/api/copilot/usage — today’s spend and quotacopilot:useGET/api/copilot/skills/manage, /skills/:idcopilot:skills:managePOST, PATCH, DELETE/api/copilot/skills, /skills/:idcopilot:skills:manage
API reference document
Path What /referenceInteractive API reference /reference/jsonRaw OpenAPI
Outside the /api prefix; both paths are configurable in the host’s docs
options.
On by default outside production; in production only with API_DOCS=true.
MCP is not in the document — JSON-RPC over one route is not REST.
Previous Permissions Next Packages