Implementing xAPI to Support Articulate Content

Article Last Updated

This article applies to:

Implement the xAPI (Tin Can API) features described on this page to fully support Articulate content in your learning management system (LMS). Learn more about the xAPI specification.

Activity Types

Articulate content reports on the activity types detailed in the table below. Please note the expected values for the activity's parent ID (defined in the object context.contextActivities).

Activity Types

Description

Parent ID

module

Describes a single slide within a course.

The parent ID will always be the course ID.

cmi.interaction

A scored or survey question.

The parent ID will be the ID of the objective that the interaction belongs to.

objective

Articulate content groups interactions together using review slides. A review slide is defined using an xAPI objective. A course can have one or more objectives. Additionally, a review slide can also group together other review slides.

The parent ID will either be the course ID or the objective ID that it is a child of.

course

The Articulate course.

The parent ID will always be its own ID.

Verbs

XAPI provides verbs to describe user activity. Here’s a list of the verbs Articulate content uses, along with the meaning of the verbs.

Verbs

Activity Types

Description

attempted

course

Notifies the LMS that a course has begun.

experienced

module

Sent when a slide has been viewed.

progressed (Rise 360 only)

course, module, objective

Sent at the end of each lesson after the experienced statement is sent. Provides the result data for the course as well as a result extension that tracks the overall progress of the course.

answered

cmi.interaction

Denotes that a question has been answered for a survey or scored question.

completed

course, objective

Used when a course or objective has been completed and completion is based on the number of slides viewed or when completion is determined based on the completion of a survey.

passed

course, objective

Notifies the LMS that a course or objective has been completed with a passing score. This verb is only used when completion is based on a set of scored questions.

failed

course, objective

Notifies the LMS that a course or objective has been completed with a failing score. This verb is only used when completion is based on a set of scored questions.

left (Storyline only)

module

Sent when a learner leaves the slide

Note: Starting with the November 2021 update for Storyline 360, you can use triggers to define custom xAPI statements and access more verbs.

Activity Metadata

XAPI allows an activity to be defined within the tincan.xml file or directly within a statement. Articulate defines activities in both.

When posting a statement to an xAPI endpoint, the statement will reference objects defined in the tincan.xml by ID. The tincan.xml file will also contain definitions for choices, scale, source, target, and steps for the corresponding cmi.interaction type. You can find the xsd file describing the format of the tincan.xml file at: http://projecttincan.com/tincan.xsd.

Launching Public Content

You must launch Articulate content using the method described in the Incorporating an xAPI LRS into an LMS document. Articulate content can be hosted in the LMS or on an external site. By default, the published tincan.xml will be configured to launch locally. To launch Articulate content, use the page that’s defined in the launch tag of the course activity:

<activity id="61XkSYC1ht2_course_id" type="course">

<name lang="und">Course Title</name>

<description lang="und">Course Description</description>

<launch lang="und">index_lms.html</launch>

</activity>

You must add a query string to the URL that contains the information required to track the course. The required values include the xAPI endpoint (endpoint), the authorization token (auth), and the learner information (actor).

The query string should also include the activity ID (activity_id) and the registration (registration) if the LMS implementation requires these values when receiving requests from the content. (Rise 360 courses don't need activity_id or registration.)

Below is an example of a launch link with line breaks and without URL encoding for readability:

http://my.lms.com/TCActivityProvider/index_lms.html

?endpoint=http://my.lms.com/lrs/endpoint/

&auth=Basic OjFjMGY4NTYxNzUwOGI4YWY0NjFkNzU5MWUxMzE1ZGQ1

&actor={"name": ["First Last"], "mbox": ["mailto:firstlast@mycompany.com"]}

&activity_id=61XkSYC1ht2_course_id

&registration=760e3480-ba55-4991-94b0-01820dbd23a2

A properly URL encoded launch link will look like the following (line breaks added for readability):

http://my.lms.com/TCActivityProvider/index_lms.html

?endpoint=http%3A%2F%2Fmy.lms.com%2Flrs%2Fendpoint%2F

&auth=Basic OjFjMGY4NTYxNzUwOGI4YWY0NjFkNzU5MWUxMzE1ZGQ1

&actor=%7B%22name%22%3A%20%5B%22First%20Last%22%5D%2C%20%22mbox
%22%3A%20%5B%22mailto%3Afirstlast%40mycompany.com%22%5D%7D

&activity_id=61XkSYC1ht2_course_id

&registration=760e3480-ba55-4991-94b0-01820dbd23a2

You can also add custom parameters to the launch link’s query string. Any additional parameters will be echoed back when the content reports statements to the LMS.

Communication

Articulate content will report statements to the xAPI endpoint as described under the section Cross Origin Requests in Internet Explorer in xAPI. To summarize, if the endpoint is http://mycompany.com/TCAPI/endpoint/, then all statements will be posted to http://mycompany.com/TCAPI/endpoint/statements?statementID=. Any required headers will be added to the request data as form parameters delimited by “&.” The JSON content will also be encoded and passed in the parameter named "content." All statements will be reported in this way regardless of browser or platform.

Articulate content supports resuming content from where a user has left off. The state data is stored and retrieved by posting requests to http://mycompany.com/TCAPI/endpoint/activities/state?method=[REQUEST METHOD]. The value of [REQUEST METHOD] will be replaced with GET when retrieving the state data and PUT when storing state data. Headers and content will be sent as described above. For more information about storing and retrieving state data, refer to the section State in xAPI.

Sample Metadata and Statement Data by Question Type

Below are some sample activity definitions located in the Articulate published tincan.xml file. Following each activity description is a sample JSON statement that would be posted to the xAPI endpoint for the previously defined activity.

Multiple Choice

Metadata

<activity id="5jIOVMY3lI7.a05ae619-d0e3-4755-9cf0-c944c8861581" type="cmi.interaction">

<name lang="und">What it the third planet from the Sun</name>

<description lang="und">What it the third planet from the Sun</description>

<interactionType>choice</interactionType>

<correctResponsePatterns>

<correctResponsePattern>choice_5uToT0BW3SC</correctResponsePattern>

</correctResponsePatterns>

<choices>

<component>

<id>choice_5uToT0BW3SC</id>

<description lang="und">Earth</description>

</component>

<component>

<id>choice_5uBsa57TorE</id>

<description lang="und">Venus</description>

</component>

<component>

<id>choice_6Ft1rxqy1KK</id>

<description lang="und">Mars</description>

</component>

</choices>

</activity>

Statement JSON

{

"result":{

"success":true,

"response":"choice_5uToT0BW3SC",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"5jIOVMY3lI7.a05ae619-d0e3-4755-9cf0-c944c8861581"

}

}

 

Multiple Response

Metadata

<activity id="6Uo7vTiQ6UT.675caf81-6862-461d-b401-76a9f043435a" type="cmi.interaction">

<name lang="und">Select the planets from the list below.</name>

<description lang="und">Select the planets from the list below.</description>

<interactionType>choice</interactionType>

<correctResponsePatterns>

<correctResponsePattern>choice_5hmqro1qC5O</correctResponsePattern>

<correctResponsePattern>choice_6biJYtcdOoK</correctResponsePattern>

</correctResponsePatterns>

<choices>

<component>

<id>choice_5hmqro1qC5O</id>

<description lang="und">Mars</description>

</component>

<component>

<id>choice_6biJYtcdOoK</id>

<description lang="und">Earth</description>

</component>

<component>

<id>choice_6dt2QgKPjtn</id>

<description lang="und">Sun</description>

</component>

<component>

<id>choice_61GvRlVaXIj</id>

<description lang="und">Moon</description>

</component>

</choices>

</activity>

Statement JSON

{

"result":{

"success":true,

"response":"choice_5hmqro1qC5O[,]choice_6biJYtcdOoK",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"6Uo7vTiQ6UT.675caf81-6862-461d-b401-76a9f043435a"

}

}

Fill in the Blank

Metadata

<activity id="6cRKIhEssyA.d7911223-2749-424f-bee8-e241f458bff3" type="cmi.interaction">

<name lang="und">What is the name of the planet that we live on?</name>

<description lang="und">What is the name of the planet that we live on?</description>

<interactionType>fill-in</interactionType>

</activity>

Statement JSON

{

"result":{

"success":true,

"response":"Earth",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"6cRKIhEssyA.d7911223-2749-424f-bee8-e241f458bff3"

}

}

 

Matching

Metadata

<activity id="5cgcNZPuHSe.a7450fa0-c56b-4bbf-8716-30e987a55d4d" type="cmi.interaction">

<name lang="und">Match the planets to their descriptions.</name>

<description lang="und">Match the planets to their descriptions.</description>

<interactionType>matching</interactionType>

<correctResponsePatterns>

<correctResponsePattern>statement_6MoQIzOkywp[.]choice_6dxw50J12qb</correctResponsePattern>

<correctResponsePattern>statement_6X5pMavJIqb[.]choice_5bjMcpSQbu1</correctResponsePattern>

<correctResponsePattern>statement_5rBWGPPX93B[.]choice_6JkGvbQYq5y</correctResponsePattern>

</correctResponsePatterns>

<source>

<component>

<id>statement_6MoQIzOkywp</id>

<description lang="und">The planet we live on</description>

</component>

<component>

<id>statement_6X5pMavJIqb</id>

<description lang="und">The closest planet to Earth</description>

</component>

<component>

<id>statement_5rBWGPPX93B</id>

<description lang="und">The closest planet to the Sun</description>

</component>

</source>

<target>

<component>

<id>choice_6dxw50J12qb</id>

<description lang="und">Earth</description>

</component>

<component>

<id>choice_5bjMcpSQbu1</id>

<description lang="und">Mars</description>

</component>

<component>

<id>choice_6JkGvbQYq5y</id>

<description lang="und">Mercury</description>

</component>

</target>

</activity>

 

Statement JSON

{

"result":{

"success":true,

"response":"statement_6MoQIzOkywp[.]choice_6dxw50J12qb[,]statement_6X5pMavJIqb[.]
choice_5bjMcpSQbu1[,]statement_5rBWGPPX93B[.]choice_6JkGvbQYq5y",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"5cgcNZPuHSe.a7450fa0-c56b-4bbf-8716-30e987a55d4d"

}

}

 

Sequence

Metadata

<activity id="6hoSx7vtpP4.6b284974-20f5-4f92-bf8b-12634c643277" type="cmi.interaction">

<name lang="und">Place the planets in order based on their average distance from the Sun.</name>

<description lang="und">Place the planets in order based on their average distance from the Sun.</description>

<interactionType>sequencing</interactionType>

<correctResponsePatterns>

<correctResponsePattern>choice_6P5Ewtr0AV5</correctResponsePattern>

<correctResponsePattern>choice_5dmhLA2lvHz</correctResponsePattern>

<correctResponsePattern>choice_61dfQpOlbpv</correctResponsePattern>

<correctResponsePattern>choice_64Or8QRyNqJ</correctResponsePattern>

<correctResponsePattern>choice_5rvv1NAWm35</correctResponsePattern>

<correctResponsePattern>choice_5ah0Ia79vPz</correctResponsePattern>

<correctResponsePattern>choice_5l5S2DnWezC</correctResponsePattern>

<correctResponsePattern>choice_6ahaFxsHDaf</correctResponsePattern>

</correctResponsePatterns>

<choices>

<component>

<id>choice_6P5Ewtr0AV5</id>

<description lang="und">Mercury</description>

</component>

<component>

<id>choice_5dmhLA2lvHz</id>

<description lang="und">Venus</description>

</component>

<component>

<id>choice_61dfQpOlbpv</id>

<description lang="und">Earth</description>

</component>

<component>

<id>choice_64Or8QRyNqJ</id>

<description lang="und">Mars</description>

</component>

<component>

<id>choice_5rvv1NAWm35</id>

<description lang="und">Jupiter</description>

</component>

<component>

<id>choice_5ah0Ia79vPz</id>

<description lang="und">Saturn</description>

</component>

<component>

<id>choice_5l5S2DnWezC</id>

<description lang="und">Uranus</description>

</component>

<component>

<id>choice_6ahaFxsHDaf</id>

<description lang="und">Neptune</description>

</component>

</choices>

</activity>

 

Statement JSON

{

"result":{

"success":true,

"response":"choice_6P5Ewtr0AV5[,]choice_5dmhLA2lvHz[,]choice_61dfQpOlbpv[,]choice_64Or8QRyNqJ[,]
choice_5rvv1NAWm35[,]choice_5ah0Ia79vPz[,]choice_5l5S2DnWezC[,]choice_6ahaFxsHDaf",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"6hoSx7vtpP4.6b284974-20f5-4f92-bf8b-12634c643277"

}

}

 

Numeric

Metadata

<activity id="5wgwpXGIaWk.8fbebd0a-0127-4a10-809e-6e3b40fd91e7" type="cmi.interaction">

<name lang="und">How many planets are in our solar system? (Not including Pluto)</name>

<description lang="und">How many planets are in our solar system? (Not including Pluto)</description>

<interactionType>numeric</interactionType>

</activity>

 

Statement JSON

{

"result":{

"success":true,

"response":"8",

"score":{

"raw":10

}

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"5wgwpXGIaWk.8fbebd0a-0127-4a10-809e-6e3b40fd91e7"

}

}

 

Likert

Metadata

<activity id="5mAuWE6HMJX.86ebc142-18dd-4d75-af5f-269f604cfbd2.Statement_5xDTWOL4BBj" type="cmi.interaction">

<name lang="und">I wish Pluto was considered still a planet.</name>

<description lang="und">I wish Pluto was considered still a planet.</description>

<interactionType>likert</interactionType>

<scale>

<component>

<id>6A0s985rUF4</id>

<description lang="und">Strongly Disagree</description>

</component>

<component>

<id>6msxh59uUS7</id>

<description lang="und">Disagree</description>

</component>

<component>

<id>5dEzjq4qsKb</id>

<description lang="und">Neutral</description>

</component>

<component>

<id>6HssioR0LFv</id>

<description lang="und">Agree</description>

</component>

<component>

<id>5xzbluTE5WB</id>

<description lang="und">Strongly Agree</description>

</component>

</scale>

</activity>

 

Statement JSON

{

"result":{

"response":"5dEzjq4qsKb"

},

"context":{

"contextActivities":{

"grouping":{

"id":"6X9uS05rLUb_course_id"

},

"parent":{

"id":"5cv16q9HG8Q"

}

},

"registration":"cd471f87-a842-4929-87e9-fde6a5360b8b"

},

"actor":{

"objectType":"Person",

"mbox":[

"mailto:myname@mycompany.com"

],

"name":[

"MyFirstName MyLastName"

]

},

"verb":"answered",

"object":{

"id":"5mAuWE6HMJX.86ebc142-18dd-4d75-af5f-269f604cfbd2.Statement_5xDTWOL4BBj"

}

}