Export reader feedback with the Notiondesk API

Export Notiondesk article feedback via the REST API: reader reactions, follow-up answers, messages and attachments, newest first.

4 min read

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}/feedback

Scope: 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.

Use a key that holds only the 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

FieldMeaning
idThe feedback identifier
reactionThe reaction the reader picked, such as smiley, neutral_face or disappointed
reaction_groupWhat 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_optionThe answer the reader picked in the follow-up form, or null when they only reacted
messageThe text the reader wrote, if any
emailThe email address the reader entered, if any
article_idThe id of the article, as in the article list. Empty when the article was deleted
article_titleThe article title in article_locale, or Untitled when the article was deleted or has no translation in that language
article_slugThe article's path segment in article_locale, or null in the same cases
article_localeThe language the reader was reading
submitted_atWhen the reader sent the feedback
read_atWhen a team member marked it as read in the dashboard, or null
attachmentsThe 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_more is false even 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 email field is personal data. Store and share it only where your privacy policy allows.

Errors

StatuscodeWhen
400validation_errorpage_size is outside 1 to 100, the cursor is invalid, or the query has an unknown parameter
403insufficient_scopeThe key lacks the read scope
404not_foundThe 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.

What's next

Related articles

Was this page helpful?

Still need help? Ask us