REST API reference

Articles & collections

Write, publish and organize Help Center articles — the knowledge Blaze answers from.

Articles power your Help Center, the Messenger’s Help space and Blaze AI Agent’s answers. Reads need articles:read; changes need articles:write.

Articles are created as drafts unless you send publish: true. Editing the title, description or body of a published article saves the changes as pending (hasUnpublishedChanges) until you publish again — just like the editor. Publishing needs a title and a body (422 otherwise).

The article object

Returned by every article endpoint.

Fields

object string
Always article.
id string
Unique id.
title string
Up to 200 characters.
slug string
URL segment on the Help Center.
description string | null
Summary under the title, up to 300 characters.
status enum
draft or published.
collectionId string | null
Collection it sits in.
audience enum
everyone, users or leads.
isInternal boolean
Internal articles are for teammates and Copilot only.
locale string
Language, e.g. en or pt-BR.
authorId string | null
Teammate shown as the author.
url string | null
Public URL (null for drafts and internal articles).
bodyHtml string
Rendered, sanitized HTML of the live version.
wordCount integer
Words in the body.
hasUnpublishedChanges boolean
Saved edits waiting to be published.
publishedAt timestamp | null
First published.
createdAt timestamp
Created.
updatedAt timestamp
Last change.
Example article
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "title": "Update your VAT number",  "slug": "update-your-vat-number",  "description": "Change the tax id printed on your invoices.",  "status": "published",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "audience": "everyone",  "isInternal": false,  "locale": "en",  "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",  "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",  "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "wordCount": 18,  "hasUnpublishedChanges": false,  "publishedAt": "2026-06-11T08:30:00.000Z",  "createdAt": "2026-06-10T15:02:11.000Z",  "updatedAt": "2026-06-11T08:30:00.000Z"}

The collection object

Collections group articles on the Help Center.

Fields

object string
Always collection.
id string
Unique id.
parentId string | null
Parent collection (up to 3 levels).
name string
Collection name.
slug string
URL segment.
description string | null
Shown on the Help Center.
icon string | null
Icon name.
position integer
Display order.
articleCount integer
Articles in the collection.
url string
Public URL.
Example collection
{  "object": "collection",  "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "parentId": null,  "name": "Billing",  "slug": "billing",  "description": "Plans, invoices and payment methods.",  "icon": "receipt",  "position": 2,  "articleCount": 9,  "url": "https://help.rabbitblaze.com/acme/collections/billing"}

List articles

GET /v1 /articles articles:read

Articles, newest first, with total.

Query parameters

status enum
published or draft.
collectionId string
A collection id, or none for uncategorized.
q string
Search titles and bodies.
limit integer
Items per page, 1–100. Default 25.
cursor string
The nextCursor of the previous page.
curl https://api.rabbitblaze.com/v1/articles?status=published&collectionId=0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/articles?status=published&collectionId=0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c", {  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.get(    "https://api.rabbitblaze.com/v1/articles",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},    params={        "status": "published",        "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",    },)res.raise_for_status()data = res.json()
Response · 200 OK
{  "items": [    {      "object": "article",      "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",      "title": "Update your VAT number",      "slug": "update-your-vat-number",      "description": "Change the tax id printed on your invoices.",      "status": "published",      "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",      "audience": "everyone",      "isInternal": false,      "locale": "en",      "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",      "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",      "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",      "wordCount": 18,      "hasUnpublishedChanges": false,      "publishedAt": "2026-06-11T08:30:00.000Z",      "createdAt": "2026-06-10T15:02:11.000Z",      "updatedAt": "2026-06-11T08:30:00.000Z"    }  ],  "nextCursor": null,  "total": 9}

Retrieve an article

GET /v1 /articles/{id} articles:read

One article by id.

Path parameters

id string required
The article id.
curl https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b", {  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.get(    "https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "title": "Update your VAT number",  "slug": "update-your-vat-number",  "description": "Change the tax id printed on your invoices.",  "status": "published",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "audience": "everyone",  "isInternal": false,  "locale": "en",  "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",  "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",  "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "wordCount": 18,  "hasUnpublishedChanges": false,  "publishedAt": "2026-06-11T08:30:00.000Z",  "createdAt": "2026-06-10T15:02:11.000Z",  "updatedAt": "2026-06-11T08:30:00.000Z"}

Create an article

POST /v1 /articles articles:write

Creates a draft (or publishes right away with publish: true). The author defaults to the teammate who created the API key.

Body

title string required
Up to 200 characters.
bodyHtml string
HTML: paragraphs, headings, lists, blockquotes, code blocks, images, tables, rules, line breaks, bold / italic / underline / strike / code / links. Up to 500 KB.
bodyJson object
Or a TipTap document (the editor’s native format). Not both.
description string | null
Up to 300 characters.
collectionId string | null
A collection id, or null for none.
audience enum
everyone (default), users or leads.
isInternal boolean
Make it an internal article.
locale string
en, de, pt-BR…
authorId string
A teammate id to credit as the author.
publish boolean
Publish immediately.
curl -X POST https://api.rabbitblaze.com/v1/articles \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "title": "Update your VAT number",  "description": "Change the tax id printed on your invoices.",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "bodyHtml": "<h2>Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "publish": true}'
const res = await fetch("https://api.rabbitblaze.com/v1/articles", {  method: "POST",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    title: "Update your VAT number",    description: "Change the tax id printed on your invoices.",    collectionId: "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",    bodyHtml: "<h2>Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",    publish: true,  }),})const data = await res.json()
import osimport requests res = requests.post(    "https://api.rabbitblaze.com/v1/articles",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},    json={        "title": "Update your VAT number",        "description": "Change the tax id printed on your invoices.",        "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",        "bodyHtml": "<h2>Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",        "publish": True,    },)res.raise_for_status()data = res.json()
Response · 201 Created
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "title": "Update your VAT number",  "slug": "update-your-vat-number",  "description": "Change the tax id printed on your invoices.",  "status": "published",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "audience": "everyone",  "isInternal": false,  "locale": "en",  "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",  "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",  "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "wordCount": 18,  "hasUnpublishedChanges": false,  "publishedAt": "2026-06-11T08:30:00.000Z",  "createdAt": "2026-06-10T15:02:11.000Z",  "updatedAt": "2026-06-11T08:30:00.000Z"}

Update an article

PATCH /v1 /articles/{id} articles:write

Changes the fields you send. Settings (collection, audience, slug…) apply right away; content edits to a live article stay pending until published. publish: true publishes them, publish: false unpublishes.

Path parameters

id string required
The article id.

Body

title string
Up to 200 characters.
bodyHtml string
HTML: paragraphs, headings, lists, blockquotes, code blocks, images, tables, rules, line breaks, bold / italic / underline / strike / code / links. Up to 500 KB.
bodyJson object
Or a TipTap document (the editor’s native format). Not both.
description string | null
Up to 300 characters.
collectionId string | null
A collection id, or null for none.
audience enum
everyone (default), users or leads.
isInternal boolean
Make it an internal article.
locale string
en, de, pt-BR…
slug string
Lowercase letters, numbers and dashes.
publish boolean
Publish (true) or unpublish (false) after saving.
curl -X PATCH https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "title": "Change your VAT number"}'
const res = await fetch("https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b", {  method: "PATCH",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    title: "Change your VAT number",  }),})const data = await res.json()
import osimport requests res = requests.patch(    "https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},    json={        "title": "Change your VAT number",    },)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "title": "Update your VAT number",  "slug": "update-your-vat-number",  "description": "Change the tax id printed on your invoices.",  "status": "published",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "audience": "everyone",  "isInternal": false,  "locale": "en",  "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",  "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",  "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "wordCount": 18,  "hasUnpublishedChanges": true,  "publishedAt": "2026-06-11T08:30:00.000Z",  "createdAt": "2026-06-10T15:02:11.000Z",  "updatedAt": "2026-06-11T08:30:00.000Z"}

Publish an article

POST /v1 /articles/{id}/publish articles:write

Publishes a draft, or the pending changes of a live article. Unpublish with POST /articles/{id}/unpublish (back to draft).

Path parameters

id string required
The article id.
curl -X POST https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b/publish \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b/publish", {  method: "POST",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.post(    "https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b/publish",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "title": "Update your VAT number",  "slug": "update-your-vat-number",  "description": "Change the tax id printed on your invoices.",  "status": "published",  "collectionId": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "audience": "everyone",  "isInternal": false,  "locale": "en",  "authorId": "0199a8f2-2d3e-7f4a-9b5c-6d7e8f9a0b1c",  "url": "https://help.rabbitblaze.com/acme/articles/update-your-vat-number",  "bodyHtml": "<h2 id=\"change-it\">Change it in Billing</h2><p>Open <strong>Settings → Billing</strong> and edit <em>Tax id</em>. New invoices use it right away.</p>",  "wordCount": 18,  "hasUnpublishedChanges": false,  "publishedAt": "2026-06-11T08:30:00.000Z",  "createdAt": "2026-06-10T15:02:11.000Z",  "updatedAt": "2026-06-11T08:30:00.000Z"}

Delete an article

DELETE /v1 /articles/{id} articles:write

Deletes the article and removes it from Blaze’s knowledge.

Path parameters

id string required
The article id.
curl -X DELETE https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b", {  method: "DELETE",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.delete(    "https://api.rabbitblaze.com/v1/articles/0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "article",  "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b",  "deleted": true}

List collections

GET /v1 /collections articles:read

Every collection, parents before their children. Not paginated. GET /collections/{id} returns one.

curl https://api.rabbitblaze.com/v1/collections \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/collections", {  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.get(    "https://api.rabbitblaze.com/v1/collections",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json()
Response · 200 OK
{  "items": [    {      "object": "collection",      "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",      "parentId": null,      "name": "Billing",      "slug": "billing",      "description": "Plans, invoices and payment methods.",      "icon": "receipt",      "position": 2,      "articleCount": 9,      "url": "https://help.rabbitblaze.com/acme/collections/billing"    }  ],  "nextCursor": null}

Create a collection

POST /v1 /collections articles:write

Creates a collection, optionally inside another one (up to 3 levels).

Body

name string required
Up to 120 characters.
description string | null
Up to 500 characters.
icon string | null
Icon name.
parentId string | null
Parent collection id.
curl -X POST https://api.rabbitblaze.com/v1/collections \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "name": "Billing",  "description": "Plans, invoices and payment methods.",  "icon": "receipt"}'
const res = await fetch("https://api.rabbitblaze.com/v1/collections", {  method: "POST",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    name: "Billing",    description: "Plans, invoices and payment methods.",    icon: "receipt",  }),})const data = await res.json()
import osimport requests res = requests.post(    "https://api.rabbitblaze.com/v1/collections",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},    json={        "name": "Billing",        "description": "Plans, invoices and payment methods.",        "icon": "receipt",    },)res.raise_for_status()data = res.json()
Response · 201 Created
{  "object": "collection",  "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "parentId": null,  "name": "Billing",  "slug": "billing",  "description": "Plans, invoices and payment methods.",  "icon": "receipt",  "position": 2,  "articleCount": 9,  "url": "https://help.rabbitblaze.com/acme/collections/billing"}

Update a collection

PATCH /v1 /collections/{id} articles:write

Rename it, change its description, icon or slug.

Path parameters

id string required
The collection id.

Body

name string
New name.
description string | null
New description.
icon string | null
New icon.
slug string
Lowercase letters, numbers and dashes.
curl -X PATCH https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "name": "Billing & invoices"}'
const res = await fetch("https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c", {  method: "PATCH",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,    "Content-Type": "application/json",  },  body: JSON.stringify({    name: "Billing & invoices",  }),})const data = await res.json()
import osimport requests res = requests.patch(    "https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},    json={        "name": "Billing & invoices",    },)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "collection",  "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "parentId": null,  "name": "Billing & invoices",  "slug": "billing",  "description": "Plans, invoices and payment methods.",  "icon": "receipt",  "position": 2,  "articleCount": 9,  "url": "https://help.rabbitblaze.com/acme/collections/billing"}

Delete a collection

DELETE /v1 /collections/{id} articles:write

Deletes the collection and its sub-collections. Their articles are kept, uncategorized — the response lists what moved.

Path parameters

id string required
The collection id.
curl -X DELETE https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c \  -H "Authorization: Bearer $RABBITBLAZE_API_KEY"
const res = await fetch("https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c", {  method: "DELETE",  headers: {    Authorization: `Bearer ${process.env.RABBITBLAZE_API_KEY}`,  },})const data = await res.json()
import osimport requests res = requests.delete(    "https://api.rabbitblaze.com/v1/collections/0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",    headers={"Authorization": f"Bearer {os.environ['RABBITBLAZE_API_KEY']}"},)res.raise_for_status()data = res.json()
Response · 200 OK
{  "object": "collection",  "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c",  "deleted": true,  "deletedIds": [    "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c"  ],  "uncategorizedArticles": 9}