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
- Verbs
- Activity Metadata
- Launching Public Content
- Communication
- Sample Metadata and Statement Data by Question Type
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 ®istration=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 &activity_id=61XkSYC1ht2_course_id ®istration=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[.] "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[,] "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" } }
|