xAPI Integration

About the integration

DataCamp can integrate with an LMS or LRS that supports the xAPI standard. If an integration is active, we can send started, completion and progress statements to the xApi endpoint provided by your LMS.

Authentication

DataCamp supports two ways of authenticating to the xAPI endpoint:

  • Via basic auth, in which case a username and password is required
  • Via bearer auth, in which case a token is required

Completions sync process

DataCamp can sync content completions via xAPI. This includes completions for courses, projects, practice, assessments, certifications and course chapters. 

For every completion, an xAPI statement is sent to the LMS. Statements are synced close to real-time, which means that if a learner completes a content item on DataCamp, it can take up to a maximum of 5 minutes for the LMS to receive the corresponding completion statement. 

Started event sync process

Next to content completion events, DataCamp can also sync started events. Currently started events are only available for courses. A started event is emitted when a learner completes the first exercise in a course.

Similar to completion statements, started event statements are also sent close to real-time. 

Progress sync process

DataCamp can also send progress statements. Currently, progress statements are only sent for courses. Each time a learner completes a chapter, DataCamp sends a statement containing the percentage of the course the learner has completed.

Similar to completion and started event statements, progress statements are also sent close to real-time. 

User identifiers

To identify users in statements, two types of identifiers are possible:

  • Email: in this case, we use the email address registered on the platform for the user;
  • NameID: when SSO is enabled for your organization, you can configure your IDP to send employee IDs as the NameID. This NameID is stored on the DataCamp side and used as the user identifier for a statement.

xAPI events

DataCamp emits three xAPI verbs. The table below shows which content types each verb is emitted for. All statements are POSTed to the LRS endpoint configured during setup.

Verb Verb IRI Emitted for When
COMPLETED http://adlnet.gov/expapi/verbs/completed Courses, Course Chapters, Projects, Practice, Assessments, Certifications When a learner finishes the content item. Skipped courses (e.g. via track test-out) are not sent.
STARTED https://activitystrea.ms/schema/1.0/start Courses only When a learner completes the first exercise of a course.
PROGRESSED http://adlnet.gov/expapi/verbs/progressed Courses only Each time a learner completes a chapter; the statement reports overall course completion percentage. Sent alongside the chapter COMPLETED statement.

Statements are delivered close to real-time (≤ 5 minutes after the learning event).

Example statements

Completed — course (email actor)

{
  "actor": {
    "mbox": "mailto:learner@example.com",
    "objectType": "Agent"
  },
  "verb": {
    "id": "http://adlnet.gov/expapi/verbs/completed",
    "display": { "en-US": "COMPLETED" }
  },
  "object": {
    "id": "http://datacamp.com/course/123",
    "definition": {
      "name":        { "en-US": "Introduction to Python" },
      "description": { "en-US": "Master the basics of data analysis in Python…" },
      "type":        "http://datacamp.com/course",
      "extensions":  {
        "http://datacamp.com/topics": ["Python", "Programming"]
      }
    }
  },
  "timestamp": "2026-05-08T14:44:01.267Z"
}

Completed — course (NameID actor)

{
  "actor": {
    "account": { "name": "emp_001", "homePage": "https://www.datacamp.com" },
    "objectType": "Agent"
  },
  "verb": {
    "id": "http://adlnet.gov/expapi/verbs/completed",
    "display": { "en-US": "COMPLETED" }
  },
  "object": {
    "id": "http://datacamp.com/course/123",
    "definition": {
      "name":        { "en-US": "Introduction to Python" },
      "description": { "en-US": "Master the basics of data analysis in Python…" },
      "type":        "http://datacamp.com/course"
    }
  },
  "timestamp": "2026-05-08T14:44:01.267Z"
}

Completed — course chapter

{
  "actor": {
    "mbox": "mailto:learner@example.com",
    "objectType": "Agent"
  },
  "verb": {
    "id": "http://adlnet.gov/expapi/verbs/completed",
    "display": { "en-US": "COMPLETED" }
  },
  "object": {
    "id": "http://datacamp.com/course-chapter/412",
    "definition": {
      "name":        { "en-US": "Hello Python!" },
      "description": { "en-US": "An introduction to Python basics." },
      "type":        "http://datacamp.com/course-chapter",
      "extensions":  {
        "http://datacamp.com/parentId":          "http://datacamp.com/course/123",
        "http://datacamp.com/parentContentType": "http://datacamp.com/course"
      }
    }
  },
  "timestamp": "2026-05-08T14:48:18.740Z"
}

Completed — project / practice / assessment / certification

Identical shape to a course completion. Only the object.id and object.definition.type change, e.g.:

"object": {
  "id":   "http://datacamp.com/project/456",
  "definition": { "name": {…}, "description": {…}, "type": "http://datacamp.com/project" }
}

Started — course

{
  "actor": {
    "mbox": "mailto:learner@example.com",
    "objectType": "Agent"
  },
  "verb": {
    "id": "https://activitystrea.ms/schema/1.0/start",
    "display": { "en-US": "STARTED" }
  },
  "object": {
    "id": "http://datacamp.com/course/123",
    "definition": {
      "name":        { "en-US": "Introduction to Python" },
      "description": { "en-US": "Master the basics of data analysis in Python…" },
      "type":        "http://datacamp.com/course"
    }
  },
  "timestamp": "2026-05-08T14:44:01.267Z"
}

Progressed — course

{
  "actor": {
    "mbox": "mailto:learner@example.com",
    "objectType": "Agent"
  },
  "verb": {
    "id": "http://adlnet.gov/expapi/verbs/progressed",
    "display": { "en-US": "PROGRESSED" }
  },
  "object": {
    "id": "http://datacamp.com/course/123",
    "definition": {
      "name":        { "en-US": "Introduction to Python" },
      "description": { "en-US": "Master the basics of data analysis in Python…" },
      "type":        "http://datacamp.com/course",
      "extensions":  {
        "http://datacamp.com/percentCompleted": 75
      }
    }
  },
  "timestamp": "2026-05-08T14:50:27.571Z"
}

Prerequisites

Before setting up an xAPI integration, the following requirements must be met:

  • An active enterprise subscription on DataCamp;
  • An LMS or LRS that supports receiving xAPI statements;
  • (optional) Have SSO set up on DataCamp, and
  • If user identifiers should be NameIDs, have your IDP set up to send them in the NameID field, and have the NameID format set to “urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified

Setup

In order to set up an xAPI integration, start by configuring your LMS or LRS to receive xAPI statements from DataCamp. Furthermore, make sure credentials are created for DataCamp to authenticate to the LMS.

Next, provide DataCamp with the following information:

  • Your xAPI endpoint;
  • The credentials (username/password for basic auth or a token for bearer auth);
  • Which statements should be sent (completion, progress and/or started);
  • If completion statements should be sent, which content type completions should be included;
  • Whether e-mail addresses or NameIDs should be used as user identifiers

DataCamp will then use this information to set up and test the integration.

 

FAQ

Will a user completion be sent via xAPI if a course is skipped?

Completions for skipped courses are not sent. (Courses can be skipped as part of a track, when passing a "test-out" assessment).