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 …/revisionswith{ "note": "Before rewrite" }(note optional) saves a checkpoint. Response201{ "saved": true }.GET …/revisionsreturns{ "revisions": [ { "id", "number", "kind", "note", "path", "title", "created_by", "created_at" } ] }.GET …/revisions/{revId}adds the fullsnapshot(title, body, SEO, tags, meta).POST …/revisions/{revId}/restorecopies 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 . 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.
Related
- Content delivery
- Public endpoints
- In the product: Content Studio