Implementing Tin Can to support Articulate content.

Implement the Tin Can API features described on this page to fully support Articulate content in your learning management system (LMS).
View the complete Tin Can API 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 a Tin Can 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

The Tin Can API 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.

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.

Activity Metadata

The Tin Can API allows an activity to be defined within the tincan.xml file or directly within a statement. Articulate defines activities in the tincan.xml file.

When posting a statement to the Tin Can 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://beta.projecttincan.com/tincan.xsd.

Launching Public Content

You must launch Articulate content using the method described in the Incorporating a Tin Can 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">story.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 Tin Can 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. Below is an example of a launch link with line breaks and without URL encoding for readability:

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

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

&auth=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/story.html

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

&auth=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.

Launching Private Content

Articulate Mobile Player supports the playback of private content when content is launched as described in the Private Content Access and Tin Can document. When launching private content, the LMS should construct the launch URL as described in the section Launching Public Content, but with two additional parameters: content_endpoint and content_token. If the launch URL defines a content_token, Articulate Mobile Player will request content resources directly from the content endpoint relative to the path of the launch page. If a content token is specified, but a content endpoint is not, the TCAPI endpoint with the postfix "content/" will be used as the content endpoint.

For instance, if the content endpoint is:

http://my.lms.com/TCActivityProvider/content_endpoint/

and the content token is:

b50607fb-956e-429f-b89e-388c43dbbbcf

a request for the file data.swf located in the story_content folder would look like

http://my.lms.com/TCActivityProvider/content_endpoint/story_content/data.swf?content_token=b50607fb-956e-429f-b89e-388c43dbbbcf

When a page is requested in such a manner, after validating the request based on the content token, the server should either issue a 301 redirect to the URL where the content can be accessed or handle GET, HEAD, and OPTIONS requests according to the HTTP 1.1 specification. No other authentication schemes should be enforced on the content endpoint other than the validation of the content token.

Communication

Articulate content will report statements to the Tin Can endpoint as described under the section Cross Origin Requests in Internet Explorer in the Tin Can API. To summarize, if the endpoint is http://mycompany.com/TCAPI/endpoint/, then all statements will be posted to http://mycompany.com/TCAPI/endpoint/statements?method=PUT. 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 the Tin Can API.

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 Tin Can endpoint for the previously defined activity. You can find the published project used for these samples here.

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"

}

}


Mutliple 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"

}

}

Articulate E-Learning Blogs

The Rapid E-learning BlogPractical, real world tips for e-learning success. Word of Mouth: The Articulate BlogThe inside scoop for Articulate news and product updates. Community BlogsGet the scoop directly from e-learning heroes.
×
Products
Storyline vs. Studio. Find the software that works for you.