xAPI / LRS integration
Forward learning activity statements to any xAPI Learning Record Store, configured per organization, with the exact statement schemas sent.
Last reviewed
Scormbusters can forward learning activity to any xAPI-compatible Learning Record Store (LRS). This lets you aggregate data from Scormbusters alongside other tools in a central LRS for reporting and analytics.
Table of contents
What is xAPI?
xAPI (Experience API, also called "Tin Can") is a standard for recording learning activity as statements — structured JSON objects in the form *"actor did verb to object."* Statements are stored in an LRS.
Example: "Alice completed Lesson 1 in Safety Training, scoring 85 out of 100."
xAPI is especially useful if you need:
- A single analytics view across multiple learning tools
- Long-term compliance records
- Custom reporting beyond what Scormbusters' built-in analytics provides
Configuration
Settings → xAPI / LRS (owner only)
| Field | Description |
|---|---|
| LRS Endpoint | Base URL of your LRS, e.g. https://lrs.yourcompany.com/xapi — must be HTTPS |
| Auth token | Credentials in username:password format — sent as Basic authorization header |
Click Test connection to verify Scormbusters can reach your LRS before saving.
Once configured, all lesson completions and course completions are forwarded automatically. There is nothing to enable per-course.
Security: The LRS endpoint is validated server-side. Private IP ranges (localhost, 10.x, 192.168.x, etc.) are blocked to prevent server-side request forgery.
Statements sent
Scormbusters sends two types of xAPI statements:
| Event | Verb | Activity type |
|---|---|---|
| Learner completes a lesson | completed | lesson |
| Learner passes a course | passed | course |
| Learner fails a course | failed | course |
| Learner finishes a course with no scored content | completed | course |
Statements are sent best-effort — if the LRS is unreachable, the error is logged but the learner's session is not interrupted.
Statement schemas
All statements use xAPI 1.0.3.
Lesson completed
{
"actor": {
"objectType": "Agent",
"name": "Alice Smith",
"mbox": "mailto:alice@company.com"
},
"verb": {
"id": "http://adlnet.gov/expapi/verbs/completed",
"display": { "en-US": "completed" }
},
"object": {
"objectType": "Activity",
"id": "https://yourdomain.com/courses/<courseId>/lessons/<lessonId>",
"definition": {
"name": { "en-US": "Introduction to Safety Procedures" },
"type": "http://adlnet.gov/expapi/activities/lesson"
}
},
"result": {
"completion": true,
"score": {
"raw": 85,
"max": 100,
"scaled": 0.85
}
},
"context": {
"contextActivities": {
"parent": [
{
"objectType": "Activity",
"id": "https://yourdomain.com/courses/<courseId>"
}
]
}
},
"timestamp": "2026-04-21T14:10:00.000Z"
}result.score is omitted if the lesson has no scored content.
Course passed
{
"actor": {
"objectType": "Agent",
"name": "Alice Smith",
"mbox": "mailto:alice@company.com"
},
"verb": {
"id": "http://adlnet.gov/expapi/verbs/passed",
"display": { "en-US": "passed" }
},
"object": {
"objectType": "Activity",
"id": "https://yourdomain.com/courses/<courseId>",
"definition": {
"name": { "en-US": "Safety Training Fundamentals" },
"type": "http://adlnet.gov/expapi/activities/course"
}
},
"result": {
"completion": true,
"success": true,
"score": {
"raw": 85,
"max": 100,
"scaled": 0.85
}
},
"timestamp": "2026-04-21T14:20:00.000Z"
}For a failed course, the verb is http://adlnet.gov/expapi/verbs/failed and result.success is false.
For a course with no scored content, the verb is completed and result.score is omitted.
Actor resolution
The actor name comes from the learner's full_name in their Scormbusters profile (falls back to "Learner" if not set). The mbox is their email address.
Supported LRS providers
Scormbusters has been tested with the following LRS providers:
| Provider | Notes |
|---|---|
| SCORM Cloud | Widely used, free tier available |
| Watershed | Strong analytics and reporting |
| Learning Locker | Open source, self-hostable |
| Veracity | Enterprise-focused |
Any LRS that implements the xAPI 1.0.3 specification and accepts statements via POST /statements with Basic authentication will work.