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

# Set the display name and presentation copy for your offering

> Publishes the DISPLAY content for one of YOUR offerings — the display name, the description, and the what-is-included lines — using your own API key, so the offering shows BY NAME in checkout and the member portal (no operator seed, no raw SKU code). The brand is the one your key owns (resolved from X-Brand-Id) and is applied to the write for you; the offering is the {ref} in the path (the offering_ref = the catalog offering code). The offering must already exist in the canonical catalog: an unknown offering is 404, never auto-created. This is product copy, NOT a price (no money moves). Idempotency-Key is carried through — replay of the same request returns the original result.



## OpenAPI

````yaml /openapi/public-openapi.json put /v1/account/offerings/{ref}/merchandising
openapi: 3.1.0
info:
  title: Purple API
  version: 0.0.0
servers:
  - url: https://api.dev.purplelabelmd.com
security: []
tags:
  - description: Sign a patient in and out and manage the browser session.
    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/offerings/{ref}/merchandising:
    put:
      tags:
        - Offering configuration
      summary: Set the display name and presentation copy for your offering
      description: >-
        Publishes the DISPLAY content for one of YOUR offerings — the display
        name, the description, and the what-is-included lines — using your own
        API key, so the offering shows BY NAME in checkout and the member portal
        (no operator seed, no raw SKU code). The brand is the one your key owns
        (resolved from X-Brand-Id) and is applied to the write for you; the
        offering is the {ref} in the path (the offering_ref = the catalog
        offering code). The offering must already exist in the canonical
        catalog: an unknown offering is 404, never auto-created. This is product
        copy, NOT a price (no money moves). Idempotency-Key is carried through —
        replay of the same request returns the original result.
      operationId: setAccountOfferingMerchandising
      parameters:
        - $ref: '#/components/parameters/BrandIdHeader'
        - $ref: '#/components/parameters/IdempotencyKeyHeader'
        - description: >-
            the offering code to merchandise (offering_ref = the catalog
            offering/SKU code).
          in: path
          name: ref
          required: true
          schema:
            minLength: 1
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AccountOfferingMerchandisingDisplayRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/AccountOfferingMerchandisingView'
                required:
                  - data
                type: object
          description: >-
            merchandising updated — or an idempotent replay of the original
            write
        '201':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/AccountOfferingMerchandisingView'
                required:
                  - data
                type: object
          description: merchandising created for your (brand, offering)
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            a malformed body (empty display_name/description, or a
            non-string-array includes) or a missing Idempotency-Key
        '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), or
            the offering_ref is absent from the canonical catalog (never
            auto-created)
        '409':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            Idempotency-Key reused with a materially different request (code
            IDEMPOTENCY_CONFLICT)
        '502':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/EdgeProblem'
          description: >-
            the catalog service is temporarily unavailable (nothing published;
            retryable)
      security:
        - apiKey: []
components:
  parameters:
    BrandIdHeader:
      description: >-
        Opaque brand id (brd_...). Validated to belong to the resolved client
        (§2).
      in: header
      name: X-Brand-Id
      required: true
      schema:
        pattern: ^brd_[A-Za-z0-9][A-Za-z0-9_-]*$
        type: string
    IdempotencyKeyHeader:
      description: >-
        Accepted on mutations; carried in trusted context, enforced in a later
        WI.
      in: header
      name: Idempotency-Key
      required: false
      schema:
        type: string
  schemas:
    AccountOfferingMerchandisingDisplayRequest:
      additionalProperties: false
      description: >-
        The CLIENT merchandise request body — DISPLAY CONTENT ONLY. Billing and
        shipping cadence (billing_frequency / shipping_frequency) are
        money-movement configuration set by the PLATFORM, never on this surface:
        they are not accepted here and a client-supplied cadence field is
        rejected (422). The brand (from your key) and the offering (from the
        path {ref}) are applied for you; a brand_id or offering_ref carried here
        is structurally inert (overwritten — the anti-spoof). The brand and
        offering must already exist — this request never creates them.
      properties:
        brand_id:
          description: >-
            structurally inert — if carried it is OVERWRITTEN with the brand
            your key owns (the anti-spoof); you never name a brand on this
            surface.
          type: string
        description:
          description: non-empty offering description.
          minLength: 1
          type: string
        display_name:
          description: >-
            non-empty display name shown in checkout + the member portal (never
            the raw SKU code).
          minLength: 1
          type: string
        includes:
          description: >-
            the what-is-included bullet lines — non-empty strings (the array
            itself may be empty).
          items:
            type: string
          type: array
        offering_ref:
          description: >-
            structurally inert — if carried it is OVERWRITTEN with the path
            {ref} (the anti-spoof).
          type: string
      required:
        - display_name
        - description
        - includes
      type: object
    AccountOfferingMerchandisingView:
      description: >-
        The display content for one of your offerings, keyed by (brand,
        offering_ref). Product copy, scoped to your brand — not a price, and it
        carries no personal health information.
      properties:
        brand_id:
          type: string
        description:
          type: string
        display_name:
          type: string
        id:
          description: opaque prefixed id (mrch_…)
          type: string
        includes:
          items:
            type: string
          type: array
        offering_ref:
          type: string
      required:
        - id
        - brand_id
        - offering_ref
        - display_name
        - description
        - includes
      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
  responses:
    EdgeUnauthorized:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/EdgeProblem'
      description: >-
        missing, unknown, or revoked API key - one opaque body (no
        enumeration/timing oracle, §1)
  securitySchemes:
    apiKey:
      description: 'Per-client API key (M2M). Presented as `Authorization: Bearer <key>`.'
      scheme: bearer
      type: http

````