Start an intake session and get the first question
Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient’s behalf. WHICH questionnaire is served follows your brand’s configured therapies: a brand with exactly one enabled therapy always serves that therapy’s questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy’s questionnaire is briefly still loading, the session opens on the platform’s shared questionnaire rather than failing. If your brand’s therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy’s questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal’s own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.
GET
/
v1
/
instrument
/
resolve
Start an intake session and get the first question
The patient's enrollment id (jny_...) — the resume channel. Send it on a return visit and the questionnaire resumes that patient's session with everything already answered applied; omit it and a new enrollment id is minted. A malformed value is ignored and treated as absent, never trusted.
An optional id you send to tie this request to your own logs. Send one and it is echoed back unchanged; omit it and one is assigned for you. Either way the id is returned in the X-Correlation-Id response header on every response, including errors, so you can match a response to the request that produced it.
Your brand id (brd_...). It must be one of the brands your API key's account owns; with a publishable key it must be the one brand the key was issued for. A missing or malformed value is refused with 400, and an unknown or foreign brand with 404.
an existing enrollment id (returning patient) as a query parameter — a compatibility channel. On the hosted platform this query parameter is not read: the enrollment id rides the X-Journey-Id request header, and that header is the resume mechanism. Absent both, a new enrollment id is minted.
serve ONE tier of the instrument as an independent phase. qualification plays the pre-pay funnel-top tier and completes at the qualification terminal (the journey then hands to checkout); clinical plays the post-pay tier (re-resolved by the same enrollment id after checkout) and completes at the usual intake terminal. OMITTED ⇒ the continuous single-pass flow (unchanged): the whole instrument, one terminal. Requires a tier-aware bundle; an unknown value is rejected 400.
preselect a catalog offering by STABLE ref (never a free-text product name). Resolvable only against the compiled bundle's declared offering refs; an unresolvable ref FAILS CLOSED to the generic flow. Effect is presentation-only narrowing of display-node offering_refs — EXCEPT for a brand configured with MORE THAN ONE enabled therapy, where this parameter is additionally REQUIRED and is a DECLARED RESOLUTION INPUT: it selects which of that brand's enabled therapies the session's questionnaire comes from. Omitting it, naming a ref that belongs to none of the brand's enabled therapies, or naming one that belongs to more than one, is REFUSED (422) — never guessed. For a brand with a single enabled therapy (and for a brand with none) the parameter does not change which SHARED questionnaire is served. SECOND DECLARED EFFECT — YOUR OWN QUALIFICATION QUESTIONS. On an entry that carries no journey (the direct-buy intake the site kit uses, where this endpoint is the op that mints the journey), this parameter ALSO selects WHICH of your brand's own qualification questions are composed onto the served plan, funnel-top: the ones you attached to the offering you name here. This applies only when your brand has declared its enabled therapies and the session resolved one of them; a brand that has declared none is served exactly as before. When the session's journey already recorded an offering, THAT offering wins and this parameter is not consulted for question selection. Naming an offering the platform's committed catalog does not bind, naming one you attached no questions to, or naming a malformed ref all FAIL CLOSED to the shared questionnaire with no error — the parameter can never conjure questions you did not author, and can never reach another brand's questions. THE TREATMENT-AGREEMENT RULE, and the one case that is REFUSED rather than ignored: the offering you name must belong to the SAME treatment the session resolved. Naming a real offering of a DIFFERENT treatment — even one your own brand sells — is refused with the 422 config-gap, not served: a patient must never be asked one treatment's questions while buying another, and answering them silently would be worse than refusing. The refusal is oracle-free: it is the same single answer every structural cause gives, and it names no offering, treatment or brand. An offering the platform cannot bind at all is NOT this case — it simply selects nothing and the shared questionnaire serves as before, so a stale or mistyped link degrades gently while a genuinely wrong-treatment link is caught.
stage a contact-email prefill. Lands unverified: nothing is written until the patient acts at the confirm step (which ALWAYS renders — prefill is never silent acceptance); a confirm-as-is records method=patient_reported, never validated/patient_confirmed.
an opaque promo token, passed through unchanged to the completion hand-off. It is not interpreted here; validation, eligibility, and stacking are applied downstream.
post-completion return URL. Honored ONLY if it matches the brand config's redirect_allowlist (absolute https, exact origin + path-segment prefix); anything else is refused — open redirect barred, fail closed. Surfaces on the completion handoff.
per-client test-mode flag; passed through unchanged.
Available options:
true,
false,
1,
0
Response
the minted/loaded session + the first node (or complete)
The result of a resolve, next, or abandon call — the session identity, the current question (or null when finished), the status, any flags (e.g. ship_state_mismatch), and any validation issues. On completion it may carry the entry-link hand-off.
active (a node is presented), complete (server-authoritative completion), abandoned (patient drop-off), or blocked — a terminal, server-authoritative refusal to proceed (a required consent was declined or could not be affirmed). On blocked, node is null and blocked carries the honest stop-screen outcome.
The honest stop-screen outcome. Present only when status is blocked. Carries the machine-readable reason, the node at which the block occurred, the consent scopes that were not granted (codes, never patient data), and a support-routing hint. The stop-screen copy is a presentation concern (the intake kit renders it); no patient data ever rides here. No order lock ever forms without a positive affirmation where one is required.
Present ONLY on the response to the call whose answer completed the questionnaire, and only when that questionnaire was started by your server with your secret key and no enrollment id (a fresh start, not a resume). It is a short-lived credential (about 10 minutes) that proves this browser's patient walked this enrollment. Never put it in a URL, never send it to browser JavaScript, and never log it. Hand the patient to checkout with a top-level form POST to https://member.<your brand domain>/api/checkout/door, with this value in the capability field of the request body and your offering_ref beside it. The form must be submitted from a page on one of your brand's registered browser origins (the browser's Origin header must match one exactly); any other origin is refused. If it has expired, the patient restarts the questionnaire; it is never reissued from the enrollment id. A repeated call on an already-complete session does not carry it again.
Post-completion hand-off carried when a session that began from an entry link completes. Present only when status is complete and the session carried a validated entry context. redirect holds a brand-allowlisted https URL; promo is an opaque pass-through token validated downstream; test is the per-client test-mode flag. Never carries patient data.
A node as presented to the client — PRESENTATION ONLY. The client never owns the sequence, controls, or option order (those come from the compiled bundle; a brand theme cannot alter them). Brand theme/copy, when applied, ride alongside as presentation overlay.
Server-computed progress metadata, present on every resolve/next step: computed from the live effective plan — never client-guessed. position_estimate is the honest fraction of the plan completed (0..1); display nodes participate in the fraction. Whether and how it renders (thin persistent bar, step ring, interstitial pacing, none) is brand-theme presentation.
Show child attributes
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Purple Label MD","description":"Public API reference for building a patient storefront on the platform. Generated from the platform's own API contracts, and matches the newest staging release.","colors":{"primary":"#6D28D9","light":"#A78BFA","dark":"#5B21B6"},"logo":{"light":"https://mintcdn.com/purplelabelmd/1P9p4n7lsNL4z3Jc/logo/light.svg?fit=max\u0026auto=format\u0026n=1P9p4n7lsNL4z3Jc\u0026q=85\u0026s=3c0569e3f76e49e04d232187908c2e2e","dark":"https://mintcdn.com/purplelabelmd/1P9p4n7lsNL4z3Jc/logo/dark.svg?fit=max\u0026auto=format\u0026n=1P9p4n7lsNL4z3Jc\u0026q=85\u0026s=c11f42bb461c28528be896c7c1a80efa"},"favicon":"https://mintcdn.com/purplelabelmd/MUdvgTlYoCGY54e8/favicon.svg?fit=max\u0026auto=format\u0026n=MUdvgTlYoCGY54e8\u0026q=85\u0026s=3bd633ab20ff170e0ebebec0406e6972","footer":{"socials":{}},"fonts":{"heading":{"family":"Geist"},"body":{"family":"Geist"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"purplelabelmd","hasAudioNarration":false,"actualSubdomain":"purplelabelmd","customDomains":["docs.purplelabelmd.com"],"gitSource":{"type":"github","owner":"purple-label-md","repo":"purple-doc","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af545312fc9183f3253a260","clientVersion":"0.0.4111","searchFilterCounts":[{"language":"default","tag":"API reference","count":50},{"language":"default","tag":"Guides","count":21},{"language":"default","tag":"Offering configuration","count":18},{"language":"default","tag":"Integrate","count":16},{"language":"default","tag":"Brand configuration","count":9},{"language":"default","tag":"Webhooks","count":7},{"language":"default","tag":"Payments","count":4},{"language":"default","tag":"Intake","count":3},{"language":"default","tag":"Onboarding","count":3},{"language":"default","tag":"Sessions \u0026 authentication","count":3}]},"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":"custom-rbac-roles","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":"rbac-expansion","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":"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":"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":"editor-metadata","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},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"@media (prefers-reduced-motion: no-preference){.plmd-logo{transform-origin:center;transition:transform 0.12s ease}.plmd-logo .plmd-mark path{transform-box:fill-box;transform-origin:center}.plmd-logo-link:active .plmd-logo{transform:scale(0.85)}.plmd-logo-link:hover .plmd-logo .plmd-mark path:last-child{animation:plmd-carrot-hop 0.55s ease}.plmd-logo-link:hover .plmd-logo .plmd-mark path:nth-child(-n+6){animation:plmd-carrot-twinkle 0.5s ease}.plmd-logo-link:hover .plmd-logo .plmd-mark path:nth-child(even){animation-delay:0.08s}}@keyframes plmd-carrot-hop{0%{transform:translateY(0) rotate(0)}30%{transform:translateY(-14%) rotate(-9deg)}55%{transform:translateY(0) rotate(6deg)}78%{transform:translateY(-5%) rotate(-2deg)}100%{transform:translateY(0) rotate(0)}}@keyframes plmd-carrot-twinkle{0%,100%{transform:scale(1);opacity:1}45%{transform:scale(1.6);opacity:0.7}}"}],"page":{"pagePath":"api-reference/intake/start-an-intake-session-and-get-the-first-question","slug":"/api-reference/intake/start-an-intake-session-and-get-the-first-question","pageMetadata":{"title":"Start an intake session and get the first question","description":"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as `journey_id`) that identifies the session on every later call; send it back in the `X-Journey-Id` request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient's behalf. WHICH questionnaire is served follows your brand's configured therapies: a brand with exactly one enabled therapy always serves that therapy's questionnaire; a brand with more than one must name an `offering` on the entry link so the therapy is unambiguous. If that therapy's questionnaire is briefly still loading, the session opens on the platform's shared questionnaire rather than failing. If your brand's therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy's questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal's own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/instrument/resolve","href":"/api-reference/intake/start-an-intake-session-and-get-the-first-question","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as \", _jsx(_components.code, {\n children: \"journey_id\"\n }), \") that identifies the session on every later call; send it back in the \", _jsx(_components.code, {\n children: \"X-Journey-Id\"\n }), \" request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient’s behalf. WHICH questionnaire is served follows your brand’s configured therapies: a brand with exactly one enabled therapy always serves that therapy’s questionnaire; a brand with more than one must name an \", _jsx(_components.code, {\n children: \"offering\"\n }), \" on the entry link so the therapy is unambiguous. If that therapy’s questionnaire is briefly still loading, the session opens on the platform’s shared questionnaire rather than failing. If your brand’s therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy’s questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal’s own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\"]\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}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Start an intake session and get the first question","description":"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as `journey_id`) that identifies the session on every later call; send it back in the `X-Journey-Id` request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient's behalf. WHICH questionnaire is served follows your brand's configured therapies: a brand with exactly one enabled therapy always serves that therapy's questionnaire; a brand with more than one must name an `offering` on the entry link so the therapy is unambiguous. If that therapy's questionnaire is briefly still loading, the session opens on the platform's shared questionnaire rather than failing. If your brand's therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy's questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal's own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/instrument/resolve","href":"/api-reference/intake/start-an-intake-session-and-get-the-first-question","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/purplelabelmd/3b4d4a495cd0c48d/brand.js"],"openApiReferenceData":{"operation":{"description":"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as `journey_id`) that identifies the session on every later call; send it back in the `X-Journey-Id` request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient's behalf. WHICH questionnaire is served follows your brand's configured therapies: a brand with exactly one enabled therapy always serves that therapy's questionnaire; a brand with more than one must name an `offering` on the entry link so the therapy is unambiguous. If that therapy's questionnaire is briefly still loading, the session opens on the platform's shared questionnaire rather than failing. If your brand's therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy's questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal's own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.","operationId":"resolveInstrument","parameters":["b6016e7d-261e-4b08-878b-f693dedc9e2d","8617f166-1c52-4c4d-ac04-59fb099f4173","2149dfbe-3085-4f8a-b3ab-0613bb29c8bf","94c94079-0924-48f4-9f88-919123d929e4","8419ae1e-fef1-415f-8643-404285f5e5f7","648e8ba4-84d3-4a06-b48c-a13cd2265e04","5ffc5769-4901-4f9e-a864-d7c16bcbeeaf","3cd96673-0df9-4b0f-9e89-3d1559b4fdf2","524e6161-8550-4f44-8ee8-d0cc0acf04b6","edcb3cc6-146c-4965-8c57-32f343cf68d0"],"responses":{"200":"e28d1b6d-d769-437e-8e1f-eeab886d15dd","400":"e4719e30-28d7-4120-873e-bad25f43c21e","402":"3b28558c-390f-4298-bd73-23dc765e277f","422":"dde32f44-fe12-44d6-b4b8-0d0642407ea4","429":"ed211ca8-87da-4559-a117-432fd4a95f2b","503":"ea7912c7-b227-4435-852f-72401fcbf3c2"},"security":["0682a086-b18f-4abd-ac84-45f00fdb724f"],"summary":"Start an intake session and get the first question","tags":["Intake"],"method":"get","type":"path","servers":["76f2c082-b62c-4aea-a087-a046f1378296"],"path":"/v1/instrument/resolve","baseUrlOptions":["https://api.staging.purplelabelmd.com"],"title":"Start an intake session and get the first question","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"b6016e7d-261e-4b08-878b-f693dedc9e2d":{"description":"The patient's enrollment id (`jny_...`) — the resume channel. Send it on a return visit and the questionnaire resumes that patient's session with everything already answered applied; omit it and a new enrollment id is minted. A malformed value is ignored and treated as absent, never trusted.","in":"header","name":"X-Journey-Id","required":false,"schema":{"pattern":"^jny_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":false,"description":"The patient's enrollment id (`jny_...`) — the resume channel. Send it on a return visit and the questionnaire resumes that patient's session with everything already answered applied; omit it and a new enrollment id is minted. A malformed value is ignored and treated as absent, never trusted.","uniqueKey":"","typeLabel":"string"}},"8617f166-1c52-4c4d-ac04-59fb099f4173":{"description":"an existing enrollment id (returning patient) as a query parameter — a compatibility channel. On the hosted platform this query parameter is not read: the enrollment id rides the `X-Journey-Id` request header, and that header is the resume mechanism. Absent both, a new enrollment id is minted.","in":"query","name":"journey_id","required":false,"schema":{"pattern":"^jny_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":false,"description":"an existing enrollment id (returning patient) as a query parameter — a compatibility channel. On the hosted platform this query parameter is not read: the enrollment id rides the `X-Journey-Id` request header, and that header is the resume mechanism. Absent both, a new enrollment id is minted.","uniqueKey":"","typeLabel":"string"}},"2149dfbe-3085-4f8a-b3ab-0613bb29c8bf":{"description":"serve ONE tier of the instrument as an independent phase. `qualification` plays the pre-pay funnel-top tier and completes at the qualification terminal (the journey then hands to checkout); `clinical` plays the post-pay tier (re-resolved by the same enrollment id after checkout) and completes at the usual intake terminal. OMITTED ⇒ the continuous single-pass flow (unchanged): the whole instrument, one terminal. Requires a tier-aware bundle; an unknown value is rejected 400.","in":"query","name":"phase","required":false,"schema":{"enum":["qualification","clinical"],"type":"string","isRequired":false,"description":"serve ONE tier of the instrument as an independent phase. `qualification` plays the pre-pay funnel-top tier and completes at the qualification terminal (the journey then hands to checkout); `clinical` plays the post-pay tier (re-resolved by the same enrollment id after checkout) and completes at the usual intake terminal. OMITTED ⇒ the continuous single-pass flow (unchanged): the whole instrument, one terminal. Requires a tier-aware bundle; an unknown value is rejected 400.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"94c94079-0924-48f4-9f88-919123d929e4":{"description":"preselect a catalog offering by STABLE ref (never a free-text product name). Resolvable only against the compiled bundle's declared offering refs; an unresolvable ref FAILS CLOSED to the generic flow. Effect is presentation-only narrowing of display-node offering_refs — EXCEPT for a brand configured with MORE THAN ONE enabled therapy, where this parameter is additionally REQUIRED and is a DECLARED RESOLUTION INPUT: it selects which of that brand's enabled therapies the session's questionnaire comes from. Omitting it, naming a ref that belongs to none of the brand's enabled therapies, or naming one that belongs to more than one, is REFUSED (422) — never guessed. For a brand with a single enabled therapy (and for a brand with none) the parameter does not change which SHARED questionnaire is served. SECOND DECLARED EFFECT — YOUR OWN QUALIFICATION QUESTIONS. On an entry that carries no journey (the direct-buy intake the site kit uses, where this endpoint is the op that mints the journey), this parameter ALSO selects WHICH of your brand's own qualification questions are composed onto the served plan, funnel-top: the ones you attached to the offering you name here. This applies only when your brand has declared its enabled therapies and the session resolved one of them; a brand that has declared none is served exactly as before. When the session's journey already recorded an offering, THAT offering wins and this parameter is not consulted for question selection. Naming an offering the platform's committed catalog does not bind, naming one you attached no questions to, or naming a malformed ref all FAIL CLOSED to the shared questionnaire with no error — the parameter can never conjure questions you did not author, and can never reach another brand's questions. THE TREATMENT-AGREEMENT RULE, and the one case that is REFUSED rather than ignored: the offering you name must belong to the SAME treatment the session resolved. Naming a real offering of a DIFFERENT treatment — even one your own brand sells — is refused with the 422 config-gap, not served: a patient must never be asked one treatment's questions while buying another, and answering them silently would be worse than refusing. The refusal is oracle-free: it is the same single answer every structural cause gives, and it names no offering, treatment or brand. An offering the platform cannot bind at all is NOT this case — it simply selects nothing and the shared questionnaire serves as before, so a stale or mistyped link degrades gently while a genuinely wrong-treatment link is caught.","in":"query","name":"offering","required":false,"schema":{"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.:-]*$","type":"string","isRequired":false,"description":"preselect a catalog offering by STABLE ref (never a free-text product name). Resolvable only against the compiled bundle's declared offering refs; an unresolvable ref FAILS CLOSED to the generic flow. Effect is presentation-only narrowing of display-node offering_refs — EXCEPT for a brand configured with MORE THAN ONE enabled therapy, where this parameter is additionally REQUIRED and is a DECLARED RESOLUTION INPUT: it selects which of that brand's enabled therapies the session's questionnaire comes from. Omitting it, naming a ref that belongs to none of the brand's enabled therapies, or naming one that belongs to more than one, is REFUSED (422) — never guessed. For a brand with a single enabled therapy (and for a brand with none) the parameter does not change which SHARED questionnaire is served. SECOND DECLARED EFFECT — YOUR OWN QUALIFICATION QUESTIONS. On an entry that carries no journey (the direct-buy intake the site kit uses, where this endpoint is the op that mints the journey), this parameter ALSO selects WHICH of your brand's own qualification questions are composed onto the served plan, funnel-top: the ones you attached to the offering you name here. This applies only when your brand has declared its enabled therapies and the session resolved one of them; a brand that has declared none is served exactly as before. When the session's journey already recorded an offering, THAT offering wins and this parameter is not consulted for question selection. Naming an offering the platform's committed catalog does not bind, naming one you attached no questions to, or naming a malformed ref all FAIL CLOSED to the shared questionnaire with no error — the parameter can never conjure questions you did not author, and can never reach another brand's questions. THE TREATMENT-AGREEMENT RULE, and the one case that is REFUSED rather than ignored: the offering you name must belong to the SAME treatment the session resolved. Naming a real offering of a DIFFERENT treatment — even one your own brand sells — is refused with the 422 config-gap, not served: a patient must never be asked one treatment's questions while buying another, and answering them silently would be worse than refusing. The refusal is oracle-free: it is the same single answer every structural cause gives, and it names no offering, treatment or brand. An offering the platform cannot bind at all is NOT this case — it simply selects nothing and the shared questionnaire serves as before, so a stale or mistyped link degrades gently while a genuinely wrong-treatment link is caught.","uniqueKey":"","typeLabel":"string"}},"8419ae1e-fef1-415f-8643-404285f5e5f7":{"description":"stage a contact-email prefill. Lands `unverified`: nothing is written until the patient acts at the confirm step (which ALWAYS renders — prefill is never silent acceptance); a confirm-as-is records method=patient_reported, never validated/patient_confirmed.","in":"query","name":"prefill_email","required":false,"schema":{"maxLength":254,"type":"string","isRequired":false,"description":"stage a contact-email prefill. Lands `unverified`: nothing is written until the patient acts at the confirm step (which ALWAYS renders — prefill is never silent acceptance); a confirm-as-is records method=patient_reported, never validated/patient_confirmed.","uniqueKey":"","typeLabel":"string"}},"648e8ba4-84d3-4a06-b48c-a13cd2265e04":{"description":"same contract as prefill_email, for the contact phone.","in":"query","name":"prefill_phone","required":false,"schema":{"maxLength":32,"type":"string","isRequired":false,"description":"same contract as prefill_email, for the contact phone.","uniqueKey":"","typeLabel":"string"}},"5ffc5769-4901-4f9e-a864-d7c16bcbeeaf":{"description":"an opaque promo token, passed through unchanged to the completion hand-off. It is not interpreted here; validation, eligibility, and stacking are applied downstream.","in":"query","name":"promo","required":false,"schema":{"maxLength":256,"type":"string","isRequired":false,"description":"an opaque promo token, passed through unchanged to the completion hand-off. It is not interpreted here; validation, eligibility, and stacking are applied downstream.","uniqueKey":"","typeLabel":"string"}},"3cd96673-0df9-4b0f-9e89-3d1559b4fdf2":{"description":"post-completion return URL. Honored ONLY if it matches the brand config's redirect_allowlist (absolute https, exact origin + path-segment prefix); anything else is refused — open redirect barred, fail closed. Surfaces on the completion handoff.","in":"query","name":"redirect","required":false,"schema":{"maxLength":2048,"type":"string","isRequired":false,"description":"post-completion return URL. Honored ONLY if it matches the brand config's redirect_allowlist (absolute https, exact origin + path-segment prefix); anything else is refused — open redirect barred, fail closed. Surfaces on the completion handoff.","uniqueKey":"","typeLabel":"string"}},"524e6161-8550-4f44-8ee8-d0cc0acf04b6":{"description":"per-client test-mode flag; passed through unchanged.","in":"query","name":"test","required":false,"schema":{"enum":["true","false","1","0"],"type":"string","isRequired":false,"description":"per-client test-mode flag; passed through unchanged.","uniqueKey":"","typeLabel":"enum\u003cstring>"}},"edcb3cc6-146c-4965-8c57-32f343cf68d0":{"description":"An optional id you send to tie this request to your own logs. Send one and it is echoed back unchanged; omit it and one is assigned for you. Either way the id is returned in the X-Correlation-Id response header on every response, including errors, so you can match a response to the request that produced it.","in":"header","name":"X-Correlation-Id","required":false,"schema":{"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9._:-]*$","type":"string","isRequired":false,"description":"An optional id you send to tie this request to your own logs. Send one and it is echoed back unchanged; omit it and one is assigned for you. Either way the id is returned in the X-Correlation-Id response header on every response, including errors, so you can match a response to the request that produced it.","uniqueKey":"","typeLabel":"string"}},"9eba69fc-ab68-4494-9758-86b5e9d2fd05":{"description":"Your brand id (`brd_...`). It must be one of the brands your API key's account owns; with a publishable key it must be the one brand the key was issued for. A missing or malformed value is refused with `400`, and an unknown or foreign brand with `404`.","in":"header","name":"X-Brand-Id","required":true,"schema":{"pattern":"^brd_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":true,"description":"Your brand id (`brd_...`). It must be one of the brands your API key's account owns; with a publishable key it must be the one brand the key was issued for. A missing or malformed value is refused with `400`, and an unknown or foreign brand with `404`.","uniqueKey":"","typeLabel":"string"}}},"responses":{"e28d1b6d-d769-437e-8e1f-eeab886d15dd":{"content":{"application/json":{"schema":{"description":"The result of a resolve, next, or abandon call — the session identity, the current question (or null when finished), the status, any flags (e.g. ship_state_mismatch), and any validation issues. On completion it may carry the entry-link hand-off.","properties":{"journey_id":{"pattern":"^jny_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":true,"uniqueKey":"journey_id","typeLabel":"string"},"session_id":{"type":"string","isRequired":true,"uniqueKey":"session_id","typeLabel":"string"},"status":{"description":"`active` (a node is presented), `complete` (server-authoritative completion), `abandoned` (patient drop-off), or `blocked` — a terminal, server-authoritative refusal to proceed (a required consent was declined or could not be affirmed). On `blocked`, `node` is null and `blocked` carries the honest stop-screen outcome.","enum":["active","complete","abandoned","blocked"],"type":"string","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"blocked":{"description":"The honest stop-screen outcome. Present only when `status` is `blocked`. Carries the machine-readable reason, the node at which the block occurred, the consent scopes that were not granted (codes, never patient data), and a support-routing hint. The stop-screen copy is a presentation concern (the intake kit renders it); no patient data ever rides here. No order lock ever forms without a positive affirmation where one is required.","properties":{"code":{"description":"A stable reason code, for example `consent_declined`, or `declined_therapy` when the questionnaire ends the visit. New codes can be added, so treat an unknown code as a generic stop.","type":"string","isRequired":true,"uniqueKey":"blocked.code","typeLabel":"string"},"node_id":{"description":"the node at which the block occurred (the consent node id, or the id of the node that declared the terminal)","type":"string","isRequired":true,"uniqueKey":"blocked.node_id","typeLabel":"string"},"content":{"additionalProperties":{"type":"string","uniqueKey":"blocked.content.additionalProperties","typeLabel":"string"},"description":"The stop's served words: named display-copy slots (e.g. `headline`, `body`) supplied by the server for this stop. A client renders these; it never picks the stop's wording off `code`. Absent means this stop supplies no copy and the client's own fallback stands. Carries instrument content only — never patient data.","type":"object","uniqueKey":"blocked.content","typeLabel":"object"},"support_route":{"description":"a stable support-routing key (edge owns portal→GHL support routing); never PII","type":"string","uniqueKey":"blocked.support_route","typeLabel":"string"},"ungranted_scopes":{"description":"consent scopes not granted — codes, never patient data","items":{"type":"string","uniqueKey":"blocked.ungranted_scopes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"blocked.ungranted_scopes","typeLabel":"string[]"}},"required":["code","node_id"],"type":"object","uniqueKey":"blocked","typeLabel":"object"},"destination_capability":{"description":"Present ONLY on the response to the call whose answer completed the questionnaire, and only when that questionnaire was started by your server with your secret key and no enrollment id (a fresh start, not a resume). It is a short-lived credential (about 10 minutes) that proves this browser's patient walked this enrollment. Never put it in a URL, never send it to browser JavaScript, and never log it. Hand the patient to checkout with a top-level form POST to `https://member.\u003cyour brand domain>/api/checkout/door`, with this value in the `capability` field of the request body and your `offering_ref` beside it. The form must be submitted from a page on one of your brand's registered browser origins (the browser's Origin header must match one exactly); any other origin is refused. If it has expired, the patient restarts the questionnaire; it is never reissued from the enrollment id. A repeated call on an already-complete session does not carry it again.","type":"string","uniqueKey":"destination_capability","typeLabel":"string"},"flags":{"items":{"type":"string","uniqueKey":"flags.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"flags","typeLabel":"string[]"},"handoff":{"additionalProperties":false,"description":"Post-completion hand-off carried when a session that began from an entry link completes. Present only when `status` is `complete` and the session carried a validated entry context. `redirect` holds a brand-allowlisted https URL; `promo` is an opaque pass-through token validated downstream; `test` is the per-client test-mode flag. Never carries patient data.","properties":{"promo":{"maxLength":256,"type":"string","uniqueKey":"handoff.promo","typeLabel":"string"},"redirect":{"maxLength":2048,"type":"string","uniqueKey":"handoff.redirect","typeLabel":"string"},"test":{"type":"boolean","uniqueKey":"handoff.test","typeLabel":"boolean"}},"type":"object","uniqueKey":"handoff","typeLabel":"object"},"issues":{"items":{"properties":{"code":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"issues.items.[INDEX].message","typeLabel":"string"},"conflicting_codes":{"description":"Paired with `exclusive_codes`. The option code(s) the exclusive selection contradicted — the other half of \"which options clashed\". When the submission carried only exclusive options, they contradict each other and both lists name them.","items":{"type":"string","uniqueKey":"issues.items.[INDEX].conflicting_codes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"issues.items.[INDEX].conflicting_codes","typeLabel":"string[]"},"exclusive_codes":{"description":"Present ONLY on `code: renderer.exclusive_violation`, absent on every other issue. The exclusive (\"none of these\"-class) option code(s) the refused submission carried. A contradictory selection on a clinical-safety question is a SERVE defect, not a client nicety: the server refuses it with a 422 and never a 200-advance, and the refusal must say WHICH selections contradicted so the client can correct the exact ones. These are the caller's OWN submitted codes echoed back to the caller.","items":{"type":"string","uniqueKey":"issues.items.[INDEX].exclusive_codes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"issues.items.[INDEX].exclusive_codes","typeLabel":"string[]"}},"required":["code","message"],"type":"object","uniqueKey":"issues.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"issues","typeLabel":"object[]"},"node":{"oneOf":[{"type":"object","description":"A node as presented to the client — PRESENTATION ONLY. The client never owns the sequence, controls, or option order (those come from the compiled bundle; a brand theme cannot alter them). Brand theme/copy, when applied, ride alongside as presentation overlay.","required":["node_id","kind","section_id"],"properties":{"kind":{"description":"`question` (collects a fact), `display` (an informational node with no answer channel), or `consent` (a consent-capture affirmation surface — its clinician/counsel-locked copy rides `content`, its `consent_version` + `grants` ride alongside). A `consent` node comes in TWO KINDS under ONE shape: the treatment consent (no `consent_kind`; binds no fact; a decline ends the session with an honest stop screen) and `communications_consent` (see `consent_kind`; never blocks, grants nothing, and the server records BOTH outcomes itself).","enum":["question","display","consent"],"type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"node_id":{"type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.node_id","typeLabel":"string"},"section_id":{"type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.section_id","typeLabel":"string"},"computed_stub":{"type":"boolean","uniqueKey":"node.oneOf.0.computed_stub","typeLabel":"boolean"},"consent_kind":{"description":"the consent node's SUB-KIND. Present ONLY on a `communications_consent` node (the email opt-in and the SMS consents); ABSENT on a treatment consent, whose decline ends the session with an honest stop screen. THE AFFORDANCES DIFFER, which is why it is served: on this kind the client offers one affirmative action AND an explicit \"No thanks\", both outcomes are recorded as an auditable fact with the served copy version, Continue with neither is recorded as not-granted, and NO outcome ever blocks the intake or terminates the session. A client that cannot distinguish the two kinds either hides a lawful decline or offers one that ends a member's intake. It carries no fact code: the server records the outcome under its own write key, and the stable code stays the server's binding.","enum":["communications_consent"],"type":"string","uniqueKey":"node.oneOf.0.consent_kind","typeLabel":"enum\u003cstring>"},"consent_version":{"description":"the consent version served on a `consent` node. The client echoes it on the affirmation; it rides into the recorded consent fact as provenance. The MD/counsel-locked affirmation copy rides `content`; brand can never supply it.","type":"string","uniqueKey":"node.oneOf.0.consent_version","typeLabel":"string"},"content":{"additionalProperties":{"type":"string","uniqueKey":"node.oneOf.0.content.additionalProperties","typeLabel":"string"},"description":"Named display-content slots for a display node — MD-locked copy carried in the compiled instrument bundle, versioned and reviewed with the instrument. Brand config themes presentation only and cannot supply or override these slots, with ONE narrow exception: in the two instrument-furniture slots (`start_greeting`, `acknowledgement_documents`) and in a consent node's counsel-locked text, the platform substitutes the brand's REGISTERED IDENTITY — its display name and its registered legal-document URLs — into fixed token positions the instrument itself authors. That is substitution of an identity value into MD-authored wording, never brand-supplied WORDING: a brand still cannot contribute one word of a clinical question prompt or option label, which remain structurally unreachable. The `copy` field is the separate question-headline channel; its authoritative source is likewise the MD-locked instrument bundle, and the brand overlay can never override it.","type":"object","uniqueKey":"node.oneOf.0.content","typeLabel":"object"},"control":{"type":"string","uniqueKey":"node.oneOf.0.control","typeLabel":"string"},"copy":{"description":"The question headline, as a single string, served from the MD-locked question prompt in the compiled instrument bundle (versioned and reviewed with the instrument). For a question node this is its only source — the per-brand copy overlay can never supply or override it (theming yes, wording never). Absent is valid; the renderer falls back deterministically (for example a formatted fact code).","type":"string","uniqueKey":"node.oneOf.0.copy","typeLabel":"string"},"display":{"enum":["static","computed"],"type":"string","uniqueKey":"node.oneOf.0.display","typeLabel":"enum\u003cstring>"},"fact":{"type":"string","uniqueKey":"node.oneOf.0.fact","typeLabel":"string"},"grants":{"description":"the consent scopes an affirmative answer grants on a `consent` node. Codes, never labels; nothing branches on the copy text. A `communications_consent` node grants nothing, so this is the empty list there — it can never tell a client which kind of consent card it is looking at; `consent_kind` is that signal.","items":{"type":"string","uniqueKey":"node.oneOf.0.grants.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"node.oneOf.0.grants","typeLabel":"string[]"},"interstitial":{"description":"Marks a display node as an interstitial moment for skin treatment (the tint pair is reserved for these). Presentation flag only; never carried on question nodes.","type":"boolean","uniqueKey":"node.oneOf.0.interstitial","typeLabel":"boolean"},"may_auto_advance":{"type":"boolean","uniqueKey":"node.oneOf.0.may_auto_advance","typeLabel":"boolean"},"media":{"description":"Capture configuration for a file-capture question. When absent, the question is a standard photo or document upload. Presentation and capture-bounds only — the answer is an upload reference and nothing branches on the media content; faces and voices are never matched, recognized, or graphed.","properties":{"kind":{"enum":["image","video"],"type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.media.kind","typeLabel":"enum\u003cstring>"},"accept":{"description":"MIME allowlist (e.g. video/mp4, video/webm)","items":{"type":"string","uniqueKey":"node.oneOf.0.media.accept.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"node.oneOf.0.media.accept","typeLabel":"string[]"},"capture_mode":{"enum":["upload","record","record_or_upload"],"type":"string","uniqueKey":"node.oneOf.0.media.capture_mode","typeLabel":"enum\u003cstring>"},"consent_copy":{"description":"The PLAIN DISPLAY TEXT the member must be shown before any affirmative action, pinned to `consent_version`. The portal renders THIS EXACT text; it is not a key, not a template, and the client never substitutes its own wording — consent to copy the server did not serve is not consent. Optional on the contract because non-video captures may not gate on consent at all, but REQUIRED (nonempty) for a managed video capture alongside `consent_version` and `consent_fact`: all three, or no grant and no recorded consent. Authored and served through the same MediaConfig, so the text the member reads and the version the server records can never drift apart.","type":"string","uniqueKey":"node.oneOf.0.media.consent_copy","typeLabel":"string"},"consent_fact":{"description":"fact code the consent acknowledgment projects to (discrete auditable consent fact)","type":"string","uniqueKey":"node.oneOf.0.media.consent_fact","typeLabel":"string"},"consent_version":{"description":"the version OF RECORD for the consent copy below. The server checks the echoed version against this one and records it on the acknowledgment; there is NO versionless fallback — a managed video capture whose node omits this refuses rather than recording a consent that cannot say which copy was agreed to.","type":"string","uniqueKey":"node.oneOf.0.media.consent_version","typeLabel":"string"},"facing":{"description":"advisory front/rear camera hint; not enforced","enum":["user","environment"],"type":"string","uniqueKey":"node.oneOf.0.media.facing","typeLabel":"enum\u003cstring>"},"max_bytes":{"type":"integer","uniqueKey":"node.oneOf.0.media.max_bytes","typeLabel":"integer"},"max_duration_s":{"type":"number","uniqueKey":"node.oneOf.0.media.max_duration_s","typeLabel":"number"},"min_duration_s":{"type":"number","uniqueKey":"node.oneOf.0.media.min_duration_s","typeLabel":"number"},"require_consent":{"description":"gate capture on a consent-to-record acknowledgment (video ⇒ true)","type":"boolean","uniqueKey":"node.oneOf.0.media.require_consent","typeLabel":"boolean"},"resumable":{"type":"boolean","uniqueKey":"node.oneOf.0.media.resumable","typeLabel":"boolean"}},"required":["kind"],"type":"object","uniqueKey":"node.oneOf.0.media","typeLabel":"object"},"offering_refs":{"items":{"type":"string","uniqueKey":"node.oneOf.0.offering_refs.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"node.oneOf.0.offering_refs","typeLabel":"string[]"},"option_codes":{"items":{"type":"string","uniqueKey":"node.oneOf.0.option_codes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"node.oneOf.0.option_codes","typeLabel":"string[]"},"options":{"description":"Per-option presentation hints for this question. When present, it lists the same codes in the same order as `option_codes` — option order comes from the questionnaire and cannot be altered by theming. When absent, render from `option_codes` alone.","items":{"description":"One selectable option with its presentation hints — presentation only, carried alongside `option_codes`. An `exclusive` option (a \"none of these\"-class choice) cannot be combined with any sibling — selecting it should clear the other selections, and the server rejects an answer that carries an exclusive code together with another selection (`422`, the session does not advance). A banded choice (for example a blood-pressure or frequency range) may carry a `classification_code` alongside its stable option code.","properties":{"code":{"description":"the stable option code submitted as the answer value","type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.options.items.[INDEX].code","typeLabel":"string"},"classification_code":{"description":"classification code carried by a banded choice alongside its stable option code","type":"string","uniqueKey":"node.oneOf.0.options.items.[INDEX].classification_code","typeLabel":"string"},"exclusive":{"description":"marks a \"none of these\"-class option that cannot be combined with any sibling selection","type":"boolean","uniqueKey":"node.oneOf.0.options.items.[INDEX].exclusive","typeLabel":"boolean"},"label":{"description":"MD-locked display label for this option, carried in the compiled instrument bundle and resolved by the stable option code (never positional). Presentation only — the code remains the submitted answer value and the sole binding; consumers fall back to the code when no label is present.","type":"string","uniqueKey":"node.oneOf.0.options.items.[INDEX].label","typeLabel":"string"}},"required":["code"],"type":"object","uniqueKey":"node.oneOf.0.options.items.[INDEX]","typeLabel":"object"},"type":"array","uniqueKey":"node.oneOf.0.options","typeLabel":"object[]"},"page":{"description":"Present ONLY on a question node whose value was staged from the member's OWN checkout destination record (always paired with `prefill: confirm` and a populated `prefilled_value`). Names the one leading page (\"Confirm your details\") the four contact nodes — name, email, phone, state — collapse onto with edit-in-place. A presentation grouping hint only, exactly like `interstitial` above: the server still walks one node at a time (resolve -> next -> ...); a client groups consecutive `confirm_details` nodes onto one screen without any change to the answer protocol. WHAT A CONFIRM DOES: confirming one of these nodes RECORDS that your patient affirmed the value shown — the same durable assertion any other confirm writes. It does not write a correction, because there was nothing to correct. Editing instead writes the edited value, superseding it, exactly like any other answered question. WHAT IS SHOWN IS ALWAYS A VALID ANSWER TO THE QUESTION: for a question whose answers are option codes, the `prefilled_value` is one of that node's own `option_codes`, promoted from the checkout record's postal spelling. A checkout value that cannot be resolved onto one of those options — an unfamiliar spelling, a region the question does not offer, a blank, a half-composed name — is NOT shown: that node arrives as an ordinary open question with no `page` and no `prefilled_value`, and your patient answers it normally. Absent on every other node.","enum":["confirm_details"],"type":"string","uniqueKey":"node.oneOf.0.page","typeLabel":"enum\u003cstring>"},"prefill":{"enum":["collect","suppress","confirm"],"type":"string","uniqueKey":"node.oneOf.0.prefill","typeLabel":"enum\u003cstring>"},"prefilled_value":{"oneOf":[{}],"uniqueKey":"node.oneOf.0.prefilled_value","typeLabel":"any"},"reassurance":{"description":"A single hedged reassurance line for a computed display panel, served from the MD-locked instrument content and reviewed with it. The line is SELECTED server-side by where the primary computed value falls against the served zone (below / in_zone / above) — never served statically — and is PRESENT only when the matching band is authored and the band could be determined; otherwise it is ABSENT (fail to neutral). Display copy only; it carries no eligibility language and defers every decision to the clinician.","type":"string","uniqueKey":"node.oneOf.0.reassurance","typeLabel":"string"},"required":{"type":"boolean","uniqueKey":"node.oneOf.0.required","typeLabel":"boolean"},"theme":{"additionalProperties":true,"type":"object","uniqueKey":"node.oneOf.0.theme","typeLabel":"object"},"unit":{"description":"The unit a question's answer is expressed in (for example \"in\" or \"lb\"), served from the question's MD-locked copy in the compiled instrument bundle, beside its prompt. Present only on a question node whose instrument authors a non-blank unit; absent otherwise. When absent the client shows no unit and never infers one — in particular never from the fact code. The per-brand overlay can never supply or override it. Display text only; nothing branches on it.","type":"string","uniqueKey":"node.oneOf.0.unit","typeLabel":"string"},"values":{"additionalProperties":{"oneOf":[{}],"uniqueKey":"node.oneOf.0.values.additionalProperties","typeLabel":"any"},"description":"Server-supplied display values keyed by fact/derivation CODE (codes, never label text). Derived codes are computed server-side on read from registered pure derivations — the client renders these values and never computes anything of record. A display node whose primary referenced values cannot all be resolved is never emitted (server-skipped, fail-soft). Ancillary echoed values (for example the height and weight behind a computed number) ride this same map alongside the primary value; an echoed value that cannot be resolved is omitted, and never blocks the node.","type":"object","uniqueKey":"node.oneOf.0.values","typeLabel":"object"},"zone":{"description":"A designed-panel band descriptor for a computed display node: a scale from `scale_min` to `scale_max` with a highlighted band from `zone_min` to `zone_max`, named by `zone_label`. The client places the patient's marker and the highlighted band for the picture. Display copy and presentation only — a zone carries no eligibility language and never asserts eligibility; the server remains authoritative on jurisdiction and eligibility.","properties":{"scale_max":{"description":"high end of the rendered scale axis","type":"number","isRequired":true,"uniqueKey":"node.oneOf.0.zone.scale_max","typeLabel":"number"},"scale_min":{"description":"low end of the rendered scale axis","type":"number","isRequired":true,"uniqueKey":"node.oneOf.0.zone.scale_min","typeLabel":"number"},"zone_label":{"description":"label naming the highlighted band (display copy; never an outcome)","type":"string","isRequired":true,"uniqueKey":"node.oneOf.0.zone.zone_label","typeLabel":"string"},"zone_max":{"description":"high bound of the highlighted band (within the scale)","type":"number","isRequired":true,"uniqueKey":"node.oneOf.0.zone.zone_max","typeLabel":"number"},"zone_min":{"description":"low bound of the highlighted band (within the scale)","type":"number","isRequired":true,"uniqueKey":"node.oneOf.0.zone.zone_min","typeLabel":"number"}},"required":["scale_min","scale_max","zone_min","zone_max","zone_label"],"type":"object","uniqueKey":"node.oneOf.0.zone","typeLabel":"object"}},"uniqueKey":"node.oneOf.0","typeLabel":"object"},{"type":"null","uniqueKey":"node.oneOf.1","typeLabel":"null"}],"uniqueKey":"node","typeLabel":"object | null"},"patient_readiness":{"type":"object","description":"Present on a resolve: whether your brand is ready for patients, and what is still missing if not. The questionnaire is served either way.","required":["status","consent_holder","required_documents","missing"],"properties":{"consent_holder":{"description":"who holds the brand's consent documents, as chosen; `not_chosen` until someone chooses.","enum":["purple","client","not_chosen"],"type":"string","isRequired":true,"uniqueKey":"patient_readiness.consent_holder","typeLabel":"enum\u003cstring>"},"missing":{"description":"every required item still unset; empty exactly when `status` is `patient_ready`.","items":{"additionalProperties":false,"properties":{"detail":{"description":"what is missing and how to set it, in plain words.","type":"string","isRequired":true,"uniqueKey":"patient_readiness.missing.items.[INDEX].detail","typeLabel":"string"},"item":{"enum":["display_name","consent_holder","legal_document","readiness_unknown"],"type":"string","isRequired":true,"uniqueKey":"patient_readiness.missing.items.[INDEX].item","typeLabel":"enum\u003cstring>"},"document":{"description":"for `legal_document`, which document is missing.","enum":["terms","privacy","telehealth"],"type":"string","uniqueKey":"patient_readiness.missing.items.[INDEX].document","typeLabel":"enum\u003cstring>"}},"required":["item","detail"],"type":"object","uniqueKey":"patient_readiness.missing.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"patient_readiness.missing","typeLabel":"object[]"},"required_documents":{"description":"the documents the brand's served consents link to (empty when that cannot be told yet).","items":{"enum":["terms","privacy","telehealth"],"type":"string","uniqueKey":"patient_readiness.required_documents.items.[INDEX]","typeLabel":"enum\u003cstring>"},"type":"array","isRequired":true,"uniqueKey":"patient_readiness.required_documents","typeLabel":"enum\u003cstring>[]"},"status":{"enum":["patient_ready","not_patient_ready"],"type":"string","isRequired":true,"uniqueKey":"patient_readiness.status","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"patient_readiness","typeLabel":"object"},"progress":{"description":"Server-computed progress metadata, present on every resolve/next step: computed from the live effective plan — never client-guessed. `position_estimate` is the honest fraction of the plan completed (0..1); display nodes participate in the fraction. Whether and how it renders (thin persistent bar, step ring, interstitial pacing, none) is brand-theme presentation.","properties":{"position_estimate":{"description":"honest fraction of the effective plan completed, 0..1","maximum":1,"minimum":0,"type":"number","isRequired":true,"uniqueKey":"progress.position_estimate","typeLabel":"number"},"scope":{"description":"`instrument`, or a subflow id once named optional sub-flows ship","type":"string","isRequired":true,"uniqueKey":"progress.scope","typeLabel":"string"},"section_label":{"description":"optional server-supplied section label; omitted while bundles carry none","type":"string","uniqueKey":"progress.section_label","typeLabel":"string"}},"required":["scope","position_estimate"],"type":"object","uniqueKey":"progress","typeLabel":"object"}},"required":["session_id","journey_id","status"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"journey_id":"\u003cstring>","session_id":"\u003cstring>","status":"active","blocked":{"code":"\u003cstring>","node_id":"\u003cstring>","content":{},"support_route":"\u003cstring>","ungranted_scopes":["\u003cstring>"]},"destination_capability":"\u003cstring>","flags":["\u003cstring>"],"handoff":{"promo":"\u003cstring>","redirect":"\u003cstring>","test":true},"issues":[{"code":"\u003cstring>","message":"\u003cstring>","conflicting_codes":["\u003cstring>"],"exclusive_codes":["\u003cstring>"]}],"node":{"kind":"question","node_id":"\u003cstring>","section_id":"\u003cstring>","computed_stub":true,"consent_kind":"communications_consent","consent_version":"\u003cstring>","content":{},"control":"\u003cstring>","copy":"\u003cstring>","display":"static","fact":"\u003cstring>","grants":["\u003cstring>"],"interstitial":true,"may_auto_advance":true,"media":{"kind":"image","accept":["\u003cstring>"],"capture_mode":"upload","consent_copy":"\u003cstring>","consent_fact":"\u003cstring>","consent_version":"\u003cstring>","facing":"user","max_bytes":123,"max_duration_s":123,"min_duration_s":123,"require_consent":true,"resumable":true},"offering_refs":["\u003cstring>"],"option_codes":["\u003cstring>"],"options":[{"code":"\u003cstring>","classification_code":"\u003cstring>","exclusive":true,"label":"\u003cstring>"}],"page":"confirm_details","prefill":"collect","prefilled_value":"\u003cunknown>","reassurance":"\u003cstring>","required":true,"theme":{},"unit":"\u003cstring>","values":{},"zone":{"scale_max":123,"scale_min":123,"zone_label":"\u003cstring>","zone_max":123,"zone_min":123}},"patient_readiness":{"consent_holder":"purple","missing":[{"detail":"\u003cstring>","item":"display_name","document":"terms"}],"required_documents":["terms"],"status":"patient_ready"},"progress":{"position_estimate":0.5,"scope":"\u003cstring>","section_label":"\u003cstring>"}}}},"exampleType":"generated"}},"description":"the minted/loaded session + the first node (or complete)","exampleType":"generated"},"e4719e30-28d7-4120-873e-bad25f43c21e":{"content":{"application/problem+json":{"schema":{"description":"RFC 7807 problem+json error body.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"format":"uri-reference","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"}},"required":["type","title","status"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":123,"title":"\u003cstring>","type":"\u003cstring>","detail":"\u003cstring>"}}},"exampleType":"generated"}},"description":"malformed or absent X-Brand-Id","exampleType":"generated"},"3b28558c-390f-4298-bd73-23dc765e277f":{"content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 7807 problem+json error body.","required":["type","title","status"],"properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","format":"uri-reference","enum":["https://purple.md/problems/intake-payment-required"],"isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":123,"title":"\u003cstring>","type":"https://purple.md/problems/intake-payment-required","detail":"\u003cstring>"}}},"exampleType":"generated"}},"description":"This treatment's questions start after payment, and the order for this enrollment has not been paid (no order is authorized, paid or partially refunded). Nothing was started, saved or decided. Finishing checkout is the cure; retrying without it returns the same answer. The body's `title` and `detail` carry the member-facing sentence: \"Finish checkout to start your medical intake.\" A treatment whose questions are designed to come BEFORE payment never answers this, nor does a resolve that names no enrollment, nor the pre-payment `qualification` phase. An order whose checkout began less than 30 minutes ago is answered with the 503 `intake-payment-unconfirmed` instead (its payment may still be arriving).","exampleType":"generated"},"dde32f44-fe12-44d6-b4b8-0d0642407ea4":{"content":{"application/problem+json":{"schema":{"description":"RFC 7807 problem+json error body.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"format":"uri-reference","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"}},"required":["type","title","status"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":123,"title":"\u003cstring>","type":"\u003cstring>","detail":"\u003cstring>"}}},"exampleType":"generated"}},"description":"No questionnaire can be served for this session. Unlike the temporary 503, neither state below is transient and neither is cured by retrying. Two distinct problem `type`s are answered here, and they are cured by different acts:\n\n`instrument-bundle-config-gap` — no questionnaire is published and activated for the therapy and mode this intake surface serves. Cured by publishing + activating an instrument bundle for that therapy and mode.\n\n`instrument-therapy-config-gap` — the session's own therapy cannot be served: the brand is configured for a therapy the platform publishes no questionnaire for, is configured for a therapy this platform does not serve at all, or has more than one enabled therapy and the entry link named no offering that resolves to exactly one of them. Cured by correcting the brand's configuration (or publishing that therapy's questionnaire), never by retrying. This answer exists because serving a DIFFERENT therapy's questions would be neither safe nor useful. It is deliberately uniform across all of those causes: the response carries no therapy key, brand id, or roster content, so it cannot be used to enumerate what another brand has enabled or what the platform serves.","exampleType":"generated"},"ed211ca8-87da-4559-a117-432fd4a95f2b":{"content":{"application/problem+json":{"schema":{"description":"RFC 7807 problem+json error body.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"format":"uri-reference","type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string\u003curi-reference>"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"}},"required":["type","title","status"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":123,"title":"\u003cstring>","type":"\u003cstring>","detail":"\u003cstring>"}}},"exampleType":"generated"}},"description":"Too many requests. You have exceeded the request rate allowed for this endpoint. Wait the number of seconds given in the Retry-After response header, then retry the request.","headers":{"Retry-After":{"description":"Seconds to wait before you retry.","schema":{"type":"integer"}},"X-Correlation-Id":{"description":"The correlation id for this request, echoed back.","schema":{"type":"string"}}},"exampleType":"generated"},"ea7912c7-b227-4435-852f-72401fcbf3c2":{"content":{"application/problem+json":{"schema":{"type":"object","description":"RFC 7807 problem+json error body.","required":["type","title","status"],"properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","format":"uri-reference","enum":["https://purple.md/problems/instrument-bundle-unavailable","https://purple.md/problems/instrument-destination-unavailable","https://purple.md/problems/intake-payment-unconfirmed"],"isRequired":true,"uniqueKey":"type","typeLabel":"enum\u003cstring>"},"detail":{"type":"string","uniqueKey":"detail","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":123,"title":"\u003cstring>","type":"https://purple.md/problems/instrument-bundle-unavailable","detail":"\u003cstring>"}}},"exampleType":"generated"}},"description":"The questions could not be started right now. THREE problem `type`s are served here and the schema below ENUMERATES them, so a partner or a generated client can branch on the value rather than on prose. Both are transient and both are cured by retrying shortly, but they say different things: `instrument-bundle-unavailable` — the questionnaire itself cannot be loaded right now (including the case where this session's therapy is known, a questionnaire for it has just become available, and this server has not finished loading it yet; the answer is an honest seconds-long wait, never another therapy's questions). `EdgeInstrumentBundleUnavailable` remains the canonical statement of that type and its causes. `instrument-destination-unavailable` — the questionnaire is fine, but the details your patient entered at CHECKOUT could not be read, so the questions were not started. Nothing was saved and nothing was decided. It is deliberately a separate type: telling a patient the questionnaire is loading would be untrue, and serving the questionnaire anyway would re-ask for a residence they already gave at checkout — which is how an order ends up carrying two different states, the defect this behaviour exists to prevent. `intake-payment-unconfirmed` — this treatment's questions start after payment, and the payment for this enrollment could not be confirmed right now (the payment record could not be read, or the checkout began under 30 minutes ago and the payment may still be arriving). It is never an answer that the order is unpaid (that is the `402`); the sentence is \"We're confirming your payment. Try again in a minute.\" and the response carries `Retry-After: 60`. No body carries operator detail: no store name, no upstream status, no reference, no field value. That detail rides this service's own structured log line, and the correlation id on your request is what ties the two together.","exampleType":"generated"}},"security":{"0682a086-b18f-4abd-ac84-45f00fdb724f":{"apiKey":{"description":"Per-client API key (M2M). Presented as `Authorization: Bearer \u003ckey>`.","scheme":"bearer","type":"http","scopes":[],"schemeName":"apiKey"}}},"servers":{"76f2c082-b62c-4aea-a087-a046f1378296":{"url":"https://api.staging.purplelabelmd.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"description":"Per-client API key (M2M). Presented as `Authorization: Bearer \u003ckey>`.","scheme":"bearer","type":"http","scopes":[],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Per-client API key (M2M). Presented as `Authorization: Bearer \u003ckey>`.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"openapi/public-openapi.json"},"subdomain":"purplelabelmd","siteName":"Purple Label MD","title":"Start an intake session and get the first question - Purple Label MD","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T04:48:53.080Z","originalFileLocation":"api-reference/intake/start-an-intake-session-and-get-the-first-question.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=\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient\u0026#x27;s behalf. WHICH questionnaire is served follows your brand\u0026#x27;s configured therapies: a brand with exactly one enabled therapy always serves that therapy\u0026#x27;s questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy\u0026#x27;s questionnaire is briefly still loading, the session opens on the platform\u0026#x27;s shared questionnaire rather than failing. If your brand\u0026#x27;s therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy\u0026#x27;s questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal\u0026#x27;s own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Purple Label MD\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_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/purplelabelmd/TU4Si8SnCOFGjzcC/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Start an intake session and get the first question - Purple Label MD\">\u003cmeta data-mint-head property=\"og:description\" content=\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient\u0026#x27;s behalf. WHICH questionnaire is served follows your brand\u0026#x27;s configured therapies: a brand with exactly one enabled therapy always serves that therapy\u0026#x27;s questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy\u0026#x27;s questionnaire is briefly still loading, the session opens on the platform\u0026#x27;s shared questionnaire rather than failing. If your brand\u0026#x27;s therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy\u0026#x27;s questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal\u0026#x27;s own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Purple Label MD\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://purplelabelmd.mintlify.site/_mintlify/api/og/v2?division=Intake\u0026amp;title=Start+an+intake+session+and+get+the+first+question\u0026amp;description=Begins+an+intake+questionnaire+for+your+patient+and+returns+the+first+question+to+present.+On+the+first+call+the+server+mints+an+enrollment+id+%28returned+as+%60jou\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=dbdcbfbf94093a9e7bbbcceccfc28f2780381806424f57ab41756fe027a77b2b\">\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=\"Start an intake session and get the first question - Purple Label MD\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient\u0026#x27;s behalf. WHICH questionnaire is served follows your brand\u0026#x27;s configured therapies: a brand with exactly one enabled therapy always serves that therapy\u0026#x27;s questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy\u0026#x27;s questionnaire is briefly still loading, the session opens on the platform\u0026#x27;s shared questionnaire rather than failing. If your brand\u0026#x27;s therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy\u0026#x27;s questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal\u0026#x27;s own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://purplelabelmd.mintlify.site/_mintlify/api/og/v2?division=Intake\u0026amp;title=Start+an+intake+session+and+get+the+first+question\u0026amp;description=Begins+an+intake+questionnaire+for+your+patient+and+returns+the+first+question+to+present.+On+the+first+call+the+server+mints+an+enrollment+id+%28returned+as+%60jou\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=dbdcbfbf94093a9e7bbbcceccfc28f2780381806424f57ab41756fe027a77b2b\">\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/purplelabelmd/TU4Si8SnCOFGjzcC/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Purple Label MD\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6D28D9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/intake/start-an-intake-session-and-get-the-first-question.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.purplelabelmd.com/#organization\",\"name\":\"Purple Label MD\",\"url\":\"https://docs.purplelabelmd.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/purplelabelmd/1P9p4n7lsNL4z3Jc/logo/light.svg?fit=max\u0026auto=format\u0026n=1P9p4n7lsNL4z3Jc\u0026q=85\u0026s=3c0569e3f76e49e04d232187908c2e2e\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.purplelabelmd.com#website\",\"name\":\"Purple Label MD\",\"url\":\"https://docs.purplelabelmd.com\",\"publisher\":{\"@id\":\"https://docs.purplelabelmd.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question#webpage\",\"url\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question\",\"name\":\"Start an intake session and get the first question\",\"description\":\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient's behalf. WHICH questionnaire is served follows your brand's configured therapies: a brand with exactly one enabled therapy always serves that therapy's questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy's questionnaire is briefly still loading, the session opens on the platform's shared questionnaire rather than failing. If your brand's therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy's questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal's own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\",\"dateModified\":\"2026-11-12T04:48:53.080Z\",\"isPartOf\":{\"@id\":\"https://docs.purplelabelmd.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Intake\",\"item\":\"https://docs.purplelabelmd.com/api-reference/intake/record-that-your-patient-dropped-off-the-questionnaire\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Start an intake session and get the first question\",\"item\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question#apireference\",\"headline\":\"Start an intake session and get the first question\",\"name\":\"Start an intake session and get the first question\",\"description\":\"Begins an intake questionnaire for your patient and returns the first question to present. On the first call the server mints an enrollment id (returned as journey_id) that identifies the session on every later call; send it back in the X-Journey-Id request header on a return visit to resume. The server owns the question sequence, branching, and completion — a client cannot skip, hide, or reorder questions, and any value pre-filled from an entry link is always shown for explicit confirmation, never accepted on the patient's behalf. WHICH questionnaire is served follows your brand's configured therapies: a brand with exactly one enabled therapy always serves that therapy's questionnaire; a brand with more than one must name an offering on the entry link so the therapy is unambiguous. If that therapy's questionnaire is briefly still loading, the session opens on the platform's shared questionnaire rather than failing. If your brand's therapy has no questionnaire at all — none is published for it, or the brand is configured for a therapy this platform does not serve — the call is REFUSED (422) rather than answered with a different therapy's questions, which would be neither safe nor useful; and an error is likewise answered when no questionnaire is available at all. PROOF-OF-IDENTITY CAPTURE IS NEVER PART OF THIS QUESTIONNAIRE. Questions that collect a government ID are withheld from this surface and are not counted toward its completion, so the patient finishes the intake here and verifies identity in the member portal's own identity step. Clinical photo capture and the consent video are unaffected and continue to be served exactly as before.\",\"url\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question\",\"mainEntityOfPage\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/intake/start-an-intake-session-and-get-the-first-question#webpage\"},\"dateModified\":\"2026-11-12T04:48:53.080Z\",\"publisher\":{\"@id\":\"https://docs.purplelabelmd.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.purplelabelmd.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Purple Label MD\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Purple Label MD\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/api-reference/intake/start-an-intake-session-and-get-the-first-question.md","siteName":"Purple Label MD","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/pages/overview"}]},{"tab":"API reference","groups":[{"group":"Brand configuration","pages":[{"title":"Read back your brand's platform configuration","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/config","href":"/api-reference/brand-configuration/read-back-your-brands-platform-configuration"},{"title":"Set your brand's display identity","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/brands/{brand_id}/config","href":"/api-reference/brand-configuration/set-your-brands-display-identity"},{"title":"List your brand's custom domains","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/domains","href":"/api-reference/brand-configuration/list-your-brands-custom-domains"},{"title":"Read the browser origins your storefront may read this brand from","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/domains/member/browser-origins","href":"/api-reference/brand-configuration/read-the-browser-origins-your-storefront-may-read-this-brand-from"},{"title":"Replace the browser origins your storefront may read this brand from","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/brands/{brand_id}/domains/member/browser-origins","href":"/api-reference/brand-configuration/replace-the-browser-origins-your-storefront-may-read-this-brand-from"},{"title":"Read one custom-domain row","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/domains/{kind}","href":"/api-reference/brand-configuration/read-one-custom-domain-row"},{"title":"Choose a custom domain for a kind (client self-serve)","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/brands/{brand_id}/domains/{kind}","href":"/api-reference/brand-configuration/choose-a-custom-domain-for-a-kind-client-self-serve"},{"title":"Remove a custom domain (revert to the shared domain)","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json delete /v1/account/brands/{brand_id}/domains/{kind}","href":"/api-reference/brand-configuration/remove-a-custom-domain-revert-to-the-shared-domain"},{"title":"Verify a custom domain and advance provisioning","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/brands/{brand_id}/domains/{kind}/verify","href":"/api-reference/brand-configuration/verify-a-custom-domain-and-advance-provisioning"}]},{"group":"Offering configuration","pages":[{"title":"List your brand's enabled offerings","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/offerings","href":"/api-reference/offering-configuration/list-your-brands-enabled-offerings"},{"title":"Enable an offering for your brand","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/brands/{brand_id}/offerings","href":"/api-reference/offering-configuration/enable-an-offering-for-your-brand"},{"title":"Choose the billing cadence of an offering on your brand","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/brands/{brand_id}/offerings/{offering_ref}/billing-cadence","href":"/api-reference/offering-configuration/choose-the-billing-cadence-of-an-offering-on-your-brand"},{"title":"Set your brand's price for an offering","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/brands/{brand_id}/pricing","href":"/api-reference/offering-configuration/set-your-brands-price-for-an-offering"},{"title":"Adopt the starter merchandising pack for your brand","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/brands/{brand_id}/starter-merchandising","href":"/api-reference/offering-configuration/adopt-the-starter-merchandising-pack-for-your-brand"},{"title":"Read an offering's composed qualification questions","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/offerings/{offering_ref}/qualification","href":"/api-reference/offering-configuration/read-an-offerings-composed-qualification-questions"},{"title":"Add a library question to an offering","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/offerings/{offering_ref}/qualification","href":"/api-reference/offering-configuration/add-a-library-question-to-an-offering"},{"title":"Reorder an offering's qualification questions","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/offerings/{offering_ref}/qualification/order","href":"/api-reference/offering-configuration/reorder-an-offerings-qualification-questions"},{"title":"Publish an offering's qualification questions","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/offerings/{offering_ref}/qualification/publish","href":"/api-reference/offering-configuration/publish-an-offerings-qualification-questions"},{"title":"Remove an offering's qualification question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json delete /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}","href":"/api-reference/offering-configuration/remove-an-offerings-qualification-question"},{"title":"Edit an offering's qualification question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json patch /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}","href":"/api-reference/offering-configuration/edit-an-offerings-qualification-question"},{"title":"Set the display name and presentation copy for your offering","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json put /v1/account/offerings/{ref}/merchandising","href":"/api-reference/offering-configuration/set-the-display-name-and-presentation-copy-for-your-offering"},{"title":"List the facts a qualification question may bind","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/question-library/facts","href":"/api-reference/offering-configuration/list-the-facts-a-qualification-question-may-bind"},{"title":"Create a new screening fact for your brand","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/question-library/minted-facts","href":"/api-reference/offering-configuration/create-a-new-screening-fact-for-your-brand"},{"title":"List your brand's qualification question library","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/question-library/questions","href":"/api-reference/offering-configuration/list-your-brands-qualification-question-library"},{"title":"Create a qualification library question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/account/question-library/questions","href":"/api-reference/offering-configuration/create-a-qualification-library-question"},{"title":"Delete a qualification library question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json delete /v1/account/question-library/questions/{question_id}","href":"/api-reference/offering-configuration/delete-a-qualification-library-question"},{"title":"Edit a qualification library question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json patch /v1/account/question-library/questions/{question_id}","href":"/api-reference/offering-configuration/edit-a-qualification-library-question"}]},{"group":"Onboarding","pages":[{"title":"Check whether your brand is ready to sell","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/readiness","href":"/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell"},{"title":"Read one offering's price and whether your brand can sell it","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/brands/{brand_id}/storefront","href":"/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it"},{"title":"Read a client's onboarding progress","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/onboardings/{onboarding_id}/progress","href":"/api-reference/onboarding/read-a-clients-onboarding-progress"}]},{"group":"Payments","pages":[{"title":"List your orders across all your brands","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/orders","href":"/api-reference/payments/list-your-orders-across-all-your-brands"},{"title":"Read one of your orders by reference","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/account/orders/{order_ref}","href":"/api-reference/payments/read-one-of-your-orders-by-reference"},{"title":"Start a checkout session and get a token to collect payment","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/payments/checkout-sessions","href":"/api-reference/payments/start-a-checkout-session-and-get-a-token-to-collect-payment"},{"title":"Read the payment status of an order","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/payments/{order_ref}/status","href":"/api-reference/payments/read-the-payment-status-of-an-order"}]},{"group":"Sessions \u0026 authentication","pages":[{"title":"Complete login and start the patient session","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/auth/callback","href":"/api-reference/sessions-\u0026-authentication/complete-login-and-start-the-patient-session"},{"title":"Begin Universal Login and redirect to the login page","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/auth/login","href":"/api-reference/sessions-\u0026-authentication/begin-universal-login-and-redirect-to-the-login-page"},{"title":"Log out and end the patient's session","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/auth/logout","href":"/api-reference/sessions-\u0026-authentication/log-out-and-end-the-patients-session"}]},{"group":"Intake","pages":[{"title":"Record that your patient dropped off the questionnaire","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/instrument/abandon","href":"/api-reference/intake/record-that-your-patient-dropped-off-the-questionnaire"},{"title":"Submit an answer and get the next question","description":"Submits the answer to the question the session is currently on. The answer is re-validated on the server and the session advances exactly one step, returning the next question — or `status: complete` once every required answer is in. The client never decides completion. If the answer fails validation the response is `422` with the specific issues and the session does not advance. Send `node_id` (the served `node.node_id`) to KEY the answer to its node: a stale replay of an already-passed node then resyncs cleanly (200, current node re-served) instead of misbinding to the node after a server-side skip, and a submit for a node the session has not reached fails closed with a `renderer.node_mismatch` issue (422). This op never presents a question that collects a government ID, and never waits on one to report `complete` — proof of identity is handled in the member portal's identity step, not here.","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/instrument/next","href":"/api-reference/intake/submit-an-answer-and-get-the-next-question"},{"title":"Start an intake session and get the first question","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/instrument/resolve","href":"/api-reference/intake/start-an-intake-session-and-get-the-first-question"}]},{"group":"Addresses","pages":[{"title":"Resolve a selected address suggestion to a full address","description":"Exchanges a suggestion id returned by the suggest operation for the full normalized address and its deliverability signal. This is the second half of the address picker: the suggest operation returns labels only, and the address itself is never handed out until your patient actually selects one.","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/instrument/address/retrieve","href":"/api-reference/addresses/resolve-a-selected-address-suggestion-to-a-full-address"},{"title":"Suggest addresses as your patient types","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/instrument/address/suggest","href":"/api-reference/addresses/suggest-addresses-as-your-patient-types"}]},{"group":"Enrollment","pages":[{"title":"Read a patient's public enrollment status","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/journeys/{journey_id}/status","href":"/api-reference/enrollment/read-a-patients-public-enrollment-status"}]},{"group":"Webhooks","pages":[{"title":"List the webhook event types you can subscribe to","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/webhooks/event-types","href":"/api-reference/webhooks/list-the-webhook-event-types-you-can-subscribe-to"},{"title":"List your webhook registrations","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/webhooks/registrations","href":"/api-reference/webhooks/list-your-webhook-registrations"},{"title":"Register a webhook endpoint (signing secret shown once)","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/webhooks/registrations","href":"/api-reference/webhooks/register-a-webhook-endpoint-signing-secret-shown-once"},{"title":"Read one of your webhook registrations","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json get /v1/webhooks/registrations/{registration_id}","href":"/api-reference/webhooks/read-one-of-your-webhook-registrations"},{"title":"Delete a webhook registration","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json delete /v1/webhooks/registrations/{registration_id}","href":"/api-reference/webhooks/delete-a-webhook-registration"},{"title":"Update a registration's URL, events, or enabled flag","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json patch /v1/webhooks/registrations/{registration_id}","href":"/api-reference/webhooks/update-a-registrations-url-events-or-enabled-flag"},{"title":"Send a test event to a registration","deprecated":null,"version":null,"openapi":"/openapi/public-openapi.json post /v1/webhooks/registrations/{registration_id}/test","href":"/api-reference/webhooks/send-a-test-event-to-a-registration"}]}]}]},"basePath":"","title":"Start an intake session and get the first question - Purple Label MD","buildId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","deploymentId":"dpl_DqYu5MPb49gWBBbUGgpHQUmCHY3P","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-CybtLBIt.js","utils-BMLj2fvV.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-B6In562Y.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Dr8Mfhp9.js","snippetPresets-2rmQvMVl.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","conditional-requirements-CFM0id0Q.js","ApiExamples-WMqJYdZj.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-CJ-MlPHu.js","shallow-dY3TMRCk.js","getApiPlaygroundDisplay-v-1B2bKm.js","CodeSnippet-BDhiTB7U.js","CodeSnippets-D9hnzQcS.js","Page-C4GwDT3_.js","getPastedJson-Th2V45jI.js","icon-BQXch1W9.js","MethodPill-BCqUneP3.js","DuplicateIcon-Q_-bhurZ.js","createIcon-DUjLHRqp.js","DynamicMarkdown-B-f2cqXQ.js","SectionHeading-Da5NsV4v.js","axios-vUo_bRtp.js","Markdown-D13FWkIM.js","clsx-D3Isdib3.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-C-XZBk9h.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink--qIqmmVG.js"]}