Help center

Articles, collections and news for a help desk's help center and widget.

The help center is where customers find answers before they ask. Articles are written in Markdown and arranged in collections; published public articles appear in the help center and the widget, and every published article, internal ones included, is something the desk's AI agent and reply suggestions may answer from.

Any agent on the desk may write and publish articles and create collections: the people answering the same question every day are the ones who should write it down. Deleting a collection, and publishing news to every customer's widget, need help_desk:configure and a desk lead or admin.

Deleting an article or news post archives it: it stops appearing anywhere and stays on record, because an article the AI cited is part of what a customer was told.

List articles#

The desk's articles, in the order their collection arranges them, or by popularity when searching.

GET/api/v1/help-desks/{helpDeskId}/articles

Path parameters

helpDeskIdstringrequired
Help desk id.

Query parameters

collectionIdstring
Only articles in this collection.
statusstring
draft, published or archived.
audiencestring
public or internal.
localestring
Only articles in this locale, e.g. en.
searchstring
Match title, excerpt or body.
limitnumber
Page size, up to 200. Default 50.
cursorstring
The nextCursor from the previous page.

Responses

The articles, and how many match in total.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/articles" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"articles": [
{
"id": "2b7f…",
"helpDeskId": "4ebf…",
"collectionId": "c81d…",
"brandId": null,
"title": "How refunds work",
"slug": "how-refunds-work",
"body": "# Refunds\n\nRefunds for a **duplicate charge** arrive within five business days.",
"bodyHtml": "<h1>Refunds</h1><p>Refunds for a <strong>duplicate charge</strong> arrive within five business days.</p>",
"excerpt": "Refunds for a duplicate charge arrive within five business days.",
"locale": "en",
"status": "published",
"audience": "public",
"authorAgentId": "8e21…",
"seoDescription": null,
"position": 0,
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 318,
"helpfulCount": 41,
"notHelpfulCount": 3,
"aiCitationCount": 27
}
],
"total": 1
},
"meta": {
"requestId": "req_…",
"pagination": {
"nextCursor": null,
"limit": 50
}
}
}

Create an article#

Write an article in Markdown. It is rendered to HTML on save, and any raw HTML in it is escaped. `internal` articles are offered to agents and to the AI as context and are never shown to customers. Any agent on the desk may write and publish articles.

POST/api/v1/help-desks/{helpDeskId}/articles

Path parameters

helpDeskIdstringrequired
Help desk id.

Body

application/json
title
string
required
body
string (Markdown)
required
collectionId
string
brandId
string
slug
string (lowercase letters, digits, dashes)
excerpt
string
locale
string (default en)
status
draft | published | archived (default draft)
audience
public | internal (default public)
seoDescription
string
position
number

Responses

The created article.

curl -X POST "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/articles" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "How refunds work",
"body": "Refunds for a **duplicate charge** arrive within five business days.",
"collectionId": "c81d…",
"status": "published"
}'
Response201
{
"data": {
"id": "2b7f…",
"helpDeskId": "4ebf…",
"collectionId": "c81d…",
"brandId": null,
"title": "How refunds work",
"slug": "how-refunds-work",
"body": "# Refunds\n\nRefunds for a **duplicate charge** arrive within five business days.",
"bodyHtml": "<h1>Refunds</h1><p>Refunds for a <strong>duplicate charge</strong> arrive within five business days.</p>",
"excerpt": "Refunds for a duplicate charge arrive within five business days.",
"locale": "en",
"status": "published",
"audience": "public",
"authorAgentId": "8e21…",
"seoDescription": null,
"position": 0,
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 318,
"helpfulCount": 41,
"notHelpfulCount": 3,
"aiCitationCount": 27
},
"meta": {
"requestId": "req_…"
}
}

Get an article#

One article, with its rendered HTML and how readers and the AI have used it.

GET/api/v1/help-desks/{helpDeskId}/articles/{articleId}

Path parameters

helpDeskIdstringrequired
Help desk id.
articleIdstringrequired
Article id.

Responses

The article.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/articles/{articleId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"id": "2b7f…",
"helpDeskId": "4ebf…",
"collectionId": "c81d…",
"brandId": null,
"title": "How refunds work",
"slug": "how-refunds-work",
"body": "# Refunds\n\nRefunds for a **duplicate charge** arrive within five business days.",
"bodyHtml": "<h1>Refunds</h1><p>Refunds for a <strong>duplicate charge</strong> arrive within five business days.</p>",
"excerpt": "Refunds for a duplicate charge arrive within five business days.",
"locale": "en",
"status": "published",
"audience": "public",
"authorAgentId": "8e21…",
"seoDescription": null,
"position": 0,
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 318,
"helpfulCount": 41,
"notHelpfulCount": 3,
"aiCitationCount": 27
},
"meta": {
"requestId": "req_…"
}
}

Update an article#

Change any field; fields you leave out keep their values. A new body without a new excerpt gets a fresh excerpt. Publishing for the first time sets `publishedAt`.

PATCH/api/v1/help-desks/{helpDeskId}/articles/{articleId}

Path parameters

helpDeskIdstringrequired
Help desk id.
articleIdstringrequired
Article id.

Body

application/json
title
string
body
string
status
string
audience
string
collectionId
string or null

Responses

The updated article.

curl -X PATCH "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/articles/{articleId}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "published"
}'
Response200
{
"data": {
"id": "2b7f…",
"helpDeskId": "4ebf…",
"collectionId": "c81d…",
"brandId": null,
"title": "How refunds work",
"slug": "how-refunds-work",
"body": "# Refunds\n\nRefunds for a **duplicate charge** arrive within five business days.",
"bodyHtml": "<h1>Refunds</h1><p>Refunds for a <strong>duplicate charge</strong> arrive within five business days.</p>",
"excerpt": "Refunds for a duplicate charge arrive within five business days.",
"locale": "en",
"status": "published",
"audience": "public",
"authorAgentId": "8e21…",
"seoDescription": null,
"position": 0,
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 318,
"helpfulCount": 41,
"notHelpfulCount": 3,
"aiCitationCount": 27
},
"meta": {
"requestId": "req_…"
}
}

Delete an article#

Archive an article. It disappears from the help center and from the AI's sources, and is kept on record. Needs a desk lead or an organization admin, like deleting a collection.

DELETE/api/v1/help-desks/{helpDeskId}/articles/{articleId}

Path parameters

helpDeskIdstringrequired
Help desk id.
articleIdstringrequired
Article id.

Responses

Archived.

curl -X DELETE "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/articles/{articleId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"deleted": true
},
"meta": {
"requestId": "req_…"
}
}

List collections#

The desk's collections. With `nested=true`, a tree with each collection's `children`.

GET/api/v1/help-desks/{helpDeskId}/collections

Path parameters

helpDeskIdstringrequired
Help desk id.

Query parameters

nestedboolean
Return the tree rather than a flat list.

Responses

The collections.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/collections" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"collections": [
{
"id": "c81d…",
"helpDeskId": "4ebf…",
"brandId": null,
"parentId": null,
"name": "Billing",
"slug": "billing",
"description": "Payments, invoices and refunds",
"icon": "credit-card",
"position": 0,
"articleCount": 12
}
]
},
"meta": {
"requestId": "req_…"
}
}

Create a collection#

A section of the help center. Set `parentId` to nest it. Any agent on the desk may create one.

POST/api/v1/help-desks/{helpDeskId}/collections

Path parameters

helpDeskIdstringrequired
Help desk id.

Body

application/json
name
string
required
slug
string
description
string
icon
string
parentId
string
brandId
string (null for every brand)
position
number

Responses

The created collection.

curl -X POST "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/collections" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Billing",
"description": "Payments, invoices and refunds"
}'
Response201
{
"data": {
"id": "c81d…",
"helpDeskId": "4ebf…",
"brandId": null,
"parentId": null,
"name": "Billing",
"slug": "billing",
"description": "Payments, invoices and refunds",
"icon": "credit-card",
"position": 0,
"articleCount": 12
},
"meta": {
"requestId": "req_…"
}
}

Get a collection#

One collection, with how many published articles it holds.

GET/api/v1/help-desks/{helpDeskId}/collections/{collectionId}

Path parameters

helpDeskIdstringrequired
Help desk id.
collectionIdstringrequired
Collection id.

Responses

The collection.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/collections/{collectionId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"id": "c81d…",
"helpDeskId": "4ebf…",
"brandId": null,
"parentId": null,
"name": "Billing",
"slug": "billing",
"description": "Payments, invoices and refunds",
"icon": "credit-card",
"position": 0,
"articleCount": 12
},
"meta": {
"requestId": "req_…"
}
}

Update a collection#

Change any field. A collection cannot be moved inside itself or one of its own descendants.

PATCH/api/v1/help-desks/{helpDeskId}/collections/{collectionId}

Path parameters

helpDeskIdstringrequired
Help desk id.
collectionIdstringrequired
Collection id.

Body

application/json
name
string
parentId
string or null
position
number

Responses

The updated collection.

curl -X PATCH "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/collections/{collectionId}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"position": 2
}'
Response200
{
"data": {
"id": "c81d…",
"helpDeskId": "4ebf…",
"brandId": null,
"parentId": null,
"name": "Billing",
"slug": "billing",
"description": "Payments, invoices and refunds",
"icon": "credit-card",
"position": 0,
"articleCount": 12
},
"meta": {
"requestId": "req_…"
}
}

Delete a collection#

Remove a collection. Its articles are kept and detached, and its child collections move to the top level. Changing the shape of the help center needs `help_desk:configure` and a desk lead or admin.

DELETE/api/v1/help-desks/{helpDeskId}/collections/{collectionId}

Path parameters

helpDeskIdstringrequired
Help desk id.
collectionIdstringrequired
Collection id.

Responses

Deleted.

curl -X DELETE "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/collections/{collectionId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"deleted": true
},
"meta": {
"requestId": "req_…"
}
}

List news posts#

The desk's 50 most recent news posts, drafts included.

GET/api/v1/help-desks/{helpDeskId}/news

Path parameters

helpDeskIdstringrequired
Help desk id.

Responses

The news posts.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/news" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"news": [
{
"id": "f40a…",
"helpDeskId": "4ebf…",
"brandId": null,
"title": "Faster refunds",
"body": "Refunds now arrive in three business days.",
"bodyHtml": "<p>Refunds now arrive in three business days.</p>",
"coverImageUrl": null,
"label": "Update",
"status": "published",
"authorAgentId": "8e21…",
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 0,
"reactionCounts": {}
}
]
},
"meta": {
"requestId": "req_…"
}
}

Create a news post#

An announcement shown in every customer's widget once published. Broadcast, unlike an article, so it needs `help_desk:configure` and a desk lead or admin. Created as a draft unless `status` says otherwise.

POST/api/v1/help-desks/{helpDeskId}/news

Path parameters

helpDeskIdstringrequired
Help desk id.

Body

application/json
title
string
required
body
string (Markdown)
required
brandId
string
coverImageUrl
https URL
label
string
status
draft | published | archived

Responses

The created news post.

curl -X POST "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/news" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Faster refunds",
"body": "Refunds now arrive in three business days.",
"label": "Update"
}'
Response201
{
"data": {
"id": "f40a…",
"helpDeskId": "4ebf…",
"brandId": null,
"title": "Faster refunds",
"body": "Refunds now arrive in three business days.",
"bodyHtml": "<p>Refunds now arrive in three business days.</p>",
"coverImageUrl": null,
"label": "Update",
"status": "draft",
"authorAgentId": "8e21…",
"publishedAt": null,
"viewCount": 0,
"reactionCounts": {}
},
"meta": {
"requestId": "req_…"
}
}

Get a news post#

One news post.

GET/api/v1/help-desks/{helpDeskId}/news/{newsPostId}

Path parameters

helpDeskIdstringrequired
Help desk id.
newsPostIdstringrequired
News post id.

Responses

The news post.

curl -X GET "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/news/{newsPostId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"id": "f40a…",
"helpDeskId": "4ebf…",
"brandId": null,
"title": "Faster refunds",
"body": "Refunds now arrive in three business days.",
"bodyHtml": "<p>Refunds now arrive in three business days.</p>",
"coverImageUrl": null,
"label": "Update",
"status": "published",
"authorAgentId": "8e21…",
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 0,
"reactionCounts": {}
},
"meta": {
"requestId": "req_…"
}
}

Update a news post#

Change any field. Publishing for the first time sets `publishedAt`.

PATCH/api/v1/help-desks/{helpDeskId}/news/{newsPostId}

Path parameters

helpDeskIdstringrequired
Help desk id.
newsPostIdstringrequired
News post id.

Body

application/json
title
string
body
string
status
string
label
string

Responses

The updated news post.

curl -X PATCH "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/news/{newsPostId}" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "published"
}'
Response200
{
"data": {
"id": "f40a…",
"helpDeskId": "4ebf…",
"brandId": null,
"title": "Faster refunds",
"body": "Refunds now arrive in three business days.",
"bodyHtml": "<p>Refunds now arrive in three business days.</p>",
"coverImageUrl": null,
"label": "Update",
"status": "published",
"authorAgentId": "8e21…",
"publishedAt": "2026-09-30T14:00:00.000Z",
"viewCount": 0,
"reactionCounts": {}
},
"meta": {
"requestId": "req_…"
}
}

Delete a news post#

Retire a news post. It disappears from the widget and is kept on record.

DELETE/api/v1/help-desks/{helpDeskId}/news/{newsPostId}

Path parameters

helpDeskIdstringrequired
Help desk id.
newsPostIdstringrequired
News post id.

Responses

Retired.

curl -X DELETE "https://voice.evryhealth.com/api/v1/help-desks/{helpDeskId}/news/{newsPostId}" \
-H "Authorization: Bearer YOUR_API_KEY"
Response200
{
"data": {
"deleted": true
},
"meta": {
"requestId": "req_…"
}
}