> ## 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 patient's public enrollment status

> Returns the current public status of a patient's enrollment — identifiers and a status value only, never patient data. This is a read-only view: it never changes anything and is never used as an input to any decision. Presented with the per-client API key (`Authorization: Bearer <key>`) and `X-Brand-Id` — the same posture as every partner consume call and exactly what the public quickstart documents. A journey belonging to another brand answers the SAME opaque 404 as an unknown one (no cross-tenant existence oracle).



## OpenAPI

````yaml /openapi/public-openapi.json get /v1/journeys/{journey_id}/status
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/journeys/{journey_id}/status:
    get:
      tags:
        - Enrollment
      summary: Read a patient's public enrollment status
      description: >-
        Returns the current public status of a patient's enrollment —
        identifiers and a status value only, never patient data. This is a
        read-only view: it never changes anything and is never used as an input
        to any decision. Presented with the per-client API key (`Authorization:
        Bearer <key>`) and `X-Brand-Id` — the same posture as every partner
        consume call and exactly what the public quickstart documents. A journey
        belonging to another brand answers the SAME opaque 404 as an unknown one
        (no cross-tenant existence oracle).
      operationId: getJourneyStatus
      parameters:
        - in: path
          name: journey_id
          required: true
          schema:
            pattern: ^jny_[A-Za-z0-9][A-Za-z0-9_-]*$
            type: string
        - description: >-
            Opaque brand id (brd_…). Names which of your brands the enrollment
            belongs to; validated to belong to the authenticated client.
          in: header
          name: X-Brand-Id
          required: true
          schema:
            pattern: ^brd_[A-Za-z0-9][A-Za-z0-9_-]*$
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicJourneyStatusRead'
          description: the partner-visible status projection
        '400':
          $ref: '#/components/responses/JourneyMalformedJourneyId'
        '401':
          $ref: '#/components/responses/JourneyUnauthorized'
        '404':
          $ref: '#/components/responses/JourneyStatusNotFound'
        '422':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/JourneyProblem'
          description: >-
            The enrollment exists — it was started through the hosted intake
            experience under your brand — but its live status is not yet
            reportable. Retrying does not change the answer; once status
            reporting for hosted-intake enrollments is in service, this same
            read returns the status.
        '503':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/JourneyProblem'
          description: >-
            The status source is temporarily unavailable. Nothing about the
            enrollment changed — retry the read.
      security:
        - apiKey: []
components:
  schemas:
    PublicJourneyStatusRead:
      description: >-
        The public enrollment-status read — identifiers and a status value only,
        never patient data.
      properties:
        journey_id:
          pattern: ^jny_[A-Za-z0-9][A-Za-z0-9_-]*$
          type: string
        public_status:
          $ref: '#/components/schemas/PublicJourneyStatusV1'
        status_version:
          enum:
            - v1
          type: string
      required:
        - journey_id
        - public_status
        - status_version
      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
    PublicJourneyStatusV1:
      description: >-
        The versioned public enrollment-status value. Each value is stable
        within v1 — a semantic change is published as a new version, never an
        in-place edit. The status reflects order authority: a patient never
        shows APPROVED before an order is authorized. Some later statuses
        (PREPARING, SHIPPED, DELIVERED, REFILL_DUE) are declared now so the
        contract is complete; their producers arrive with the shipment features.
      enum:
        - RECEIVED
        - IN_REVIEW
        - ACTION_NEEDED
        - APPROVED
        - DECLINED
        - ON_HOLD
        - PREPARING
        - SHIPPED
        - DELIVERED
        - SUPERSEDED
        - REFILL_DUE
      type: string
  responses:
    JourneyMalformedJourneyId:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/JourneyProblem'
      description: >-
        The journey_id in the path is malformed (it does not match the jny_… id
        shape). Rejected immediately as a request-shape error — this is not an
        existence signal; a well-formed but unknown journey_id answers 404
        instead.
    JourneyUnauthorized:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/JourneyProblem'
      description: >-
        edge-set trusted context (client_id/brand_id) absent — request did not
        enter via the edge
    JourneyStatusNotFound:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/JourneyProblem'
      description: >-
        The journey is not visible to your brand: it does not exist, or it
        belongs to another brand. Both cases answer this same response — the API
        never confirms whether a journey outside your brand exists.
  securitySchemes:
    apiKey:
      description: 'Per-client API key (M2M). Presented as `Authorization: Bearer <key>`.'
      scheme: bearer
      type: http

````