---
title: "Complete Onboarding"
method: POST
path: "/v1/me/onboarding"
tags: ["identity"]
---

# Complete Onboarding

`POST /v1/me/onboarding`

## Request

- Base URL: `https://api.usekeel.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.usekeel.io/v1/me/onboarding`
- Auth: none declared

Record onboarding PROVISIONING for the current principal's org.

This endpoint provisions only — it stamps ``onboarding.provisioned_at``.
The app's "don't re-run onboarding" gates read provisioned_at (falling
back to the legacy ``onboarding_completed`` for existing orgs).

It no longer stamps ``onboarding_completed``: genuine completion is REAL
activation (a typed chat message), stamped server-side by
``sync_activation_completion`` at /v1/me — never off a plan pick or a
backtest click (Q-0852; cohort F-03-2/F-13-8). The ``completed`` field is
retained for wire-compatibility with older clients but no longer carries
completion semantics.

Idempotent (Q-1761): a repeated or overlapping call keeps the FIRST
``provisioned_at`` and every recorded ``onboarding`` key the request does
not carry (``onboarding_records.stamp_provisioning``).

## Headers

- `Authorization` string, nullable
- `X-Org-Id` string, nullable

## Request body

- CompleteOnboardingRequest: Request body for POST /v1/me/onboarding. This endpoint provisions only — it stamps ``onboarding.provisioned_at``. Genuine completion (``onboarding_completed``) is real activation (a typed chat message) and is stamped server-side at /v1/me (Q-0852). ``completed`` is retained for wire-compatibility with older clients but no longer carries completion semantics.
  - `onboarding` object, nullable
  - `completed` boolean

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/usekeel/apis/keel-api.md) · [All operations](https://skmtc.dev/usekeel/apis/keel-api/llms.txt) · [OpenAPI document](https://skmtc.dev/usekeel/apis/keel-api/revisions/3191ca10b0ab?raw)
