Docs
arrow_back Embeddables

Course Builder Build and above

The Course Builder is a full course authoring experience, embedded in your product. Use it when your customers, partners, or admins need to build their own training and that creation should happen inside your platform. The example below loads a sample course into the builder so you can see how the authoring experience looks in context.

It's common for partner enablement tools, platforms that let other companies create their own training, and any product where people are creating content. If course authoring needs to feel like a native feature of your product, this is the embeddable that gets you there quickly.

Classic

Classic is the original screen-by-screen editor. Everything else on this page is the course builder. The same POST /v1/headless/embed/course edit embed loads either one. options.legacy is the API switch. The live demo header toggles that same flag.

Course BuilderClassic
options.legacyfalseomit or true
Authoring UIBlock layouts and start/finish covers. flow: "ai" with no courseId opens the create-course agent over an empty Course Builder course.Original screen-by-screen course editor.
courseIdOmit it to lazy-create a blank Course Builder course. A supplied id with omitted legacy auto-routes by Course.legacy. Explicit legacy: false still requires a Builder 2 course.Omit it to lazy-create a Classic stub. A supplied id with omitted legacy auto-routes by Course.legacy. Explicit legacy: true still requires a Classic course.

On edit with a supplied courseId, omitted options.legacy routes to the course’s current builder. An explicit legacy that does not match the course is still rejected. Lazy-create (no courseId) still uses the flag to stamp the new course. Player (view) embeds do not apply this gate.

Let authors migrate Classic courses

Set options.migration: true when issuing a writable course edit embed to show “Migrate to new builder”. It is off by default. Authors can preview Builder 2, cancel back to Classic, or commit, without leaving the iframe. A preview survives reload. After committing, the same embed URL opens Builder 2 even if its original legacy claim selected Classic.

When issuing new URLs for courses that may migrate, omit options.legacy; an explicit flag that no longer matches the course still returns an error. Readonly, player and screen embeds cannot migrate courses.

Let authors migrate Classic courses

Set options.migration: true when issuing a writable course edit embed to show the Classic builder's Migrate button. The option defaults to false. It does not enable migration in readonly, preview-only, player, or screen embeds.

POST /v1/headless/embed/course · request body
{
  "action": "edit",
  "courseId": 123,
  "identifier": "your-user-id",
  "clientIdentifier": "your-tenant-id",
  "options": {
    "migration": true
  }
}

Authors can try Builder 2 inside the same iframe, then cancel to restore Classic or confirm to keep Builder 2. Reloading during a preview preserves the try flow. After confirmation, the original embed URL opens the migrated course in Builder 2. Migration keeps the course ID and does not publish the draft.

Omit options.legacy when issuing subsequent URLs for an existing course so the embed follows its current builder. An explicit builder flag that does not match the course is rejected when issuing a new URL. The shared sample-course demo is readonly, so its Migrate button remains hidden even with this option enabled.

For migrations controlled by your application, use the single-course API or batch API with status polling and optional email.

API Endpoint

POST/v1/headless/embed/course

Body parameters

FieldTypeExampleDescriptionDemo Value
actionstringedit——
identifierstringyour-user-id——
clientIdentifierstringyour-tenant-id——
themeIdnumberFor a course this embed creates (action "edit", no courseId), Classic and new builder: the course starts with the default Brand Kit theme of the client passed as clientIdentifier; with no clientIdentifier it uses the workspace default; a client with no default theme gets no theme (no fallback to the workspace). A themeId on the request wins and is saved on the new course. On an existing course, themeId only styles that embed session.
options.flowpreviewaigeneratetransformconvertaiInitial creation flow. "preview" locks preview-only chrome on whichever builder `legacy` selects. "ai" with legacy=false opens the create-course agent over an empty Course Builder course.
options.backeventhiddennativeeventBack button behaviour.
options.translationsbooleanfalseEnable translation features.
options.googleDrivebooleantrueEnable Google Drive import.
options.oneDrivebooleantrueEnable OneDrive import.
options.loombooleanfalseEnable Loom video recording.
options.feedbackbooleantrueEnable course feedback screen.
options.publishingbooleanfalseEnable publish controls.
options.narrationsbooleanfalseEnable AI narrations.
options.aibooleantrueEnable AI-powered features.
options.legacybooleantrueSelects Classic (omit or true) or the course builder (false) when lazy-creating. The live demo header is the same control. On edit with a supplied courseId, omit this flag to auto-route by Course.legacy; an explicit value must still match that course.
options.migrationbooleanfalseShow the Classic migration button and preview/confirm flow in writable course edit embeds. Disabled for readonly and preview-only embeds; the shared sample-course demo is readonly.
TypeEventDescriptionNotes
sessionreadyFires when the course builder is mounted and ready.
sessionerrorFires when an error occurs in the builder.
sessionexpiredFires when the session expires.
courseupdatedFires when a course is updated.
back—Fires when the Back button is clicked.

Live Demo