cmi5 Content
Who this guide is for: Tenant administrators who upload and manage cmi5 (xAPI) course packages in EmbayLMS.
cmi5 is the modern xAPI-based packaging standard. Unlike SCORM (which runs entirely in the browser), a cmi5 package’s Assignable Units (AUs) report progress as xAPI statements to a Learning Record Store (LRS). EmbayLMS includes a built-in LRS, so cmi5 packages work out of the box — no external LRS to configure.
Uploading a cmi5 package
- Open Courses, pick a course, and open the Modules tab.
- Click + Add module, give it a title and choose the type cmi5 Package (xAPI).
- Upload the package .zip with the module’s Upload button. EmbayLMS checks that the zip is a cmi5 package — a
cmi5.xmlcourse structure at the root that declares at least one AU — parses the AUs, and stores them. - Publish the course version.
If the package is not a cmi5 package
The upload is refused before anything is stored and the module says why, so you can fix the export rather than discover the problem when a learner launches it:
| Message | What it means |
|---|---|
This is not a cmi5 package: no cmi5.xml course structure was found at the root of the zip. | You uploaded a SCORM, xAPI-only or plain-content zip. Re-export from your authoring tool as cmi5 — or, if the file really is SCORM, change the module type to SCORM Package. |
The cmi5.xml in this package could not be read, or it declares no assignable unit (AU). | The course structure is present but malformed or empty. Open it in a text editor: it needs a <course> and at least one <au> with a <url>. |
A refused upload leaves nothing behind — no asset, no file — so you can simply upload again.
A cmi5 zip uploaded to a SCORM Package module still works: the module is reclassified as cmi5 on upload. Choosing the right type up front is what gives you the checks above.
The package is virus-scanned and its files are served from the same content pipeline as SCORM.
What a cmi5 package contains
| Part | Meaning |
|---|---|
cmi5.xml | The course structure: the course and its list of AUs |
| AU | An Assignable Unit — a launchable lesson with its own launch URL and completion rule (moveOn) |
moveOn | When the AU counts as satisfied: Completed, Passed, CompletedOrPassed, CompletedAndPassed, or NotApplicable |
How learners take it
- On the course player, the learner opens the cmi5 module. EmbayLMS prepares the launch (registration, launch data, a signed session token) and opens the AU in a frame.
- The AU tracks the learner and reports xAPI statements (
initialized,completed,passed, …) back to the built-in LRS. - Multi-AU packages show a unit picker; a green check marks each satisfied unit.
- When the learner exits a unit (the AU’s own Exit button), the frame shows a short This unit is closed — your progress is saved notice. The learner picks another unit or moves on. The AU never reloads the course player inside its frame.
- The module completes when every AU meets its
moveOnrule. For a single-AU course that’s immediate on completion; for a multi-course package the learner must finish all units (including, e.g., a final quiz that requires both completed and passed).
Completion flows into course progress and certificates exactly like any other module.
Configuration reference
| Item | Where | Notes |
|---|---|---|
| Module type | Course editor → Modules | Set to cmi5 |
| Package | Upload on the module | .zip containing cmi5.xml |
CMI5_TOKEN_SECRET | Platform env (optional) | Signs AU session tokens; falls back to NEXTAUTH_SECRET |
There is no external LRS to set up — the LRS endpoints (/api/v1/cmi5/…) are built in and authenticate each AU with a per-session token.
Troubleshooting
| Symptom | Cause / fix |
|---|---|
| Upload refused: not a cmi5 package / could not be read | See If the package is not a cmi5 package above. The check runs on upload; nothing was stored. |
| Module won’t launch after an older upload | Packages uploaded before 2026-09-10 were not checked on upload. Re-upload the package: the check now runs and tells you what is wrong. |
| The type picker has no cmi5 Package (xAPI) entry | Your session predates the update — sign out and back in. |
| Learner finishes a unit but the module isn’t complete | Multi-AU packages complete only when every unit is satisfied. Check the unit picker for any without a green check — a quiz unit set to CompletedAndPassed needs both a completed and a passed. |
| The sidebar check appears a few seconds after the learner exits the last unit | Expected. Completion is decided on the server from the AU’s statements; the player re-checks as soon as a unit exits (and every 30 seconds while the tab is open), then updates without a reload. |
| Progress isn’t recording | Confirm the learner is actively enrolled and launched from the course player (the AU needs the session the player provides). |
| ”Unauthorized” in the AU | The session token expired (12h) — reopen the module to get a fresh launch. |
Standards note
EmbayLMS supports SCORM 1.1, SCORM 1.2, SCORM 2004, cmi5, and AICC (HACP). See the AICC Content guide for AICC packages.