> ## 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.

# Quickstart

> Generate your first course in under 10 minutes using a sandbox key (free)

This walkthrough gets you from zero to a fully generated course using the no-preset flow and sandbox keys. Sandbox runs do not consume quota and complete immediately.

## 1. Get your sandbox API key

API keys are provisioned by the MyUstadia team. They are not self-service.

Email [sales@myustadia.com](mailto:sales@myustadia.com) to request access. Once approved, you receive two keys:

* `sk_test_...` for sandbox (free, returns the canonical demo course)
* `sk_live_...` for production (consumes quota)

Use the `sk_test_` key throughout this quickstart.

## 2. Disable review checkpoints (optional, one-time)

By default the pipeline pauses for human review at up to three checkpoints. To run unattended, set the account to auto-approve once:

```bash theme={null}
curl -X POST "https://api.myustadia.com/api/v1/account/review-settings/all-auto" \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{"auto_approve": true}'
```

## 3. Create the course

The no-preset flow auto-derives a brand from the source material, skipping the preset setup.

```bash theme={null}
curl -X POST "https://api.myustadia.com/api/v1/courses/no-preset" \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "language": "fr",
    "source_urls": ["https://acme.com/sales-playbook"]
  }'
```

Response (truncated):

```json theme={null}
{
  "id": "20260623_103000_abc123",
  "status": "awaiting_brief",
  "language": "fr"
}
```

Save the `id`. You will reference it as `COURSE_ID` for the rest of the flow.

## 4. Answer the brief

The brief is a server-driven questionnaire. Fetch the next question, submit an answer, repeat until `brief/next` returns no question.

```bash theme={null}
# Fetch the next question
curl "https://api.myustadia.com/api/v1/courses/$COURSE_ID/brief/next" \
  -H "Authorization: Bearer sk_test_..."

# Submit an answer
curl -X POST "https://api.myustadia.com/api/v1/courses/$COURSE_ID/brief/answers" \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{"answers": [{"question_id": "target_audience", "value": "Field sales reps"}]}'
```

When the brief is complete, validate it:

```bash theme={null}
curl -X POST "https://api.myustadia.com/api/v1/courses/$COURSE_ID/brief/validate" \
  -H "Authorization: Bearer sk_test_..."
```

## 5. Launch generation

Launch requires a unique `Idempotency-Key` header. Sending the same key twice returns the existing course rather than starting a second run.

```bash theme={null}
curl -X POST "https://api.myustadia.com/api/v1/courses/$COURSE_ID/launch" \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: launch-$(uuidgen)"
```

## 6. Poll for status

In sandbox mode, status flips to `ready` on the first poll. In production, expect 5 to 15 minutes depending on module count.

```bash theme={null}
curl "https://api.myustadia.com/api/v1/courses/$COURSE_ID/status" \
  -H "Authorization: Bearer sk_test_..."
```

Response (truncated):

```json theme={null}
{
  "status": "ready",
  "progress": [...],
  "current_step": "complete"
}
```

## 7. Fetch the deliverables

Once `status` is `ready`, pull signed asset URLs:

```bash theme={null}
curl "https://api.myustadia.com/api/v1/courses/$COURSE_ID/assets" \
  -H "Authorization: Bearer sk_test_..."
```

Response includes signed URLs for videos (24-hour TTL), slide PDFs and notes (15-minute TTL).

Alternatively, download the entire course bundle as a ZIP:

```bash theme={null}
curl -L "https://api.myustadia.com/api/v1/courses/$COURSE_ID/download" \
  -H "Authorization: Bearer sk_test_..." \
  -o course.zip
```

## Next steps

<CardGroup cols={2}>
  <Card title="Switch to presets" icon="layer-group" href="/workflows">
    For recurring clients, create a reusable preset (brand, voice, sales profile) instead of re-deriving it per course.
  </Card>

  <Card title="Enable webhooks" icon="bell" href="/webhooks">
    Subscribe to `course.ready` and `course.failed` events instead of polling.
  </Card>

  <Card title="Full API reference" icon="code" href="/api-reference/introduction">
    Every endpoint, every parameter, with try-it-now.
  </Card>

  <Card title="Move to production" icon="rocket" href="/authentication#live-keys">
    Switch your `sk_test_` for `sk_live_` once your integration is solid.
  </Card>
</CardGroup>
