> ## Documentation Index
> Fetch the complete documentation index at: https://docs.myustadia.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflows

> Preset and no-preset course creation flows, end to end

The API is organized around two creation paths. Both end at the same place: a generated multi-module video course delivered via signed asset URLs.

## Option A: Preset flow (recommended for recurring clients)

Create a preset once per client company. Reuse it for every course you build for that company.

```
1.  POST   /api/v1/presets                          Create preset
2.  POST   /api/v1/presets/{id}/brand-assets        Upload logo + brand colors
3.  POST   /api/v1/presets/{id}/brand/generate      AI derives color palette (synchronous, returns artifact immediately)
4.  POST   /api/v1/presets/{id}/brand/approve
5.  POST   /api/v1/presets/{id}/slide-style/generate  (async, returns 202, poll setup-status)
6.  GET    /api/v1/presets/{id}/setup-status          Poll until slide_style = ready
7.  POST   /api/v1/presets/{id}/slide-style/approve
8.  POST   /api/v1/presets/{id}/voice-style/generate  (async, returns 202, poll setup-status)
9.  GET    /api/v1/presets/{id}/setup-status          Poll until voice_style = ready
10. POST   /api/v1/presets/{id}/voice-style/approve
11. POST   /api/v1/presets/{id}/questions/start        (company presets only)
12. GET    /api/v1/presets/{id}/questions/next         loop: get question
13. POST   /api/v1/presets/{id}/questions/answers      loop: answer
14. POST   /api/v1/presets/{id}/questions/validate
15. POST   /api/v1/presets/{id}/questions/approve      preset is now ready

    All `questions/*` and `brief/*` endpoints accept `?language=fr|en`
    (default `fr`). Prompts, help text, option labels and field labels
    are localized; English is full parity with French.

16. POST   /api/v1/presets/{id}/courses               Create course under the preset
17. GET    /api/v1/courses/{id}/brief/next            loop: get brief question
18. POST   /api/v1/courses/{id}/brief/answers         loop: answer
19. POST   /api/v1/courses/{id}/brief/validate
20. POST   /api/v1/courses/{id}/launch                (Idempotency-Key required)
21. GET    /api/v1/courses/{id}/status                poll until ready
22. GET    /api/v1/courses/{id}/modules/{n}/video     fetch deliverables
```

Steps 1 to 15 are the **one-time preset setup**. Steps 16 to 22 are the **per-course flow**.

Once a preset exists, every new course for that company is six API calls (16 to 21) plus delivery fetches.

### Preset types

Presets are created with a `preset_type` field:

| `preset_type`       | Description                                                                                     | Questionnaire required?                                      |
| ------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| `company` (default) | Full sales-profile preset capturing the client's buyer persona, pricing model, and sales motion | Yes (steps 11-15)                                            |
| `theme`             | Visual/voice branding only, no sales-profile questionnaire                                      | No (skip steps 11-15; preset reaches `ready` on brand alone) |

A `theme` preset is useful when you need consistent branding across courses but do not need a per-company sales profile.

### What gates preset readiness

A preset reaches `ready` status when:

* `company` preset: brand artifact approved **and** profile questionnaire approved.
* `theme` preset: brand artifact approved.

`slide-style` and `voice-style` are **optional** refinements. Approving them improves generation quality but is not required for the preset to reach `ready`.

## Option B: No-preset flow (quick start)

For one-off courses or low-volume use, skip the preset entirely. The brand is auto-derived from the source material.

```
1.  POST   /api/v1/courses/no-preset                  Create course (brand auto-derived)
2.  GET    /api/v1/courses/{id}/brief/next            loop
3.  POST   /api/v1/courses/{id}/brief/answers         loop
4.  POST   /api/v1/courses/{id}/brief/validate
5.  POST   /api/v1/courses/{id}/launch                (Idempotency-Key required)
6.  GET    /api/v1/courses/{id}/status                poll
7.  GET    /api/v1/courses/{id}/modules/{n}/video     fetch deliverables
```

Use this for [the quickstart](/quickstart).

## When to use which

| Use case                                              | Recommended path                   |
| ----------------------------------------------------- | ---------------------------------- |
| One-off course for a single client                    | No-preset                          |
| Internal proof-of-concept                             | No-preset                          |
| Multiple courses for the same company                 | Preset                             |
| White-label LMS that serves many clients              | Preset, one per client             |
| ARESS-style scale (many companies, recurring courses) | Preset, with full setup automation |

You can mix and match: nothing prevents creating no-preset courses on an account that also has presets.

## Brief vs preset questions

Two questionnaires exist in the API, do not confuse them:

* **Preset questions** (Option A only) capture the company's sales profile: industry, target buyer persona, pricing model, sales motion. Asked once per preset.
* **Brief questions** (both options) capture this course's intent: target audience, learning objectives, tone. Asked once per course.

Both use the same `next` + `answers` loop pattern.

## Review checkpoints

By default the pipeline pauses for human approval at up to three checkpoints during generation. See [Review Checkpoints](/review-checkpoints) for the full model.

## Async setup operations

Slide style and voice style generation are queued operations. They return `202 Accepted` immediately. Poll `GET /api/v1/presets/{id}/setup-status` until each artifact reaches `ready` status before proceeding.

**Brand generation is synchronous.** `POST /api/v1/presets/{id}/brand/generate` returns the artifact directly in the response body. There is no need to poll setup-status after brand/generate.

```json theme={null}
{
  "brand":       {"status": "ready"},
  "slide_style": {"status": "running"},
  "voice_style": {"status": "queued"}
}
```

Possible statuses: `queued`, `running`, `ready`, `failed`.
