API reference.

Programmatic content retrieval and event subscriptions. Edge-native endpoint routing keeps reads sub-50ms globally.

Authentication

Two surfaces, two auth shapes:

  • Read API. Public reads use a workspace-scoped public key in the URL. Authenticated reads (drafts, scheduled-but-unpublished) use a Bearer token.
  • Write API. Bearer token only. Tokens are workspace-scoped and role-scoped.

REST shape

Read a published piece

GET /v1/sites/{site_id}/pieces/{slug}
Authorization: Bearer ${TOKEN}  // optional for public reads

200 OK
{
  "type": "blog-post",
  "slug": "edge-native-cms",
  "title": "Why edge-native CMS",
  "lede": "...",
  "body_html": "...",
  "publish_at": "2026-04-22T13:00:00Z",
  "byline": "Author Name",
  "tags": ["cms", "edge"]
}

List pieces

GET /v1/sites/{site_id}/pieces?type=blog-post&limit=20

200 OK
{
  "items": [...],
  "next_cursor": "..."
}

Create a draft (write)

POST /v1/sites/{site_id}/pieces
Authorization: Bearer ${TOKEN}
Content-Type: application/json

{
  "type": "blog-post",
  "title": "Draft title",
  "body_md": "..."
}

201 Created
{ "id": "p_...", "status": "draft" }

GraphQL shape

Same data model, idiomatic GraphQL surface. Endpoint: POST /v1/sites/{site_id}/graphql.

query Recent {
  pieces(type: BLOG_POST, limit: 5) {
    items { slug title lede publishAt }
    nextCursor
  }
}

Webhook subscriptions

Subscribe to content events to drive your own workflows downstream:

  • content.draft.saved
  • content.review.requested
  • content.review.approved
  • content.scheduled
  • content.published
  • content.unpublished

Configure in Settings → Webhooks. Each delivery includes an HMAC signature over the body using your subscription secret.

Rate limits

Read API: generous; designed for edge consumption from a real frontend. Write API: 60 requests per minute per token by default; raise on request.

SDKs

SDKs are {{TBD-sdks}}. The REST shape is stable and easy to consume directly in any language.