SCORM packages
Host a SCORM package and play it as-is — no conversion. An uploaded package becomes a course (type: "scorm") with the normal share, embed, and tracking machinery: learners play the original package exactly as it was authored, and completion, score, and time land on the same tracking objects as any other course.
How it works
Hosting a package is a three-step flow:
- Request a signed upload URL and
PUTthe package zip to it. - Create the course from the upload — validation and extraction run asynchronously.
- Poll the status endpoint until the package is
ready(orfailedwith a reason).
Once ready, deliver it like any course: the share link plays it for learners, or issue an embed URL with POST /embed/scorm. Each embed learner arrives with your identifier, so playback is attributed and billed per tenant exactly like course embeds. Learner results come back through the standard Tracking API.
Supported packages
- SCORM 1.2 and SCORM 2004 (3rd/4th Edition), single-SCO or simple multi-SCO.
- Packages that rely on SCORM 2004 sequencing rules (activity trees, rollup rules, global objectives) are rejected at upload with a clear reason rather than played incorrectly. Standard exports from tools like Articulate Rise and Storyline are fine — their default sequencing boilerplate is supported.
- Uploads are zip files, up to 200 MB per package by default.
What a SCORM course doesn't do
A hosted package is never editable: it can't be opened in a builder, translated, or re-exported as SCORM. The original zip is always downloadable byte-for-byte instead.
Request an upload URL Add-on
Returns a signed URL and an upload hash. PUT the zip bytes to the URL with Content-Type: application/zip, then pass the hash to the create endpoint. The signed URL expires after one hour.
/v1/headless/scorm-package/uploadParameter metadata is unavailable for this endpoint, but request examples are still shown.
Create a hosted SCORM course Add-on
Creates the course from an uploaded package. The response returns immediately with the new courseId and a package status of uploaded — manifest validation and content extraction run in the background, typically completing in under a minute. The course title comes from the package manifest once processing finishes.
/v1/headless/scorm-packageParameter metadata is unavailable for this endpoint, but request examples are still shown.
Get processing status Add-on
Poll this endpoint after creating the course. status moves through:
uploaded→ queued for processing.processing→ validating and extracting.ready→ playable;launchdescribes the package's SCOs.failed→ rejected or errored;erroris a human-readable reason anderrorCodea machine code.
Rejection codes:
no_manifest— the zip has noimsmanifest.xml.unsupported_version— not SCORM 1.2 or 2004.no_launchable_sco— no launchable SCO resource, or its launch file is missing from the zip.sequencing_present— the package uses SCORM 2004 sequencing rules, which aren't supported.not_zip,zip_bomb,too_many_files,unsafe_paths— the archive itself is invalid or unsafe.
A rejection is terminal: fix the package in your authoring tool and upload it again (which creates a new course), or convert it into an editable course with the Generate API instead.
/v1/headless/scorm-package/{courseId}Parameter metadata is unavailable for this endpoint, but request examples are still shown.
Download the original package Add-on
Returns a short-lived download URL for the original uploaded zip, byte-for-byte. This is the replacement for SCORM export on hosted packages.
/v1/headless/scorm-package/{courseId}/downloadParameter metadata is unavailable for this endpoint, but request examples are still shown.
Issue a SCORM embed URL Add-on
Issues a signed embed URL for a hosted SCORM course, following the same pattern as POST /embed/course. With action: "view" (the default) the learner plays the package; their progress is recorded against the identifier you pass. With action: "edit" the embed shows a read-only package overview for the uploader — there is no builder for SCORM courses.
A learner who leaves mid-package resumes where they left off on their next launch (suspend data and location persist per learner).
/v1/headless/embed/scormParameter metadata is unavailable for this endpoint, but request examples are still shown.