---
title: "Submit a completed onboarding session"
method: POST
path: "/api/onboarding/sessions/{sessionId}/submit"
tags: ["Onboarding"]
---

# Submit a completed onboarding session

`POST /api/onboarding/sessions/{sessionId}/submit`

Validates all required path fields, marks the onboarding session submitted, syncs Attio, and returns a hosted Stripe Checkout URL for paid self-serve offers. Account provisioning happens from the Stripe webhook after payment.

## Path parameters

- `sessionId` string, required

## Request body

- SubmitRequest
  - `answers` Answers
  - `draftState` OnboardingSession
    - `sessionId` string, required
    - `path` 'prescriber' | 'developer' | 'clinic' | 'enterprise' | 'platform' | 'other', required — Public onboarding path id. Prefer `/onboard?type={id}` for new human links. Legacy `/onboard#{id}` and `/onboard#{id}-{payment_plan_tier}` links remain supported.
    - `status` 'draft' | 'identified' | 'submitted', required
    - `lastStep` string, required
    - `identifiedEmail` string, email
    - `submittedAt` string, date-time
    - `provisioningStatus` 'pending' | 'completed' | 'failed' | 'not_applicable'
    - `paymentStatus` 'not_required' | 'payment_required' | 'checkout_open' | 'paid' | 'failed' | 'expired'
    - `provisioningInviteUrl` string, uri
    - `provisioningFailureReason` union
      - string
      - object
        - `message` string
        - `debugMessage` string
    - `paymentPlanTier` string — Business tier / Stripe pricing plan lookup key.
    - `paymentPlanName` string — Display name returned by the billing catalog.
    - `paymentPlanDescription` string — Short display description returned by the billing catalog.
    - `paymentPrice` number — Monthly Checkout price in USD dollars.
    - `paymentIncludedMonthlyOrders` number — Included monthly order volume for the plan.
    - `paymentOveragePrice` number — Per-order overage price in USD dollars.
    - `stripeCustomerId` string
    - `stripeSubscriptionId` string
    - `attioEntryId` string
    - `attioPersonRecordId` string
  - `leadToken` string
  - `turnstileToken` string — Cloudflare Turnstile token. Required when both Turnstile keys are configured.

## Response `200`

Submitted onboarding session.

- object
  - `data` object, required
    - `flow` OnboardingSession, required
      - `sessionId` string, required
      - `path` 'prescriber' | 'developer' | 'clinic' | 'enterprise' | 'platform' | 'other', required — Public onboarding path id. Prefer `/onboard?type={id}` for new human links. Legacy `/onboard#{id}` and `/onboard#{id}-{payment_plan_tier}` links remain supported.
      - `status` 'draft' | 'identified' | 'submitted', required
      - `lastStep` string, required
      - `identifiedEmail` string, email
      - `submittedAt` string, date-time
      - `provisioningStatus` 'pending' | 'completed' | 'failed' | 'not_applicable'
      - `paymentStatus` 'not_required' | 'payment_required' | 'checkout_open' | 'paid' | 'failed' | 'expired'
      - `provisioningInviteUrl` string, uri
      - `provisioningFailureReason` union
        - string
        - object
          - `message` string
          - `debugMessage` string
      - `paymentPlanTier` string — Business tier / Stripe pricing plan lookup key.
      - `paymentPlanName` string — Display name returned by the billing catalog.
      - `paymentPlanDescription` string — Short display description returned by the billing catalog.
      - `paymentPrice` number — Monthly Checkout price in USD dollars.
      - `paymentIncludedMonthlyOrders` number — Included monthly order volume for the plan.
      - `paymentOveragePrice` number — Per-order overage price in USD dollars.
      - `stripeCustomerId` string
      - `stripeSubscriptionId` string
      - `attioEntryId` string
      - `attioPersonRecordId` string
    - `session` OnboardingSession, required
      - `sessionId` string, required
      - `path` 'prescriber' | 'developer' | 'clinic' | 'enterprise' | 'platform' | 'other', required — Public onboarding path id. Prefer `/onboard?type={id}` for new human links. Legacy `/onboard#{id}` and `/onboard#{id}-{payment_plan_tier}` links remain supported.
      - `status` 'draft' | 'identified' | 'submitted', required
      - `lastStep` string, required
      - `identifiedEmail` string, email
      - `submittedAt` string, date-time
      - `provisioningStatus` 'pending' | 'completed' | 'failed' | 'not_applicable'
      - `paymentStatus` 'not_required' | 'payment_required' | 'checkout_open' | 'paid' | 'failed' | 'expired'
      - `provisioningInviteUrl` string, uri
      - `provisioningFailureReason` union
        - string
        - object
          - `message` string
          - `debugMessage` string
      - `paymentPlanTier` string — Business tier / Stripe pricing plan lookup key.
      - `paymentPlanName` string — Display name returned by the billing catalog.
      - `paymentPlanDescription` string — Short display description returned by the billing catalog.
      - `paymentPrice` number — Monthly Checkout price in USD dollars.
      - `paymentIncludedMonthlyOrders` number — Included monthly order volume for the plan.
      - `paymentOveragePrice` number — Per-order overage price in USD dollars.
      - `stripeCustomerId` string
      - `stripeSubscriptionId` string
      - `attioEntryId` string
      - `attioPersonRecordId` string
    - `leadToken` string, required
    - `answers` Answers, required
    - `checkoutUrl` string, uri, nullable
    - `result` ProvisioningResult
      - `status` 'completed' | 'failed' | 'handoff_required' | 'pending'
      - `message` string
      - `data` object
        - `invite` object
          - `id` string
          - `email` string, email
          - `url` string, uri

## Other responses

- `401` — Request failed.
- `422` — Validation failed. The response includes inline field errors and the step that needs attention.

---

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