The one price row
A price belongs to a (brand, offering) pair. One brand, one offering, one price — writing it again replaces it. Prices are integer minor units (USD cents):10900 means $109.00. Floats
are never accepted, and USD is the only supported currency today.
Each supply length is its own offering with its own reference and its own price — a three-month
plan is priced by writing to its own offering code, not by multiplying anything.
Set a price
Send the offering code and the new amount toPUT /v1/account/brands/{brand_id}/pricing.
The brand rides the path and must be one of your own; the body names the offering and the amount —
nothing else.
201 when this is the first price for the pair, 200 when it replaces an existing one. Either
way the response is the stored row:
404.
The self-serve price write is being switched on across accounts now. Until it is active for yours,
a call to this endpoint answers
404, and your onboarding contact sets and changes your prices
for you — writing the same one price row, protected by the same floor. Everything else on this
page — the floor, and the checkout resolving your stored price — is how pricing works today.The price floor
Your account carries a per-transaction cost floor for each offering: the platform’s own cost of transacting it for you. A price below that floor would lose money on every order, so the write is refused before anything is stored:850 minor units) and how it was derived, so you can
correct the amount and retry — you never have to guess. Two codes can come back with 422:
A refused write stores nothing and does not consume your
Idempotency-Key — the same key
retries the corrected request cleanly.
Idempotency
Idempotency-Key is required on every price write. The semantics are the standard ones:
- Replaying the same key with the same body returns the original result — safe to retry on a timeout.
- Reusing the key with a materially different body answers
409with codeIDEMPOTENCY_CONFLICT. - Only performed writes consume a key. A
422(or any refusal) leaves the key unspent, so a corrected retry may reuse it.
Only your own brands
You can price only brands that belong to your account. An unknown brand and another account’s brand answer the same opaque404 — there is no way to probe whether a foreign brand exists. And
every accepted price change is recorded in your brand’s audit trail, attributed to your account.
Where the platform sets prices
The same price row can also be written from the platform’s operator side — typically to seed your starting prices during onboarding. Both paths write the one shared row, and the audit trail records which side made each change. From your side there is simply one current price per offering, whichever path last wrote it.How checkout shows your price
The hosted checkout never takes a price from anyone. When your storefront starts a checkout session, the server looks up your stored price for that offering at that moment and returns the result in the session:amount is the price the patient sees and pays — resolved from the row you wrote
above. A checkout request that tries to carry its own price, fee, or routing choice is rejected
outright (422, code commerce/checkout/client-authored-charge-parameter): the body accepts only
the offering reference, the enrollment id, and an optional promo code. See
The checkout door for the full checkout flow and
Identifiers and error types for the payment error
vocabulary.
So the loop is closed by construction: you write the price with your key, the floor protects it
from going below cost, and checkout resolves the stored row live — three facts, one price.