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

# Read a client's onboarding progress

> Returns a client's onboarding progress in plain language — which step of how many, and what is currently waiting on the client. Presentation only; it never carries clinical data.



## OpenAPI

````yaml /openapi/public-openapi.json get /v1/onboardings/{onboarding_id}/progress
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/onboardings/{onboarding_id}/progress:
    get:
      tags:
        - Onboarding
      summary: Read a client's onboarding progress
      description: >-
        Returns a client's onboarding progress in plain language — which step of
        how many, and what is currently waiting on the client. Presentation
        only; it never carries clinical data.
      parameters:
        - in: path
          name: onboarding_id
          required: true
          schema:
            pattern: ^onb_[A-Za-z0-9][A-Za-z0-9_-]*$
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OnboardingClientProgress'
          description: the client-visible progress
        '404':
          $ref: '#/components/responses/JourneyBadRequest'
components:
  schemas:
    OnboardingClientProgress:
      description: >-
        A client's onboarding progress in plain language: which step of how
        many, what is waiting on the client, and whether this is test mode.
        Presentation only; it never carries clinical data.
      properties:
        blocked_on_client:
          description: what we're currently waiting on the CLIENT for (plain-language)
          items:
            type: string
          type: array
        complete:
          type: boolean
        onboarding_id:
          pattern: ^onb_[A-Za-z0-9][A-Za-z0-9_-]*$
          type: string
        plain_language:
          type: string
        step_number:
          type: integer
        test_mode:
          type: boolean
        total_steps:
          type: integer
      required:
        - onboarding_id
        - step_number
        - total_steps
        - plain_language
        - blocked_on_client
        - test_mode
        - complete
      type: object
    JourneyProblem:
      description: >-
        RFC 7807 problem+json error body. `code` is a machine-code extension
        member (the CatalogProblem precedent): a refusal that has a typed reason
        NAMES it, so a caller branches on a token instead of parsing prose. It
        is OPTIONAL because an absent code is honest — a validation 400 already
        names the exact offending field path in `detail`, and a token invented
        to cover several distinct causes would rebuild the ambiguity it claims
        to cure. Every code this fragment declares appears in the 4xx
        description of the op that can emit it.
      properties:
        code:
          description: >-
            machine-readable refusal token (SCREAMING_SNAKE) — ONE token per
            distinct cause. The step-action surface emits: ONBOARDING_NOT_FOUND
            · STEP_UNKNOWN (404) · STEP_ALREADY_DONE · ONBOARDING_CLOSED ·
            IDEMPOTENCY_CONFLICT (409) · ACTION_NOT_APPLICABLE ·
            GOLIVE_EVIDENCE_INCOMPLETE (422). The live-signal ingest emits
            IDEMPOTENCY_CONFLICT · LIVE_JOURNEY_TENANCY_CONFLICT; the kickoff
            emits IDEMPOTENCY_CONFLICT · ONBOARDING_EXISTS.
          type: string
        detail:
          type: string
        instance:
          description: the request path the problem is about (RFC 7807 instance)
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          format: uri-reference
          type: string
      required:
        - type
        - title
        - status
      type: object
  responses:
    JourneyBadRequest:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/JourneyProblem'
      description: malformed body or missing required field (sku_id / therapy)

````