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
-
objectstring - Always
article. -
idstring - Unique id.
-
titlestring - Up to 200 characters.
-
slugstring - URL segment on the Help Center.
-
descriptionstring | null - Summary under the title, up to 300 characters.
-
statusenum draftorpublished.-
collectionIdstring | null - Collection it sits in.
-
audienceenum everyone,usersorleads.-
isInternalboolean - Internal articles are for teammates and Copilot only.
-
localestring - Language, e.g.
enorpt-BR. -
authorIdstring | null - Teammate shown as the author.
-
urlstring | null - Public URL (null for drafts and internal articles).
-
bodyHtmlstring - Rendered, sanitized HTML of the live version.
-
wordCountinteger - Words in the body.
-
hasUnpublishedChangesboolean - Saved edits waiting to be published.
-
publishedAttimestamp | null - First published.
-
createdAttimestamp - Created.
-
updatedAttimestamp - Last change.
{ "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
-
objectstring - Always
collection. -
idstring - Unique id.
-
parentIdstring | null - Parent collection (up to 3 levels).
-
namestring - Collection name.
-
slugstring - URL segment.
-
descriptionstring | null - Shown on the Help Center.
-
iconstring | null - Icon name.
-
positioninteger - Display order.
-
articleCountinteger - Articles in the collection.
-
urlstring - Public URL.
{ "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
/v1 /articles articles:read Articles, newest first, with total.
Query parameters
-
statusenum publishedordraft.-
collectionIdstring - A collection id, or
nonefor uncategorized. -
qstring - Search titles and bodies.
-
limitinteger - Items per page, 1–100. Default
25. -
cursorstring - The
nextCursorof 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() { "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
/v1 /articles/{id} articles:read One article by id.
Path parameters
-
idstring 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() { "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
/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
-
titlestring required - Up to 200 characters.
-
bodyHtmlstring - HTML: paragraphs, headings, lists, blockquotes, code blocks, images, tables, rules, line breaks, bold / italic / underline / strike / code / links. Up to 500 KB.
-
bodyJsonobject - Or a TipTap document (the editor’s native format). Not both.
-
descriptionstring | null - Up to 300 characters.
-
collectionIdstring | null - A collection id, or
nullfor none. -
audienceenum everyone(default),usersorleads.-
isInternalboolean - Make it an internal article.
-
localestring en,de,pt-BR…-
authorIdstring - A teammate id to credit as the author.
-
publishboolean - 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() { "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
/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
-
idstring required - The article id.
Body
-
titlestring - Up to 200 characters.
-
bodyHtmlstring - HTML: paragraphs, headings, lists, blockquotes, code blocks, images, tables, rules, line breaks, bold / italic / underline / strike / code / links. Up to 500 KB.
-
bodyJsonobject - Or a TipTap document (the editor’s native format). Not both.
-
descriptionstring | null - Up to 300 characters.
-
collectionIdstring | null - A collection id, or
nullfor none. -
audienceenum everyone(default),usersorleads.-
isInternalboolean - Make it an internal article.
-
localestring en,de,pt-BR…-
slugstring - Lowercase letters, numbers and dashes.
-
publishboolean - 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() { "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
/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
-
idstring 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() { "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
/v1 /articles/{id} articles:write Deletes the article and removes it from Blaze’s knowledge.
Path parameters
-
idstring 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() { "object": "article", "id": "0199b1d0-8c9d-7e0f-9a1b-2c3d4e5f6a7b", "deleted": true} List collections
/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() { "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
/v1 /collections articles:write Creates a collection, optionally inside another one (up to 3 levels).
Body
-
namestring required - Up to 120 characters.
-
descriptionstring | null - Up to 500 characters.
-
iconstring | null - Icon name.
-
parentIdstring | 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() { "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
/v1 /collections/{id} articles:write Rename it, change its description, icon or slug.
Path parameters
-
idstring required - The collection id.
Body
-
namestring - New name.
-
descriptionstring | null - New description.
-
iconstring | null - New icon.
-
slugstring - 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() { "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
/v1 /collections/{id} articles:write Deletes the collection and its sub-collections. Their articles are kept, uncategorized — the response lists what moved.
Path parameters
-
idstring 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() { "object": "collection", "id": "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c", "deleted": true, "deletedIds": [ "0199b1c0-1d2e-7f3a-8b4c-5d6e7f8a9b0c" ], "uncategorizedArticles": 9}