---
title: "Get Home Setup Progress"
method: GET
path: "/read/home/setup-progress"
tags: ["read", "home"]
---

# Get Home Setup Progress

`GET /read/home/setup-progress`

## Request

- Base URL: `https://api.projectindi.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.projectindi.com/read/home/setup-progress`
- Auth: none declared

Fetch journey-aware setup card state for the parent home screen.

Returns initial cards (role='active') in slot order followed by the
replacement bench (role='bench') for any dismissed non-persistent slot.
Each card carries everything the client needs to render - title,
description, icon token, colour and action payload - pre-interpolated
with the current child + user names.

## Response `200`

Successful Response

- HomeSetupProgressResponse
  - `journey_type` string, nullable, required
  - `cards` CardState[], required
    - `card_id` string, required
    - `role` 'active' | 'bench', required
    - `title` string, required
    - `description` string, nullable
    - `cta_label` string, nullable
    - `icon_key` 'envelope' | 'map_trifold' | 'user_plus' | 'users_three' | 'chat_circle_text' | 'calendar_check' | 'clipboard' | 'file_text' | 'file_arrow_up' | 'chart_line_up', required
    - `color` string, required
    - `action` CardAction, required
      - `kind` 'chat_canned' | 'chat_prompt' | 'chat_simple' | 'navigate_bio' | 'navigate_invite_family' | 'navigate_care_team' | 'open_quick_note' | 'open_prepare_doc' | 'open_mail_app', required
      - `user_message` string, nullable
      - `assistant_message` string, nullable
      - `target` union
        - BioLocation: Open the child bio panel on a specific tab (+ optional sub-filter).
          - `kind` 'bio'
          - `child_id` string, nullable
          - `tab` 'about' | 'journey' | 'timeline' | 'records' | 'care-team' | 'calendar', required
          - `sub_filter` 'all' | 'documents' | 'media' | 'emails' | 'artefacts', nullable
          - `record_id` string, nullable
          - `entry_id` string, nullable
        - ChatLocation: Open the main chat surface (no prefill, no child context).
          - `kind` 'chat'
        - TodosLocation: Open the parent's tasks/todos surface, optionally a specific todo.
          - `kind` 'todos'
          - `todo_id` string, nullable
          - `child_id` string, nullable
        - TrackLocation: Open the child's tracks (a track is a parent-defined log, e.g. a food diary). One track opens on its own screen, so a track is its own kind rather than a `bio` tab; without one it lands on the About tab's tracks grid. Tier 1 (cold-start safe): both platforms expose a route that reaches a track without prior in-app state - web `?showBio&childId&tab=about&track_id`, mobile the standalone `/tracks/track/[trackId]` deep link - so notification and email builders may embed it. See docs/specs/2026-05-22-internal-link-schema.md.
          - `kind` 'track'
          - `child_id` string, nullable
          - `track_id` string, uuid, nullable
        - SettingsLocation: Open one of the parent's settings pages: `family` (children, family members, invites), `connections` (clinicians with access), `notifications`, `indi` (chat preferences), `account`.
          - `kind` 'settings'
          - `page` 'family' | 'connections' | 'notifications' | 'indi' | 'account', required
      - `event_name` 'dynamic_pill_clicked' | 'setup_card_tapped', required
    - `dismissed` boolean
    - `pending` boolean, nullable
    - `pending_email` string, nullable
    - `pending_name` string, nullable
    - `accepted_name` string, nullable
  - `check_in` CheckInCard: A clinician checked in. Its own typed field, not a `CardState`. The deck is a static catalogue of setup cards - one title, one description, one tap target, dismissal keyed into `onboarding_setup_prefs`. This card has a quote block, a reply line, TWO actions and per-check-in dismissal that must land on `check_in_recipients`. Forcing it into `CardState` means either three check-in-only fields every other card carries as dead weight, or branching the renderer on `card_id` - at which point the shared shape has bought nothing. What actually matters is kept: one request, and copy composed server-side.
    - `check_in_id` string, required
    - `child_id` string, required
    - `occurred_at` string, required
    - `clinician_id` string, required
    - `clinician_name` string, required
    - `clinic_name` string, nullable
    - `headline` string, required
    - `note` string, nullable
    - `reply_line` string, required
    - `one_way_line` string, required
    - `primary_label` string, required
    - `dismiss_label` string, required
  - `reminder_activation` ReminderActivationCard: The daily-reminder activation card. Deliberately NOT a `CardState`. Same call, and the same reasoning, as `CheckInCard` above. The deck's `CardState` is a 48%-wide grid tile padded to exactly four slots: icon row, a `lora-h4` title, a CTA text label. This card is full-width with a description paragraph and a primary Button, and it is condition-dismissed off `daily_reminders`, a table no other card touches. Forcing it into the deck gives a half-width tile in an awkward fifth slot on a third row. A typed field also keeps it mobile-only for free: a new deck `card_id` auto-renders on web, whereas a field appweb never destructures is inert. Push is a mobile capability we own end-to-end; web parity is V2.
    - `title` string, required
    - `body` string, required
    - `cta_label` string, required
  - `all_initial_complete` boolean, required
  - `activation` ActivationState: The activation deck as its own field. Mobile-only by construction. This is the isolation mechanism, and it is also the kill switch. Web reads the same endpoint and forks its greeting on `all_initial_complete`; a field appweb never destructures is inert there, so the activation screen can ship, cohort and roll back server-side with no client release and no feature flag (flag delivery is broken product-wide, #7737 - a flag-gated activation home would ship dead). Absent means today's screen, exactly.
    - `steps` ActivationStep[], required
      - `step_id` string, required
      - `title` string, required
      - `caption` string, nullable
      - `description` string, nullable
      - `cta_label` string, nullable
      - `status_note` string, nullable
      - `icon_key` 'envelope' | 'map_trifold' | 'user_plus' | 'users_three' | 'chat_circle_text' | 'calendar_check' | 'clipboard' | 'file_text' | 'file_arrow_up' | 'chart_line_up', required
      - `icon_tone` 'blue' | 'green' | 'pink' | 'purple' | 'orange' | 'teal'
      - `action` CardAction, required
        - `kind` 'chat_canned' | 'chat_prompt' | 'chat_simple' | 'navigate_bio' | 'navigate_invite_family' | 'navigate_care_team' | 'open_quick_note' | 'open_prepare_doc' | 'open_mail_app', required
        - `user_message` string, nullable
        - `assistant_message` string, nullable
        - `target` union
          - BioLocation: Open the child bio panel on a specific tab (+ optional sub-filter).
            - `kind` 'bio'
            - `child_id` string, nullable
            - `tab` 'about' | 'journey' | 'timeline' | 'records' | 'care-team' | 'calendar', required
            - `sub_filter` 'all' | 'documents' | 'media' | 'emails' | 'artefacts', nullable
            - `record_id` string, nullable
            - `entry_id` string, nullable
          - ChatLocation: Open the main chat surface (no prefill, no child context).
            - `kind` 'chat'
          - TodosLocation: Open the parent's tasks/todos surface, optionally a specific todo.
            - `kind` 'todos'
            - `todo_id` string, nullable
            - `child_id` string, nullable
          - TrackLocation: Open the child's tracks (a track is a parent-defined log, e.g. a food diary). One track opens on its own screen, so a track is its own kind rather than a `bio` tab; without one it lands on the About tab's tracks grid. Tier 1 (cold-start safe): both platforms expose a route that reaches a track without prior in-app state - web `?showBio&childId&tab=about&track_id`, mobile the standalone `/tracks/track/[trackId]` deep link - so notification and email builders may embed it. See docs/specs/2026-05-22-internal-link-schema.md.
            - `kind` 'track'
            - `child_id` string, nullable
            - `track_id` string, uuid, nullable
          - SettingsLocation: Open one of the parent's settings pages: `family` (children, family members, invites), `connections` (clinicians with access), `notifications`, `indi` (chat preferences), `account`.
            - `kind` 'settings'
            - `page` 'family' | 'connections' | 'notifications' | 'indi' | 'account', required
        - `event_name` 'dynamic_pill_clicked' | 'setup_card_tapped', required
      - `complete` boolean, required
    - `complete_count` integer, required
    - `required_count` integer, required
    - `complete` boolean, required
    - `dismissed` boolean
    - `next_step_id` string, nullable
    - `inbox_email` string, nullable
  - `clinician_name` string, nullable
  - `clinician_email` string, nullable
  - `clinic_name` string, nullable
  - `records_update_dismissed` boolean

---

[API](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles.md) - [All operations](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles/llms.txt) - [OpenAPI document](https://skmtc.dev/projectindi/apis/indi-agent-api-first-principles/revisions/25a7813e21fd?raw)
