[{"data":1,"prerenderedAt":37},["ShallowReactive",2],{"doc-support":3},{"html":4,"headings":5},"\u003Cp>Open a conversation in the inbox and everything about the customer is beside it: their plan and what they pay, their\nearlier conversations, a link to their contact page, and the feedback they asked for. Under the reply box are a\npicker for saved replies and FAQs, and a button that drafts a reply with AI. The web panel and the native app do the\nsame, through the endpoints below. They are admin endpoints (an operator session or an \u003Ccode>ak_\u003C\u002Fcode> admin key), so you can\nscript all of it too.\u003C\u002Fp>\n\u003Cp>Every request carries \u003Ccode>Authorization: Bearer ak_…\u003C\u002Fcode>. Project-scoped keys work for the projects they are limited to.\u003C\u002Fp>\n\u003Ch2 id=\"what-the-panel-shows\">What the panel shows\u003Ca class=\"heading-anchor\" href=\"#what-the-panel-shows\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Plan and MRR.\u003C\u002Fstrong> When the Stripe sync has found the customer, a compact card shows their plan, their monthly\nrecurring revenue in the Stripe account's currency, and the subscription status. No Stripe customer, no card.\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Felrumo\u002Fhelp-bites-oss\u002Fblob\u002Fmain\u002Fdocs\u002FCONTACTS.md\" target=\"_blank\" rel=\"noopener\">CONTACTS.md\u003C\u002Fa> covers the \u003Ccode>stripe_*\u003C\u002Fcode> attributes the sync writes.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Past conversations.\u003C\u002Fstrong> The customer's other conversations, newest first (ten at most). Click one to open it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Open contact.\u003C\u002Fstrong> Opens their contact page (\u003Ccode>\u002Fprojects\u002F&lt;id&gt;\u002Fcontacts?contact=&lt;contactId&gt;\u003C\u002Fcode> on the web).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Feedback.\u003C\u002Fstrong> The posts linked to this conversation, with whether the customer follows each. File a new post as\nthe customer or link one that exists.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Save as FAQ.\u003C\u002Fstrong> Right-click (web) or long-press (native) one of your replies to turn it into an FAQ.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Saved replies and FAQs\u003C\u002Fstrong> in the reply box, and \u003Cstrong>Draft with AI\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"one-read-get-v1adminconversationsidcontext\">One read: \u003Ccode>GET \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fcontext\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#one-read-get-v1adminconversationsidcontext\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan> https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Fcontext \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-json\">\u003Ccode>{\n  \u003Cspan class=\"shj-syn-var\">\"contact\"\u003C\u002Fspan>: { \u003Cspan class=\"shj-syn-var\">\"id\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"k1\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"name\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Ada Lovelace\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"email\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"ada@example.com\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"externalId\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"user_42\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"language\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"en\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"lastSeenAt\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"2026-10-20T08:12:00.000Z\"\u003C\u002Fspan> },\n  \u003Cspan class=\"shj-syn-var\">\"billing\"\u003C\u002Fspan>: { \u003Cspan class=\"shj-syn-var\">\"plan\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Pro\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"mrr\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-num\">29\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"currency\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"usd\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"status\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"active\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"customerId\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"cus_123\"\u003C\u002Fspan> },\n  \u003Cspan class=\"shj-syn-var\">\"pastConversations\"\u003C\u002Fspan>: [\n    { \u003Cspan class=\"shj-syn-var\">\"id\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"c0\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"subject\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Export stuck\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"status\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"done\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"statusCategory\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"resolved\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"lastMessageAt\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"2026-09-30T10:00:00.000Z\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"lastMessagePreview\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Fixed, thanks!\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"createdAt\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"2026-09-30T09:00:00.000Z\"\u003C\u002Fspan> }\n  ],\n  \u003Cspan class=\"shj-syn-var\">\"feedbackPosts\"\u003C\u002Fspan>: [\n    { \u003Cspan class=\"shj-syn-var\">\"id\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"p12\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"number\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-num\">12\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"title\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Export bookmarks as CSV\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"status\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"planned\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"statusLabel\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Planned\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"statusCategory\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"planned\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"following\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-bool\">true\u003C\u002Fspan> }\n  ],\n  \u003Cspan class=\"shj-syn-var\">\"faqModels\"\u003C\u002Fspan>: { \u003Cspan class=\"shj-syn-var\">\"models\"\u003C\u002Fspan>: [{ \u003Cspan class=\"shj-syn-var\">\"id\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"m1\"\u003C\u002Fspan>, \u003Cspan class=\"shj-syn-var\">\"name\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Help center\"\u003C\u002Fspan> }], \u003Cspan class=\"shj-syn-var\">\"defaultModelId\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"m1\"\u003C\u002Fspan> }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode>billing\u003C\u002Fcode> is \u003Ccode>null\u003C\u002Fcode> unless the contact has a Stripe customer. \u003Ccode>mrr\u003C\u002Fcode> is in major currency units (\u003Ccode>29\u003C\u002Fcode>, \u003Ccode>19.99\u003C\u002Fcode>), and\n\u003Ccode>currency\u003C\u002Fcode> comes from the project's connected Stripe account (empty when it was disconnected).\u003C\u002Fli>\n\u003Cli>\u003Ccode>pastConversations\u003C\u002Fcode> leaves out the one you asked about and includes archived ones.\u003C\u002Fli>\n\u003Cli>\u003Ccode>feedbackPosts\u003C\u002Fcode> is in the order they were linked; a post deleted since is skipped. \u003Ccode>following\u003C\u002Fcode> is false when the\ncustomer has muted the post or has no user id.\u003C\u002Fli>\n\u003Cli>\u003Ccode>faqModels\u003C\u002Fcode> is where &quot;Save as FAQ&quot; can write, best first: the models the conversation's assistant reads, then the\nproject's other assistants', then the rest. \u003Ccode>defaultModelId\u003C\u002Fcode> is empty when the workspace has no knowledge model.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"linking-a-feedback-post-post-v1adminconversationsidfeedback-posts\">Linking a feedback post: \u003Ccode>POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Ffeedback-posts\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#linking-a-feedback-post-post-v1adminconversationsidfeedback-posts\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Link an existing post (an id or \u003Ccode>#12\u003C\u002Fcode>), the customer follows it:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Ffeedback-posts \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"postId\": \"#12\" }'\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>File a new post written by the customer, and link it:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Ffeedback-posts \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"create\": { \"title\": \"Export bookmarks as CSV\", \"body\": \"Asked for in the support chat.\", \"type\": \"feature\" } }'\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Unlink: \u003Ccode>{ &quot;postId&quot;: &quot;#12&quot;, &quot;linked&quot;: false }\u003C\u002Fcode>. The answer is \u003Ccode>{ feedbackPostIds, post, linked, created, following }\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>The rules:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>The customer follows what you link\u003C\u002Fstrong> (they are emailed when it changes), unless you send \u003Ccode>&quot;follow&quot;: false\u003C\u002Fcode>.\nA post you file is theirs: they are its author, start with their own vote and follow it. It is validated like a post\nthey filed themselves (\u003Ccode>type\u003C\u002Fcode> must be one of the board's types), and it does not count as the customer visiting or\ntoward their posting rate limit.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>A contact with no user id (\u003Ccode>externalId\u003C\u002Fcode>) cannot follow or author a post.\u003C\u002Fstrong> Linking still works and answers\n\u003Ccode>following: false\u003C\u002Fcode>. Filing a new post is refused with \u003Ccode>409\u003C\u002Fcode>, because a post needs an author with an id. Link an\nexisting post instead.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Unlinking does not unfollow.\u003C\u002Fstrong> They may still want to hear about it.\u003C\u002Fli>\n\u003Cli>A conversation links at most 20 posts (\u003Ccode>400\u003C\u002Fcode> past that). Linking something already linked changes nothing.\u003C\u002Fli>\n\u003Cli>Each change leaves a line on the conversation's timeline (internal, the customer never sees it) and publishes the\n\u003Ccode>conversation.feedback_linked\u003C\u002Fcode> event (\u003Ccode>{ conversationId, postId, linked, created }\u003C\u002Fcode>, see \u003Ca href=\"\u002Fdocs\u002Fevents\">EVENTS.md\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>Customers never see which posts a conversation links: \u003Ccode>feedbackPostIds\u003C\u002Fcode> is left out of everything an end user reads.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"saved-replies-v1adminsaved-replies\">Saved replies: \u003Ccode>\u002Fv1\u002Fadmin\u002Fsaved-replies\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#saved-replies-v1adminsaved-replies\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Canned answers a project's team inserts while replying. Reading is open to any member; creating, editing and deleting\nneed the content role.\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-cmnt\"># list\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fsaved-replies?project=PROJECT_ID\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\n\n\u003Cspan class=\"shj-syn-cmnt\"># create\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fsaved-replies \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"project\": \"PROJECT_ID\", \"title\": \"Refund policy\", \"shortcut\": \"refund\", \"body\": \"Hi {{firstName}}, you can ask for a refund within 30 days.\" }'\u003C\u002Fspan>\n\n\u003Cspan class=\"shj-syn-cmnt\"># edit \u002F delete\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> PATCH  https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fsaved-replies\u002FREPLY_ID\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"body\": \"…\" }'\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> DELETE https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fsaved-replies\u002FREPLY_ID\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C\u002Fth>\n\u003Cth>Rule\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>title\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Required, up to 120 characters.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>body\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Required, up to 8,000 characters (a message's own limit).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>shortcut\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Optional, up to 30 characters, unique in the project. Lowercased; letters, digits, \u003Ccode>-\u003C\u002Fcode> and \u003Ccode>_\u003C\u002Fcode> (a leading \u003Ccode>\u002F\u003C\u002Fcode> is ignored). \u003Ccode>&quot;&quot;\u003C\u002Fcode> clears it.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Per project\u003C\u002Ftd>\n\u003Ctd>At most 200 (\u003Ccode>409\u003C\u002Fcode> past that).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Placeholders.\u003C\u002Fstrong> \u003Ccode>{{firstName}}\u003C\u002Fcode> is the first word of the customer's name and \u003Ccode>{{name}}\u003C\u002Fcode> all of it; with no name both\nbecome \u003Ccode>there\u003C\u002Fcode>, so &quot;Hi {{firstName}},&quot; always reads. Spaces inside the braces and letter case do not matter, and\nany other \u003Ccode>{{…}}\u003C\u002Fcode> is left as written. The text is stored as typed; the client fills the placeholders when it inserts the\nreply (\u003Ccode>fillSavedReply\u003C\u002Fcode> in \u003Ccode>shared\u002FsavedReplies.ts\u003C\u002Fcode>, ported to Swift as \u003Ccode>SavedReplyFill\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch2 id=\"replies-and-faqs-to-answer-with-get-v1adminconversationsidsuggestionsq\">Replies and FAQs to answer with: \u003Ccode>GET \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fsuggestions?q=\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#replies-and-faqs-to-answer-with-get-v1adminconversationsidsuggestionsq\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Fsuggestions?q=refund\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-cmnt\"># { \"faqs\": [{ \"id\", \"question\", \"answer\" }], \"savedReplies\": [{ \"id\", \"title\", \"body\", \"shortcut\" }] }\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Saved replies match \u003Ccode>q\u003C\u002Fcode> against the shortcut, the title and the text (best match first; with no \u003Ccode>q\u003C\u002Fcode> they are listed by\ntitle, up to 20). FAQs come from the knowledge each of the project's assistants may read, through the same search the\nauto-responder uses: Meilisearch when it is set up, a keyword scan otherwise. With no \u003Ccode>q\u003C\u002Fcode> the FAQs answer the\ncustomer's latest message, so the picker opens on likely answers. Only active FAQs are offered.\u003C\u002Fp>\n\u003Ch2 id=\"draft-a-reply-with-ai-post-v1adminconversationsiddraft\">Draft a reply with AI: \u003Ccode>POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fdraft\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#draft-a-reply-with-ai-post-v1adminconversationsiddraft\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Fdraft\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-cmnt\"># { \"draft\": \"Hi Ada, …\", \"model\": \"gpt-4o-mini\", \"sources\": [{ \"faqId\": \"f1\", \"question\": \"How do I export?\" }] }\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The draft is for you to edit: \u003Cstrong>nothing is stored or sent\u003C\u002Fstrong>. It uses the auto-responder's pipeline: the conversation's\nassistant (else the project's first active one, even with auto-reply off), the knowledge it may read, and the public part\nof the conversation. Internal notes and timeline events are never shown to the model. \u003Ccode>sources\u003C\u002Fcode> are the FAQs it was\ngiven; with none, check the facts yourself.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Status\u003C\u002Fth>\n\u003Cth>When\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>409\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The project has no assistant, no AI provider is set up, or the customer has not written anything yet.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>402\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The workspace has used this month's AI credits (see \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Felrumo\u002Fhelp-bites-oss\u002Fblob\u002Fmain\u002Fdocs\u002FKNOWLEDGE.md\" target=\"_blank\" rel=\"noopener\">KNOWLEDGE.md\u003C\u002Fa> for assistants and your own provider).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>502\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The AI provider failed.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"save-an-answer-as-an-faq-post-v1adminconversationsidfaq\">Save an answer as an FAQ: \u003Ccode>POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Ffaq\u003C\u002Fcode>\u003Ca class=\"heading-anchor\" href=\"#save-an-answer-as-an-faq-post-v1adminconversationsidfaq\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -s\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -X\u003C\u002Fspan> POST https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\u002Fconversations\u002FCONV_ID\u002Ffaq \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-var\">$HELP_BITES_ADMIN_KEY\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{ \"question\": \"How do I export my data?\", \"answer\": \"Open Settings, then Data, then Export.\", \"modelId\": \"MODEL_ID\" }'\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Creates an \u003Cstrong>active\u003C\u002Fstrong> FAQ with origin \u003Ccode>conversation\u003C\u002Fcode>; its \u003Ccode>conversationId\u003C\u002Fcode> says where it came from. \u003Ccode>modelId\u003C\u002Fcode> is your\npick from \u003Ccode>faqModels\u003C\u002Fcode>; left out it is the first one offered. It counts against the plan's FAQ limit (\u003Ccode>402\u003C\u002Fcode>), and with\nno knowledge model in the workspace it answers \u003Ccode>409\u003C\u002Fcode> (&quot;Create one under Knowledge first&quot;). The question is up to 500\ncharacters and the answer up to 20,000. See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Felrumo\u002Fhelp-bites-oss\u002Fblob\u002Fmain\u002Fdocs\u002FKNOWLEDGE.md\" target=\"_blank\" rel=\"noopener\">KNOWLEDGE.md\u003C\u002Fa> for what happens to an FAQ next.\u003C\u002Fp>\n\u003Ch2 id=\"events\">Events\u003Ca class=\"heading-anchor\" href=\"#events\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode>conversation.created\u003C\u002Fcode>, \u003Ccode>conversation.status_changed\u003C\u002Fcode> (a status change by an operator, an action, or a customer\nreopening a thread) and \u003Ccode>conversation.feedback_linked\u003C\u002Fcode> are published to your webhook endpoints. See\n\u003Ca href=\"\u002Fdocs\u002Fevents\">EVENTS.md\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"build-your-own-panel\">Build your own panel\u003Ca class=\"heading-anchor\" href=\"#build-your-own-panel\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Web, one read and the placeholder fill:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-js\">\u003Ccode>\u003Cspan class=\"shj-syn-kwd\">import\u003C\u002Fspan> { fillSavedReply } \u003Cspan class=\"shj-syn-kwd\">from\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'.\u002FsavedReplies'\u003C\u002Fspan> \u003Cspan class=\"shj-syn-cmnt\">\u002F\u002F or copy the few lines from shared\u002FsavedReplies.ts\n\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-kwd\">const\u003C\u002Fspan> base \u003Cspan class=\"shj-syn-oper\">=\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin'\u003C\u002Fspan>\n\u003Cspan class=\"shj-syn-kwd\">const\u003C\u002Fspan> headers \u003Cspan class=\"shj-syn-oper\">=\u003C\u002Fspan> { authorization\u003Cspan class=\"shj-syn-oper\">:\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">`Bearer \u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>adminKey\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">`\u003C\u002Fspan> }\n\n\u003Cspan class=\"shj-syn-kwd\">const\u003C\u002Fspan> ctx \u003Cspan class=\"shj-syn-oper\">=\u003C\u002Fspan> \u003Cspan class=\"shj-syn-kwd\">await\u003C\u002Fspan> \u003Cspan class=\"shj-syn-func\">fetch\u003C\u002Fspan>(\u003Cspan class=\"shj-syn-str\">`\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>base\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\u002Fconversations\u002F\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>id\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\u002Fcontext`\u003C\u002Fspan>\u003Cspan class=\"shj-syn-oper\">,\u003C\u002Fspan> { headers })\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">then\u003C\u002Fspan>(r \u003Cspan class=\"shj-syn-kwd\">=&gt;\u003C\u002Fspan> r\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">json\u003C\u002Fspan>())\n\u003Cspan class=\"shj-syn-kwd\">if\u003C\u002Fspan> (ctx\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>billing) console\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">log\u003C\u002Fspan>(\u003Cspan class=\"shj-syn-str\">`\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>ctx\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>billing\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>plan\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">: \u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>ctx\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>billing\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>mrr\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\"> \u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>ctx\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>billing\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>currency\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">toUpperCase\u003C\u002Fspan>()\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\"> a month`\u003C\u002Fspan>)\n\n\u003Cspan class=\"shj-syn-kwd\">const\u003C\u002Fspan> { savedReplies } \u003Cspan class=\"shj-syn-oper\">=\u003C\u002Fspan> \u003Cspan class=\"shj-syn-kwd\">await\u003C\u002Fspan> \u003Cspan class=\"shj-syn-func\">fetch\u003C\u002Fspan>(\u003Cspan class=\"shj-syn-str\">`\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>base\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\u002Fconversations\u002F\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\">${\u003C\u002Fspan>id\u003Cspan class=\"shj-syn-kwd\">}\u003C\u002Fspan>\u003Cspan class=\"shj-syn-str\">\u002Fsuggestions?q=refund`\u003C\u002Fspan>\u003Cspan class=\"shj-syn-oper\">,\u003C\u002Fspan> { headers })\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">then\u003C\u002Fspan>(r \u003Cspan class=\"shj-syn-kwd\">=&gt;\u003C\u002Fspan> r\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>\u003Cspan class=\"shj-syn-func\">json\u003C\u002Fspan>())\n\u003Cspan class=\"shj-syn-kwd\">const\u003C\u002Fspan> text \u003Cspan class=\"shj-syn-oper\">=\u003C\u002Fspan> \u003Cspan class=\"shj-syn-func\">fillSavedReply\u003C\u002Fspan>(savedReplies[\u003Cspan class=\"shj-syn-num\">0\u003C\u002Fspan>]\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>body\u003Cspan class=\"shj-syn-oper\">,\u003C\u002Fspan> { name\u003Cspan class=\"shj-syn-oper\">:\u003C\u002Fspan> ctx\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>contact\u003Cspan class=\"shj-syn-oper\">.\u003C\u002Fspan>name })\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Swift, plain \u003Ccode>URLSession\u003C\u002Fcode>, no package:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-plain\">\u003Ccode>import SwiftUI\n\nstruct CustomerPanel: View {\n  let base = URL(string: \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fv1\u002Fadmin\"\u003C\u002Fspan>)!\n  let adminKey: String\n  let conversationId: String\n  var accent = Color.accentColor\n  var cornerRadius: CGFloat = 8\n\n  struct Context: Decodable {\n    struct Billing: Decodable { let plan: String; let mrr: Double; let currency: String; let status: String }\n    struct Past: Decodable, Identifiable { let id: String; let subject: String }\n    let billing: Billing?\n    let pastConversations: [Past]\n  }\n  @State private var context: Context?\n\n  var body: some View {\n    VStack(alignment: .leading, spacing: 8) {\n      if let billing = context?.billing {\n        Text(\u003Cspan class=\"shj-syn-str\">\"\\(billing.plan.isEmpty ? \"\u003C\u002Fspan>No plan\u003Cspan class=\"shj-syn-str\">\" : billing.plan) · \\(billing.mrr.formatted(.currency(code: billing.currency.uppercased()))) a month\"\u003C\u002Fspan>)\n          .padding(10)\n          .overlay(RoundedRectangle(cornerRadius: cornerRadius).stroke(accent.opacity(0.4)))\n      }\n      ForEach(context?.pastConversations ?? []) { Text($0.subject) }\n    }\n    .task {\n      var request = URLRequest(url: base.appending(path: \u003Cspan class=\"shj-syn-str\">\"conversations\u002F\\(conversationId)\u002Fcontext\"\u003C\u002Fspan>))\n      request.setValue(\u003Cspan class=\"shj-syn-str\">\"Bearer \\(adminKey)\"\u003C\u002Fspan>, forHTTPHeaderField: \u003Cspan class=\"shj-syn-str\">\"Authorization\"\u003C\u002Fspan>)\n      if let (data, _) = try? await URLSession.shared.data(for: request) { context = try? JSONDecoder().decode(Context.self, from: data) }\n    }\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Keep an admin key on a server you run, not in an app you ship: the key can do everything an operator can.\u003C\u002Fp>\n\u003Ch2 id=\"not-built-yet\">Not built yet\u003Ca class=\"heading-anchor\" href=\"#not-built-yet\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Saved replies cannot be triggered by typing \u003Ccode>\u002Fshortcut\u003C\u002Fcode> in the reply box yet: the shortcut is something you search\nfor in the picker.\u003C\u002Fli>\n\u003Cli>The AI draft answers the customer's latest message only; it does not take instructions (&quot;make it shorter&quot;).\u003C\u002Fli>\n\u003Cli>A contact with no user id cannot follow or file feedback.\u003C\u002Fli>\n\u003C\u002Ful>\n",[6,10,13,16,19,22,25,28,31,34],{"id":7,"text":8,"level":9},"what-the-panel-shows","What the panel shows",2,{"id":11,"text":12,"level":9},"one-read-get-v1adminconversationsidcontext","One read: GET \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fcontext",{"id":14,"text":15,"level":9},"linking-a-feedback-post-post-v1adminconversationsidfeedback-posts","Linking a feedback post: POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Ffeedback-posts",{"id":17,"text":18,"level":9},"saved-replies-v1adminsaved-replies","Saved replies: \u002Fv1\u002Fadmin\u002Fsaved-replies",{"id":20,"text":21,"level":9},"replies-and-faqs-to-answer-with-get-v1adminconversationsidsuggestionsq","Replies and FAQs to answer with: GET \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fsuggestions?q=",{"id":23,"text":24,"level":9},"draft-a-reply-with-ai-post-v1adminconversationsiddraft","Draft a reply with AI: POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Fdraft",{"id":26,"text":27,"level":9},"save-an-answer-as-an-faq-post-v1adminconversationsidfaq","Save an answer as an FAQ: POST \u002Fv1\u002Fadmin\u002Fconversations\u002F:id\u002Ffaq",{"id":29,"text":30,"level":9},"events","Events",{"id":32,"text":33,"level":9},"build-your-own-panel","Build your own panel",{"id":35,"text":36,"level":9},"not-built-yet","Not built yet",1792677543075]