Widget routes are public customer-browser routes used by https://woes.dev/widget.js, the embedded iframe, and mobile SDKs. They do not accept woesk_ REST API keys. They authenticate by widget public key and, where conversation state is involved, the per-conversation conversationSecret returned when the conversation is created.
A widget public key is public routing material, not a private credential. Never use it as proof that a caller can read or mutate a conversation. Conversation history, presence, feedback, and survey writes require the matching conversationSecret when they touch an existing thread.
Returns only customer-safe config: visual theme, launcher/welcome text, quick links, widget feature toggles, business-hours fields, enabled surveys, identity verification state, and whether the selected agent can auto-reply.Config also records the widget install origin for the operator-side install check. That recording is best-effort and never blocks the config response.
POST /api/widget/messages creates the conversation on the first message and returns a conversationKey plus an opaque conversationSecret. Store both per widget key in the browser or SDK. The secret is required to read or continue that conversation later.Message bodies are bounded and sanitized. context and identity are treated as customer-supplied until verified. Operator-only traces, provider internals, and private workspace data are excluded from widget history responses.
Presence, feedback, and survey routes all verify that the conversation belongs to the widget key’s workspace before mutating or returning conversation state. Survey submissions also verify that the survey is configured and enabled for that workspace.
Widget updates are published announcements shown in the widget Updates tab.
Anonymous visitors can load published updates for the widget key. Read state is
only returned or written after Woes validates HMAC or JWT identity proof for the
same widget key. The server derives the reader identity from that proof; clients
should not invent or send their own readerKey.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Woes","description":"Customer-facing documentation and REST API reference for Woes, the API-native developer support platform.","colors":{"primary":"#B83A12","light":"#E05A22","dark":"#E05A22"},"logo":{"light":"https://mintcdn.com/woes/QdK5garcQwoPsAlm/images/woes-wordmark.png?fit=max\u0026auto=format\u0026n=QdK5garcQwoPsAlm\u0026q=85\u0026s=5fb012a2064e1898482aab3a15aa40fc","dark":"https://mintcdn.com/woes/QdK5garcQwoPsAlm/images/woes-wordmark.png?fit=max\u0026auto=format\u0026n=QdK5garcQwoPsAlm\u0026q=85\u0026s=5fb012a2064e1898482aab3a15aa40fc"},"favicon":"https://mintcdn.com/woes/z9C4KzvBjjdD9uds/images/woes-mark.png?fit=max\u0026auto=format\u0026n=z9C4KzvBjjdD9uds\u0026q=85\u0026s=d0f6cf6c6931b5f50b6fb075aefffe6e","api":{"params":{"expanded":"all"},"playground":{"display":"interactive","proxy":true},"examples":{"defaults":"required","languages":["curl","node","python","javascript"],"prefill":true},"url":"full"},"background":{"decoration":"grid","color":{"light":"#FFF8F2","dark":"#11100F"}},"navbar":{"links":[{"href":"https://docs.woes.dev","label":"Docs"},{"href":"https://docs.woes.dev/api-reference/overview","label":"API Reference"},{"href":"https://docs.woes.dev/security/data-privacy","label":"Trust"},{"href":"https://woes.dev","label":"App"}],"primary":{"type":"button","label":"Open app","href":"https://woes.dev"}},"footer":{"links":[{"header":"Product","items":[{"label":"Quickstart","href":"/quickstart/overview"},{"label":"Support Workflows","href":"/support-workflows/omnichannel-support"},{"label":"Chat Widget","href":"/chat-widget/overview"},{"label":"Website","href":"https://woes.dev"},{"label":"Blog","href":"https://woes.dev/blog"}]},{"header":"Knowledge","items":[{"label":"Knowledge Base","href":"/knowledge-base/overview"},{"label":"AI Agents","href":"/agents/overview"},{"label":"Analytics","href":"/platform/analytics"}]},{"header":"Developer","items":[{"label":"Developer Overview","href":"/developer/overview"},{"label":"API Reference","href":"/api-reference/overview"},{"label":"Authentication","href":"/api/authentication"}]},{"header":"Security","items":[{"label":"Widget Identity","href":"/security/widget-identity"},{"label":"Data Privacy","href":"/security/data-privacy"},{"label":"Tenant Isolation","href":"/security/tenant-isolation"}]}]},"search":{"prompt":"Search Woes docs, API guides, and endpoint reference..."},"seo":{"metatags":{"og:site_name":"Woes Docs","twitter:card":"summary_large_image"},"indexing":"navigable"},"icons":{"library":"lucide"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"dark","latex":false},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"woes","hasAudioNarration":false,"actualSubdomain":"woes","customDomains":["docs.woes.dev"],"gitSource":{"type":"github","owner":"spazman2c","repo":"woesdocs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"e11cbd83-504b-4a19-83e1-400e755437d0","liveDeploymentHistoryId":"6a495fcd7c1f63e9b6fe6af5","schemaVersion":"v3"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6a495fcd7c1f63e9b6fe6af5:success","clientVersion":"0.0.3964","searchFilterCounts":[{"language":"default","tag":"Docs","count":73},{"language":"default","tag":"Woes documentation","count":73},{"language":"default","tag":"API Reference","count":45},{"language":"default","tag":"API reference","count":45},{"language":"default","tag":"Integrations","count":28},{"language":"default","tag":"Endpoint reference","count":28},{"language":"default","tag":"Support workflows","count":14},{"language":"default","tag":"Platform","count":10},{"language":"default","tag":"Resource guides","count":8},{"language":"default","tag":"Chat widget","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@keyframes woes-active-nav-enter{0%{background-position:-18px 0;opacity:.72;transform:translateX(-5px)}to{background-position:0 0;opacity:1;transform:translateX(0)}}:root{--woes-orange:#ff7038;--woes-orange-strong:#b83a12;--woes-accent-text:#b83a12;--woes-orange-soft:rgba(255, 112, 56, 0.1);--woes-border:rgba(255, 112, 56, 0.24);--woes-active-bg:rgba(184, 58, 18, 0.08);--woes-active-border:rgba(184, 58, 18, 0.22);--woes-active-text:#5f210f;--woes-active-outline:rgba(255, 112, 56, 0.9);--woes-active-ring:rgba(184, 58, 18, 0.08);--woes-title:#2a211d;--woes-copy:#514842;--woes-copy-muted:#746961;--woes-link:#b83a12;--woes-link-hover:#8f2d0d}html.dark{--woes-accent-text:#ff7038;--woes-active-bg:rgba(255, 255, 255, 0.055);--woes-active-border:rgba(255, 255, 255, 0.07);--woes-active-text:#fff0e8;--woes-active-outline:rgba(255, 112, 56, 0.9);--woes-active-ring:rgba(255, 255, 255, 0.035);--woes-title:#f7f1ea;--woes-copy:#b7aea7;--woes-copy-muted:#8f8780;--woes-link:#ff9a70;--woes-link-hover:#ffc2a5}@view-transition{navigation:auto}.sidebar-group-header,:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"], [class*=\"toc\"]) [class*=uppercase],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"], [class*=\"toc\"]) p[class*=uppercase],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"], [class*=\"toc\"]) span[class*=uppercase]{color:var(--woes-accent-text)!important;font-weight:700!important;letter-spacing:.18em!important;text-transform:uppercase!important}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"])[aria-expanded],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"])[aria-haspopup],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) [data-state]>button{color:var(--woes-accent-text)!important;font-weight:650!important}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"])[aria-expanded] :where(span, svg),:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"])[aria-haspopup] :where(span, svg){color:inherit!important;stroke:currentColor!important}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"])[aria-expanded=false]{opacity:.92}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a[aria-current=page],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a[data-active=true]{color:var(--woes-active-text)!important;font-weight:700!important}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a[aria-current=page]{background:linear-gradient(90deg,rgba(255,112,56,.16),transparent 42%),var(--woes-active-bg)!important;border-color:var(--woes-active-border)!important;box-shadow:inset 3px 0 0 var(--woes-active-outline),inset 0 0 0 1px var(--woes-active-ring)!important;text-shadow:none!important}main h1,main h2,main h3{color:var(--woes-title)!important}main :where(p, li, td, dd, blockquote, figcaption){color:var(--woes-copy)!important}main :where(p, li, td, dd) :where(span, strong){color:inherit!important}main :where(a){color:var(--woes-link)!important;text-decoration-color:rgba(255,112,56,.55)!important;text-underline-offset:.18em}main :where(a:hover){color:var(--woes-link-hover)!important;text-decoration-color:var(--woes-orange)!important}html.dark main :where(table){border-color:rgba(255,255,255,.1)}main :where(th){color:var(--woes-title)!important}main :where(.steps, [class*=\"step\"]) :where(p, div, span):not(a):not(button){color:var(--woes-copy)}.card,[class*=card]{border-color:var(--woes-border)}html.dark main :where(.card, [class*=\"card\"]) :where(p, span, div):not(a):not(button),html:not(.dark) main :where(.card, [class*=\"card\"]) :where(p, span, div):not(a):not(button){color:var(--woes-copy-muted)}html:not(.dark) main :where(\n h1,\n h2,\n h3,\n h4,\n p,\n li,\n td,\n th,\n dd,\n blockquote,\n figcaption\n )[class*=text-neutral-50],html:not(.dark) main :where(\n h1,\n h2,\n h3,\n h4,\n p,\n li,\n td,\n th,\n dd,\n blockquote,\n figcaption\n )[class*=text-slate-50],html:not(.dark) main :where(\n h1,\n h2,\n h3,\n h4,\n p,\n li,\n td,\n th,\n dd,\n blockquote,\n figcaption\n )[class*=text-white],html:not(.dark) main :where(\n h1,\n h2,\n h3,\n h4,\n p,\n li,\n td,\n th,\n dd,\n blockquote,\n figcaption\n )[class*=text-zinc-50],html:not(.dark) main :where(h1, h2, h3, h4, p, li, td, th, dd, blockquote, figcaption) :where(\n [class*=\"text-white\"],\n [class*=\"text-slate-50\"],\n [class*=\"text-zinc-50\"],\n [class*=\"text-neutral-50\"]\n ){color:var(--woes-title)!important}code{border-color:rgba(255,112,56,.18)}.woes-agent-prompt-copy{align-items:center;background:var(--woes-orange);border:1px solid rgba(255,112,56,.72);border-radius:8px;color:#171310;cursor:pointer;display:inline-flex;font-size:.94rem;font-weight:750;gap:.5rem;line-height:1;margin:.75rem 0 1rem;padding:.85rem 1rem;transition:background-color 160ms ease,border-color 160ms ease,transform 160ms ease}.woes-agent-prompt-copy:hover{background:#ff875c;border-color:#ffb08f;transform:translateY(-1px)}.woes-agent-prompt-source{height:1px;left:-9999px;opacity:0;pointer-events:none;position:absolute;top:auto;width:1px}@media (prefers-reduced-motion:no-preference){::view-transition-new(root),::view-transition-old(root){animation-duration:180ms;animation-timing-function:cubic-bezier(.2,.7,.2,1)}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) :where(button, [role=\"button\"]),:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a{transition:background-color 220ms cubic-bezier(.2,.7,.2,1),border-color 220ms cubic-bezier(.2,.7,.2,1),color 220ms cubic-bezier(.2,.7,.2,1),box-shadow 220ms cubic-bezier(.2,.7,.2,1),opacity 220ms cubic-bezier(.2,.7,.2,1),transform 220ms cubic-bezier(.2,.7,.2,1)}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a:hover{transform:translateX(2px)}:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a[aria-current=page],:where(aside, nav, [role=\"navigation\"], [class*=\"sidebar\"]) a[data-active=true]{animation:woes-active-nav-enter 260ms cubic-bezier(.16,1,.3,1);transform:translateX(0)}}"}],"page":{"pagePath":"api/widget-routes","slug":"/api/widget-routes","pageMetadata":{"title":"Widget Routes","sidebarTitle":"Widget routes","description":"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.","href":"/api/widget-routes"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`widget-routes`,children:`Widget Routes`}),`\n`,_jsxs(_components.p,{children:[`Widget routes are public customer-browser routes used by `,_jsx(_components.code,{children:`https://woes.dev/widget.js`}),`, the embedded iframe, and mobile SDKs. They do not accept `,_jsx(_components.code,{children:`woesk_`}),` REST API keys. They authenticate by widget public key and, where conversation state is involved, the per-conversation `,_jsx(_components.code,{children:`conversationSecret`}),` returned when the conversation is created.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`A widget public key is public routing material, not a private credential. Never use it as proof that a caller can read or mutate a conversation. Conversation history, presence, feedback, and survey writes require the matching `,_jsx(_components.code,{children:`conversationSecret`}),` when they touch an existing thread.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`shared-rules`,children:`Shared Rules`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Rule`}),_jsx(_components.th,{children:`Details`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CORS`}),_jsx(_components.td,{children:`Widget routes are CORS-open for embedded customer sites.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Public key`}),_jsxs(_components.td,{children:[`Pass `,_jsx(_components.code,{children:`publicKey`}),` as a query parameter or JSON body depending on the route. Workspace and agent widget keys are supported.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Conversation secret`}),_jsxs(_components.td,{children:[`Prefer the `,_jsx(_components.code,{children:`x-widget-conversation-secret`}),` header for reads. Query/body `,_jsx(_components.code,{children:`conversationSecret`}),` is supported where noted for browser and SDK compatibility.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Rate limits`}),_jsxs(_components.td,{children:[`Routes apply per-IP and per-workspace rate limits. `,_jsx(_components.code,{children:`429`}),` responses may include `,_jsx(_components.code,{children:`Retry-After`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Boundaries`}),_jsx(_components.td,{children:`Responses must not include workspace secrets, operator debug traces, provider/model internals, service-role data, or another workspace’s records.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`routes`,children:`Routes`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Route`}),_jsx(_components.th,{children:`Purpose`}),_jsx(_components.th,{children:`Requires`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/config`})}),_jsx(_components.td,{children:`Load customer-safe widget branding, settings, surveys, quick links, availability, and identity mode for a widget key.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),` query.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/identity`})}),_jsx(_components.td,{children:`Verify an HMAC email hash or JWT for the selected widget key before the visitor sends trusted identity.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),` plus `,_jsx(_components.code,{children:`emailHash`}),` and `,_jsx(_components.code,{children:`identity`}),`, or `,_jsx(_components.code,{children:`jwt`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/messages`})}),_jsx(_components.td,{children:`Create or continue a widget conversation and store a customer message. May trigger AI response or handoff behavior.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, `,_jsx(_components.code,{children:`body`}),`; existing conversations also use `,_jsx(_components.code,{children:`conversationKey`}),` and `,_jsx(_components.code,{children:`conversationSecret`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/messages`})}),_jsx(_components.td,{children:`Read customer-safe message history for one widget conversation.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, `,_jsx(_components.code,{children:`conversationKey`}),`, and `,_jsx(_components.code,{children:`conversationSecret`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/presence`})}),_jsx(_components.td,{children:`Heartbeat active customer presence on an existing widget conversation.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`conversationKey`}),`; public widgets also require `,_jsx(_components.code,{children:`publicKey`}),` and `,_jsx(_components.code,{children:`conversationSecret`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/events`})}),_jsx(_components.td,{children:`Record widget impressions, opens, closes, and engagement events.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, visitor/session ids, and event list.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/feedback`})}),_jsx(_components.td,{children:`Load thumbs feedback state for messages in one verified widget conversation.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, `,_jsx(_components.code,{children:`conversationKey`}),`, and `,_jsx(_components.code,{children:`conversationSecret`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/csat`})}),_jsx(_components.td,{children:`Record a configured CSAT or NPS survey response for a verified widget conversation.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, `,_jsx(_components.code,{children:`surveyId`}),`, `,_jsx(_components.code,{children:`score`}),`, `,_jsx(_components.code,{children:`conversationKey`}),`, and `,_jsx(_components.code,{children:`conversationSecret`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GET`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/updates`})}),_jsx(_components.td,{children:`Load published customer updates for a widget key. Optionally includes read state for a verified HMAC/JWT identity.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`; verified identity headers where read state is needed.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`POST`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`/api/widget/updates/read`})}),_jsx(_components.td,{children:`Mark published widget updates as read for a verified reader.`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`publicKey`}),`, verified HMAC/JWT identity proof, and up to 50 UUID `,_jsx(_components.code,{children:`updateIds`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`config`,children:`Config`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`http`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`http`,children:_jsxs(_components.code,{language:`http`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:`GET`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` /api/widget/config?publicKey=trovw_agent_xxx`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Returns only customer-safe config: visual theme, launcher/welcome text, quick links, widget feature toggles, business-hours fields, enabled surveys, identity verification state, and whether the selected agent can auto-reply.`}),`\n`,_jsx(_components.p,{children:`Config also records the widget install origin for the operator-side install check. That recording is best-effort and never blocks the config response.`}),`\n`,_jsx(Heading,{level:`2`,id:`identity-check`,children:`Identity Check`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`http`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`http`,children:_jsxs(_components.code,{language:`http`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#C586C0`,\"--shiki-dark\":`#C586C0`},children:`POST`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` /api/widget/identity`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`Content-Type:`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:` application/json`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"publicKey\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"trovw_agent_xxx\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"identity\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"id\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"user_123\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"email\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"ada@example.com\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"Ada Lovelace\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"company\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"Example API Co\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"emailHash\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"SERVER_GENERATED_HMAC\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For JWT mode, send `,_jsx(_components.code,{children:`{ \"publicKey\": \"...\", \"jwt\": \"...\" }`}),` instead. A successful response includes `,_jsx(_components.code,{children:`verified: true`}),`, the resolved mode, and customer-safe identity fields. Failed proofs return `,_jsx(_components.code,{children:`403`}),` with `,_jsx(_components.code,{children:`verified: false`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`messages`,children:`Messages`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /api/widget/messages`}),` creates the conversation on the first message and returns a `,_jsx(_components.code,{children:`conversationKey`}),` plus an opaque `,_jsx(_components.code,{children:`conversationSecret`}),`. Store both per widget key in the browser or SDK. The secret is required to read or continue that conversation later.`]}),`\n`,_jsxs(_components.p,{children:[`Message bodies are bounded and sanitized. `,_jsx(_components.code,{children:`context`}),` and `,_jsx(_components.code,{children:`identity`}),` are treated as customer-supplied until verified. Operator-only traces, provider internals, and private workspace data are excluded from widget history responses.`]}),`\n`,_jsx(Heading,{level:`2`,id:`presence-feedback-and-surveys`,children:`Presence, Feedback, And Surveys`}),`\n`,_jsx(_components.p,{children:`Presence, feedback, and survey routes all verify that the conversation belongs to the widget key’s workspace before mutating or returning conversation state. Survey submissions also verify that the survey is configured and enabled for that workspace.`}),`\n`,_jsx(Heading,{level:`2`,id:`updates`,children:`Updates`}),`\n`,_jsxs(_components.p,{children:[`Widget updates are published announcements shown in the widget Updates tab.\nAnonymous visitors can load published updates for the widget key. Read state is\nonly returned or written after Woes validates HMAC or JWT identity proof for the\nsame widget key. The server derives the reader identity from that proof; clients\nshould not invent or send their own `,_jsx(_components.code,{children:`readerKey`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`related-pages`,children:`Related Pages`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/api/widget`,children:`Widget Runtime`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/chat-widget/javascript-api`,children:`Widget JavaScript API`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/security/widget-identity`,children:`Widget Identity`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/quickstart/install-widget`,children:`Install the Widget`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Widget Routes","sidebarTitle":"Widget routes","description":"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.","href":"/api/widget-routes"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Widget Routes","slug":"widget-routes","depth":1,"children":[]},{"title":"Shared Rules","slug":"shared-rules","depth":2,"children":[]},{"title":"Routes","slug":"routes","depth":2,"children":[]},{"title":"Config","slug":"config","depth":2,"children":[]},{"title":"Identity Check","slug":"identity-check","depth":2,"children":[]},{"title":"Messages","slug":"messages","depth":2,"children":[]},{"title":"Presence, Feedback, And Surveys","slug":"presence-feedback-and-surveys","depth":2,"children":[]},{"title":"Updates","slug":"updates","depth":2,"children":[]},{"title":"Related Pages","slug":"related-pages","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/woes/03c522a7be79c968/woes-widget.js"],"subdomain":"woes","siteName":"Woes","title":"Widget Routes - Woes","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-03T01:51:10.751Z","gitLastModified":"2026-07-03T01:50:54.000Z","originalFileLocation":"api/widget-routes.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Woes\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Widget Routes - Woes\">\u003cmeta data-mint-head property=\"og:description\" content=\"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Woes Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.woes.dev/api/widget-routes\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://woes.mintlify.app/_mintlify/api/og/v2?division=Runtime+guides\u0026amp;title=Widget+Routes\u0026amp;description=Public+widget+route+contracts+for+config%2C+identity%2C+messages%2C+presence%2C+events%2C+feedback%2C+surveys%2C+and+updates.\u0026amp;theme=594accbaf32d79441de8f280\u0026amp;signature=4ad0b68d7417560d2af582785c6897caec3b2a4e0f2822bb62f84dd6b1e0a84a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Widget Routes - Woes\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://woes.mintlify.app/_mintlify/api/og/v2?division=Runtime+guides\u0026amp;title=Widget+Routes\u0026amp;description=Public+widget+route+contracts+for+config%2C+identity%2C+messages%2C+presence%2C+events%2C+feedback%2C+surveys%2C+and+updates.\u0026amp;theme=594accbaf32d79441de8f280\u0026amp;signature=4ad0b68d7417560d2af582785c6897caec3b2a4e0f2822bb62f84dd6b1e0a84a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/woes/SSvjR3VTqRe-th0R/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Woes\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#B83A12\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.woes.dev/api/widget-routes\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api/widget-routes.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.woes.dev/#organization\",\"name\":\"Woes\",\"url\":\"https://docs.woes.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/woes/QdK5garcQwoPsAlm/images/woes-wordmark.png?fit=max\u0026auto=format\u0026n=QdK5garcQwoPsAlm\u0026q=85\u0026s=5fb012a2064e1898482aab3a15aa40fc\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.woes.dev#website\",\"name\":\"Woes\",\"url\":\"https://docs.woes.dev\",\"publisher\":{\"@id\":\"https://docs.woes.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.woes.dev/api/widget-routes#webpage\",\"url\":\"https://docs.woes.dev/api/widget-routes\",\"name\":\"Widget Routes\",\"description\":\"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\",\"dateModified\":\"2026-07-03T01:50:54.000Z\",\"isPartOf\":{\"@id\":\"https://docs.woes.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.woes.dev/api/widget-routes#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.woes.dev/api/widget-routes#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://docs.woes.dev/api-reference/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Runtime guides\",\"item\":\"https://docs.woes.dev/reference/routes\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Widget Routes\",\"item\":\"https://docs.woes.dev/api/widget-routes\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.woes.dev/api/widget-routes#article\",\"headline\":\"Widget Routes\",\"name\":\"Widget Routes\",\"description\":\"Public widget route contracts for config, identity, messages, presence, events, feedback, surveys, and updates.\",\"url\":\"https://docs.woes.dev/api/widget-routes\",\"mainEntityOfPage\":{\"@id\":\"https://docs.woes.dev/api/widget-routes#webpage\"},\"dateModified\":\"2026-07-03T01:50:54.000Z\",\"publisher\":{\"@id\":\"https://docs.woes.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.woes.dev#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Woes\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Woes","nav":{"global":null,"tabs":[{"tab":"Docs","icon":"book-open","pages":[{"title":"Docs","href":""}]},{"tab":"API Reference","icon":"square-terminal","groups":[{"group":"API reference","pages":[{"group":"Start here","expanded":false,"pages":[{"title":"API Reference","sidebarTitle":"Start here","href":"/api-reference/overview"},{"title":"REST API Overview","sidebarTitle":"REST API guide","href":"/api/overview"},{"title":"Authentication","href":"/api/authentication"},{"title":"API Keys","href":"/api/keys"}]},{"group":"Runtime guides","expanded":false,"pages":[{"title":"Route Map","sidebarTitle":"Route map","href":"/reference/routes"},{"title":"MCP Server","sidebarTitle":"MCP Server","icon":"plug-zap","href":"/api/mcp"},{"title":"Widget Runtime","description":"Install and control the public Woes live chat widget runtime.","href":"/api/widget"},{"title":"Widget Routes","sidebarTitle":"Widget routes","href":"/api/widget-routes"},{"title":"Survey Delivery","description":"Understand customer-facing widget and email survey response routes.","href":"/api/surveys"}]},{"group":"Resource guides","expanded":false,"pages":[{"title":"Conversations","sidebarTitle":"Conversations API","href":"/api/conversations"},{"title":"Issues","sidebarTitle":"Issues API","href":"/api/issues"},{"title":"Clients","sidebarTitle":"Clients API","href":"/api/clients"},{"title":"Agents","sidebarTitle":"Agents API","href":"/api/agents"},{"title":"Sources","sidebarTitle":"Sources API","href":"/api/sources"},{"title":"Definitions","sidebarTitle":"Definitions API","href":"/api/definitions"},{"title":"Usage","sidebarTitle":"Usage API","href":"/api/usage"},{"title":"Analytics","sidebarTitle":"Analytics API","href":"/api/analytics"}]},{"group":"Endpoint reference","expanded":false,"pages":[{"group":"Conversations","expanded":false,"pages":[{"title":"List conversations","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/conversations","href":"/api-reference/conversations/list-conversations"},{"title":"Create conversation","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/conversations","href":"/api-reference/conversations/create-conversation"},{"title":"Retrieve conversation","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/conversations/{conversationId}","href":"/api-reference/conversations/retrieve-conversation"},{"title":"Update conversation","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/conversations/{conversationId}","href":"/api-reference/conversations/update-conversation"},{"title":"List messages","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/conversations/{conversationId}/messages","href":"/api-reference/conversations/list-messages"},{"title":"Create message","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/conversations/{conversationId}/messages","href":"/api-reference/conversations/create-message"}]},{"group":"Issues","expanded":false,"pages":[{"title":"List issues","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/issues","href":"/api-reference/issues/list-issues"},{"title":"Create issue","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/issues","href":"/api-reference/issues/create-issue"},{"title":"Retrieve issue","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/issues/{issueId}","href":"/api-reference/issues/retrieve-issue"},{"title":"Update issue","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/issues/{issueId}","href":"/api-reference/issues/update-issue"}]},{"group":"Clients","expanded":false,"pages":[{"title":"List clients","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/clients","href":"/api-reference/clients/list-clients"},{"title":"Create client","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/clients","href":"/api-reference/clients/create-client"},{"title":"Retrieve client","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/clients/{clientId}","href":"/api-reference/clients/retrieve-client"}]},{"group":"Agents","expanded":false,"pages":[{"title":"List agents","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/agents","href":"/api-reference/agents/list-agents"},{"title":"Retrieve agent","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/agents/{agentId}","href":"/api-reference/agents/retrieve-agent"}]},{"group":"Sources","expanded":false,"pages":[{"title":"List sources","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sources","href":"/api-reference/sources/list-sources"},{"title":"Create source","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/sources","href":"/api-reference/sources/create-source"},{"title":"Retrieve source","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/sources/{sourceId}","href":"/api-reference/sources/retrieve-source"},{"title":"Update source","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/sources/{sourceId}","href":"/api-reference/sources/update-source"},{"title":"Delete source","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/sources/{sourceId}","href":"/api-reference/sources/delete-source"},{"title":"Rescan source","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/sources/{sourceId}/rescan","href":"/api-reference/sources/rescan-source"}]},{"group":"Definitions","expanded":false,"pages":[{"title":"List tags","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/tags","href":"/api-reference/definitions/list-tags"},{"title":"List statuses","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/statuses","href":"/api-reference/definitions/list-statuses"},{"title":"List priorities","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/priorities","href":"/api-reference/definitions/list-priorities"},{"title":"List custom fields","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/custom-fields","href":"/api-reference/definitions/list-custom-fields"}]},{"group":"Usage","expanded":false,"pages":[{"title":"Retrieve usage","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/usage","href":"/api-reference/usage/retrieve-usage"},{"title":"List API key usage","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/usage/api-keys","href":"/api-reference/usage/list-api-key-usage"}]},{"group":"Analytics","expanded":false,"pages":[{"title":"Retrieve analytics","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/analytics","href":"/api-reference/analytics/retrieve-analytics"}]}]}]}]},{"tab":"Integrations","icon":"plug-zap","pages":[{"title":"Integrations","href":"/integrations-catalog/overview"}]}]},"title":"Widget Routes - Woes","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":[],"chunks":[]}