xAPI Course Builder Profile (v1.1)
This xAPI Profile defines the statements sent by every course built with xAPI Course Builder:
- Course progress: opened, started, completed, and each lesson viewed
- cmi5: when a cmi5 package is launched by an LMS, the cmi5 defined statements about the AU (initialized, completed, passed, failed, terminated)
- Questions: true/false, choice, hotspot, drag-and-drop, sequencing and free-text answers, as
cmi.interactionactivities - Assessments: scored sections reported as passed or failed against a pass mark
- Feedback: star ratings and comments, following the Feedback Interaction Profile
- Video: playback following the ADL xAPI Video Profile v1.0.3
- Audio: playback following the ADL xAPI Audio Profile v1.0
Profile IRI: https://xapi.com.au/profiles/course-builder
Version IRI: https://xapi.com.au/profiles/course-builder/v1.1
Earlier versions: v1.0
You can download the machine-readable version of the profile here:
Download profile.jsonld (JSON-LD)
Identifying statements
Every statement names this profile version as a category context activity. Video and audio statements also name the ADL Video or Audio Profile.
"context": { "contextActivities": { "category": [
{
"id": "https://xapi.com.au/profiles/course-builder/v1.1",
"definition": {
"type": "http://adlnet.gov/expapi/activities/profile"
}
}
] } }
Each statement matches exactly one template, by its verb and object activity type. Unless a template says otherwise, every statement also:
- has a
timestamp, and acontext.registrationwhen the course is launched with one; - carries the course's published version in the
versioncontext extension; - has the course activity as its
parent, unless the statement is about the course itself.
Activity ids are built from the course activity id given at launch: …/lesson/{id}, …/section/{id} for assessments, and …/block/{id} for questions, feedback and media.
Statement templates
Extension names are shortened. Hover over one for its full IRI, or see the JSON-LD.
Course and lessons
| Statement | Verb / activity type | Must include |
|---|---|---|
| Course initialized The learner opened the course (xAPI launch; cmi5 launches send cmi5-initialized instead). | initializedcourse | Common rules only |
| Course started The learner started the course for the first time in this registration. | startcourse | Common rules only |
| Course completed Every lesson viewed and every graded block passed. result.success is whether all graded questions were passed. (xAPI launch; cmi5 launches send cmi5-completed instead.) | completedcourse | result.completion = trueRecommended: result.success |
| Lesson experienced The learner viewed a lesson. The latest one is read back to resume the course. | experiencedlesson | Common rules only |
cmi5 launches
| Statement | Verb / activity type | Must include |
|---|---|---|
| cmi5 initialized The AU started a session: the first statement of every cmi5 session, in any launch mode. | initializedcourse | context.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/cmi5context.extensions.sessionid |
| cmi5 completed Every lesson viewed and every graded block passed. At most once per registration. cmi5 only: an LMS launch of a cmi5 package, in Normal launch mode. | completedcourse | context.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/cmi5context.extensions.sessionidcontext.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/moveonresult.durationresult.completion = true |
| cmi5 passed Every scored assessment has a result and, together, they meet the LMS's masteryScore (or, without one, each assessment's own pass mark). At most once per registration, and never followed by failed. cmi5 only: an LMS launch of a cmi5 package, in Normal launch mode. | passedcourse | context.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/cmi5context.extensions.sessionidcontext.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/moveonresult.durationresult.success = trueresult.score.scaledRecommended: result.score.raw, context.extensions.masteryscore |
| cmi5 failed The scored assessments' combined result missed the pass mark. Sent as the session ends, since a retake can still pass. cmi5 only: an LMS launch of a cmi5 package, in Normal launch mode. | failedcourse | context.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/cmi5context.extensions.sessionidcontext.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/moveonresult.durationresult.success = falseresult.score.scaledRecommended: result.score.raw, context.extensions.masteryscore |
| cmi5 terminated The AU ended the session (Exit, or leaving the page): the last statement of the session, in any launch mode. | terminatedcourse | context.contextActivities.category[*].id includes https://w3id.org/xapi/cmi5/context/categories/cmi5context.extensions.sessionidresult.duration |
Questions and assessments
| Statement | Verb / activity type | Must include |
|---|---|---|
| Question answered Each answer submitted to a question or free-text block. Choice-style responses use the CMI [,] / [.] separators; graded questions also carry result.success. | answeredcmi.interaction | result.responseobject.definition.interactionType |
| Question passed Sent with question-answered when the answer is correct. | passedcmi.interaction | result.responseobject.definition.interactionTyperesult.success = true |
| Question failed Sent with question-answered when the answer is wrong. | failedcmi.interaction | result.responseobject.definition.interactionTyperesult.success = false |
| Assessment passed A scored assessment section was submitted and met its pass mark (cmi5 masteryscore, 0-1). | passedassessment | result.success = trueresult.completion = trueresult.score.scaledresult.score.rawresult.score.maxcontext.extensions.masteryscoreresult.extensions.answers |
| Assessment failed A scored assessment section was submitted below its pass mark. | failedassessment | result.success = falseresult.completion = trueresult.score.scaledresult.score.rawresult.score.maxcontext.extensions.masteryscoreresult.extensions.answers |
Feedback
| Statement | Verb / activity type | Must include |
|---|---|---|
| Feedback rated A star rating (0-5, half stars) from a feedback block (Feedback Interaction Profile). | ratedfeedback | result.score.rawresult.extensions.star-rating |
| Feedback commented A written comment from a feedback block, sent before its rating (Feedback Interaction Profile). | commentedfeedback | result.responseresult.extensions.comment-text |
Video
| Statement | Verb / activity type | Must include |
|---|---|---|
| Video initialized The video player loaded and is ready. | initializedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idcontext.extensions.lengthRecommended: context.extensions.completion-threshold |
| Video played Playback started or resumed. | playedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idresult.extensions.timeRecommended: context.extensions.completion-threshold, context.extensions.length |
| Video paused Playback paused. | pausedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsRecommended: context.extensions.completion-threshold |
| Video seeked The learner moved the playhead. | seekedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idresult.extensions.time-fromresult.extensions.time-toRecommended: context.extensions.completion-threshold, context.extensions.length |
| Video completed The learner played enough of the video to meet its completion threshold. At most once per session. | completedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsresult.completion = trueresult.durationRecommended: context.extensions.completion-threshold |
| Video terminated The learner left the media; ends the session. | terminatedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsRecommended: context.extensions.completion-threshold |
| Video interacted Full screen, volume, speed or captions changed: carries the full-screen + screen-size + video-playback-size, volume, speed, or cc-enabled + cc-subtitle-lang context extensions (Video Profile screenchange, volumechange, closed-captioning). | interactedvideo | context.contextActivities.category[*].id includes https://w3id.org/xapi/videocontext.extensions.session-idresult.extensions.timeRecommended: context.extensions.completion-threshold |
Audio
| Statement | Verb / activity type | Must include |
|---|---|---|
| Audio initialized The audio player loaded and is ready. | initializedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idcontext.extensions.lengthRecommended: context.extensions.completion-threshold |
| Audio played Playback started or resumed. | playedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idresult.extensions.timeRecommended: context.extensions.completion-threshold, context.extensions.length |
| Audio paused Playback paused. | pausedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsRecommended: context.extensions.completion-threshold |
| Audio seeked The learner moved the playhead. | seekedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idresult.extensions.time-fromresult.extensions.time-toRecommended: context.extensions.completion-threshold, context.extensions.length |
| Audio completed The learner played enough of the audio to meet its completion threshold. At most once per session. | completedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsresult.completion = trueresult.durationRecommended: context.extensions.completion-threshold |
| Audio terminated The learner left the media; ends the session. | terminatedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idcontext.extensions.lengthresult.extensions.timeresult.extensions.progressresult.extensions.played-segmentsRecommended: context.extensions.completion-threshold |
| Audio interacted Volume changed (Audio Profile volumechange). | interactedaudio | context.contextActivities.category[*].id includes https://w3id.org/xapi/audiocontext.extensions.session-idresult.extensions.timecontext.extensions.volumeRecommended: context.extensions.completion-threshold |
Patterns
- Course attempt (per registration, xAPI launch): opens with Course initialized, which is sent again on every relaunch, followed by any of the statements above. Course started is sent once, and Course completed once the course's requirements are met.
- cmi5 attempt (per registration, cmi5 launch): one or more sessions, each opening with cmi5 initialized and closing with cmi5 terminated (unless the session was abandoned, which the LMS records). The course's own statements, and cmi5 completed, passed or failed, fall in between. Completed and passed are sent at most once per registration; passed is never followed by failed. Only initialized and terminated are sent in Browse and Review launch modes. cmi5 statements carry the LMS's context template, including its
sessionidextension. - Video session and Audio session (per
session-id): initialized, then any of played, paused, seeked, interacted and completed, then exactly one terminated. This is the ADL Video and Audio Profiles' general pattern. Video sends completed once, when 95% has been watched (thecompletion-thresholdextension).
Concepts defined by this profile
- Course version (ContextExtension):
https://w3id.org/xapi/course-builder/extensions/version
The published version label of the course that sent the statement. The player reads it back to decide whether a saved place or assessment result still applies. - Assessment answers (ResultExtension):
https://w3id.org/xapi/course-builder/result-extensions/answers
On a scored assessment's passed/failed statement: each question block id mapped to whether the learner's first answer was correct.
Everything else is reused from other profiles. Verbs:
http://adlnet.gov/expapi/verbs/initializedhttp://activitystrea.ms/schema/1.0/starthttp://adlnet.gov/expapi/verbs/completedhttp://adlnet.gov/expapi/verbs/passedhttp://adlnet.gov/expapi/verbs/failedhttp://adlnet.gov/expapi/verbs/terminatedhttp://adlnet.gov/expapi/verbs/experiencedhttp://adlnet.gov/expapi/verbs/answeredhttps://w3id.org/xapi/acrossx/verbs/ratedhttps://w3id.org/xapi/adb/verbs/commentedhttps://w3id.org/xapi/video/verbs/playedhttps://w3id.org/xapi/video/verbs/pausedhttps://w3id.org/xapi/video/verbs/seekedhttp://adlnet.gov/expapi/verbs/interacted
Activity types:
http://adlnet.gov/expapi/activities/coursehttp://adlnet.gov/expapi/activities/lessonhttp://adlnet.gov/expapi/activities/cmi.interactionhttp://adlnet.gov/expapi/activities/assessmenthttps://xapi.com.au/activities/feedbackhttps://w3id.org/xapi/video/activity-type/videohttps://w3id.org/xapi/audio/activity-type/audio
Per-course profiles
Each exported course package includes its own xapi-profile.jsonld, which contains just the templates and patterns that course's blocks use. Alongside it, xapi-activities.json lists each lesson, assessment and tracked block, with the templates it sends.