Skip to main content
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 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:
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.
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):
{
  "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.
# 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:
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.
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.
curl "https://api.myustadia.com/api/v1/courses/$COURSE_ID/status" \
  -H "Authorization: Bearer sk_test_..."
Response (truncated):
{
  "status": "ready",
  "progress": [...],
  "current_step": "complete"
}

7. Fetch the deliverables

Once status is ready, pull signed asset URLs:
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:
curl -L "https://api.myustadia.com/api/v1/courses/$COURSE_ID/download" \
  -H "Authorization: Bearer sk_test_..." \
  -o course.zip

Next steps

Switch to presets

For recurring clients, create a reusable preset (brand, voice, sales profile) instead of re-deriving it per course.

Enable webhooks

Subscribe to course.ready and course.failed events instead of polling.

Full API reference

Every endpoint, every parameter, with try-it-now.

Move to production

Switch your sk_test_ for sk_live_ once your integration is solid.