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.
A new guide, Connect a 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
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_.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:
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 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, how it works, the checkout
door, the identity
handoff and 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.Changed
PUT /v1/account/brands/{brand_id}/domains/{kind}— setAccountBrandDomain: response added: 403
Added
GET /v1/account/brands/{brand_id}/domains/member/browser-origins— getAccountBrandBrowserOriginsPUT /v1/account/brands/{brand_id}/domains/member/browser-origins— putAccountBrandBrowserOrigins
Added
GET /v1/account/brands/{brand_id}/storefront— getCommerceAccountBrandStorefront
Added
GET /v1/account/brands/{brand_id}/readiness— getCommerceAccountBrandReadiness
Changed
POST /v1/instrument/next— nextInstrument: response added: 500
Changed
POST /v1/instrument/abandon— abandonInstrument: response added: 404POST /v1/instrument/next— nextInstrument: response added: 404
Added
POST /v1/account/brands/{brand_id}/starter-merchandising— adoptStarterMerchandising
Changed
POST /v1/account/offerings/{offering_ref}/qualification— forkQualificationQuestion: parameter added: header:Idempotency-KeyGET /v1/account/offerings/{offering_ref}/qualification— getQualificationOverlay: response added: 503
Changed
POST /v1/account/offerings/{offering_ref}/qualification— forkQualificationQuestion: parameter removed: query:modeGET /v1/journeys/{journey_id}/status— getJourneyStatus: response added: 422; response added: 503
Changed
DELETE /v1/account/question-library/questions/{question_id}— deleteQualificationLibraryQuestion: response added: 204; response removed: 200; response removed: 422DELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}— removeQualificationOverlayQuestion: response added: 204; response removed: 200; response removed: 422PUT /v1/account/offerings/{offering_ref}/qualification/order— reorderQualificationOverlay: response added: 404
Changed
POST /v1/payments/checkout-sessions— createCommerceCheckoutSession: response added: 400; response added: 503GET /v1/instrument/resolve— resolveInstrument: response added: 422
Three new guides join the Integrate section: Pricing — set the price
your patients pay, what the price floor means, and how the hosted checkout resolves your stored
price; 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 — building the sign-in link,
the member portal origin, and the self-serve custom-domain ladder. The
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.
Added
GET /v1/journeys/{journey_id}/status— getJourneyStatus
GET /v1/journeys/{journey_id}/status
Added
PUT /v1/account/brands/{brand_id}/pricing— setOwnBrandPricing
Changed
POST /v1/account/question-library/questions— createQualificationLibraryQuestion: response added: 503DELETE /v1/account/question-library/questions/{question_id}— deleteQualificationLibraryQuestion: response added: 503POST /v1/account/offerings/{offering_ref}/qualification/questions— forkQualificationQuestion: response added: 503POST /v1/account/question-library/minted-facts— mintQualificationFact: response added: 503POST /v1/account/offerings/{offering_ref}/qualification/publish— publishQualificationOverlay: response added: 503DELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}— removeQualificationOverlayQuestion: response added: 503PUT /v1/account/offerings/{offering_ref}/qualification/order— reorderQualificationOverlay: response added: 503PATCH /v1/account/question-library/questions/{question_id}— updateQualificationLibraryQuestion: response added: 503PATCH /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}— updateQualificationOverlayQuestion: response added: 503
A new guide, 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.
Added
POST /v1/account/question-library/questions— createQualificationLibraryQuestionDELETE /v1/account/question-library/questions/{question_id}— deleteQualificationLibraryQuestionPOST /v1/account/offerings/{offering_ref}/qualification/questions— forkQualificationQuestionGET /v1/account/question-library/facts— getQualificationLibraryFactsGET /v1/account/offerings/{offering_ref}/qualification— getQualificationOverlayGET /v1/account/question-library/questions— listQualificationLibraryPOST /v1/account/question-library/minted-facts— mintQualificationFactPOST /v1/account/offerings/{offering_ref}/qualification/publish— publishQualificationOverlayDELETE /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}— removeQualificationOverlayQuestionPUT /v1/account/offerings/{offering_ref}/qualification/order— reorderQualificationOverlayPATCH /v1/account/question-library/questions/{question_id}— updateQualificationLibraryQuestionPATCH /v1/account/offerings/{offering_ref}/qualification/questions/{question_id}— updateQualificationOverlayQuestion
Added
POST /v1/account/brands/{brand_id}/offerings— enableAccountOfferingPUT /v1/account/offerings/{ref}/merchandising— setAccountOfferingMerchandising
Added
GET /v1/account/brands/{brand_id}/domains/{kind}— getAccountBrandDomainGET /v1/account/brands/{brand_id}/domains— listAccountBrandDomainsDELETE /v1/account/brands/{brand_id}/domains/{kind}— removeAccountBrandDomainPUT /v1/account/brands/{brand_id}/domains/{kind}— setAccountBrandDomainPOST /v1/account/brands/{brand_id}/domains/{kind}/verify— verifyAccountBrandDomain
Added
PUT /v1/account/brands/{brand_id}/config— setAccountBrandDisplay
GET /v1/instrument/resolve— resolveInstrument: parameter added: query:phase; response added: 400
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, with the matching readback on GET. The token reference and the copy wording wall are documented in the brand configuration guide.This “API changes” page is now live, with automatic reference-change entries generated from the published contract on every deploy.