Skip to main content
GET /v1/account/brands/{brand_id}/offerings lists every offering enabled for your brand. It returns what a storefront needs to show and link each one: its name, its sku_id, its therapy, its entry mode, its checkout link, the price shown for it, and whether it can be sold yet. Build your catalog from this list. Your welcome pack may still print the same facts, but this read is where they live, and it stays current as offerings are added.

Call it from your server

This read takes your secret API key, so call it from your server, never from browser code. The publishable brand key is refused here: this read is not one of the operations that key may call (see your credentials).
The brand is the one your key owns, and you present it in X-Brand-Id. The brand_id in the path must match it. A mismatched, unknown or foreign brand answers 404, never 403, so the answer never says whether another client’s brand exists. Enabling an offering with POST /v1/account/brands/{brand_id}/offerings follows the same rule. The read changes nothing and moves no money.

What comes back

A 200 carries a data list, one entry per enabled offering, in the catalog’s order. A brand with no enabled offerings answers 200 with an empty list ({"data": []}), never an error.
Each entry carries:

Price, or no price yet

price is the same price the checkout charges, read from the same source. It is never computed for this list. Its status is one of three values:
  • available: the price is set. The entry carries amount_minor (a whole number in the smallest unit of the currency, so 29900 is $299.00), currency (USD), and billing_frequency (one_time, monthly, quarterly, semiannual or annual). It may also carry shipping_frequency (none, weekly, biweekly, monthly or quarterly), or shipping_interval_days and renewal_interval_days when the schedule follows the medication’s supply.
  • no_price_yet: the price or its billing terms are not set up yet. No amount is given, rather than a guessed one, and a checkout for the offering is refused. Show the offering without a price and without a buy control.
  • not_measured: the price could not be read right now. This is not the same as “no price yet”: the price may well be set. Try the read again before you tell a patient anything about the price.

Null means one of two things

A field that is null means one of two different things, and not_measured tells them apart:
  • null, and the field is named in not_measured: the part of the platform that holds the value could not be read right now. The offering is still listed. Read again later.
  • null, and the field is not named in not_measured: the platform holds no value for it. For example, therapy_key is null when the catalog maps no key for the offering’s therapy.
not_measured can name display_name, therapy, therapy_key, entry_mode, entry_link and price. When entry_link is null, entry_link_unavailable carries one of four reasons: Show such an offering without a buy control, and ask your onboarding contact to resolve any reason other than not_measured.

Readiness

readiness says whether the offering can be sold yet, exactly as the catalog reports it:
  • status: enabled_pending_activation (enabled for your brand, not yet ready to sell) or active.
  • lifecycle, when the catalog has one: its status is live, setting_up or paused, with live_since, paused_at and pause_reasons where they apply.
  • checks: the activation checks behind the status.
An offering that is enabled but still pending is listed with its name, so your storefront can show it as coming soon.

Errors

Your brand configuration does not list offerings

The brand configuration readback, GET /v1/account/brands/{brand_id}/config, returns your theme, your enabled therapies and your redirect allowlist. It does not carry your offerings. List them with this read.

The endpoint