Public widget access uses a workspace or agent public key plus route-level controls. It does not grant general table access.The widget can only perform customer-safe actions such as:
Server-side service-role access is used for controlled backend operations. Routes must still filter by workspace id and verify parent/child tenant relationships.
Never use a public key, route parameter, or client-provided id by itself as proof that a record belongs to the current workspace.
Last modified on June 29, 2026
Was this page helpful?
{"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":"security/tenant-isolation","slug":"/security/tenant-isolation","pageMetadata":{"title":"Tenant Isolation","description":"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.","href":"/security/tenant-isolation"},"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: \"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\"\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={li:`li`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Heading,Warning}=_components;if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`1`,id:`tenant-isolation`,children:`Tenant Isolation`}),`\n`,_jsx(_components.p,{children:`Every workspace-owned record and query must preserve tenant isolation.`}),`\n`,_jsx(Heading,{level:`2`,id:`workspace-scoped-records`,children:`Workspace-Scoped Records`}),`\n`,_jsx(_components.p,{children:`Workspace-scoped records include:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Conversations and messages.`}),`\n`,_jsx(_components.li,{children:`Issues and notes.`}),`\n`,_jsx(_components.li,{children:`API sources, documents, endpoints, and chunks.`}),`\n`,_jsx(_components.li,{children:`Agents and source attachments.`}),`\n`,_jsx(_components.li,{children:`Settings and permissions.`}),`\n`,_jsx(_components.li,{children:`Tags, macros, statuses, and custom fields.`}),`\n`,_jsx(_components.li,{children:`Survey responses.`}),`\n`,_jsx(_components.li,{children:`API keys.`}),`\n`,_jsx(_components.li,{children:`Integration connections.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`public-widget-boundary`,children:`Public Widget Boundary`}),`\n`,_jsx(_components.p,{children:`Public widget access uses a workspace or agent public key plus route-level controls. It does not grant general table access.`}),`\n`,_jsx(_components.p,{children:`The widget can only perform customer-safe actions such as:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Start or continue the correct conversation.`}),`\n`,_jsx(_components.li,{children:`Send customer messages.`}),`\n`,_jsx(_components.li,{children:`Read customer-safe message history.`}),`\n`,_jsx(_components.li,{children:`Submit widget events.`}),`\n`,_jsx(_components.li,{children:`Submit survey responses for known surveys.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`operator-routes`,children:`Operator Routes`}),`\n`,_jsx(_components.p,{children:`Authenticated workspace routes resolve the requesting account and workspace before reading or mutating data.`}),`\n`,_jsx(Heading,{level:`2`,id:`service-role-work`,children:`Service-Role Work`}),`\n`,_jsx(_components.p,{children:`Server-side service-role access is used for controlled backend operations. Routes must still filter by workspace id and verify parent/child tenant relationships.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Never use a public key, route parameter, or client-provided id by itself as proof that a record belongs to the current workspace.`})})]})}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":"Tenant Isolation","description":"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.","href":"/security/tenant-isolation"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Tenant Isolation","slug":"tenant-isolation","depth":1,"children":[]},{"title":"Workspace-Scoped Records","slug":"workspace-scoped-records","depth":2,"children":[]},{"title":"Public Widget Boundary","slug":"public-widget-boundary","depth":2,"children":[]},{"title":"Operator Routes","slug":"operator-routes","depth":2,"children":[]},{"title":"Service-Role Work","slug":"service-role-work","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/woes/03c522a7be79c968/woes-widget.js"],"subdomain":"woes","siteName":"Woes","title":"Tenant Isolation - Woes","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-29T00:42:52.135Z","gitLastModified":"2026-06-29T00:33:15.000Z","originalFileLocation":"security/tenant-isolation.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=\"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\">\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=\"Tenant Isolation - Woes\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Woes Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.woes.dev/security/tenant-isolation\">\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=Security\u0026amp;title=Tenant+Isolation\u0026amp;description=How+Woes+keeps+workspace+records%2C+routes%2C+public+widget+access%2C+and+service-role+work+scoped+to+the+correct+tenant.\u0026amp;theme=594accbaf32d79441de8f280\u0026amp;signature=c27d52382f5ce3b4d155fee13b324e3314cc4b1b7972370e41285038ee28703b\">\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=\"Tenant Isolation - Woes\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://woes.mintlify.app/_mintlify/api/og/v2?division=Security\u0026amp;title=Tenant+Isolation\u0026amp;description=How+Woes+keeps+workspace+records%2C+routes%2C+public+widget+access%2C+and+service-role+work+scoped+to+the+correct+tenant.\u0026amp;theme=594accbaf32d79441de8f280\u0026amp;signature=c27d52382f5ce3b4d155fee13b324e3314cc4b1b7972370e41285038ee28703b\">\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/security/tenant-isolation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/security/tenant-isolation.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/security/tenant-isolation#webpage\",\"url\":\"https://docs.woes.dev/security/tenant-isolation\",\"name\":\"Tenant Isolation\",\"description\":\"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\",\"dateModified\":\"2026-06-29T00:33:15.000Z\",\"isPartOf\":{\"@id\":\"https://docs.woes.dev#website\"},\"breadcrumb\":{\"@id\":\"https://docs.woes.dev/security/tenant-isolation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.woes.dev/security/tenant-isolation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Woes documentation\",\"item\":\"https://docs.woes.dev/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Security\",\"item\":\"https://docs.woes.dev/security/widget-identity\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tenant Isolation\",\"item\":\"https://docs.woes.dev/security/tenant-isolation\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.woes.dev/security/tenant-isolation#article\",\"headline\":\"Tenant Isolation\",\"name\":\"Tenant Isolation\",\"description\":\"How Woes keeps workspace records, routes, public widget access, and service-role work scoped to the correct tenant.\",\"url\":\"https://docs.woes.dev/security/tenant-isolation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.woes.dev/security/tenant-isolation#webpage\"},\"dateModified\":\"2026-06-29T00:33:15.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","groups":[{"group":"Woes documentation","pages":[{"group":"Getting started","expanded":false,"pages":[{"title":"Woes Documentation","href":""},{"title":"Quickstart Overview","href":"/quickstart/overview"},{"title":"Add API Context","href":"/quickstart/add-context"},{"title":"Invite Your Team","href":"/quickstart/invite-team"}]},{"group":"Support workflows","expanded":false,"pages":[{"title":"Omnichannel Support","href":"/support-workflows/omnichannel-support"},{"title":"Inbox","href":"/platform/inbox"},{"title":"Issues","sidebarTitle":"Issues overview","href":"/platform/issues"},{"group":"Automations","icon":"workflow","pages":[{"title":"Automations","sidebarTitle":"Overview","href":"/platform/automations"},{"group":"Nodes","icon":"git-branch","pages":[{"title":"Automation Nodes","sidebarTitle":"Overview","href":"/platform/automations/nodes/overview"},{"title":"When Triggers","sidebarTitle":"When triggers","href":"/platform/automations/nodes/when-triggers"},{"title":"Logic and Delay Nodes","sidebarTitle":"Logic and delay","href":"/platform/automations/nodes/logic-and-delay"},{"title":"Then Actions","sidebarTitle":"Then actions","href":"/platform/automations/nodes/then-actions"}]}]},{"title":"Team Chat","href":"/platform/team-chat"},{"title":"Assignment","href":"/settings/assignment"},{"title":"Surveys","href":"/settings/surveys"},{"title":"Email","href":"/channels/email"},{"title":"Discord","href":"/channels/discord"},{"title":"Slack","href":"/channels/slack"}]},{"group":"Platform","expanded":false,"pages":[{"title":"Platform Overview","href":"/platform/overview"},{"title":"Settings Overview","href":"/settings/overview"},{"title":"Billing","href":"/settings/billing"},{"title":"Bring Your Own AI","href":"/settings/bring-your-own-ai"},{"title":"Keys","href":"/settings/keys"},{"title":"Users and Permissions","href":"/settings/users-permissions"},{"title":"Data, Tags, Statuses, and Macros","href":"/settings/data-macros"},{"title":"Notification Preferences","href":"/settings/notifications"},{"title":"Keyboard Shortcuts and Command Search","sidebarTitle":"Keyboard and search","href":"/reference/keyboard-shortcuts"},{"title":"Troubleshooting","href":"/reference/troubleshooting"}]},{"group":"AI agents","expanded":false,"pages":[{"title":"Agents","sidebarTitle":"Agents overview","href":"/agents/overview"},{"title":"Create and Manage Agents","href":"/agents/create-agents"},{"title":"Context Learning","href":"/agents/context-learning"},{"title":"Agent Routing and Widget Keys","href":"/agents/routing-widget"},{"title":"Agent Quality Loop","href":"/agents/quality-loop"}]},{"group":"Knowledge base","expanded":false,"pages":[{"title":"Knowledge Base Overview","href":"/knowledge-base/overview"},{"title":"Sources","href":"/context/sources"},{"title":"Auth and API Testing","href":"/context/auth-testing"},{"title":"GitHub Context","href":"/context/github"},{"title":"Knowledge Base Gaps","href":"/knowledge-base/gaps"}]},{"group":"Client Portal","expanded":false,"pages":[{"title":"Client Portal","href":"/platform/client-portal"},{"title":"Client Portal Access Control","href":"/customer-portal/access-control"}]},{"group":"Chat widget","expanded":false,"pages":[{"title":"Chat Widget Overview","href":"/chat-widget/overview"},{"title":"Live Chat","href":"/channels/live-chat"},{"title":"Install the Widget","href":"/quickstart/install-widget"},{"title":"Install the Widget in Mintlify","href":"/quickstart/install-widget-mintlify"},{"title":"iOS Swift SDK","href":"/chat-widget/ios-sdk"},{"title":"Widget JavaScript API","href":"/chat-widget/javascript-api"},{"title":"Widget Identity Verification","href":"/chat-widget/identity-verification"}]},{"group":"Clients and account intelligence","expanded":false,"pages":[{"title":"Clients","sidebarTitle":"Clients overview","href":"/platform/clients"},{"title":"Account Intelligence","href":"/account-intelligence/overview"},{"title":"Customer Presence","href":"/account-intelligence/presence"}]},{"group":"Product intelligence","expanded":false,"pages":[{"title":"Product Intelligence","href":"/product-intelligence/overview"},{"title":"Feature Requests","href":"/product-intelligence/feature-requests"},{"title":"Closing the Loop","href":"/product-intelligence/closing-loop"}]},{"group":"Reporting \u0026 analytics","expanded":false,"pages":[{"title":"Analytics","href":"/platform/analytics"},{"title":"Usage and Capacity","href":"/reporting/usage-capacity"},{"title":"Survey Performance","href":"/reporting/surveys-performance"}]},{"group":"Updates","expanded":false,"pages":[{"title":"Updates Overview","href":"/broadcasts/overview"},{"title":"Create an Update","href":"/broadcasts/create-broadcast"},{"title":"Update Analytics","href":"/broadcasts/analytics"}]},{"group":"Integrations","expanded":false,"pages":[{"title":"Integrations","href":"/integrations/overview"},{"title":"Email Integration","href":"/integrations/email"},{"title":"Discord Integration","href":"/integrations/discord"},{"title":"GitHub Context","href":"/integrations/github-context"},{"title":"Mintlify Widget Install","href":"/integrations/mintlify-widget"}]},{"group":"Security","expanded":false,"pages":[{"title":"Widget Identity","href":"/security/widget-identity"},{"title":"Data Privacy","description":"Understand customer data, credentials, prompts, debug traces, and public surface boundaries in Woes.","href":"/security/data-privacy"},{"title":"Tenant Isolation","href":"/security/tenant-isolation"},{"title":"Security Logs","description":"Understand workspace-visible logs, usage history, redaction, and platform-admin audit boundaries.","href":"/security/security-logs"}]},{"group":"Developer","expanded":false,"pages":[{"title":"Developer Overview","href":"/developer/overview"},{"title":"Woes Terminal","sidebarTitle":"Terminal","icon":"square-terminal","href":"/developer/cli"},{"title":"REST API Guide","href":"/developer/rest-api"},{"title":"Glossary","href":"/reference/glossary"},{"title":"Route Boundaries","href":"/developer/route-boundaries"}]}]}]},{"tab":"API Reference","icon":"square-terminal","pages":[{"title":"API Reference","href":"/api-reference/overview"}]},{"tab":"Integrations","icon":"plug-zap","pages":[{"title":"Integrations","href":"/integrations-catalog/overview"}]}]},"title":"Tenant Isolation - Woes","buildId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","deploymentId":"dpl_HcHmUS6i3UwswnTHJUEdcTtwfdTQ","dynamics":[],"chunks":[]}