> ## Documentation Index
> Fetch the complete documentation index at: https://api.vitarelay.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List the unified product catalog

> Returns every published 503A, 503B, and R&D product visible to your practice.
Responses contain no price, cost, pharmacy, or margin fields.

**Scope required:** `catalog:read` (or `products:read`).




## OpenAPI

````yaml /practice-api/openapi.yaml get /catalog
openapi: 3.0.3
info:
  title: VitaRelay Practice API
  version: 1.0.0
  description: >
    The Practice API is for provider practices that prescribe with their OWN
    licensed

    prescribers (NPI/DEA/license on file with VitaRelay). VitaRelay is logistics
    and

    fulfillment only — your own provider is the prescriber of record.


    No cost, pharmacy, margin, or price data is ever exposed through this API.
servers:
  - url: https://vitarelay.com/api/public/practice/v1
security:
  - bearerAuth: []
tags:
  - name: Catalog
    description: Unified 503A / 503B / R&D catalog (no pricing).
  - name: Orders
    description: Place and track orders for your own patients.
  - name: Prescribers
    description: >-
      Manage your practice's prescriber roster. NPI and DEA are validated by
      format and checksum only — this is not a NPPES or DEA registry lookup. DEA
      numbers are always masked in responses.
paths:
  /catalog:
    get:
      tags:
        - Catalog
      summary: List the unified product catalog
      description: >
        Returns every published 503A, 503B, and R&D product visible to your
        practice.

        Responses contain no price, cost, pharmacy, or margin fields.


        **Scope required:** `catalog:read` (or `products:read`).
      operationId: listCatalog
      parameters:
        - name: page
          in: query
          schema:
            type: integer
            default: 1
            minimum: 1
        - name: limit
          in: query
          schema:
            type: integer
            default: 25
            minimum: 1
            maximum: 100
        - name: q
          in: query
          description: Case-insensitive search over name and keywords (max 200 chars).
          schema:
            type: string
            maxLength: 200
        - name: type
          in: query
          schema:
            type: string
            enum:
              - 503a
              - 503b
              - rnd
        - name: category
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Paginated catalog.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/CatalogProduct'
                  page:
                    type: integer
                  limit:
                    type: integer
                  total:
                    type: integer
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Error'
        '403':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
components:
  schemas:
    CatalogProduct:
      type: object
      properties:
        id:
          type: string
          format: uuid
        slug:
          type: string
          nullable: true
        name:
          type: string
        description:
          type: string
        type:
          type: string
          enum:
            - 503a
            - 503b
            - rnd
        requires_prescription:
          type: boolean
        category:
          type: string
          nullable: true
        category_label:
          type: string
          nullable: true
        image_urls:
          type: array
          items:
            type: string
        dosage_form:
          type: string
          nullable: true
        strengths:
          type: array
          items:
            type: string
        volume:
          type: string
          nullable: true
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
  responses:
    Error:
      description: Error envelope.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Practice API key (`vr_live_...` or `vr_test_...`).

````