---
title: "Onboarding checklist progress"
method: GET
path: "/v1/onboarding-progress"
tags: ["onboarding"]
---

# Onboarding checklist progress

`GET /v1/onboarding-progress`

## Request

- Base URL: `https://api.patricia.app` (the document declares no server; this is the origin it was published from)
- URL: `https://api.patricia.app/v1/onboarding-progress`
- Auth: HTTP bearer

Tenant-scoped per-step completion for the Home onboarding checklist: whether Slack is connected, the company profile is set up, Patricia is in a channel, the user connected a non-Slack tool, the user gave Patricia a task, and the team was grown, plus `all_done`. Each step is derived truthfully from stored data and is only `true` from a real signal. Requires `tenant:read`.

## Headers

- `X-Tenant-Id` string, nullable

## Response `200`

Successful Response

- OnboardingProgressResponse: Per-step onboarding completion for the caller's workspace. Every field is a truthful, tenant-scoped signal: ``false`` whenever the underlying data is absent (a step is never assumed complete). ``all_done`` is the AND of every step except ``calendar`` (optional by design, see the module docstring), so the dashboard can hide the checklist once the workspace is fully set up rather than showing a stale 100%.
  - `slack` boolean, required: A Slack platform installation exists (Patricia's chat bot is installed).
  - `microsoft_teams` boolean, required: A Microsoft Teams platform installation exists (Patricia's chat bot is installed). Named in full so it cannot be misread as the `team` step, which reports whether other people joined the workspace.
  - `chat_platform` 'slack' | 'microsoft_teams' | 'not_yet', required: The chat platform a workspace has installed, or ``not_yet`` when it has installed neither. Spelled in full so it cannot be misread as the ``team`` step, which is about membership.
  - `chat_platform_to_connect` 'slack' | 'microsoft_teams', required: Which chat platform this workspace is being asked to connect: the one it has installed, else the one it signed up through. Always a real platform, because every connect CTA, skip key and wizard chat step has to name one even before anything is installed. Reports what to OFFER, never what is connected (`chat_platform` answers that).
  - `company` boolean, required: The company profile holds real content: the website was analyzed, or somebody filled in something anywhere in the Brand Kit (details, voice, words, colours, typography, or a logo in any slot and mode). The seeded brand-kit baseline, add-on and theme toggles, and a bare website URL on its own do not count.
  - `channels` boolean, required: Patricia is in at least one live Slack or Microsoft Teams channel, private ones included.
  - `tools` boolean, required: At least one active non-Slack integration account the user connected (Patricia-managed auto-provisioned accounts don't count).
  - `first_task` boolean, required: The user gave Patricia a task: a human-directed run (mention/dm/message/manual) or a live scheduled task the user created.
  - `team` boolean, required: More than one active member, or a pending invitation exists.
  - `calendar` boolean, required: A live Google or Outlook calendar exists that someone connected, kept personal or shared with the team. Meeting auto-join reads a calendar for the person who connected it. A Patricia-managed account that nobody connected does not count. Reported as a step but excluded from all_done, because connecting a calendar is optional.
  - `chat_step` 'chat_platform' | 'slack' | 'microsoft_teams', required: The one chat step this workspace has to finish: the chooser, or a platform's connect screen. Always a real step, whatever else is outstanding, so a caller that only wants the chat step does not have to walk :class:`OnboardingResumeStep` past ``company`` and ``tools`` to find it.
  - `skipped` OnboardingSkipStep[], required: Onboarding steps the workspace chose to skip: company, tools, calendar, use_case, or team, sorted by name.
  - `resume_step` 'company' | 'tools' | 'calendar' | 'use_case' | 'integrations' | 'ai_tools' | 'chat_platform' | 'slack' | 'microsoft_teams' | 'done', required
  - `all_done` boolean, required: True when every step above except calendar is complete (lets the dashboard hide the card; the optional calendar step must not pin it open).

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)
- `404`: Not found
- `422`: Validation error

---

[API](https://skmtc.dev/patricia/apis/patricia-api.md) · [All operations](https://skmtc.dev/patricia/apis/patricia-api/llms.txt) · [OpenAPI document](https://skmtc.dev/patricia/apis/patricia-api/revisions/0dfb44495ea1?raw)
