Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform’s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand’s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand’s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.
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.
Whether one of your brands is ready to sell, and what is outstanding if it is not. checks covers the brand as a whole; offerings covers each offering you have enabled. Read source_readable first: false means the platform could not read your offering setup just now, so an empty rows list means "we could not look", never "nothing is outstanding".
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/onboarding/check-whether-your-brand-is-ready-to-sell","slug":"/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell","pageMetadata":{"title":"Check whether your brand is ready to sell","description":"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform's live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as `Authorization: Bearer pub_live_…`, or `pub_test_…` outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.","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","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: [\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform’s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as \", _jsx(_components.code, {\n children: \"Authorization: Bearer pub_live_…\"\n }), \", or \", _jsx(_components.code, {\n children: \"pub_test_…\"\n }), \" outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand’s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand’s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\"]\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":"Check whether your brand is ready to sell","description":"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform's live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as `Authorization: Bearer pub_live_…`, or `pub_test_…` outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.","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","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/purplelabelmd/3b4d4a495cd0c48d/brand.js"],"openApiReferenceData":{"operation":{"description":"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform's live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as `Authorization: Bearer pub_live_…`, or `pub_test_…` outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.","operationId":"getCommerceAccountBrandReadiness","parameters":["a81af11e-1553-4e28-af92-ad724e5dba43","4c9f87a2-d782-4e14-9e38-bd9dfc51ef29"],"responses":{"200":"d75cde0f-9d9c-47f2-b6f9-17c7aba4a602","400":"a53c1f0e-ce8f-4623-8343-6de0f15333f2","401":"640f7463-e6a5-40eb-b081-9724f4a5a2ca","404":"a08d0ee7-d8cf-4e4e-ba51-c71ca659f7ed","405":"64e4ba10-41cc-4b68-be09-a1123104d18c"},"security":["309d0b53-17d4-4e00-8e53-cbf59d034bd3","3d57a29e-51ba-4579-9654-1798b992b85f"],"summary":"Check whether your brand is ready to sell","tags":["Onboarding"],"method":"get","type":"path","servers":["76f2c082-b62c-4aea-a087-a046f1378296"],"path":"/v1/account/brands/{brand_id}/readiness","baseUrlOptions":["https://api.staging.purplelabelmd.com"],"title":"Check whether your brand is ready to sell","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"a81af11e-1553-4e28-af92-ad724e5dba43":{"description":"the brand to check. Must be one of your own brands; any other brand is not found (404, never 403 — existence is never revealed across accounts).","in":"path","name":"brand_id","required":true,"schema":{"type":"string","isRequired":true,"description":"the brand to check. Must be one of your own brands; any other brand is not found (404, never 403 — existence is never revealed across accounts).","uniqueKey":"","typeLabel":"string"}},"4c9f87a2-d782-4e14-9e38-bd9dfc51ef29":{"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":{"d75cde0f-9d9c-47f2-b6f9-17c7aba4a602":{"content":{"application/json":{"schema":{"properties":{"data":{"additionalProperties":false,"description":"Whether one of your brands is ready to sell, and what is outstanding if it is not. checks covers the brand as a whole; offerings covers each offering you have enabled. Read source_readable first: false means the platform could not read your offering setup just now, so an empty rows list means \"we could not look\", never \"nothing is outstanding\".","properties":{"brand_id":{"pattern":"^brd_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":true,"uniqueKey":"data.brand_id","typeLabel":"string"},"checks":{"description":"brand-wide readiness rows — your payment account, your checkout consent documents, and platform_price_bindings_present: whether every offering you have enabled has its platform price binding (without one, a price write for that offering is refused with PRICE_FLOOR_UNRESOLVABLE and the reason no_platform_price_binding).","items":{"additionalProperties":false,"description":"One readiness check. kind tells you how much the platform actually knows: performed means the check ran against real data and result is its answer; unverifiable means the check could not be run here, so it is neither a pass nor a fail and must not be read as either; named_pending means the check exists but its rules are not settled yet, and blocking says whether it holds the offering back today.","properties":{"check":{"description":"the check's stable identifier. unrecognized means the platform reported a check this report cannot name.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"uniqueKey":"data.checks.items.[INDEX].check","typeLabel":"string"},"detail":{"description":"a fixed plain-language sentence for this check's outcome. When something is outstanding it names what has to happen and who does it, so a step nobody on your side can perform is never presented as yours. It never carries file names, internal references or people's names, and it is not meant to be parsed — read check, kind and result for the outcome.","type":"string","isRequired":true,"uniqueKey":"data.checks.items.[INDEX].detail","typeLabel":"string"},"kind":{"description":"performed, unverifiable, or named_pending.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"uniqueKey":"data.checks.items.[INDEX].kind","typeLabel":"string"},"blocking":{"description":"present only when kind is named_pending.","type":"boolean","uniqueKey":"data.checks.items.[INDEX].blocking","typeLabel":"boolean"},"result":{"description":"pass or fail — present only when kind is performed.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","uniqueKey":"data.checks.items.[INDEX].result","typeLabel":"string"}},"required":["check","kind","detail"],"type":"object","uniqueKey":"data.checks.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.checks","typeLabel":"object[]"},"offerings":{"additionalProperties":false,"properties":{"rows":{"items":{"additionalProperties":false,"description":"One of your brand's enabled offerings, with the platform's live verdict on whether it can be sold and the per-check report behind that verdict.","properties":{"checks":{"items":{"additionalProperties":false,"description":"One readiness check. kind tells you how much the platform actually knows: performed means the check ran against real data and result is its answer; unverifiable means the check could not be run here, so it is neither a pass nor a fail and must not be read as either; named_pending means the check exists but its rules are not settled yet, and blocking says whether it holds the offering back today.","properties":{"check":{"description":"the check's stable identifier. unrecognized means the platform reported a check this report cannot name.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX].check","typeLabel":"string"},"detail":{"description":"a fixed plain-language sentence for this check's outcome. When something is outstanding it names what has to happen and who does it, so a step nobody on your side can perform is never presented as yours. It never carries file names, internal references or people's names, and it is not meant to be parsed — read check, kind and result for the outcome.","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX].detail","typeLabel":"string"},"kind":{"description":"performed, unverifiable, or named_pending.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX].kind","typeLabel":"string"},"blocking":{"description":"present only when kind is named_pending.","type":"boolean","uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX].blocking","typeLabel":"boolean"},"result":{"description":"pass or fail — present only when kind is performed.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX].result","typeLabel":"string"}},"required":["check","kind","detail"],"type":"object","uniqueKey":"data.offerings.rows.items.[INDEX].checks.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].checks","typeLabel":"object[]"},"lifecycle":{"additionalProperties":false,"description":"Whether this offering is live for your brand. live means it has gone live, so a storefront that shows only live offerings shows it. setting_up means it has not gone live yet. paused means it was live and a check stopped passing; reason_codes says which. It returns to live when that is fixed. not_reported means the platform could not confirm its status, so it is not treated as live. Where your storefront shows only live offerings, only live ones appear.","properties":{"detail":{"description":"one plain sentence about the status. Key on status, never on these words.","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle.detail","typeLabel":"string"},"on_storefront":{"description":"true exactly when status is live: whether this offering qualifies where your storefront shows only live offerings.","type":"boolean","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle.on_storefront","typeLabel":"boolean"},"status":{"enum":["live","setting_up","paused","not_reported"],"type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle.status","typeLabel":"enum\u003cstring>"},"reason_codes":{"description":"present exactly when status is paused: which checks stopped passing, as codes. not_reported means the reason was not available; unrecognized means a check this API does not name yet. Key on these codes; your onboarding contact can give the details.","items":{"enum":["catalog_not_ready","price_below_floor","cadence_not_set","prescriber_account_not_ready","intake_not_served","eligibility_rules_missing","licensure_missing","fulfillment_not_confirmed","not_reported","unrecognized"],"type":"string","uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle.reason_codes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"type":"array","uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle.reason_codes","typeLabel":"enum\u003cstring>[]"}},"required":["status","on_storefront","detail"],"type":"object","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].lifecycle","typeLabel":"object"},"offering_ref":{"description":"the offering's code.","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].offering_ref","typeLabel":"string"},"status":{"description":"the platform's live verdict for this offering — active means it can be sold now; anything else means it cannot yet, and the checks below say why.","pattern":"^[a-z][a-z0-9_]{0,63}$","type":"string","isRequired":true,"uniqueKey":"data.offerings.rows.items.[INDEX].status","typeLabel":"string"}},"required":["offering_ref","status","checks","lifecycle"],"type":"object","uniqueKey":"data.offerings.rows.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.offerings.rows","typeLabel":"object[]"},"source_readable":{"description":"whether the platform could read your offering setup for this request. When false, rows is empty because the read did not answer — not because nothing is outstanding.","type":"boolean","isRequired":true,"uniqueKey":"data.offerings.source_readable","typeLabel":"boolean"}},"required":["source_readable","rows"],"type":"object","isRequired":true,"uniqueKey":"data.offerings","typeLabel":"object"}},"required":["brand_id","checks","offerings"],"type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"brand_id":"\u003cstring>","checks":[{"check":"\u003cstring>","detail":"\u003cstring>","kind":"\u003cstring>","blocking":true,"result":"\u003cstring>"}],"offerings":{"rows":[{"checks":[{"check":"\u003cstring>","detail":"\u003cstring>","kind":"\u003cstring>","blocking":true,"result":"\u003cstring>"}],"lifecycle":{"detail":"\u003cstring>","on_storefront":true,"status":"live","reason_codes":["catalog_not_ready"]},"offering_ref":"\u003cstring>","status":"\u003cstring>"}],"source_readable":true}}}}},"exampleType":"generated"}},"description":"the brand's readiness report","exampleType":"generated"},"a53c1f0e-ce8f-4623-8343-6de0f15333f2":{"content":{"application/problem+json":{"schema":{"description":"An RFC 7807 problem document.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"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 owned-brand header — RFC 7807","exampleType":"generated"},"640f7463-e6a5-40eb-b081-9724f4a5a2ca":{"content":{"application/problem+json":{"schema":{"description":"An RFC 7807 problem document.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"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":"Unauthenticated — an unknown or revoked API key resolves nothing and returns a single opaque error body, with no way to probe whether a key is valid — RFC 7807","exampleType":"generated"},"a08d0ee7-d8cf-4e4e-ba51-c71ca659f7ed":{"content":{"application/problem+json":{"schema":{"description":"An RFC 7807 problem document.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"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":"not one of your brands — an unknown brand, a brand belonging to another account, and a malformed brand id are ONE indistinguishable refusal (404, never 403) — RFC 7807","exampleType":"generated"},"64e4ba10-41cc-4b68-be09-a1123104d18c":{"content":{"application/problem+json":{"schema":{"description":"An RFC 7807 problem document.","properties":{"status":{"type":"integer","isRequired":true,"uniqueKey":"status","typeLabel":"integer"},"title":{"type":"string","isRequired":true,"uniqueKey":"title","typeLabel":"string"},"type":{"type":"string","isRequired":true,"uniqueKey":"type","typeLabel":"string"},"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":"method not allowed — this endpoint is read-only — RFC 7807","exampleType":"generated"}},"security":{"309d0b53-17d4-4e00-8e53-cbf59d034bd3":{"apiKey":{"description":"Per-client API key (M2M). Presented as `Authorization: Bearer \u003ckey>`.","scheme":"bearer","type":"http","scopes":[],"schemeName":"apiKey"}},"3d57a29e-51ba-4579-9654-1798b992b85f":{"publishableKey":{"description":"Brand-scoped, read-only publishable key, safe to ship in a website. Presented as `Authorization: Bearer \u003ckey>` with the `pub_live_`/`pub_test_` prefix. It is minted for ONE brand and reaches only the two brand reads that declare it; every other operation, and every write, is refused. Cross-origin browser use additionally requires the page's exact origin on the brand's browser-origin allowlist.","scheme":"bearer","type":"http","scopes":[],"schemeName":"publishableKey"}}},"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"},{"schemes":[{"scheme":{"description":"Brand-scoped, read-only publishable key, safe to ship in a website. Presented as `Authorization: Bearer \u003ckey>` with the `pub_live_`/`pub_test_` prefix. It is minted for ONE brand and reaches only the two brand reads that declare it; every other operation, and every write, is refused. Cross-origin browser use additionally requires the page's exact origin on the brand's browser-origin allowlist.","scheme":"bearer","type":"http","scopes":[],"schemeName":"publishableKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Brand-scoped, read-only publishable key, safe to ship in a website. Presented as `Authorization: Bearer \u003ckey>` with the `pub_live_`/`pub_test_` prefix. It is minted for ONE brand and reaches only the two brand reads that declare it; every other operation, and every write, is refused. Cross-origin browser use additionally requires the page's exact origin on the brand's browser-origin allowlist.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"publishableKey","name":"Authorization"}],"title":"publishableKey"}]},"originalFileLocation":"openapi/public-openapi.json"},"subdomain":"purplelabelmd","siteName":"Purple Label MD","title":"Check whether your brand is ready to sell - Purple Label MD","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T04:48:52.687Z","originalFileLocation":"api-reference/onboarding/check-whether-your-brand-is-ready-to-sell.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=\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform\u0026#x27;s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand\u0026#x27;s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand\u0026#x27;s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\">\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=\"Check whether your brand is ready to sell - Purple Label MD\">\u003cmeta data-mint-head property=\"og:description\" content=\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform\u0026#x27;s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand\u0026#x27;s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand\u0026#x27;s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\">\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/onboarding/check-whether-your-brand-is-ready-to-sell\">\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=Onboarding\u0026amp;title=Check+whether+your+brand+is+ready+to+sell\u0026amp;description=Reports+whether+one+of+your+brands+can+actually+sell+yet%2C+and+what+is+still+outstanding+if+it+cannot.+Two+levels%3A+brand-wide+checks+covering+your+payment+accoun\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=05789de7e93f766d7c0f1575f9f4d79b657336b61b145eeb98f81099113f7dd2\">\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=\"Check whether your brand is ready to sell - Purple Label MD\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform\u0026#x27;s live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand\u0026#x27;s storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand\u0026#x27;s browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://purplelabelmd.mintlify.site/_mintlify/api/og/v2?division=Onboarding\u0026amp;title=Check+whether+your+brand+is+ready+to+sell\u0026amp;description=Reports+whether+one+of+your+brands+can+actually+sell+yet%2C+and+what+is+still+outstanding+if+it+cannot.+Two+levels%3A+brand-wide+checks+covering+your+payment+accoun\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=05789de7e93f766d7c0f1575f9f4d79b657336b61b145eeb98f81099113f7dd2\">\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/onboarding/check-whether-your-brand-is-ready-to-sell\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell.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/onboarding/check-whether-your-brand-is-ready-to-sell#webpage\",\"url\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell\",\"name\":\"Check whether your brand is ready to sell\",\"description\":\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform's live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\",\"dateModified\":\"2026-11-12T04:48:52.687Z\",\"isPartOf\":{\"@id\":\"https://docs.purplelabelmd.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Purple Label MD\",\"item\":\"https://docs.purplelabelmd.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Check whether your brand is ready to sell\",\"item\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell#apireference\",\"headline\":\"Check whether your brand is ready to sell\",\"name\":\"Check whether your brand is ready to sell\",\"description\":\"Reports whether one of your brands can actually sell yet, and what is still outstanding if it cannot. Two levels: brand-wide checks covering your payment account and your checkout consent documents, and one row per offering you have enabled carrying the platform's live verdict plus the per-check report behind it. Every outstanding item says what has to happen and who does it, so a step only Purple operations can complete is never handed to you as yours to do. Some checks cannot be answered by this endpoint; those are reported as unverifiable rather than guessed, and unverifiable is never a pass. Read source_readable before you read an empty offering list: false means the setup could not be read just now. You may ask about your own brands only; any other brand is not found. This read reports configuration state and changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as Authorization: Bearer pub_live_…, or pub_test_… outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's storefront price read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.\",\"url\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell\",\"mainEntityOfPage\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell#webpage\"},\"dateModified\":\"2026-11-12T04:48:52.687Z\",\"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/onboarding/check-whether-your-brand-is-ready-to-sell.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","description":"Updates a library question's wording, options, requiredness, or condition. Omitted fields are unchanged; the bound fact and control are fixed at creation (delete and recreate to change them).","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","description":"Everything a storefront page needs before it renders a price: the current price and terms for one of your offerings, and your brand's readiness to sell it, in one request. The two travel together on purpose — a price on its own does not tell you whether a purchase would go through, and a page that shows one without the other can offer a customer something the checkout will refuse. The price is the same price the checkout charges, from the same source; this endpoint never computes a second one. Read price_status before the amount: pending means the terms are not fully set up yet, and no amount is shown rather than a guessed one. Read the readiness block before you render a buy control. You may ask about your own brands only; any other brand is not found. This read changes nothing. CALLING IT FROM A BROWSER: a web page may call this read directly. Present a publishable brand key — sent as `Authorization: Bearer pub_live_…`, or `pub_test_…` outside production — which is minted for a single brand, is read-only, and is meant to be shipped in page source. The key reaches only the operations its allowlist names: today that is this read and that brand's readiness read, and nothing else — every other operation, and every write, is refused. Because it is minted for one brand it may only ask about that brand — any other brand, a sibling brand on your own account included, answers the same not found as a brand that does not exist, and the refusal never tells you which of those it was. A cross-origin page must also have its exact origin registered on that brand's browser-origin allowlist, so publishing the key does not by itself open the read to any site. The server path is unchanged — call this endpoint from your own server with your secret API key exactly as before, and never put that secret key in page source.","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","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","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":"Check whether your brand is ready to sell - 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"]}