Skip to Content
API ReferenceHelp Center

Help Center

Manage the project’s help-center articles and their categories. Requires the help center to be enabled for the project — when it’s off, every endpoint below returns 404.

Article bodies are Markdown, not HTML. The portal renders them through a viewer that never evaluates raw HTML, so any HTML you post is shown to readers as literal text.

GET/v1/articles

ParameterTypeDescription
statusstringFilter by status: draft, published, or archived.
category_idstringOnly articles in this category.
limitintegerPage size. Defaults to 25, max 100.
offsetintegerNumber of items to skip. Defaults to 0.

GET/v1/articles/search

ParameterTypeDescription
qrequiredstringSearch query. Supports quoted phrases, OR, and -negation.
limitintegerResult count. Defaults to 25, max 100.

GET/v1/articles/:id

POST/v1/articles

ParameterTypeDescription
titlerequiredstringUp to 200 characters.
bodystringMarkdown. Up to 50,000 characters.
excerptstringOne-line summary, up to 300 characters. Derived from the body when omitted.
slugstringURL segment, up to 80 characters. Derived from the title when omitted.
category_idstringCategory to file the article under.

PATCH/v1/articles/:id

ParameterTypeDescription
titlestringNew title.
bodystringNew Markdown body.
excerptstringNew summary; null clears it.
slugstringNew URL segment.
category_idstringNew category; null makes the article uncategorised.
statusstringdraft, published, or archived.

DELETE/v1/articles/:id

Articles are always created as drafts — publishing is a separate PATCH, so nothing reaches your portal by accident. Creating an article requires paid-plan write access, as does every other mutating method here.

List articles

curl "https://api.supdesk.app/v1/articles?status=published&limit=10" \ -H "Authorization: Bearer sd_live_..."
{ "data": [ { "id": "8f7a...", "title": "How do I reset my password?", "slug": "how-do-i-reset-my-password", "body": "Open **Settings**, then choose *Reset password*.", "excerpt": "Open Settings, then choose Reset password.", "status": "published", "category_id": "3c2b...", "published_at": "2026-07-01T09:12:00Z", "helpful_count": 12, "not_helpful_count": 1, "created_at": "2026-06-28T14:03:00Z", "updated_at": "2026-07-01T09:12:00Z" } ], "pagination": { "limit": 10, "offset": 0, "has_more": false } }

Unfiltered, this returns drafts and archived articles too, newest edit first. Pass status=published for what customers can actually see.

Search articles

curl "https://api.supdesk.app/v1/articles/search?q=reset+password&limit=5" \ -H "Authorization: Bearer sd_live_..."
{ "data": [ { "id": "8f7a...", "title": "How do I reset my password?", "slug": "how-do-i-reset-my-password", "category_slug": "getting-started", "category_name": "Getting started", "snippet": "Open Settings, then choose Reset password.", "rank": 0.6079 } ] }

Full-text search over published articles only, ranked, with a plain-text snippet around the match. Titles are weighted above summaries, and summaries above bodies. An empty or unparseable query returns an empty list rather than an error.

Get an article

curl "https://api.supdesk.app/v1/articles/8f7a..." \ -H "Authorization: Bearer sd_live_..."

Returns a single article in the same shape as the list, or 404 when the id is unknown in your project.

Create an article

curl -X POST https://api.supdesk.app/v1/articles \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "title": "How do I reset my password?", "body": "Open **Settings**, then choose *Reset password*.", "category_id": "3c2b..." }'
{ "data": { "id": "8f7a...", "title": "How do I reset my password?", "slug": "how-do-i-reset-my-password", "body": "Open **Settings**, then choose *Reset password*.", "excerpt": "Open Settings, then choose Reset password.", "status": "draft", "category_id": "3c2b...", "published_at": null, "helpful_count": 0, "not_helpful_count": 0, "created_at": "2026-07-01T09:12:00Z", "updated_at": "2026-07-01T09:12:00Z" } }

Returns 201. Omitting slug derives one from the title, with a -2, -3… suffix if that address is taken. Omitting excerpt derives one from the body.

Your plan caps how many articles a project can keep — Free 5, Pro 50, Team unlimited. Past the cap this returns limit_reached (429). Archived articles don’t count, so archiving one frees a slot.

Update an article

curl -X PATCH https://api.supdesk.app/v1/articles/8f7a... \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "status": "published" }'

Only the fields you send are written, so a PATCH never blanks something you left out. Setting status to published stamps published_at the first time and preserves it afterwards — fixing a typo doesn’t make an old article look new. Setting it to archived retires the article without deleting it.

Un-archiving an article re-checks the plan cap, and can return limit_reached.

Delete an article

curl -X DELETE https://api.supdesk.app/v1/articles/8f7a... \ -H "Authorization: Bearer sd_live_..."

Deletes the article and its reader feedback permanently, and returns 204. To retire an article while keeping it, set its status to archived instead.

Categories

GET/v1/article-categories

ParameterTypeDescription
limitintegerPage size. Defaults to 25, max 100.
offsetintegerNumber of items to skip. Defaults to 0.

GET/v1/article-categories/:id

POST/v1/article-categories

ParameterTypeDescription
namerequiredstringUp to 80 characters.
descriptionstringShown on the portal, up to 300 characters.
sort_orderintegerDisplay position. Defaults to 0.

PATCH/v1/article-categories/:id

ParameterTypeDescription
namestringNew name.
descriptionstringNew description; null clears it.
sort_orderintegerNew display position.

DELETE/v1/article-categories/:id

curl -X POST https://api.supdesk.app/v1/article-categories \ -H "Authorization: Bearer sd_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Getting started", "sort_order": 1 }'
{ "data": { "id": "3c2b...", "name": "Getting started", "slug": "getting-started", "description": null, "sort_order": 1, "created_at": "2026-07-01T09:12:00Z" } }

Categories are listed in sort_order, then by name. Slugs are derived from the name the same way article slugs are derived from the title.

Deleting a category returns 204 and does not delete its articles — they become uncategorised and stay reachable by search and from the help center’s front page.

Errors

Alongside the standard codes:

CodeStatusWhen
not_found404Unknown id — or the help center is switched off for this project.
forbidden403A write on a plan without API write access.
limit_reached429The plan’s article allowance is spent.
Last updated on