> ## 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 your brand's price for an offering

> Sets the price your patients pay for one of your brand's offerings. Send the offering code and the new price in integer minor units (USD cents); the price takes effect immediately — the next checkout for your brand resolves it. Before anything is stored, the price is validated against your account's per-transaction cost floor: a price below the floor is rejected and the response names the floor so you can correct and retry. You can price only brands that belong to your account. A rejected request stores nothing and does not consume the Idempotency-Key, so a corrected retry may reuse the same key; repeating a completed request with the same Idempotency-Key and body returns the original result. Every price change is recorded in your brand's audit trail, attributed to your account.



## OpenAPI

````yaml /openapi/public-openapi.json put /v1/account/brands/{brand_id}/pricing
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/brands/{brand_id}/pricing:
    put:
      tags:
        - Offering configuration
      summary: Set your brand's price for an offering
      description: >-
        Sets the price your patients pay for one of your brand's offerings. Send
        the offering code and the new price in integer minor units (USD cents);
        the price takes effect immediately — the next checkout for your brand
        resolves it. Before anything is stored, the price is validated against
        your account's per-transaction cost floor: a price below the floor is
        rejected and the response names the floor so you can correct and retry.
        You can price only brands that belong to your account. A rejected
        request stores nothing and does not consume the Idempotency-Key, so a
        corrected retry may reuse the same key; repeating a completed request
        with the same Idempotency-Key and body returns the original result.
        Every price change is recorded in your brand's audit trail, attributed
        to your account.
      operationId: setOwnBrandPricing
      parameters:
        - description: The brand to price. Must be one of your account's own brands.
          in: path
          name: brand_id
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/CatalogIdempotencyKey'
        - $ref: '#/components/parameters/CatalogResolvedClient'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetOwnBrandPricingRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/CatalogPrice'
                type: object
          description: price row updated — or an idempotent replay of the original write
        '201':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/CatalogPrice'
                type: object
          description: price row created for (your brand, sku)
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            missing Idempotency-Key, malformed body, non-integer/zero/negative
            amount_minor, or a non-USD currency (v0)
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            authentication is missing or invalid — nothing about the request
            (brand, body, or price) is processed before authentication succeeds
        '404':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            no such brand FOR THIS ACCOUNT (an unknown brand and a foreign
            client's brand are ONE indistinguishable refusal — no existence
            oracle; a price write never creates its brand), or no such SKU (a
            price row never creates its SKU)
        '409':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            Idempotency-Key reused with a materially different request (code
            IDEMPOTENCY_CONFLICT)
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            the price is below your account's per-transaction cost floor (code
            PRICE_BELOW_FLOOR — the detail names the returned floor and its
            derivation so you can correct and retry), or the floor cannot be
            determined for this brand and offering (code
            PRICE_FLOOR_UNRESOLVABLE — the detail cites the typed reason, e.g.
            no_platform_price_binding = this offering is not priceable by your
            account); the write is refused, nothing persisted, the
            Idempotency-Key not consumed
        '503':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/CatalogProblem'
          description: >-
            price validation is temporarily unavailable (code
            FLOOR_RESOLVER_UNAVAILABLE) or not configured (code
            FLOOR_RESOLVER_UNCONFIGURED) — the write is refused rather than
            accepted unvalidated; nothing persisted, the Idempotency-Key not
            consumed, safe to retry later
      security:
        - apiKey: []
components:
  parameters:
    CatalogIdempotencyKey:
      description: >-
        Required on every mutation. Replaying the same request with the same key
        returns the original result; reusing the key with a materially different
        request is rejected 409 with machine code IDEMPOTENCY_CONFLICT.
      in: header
      name: Idempotency-Key
      required: true
      schema:
        minLength: 1
        type: string
    CatalogResolvedClient:
      description: >-
        Identifies your account. The platform sets this header from your API key
        when the request is authenticated — you do not send it yourself, and a
        value you supply is never trusted. Requests without a resolved account
        identity answer 401 before any processing, and every write is attributed
        to this identity in the audit trail.
      in: header
      name: X-Client-Id
      required: true
      schema:
        minLength: 1
        type: string
  schemas:
    SetOwnBrandPricingRequest:
      description: >-
        The price to set. The brand rides the path (one of your account's own
        brands); the body names the offering and the new amount. The offering
        must already exist — a price never creates one.
      properties:
        amount_minor:
          description: >-
            the price in integer minor units (USD cents), never a float;
            zero/negative rejected
          minimum: 1
          type: integer
        currency:
          description: optional; USD is the only supported currency
          enum:
            - USD
          type: string
        sku:
          description: the offering code, as shown in your offering list
          type: string
      required:
        - sku
        - amount_minor
      type: object
    CatalogPrice:
      description: >-
        The price one brand charges for one offering. A price row is
        configuration, not a charge — the charge happens at checkout, which
        resolves this row.
      properties:
        amount_minor:
          description: integer minor units (USD cents), never a float
          type: integer
        brand_id:
          type: string
        currency:
          enum:
            - USD
          type: string
        id:
          type: string
        min_price:
          description: >-
            reserved for a future minimum-price guardrail; not enforced and not
            writable
          type:
            - integer
            - 'null'
        sku_id:
          type: string
      required:
        - id
        - brand_id
        - sku_id
        - amount_minor
        - currency
      type: object
    CatalogProblem:
      description: >-
        RFC 7807 problem+json (a 409 idempotency conflict carries
        code=IDEMPOTENCY_CONFLICT)
      properties:
        code:
          description: machine-readable error code, e.g. IDEMPOTENCY_CONFLICT
          type: string
        detail:
          type: string
        instance:
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          type: string
      required:
        - title
        - status
      type: object
  securitySchemes:
    apiKey:
      description: 'Per-client API key (M2M). Presented as `Authorization: Bearer <key>`.'
      scheme: bearer
      type: http

````