---
title: "Get a patient's journey (admin)"
method: GET
path: "/api/journey/patients/{patient_id}"
tags: ["journey"]
---

# Get a patient's journey (admin)

`GET /api/journey/patients/{patient_id}`

Admin/customer_care view of a specific patient's journey, rendered exactly as that patient sees it (phases and steps, no contents). Useful to debug ordering/status issues on a specific account.

## Path parameters

- `patient_id` string, uuid, required — Patient UUID

## Response `200`

Successful Response

- JourneyResponse — Journey response with all phases and steps (no contents).
  - `phases` JourneyPhaseResponse[], required — All journey phases with steps
    - `code` string, required — Phase unique code
    - `name` string, required — Phase display name
    - `background_color_hex` string, required — Background color hex for this phase
    - `is_current` boolean — Whether this is the patient's current phase
    - `steps` JourneyStepResponse[], required — Steps within this phase
      - `code` string, required — Step unique code
      - `title` string, required — Step title
      - `description` string, nullable — Step description
      - `icon` string, required — Icon name for the step
      - `status` 'locked' | 'unlocked' | 'in_progress' | 'completed', required — Journey step status constants.
      - `phase_code` string, required — Phase code this step belongs to
      - `track` string, required — Track/status this step belongs to
      - `completed_at` string, nullable — ISO datetime when the step was completed
      - `event_date` string, nullable — ISO date when the underlying event occurred. Milestones: milestone date. Appointments: appointment date. Status steps: status period start date. Used for chronological ordering.
      - `unlock_in_days` integer, nullable — For locked steps with delay_days (e.g. mai pagato familiari): days until unlock. Omitted when locked_message is set.
      - `locked_message` string, nullable — When step is locked: personalized message for the user (e.g. 'Prossimo video tra 5 giorni'). When set, event_date and unlock_in_days are not returned.
      - `cta_url` string, nullable — Optional CTA URL/path for this step.
      - `cta_label` string, nullable — Optional CTA label for this step.
  - `current_phase_code` string, nullable — Current phase code based on appointments
  - `psi_status` string, nullable — Current psychologist status from patient_status_at_date
  - `nutri_status` string, nullable — Current nutritionist status from patient_status_at_date
  - `total_steps` integer, required — Total number of steps in the journey
  - `completed_steps` integer, required — Number of completed steps
  - `completed_appointments` integer, required — Number of completed appointments (FATTO)
  - `has_valid_appointments` boolean, required — True if patient has at least one valid appointment. Frontend uses this to decide preview position: sotto video Giulia/Zaira (false) or sotto frase giornaliera (true)

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/corabea/apis/corabea-api.md) · [All operations](https://skmtc.dev/corabea/apis/corabea-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/corabea/corabea-api/revisions/13c1bce1bdc4/schema)
