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.
Create the course
A course starts as a draft. Only a title is required.
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.
{
"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"
}export COURSE_ID="b6f0c1e2-3a4b-4c5d-8e9f-0a1b2c3d4e5f"Add a module
Lessons live inside modules — a course is modules, and each module is an ordered list of lessons. Omit position to append.
curl -X POST "$TALENT_API/courses/$COURSE_ID/modules" \
-H "Authorization: Bearer $TALENT_KEY" \
-H "Content-Type: application/json" \
-d '{ "title": "Getting started" }'export MODULE_ID="…" # the id from the responseAdd 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).
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.
Publish
Publishing makes the course assignable. The gate: a course needs at least one module with at least one lesson — you have exactly that.
curl -X POST "$TALENT_API/courses/$COURSE_ID/publish" \
-H "Authorization: Bearer $TALENT_KEY"The course comes back published, with published_at set.
{
"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.