Create your first course

Build a course, give it a lesson, and publish it — entirely over HTTP. You’ll need an API key with the courses:write and courses:read permissions, and the $TALENT_API and $TALENT_KEY variables from the overview.

01

Create the course

A course starts as a draft. Only a title is required.

Shell
curl -X POST "$TALENT_API/courses" \
  -H "Authorization: Bearer $TALENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Onboarding 101",
    "description": "Everything a new hire needs in week one."
  }'

The response is the new course. Keep its id — every step below hangs off it.

201 Created
{
  "id": "b6f0c1e2-3a4b-4c5d-8e9f-0a1b2c3d4e5f",
  "title": "Onboarding 101",
  "description": "Everything a new hire needs in week one.",
  "status": "draft",
  "published_at": null,
  "created_at": "2026-07-24T17:02:11.482Z",
  "updated_at": "2026-07-24T17:02:11.482Z"
}
Shell
export COURSE_ID="b6f0c1e2-3a4b-4c5d-8e9f-0a1b2c3d4e5f"
02

Add a module

Lessons live inside modules — a course is modules, and each module is an ordered list of lessons. Omit position to append.

Shell
curl -X POST "$TALENT_API/courses/$COURSE_ID/modules" \
  -H "Authorization: Bearer $TALENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Getting started" }'
Shell
export MODULE_ID="…"   # the id from the response
03

Add a lesson

Lessons come in two kinds — a page, which holds text, video, files, and embeds together, or a quiz. A page’s content.doc is a document JSON blob (an empty document is fine to start).

Shell
curl -X POST "$TALENT_API/modules/$MODULE_ID/lessons" \
  -H "Authorization: Bearer $TALENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "page",
    "title": "Welcome to the team",
    "content": {
      "doc": {
        "type": "doc",
        "content": [
          {
            "type": "paragraph",
            "content": [
              { "type": "text", "text": "Welcome to the team. This lesson covers what to expect in week one." }
            ]
          }
        ]
      }
    }
  }'

The dashboard editor builds this document as you type — press / to open the insert menu and add a video, file, image, or embed.

04

Publish

Publishing makes the course assignable. The gate: a course needs at least one module with at least one lesson — you have exactly that.

Shell
curl -X POST "$TALENT_API/courses/$COURSE_ID/publish" \
  -H "Authorization: Bearer $TALENT_KEY"

The course comes back published, with published_at set.

200 OK
{
  "id": "b6f0c1e2-3a4b-4c5d-8e9f-0a1b2c3d4e5f",
  "title": "Onboarding 101",
  "status": "published",
  "published_at": "2026-07-24T17:04:56.930Z",
  "…": "…"
}

Publishing an empty course returns 409 with code course_not_publishable. Add a lesson and try again.

Next

Enroll a learner with POST /enrollments (a course_id and a user_id), then have Talent tell you the moment they finish — receive your first webhook. Every field and endpoint is in the API reference.