Read one offering's price and whether your brand can sell it
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.
GET
/
v1
/
account
/
brands
/
{brand_id}
/
storefront
Read one offering's price and whether your brand can sell 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.
One offering's price and the brand's readiness to sell it. Read price_status inside pricing before the amount, and read readiness before you render a buy control — a price that resolves on a brand that is not ready to sell is a purchase the checkout will refuse.
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/read-one-offerings-price-and-whether-your-brand-can-sell-it","slug":"/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it","pageMetadata":{"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","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: [\"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 \", _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 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.\"]\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":"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","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":["/_mintlify/custom/purplelabelmd/3b4d4a495cd0c48d/brand.js"],"openApiReferenceData":{"operation":{"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.","operationId":"getCommerceAccountBrandStorefront","parameters":["eeb0c05a-7ff0-4cf0-940e-a4c070619e97","1ca5e1f2-36e6-4e83-908d-83f63e8fceae","4208a522-2466-457a-96cd-69c9fac1bf13"],"responses":{"200":"504f3900-d15d-4370-849e-0a4f1b899516","400":"ecf3ea3a-3d33-438f-bbe2-2cd06c644bb3","401":"7f5a5f85-7b38-4afe-bbb8-f584a07fd13d","403":"fb1a77f2-0a3c-462c-a776-95e5df93a134","404":"c1614fb0-b4da-4666-af60-e538b7264dfa","405":"dd78f48c-7b3a-4654-b80e-49197f7e1b44"},"security":["091dd61a-4765-44e5-aea5-5e96741ea1b5","bd319f03-dd54-4f8b-8096-8685dd39e2af"],"summary":"Read one offering's price and whether your brand can sell it","tags":["Onboarding"],"method":"get","type":"path","servers":["76f2c082-b62c-4aea-a087-a046f1378296"],"path":"/v1/account/brands/{brand_id}/storefront","baseUrlOptions":["https://api.staging.purplelabelmd.com"],"title":"Read one offering's price and whether your brand can sell it","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"eeb0c05a-7ff0-4cf0-940e-a4c070619e97":{"description":"the brand to read. 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 read. 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"}},"1ca5e1f2-36e6-4e83-908d-83f63e8fceae":{"description":"the offering to price. Required.","in":"query","name":"offering_ref","required":true,"schema":{"minLength":1,"type":"string","isRequired":true,"description":"the offering to price. Required.","uniqueKey":"","typeLabel":"string"}},"4208a522-2466-457a-96cd-69c9fac1bf13":{"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":{"504f3900-d15d-4370-849e-0a4f1b899516":{"content":{"application/json":{"schema":{"properties":{"data":{"additionalProperties":false,"description":"One offering's price and the brand's readiness to sell it. Read price_status inside pricing before the amount, and read readiness before you render a buy control — a price that resolves on a brand that is not ready to sell is a purchase the checkout will refuse.","properties":{"brand_id":{"pattern":"^brd_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":true,"uniqueKey":"data.brand_id","typeLabel":"string"},"offering_ref":{"description":"the offering that was priced — the offering_ref you asked for, echoed back.","type":"string","isRequired":true,"uniqueKey":"data.offering_ref","typeLabel":"string"},"pricing":{"type":"object","description":"the price and terms, in exactly the shape the merchandising read returns. When price_status is pending the amount and the terms block are omitted rather than guessed.","required":["prices"],"properties":{"prices":{"items":{"description":"Display price anchors for one `sku` on one of your brands — the numbers you may show *beside* a price, never the price itself. `compare_price_minor` is the struck-through \"was\" figure. `introductory_price_minor` is the first-purchase figure intended for a patient who has not bought this product before. Neither field is the amount a patient is charged: the charged amount is `list_price` on the enclosing response. Show these beside it as anchors and never compute a charge from them — what a checkout will actually collect is stated by the checkout endpoint, not here. Amounts are whole numbers in the smallest unit of `currency` (cents for USD), matching every other amount in this API.","properties":{"brand_id":{"type":"string","isRequired":true,"uniqueKey":"data.pricing.prices.items.[INDEX].brand_id","typeLabel":"string"},"currency":{"pattern":"^[A-Z]{3}$","type":"string","isRequired":true,"uniqueKey":"data.pricing.prices.items.[INDEX].currency","typeLabel":"string"},"sku":{"type":"string","isRequired":true,"uniqueKey":"data.pricing.prices.items.[INDEX].sku","typeLabel":"string"},"version":{"minimum":1,"type":"integer","isRequired":true,"uniqueKey":"data.pricing.prices.items.[INDEX].version","typeLabel":"integer"},"compare_price_minor":{"type":"integer","uniqueKey":"data.pricing.prices.items.[INDEX].compare_price_minor","typeLabel":"integer"},"introductory_price_minor":{"type":"integer","uniqueKey":"data.pricing.prices.items.[INDEX].introductory_price_minor","typeLabel":"integer"}},"required":["brand_id","sku","currency","version"],"type":"object","uniqueKey":"data.pricing.prices.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.pricing.prices","typeLabel":"object[]"},"copy":{"additionalProperties":false,"description":"The offering's adopted merchandising copy for your brand. Every field is optional and is omitted when it has not been written; the block itself is omitted when there is no copy. Display only: nothing here sets or changes a price.","properties":{"description":{"description":"the offering's description.","type":"string","uniqueKey":"data.pricing.copy.description","typeLabel":"string"},"display_name":{"description":"the offering's name as your storefront shows it.","type":"string","uniqueKey":"data.pricing.copy.display_name","typeLabel":"string"},"includes":{"description":"what the offering includes, one line each.","items":{"type":"string","uniqueKey":"data.pricing.copy.includes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.pricing.copy.includes","typeLabel":"string[]"}},"type":"object","uniqueKey":"data.pricing.copy","typeLabel":"object"},"list_price":{"description":"An amount in integer minor units (for example cents) with its ISO 4217 currency code — never a float.","properties":{"amount_minor":{"type":"integer","isRequired":true,"uniqueKey":"data.pricing.list_price.amount_minor","typeLabel":"integer"},"currency":{"pattern":"^[A-Z]{3}$","type":"string","isRequired":true,"uniqueKey":"data.pricing.list_price.currency","typeLabel":"string"}},"required":["amount_minor","currency"],"type":"object","uniqueKey":"data.pricing.list_price","typeLabel":"object"},"offering":{"description":"How one offering bills and ships, plus the display copy published for it. Billing and shipping run on separate schedules on purpose: a plan can bill quarterly and ship monthly, so read `billing_frequency` and `shipping_frequency` independently rather than inferring one from the other. A plan whose schedule follows its medication's supply also states it in days: `renewal_interval_days` (how often it bills) and `shipping_interval_days` (how often it ships). When the supply matches none of the `shipping_frequency` values (a 28- or 45-day supply, for example), `shipping_frequency` is omitted and `shipping_interval_days` carries the schedule; show it in days (\"every 28 days\"). A plan is never described to a patient with half its terms: the block always has `billing_frequency` and either `shipping_frequency` or `shipping_interval_days`, and this whole block is omitted when they have not been set, which is the state `price_status: pending` reports on the enclosing response. `display_name`, `description` and `includes` are the published copy for the plan; each is optional, and when one is absent show your own wording rather than `offering_ref`, which is an internal identifier and is never patient-facing text. Missing copy never suppresses the terms: a plan with no published name still returns its schedules, so you can render it and price it.","properties":{"brand_id":{"type":"string","isRequired":true,"uniqueKey":"data.pricing.offering.brand_id","typeLabel":"string"},"offering_ref":{"type":"string","isRequired":true,"uniqueKey":"data.pricing.offering.offering_ref","typeLabel":"string"},"billing_frequency":{"enum":["one_time","monthly","quarterly","semiannual","annual"],"type":"string","uniqueKey":"data.pricing.offering.billing_frequency","typeLabel":"enum\u003cstring>"},"description":{"description":"the published paragraph describing the plan. Omitted when none has been published.","type":"string","uniqueKey":"data.pricing.offering.description","typeLabel":"string"},"display_name":{"description":"the plan's published name, as your operations contact set it — the heading to show on a plan card. Omitted when no name has been published; fall back to your own wording, never to `offering_ref`.","type":"string","uniqueKey":"data.pricing.offering.display_name","typeLabel":"string"},"includes":{"description":"the published \"what's included\" lines for the plan, in the order they should be shown. Omitted when none have been published. An empty list is not the same as omitted — it means the plan was published with no bullet lines on purpose, so render no list rather than falling back to your own.","items":{"type":"string","uniqueKey":"data.pricing.offering.includes.items.[INDEX]","typeLabel":"string"},"type":"array","uniqueKey":"data.pricing.offering.includes","typeLabel":"string[]"},"renewal_interval_days":{"description":"how many days apart the plan bills, when its schedule follows the medication's supply (a 28-day supply billed monthly renews every 28 days). Omitted when the plan does not renew or its schedule is stated only by the frequencies above; read `billing_frequency` then.","minimum":1,"type":"integer","uniqueKey":"data.pricing.offering.renewal_interval_days","typeLabel":"integer"},"shipping_frequency":{"enum":["none","weekly","biweekly","monthly","quarterly"],"type":"string","uniqueKey":"data.pricing.offering.shipping_frequency","typeLabel":"enum\u003cstring>"},"shipping_interval_days":{"description":"how many days apart the plan ships, when its schedule follows the medication's supply. Present whenever `shipping_frequency` is omitted. Omitted for a plan whose shipping is stated only by `shipping_frequency`.","minimum":1,"type":"integer","uniqueKey":"data.pricing.offering.shipping_interval_days","typeLabel":"integer"},"version":{"description":"the revision number of the terms, present only on plans configured through the older record that carried one. Absent otherwise; do not depend on it to detect a change.","minimum":1,"type":"integer","uniqueKey":"data.pricing.offering.version","typeLabel":"integer"}},"required":["brand_id","offering_ref"],"type":"object","uniqueKey":"data.pricing.offering","typeLabel":"object"},"price_status":{"description":"whether this offering can be quoted right now. Always present. `available` means it is fully set up: `list_price` and `offering` are both present and the amount equals what a checkout will charge. `pending` means it is not — either its billing and shipping terms have not been set yet, or the price could not be resolved at the moment you asked — and in both cases `list_price` and `offering` are omitted rather than guessed or served from an old copy. Read this field before you read the amount. While it is `pending`, show the plan without a price and without a buy control: a checkout for an offering whose price does not resolve is refused, so a buy control here can only produce a failed purchase.","enum":["available","pending"],"type":"string","uniqueKey":"data.pricing.price_status","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"data.pricing","typeLabel":"object"},"readiness":{"type":"object","description":"whether the brand can actually sell, and what is outstanding if it cannot — the same report the brand readiness endpoint returns.","required":["brand_id","checks","offerings"],"properties":{"brand_id":{"pattern":"^brd_[A-Za-z0-9][A-Za-z0-9_-]*$","type":"string","isRequired":true,"uniqueKey":"data.readiness.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.readiness.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.readiness.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.readiness.checks.items.[INDEX].kind","typeLabel":"string"},"blocking":{"description":"present only when kind is named_pending.","type":"boolean","uniqueKey":"data.readiness.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.readiness.checks.items.[INDEX].result","typeLabel":"string"}},"required":["check","kind","detail"],"type":"object","uniqueKey":"data.readiness.checks.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.readiness.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.readiness.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.readiness.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.readiness.offerings.rows.items.[INDEX].checks.items.[INDEX].kind","typeLabel":"string"},"blocking":{"description":"present only when kind is named_pending.","type":"boolean","uniqueKey":"data.readiness.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.readiness.offerings.rows.items.[INDEX].checks.items.[INDEX].result","typeLabel":"string"}},"required":["check","kind","detail"],"type":"object","uniqueKey":"data.readiness.offerings.rows.items.[INDEX].checks.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.readiness.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.readiness.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.readiness.offerings.rows.items.[INDEX].lifecycle.on_storefront","typeLabel":"boolean"},"status":{"enum":["live","setting_up","paused","not_reported"],"type":"string","isRequired":true,"uniqueKey":"data.readiness.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.readiness.offerings.rows.items.[INDEX].lifecycle.reason_codes.items.[INDEX]","typeLabel":"enum\u003cstring>"},"type":"array","uniqueKey":"data.readiness.offerings.rows.items.[INDEX].lifecycle.reason_codes","typeLabel":"enum\u003cstring>[]"}},"required":["status","on_storefront","detail"],"type":"object","isRequired":true,"uniqueKey":"data.readiness.offerings.rows.items.[INDEX].lifecycle","typeLabel":"object"},"offering_ref":{"description":"the offering's code.","type":"string","isRequired":true,"uniqueKey":"data.readiness.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.readiness.offerings.rows.items.[INDEX].status","typeLabel":"string"}},"required":["offering_ref","status","checks","lifecycle"],"type":"object","uniqueKey":"data.readiness.offerings.rows.items.[INDEX]","typeLabel":"object"},"type":"array","isRequired":true,"uniqueKey":"data.readiness.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.readiness.offerings.source_readable","typeLabel":"boolean"}},"required":["source_readable","rows"],"type":"object","isRequired":true,"uniqueKey":"data.readiness.offerings","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"data.readiness","typeLabel":"object"}},"required":["brand_id","offering_ref","pricing","readiness"],"type":"object","isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["data"],"type":"object","uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"data":{"brand_id":"\u003cstring>","offering_ref":"\u003cstring>","pricing":{"prices":[{"brand_id":"\u003cstring>","currency":"\u003cstring>","sku":"\u003cstring>","version":2,"compare_price_minor":123,"introductory_price_minor":123}],"copy":{"description":"\u003cstring>","display_name":"\u003cstring>","includes":["\u003cstring>"]},"list_price":{"amount_minor":123,"currency":"\u003cstring>"},"offering":{"brand_id":"\u003cstring>","offering_ref":"\u003cstring>","billing_frequency":"one_time","description":"\u003cstring>","display_name":"\u003cstring>","includes":["\u003cstring>"],"renewal_interval_days":2,"shipping_frequency":"none","shipping_interval_days":2,"version":2},"price_status":"available"},"readiness":{"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 offering's price and the brand's readiness to sell it","exampleType":"generated"},"ecf3ea3a-3d33-438f-bbe2-2cd06c644bb3":{"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, or a missing offering_ref on a brand you DO own — RFC 7807","exampleType":"generated"},"7f5a5f85-7b38-4afe-bbb8-f584a07fd13d":{"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"},"fb1a77f2-0a3c-462c-a776-95e5df93a134":{"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":"the key you presented is a publishable (read-only) key and this request is not one of the reads it may make — RFC 7807, type commerce/auth/publishable-credential-read-only","exampleType":"generated"},"c1614fb0-b4da-4666-af60-e538b7264dfa":{"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); OR, on a brand you DO own, no price is configured for that offering (type commerce/merchandising/not-configured) — RFC 7807","exampleType":"generated"},"dd78f48c-7b3a-4654-b80e-49197f7e1b44":{"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":{"091dd61a-4765-44e5-aea5-5e96741ea1b5":{"apiKey":{"description":"Per-client API key (M2M). Presented as `Authorization: Bearer \u003ckey>`.","scheme":"bearer","type":"http","scopes":[],"schemeName":"apiKey"}},"bd319f03-dd54-4f8b-8096-8685dd39e2af":{"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":"Read one offering's price and whether your brand can sell it - Purple Label MD","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-12T04:48:52.719Z","originalFileLocation":"api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it.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=\"Everything a storefront page needs before it renders a price: the current price and terms for one of your offerings, and your brand\u0026#x27;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\u0026#x27;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\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=\"Read one offering\u0026#x27;s price and whether your brand can sell it - Purple Label MD\">\u003cmeta data-mint-head property=\"og:description\" content=\"Everything a storefront page needs before it renders a price: the current price and terms for one of your offerings, and your brand\u0026#x27;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\u0026#x27;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\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/read-one-offerings-price-and-whether-your-brand-can-sell-it\">\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=Read+one+offering%27s+price+and+whether+your+brand+can+sell+it\u0026amp;description=Everything+a+storefront+page+needs+before+it+renders+a+price%3A+the+current+price+and+terms+for+one+of+your+offerings%2C+and+your+brand%27s+readiness+to+sell+it%2C+in+o\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=c538640211c8dcfde7b28c181d446e40fb526b5e62f5853e434dce5eb8e321e1\">\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=\"Read one offering\u0026#x27;s price and whether your brand can sell it - Purple Label MD\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Everything a storefront page needs before it renders a price: the current price and terms for one of your offerings, and your brand\u0026#x27;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\u0026#x27;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\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=Read+one+offering%27s+price+and+whether+your+brand+can+sell+it\u0026amp;description=Everything+a+storefront+page+needs+before+it+renders+a+price%3A+the+current+price+and+terms+for+one+of+your+offerings%2C+and+your+brand%27s+readiness+to+sell+it%2C+in+o\u0026amp;theme=1cfc55286f6f85a93657a32a\u0026amp;signature=c538640211c8dcfde7b28c181d446e40fb526b5e62f5853e434dce5eb8e321e1\">\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/read-one-offerings-price-and-whether-your-brand-can-sell-it\">\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/read-one-offerings-price-and-whether-your-brand-can-sell-it.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/read-one-offerings-price-and-whether-your-brand-can-sell-it#webpage\",\"url\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it\",\"name\":\"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.\",\"dateModified\":\"2026-11-12T04:48:52.719Z\",\"isPartOf\":{\"@id\":\"https://docs.purplelabelmd.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Onboarding\",\"item\":\"https://docs.purplelabelmd.com/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Read one offering's price and whether your brand can sell it\",\"item\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it#apireference\",\"headline\":\"Read one offering's price and whether your brand can sell it\",\"name\":\"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.\",\"url\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it\",\"mainEntityOfPage\":{\"@id\":\"https://docs.purplelabelmd.com/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it#webpage\"},\"dateModified\":\"2026-11-12T04:48:52.719Z\",\"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/read-one-offerings-price-and-whether-your-brand-can-sell-it.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","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"},{"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","description":"Returns a client's onboarding progress in plain language — which step of how many, and what is currently waiting on the client. Presentation only; it never carries clinical data. Call it with your API key (`Authorization: Bearer \u003ckey>`) and `X-Brand-Id` set to one of your brands, for an onboarding of your own client. An onboarding that belongs to another client answers the same `404` as an id that does not exist, so the API never confirms whether another client's onboarding exists. Platform staff can read any client's progress. When the onboarding has a LegitScript step, `legitscript_timeline` lists each update's date and what it means.","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":"Read one offering's price and whether your brand can sell it - 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"]}