Update: The Output of Project Tin Can is Experience API.

next generation scorm evolution project tin can

Ready to really dive in?
View the full
Tin Can API spec.

View the Tin Can API
“quick start” guide.

Next Steps

Our prototypes have been online for a while, and you can tinker with them all you like.

What’s new? Well, the Tin Can API is now baked into all of our products. SCORM Engine lets you have an installed LRS, SCORM Driver lets your content generate Tin Can statements that are delivered to an LRS, and SCORM Cloud now contains a hosted LRS.

Several products and companies are already using the Tin Can API. We’ve created a new page devoted to the Tin Can API. It contains some good explanations and some good resources for developers. Move over to TinCanAPI.com for more information about working with the Tin Can API.

Working with our samples and our prototypes

The easiest way to see the Tin Can API in action today is to use some sample courses that we’ve created (or your own courses) to generate Tin Can statements to our public (beta) LRS, or to the SCORM Cloud LRS. Run these courses from your own computer or on your own web server, and start reporting “I did this” statements to SCORM Cloud or the beta LRS.

You also have the option of creating Tin Can Packages (similar to SCORM or AICC packages) and importing them directly into SCORM Cloud. Remember, Tin Can is still in beta so don’t rely on it for any sensitive information just yet.

Here are two ways that you can easily experiment with the Tin Can API today.

1. The old-fashioned way with a new twist

You can download our sample courses, zip them up just like you would a SCO, and import them into SCORM Cloud. From there you can play them, invite learners to experience them, and use them similar to a SCO. These aren’t SCOs though, they’re Tin Can packages, and they’re reporting “I did this” statements to your SCORM Cloud account.

See How

Download our sample Tin Can courses
and use them to SCORM Cloud

2. The way of the future

The real power of Tin Can begins to show itself when you realize that content doesn’t have to be imported to an LMS. Content can live wherever you want it to. This opens up loads of new possibilities and gets rid of a lot of the limitations of SCORM.

You can download our sample prototype and run it on your machine or on a web server. You can configure it to report Tin Can statements to our public LRS or to your SCORM Cloud account — and it’s easy.

Learn How

Download our prototypes and configure
them to send Tin Can statements to
the LRS or to your SCORM Cloud account.


Want your own content to start reporting statements to your SCORM Cloud account or the public LRS?

If you want to be one of the first to start using the Tin Can API with your content, we’ll work with you to make it happen. You’ll help shape the future of e-learning, and we’d also like to feature you in our upcoming presentation at mLearnCon.

Email us, and we’ll help you adopt Tin Can.


Did we get it right?

We still need your input, collaboration, and discussions about problems and solutions with the Tin Can API. If there is any particular feature or problem regarding Tin Can that you want to discuss, find the appropriate section on the capabilities or weaknesses page, and let your voice be heard.

  • Tim Bobo

    I like everything I saw here. Nice work. I did not read everything completely, but I did not see anything about certified or timed training – where the company hosting the LRS is taking on some sort of legal requirement for verifying the training.

    How would the LRS be able to verify things like this? They would need to be able to verify both the training and the user. Is there an option for certain types of training to have to be authenticated as to start time, etc? I can see a specific LRS certifying training coming from verified courses, which control the timing, etc. But how would you set up some sort of value / key pair so that you could verify submitted training data was only coming from a verified application… and not a hack. And have some sort of verification of user identity also.

    Again, this all may be here. I did not have time to read it all. But it die not stand out to me.

  • glenn

    I’m not sure if this is covered, but if not I think it really needs to be. We need a way that activities that happen in parallel between 2 or more learners can be connected. Consider a simulation where two learners are working in an interaction but playing different roles. One learner does something which directly affects the other learner’s options or lack there of. The reporting needs a way to connect this information so that it can be shown that the 2nd learner’s options were altered based on decisions made by the first learner.

  • Anonymous

    Hi Glenn,

    What you’re describing is covered — the capability is there though best practices are not defined.

    Two key capabilities here are the ability to store context for a statement (statement.context), and the fact that any ‘actor’ can be a team, since since actor is a friend of a friend (FOAF) actor, and FOAF defines either group or person as subclasses of actor.

    Therefore, the impact of one learner’s actions on another can be reported specifically by referencing a statement about learner 1 in the relevant statement about learner 2. More generally, if two learners are acting as part of a team, statements can be made about the team, and learner statements can be assigned context of the team itself and/or those team statements.

    Due to the options here, a generic reporting system won’t be able to do more than indicate that there is some relationship between such statements. To get more specific, the author of the simulation could release a tool to query the statement API and provide more intelligence about what those relationships mean.

  • Anonymous

    Hi Tim,

    We had only been considering either validation of content or of learner. Each statement has an ‘asserter’ logged with it, the specified asserter is checked by the LRS against the credentials used when storing the statement.

    We had envisioned that in the case the training was asserting a statement about a learner, if the LRS trusted the training, it would trust the training to validate the learner’s identity as well. I can see how that might not meet regulatory or legal requirements though.

    We intend for there to be a SOAP/XML binding as well as a REST/JSON binding, and this ‘multiple asserter’ scenario seems like something that XML signatures could help with when that binding is done. Also, we can look at the work that is being done on JSON signatures: http://jsonenc.info/jss/1.0/ .

    So, this is an area where more work is needed.

  • Dan Gray

    Really happy with the direction of TinCan form what I can see here and from reading the API doc. One obvious application of such a spec is to create an LRS as service and allow external LMS apps to hit an API. Any chance you guys might be interested in building one? This might help kick start some building and get people kicking this idea around – if only in sandbox for now.

  • Mike Rustici

    Hi Dan,


    We will be releasing the prototypes we developed for Project Tin Can very shortly. One of those prototypes is a functional LRS that can be used for development. We will most likely provide a hosted instance of that for people to play around with. Sign up to be notified when they are ready with the form above.

    As far as the future goes, we can only guess where this will lead us (both “us” as the industry and “us” as Rustici Software). An independent LRS would certainly be a likely candidate for Rustici Software’s product roadmap. It would be a good successor to our independent SCORM player offerings right now (Engine and Cloud). Should people start to embrace Project Tin Can I think it would be a good bet that we’ll move in that direction.


  • Dan Gray

    The prototype is really nice guys – well done. Pleasantly surprised to see Mongo and Node used. Have you considered wether TC will cover content packaging/sequencing at all? I realise that you’ve kept TC as close to a simple communication protocol as you can, and it allows nicely simple api between activities, LRS and LMS. I’m not sure that sequencing even should be in this mix really, but can see how it may end up in the grey area between lms and activity (ie. ‘who should handle the nav?’ …)

  • Stephane

    I have just found out about project tin can last night and it really seems that this standard benefited from practical thought.

    My mostly positive feedback is the removal of the aggregation model, the sequencing all the “hey you are in this SCO, you can’t query that other SCO !”. And also all the value-less operations like initialize, commit, finish – it was the origin of many bad implementation built around “state tracking” with asynchronous problems, i have seen my cmi_score set_values associated with the wrong SCO many times on different platforms.

    There are still a few things that I will look into :
    – the “simple data query” model might make some quite obvious operations non-trivial : for example, you want to know how many time you read a page ? what’s the percentage of pages you read in this module ? the accumulated time spent on reading a page ? Of course the AP can retrieve a huge amount of data from the LRS and do all the computation from here just to display what should be a trivial value, but that does not seem the optimal way to do it ?

    – the lack of reverse query might limit the interactivity. You cant query the AP from the LRS : is there a way to know “who is reading this page NOW ?”. Or for example “user A commented this page, let’s broadcast the comment to everyone using this AP !”

    – security : i think I’m just being misled by the golf example. In this one you can see the score being sent from the very untrustworthy web browser / client computer. But i guess the AP can be a server side webpage that compute the score itself and send it to the LRS, without exposing more that the answer choice to the learner input ? (assuming the LRS can get the learner credentials from the LMS)

    – as much as anyone love web 2.0, webservices, servers, clouds and everything, I believe that some users would be grateful if the AP could still optionally be a zip-like package that you just have to upload to the LMS, hosting them to a different server can add some complexity. Allowing the AP concept as both “it’s just a metaphysical abstract entity” and “hey, but if you want it’s a simple zip file like a SCORM package”, it could ease the transition.



    PS: its impossible to comment on the “weaknesses” page

  • Arran

    Replying to this as it appears to be the only discussion started about FOAF. The current use of FOAF within TinCan appears to be very unstandard in terms of serialization. RDF/JSON appears to be the only well-known JSON serialization, but you don’t appear to be using it. Will this change?

  • Nigel

    Beware being too web browser oriented, I am developing for cheap devices and need specialist clients for acceptable performance. Tin Can is perfect solution in my environment! Authentication of learner and activity across platforms and networks is a key requirement. Do not create a dependence on profit making services (or potentially exploitable services). This includes domain name registrars, number controllers, key issuers etc. Because these will only provide services that are profitable – not services that are needed. Best to bundle all the support infrastructure including API/standards into one not-for-profit global organisation that is protected from takeover.

  • Pingback: The ToolBar #14: Phoning it In - eLearning, Tin Can w/ Aaron Silvers()

  • Knut Richard

    Extremely interesting. Can’t wait to start using the features!

  • IMHO This is THE tool that can/will drive innovation in the future! Connecting real people to their passions!