> ## Documentation Index
> Fetch the complete documentation index at: https://docs.purplelabelmd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CHANGELOG

> What changed in the public API and the integration guides, newest first. API-reference changes are generated automatically from the published contract on every deploy, so this page can never drift from the live API.

Everything a returning integrator needs to know about what changed since they last built against the platform. Filter with the tag buttons: `API` marks a change to the reference surface, `Behavior` a change to how an endpoint acts, `Docs` a guide or clarification. `Breaking` means you must act; `Additive` means nothing you already built will break.

One timeline, newest first. Entries tagged `API` are generated automatically from a diff of the published OpenAPI contract — they appear here the moment a contract change deploys, with each operation linking to its page in the API reference. Guide and behavior notes are authored alongside the change that ships them. Both kinds share a single reverse-chronological list, so the most recent change is always at the top.

<Update label="2026-09-12" description="A guide for connecting a Lovable-generated storefront" tags={["Docs", "Additive"]}>
  A new guide, [Connect a Lovable storefront](/pages/integrate/lovable-storefront), covers wiring a
  storefront generated from a written prompt to the platform: which of your three credentials may
  ever reach browser code, the two browser-safe reads and the exact-origin allowlist that governs
  them, both ways into the flow, and a reusable prompt that holds no credential.

  It is explicit about what you can build against now and what depends on your brand's
  configuration. The browser read needs two things switched on for your brand — a publishable key
  and a registered origin — and until both are in place every cross-origin call is refused, whatever
  credential it carries. The questions-first entry is a server-side path end to end: your page can
  never call those endpoints itself. And the guide repeats the rule that
  costs integrators the most: **there is no redirect back to your storefront after payment**, so a
  payment outcome is read with
  [`GET /v1/payments/{order_ref}/status`](/api-reference/payments/read-the-payment-status-of-an-order)
  or delivered by webhook — never inferred from the browser.

  One correction of terminology worth reading if you have built against another payment tool: on
  this platform a `pk_` key is a **server secret**, and the browser-safe credential is the
  publishable brand key beginning `pub_test_` or `pub_live_`.
</Update>

<Update label="2026-09-10" description="The enrollment status read has documented outcomes other than a status" tags={["Docs", "Breaking"]}>
  **No endpoint changed — what we told you about one did.** The guides said an enrollment id was
  readable for its status from the moment it existed. The contract declares more
  outcomes than that for
  [`GET /v1/journeys/{journey_id}/status`](/api-reference/enrollment/read-a-patients-public-enrollment-status):
  besides the `400`/`401`/`404` refusals, it can return `422` with the type
  `https://purple.md/problems/journey-status-pending` — a typed "no status yet" response for an
  enrollment that is yours — and `503` when the status source is unavailable. Code that treats any
  non-`200` from that read as a failed call, or as a missing enrollment, needs a branch for it.

  [The patient flow](/pages/integrate/the-patient-flow#when-a-status-is-not-yet-reportable) now
  documents those outcomes and how they differ: branch on the `type`, and read a `503` as "the read
  did not succeed" rather than as a statement about the patient. The
  [quickstart](/pages/quickstart), [how it works](/pages/integrate/how-it-works), [the checkout
  door](/pages/integrate/the-checkout-door), [the identity
  handoff](/pages/integrate/the-identity-handoff) and [identifiers and error
  types](/pages/integrate/identifiers-and-error-types) are corrected to match. The identity
  handoff also no longer implies that verification produces a status change of its own — it does
  not, and never did.
</Update>

<Update label="2026-09-03" description="commit ae1613d" tags={["API","Additive"]}>
  **Changed**

  * [`PUT /v1/account/brands/{brand_id}/domains/{kind}`](/api-reference/brand-configuration/choose-a-custom-domain-for-a-kind-client-self-serve) — setAccountBrandDomain: response added: 403
</Update>

<Update label="2026-09-03" description="commit b459b2b" tags={["API","Additive"]}>
  **Added**

  * [`GET /v1/account/brands/{brand_id}/domains/member/browser-origins`](/api-reference/brand-configuration/read-the-browser-origins-your-storefront-may-read-this-brand-from) — getAccountBrandBrowserOrigins
  * [`PUT /v1/account/brands/{brand_id}/domains/member/browser-origins`](/api-reference/brand-configuration/replace-the-browser-origins-your-storefront-may-read-this-brand-from) — putAccountBrandBrowserOrigins
</Update>

<Update label="2026-09-02" description="commit 85c6665" tags={["API","Additive"]}>
  **Added**

  * [`GET /v1/account/brands/{brand_id}/storefront`](/api-reference/onboarding/read-one-offerings-price-and-whether-your-brand-can-sell-it) — getCommerceAccountBrandStorefront
</Update>

<Update label="2026-09-02" description="commit a2a7fa8" tags={["API","Additive"]}>
  **Added**

  * [`GET /v1/account/brands/{brand_id}/readiness`](/api-reference/onboarding/check-whether-your-brand-is-ready-to-sell) — getCommerceAccountBrandReadiness
</Update>

<Update label="2026-08-31" description="commit 9016094" tags={["API","Additive"]}>
  **Changed**

  * [`POST /v1/instrument/next`](/api-reference/intake/submit-an-answer-and-get-the-next-question) — nextInstrument: response added: 500
</Update>

<Update label="2026-08-30" description="commit aa30010" tags={["API","Additive"]}>
  **Changed**

  * [`POST /v1/instrument/abandon`](/api-reference/intake/record-that-your-patient-dropped-off-the-questionnaire) — abandonInstrument: response added: 404
  * [`POST /v1/instrument/next`](/api-reference/intake/submit-an-answer-and-get-the-next-question) — nextInstrument: response added: 404
</Update>

<Update label="2026-08-27" description="commit 9f26db7" tags={["API","Additive"]}>
  **Added**

  * [`POST /v1/account/brands/{brand_id}/starter-merchandising`](/api-reference/offering-configuration/adopt-the-starter-merchandising-pack-for-your-brand) — adoptStarterMerchandising
</Update>

<Update label="2026-08-26" description="commit f043001" tags={["API","Additive"]}>
  **Changed**

  * [`POST /v1/account/offerings/{offering_ref}/qualification`](/api-reference/offering-configuration/add-a-library-question-to-an-offering) — forkQualificationQuestion: parameter added: header:Idempotency-Key
  * [`GET /v1/account/offerings/{offering_ref}/qualification`](/api-reference/offering-configuration/read-an-offerings-composed-qualification-questions) — getQualificationOverlay: response added: 503
</Update>

<Update label="2026-08-26" description="commit e8f344c" tags={["API","Breaking"]}>
  **Changed**

  * [`POST /v1/account/offerings/{offering_ref}/qualification`](/api-reference/offering-configuration/add-a-library-question-to-an-offering) — forkQualificationQuestion: parameter removed: query:mode
  * [`GET /v1/journeys/{journey_id}/status`](/api-reference/enrollment/read-a-patients-public-enrollment-status) — getJourneyStatus: response added: 422; response added: 503
</Update>

<Update label="2026-08-26" description="commit 4c1ff5b" tags={["API","Breaking"]}>
  **Changed**

  * [`DELETE /v1/account/question-library/questions/{question_id}`](/api-reference/offering-configuration/delete-a-qualification-library-question) — deleteQualificationLibraryQuestion: response added: 204; response removed: 200; response removed: 422
  * [`DELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}`](/api-reference/offering-configuration/remove-an-offerings-qualification-question) — removeQualificationOverlayQuestion: response added: 204; response removed: 200; response removed: 422
  * [`PUT /v1/account/offerings/{offering_ref}/qualification/order`](/api-reference/offering-configuration/reorder-an-offerings-qualification-questions) — reorderQualificationOverlay: response added: 404
</Update>

<Update label="2026-08-25" description="commit ea56e47" tags={["API","Additive"]}>
  **Changed**

  * [`POST /v1/payments/checkout-sessions`](/api-reference/payments/start-a-checkout-session-and-get-a-token-to-collect-payment) — createCommerceCheckoutSession: response added: 400; response added: 503
  * [`GET /v1/instrument/resolve`](/api-reference/intake/start-an-intake-session-and-get-the-first-question) — resolveInstrument: response added: 422
</Update>

<Update label="2026-08-24" description="Three new guides + guide fixes" tags={["Docs", "Additive"]}>
  Three new guides join the Integrate section: [Pricing](/pages/integrate/pricing) — set the price
  your patients pay, what the price floor means, and how the hosted checkout resolves your stored
  price; [The patient flow](/pages/integrate/the-patient-flow) — the enrollment stages end-to-end,
  the eleven-value public status vocabulary, and where the payment step sits; and
  [Login URLs and domains](/pages/integrate/login-urls-and-domains) — building the sign-in link,
  the member portal origin, and the self-serve custom-domain ladder. The
  [welcome kit](/pages/integrate/welcome-kit) now lists your API base URL and member portal origin,
  and the base-URL wording across the guides is aligned: the test-environment base is issued with
  your key.
</Update>

<Update label="2026-08-24" description="commit 82f9057" tags={["API","Breaking"]}>
  **Added**

  * [`GET /v1/journeys/{journey_id}/status`](/api-reference/enrollment/read-a-patients-public-enrollment-status) — getJourneyStatus

  **Removed**

  * `GET /v1/journeys/{journey_id}/status`
</Update>

<Update label="2026-08-24" description="commit 7662829" tags={["API","Additive"]}>
  **Added**

  * [`PUT /v1/account/brands/{brand_id}/pricing`](/api-reference/offering-configuration/set-your-brands-price-for-an-offering) — setOwnBrandPricing
</Update>

<Update label="2026-08-17" description="commit 0a3a895" tags={["API","Additive"]}>
  **Changed**

  * [`POST /v1/account/question-library/questions`](/api-reference/offering-configuration/create-a-qualification-library-question) — createQualificationLibraryQuestion: response added: 503
  * [`DELETE /v1/account/question-library/questions/{question_id}`](/api-reference/offering-configuration/delete-a-qualification-library-question) — deleteQualificationLibraryQuestion: response added: 503
  * [`POST /v1/account/offerings/{offering_ref}/qualification/questions`](/api-reference/offering-configuration/add-a-library-question-to-an-offering) — forkQualificationQuestion: response added: 503
  * [`POST /v1/account/question-library/minted-facts`](/api-reference/offering-configuration/create-a-new-screening-fact-for-your-brand) — mintQualificationFact: response added: 503
  * [`POST /v1/account/offerings/{offering_ref}/qualification/publish`](/api-reference/offering-configuration/publish-an-offerings-qualification-questions) — publishQualificationOverlay: response added: 503
  * [`DELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}`](/api-reference/offering-configuration/remove-an-offerings-qualification-question) — removeQualificationOverlayQuestion: response added: 503
  * [`PUT /v1/account/offerings/{offering_ref}/qualification/order`](/api-reference/offering-configuration/reorder-an-offerings-qualification-questions) — reorderQualificationOverlay: response added: 503
  * [`PATCH /v1/account/question-library/questions/{question_id}`](/api-reference/offering-configuration/edit-a-qualification-library-question) — updateQualificationLibraryQuestion: response added: 503
  * [`PATCH /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}`](/api-reference/offering-configuration/edit-an-offerings-qualification-question) — updateQualificationOverlayQuestion: response added: 503
</Update>

<Update label="2026-08-11" description="How questions work" tags={["Docs", "Additive"]}>
  A new guide, [How questions work](/pages/integrate/how-questions-work), explains the model behind the question endpoints: facts and the shared catalog, controls, the line between your screening questions and the medical intake, and how the engine serves an intake one question at a time. It deep-links every question-authoring operation on the public reference.
</Update>

<Update label="2026-08-11" description="commit a236a8e" tags={["API","Additive"]}>
  **Added**

  * [`POST /v1/account/question-library/questions`](/api-reference/offering-configuration/create-a-qualification-library-question) — createQualificationLibraryQuestion
  * [`DELETE /v1/account/question-library/questions/{question_id}`](/api-reference/offering-configuration/delete-a-qualification-library-question) — deleteQualificationLibraryQuestion
  * [`POST /v1/account/offerings/{offering_ref}/qualification/questions`](/api-reference/offering-configuration/add-a-library-question-to-an-offering) — forkQualificationQuestion
  * [`GET /v1/account/question-library/facts`](/api-reference/offering-configuration/list-the-facts-a-qualification-question-may-bind) — getQualificationLibraryFacts
  * [`GET /v1/account/offerings/{offering_ref}/qualification`](/api-reference/offering-configuration/read-an-offerings-composed-qualification-questions) — getQualificationOverlay
  * [`GET /v1/account/question-library/questions`](/api-reference/offering-configuration/list-your-brands-qualification-question-library) — listQualificationLibrary
  * [`POST /v1/account/question-library/minted-facts`](/api-reference/offering-configuration/create-a-new-screening-fact-for-your-brand) — mintQualificationFact
  * [`POST /v1/account/offerings/{offering_ref}/qualification/publish`](/api-reference/offering-configuration/publish-an-offerings-qualification-questions) — publishQualificationOverlay
  * [`DELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}`](/api-reference/offering-configuration/remove-an-offerings-qualification-question) — removeQualificationOverlayQuestion
  * [`PUT /v1/account/offerings/{offering_ref}/qualification/order`](/api-reference/offering-configuration/reorder-an-offerings-qualification-questions) — reorderQualificationOverlay
  * [`PATCH /v1/account/question-library/questions/{question_id}`](/api-reference/offering-configuration/edit-a-qualification-library-question) — updateQualificationLibraryQuestion
  * [`PATCH /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}`](/api-reference/offering-configuration/edit-an-offerings-qualification-question) — updateQualificationOverlayQuestion
</Update>

<Update label="2026-08-10" description="commit ba74887" tags={["API","Additive"]}>
  **Added**

  * `POST /v1/account/brands/{brand_id}/offerings` — enableAccountOffering
  * `PUT /v1/account/offerings/{ref}/merchandising` — setAccountOfferingMerchandising
</Update>

<Update label="2026-08-08" description="commit 4b3fd94" tags={["API","Additive"]}>
  **Added**

  * `GET /v1/account/brands/{brand_id}/domains/{kind}` — getAccountBrandDomain
  * `GET /v1/account/brands/{brand_id}/domains` — listAccountBrandDomains
  * `DELETE /v1/account/brands/{brand_id}/domains/{kind}` — removeAccountBrandDomain
  * `PUT /v1/account/brands/{brand_id}/domains/{kind}` — setAccountBrandDomain
  * `POST /v1/account/brands/{brand_id}/domains/{kind}/verify` — verifyAccountBrandDomain
</Update>

<Update label="2026-08-08" description="commit 970046f" tags={["API","Additive"]}>
  **Added**

  * `PUT /v1/account/brands/{brand_id}/config` — setAccountBrandDisplay

  **Changed**

  * `GET /v1/instrument/resolve` — resolveInstrument: parameter added: query:phase; response added: 400
</Update>

<Update label="2026-08-07" description="Brand configuration" tags={["API", "Additive"]}>
  The display identity (name, logo, theme tokens, support email) is now a **self-serve write** with your own API key at [`PUT /v1/account/brands/{brand_id}/config`](/api-reference/brand-configuration/set-your-brands-display-identity-client-self-serve-configure-plane), with the matching readback on [`GET`](/api-reference/brand-configuration/read-back-your-brands-platform-configuration). The token reference and the copy wording wall are documented in the [brand configuration guide](/pages/integrate/brand-configuration).
</Update>

<Update label="2026-08-07" description="docs-pipeline" tags={["Docs", "Additive"]}>
  This "API changes" page is now live, with automatic reference-change entries generated from the published contract on every deploy.
</Update>
