---
title: "Onboarding Setup"
method: POST
path: "/onboarding/setup"
tags: ["onboarding"]
---

# Onboarding Setup

`POST /onboarding/setup`

## Request

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

First-run setup: create the user's channel + style from a YouTube link or
a preset, then kick off ONE free style analysis for the YouTube path.

This runs BEFORE the paywall. A brand-new user is inactive with zero
credits, so the analysis is queued billing-bypassed (charge_credits=False —
the same path BYOK uses) and we eat its few-cent cost. Channel creation is
allowed for inactive users by the loosened limit trigger (migration 0146);
everything else (generation) stays gated behind an active plan.

Idempotent for resume/retry: reuses the user's existing onboarding channel
(the free plan caps them at one) and only re-queues analysis when the style
hasn't been analysed yet.

An ACTIVE subscriber can run it too (the /app/onboarding?preview=1 walk-
through): they get a fresh channel and a normally-billed analysis — exactly
what the /styles flow would charge — so nothing here is free for a paying
account, and the resume logic (which assumes the single free-plan channel)
is skipped for them.

## Request body

- OnboardingSetupRequest
  - `youtube_url` string, nullable
  - `presets` object, nullable

## Response `200`

Successful Response

- OnboardingSetupResponse
  - `channel_id` string, required
  - `style_id` string, required

## Other responses

- `422`: Validation Error

---

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