> ## 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.

# List your brand's enabled offerings

> Lists every offering enabled for YOUR brand, with what a storefront needs to show and link each one: its name, its sku_id, its therapy, its entry mode (questions-first or checkout-first), its checkout link, the price shown for it or an explicit "no price yet", and its readiness. Use your own API key. The brand is the one your key owns (resolved from X-Brand-Id); the brand_id in the path must match it (any mismatch, foreign, or unknown brand answers 404, never 403, exactly as enabling an offering does). A brand with no enabled offerings answers 200 with an empty list, never an error. Each field is read from the part of the platform that owns it, never recomputed here; when a part could not be read, the field is null and its name is listed in that offering's not_measured, and the offering itself is still listed. This read changes nothing and moves no money.



## OpenAPI

````yaml /openapi/public-openapi.json get /v1/account/brands/{brand_id}/offerings
openapi: 3.1.0
info:
  title: Purple API
  version: 0.0.0
servers:
  - url: https://api.staging.purplelabelmd.com
security: []
tags:
  - description: >-
      Browser redirects that begin, complete and end a sign-in on the API host.
      Patients sign in on your member portal instead, at
      https://{MEMBER_HOST}/auth/login?returnTo=/home.
    name: Sessions & authentication
  - description: Run the server-driven intake questionnaire question by question.
    name: Intake
  - description: Address autocomplete for the intake flow.
    name: Addresses
  - description: Read the public status of a patient's enrollment.
    name: Enrollment
  - description: Track a client's onboarding progress.
    name: Onboarding
  - description: Read back the platform configuration stored for your brand.
    name: Brand configuration
  - description: Enable offerings for your brand and set their display copy.
    name: Offering configuration
  - description: Start and track payments for an order.
    name: Payments
  - description: Subscribe to platform events and manage delivery endpoints.
    name: Webhooks
paths:
  /v1/account/brands/{brand_id}/offerings:
    get:
      tags:
        - Offering configuration
      summary: List your brand's enabled offerings
      description: >-
        Lists every offering enabled for YOUR brand, with what a storefront
        needs to show and link each one: its name, its sku_id, its therapy, its
        entry mode (questions-first or checkout-first), its checkout link, the
        price shown for it or an explicit "no price yet", and its readiness. Use
        your own API key. The brand is the one your key owns (resolved from
        X-Brand-Id); the brand_id in the path must match it (any mismatch,
        foreign, or unknown brand answers 404, never 403, exactly as enabling an
        offering does). A brand with no enabled offerings answers 200 with an
        empty list, never an error. Each field is read from the part of the
        platform that owns it, never recomputed here; when a part could not be
        read, the field is null and its name is listed in that offering's
        not_measured, and the offering itself is still listed. This read changes
        nothing and moves no money.
      operationId: listAccountBrandOfferings
      parameters:
        - $ref: '#/components/parameters/BrandIdHeader'
        - description: the brand whose offerings to list (must match X-Brand-Id).
          in: path
          name: brand_id
          required: true
          schema:
            pattern: ^brd_[A-Za-z0-9][A-Za-z0-9_-]*$
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    items:
                      $ref: '#/components/schemas/AccountBrandOffering'
                    type: array
                required:
                  - data
                type: object
          description: >-
            the brand's enabled offerings, in the catalog's order; an empty list
            when there are none
        '401':
          $ref: '#/components/responses/EdgeUnauthorized'
        '404':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            unknown or foreign brand (identical for both — 404, never 403; no
            cross-tenant existence leak)
        '502':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            the catalog service is temporarily unavailable (nothing listed;
            retryable)
        '503':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            the platform could not reach the catalog right now (nothing listed;
            retryable)
      security:
        - apiKey: []
components:
  parameters:
    BrandIdHeader:
      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
  schemas:
    AccountBrandOffering:
      description: >-
        One enabled offering on your brand, with what a storefront needs to show
        and link it. A field that could not be read right now is null and named
        in not_measured; null with its name absent from not_measured means the
        platform holds no value for it.
      properties:
        display_name:
          description: >-
            the name to show for the offering: the name your brand published for
            it, else the platform's name for the product. Present for an
            offering whose price is not set yet, too.
          type:
            - string
            - 'null'
        display_name_source:
          description: whose name display_name is; omitted when display_name is null.
          enum:
            - brand
            - platform
          type: string
        entry_link:
          description: >-
            the checkout link for this offering on your member portal address. A
            questions-first link carries `{journey_id}` where the patient's
            journey id goes; your storefront does not open it itself (the
            checkout door sends the patient there). Null when it is not
            available; entry_link_unavailable says why.
          format: uri
          type:
            - string
            - 'null'
        entry_link_unavailable:
          description: >-
            present exactly when entry_link is null: no_member_address (your
            brand has no active member portal address yet), no_therapy_key (a
            checkout-first link needs a therapy key the catalog does not map),
            offering_id_not_accepted (the sku_id is not one the checkout
            accepts), or not_measured (a part the link depends on could not be
            read right now).
          enum:
            - no_member_address
            - no_therapy_key
            - offering_id_not_accepted
            - not_measured
          type: string
        entry_mode:
          description: >-
            how a patient starts this offering: questions-first (the health
            questions come before payment) or checkout-first (payment first, the
            questions after).
          enum:
            - questions-first
            - checkout-first
            - null
          type:
            - string
            - 'null'
        not_measured:
          description: >-
            the names of the fields above that could not be read right now
            (empty when every read answered).
          items:
            enum:
              - display_name
              - therapy
              - therapy_key
              - entry_mode
              - entry_link
              - price
            type: string
          type: array
        offering_ref:
          description: >-
            the offering's code — the identifier the checkout link and every
            offering call carry.
          type: string
        price:
          $ref: '#/components/schemas/AccountBrandOfferingPrice'
        readiness:
          $ref: '#/components/schemas/AccountBrandOfferingReadiness'
        sku_id:
          type: string
        therapy:
          description: >-
            the offering's therapy as the catalog names it (for grouping and
            placement).
          type:
            - string
            - 'null'
        therapy_key:
          description: >-
            the therapy key a checkout-first link carries. Null when the catalog
            maps no key for the offering's therapy; a checkout-first link is
            then not available.
          type:
            - string
            - 'null'
      required:
        - offering_ref
        - sku_id
        - display_name
        - therapy
        - therapy_key
        - entry_mode
        - entry_link
        - price
        - readiness
        - not_measured
      type: object
    EdgeProblem:
      description: RFC 7807 problem+json error body.
      properties:
        detail:
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          format: uri-reference
          type: string
      required:
        - type
        - title
        - status
      type: object
    AccountBrandOfferingPrice:
      description: >-
        The price shown for the offering — the same price the checkout charges,
        read from the same source, never computed here. status available carries
        the amount and its terms. no_price_yet means the price or its terms are
        not set up yet; no amount is given rather than a guessed one, and a
        checkout for it is refused. not_measured means the price could not be
        read right now. Amounts are whole numbers in the smallest unit of
        currency (cents for USD).
      properties:
        amount_minor:
          description: present exactly when status is available.
          type: integer
        billing_frequency:
          description: >-
            how often the amount bills; present exactly when status is
            available.
          enum:
            - one_time
            - monthly
            - quarterly
            - semiannual
            - annual
          type: string
        currency:
          description: present exactly when status is available (USD only for now).
          enum:
            - USD
          type: string
        renewal_interval_days:
          description: >-
            how many days apart it bills, when the schedule follows the
            medication's supply.
          minimum: 1
          type: integer
        shipping_frequency:
          description: how often it ships, when the schedule is one of these values.
          enum:
            - none
            - weekly
            - biweekly
            - monthly
            - quarterly
          type: string
        shipping_interval_days:
          description: >-
            how many days apart it ships, when the schedule follows the
            medication's supply.
          minimum: 1
          type: integer
        status:
          enum:
            - available
            - no_price_yet
            - not_measured
          type: string
      required:
        - status
      type: object
    AccountBrandOfferingReadiness:
      description: >-
        Whether the offering can be sold yet, exactly as the catalog reports it:
        status (enabled_pending_activation or active), the lifecycle (live,
        setting_up or paused) when the catalog has one, and the activation
        checks behind the status.
      properties:
        checks:
          items:
            $ref: '#/components/schemas/OfferingActivationCheckRow'
          type: array
        lifecycle:
          properties:
            live_since:
              format: date-time
              type: string
            pause_reasons:
              items:
                type: string
              type: array
            paused_at:
              format: date-time
              type: string
            status:
              enum:
                - live
                - setting_up
                - paused
              type: string
          required:
            - status
          type: object
        status:
          enum:
            - enabled_pending_activation
            - active
          type: string
      required:
        - status
        - checks
      type: object
    OfferingActivationCheckRow:
      description: >-
        One row of the activation report. kind=performed carries a definitive
        result; kind=unverifiable means the check's source was unconfigured or
        unreachable, so activation is withheld rather than assumed;
        kind=named_pending names a check that is not yet ruled on (never
        fabricated, and never silently blocking).
      properties:
        blocking:
          description: present exactly when kind=named_pending
          type: boolean
        check:
          type: string
        detail:
          type: string
        kind:
          enum:
            - performed
            - unverifiable
            - named_pending
          type: string
        result:
          description: present exactly when kind=performed
          enum:
            - pass
            - fail
          type: string
      required:
        - check
        - kind
        - detail
      type: object
  responses:
    EdgeUnauthorized:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/EdgeProblem'
      description: Missing, unknown or revoked API key. The body is the same in every case.
  securitySchemes:
    apiKey:
      description: 'Per-client API key (M2M). Presented as `Authorization: Bearer <key>`.'
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.