The Notiondesk API exports the feedback readers leave on your help center articles: each reaction, the follow-up answer they picked, their message, their email and the files they attached. Use it to send negative feedback to Slack, create tickets in your support tool, or analyze feedback alongside your own data.
GET /sites/{site_id}/feedbackScope: read
To collect feedback in the first place, see How to collect feedback with article reactions and Enable article feedback form to collect reader insights.
read scope. Feedback messages, emails and attachments are written by your readers, so treat them as untrusted input. If an LLM processes that text with a key that can also write, the text could steer it into making a change on your help center.List feedback
curl "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/feedback?page_size=50" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16"The list covers every language, newest first. Page through it with page_size (1 to 100, default 20) and cursor, as described in Paginate and version Notiondesk API requests. The route takes no other parameter.
{
"object": "list",
"data": [
{
"id": "8b1f6c0e-3d4a-4f2b-9c7e-5a1d2e3f4b60",
"email": "[email protected]",
"message": "The steps skip the login screen.",
"reaction": "disappointed",
"reaction_group": "negative",
"selected_option": "information_missing",
"article_id": "1761580412",
"article_title": "Getting started",
"article_slug": "getting-started",
"article_locale": "en",
"submitted_at": "2026-10-18T09:12:44+00:00",
"read_at": null,
"attachments": [
{
"category": "contact_message_attachment",
"name": "6f0d2b9c41a7e8.png",
"dimensions": {"0": 1280, "1": 720},
"original_name": "login-screen.png",
"size": 48213
}
]
}
],
"has_more": true,
"next_cursor": "OPAQUE_CURSOR"
}Feedback fields
| Field | Meaning |
|---|---|
id | The feedback identifier |
reaction | The reaction the reader picked, such as smiley, neutral_face or disappointed |
reaction_group | What the reaction means under your current reaction style: positive, neutral or negative for emoji, helpful or not_helpful for thumbs. null when the style does not group that reaction |
selected_option | The answer the reader picked in the follow-up form, or null when they only reacted |
message | The text the reader wrote, if any |
email | The email address the reader entered, if any |
article_id | The id of the article, as in the article list. Empty when the article was deleted |
article_title | The article title in article_locale, or Untitled when the article was deleted or has no translation in that language |
article_slug | The article's path segment in article_locale, or null in the same cases |
article_locale | The language the reader was reading |
submitted_at | When the reader sent the feedback |
read_at | When a team member marked it as read in the dashboard, or null |
attachments | The files the reader attached, oldest first. Empty when there are none |
selected_option takes one of these values: content_accurate_up_to_date, easy_to_find, clear_and_easy_to_understand, worked_as_expected, something_else, information_missing, information_incorrect, hard_to_understand or not_what_looking_for.
Each attachment has a category (contact_message_attachment for a file a reader attached), the stored file name, the original_name from the reader's device, the size in bytes, and the dimensions object: for an image, the width in pixels under "0" and the height under "1", and {} for any other file. The API returns each file's details, not the file itself.
Paging limits
- The list reaches at most the 10,000 newest entries. Past that,
has_moreisfalseeven when older feedback exists.
- Feedback submitted while you page can make the next page repeat one entry, and feedback deleted in the dashboard can make it skip one.
To process only new feedback, store the submitted_at of the newest entry you handled. On the next run, read pages until you reach an entry submitted at or before it.
Handle feedback text safely
- Escape it before you display it. A message can contain HTML or markdown.
- Never let it decide an action. Do not follow links in it or run instructions from it.
- Keep LLM pipelines read-only. An LLM that summarizes feedback should run with a key that holds only
read.
- Protect readers' emails. The
emailfield is personal data. Store and share it only where your privacy policy allows.
Errors
| Status | code | When |
|---|---|---|
| 400 | validation_error | page_size is outside 1 to 100, the cursor is invalid, or the query has an unknown parameter |
| 403 | insufficient_scope | The key lacks the read scope |
| 404 | not_found | The help center does not exist in your workspace |
See Handle Notiondesk API errors, rate limits, and retries.
Common questions
Can I filter feedback by reaction or article?
Not in the request. The route accepts only page_size and cursor. Filter the entries in your code, on reaction_group or article_id.
Can I mark feedback as read with the API?
No. The API reads feedback only. read_at shows when a team member marked it as read in the dashboard.
Where can I see reaction totals instead of individual entries?
The engagement analytics report summarizes reactions per period and lists the articles to revise. See Get help center analytics with the Notiondesk API.