In advancing our mission to show what you can do today with xAPI I bring you our latest experiment, Google Hangouts. This was done partially for fun and partially because we at Rustici Software actually use Hangouts a lot for our real work (and fun).

We have two distant remote employees (Me and Ben) most everyone else is in the office regularly or is close enough that they can show up as needed. With how tight we are as a company, we really like talking face to face about things or to just spend lunch watching Tim give Andy a haircut, which is a form of Tim congratulating Andy on a job well done… Referred to as ‘failure to fail.’ You might say it’s a highly personalized reward system. Either way, we all show up to watch the comedy that ensues.


Point being, in keeping us connected – Hangouts work. It would be nice to know who participated in which Hangout, to see where informal discussions are emerging around challenges and to automate sharing notes of what occurred to those who couldn’t make it.

Being that we’re a bunch of xAPI nerds (we even track our Ping Pong ladder with xAPI) it’s only fitting that our hangouts make statements. Shaun came on board a couple months ago, his first task was to get up to speed on xAPI. He jumped in to the Google developers sandbox and started building. What he came out with is very simple and can be powerful. It’s still in the sandbox as a prototype and not production ready, because it’s an experiment.
What It Does

When a person enters a hangout, a statement is made. The statement includes their Google+ id to identify the actor, the verb attended, and the object is the name of the Hangout. By default the name of the Hangout is Google Hangout. If the name of the hangout is changed, the statements will include the new name. We generate an activity ID for each unique Hangout.

Here’s an example:

    "id": "6df4f975-e19b-4341-b73a-83055c3c22cd",
    "actor": {
        "name": "Megan Bowe",
        "account": {
            "homePage": "https://plus.google.com",
            "name": "115938474913396210252"
        "objectType": "Agent"
    "verb": {
        "id": "http://adlnet.gov/expapi/verbs/attended",
        "display": {
            "en-US": "attended"
    "timestamp": "2013-04-15T00:57:04.821Z",
    "stored": "2013-04-15T00:57:06.149Z",
    "authority": {
        "account": {
            "homePage": "http://rlstest.appspot.com/",
            "name": "root"
        "objectType": "Agent"
    "voided": false,
    "object": {
        "id": "https://hangoutsapi.talkgadget.google.com/hangouts/_/4f998b514356d8615916024471187d788fe71460/1365987424817",
        "definition": {
            "name": {
                "en-US": "Marketing Huddle"
            "type": "https://talkgadget.google.com/hangouts"
        "objectType": "Activity"

Now we can identify all of the people who participated in a specific Hangout and who joined when. It’s better that statements not include extraneous data that can be derived from the collection of data. Meaning that something like adding an extension to list who else is in the hangout is extra work for no benefit, we can derive that from the collection of statements about the same Hangout. Just because you can cram a bunch of stuff in a statement doesn’t mean you should, right?

That’s it. A quick example of another thing that xAPI can help with. Get in touch with us if you want to explore this further, ask questions, or share some puns. Andy loves puns.