Content authoring API

Manage sites and pages, publish and archive, version history, images and AI writing help.

Content Studio holds the pages of your website. This API creates and edits pages, publishes them, manages version history and uploads images. To read published pages from a website, use the Content delivery endpoints.

In the product a "site" is called a bucket in this API. Each site holds pages, and each page has a path such as blog/2026/hello. The path is both the page's web address and its folder: blog/2026 is the folder.

If the Content Studio app is switched off in Settings › Apps, these routes answer 404 NOT_FOUND.

Endpoints

Permissions are checked against the site (its key is the resource). Images use the special resource assets.

Method Path Permission What it does
GET /orgs/{orgId}/content/buckets content:read List sites you can see
POST /orgs/{orgId}/content/buckets content:manage Create a site
PATCH /orgs/{orgId}/content/buckets/{bucketId} content:manage Change a site's settings
DELETE /orgs/{orgId}/content/buckets/{bucketId} content:manage Delete a site
GET /orgs/{orgId}/content/buckets/{bucketId}/tags content:read Tags in use
GET /orgs/{orgId}/content/buckets/{bucketId}/documents content:read List pages (no body)
POST /orgs/{orgId}/content/buckets/{bucketId}/documents content:write Create a page
GET /orgs/{orgId}/content/documents/{docId} content:read Get a page with its body
PATCH /orgs/{orgId}/content/documents/{docId} content:write Change a page
DELETE /orgs/{orgId}/content/documents/{docId} content:write Delete a page
POST /orgs/{orgId}/content/documents/{docId}/publish content:publish Publish
POST /orgs/{orgId}/content/documents/{docId}/unpublish content:publish Take offline
POST /orgs/{orgId}/content/documents/{docId}/archive content:publish Archive
POST /orgs/{orgId}/content/documents/{docId}/unarchive content:publish Restore from archive
GET /orgs/{orgId}/content/documents/{docId}/revisions content:read Version history
POST /orgs/{orgId}/content/documents/{docId}/revisions content:write Save a named checkpoint
GET /orgs/{orgId}/content/documents/{docId}/revisions/{revId} content:read One version in full
POST /orgs/{orgId}/content/documents/{docId}/revisions/{revId}/restore content:write Copy a version into the draft
POST /orgs/{orgId}/content/assets content:write on assets Upload an image or file
GET /orgs/{orgId}/content/assets content:read on assets List uploads
GET /orgs/{orgId}/content/assets/{key} content:read on assets Download an upload
POST /orgs/{orgId}/content/generate content:write AI writing help (proposals only)

Drafts and publishing

A page has a draft (what editors change) and, once published, a frozen live copy (what the public sees). Editing a page never changes what is live. The live copy changes only when you publish again.

Status Meaning
draft Never published, or taken offline. Not on the site
published Live. If edited is true the draft has moved on since publishing
archived Off the site and hidden from the default list. Use ?status=archived to see archived pages

Sites

{
  "id": "0190f500-…",
  "key": "website",
  "name": "AxisIQ website",
  "description": "",
  "site_url": "https://www.example.com",
  "voice": "Plain, warm, short sentences. Prices in ₹.",
  "meta_schema": [ { "key": "author_role", "label": "Author role", "type": "text" } ],
  "created_at": "2026-10-01T08:00:00Z"
}

POST takes key (lowercase letters, digits and hyphens, up to 120 characters; unique; the name assets is reserved), name (up to 120), description and site_url. PATCH takes any of name, description, site_url, voice (house style for AI writing, up to 4,000 characters) and meta_schema.

meta_schema declares extra typed fields every page of the site carries (up to 30). Each has key (lowercase letters, digits and underscores, starting with a letter, up to 40), label, type (text, textarea, number, boolean, date, url, image, select or list), optional options (for select), required and help. A required field must be filled before a page can be published.

Important: Deleting a site deletes all its pages.

Pages

{
  "id": "0190f501-…",
  "bucket_id": "0190f500-…",
  "path": "blog/hello",
  "title": "Hello world",
  "body": "# Hello\n\nMarkdown text…",
  "seo": { "title": "Hello world | Example", "description": "Our first post", "keywords": ["hello"], "canonical_url": "", "og_image": "", "noindex": false, "schema_type": "BlogPosting", "author": "Asha Rao" },
  "tags": ["news"],
  "meta": { "author_role": "Editor" },
  "status": "published",
  "edited": true,
  "published_at": "2026-10-04T09:00:00Z",
  "created_at": "2026-10-01T08:00:00Z",
  "updated_at": "2026-10-04T09:30:00Z"
}

body is Markdown. A single-page read also includes live, the frozen published copy. Lists leave body out.

POST /orgs/{orgId}/content/buckets/{bucketId}/documents

Field Type Required Notes
title string Yes Up to 200 characters
path string No Segments of lowercase letters, digits and hyphens separated by /, such as blog/hello. If omitted it is made from the title at the top level. An empty path or / is the site's home page. Must be unique in the site
body string No Markdown
seo object No title, description, keywords, canonical_url, og_title, og_description, og_image, noindex, schema_type (WebPage, Article, BlogPosting, NewsArticle, TechArticle, HowTo, FAQPage, AboutPage, ContactPage, CollectionPage, Product or Event), author, focus_keyword (an authoring hint that is never published)
tags array of strings No Lowercased. Up to 20, each up to 60 characters
meta object No Values for the site's meta_schema
curl -s -X POST https://axisiq.co/api/v1/orgs/$ORG/content/buckets/$BUCKET/documents \
  -H "Authorization: Bearer $AXIS_KEY" -H "Content-Type: application/json" \
  -d '{"title": "Hello world", "path": "blog/hello", "body": "# Hello\n\nFirst post.", "tags": ["news"]}'

Response 201 with the page, as a draft. Errors: 400 VALIDATION_ERROR, 409 KEY_TAKEN (path already used), 403 FORBIDDEN.

PATCH /orgs/{orgId}/content/documents/{docId}

Same body. It sends the whole page (the title is required again); omit path to keep the current one. Response 200 with the page.

GET /orgs/{orgId}/content/buckets/{bucketId}/documents

Parameter Notes
prefix Only pages under this folder, such as blog/
status draft, published or archived
tag Only pages with this tag
q Search text

Returns { "documents": [ … ] } without bodies. Site lists are { "buckets": [ … ] }, tags { "tags": [ … ] }.

Publish, unpublish, archive, unarchive

No body. Each answers 200 with the page. Publishing copies the draft into the live copy, and fails with 400 VALIDATION_ERROR if a required metadata field is empty. Unpublishing takes the page offline and keeps the draft.

DELETE /orgs/{orgId}/content/documents/{docId}

Answers 200 with { "deleted": true }.

Version history

Every publish, unpublish and archive is recorded, and you can add named checkpoints.

  • POST …/revisions with { "note": "Before rewrite" } (note optional) saves a checkpoint. Response 201 { "saved": true }.
  • GET …/revisions returns { "revisions": [ { "id", "number", "kind", "note", "path", "title", "created_by", "created_at" } ] }.
  • GET …/revisions/{revId} adds the full snapshot (title, body, SEO, tags, meta).
  • POST …/revisions/{revId}/restore copies that version into the draft and returns the page. It does not change the live page. To roll back what the public sees, restore and then publish.

Images and files

POST /orgs/{orgId}/content/assets is a multipart upload with a file field.

curl -s -X POST https://axisiq.co/api/v1/orgs/$ORG/content/assets \
  -H "Authorization: Bearer $AXIS_KEY" -F "file=@hero.jpg"
{ "data": { "key": "2026/10/3fa9c1d2-hero.jpg", "size": 182044, "content_type": "image/jpeg", "url": "/content/{orgId}/assets/2026/10/3fa9c1d2-hero.jpg" } }

The key is generated from the upload date and your file name. url is the public address (add https://axisiq.co) once the workspace's public-visitor role allows content delivery on assets. Use it in Markdown, for example ![Hero](https://axisiq.co/content/{orgId}/assets/2026/10/3fa9c1d2-hero.jpg). GET /content/assets lists uploads as { "assets": [ … ] }, newest first, at most 500. GET /content/assets/{key} streams a file to a signed-in caller.

POST /orgs/{orgId}/content/generate

AI writing help. It only proposes text: nothing is saved.

Field Type Notes
bucket_id string Required. The site whose house style (voice) is used
task string draft, continue, improve, shorten, expand, simplify, fix, tone, outline, meta or title
prompt, title, body, text, tone, length, keyword string Inputs for the task

Returns { "markdown": "…" }, or { "meta": { … } } for meta, or { "titles": [ … ] } for title. Uses are metered like Ask Axis. Limits: prompt 4,000 characters, body 200,000, text 50,000. task defaults to draft, which needs a prompt. Answers 402 LIMIT_EXCEEDED when the plan cap is reached, 503 AGENT_DISABLED when unavailable and 502 AGENT_ERROR on provider failure.