An end-user is whoever you’re running tasks on behalf of — your customer’s user ID, your chatbot’s session, whatever maps to ‘one person’ in your product.
An end-user is an opaque identifier you hand to stablebrowse to say “this request is happening on behalf of this person in my product.” We don’t validate it, don’t parse it, don’t own it — it’s just a string scoped to your business.
End-users are the unit of credential isolation and session scoping:
You upload Twitter cookies under end_users("alice"). Subsequent tasks with endUserId: "alice" use those cookies. Tasks with endUserId: "bob" don’t see them.
Sessions (multi-turn conversations) belong to a specific end-user. Alice’s sports chat won’t leak into her food chat, and neither will leak across end-users.
Observability is partitioned per end-user, so you can pull the full task history of any user in your product.
You do. It’s whatever identifier you already have for that person — a database UUID, an email hash, a chat-session ID, "alice". We only care that it’s unique within your business and stable (so credentials and sessions keep working).
Don’t use PII if you don’t have to. "user_7f2a..." from your database is fine. Raw emails or phone numbers in the identifier means they land in our logs and observability data — not a security issue (it’s your data), but cleaner to opaque-ify.
End-user IDs only collide with themselves — same business, same string. Two different businesses can both have "alice" with totally separate credentials, sessions, and tasks. We key every end-user record on (businessId, endUserId).
If your B2C product is just you (the Cognito user) using stablebrowse for yourself, the dashboard auto-wires tasks to the sentinel endUserId = "self". You can hit the API the same way — either explicitly pass "self" or omit endUserId on Cognito-JWT calls and we fill it in.
Credentials are KMS-encrypted at rest. They never appear in any response — GET credentials returns only which platforms are configured, not the values.
Reuse for the same person across calls. Sessions, credentials, and task history all hinge on a stable endUserId.
New ID when a person is logically different — separate Cognito sub, different browser session, different tenant in your product.
Don’t rotate IDs to “start fresh.” Just use credentials.delete() and send an empty sessionId to begin a new conversation. The end-user row stays; their state is reset.
Your end-users don’t log into the stablebrowse dashboard. They never interact with us directly — everything flows through your API key. That’s the B2B2C model: you own the relationship with your users, and we process their workload on your behalf.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"StableBrowse","description":"The StableBrowse B2B API — agentic browser automation for your product.","colors":{"primary":"#18E299","light":"#5EF0BE","dark":"#0C8C5E"},"logo":{"light":"https://mintcdn.com/stablebrowse/dm_t9b_WEN4xZA7x/logo/stablebrowse.png?fit=max\u0026auto=format\u0026n=dm_t9b_WEN4xZA7x\u0026q=85\u0026s=59764c948f4fb08d27fd2a84b515059c","dark":"https://mintcdn.com/stablebrowse/dm_t9b_WEN4xZA7x/logo/stablebrowse.png?fit=max\u0026auto=format\u0026n=dm_t9b_WEN4xZA7x\u0026q=85\u0026s=59764c948f4fb08d27fd2a84b515059c"},"favicon":"https://mintcdn.com/stablebrowse/dm_t9b_WEN4xZA7x/favicon.png?fit=max\u0026auto=format\u0026n=dm_t9b_WEN4xZA7x\u0026q=85\u0026s=7544c923f777a6cb98c8407f7131e72c","navbar":{"links":[{"href":"mailto:team@stablebrowse.ai","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://main.d30scu9fjpgpae.amplifyapp.com"}},"footer":{"socials":{"github":"https://github.com/StableBrowse"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/StableBrowse"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"stablebrowse","hasAudioNarration":false,"actualSubdomain":"stablebrowse","customDomains":["docs.stablebrowse.com"],"gitSource":{"type":"github","owner":"jaysmehta208","repo":"docs","deployBranch":"main","isPrivate":false,"contentDirectory":"","mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a2386d493f2897136966e0e","collectionId":"c076a81c-deab-4288-b73d-1a62a5401a44","schemaVersion":"v2"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6a2386d493f2897136966e0e:success","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Guides","count":17},{"language":"default","tag":"API reference","count":10},{"language":"default","tag":"Concepts","count":6},{"language":"default","tag":"Browser MCP","count":5},{"language":"default","tag":"End users","count":3},{"language":"default","tag":"Tasks","count":3},{"language":"default","tag":"Getting started","count":3},{"language":"default","tag":"Design extraction","count":2},{"language":"default","tag":"SDKs","count":2},{"language":"default","tag":"Overview","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"concepts/end-users","slug":"/concepts/end-users","pageMetadata":{"title":"End users","description":"An end-user is whoever you're running tasks on behalf of — your customer's user ID, your chatbot's session, whatever maps to 'one person' in your product.","href":"/concepts/end-users"},"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: \"An end-user is whoever you’re running tasks on behalf of — your customer’s user ID, your chatbot’s session, whatever maps to ‘one person’ in your product.\"\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={code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`the-idea`,children:`The idea`}),`\n`,_jsxs(_components.p,{children:[`An `,_jsx(_components.strong,{children:`end-user`}),` is an opaque identifier you hand to stablebrowse to say `,_jsx(_components.em,{children:`“this request is happening on behalf of this person in my product.”`}),` We don’t validate it, don’t parse it, don’t own it — it’s just a string scoped to your business.`]}),`\n`,_jsx(Heading,{level:`2`,id:`why-it-matters`,children:`Why it matters`}),`\n`,_jsxs(_components.p,{children:[`End-users are the unit of `,_jsx(_components.strong,{children:`credential isolation`}),` and `,_jsx(_components.strong,{children:`session scoping`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You upload Twitter cookies under `,_jsx(_components.code,{children:`end_users(\"alice\")`}),`. Subsequent tasks with `,_jsx(_components.code,{children:`endUserId: \"alice\"`}),` use those cookies. Tasks with `,_jsx(_components.code,{children:`endUserId: \"bob\"`}),` don’t see them.`]}),`\n`,_jsx(_components.li,{children:`Sessions (multi-turn conversations) belong to a specific end-user. Alice’s sports chat won’t leak into her food chat, and neither will leak across end-users.`}),`\n`,_jsx(_components.li,{children:`Observability is partitioned per end-user, so you can pull the full task history of any user in your product.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`who-picks-the-id`,children:`Who picks the ID?`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`You do.`}),` It’s whatever identifier you already have for that person — a database UUID, an email hash, a chat-session ID, `,_jsx(_components.code,{children:`\"alice\"`}),`. We only care that it’s unique `,_jsx(_components.em,{children:`within your business`}),` and stable (so credentials and sessions keep working).`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Don’t use PII if you don’t have to. `,_jsx(_components.code,{children:`\"user_7f2a...\"`}),` from your database is fine. Raw emails or phone numbers in the identifier means they land in our logs and observability data — not a security issue (it’s your data), but cleaner to opaque-ify.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`collision-rules`,children:`Collision rules`}),`\n`,_jsxs(_components.p,{children:[`End-user IDs only collide with themselves — same business, same string. Two different businesses can both have `,_jsx(_components.code,{children:`\"alice\"`}),` with totally separate credentials, sessions, and tasks. We key every end-user record on `,_jsx(_components.code,{children:`(businessId, endUserId)`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`sentinel-“self”`,children:`Sentinel: “self”`}),`\n`,_jsxs(_components.p,{children:[`If your B2C product is just you (the Cognito user) using stablebrowse for yourself, the dashboard auto-wires tasks to the sentinel `,_jsx(_components.code,{children:`endUserId = \"self\"`}),`. You can hit the API the same way — either explicitly pass `,_jsx(_components.code,{children:`\"self\"`}),` or omit `,_jsx(_components.code,{children:`endUserId`}),` on Cognito-JWT calls and we fill it in.`]}),`\n`,_jsx(Heading,{level:`2`,id:`credentials-lifecycle`,children:`Credentials lifecycle`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`Python`,numberOfLines:`17`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`17`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`client.end_users(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).credentials.set(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` twitter_auth_token`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` twitter_ct0`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` tiktok_session_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Check what's configured (never returns the secrets themselves)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`status `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` client.end_users(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).credentials.get()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# → {platforms: {twitter: True, tiktok: True, ...}}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Clear specific platforms`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`client.end_users(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).credentials.delete(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` fields`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"twitter_auth_token\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"twitter_ct0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Or wipe everything for that end-user`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`client.end_users(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).credentials.delete()`})]}),`\n`]})})}),_jsx(CodeBlock,{filename:`TypeScript`,numberOfLines:`13`,language:`typescript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`typescript`,children:_jsxs(_components.code,{language:`typescript`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`endUsers`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credentials`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`set`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` twitterAuthToken:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` twitterCt0:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` tiktokSessionId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` status`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`endUsers`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credentials`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`get`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`endUsers`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credentials`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`delete`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"twitterAuthToken\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"twitterCt0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` client`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`endUsers`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"alice\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`credentials`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`delete`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`();`})]}),`\n`]})})})]}),`\n`,_jsxs(_components.p,{children:[`Credentials are KMS-encrypted at rest. They never appear in any response — `,_jsx(_components.code,{children:`GET credentials`}),` returns only which platforms are configured, not the values.`]}),`\n`,_jsx(Heading,{level:`2`,id:`when-to-create-vs-reuse-an-end-user`,children:`When to create vs. reuse an end-user`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reuse`}),` for the same person across calls. Sessions, credentials, and task history all hinge on a stable `,_jsx(_components.code,{children:`endUserId`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`New ID`}),` when a person is logically different — separate Cognito sub, different browser session, different tenant in your product.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Don’t rotate IDs`}),` to “start fresh.” Just use `,_jsx(_components.code,{children:`credentials.delete()`}),` and send an empty sessionId to begin a new conversation. The end-user row stays; their state is reset.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`end-users-are-not-users-of-the-dashboard`,children:`End-users are not users of the dashboard`}),`\n`,_jsx(_components.p,{children:`Your end-users don’t log into the stablebrowse dashboard. They never interact with us directly — everything flows through your API key. That’s the B2B2C model: you own the relationship with your users, and we process their workload on your behalf.`})]})}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":{"config":{},"pageMetadata":{"title":"End users","description":"An end-user is whoever you're running tasks on behalf of — your customer's user ID, your chatbot's session, whatever maps to 'one person' in your product.","href":"/concepts/end-users"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"The idea","slug":"the-idea","depth":2,"children":[]},{"title":"Why it matters","slug":"why-it-matters","depth":2,"children":[]},{"title":"Who picks the ID?","slug":"who-picks-the-id","depth":2,"children":[]},{"title":"Collision rules","slug":"collision-rules","depth":2,"children":[]},{"title":"Sentinel: “self”","slug":"sentinel-“self”","depth":2,"children":[]},{"title":"Credentials lifecycle","slug":"credentials-lifecycle","depth":2,"children":[]},{"title":"When to create vs. reuse an end-user","slug":"when-to-create-vs-reuse-an-end-user","depth":2,"children":[]},{"title":"End-users are not users of the dashboard","slug":"end-users-are-not-users-of-the-dashboard","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"stablebrowse","siteName":"StableBrowse","title":"End users - StableBrowse","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-04-21T08:32:36.026Z","originalFileLocation":"concepts/end-users.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=\"An end-user is whoever you\u0026#x27;re running tasks on behalf of — your customer\u0026#x27;s user ID, your chatbot\u0026#x27;s session, whatever maps to \u0026#x27;one person\u0026#x27; in your product.\">\u003cmeta data-mint-head name=\"application-name\" content=\"StableBrowse\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_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/stablebrowse/sqgTnMdKhtqhotgS/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"End users - StableBrowse\">\u003cmeta data-mint-head property=\"og:description\" content=\"An end-user is whoever you\u0026#x27;re running tasks on behalf of — your customer\u0026#x27;s user ID, your chatbot\u0026#x27;s session, whatever maps to \u0026#x27;one person\u0026#x27; in your product.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"StableBrowse\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.stablebrowse.com/concepts/end-users\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://stablebrowse.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=End+users\u0026amp;description=An+end-user+is+whoever+you%27re+running+tasks+on+behalf+of+%E2%80%94+your+customer%27s+user+ID%2C+your+chatbot%27s+session%2C+whatever+maps+to+%27one+person%27+in+your+product.\u0026amp;theme=3f3747067892e053a8558593\u0026amp;signature=44cb3f8faadc0bd050e1b4e0bd70411ed8ff34f61a6ae071044cf9a89f3d3426\">\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=\"End users - StableBrowse\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"An end-user is whoever you\u0026#x27;re running tasks on behalf of — your customer\u0026#x27;s user ID, your chatbot\u0026#x27;s session, whatever maps to \u0026#x27;one person\u0026#x27; in your product.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://stablebrowse.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=End+users\u0026amp;description=An+end-user+is+whoever+you%27re+running+tasks+on+behalf+of+%E2%80%94+your+customer%27s+user+ID%2C+your+chatbot%27s+session%2C+whatever+maps+to+%27one+person%27+in+your+product.\u0026amp;theme=3f3747067892e053a8558593\u0026amp;signature=44cb3f8faadc0bd050e1b4e0bd70411ed8ff34f61a6ae071044cf9a89f3d3426\">\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/stablebrowse/sqgTnMdKhtqhotgS/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"StableBrowse\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#18E299\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.stablebrowse.com/concepts/end-users\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/end-users.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.stablebrowse.com/#organization\",\"name\":\"StableBrowse\",\"url\":\"https://docs.stablebrowse.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/stablebrowse/dm_t9b_WEN4xZA7x/logo/stablebrowse.png?fit=max\u0026auto=format\u0026n=dm_t9b_WEN4xZA7x\u0026q=85\u0026s=59764c948f4fb08d27fd2a84b515059c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.stablebrowse.com#website\",\"name\":\"StableBrowse\",\"url\":\"https://docs.stablebrowse.com\",\"publisher\":{\"@id\":\"https://docs.stablebrowse.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.stablebrowse.com/concepts/end-users#webpage\",\"url\":\"https://docs.stablebrowse.com/concepts/end-users\",\"name\":\"End users\",\"description\":\"An end-user is whoever you're running tasks on behalf of — your customer's user ID, your chatbot's session, whatever maps to 'one person' in your product.\",\"dateModified\":\"2026-04-21T08:32:36.026Z\",\"isPartOf\":{\"@id\":\"https://docs.stablebrowse.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.stablebrowse.com/concepts/end-users#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.stablebrowse.com/concepts/end-users#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.stablebrowse.com/concepts/businesses\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"End users\",\"item\":\"https://docs.stablebrowse.com/concepts/end-users\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.stablebrowse.com/concepts/end-users#article\",\"headline\":\"End users\",\"name\":\"End users\",\"description\":\"An end-user is whoever you're running tasks on behalf of — your customer's user ID, your chatbot's session, whatever maps to 'one person' in your product.\",\"url\":\"https://docs.stablebrowse.com/concepts/end-users\",\"mainEntityOfPage\":{\"@id\":\"https://docs.stablebrowse.com/concepts/end-users#webpage\"},\"dateModified\":\"2026-04-21T08:32:36.026Z\",\"publisher\":{\"@id\":\"https://docs.stablebrowse.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.stablebrowse.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"StableBrowse\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"StableBrowse","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/StableBrowse"}]},"tabs":[{"tab":"Guides","groups":[{"group":"Getting started","pages":[{"title":"Introduction","href":"/introduction"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"}]},{"group":"Concepts","pages":[{"title":"Businesses","description":"A business is the paying-customer account — that's you.","href":"/concepts/businesses"},{"title":"End users","href":"/concepts/end-users"},{"title":"Sessions","description":"A session groups related tasks into a conversation so follow-up questions work naturally.","href":"/concepts/sessions"},{"title":"Tasks","href":"/concepts/tasks"},{"title":"Platforms","href":"/concepts/platforms"},{"title":"Design extraction","href":"/concepts/design-extraction"}]},{"group":"SDKs","pages":[{"title":"Python SDK","href":"/sdks/python"},{"title":"TypeScript SDK","href":"/sdks/typescript"}]},{"group":"Browser MCP","pages":[{"title":"Browser MCP","href":"/browser-mcp/overview"},{"title":"Browser MCP quickstart","href":"/browser-mcp/quickstart"},{"title":"Browser MCP architecture","href":"/browser-mcp/architecture"},{"title":"Browser MCP tools","href":"/browser-mcp/tools"},{"title":"Agent guidance","href":"/browser-mcp/agent-guidance"}]},{"group":"Reference","pages":[{"title":"Errors","href":"/errors"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"End users - StableBrowse","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}