Building a course¶
Courses in PlusPlus are SCORM-compatible packages that track learner progress. The flow:
- Create the course content item.
- Upload the SCORM ZIP.
- Configure passing thresholds.
- Publish.
1. Create the course¶
curl -X POST https://acme.plusplus.app/public_api/v2/courses \
-H "Authorization: Bearer pp_your_token_here" \
-H "Content-Type: application/json" \
-d '{
"name": "Security 101",
"duration_minutes": 30,
"is_hidden": true,
"passing_score": 80
}'
{
"data": {
"public_id": "01HXYC0ND9F3K2M6PXJW1ASQTV",
"name": "Security 101",
"passing_score": 80,
"is_hidden": true,
"package": null
}
}
2. Request an upload URL for the SCORM package¶
curl -X POST https://acme.plusplus.app/public_api/v2/courses/01HXYC0ND9F3K2M6PXJW1ASQTV/uploads \
-H "Authorization: Bearer pp_your_token_here"
{
"data": {
"upload_id": "upl_scorm_xyz",
"upload_url": "https://uploads.plusplus.app/scorm/...",
"expires_at": "2026-04-29T13:00:00Z"
}
}
3. Upload the ZIP¶
PlusPlus validates the package on the server side. If validation fails, polling the course will surface the error in the package.status field.
4. Wait for the package to be processed¶
curl https://acme.plusplus.app/public_api/v2/courses/01HXYC0ND9F3K2M6PXJW1ASQTV \
-H "Authorization: Bearer pp_your_token_here"
{
"data": {
"public_id": "01HXYC0ND9F3K2M6PXJW1ASQTV",
"package": {
"status": "ready",
"manifest_version": "scorm_1_2"
}
}
}
If status is failed, the response includes a package.error field describing the issue. Common causes: missing imsmanifest.xml, malformed manifest, or unsupported SCORM version.
5. Publish¶
curl -X PATCH https://acme.plusplus.app/public_api/v2/courses/01HXYC0ND9F3K2M6PXJW1ASQTV \
-H "Authorization: Bearer pp_your_token_here" \
-H "Content-Type: application/json" \
-d '{ "is_hidden": false }'
Tracking learner progress¶
Once a user completes the course, you can read their results via the Course Registrations endpoints:
curl "https://acme.plusplus.app/public_api/v2/course-registrations?content=01HXYC0ND9F3K2M6PXJW1ASQTV" \
-H "Authorization: Bearer pp_your_token_here"
course-registrations is read-only — to assign, complete, drop, or exempt a user, use the Assignments endpoints.