Reference

API reference

The complete surface. Nothing here is hand-maintained — the interactive reference and this list are both generated from the schemas the API validates against, so they cannot drift from what the code does.

Updated October 6, 2026

3 min read

Conventions

  • Base URL: https://api.cmskite.com. Every path below is under it.
  • Authentication is Authorization: Bearer <credential>.
  • A session sends X-Tenant-Id; a session writing content also sends X-Project-Id. A project key sends neither — it already knows.
  • Request and response bodies are JSON. content-type: application/json is required on writes.
  • Mutations accept Idempotency-Key. A retry with the same key returns the original result for 24 hours.
  • Collections are cursor-paginated and carry RateLimit headers.
  • “Agent” in the credential column means an AI tool you connected by signing in through the MCP server (see MCP and automation).

Content

MethodPathWhat it doesAuth
GET/v1/blog/postsList postsKey · session · agent
GET/v1/blog/posts/{id}One post by idKey · session · agent
GET/v1/blog/posts/slug/{slug}One post by slugKey · session · agent
POST/v1/blog/postsCreate a postSession · agent
PATCH/v1/blog/posts/{id}Update a postSession · agent
DELETE/v1/blog/posts/{id}Delete a postSession · agent
GET/v1/blog/posts/{id}/relatedPosts like this oneKey · session · agent
GET/v1/blog/searchFull-text searchKey · session · agent
GET/v1/blog/feedRSS, Atom or JSON FeedKey · session · agent
POST/v1/blog/posts/{id}/previewMint a link to an unpublished postSession · agent
GET/v1/blog/preview/{token}Read a draft with that linkPublic (token)
GET/v1/blog/categoriesList categoriesKey · session · agent
GET/v1/blog/categories/{id}One categoryKey · session · agent
POST/v1/blog/categoriesCreate a categorySession · agent
PATCH/v1/blog/categories/{id}Rename or move a categorySession · agent
DELETE/v1/blog/categories/{id}Delete a categorySession · agent
GET/v1/blog/tagsList tagsKey · session · agent
GET/v1/blog/tags/{id}One tagKey · session · agent
POST/v1/blog/tagsCreate a tagSession · agent
PATCH/v1/blog/tags/{id}Update a tagSession · agent
DELETE/v1/blog/tags/{id}Delete a tagSession · agent
GET/v1/blog/authorsList authorsKey · session · agent
GET/v1/blog/authors/{id}One authorKey · session · agent
POST/v1/blog/authorsCreate an authorSession · agent
PATCH/v1/blog/authors/{id}Update an authorSession · agent
DELETE/v1/blog/authors/{id}Delete an authorSession · agent
GET/v1/blog/mediaList mediaKey · session · agent
POST/v1/blog/mediaRecord a file, get an upload URLSession · agent
POST/v1/blog/media/{id}/completeConfirm an upload finishedSession · agent
DELETE/v1/blog/media/{id}Delete mediaSession · agent

Workspaces, projects and credentials

MethodPathWhat it doesAuth
GET/v1/overviewWorkspace overview figuresSession
POST/v1/workspacesCreate a workspaceSession · agent
DELETE/v1/workspaces/{id}Delete a workspaceSession (owner)
GET/v1/projectsList projectsSession · agent
GET/v1/projects/{id}One projectSession · agent
GET/v1/projects/{id}/summaryFigures for one projectSession
POST/v1/projectsCreate a projectSession · agent
PATCH/v1/projects/{id}Rename a project or change its settingsSession · agent
DELETE/v1/projects/{id}Delete a projectSession (owner)
GET/v1/projects/{projectId}/api-keysList API keysSession
POST/v1/projects/{projectId}/api-keysCreate an API keySession
DELETE/v1/api-keys/{id}Revoke an API keySession
POST/v1/api-keys/{id}/rollRoll an API key: a new key now, the old one stops after graceHours (0, 1, 24, 72 or 168)Session
GET/v1/oauth/connectionsThe AI tools you have connectedSession
DELETE/v1/oauth/connections/{id}Disconnect an AI toolSession
GET/v1/audit-logsWhat has happened in this workspaceSession · agent

Plan and usage

MethodPathWhat it doesAuth
GET/v1/plansThe public plan catalogue and pricesPublic
GET/v1/billingCurrent plan, catalogue and resolved limitsSession
POST/v1/billing/quoteWhat a plan would cost at your usageSession
GET/v1/usage/summaryUsage for a periodSession
GET/v1/usage/seriesUsage over timeSession
GET/v1/usage/endpointsMost-used endpointsSession
GET/v1/usage/outcomesRequests by outcomeSession
GET/v1/usage/projectsTraffic per projectSession
GET/v1/account/usageUsage against every limit on the planSession
GET/v1/network/egressThe IP addresses we call out fromSession

Your own database

MethodPathWhat it doesAuth
GET/v1/projects/{id}/databaseWhere this project stores contentSession
POST/v1/projects/{id}/database/testTry a connection without saving itSession
PUT/v1/projects/{id}/databasePoint the project at your MongoDBSession (owner)
POST/v1/projects/{id}/database/migrateCopy existing content acrossSession (owner)
GET/v1/projects/{id}/database/migrationHow the migration is goingSession
POST/v1/projects/{id}/database/activateStart serving from itSession (owner)
GET/v1/projects/{id}/database/exportDownload everything storedSession
DELETE/v1/projects/{id}/databaseGo back to the managed databaseSession (owner)

Accounts

MethodPathWhat it doesAuth
GET/v1/auth/google/startBegin signing in with GooglePublic
GET/v1/auth/google/callbackWhere Google returns toPublic
POST/v1/auth/onboardingCreate the first workspace, when sign-in could notSession
POST/v1/auth/refreshExchange the refresh cookieCookie
POST/v1/auth/logoutLog outSession
GET/v1/auth/meThe current user and their workspacesSession

Reader analytics

What readers did, as opposed to what your server asked us for. Events are reported by the page that rendered the post — the SDK does this for you — and read back from rollups, never from raw events.

MethodPathWhat it doesAuth
POST/v1/blog/eventsReport views and clicksKey
GET/v1/analytics/content/summaryViews, readers and clicks over a rangeSession · agent
GET/v1/analytics/content/top-postsThe posts readers actually readKey · session · agent
GET/v1/analytics/content/posts/{id}One post: series, links pressed, referrers, countriesSession · agent
GET/v1/analytics/content/post-totalsTotals for up to 50 posts you nameKey · session · agent

A key reads only the public figures of its own website: top posts and post totals, the numbers a site shows its readers. The range series and the per-post breakdown are yours, not your readers’, so they answer a signed-in session or a connected agent and never a key.

Team

MethodPathWhat it doesAuth
GET/v1/membersWho is in this workspaceSession
GET/v1/members/rolesThe roles a member can holdSession
POST/v1/membersInvite somebodySession (admin)
PATCH/v1/members/{id}Change a member’s roleSession (admin)
DELETE/v1/members/{id}Remove a member or withdraw an invitationSession (admin)
POST/v1/members/{id}/resendSend the invitation link againSession (admin)
GET/v1/invitations/{token}What an invitation link is offeringPublic (token)
POST/v1/invitations/acceptJoin the workspaceSession

Webhooks

MethodPathWhat it doesAuth
GET/v1/projects/{projectId}/webhooksList webhooksSession · agent
POST/v1/projects/{projectId}/webhooksAdd oneSession (admin)
POST/v1/projects/{projectId}/webhooks/{id}/statusPause or resume oneSession (admin)
DELETE/v1/projects/{projectId}/webhooks/{id}Remove oneSession (admin)
GET/v1/projects/{projectId}/webhooks/{id}/deliveriesWhat was sent, and what came backSession · agent

Your own file storage

MethodPathWhat it doesAuth
GET/v1/projects/{id}/storageWhere this project stores filesSession
POST/v1/projects/{id}/storage/testTry credentials without saving themSession (owner)
PUT/v1/projects/{id}/storagePoint the project at your bucketSession (owner)
POST/v1/projects/{id}/storage/activateStart serving from itSession (owner)
DELETE/v1/projects/{id}/storageGo back to managed storageSession (owner)

Versioning

The version is in the path. Adding a field or an endpoint, or adding an error code, is not breaking and happens inside v1. Removing a field, renaming one, tightening a type or changing what an error code means is breaking and requires v2.

The OpenAPI document is checked into the repository and regenerated on every release check, so a change to it has to be looked at rather than shipped by accident.