Introduction
Thanks for the interest in SCORM Cloud! This document should serve as a good starting point for integrating the service into your own system. What you'll find below is a brief conceptual overview, an outline of the key steps in running a minimal SCORM Cloud integration (which includes links to a demo application written in .NET), and a full listing of the SCORM Cloud web services API.
Conceptual Overview
Before you read any more, we should let you know we're assuming a couple things about you. (Don't worry, it's nothing personal, so don't take it personally.) Firstly, we assume you have a basic idea of what SCORM Cloud is. If not, we have some excellent starting points for you on the SCORM Cloud page of our website. Secondly, with the first assumption out of the way, we assume that the key goal of you, the reader, is to integrate SCORM Cloud into your own system, with the ultimate goal of leveraging the benefits and adding the value of SCORM compatibility to your product or service. Another assumption we're making is that you are a developer, or at least technically proficient, and that you are familiar with ideas like web services, software as a service, and have some experience in or knowledge about programming and developing software.
At this point, you probably already know that SCORM Cloud is a hosted player that provides best-in-class SCORM compatibility. You may or may not already know however, that this player and the data that it uses can be accessed and manipulated programmatically over the web. (Neat, right?!) Taking this a step further, this programmatic access has been exposed with the goal of allowing you to build SCORM compatibility into your own system, and we provide varying levels of customization (based on your willingness to tackle the technical details.) This integration, in it's simplest form, would mean that your system will use the web services to import SCORM content to our servers, create registrations for this course for your users, launch those registrations by directing the user to our player, and finally collect and analyze the results of their learning experience. (We'll show how to do each of those things below in the Quick Start section.)
No matter how simple or complex, the key concept of a successful integration with SCORM Cloud is that your system and SCORM Cloud should be tightly integrated, but loosely coupled. The SCORM Cloud services work best when they are tied together with your system at a data level via courseId / learnerId / registrationId, and there is a one to one correspondence of courses, learners, and registrations in our system and your own. This means that the basic entities that you create / register in SCORM Cloud should always exist in your own system as well as ours. There is good reason to bias an integration with SCORM Cloud towards this style / architecture, because it allows much more flexibility over time on just how you would like things to work with your user and course data.
While we have service calls that fetch data (in addition to registering data), and we may, in the future, take on the responsibility of keeping more user information, it will only be able to serve limited purposes and hold only limited information, since we can't add any custom field asked of us. But if the user / course / registration information you need is kept in your system, you can evolve the data and behavior of that entity in your system in any way you'd like over time, and simply tie that entity to SCORM Cloud via the learnerId / courseId / registrationId. On the other side of that boundry or tie, we can evolve the data and behavior of the learner's data and experience as it pertains to taking the actual course, and tracking and reporting their registration data (score, completion, success, total time, the way the learner took the course, the answers they gave to certain questions, and much more). In the case of integration with our API, a bias towards "owning" most of the data in your learning system will leave you in more control over time, and allow your custom logic to shine, and you'll only need a few small well defined integration points to SCORM Cloud to take advantage of what we do best, which is provide a stellar SCORM player and track useful / compelling reporting data to go along with it.
Quick Start
Signup
First, the SCORM Cloud service needs to know who you are. Have you already signed up for an account? The trial is free, and exploring the features provided in the website is a great way to get to know our product before bringing some of those features into your own system. Let’s assume that’s all done and you know what you’re getting into.
What you need for identification, at a technical, web service level, is what we call an AppId. That’s short for Application Id, which is really all that our web service wants to know about you (don’t take offense, it’s just that it doesn’t like mixing personal details in with business, you know). You get one of these AppId’s at signup, and you can also create more yourself. To see them, check out the “Apps” page in your SCORM Cloud account online (you can access the page with the “Apps” button on the left side menu).
The idea here is that for each Application you may integrate with SCORM Cloud, you’ll have a different AppId, so that you can keep track of the relationship of data from your application to ours. So what you’ll want from the Apps page, whether you’d like to use the default one provided or create a new pair, is an AppId and the SecretKey that goes along with it, which you’ll use to identify your system. Oh, and of course you’ll also want to know where the web services actually live, which is at http://cloud.scorm.com/api. (Sometimes you’ll see this last piece of info, the web service location, called the ServiceURL in code, only without the api, such that the client will be configured with a ServiceURL of simply http://cloud.scorm.com).
Download
The services for SCORM Cloud are provided in your application code via a client library, which are currently available for .NET, Java, and PHP, and can be downloaded here on the SCORM Cloud development homepage. Below, we'll also reference the .NET Demo Application for examples, which you can also download at the SCORM Cloud development homepage or directly from this support forum post. (In the case of the .NET demo application, you'll want the .NET client library, which is packaged with the demo application). The very first thing you'll want to do is make sure you've got the client library available in your application code (for a .NET application, this is done either by bringing the project into your VS solution or referencing the compiled DLL for it).
Initialize
Once you're ready to use the library in your application, the first step is to make sure it is configured when your application initializes. (In the demo app, this is done in the Application_Start method in the file Global.asax.cs. There we set the AppId, SecretKey, and Services Url for the client library, so that it knows where to access SCORM Cloud services and what account to access them under.) In your own application, at initialization time, you'll want to do something like this:
ScormCloud.Configuration = new RusticiSoftware.HostedEngine.Client.Configuration([your services url], [your app id], [your secret key]);
Once the library is configured, you don't have to worry about those values anymore and you can start calling methods and interacting with SCORM Cloud. Here's how you'd do so...
Import
The client libraries include an easy to use call that simply takes the path to a course zip on the calling machine, like so:
ScormCloud.CourseService.ImportCourse([your course id here], [absolute path to course zip here]);
We ask the user to specify the course id in order to allow them to attach it to meaningful data in their own system. Normally this means the creating the record for the package in your own system first, then importing into ours, and conditionally rolling back if necessary. Below is some pseudo code that reflects this practice:
... file to import is present on your server (has been posted from the user or otherwise) ... ... the absolute path to this file is called filepath below ... courseid = fetch_new_course_id() title = POST['title'] difficulty = POST['difficulty'] //this is just an example of a field that might //be specific to your system, SCORM Cloud doesn't know //or track difficulty add_course_to_local_system(courseid, title, difficulty) try: ScormCloud.CourseService.ImportCourse(courseid, filepath) catch error: remove_course_with_id_from_local_system(courseid) report_error(error)
In the psuedo code above, the difficulty field is an example of a field specific to your own system. By tying your local record to a the package you import with SCORM Cloud using the courseid parameter, you can keep track of and organize your SCORM packages using any custom logic you can come up with in your own system, and only worry about SCORM Cloud when it comes time to reference the course in other SCORM Cloud API calls, like when previewing or creating registrations against this course.
Create Registration
Once the course is imported, you can use the course id in subsequent library calls to create registrations for the course. (In the demo app, we create registrations when sending out the invitation to a course. You can see the call in SendLearning.aspx.cs around line 82 or so.) The simplest version of this call looks like this:
ScormCloud.RegistrationService.CreateRegistration([registration id], [course id], [learner id], [learner first name], [learner last name]);
Again, each id supplied to this call should coincide with a record in your own database, to which you might attach more data, or which you can later use to look up information about the course/registration at a later time.
Launch Registration
Now, with a registration created against our course, we can launch that registration, by redirecting the user's browser to the location returned by ScormCloud.RegistrationService.GetLaunchUrl. There is one caveat here, which is that this URL should be fetched moments before the user is redirected, as opposed to generated and placed on a link on a page where it might sit for some time. (In the demo app, we have a link that points to Launch.aspx, which in turn does the above and fetches the launch URL from ScormCloud.RegistrationService.GetLaunchUrl, then redirects the user.) In it's simplest form the code looks like this:
String launchUrl = ScormCloud.RegistrationService.GetLaunchUrl([registration id], [redirect on exit url]); Response.Redirect(launchUrl);
Above, the registration id should refer to a registration that you've created, and the redirect on exit url parameter should point to the URL you would like the user to end up at when the course exits. The other idea behind the redirect on exit url parameter is to use that location as an opportunity to fetch the registration information, such as completion, success, score, and total time spent in the course. To do that, you can add the registration id onto the end of the redirect on exit url, and it will be available as a parameter when the user exits the course and goes to that location.
Fetch Registration Results
At any rate, you'll want to fetch some information about the registration when it has completed, in order to do any sort of reporting about them. You can get the "big four" pieces of data referred to above (completion, success, score, total time) by making a call to GetRegistrationSummary. (We do this in the demo app in LearningSent.aspx.cs around line 54.) The simplest version of this call looks like this:
RegistrationSummary summary = ScormCloud.RegistrationService.GetRegistrationSummary([registration id]);
You'll typically want to save the summary data into your own database, so that you can refer to it when reporting, as opposed to fetching the summary for registrations every time from us over the network, which can be very slow. As noted above, the best practice here would be to include the registration id as a parameter on the redirect-on-exit URL (specified at launch time), and then using the above call to GetRegistrationSummary using that registration id parameter. That way you can fetch the results right then when the user exits and feel assured that what you fetched is also what we have recorded.
Explore
That's the basic path to import, register, and launch. But the SCORM Cloud API exposes a lot more functionality beyond the basics. And beyond the API, other possibilities are open by using the site we've built on top of the service, which you can find by pointing your browser at http://cloud.scorm.com. Also, if you're looking to explore our reporting application, Reportage, alongside the SCORM Cloud API, make sure you check out the Reportage Integration Documentation as well . Let us know what you think, and what you discover as you explore further by sending an email to support@scorm.com.
Below you'll find the technical details of the SCORM Cloud web service API, along with a full listing of the available methods we expose. The details and format of the communication with our web services is largely abstracted by our client libraries, which attempt to provide the remote services as local method calls. However, as the API expands, you might find that the client library you're using is missing one of the calls below you'd like to use. In this case, our advice is, give a try at implementing it! Since the calling format is always the same, it's pretty easy to copy the calling mechanism from another method, and while most of the XML formats of results differ between calls, parsing them is very similar. If you make a change you think we should know about, please let us know! We'd love to get your help in making the client libraries and the web services even better!
Web Service Communication Format
This section exposes some of the more "nitty gritty" details of our web services, which are normally hidden by the client libraries we've made available. If you're looking to see what's going on under the hood of those libraries or you wish to create your own (or extend an existing library), you'll want to familiarize yourself with this section.
All web service calls (through the current interface) are of the form http://cloud.scorm.com/api?method=[service.prefix].[methodName]&appid=[your app id]&origin=[your origin string](&any=other&methodparams=here)(&security=params)
For secured services (which will likely be all services offered), the security params include the ts param (a UTC timestamp of the form yyyyMMddHHmmss) and the sig param (an MD5 hash signature of the method call, detailed below)
Each http request sent to a secured web services instance must contain the following parameters to pass the security check:
- appid : Your application id, which you can obtain in the Apps section of our SCORM Cloud website (see the signup section in our Quick Start guide for more info)
- origin : A string that defines the organization, application and version of the software making the request. The format for this parameter is defined below.
- ts : A timestamp in the UTC timezone of the form yyyyMMddHHmmss (ex. 20081217223530)
- sig : A signature created by hashing the specifics of a request with your secret key
The origin string parameter must not contain spaces or any other
special URL characters and should be in the format of:
[company/organization].[application name].[application version]
All characters in the organization and application names should be
lowercase with spaces removed. Versions can contain periods and dashes.
For example, "Rustici Software SCORM Cloud 2.0 Beta" would be represented as:
rusticisoftware.scormcloud.2.0-beta
The signature ("sig" param) is created using the following algorithm:
- Every parameter to be included on the query string of a call (every parameter except for "sig") is sorted by key name (e.g. foo=1&bar=2 is sorted as bar=2, foo=1). Note that the sort of key names should use a case sensitive comparison.
- The sorted key value pairs are concatenated, with any query string specific characters removed (e.g. bar=2&foo=1 -> bar2foo1)
- If the call includes a parameter with multiple values, the concatenated string will include the parameter name only once, and the values should be concatenated in alphabetical order like so foo=1&bar=this&bar=that -> barthatthisfoo1
- This "serialized request string" is prepended with your secret key (e.g. BIGSECRETbar2foo1)
- An MD5 hash is calculated of the UTF-8 encoding of the combined string, and then converted to a hex string (e.g. md5hash(BIGSECRETbar2foo1) -> 7D6AED5AD524170A018D4AC8FFE0693C)
The resulting hex string is the signature for the method call and is attached as the sig parameter (e.g. api?method=[method]&appid=[appid]&ts=[timestamp]&sig=7D6AED5AD524170A018D4AC8FFE0693C) The server will perform the same operations listed above and allow access if the signatures match.
The timestamp sent in the request must match the time on the server (within an expiration limit). In this way, every service request (over time) is uniquely signed, even if the same parameters are used in the call.
Every web service call should result in a formatted response. The current implementation defaults to using a rest XML format similar to the flickr api. A typical "successful" response will be of this form:
<?xml version="1.0" encoding="utf-8" ?> <rsp stat="ok"> [xml payload] </rsp>
And a typical "error" response (usually caused by an error or
exception in performing the requested operation) should have the form:
<?xml version="1.0" encoding="utf-8" ?> <rsp stat="fail"> <err code="[error code here]" msg="[error message here]" /> [*potentially <err code="[inner exception error code]" msg="[inner exception message]" />] [*optionally <errordetails> <stacktrace> <tracetext>text</tracetext>... </stacktrace> </errordetails>] </rsp>
The error return can optionally include an errordetails element that includes extra diagnostic information (like a stack trace). This is enabled by a configuration variable in the web service core code. Perhaps it should be a common optional parameter to pass to any method...
There are a number of common error codes that can be returned by all
available methods, which are as follows:
Common error codes:
- Security Errors
- 100 : A general security error has occured, i.e. the security check has failed.
- 101 : The required appid parameter is missing.
- 102 : The required appid is invalid.
- 103 : The required sig parameter (request signature) is missing.
- 104 : The sig parameter is invalid (signature sent in the request does not match signature generated on the server)
- 105 : The required ts parameter (the UTC timestamp) is missing
- 106 : The required ts parameter is invalid (needs to be of the form yyyyMMddHHmmss)
- 107 : The passed ts parameter has expired (timestamp sent in request must be within certain amount of time within when server fulfills the request)
- 108 : An error has occurred in accessing the back end storage for authentication
- Service Errors
- 200 : Invalid service call (the method parameter is missing or incorrect)
- 201 : Service unavailable
- 202 : Method not found
- 203 : A required parameter for the called method is missing from the request
- 204 : An invalid format parameter is specified (for now format is ignored, only XML is returned)
- 205 : Invalid method parameter value
Error codes 0-99 specify errors that have occurred during processing of a web service call. Error code 99 is reserved to note "general errors", which refer to exceptions that are thrown in processing that are not handled by the web service in a more specific way.
In the service call specifications below, the example response
will show just the xml payload that is wrapped in a successful
<rsp> element as shown above. Similarly the error codes and
messages noted for each method will be wrapped in the common error
response format shown above.
Useful Integration Concepts
Understanding Course Versioning
Course versioning is conceptually similar to other versioning systems you use, like GoogleDocs, wikis, websites, code versioning systems, and so on. By creating a new version of a course, you'll maintain a snapshot of the course content as a previous version, and keep historical data regarding that version as well. To create a new version of an existing course, just call importCourse with a courseid that refers to the course you'd like to update. At it's simplest form, that's really it. New registrations will then be launched against the newest available version of the course. You can see information about these versions and instances using the getCourseDetail and getRegistrationDetail web service calls.
The only tricky part that merits more explanation is how we'll handle existing registrations that are registered against the course. In an ideal world, we'd simply carry over existing registration data from the current version to the new version of the course and start the user on the new version seamlessly. Unfortunately it's not quite that simple. Because course information and structure can change freely when importing a new version, the course structure and indeed the semantics of the course itself can change. However, registrations contain information that is structured closely around the course structure. Because the decision about how to represent the previous structure in the new structure can't be made in every arbitrary case, we instead provide another concept for 'versioning' registrations, called 'instancing'.
Using registration instancing, we'll maintain a historical record of every registration for each version of a course it's been launched against. You'll still be able to dig up and report on that historical data. When you upload a new version of a course, you'll have the option to choose when we should create a new 'instance' of the existing registrations, leaving behind a historical record of the user's progress on their current version and restarting them on the newest version of the course. When this happens, for the user, it will appear they've restarted at the beginning of the course, but now on the new version.
- Here are the available choices for the 'Move Existing Registrations to Newest Version' option:
- Never - keep existing registrations on the old version
- If Incomplete - only if they haven't completed the old version
- When Completed - once the old version is completed, launch new version
- When Failed - only if they have finished and failed the old version
- When Passed - only if they have finished and passed the old version
- Always - next launch will start them on newest version
- This option can be set either through the SCORM Cloud interface or by using the 'registrationInstancingOption' attribute in a call to updateAttributes using the values 'never', 'incomplete', 'complete', 'failed', 'passed', and 'always'.
API Listing
Debug Service (rustici.debug)
This service provides a very basic set of simple method calls to check the status of a running web service instance.
ping
- Semantics: This method simply responds to the user. It's purpose is to have a simple way of testing the underlying mechanisms for delivering the web services (i.e. the web service "core") and making sure the instance is up and running
- Required Arguments: none
- Optional Arguments: none
- Example call: http://cloud.scorm.com/api?method=rustici.debug.ping
- Example response:
<pong />
authPing
- Semantics: This method simply responds to the user. It's purpose is to have a simple way of testing the underlying mechanisms for delivering the web services (i.e. the web service "core") and making sure the instance is up and running, as well as providing the simplest test for ensuring that the credentials for signing (and the signing process) are valid.
- Required Arguments:
- appid : Your application id
- Optional Arguments: none
- Example call: http://cloud.scorm.com/api?method=rustici.debug.authPing&appid=myappid
- Example response:
<pong />
getTime
- Semantics: This method returns the time on the running instance, in (UTC/GMT) timezone in the form 'yyyyMMddHHmmss'. This format is used for the timestamp that is part of the security mechanism.
- Required Arguments: none
- Optional Arguments: none
- Example call: http://cloud.scorm.com/api?method=rustici.debug.getTime
- Example response:
<currenttime tz="UTC">20081217152345</currenttime>
Course Service (rustici.course)
This secured service allows for many operations related to courses, including importing new courses and retrieving information about imported courses.
importCourse
- Semantics: This method expects the incoming HTTP request to be a POST of multipart (i.e. HTTP form w/ input of type file) data. Every other parameter (other than the file data) must be specified on the querystring. When this method is called, the service will try to import the posted course file. If the import is successful, the imported course will be registered using the courseid provided. If the given courseid refers to an existing course, a new version of the course will be created (for more information, see Understanding Course Versioning). If the optional redirecturl parameter is specified, the browser sending the request will be redirected to the given url, appending the following querystring parameters: a "success" parameter noting success/failure, and if successful, a "title" parameter that specifies the title of the imported course. If the call failed, the url will be appended with an "errcode" parameter specifying the error code, and a "msg" parameter specifying the error message. This allows developers to direct the user automatically to another page when a form is submitted in a browser.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify this course
- Optional Arguments:
- redirecturl : The url that a browser should be redirected to after the operation completes.
- email: An email address associated with an existing SCORM Cloud website user. If this parameter is included, user information will be attached to this event in the event history on the SCORM Cloud website.
- culture: This parameter should specify a culture code (see an example listing here). If specified, and supported, the parser warnings found during import will be returned in the appropriate specified language.
- itemid: The item identifier of a specific learning object to import. This allows for the import of an aggregation or a specific SCO/asset within an organization.
- Example call: An example call is best illustrated with a
simple http form:
<form id="importCourseForm" method="post" action="http://cloud.scorm.com/api?method=rustici.course.importCourse&appid=myappid&courseid=course003(&email=user@test.com)" enctype="multipart/form-data"> <input type="file" name="filedata" size="40" /> <br /> <input type="submit" value="Send" /> </form>
- Example response (if not redirected using redirectUrl):
<importresult successful="true"> <title>Photoshop Example -- Competency</title> <message>Import Successful</message> [possibly <parserwarnings> <warning>[warning text]</warning> </parserwarnings> ] </importresult> - Error codes:
- 2 : The file specified in the optional path parameter can't be found
- Also remember to check the successful flag on the importresult element, as even a "successful" web service call to importCourse can result in a failed import (for example, if the zip file being imported does not contain an imsmanfiest.xml file)
importCourseAsync
- Semantics: The semantics of this method are similar to the importCourse method. The difference is that this call is asynchronous and returns immediately, instead of waiting for the import process to complete. Instead of returning the results of a completed import, it returns an import result token, which should be used in subsequent calls to getAsyncImportResult to actually get the import results (or import errors). If the redirectUrl parameter is used, the browser will be redirected after the file has been posted, and this URL will have the following parameters appended to the querystring: a "success" parameter noting success/failure, and if successful, it will also include courseid, appid, and tokenid parameters. If the call fails, the "errcode" and "msg" paramters will be included which specify the error that occurred.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify this course
- Optional Arguments:
- redirecturl : The url that a browser should be redirected to after the operation completes.
- email: An email address associated with an existing SCORM Cloud website user. If this parameter is included, user information will be attached to this event in the event history on the SCORM Cloud website.
- culture: This parameter should specify a culture code (see an example listing here). If specified, and supported, the parser warnings found during import will be returned in the appropriate specified language.
- itemid: The item identifier of a specific learning object to import. This allows for the import of an aggregation or a specific SCO/asset within an organization.
- Example call: An example call is best illustrated with a
simple http form:
<form id="importCourseForm" method="post" action="http://cloud.scorm.com/api?method=rustici.course.importCourseAsync&appid=myappid&courseid=course003(&email=user@test.com)" enctype="multipart/form-data"> <input type="file" name="filedata" size="40" /> <br /> <input type="submit" value="Send" /> </form>
- Example response (if not redirected using the redirecturl param):
<token> <id>e2bfa26e-2e96-48e3-86a6-f435fba6dccb</id> </token>
getAsyncImportResult
- Semantics: This call is the other necessary half of asynchronous importing. An import is started asynchronously using importCourseAsync. The results of the import started can be retrieved using getAsyncImportResult. The result of this call returns a status, and additional information based on that status. If an error or other exception has occurred during the import, the status will be set to "error" and details of the error will be added to the output. If the status is "finished", the import results will be included. See example call/response below.
- Required Arguments:
- appid : Your application id
- token : The id of the token returned by importCourseAsync.
- Example call: http://cloud.scorm.com/api?method=rustici.course.getAsyncImportResult&appid=myappid&token=e2bfa26e-2e96-48e3-86a6-f435fba6dccb
- Example response:
//When still running <status>running</status> //When error has occurred <status>error</status> <error>[Error message here]</error> //When completed without error <status>finished</status> <importresults> <importresult successful="true"> <title>Photoshop Example -- Competency</title> <message>Import Successful</message> [possibly <parserwarnings> <warning>[warning text]</warning> </parserwarnings> ] </importresult> </importresults>
preview
- Semantics: Calling this method will preview the course by redirecting the user's browser. This method is intended to be called directly in a browser.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify this course
- Example response:
- The user's browser will be redirected to the preview page
- Error codes:
- 1 : The course specified by the given courseid can not be found
properties
- Semantics: Calling this method will allow the user access to the properties editor for this course, by redirecting the user's browser. This method is intended to be called directly in a browser, although it's recommended and typical for it to be embedded on a page using an iframe.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify this course
- Optional Arguments:
- cssurl : A URL to an external stylesheet to be applied to the properties editor
- culture: This parameter should specify a culture code (see an example listing here). If specified, and supported, the properties control will be displayed in that language.
- editor: This should be set to "latest" in order to access the latest version of the properties control
- Example response:
- The user's browser will be redirected to the preview page
exists
- Semantics: This method is used to check a whether or not the specified course exists.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify this course
- Example response:
<result>true</result>
getAssets
- Semantics: This method provides a simple mechanism to download files for a given course. If no error occurs during processing of the call, this method will not return any XML response, but rather an application/octet-stream response containing the data of the requested course assets. This call provides a way to quickly retrieve important files like the imsmanifest.xml or metadata files, or many files at once, returned in the form of a zip file. If the optional path parameter is not specified, all the assets for the course will be returned in the zip file.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course under which the assets should be found.
- Optional Arguments:
- path : The (relative) file path to a specific asset. The path is relative to the course root. If this parameter has only a single value, just the one file will be returned. If this parameter has multiple values, each of the assets specified will be packaged together into a zip file. If this parameter is not specified, all the assets for the course will be returned in the zip file. The structure of the zip file will have the courseid as the root, and each file will be at the relative path specified underneath that root. (If no path specified, the structure will exactly resemble the structure returned in the call to getFileStructure.)
- Example call: http://cloud.scorm.com/api?method=rustici.course.getAssets&appid=myappid&courseid=course003(&path=images/birdfeeder.jpg&path=images/birdfeederscaled.jpg)
- Example response:
- Success will result in a file download, while an error will return error details in the common format
updateAssets
- Semantics: This method can be used to update the assets of the course specified. Files found in the zip file, which is sent through the request or specified by the optional path parameter, will be overlayed on top of the files belonging to the course specifed by courseid . Note however that the existing manifest file will not be overwritten.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course for deletion
- Example call: http://cloud.scorm.com/api?method=rustici.course.updateAssets&appid=myappid&courseid=course003(&path=default/Course003.zip) (or HTTP multipart post data if no path specified))
- Example response:
<success />
- Error codes:
- 1 : The course specified by the given courseid cannot be found
- 2 : The file specified in the optional path parameter can't be found
- 3 : Internal processing of the assets file caused an IO exception
deleteCourse
- Semantics: A call to this method will cause the course specified by the courseid parameter (belonging to the client named by appid) to be deleted.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course for deletion
- Optional Arguments:
- email: An email address associated with an existing SCORM Cloud website user. If this parameter is included, user information will be attached to this event in the event history on the SCORM Cloud website.
- Example call: http://cloud.scorm.com/api?method-rustici.course.deleteCourse&appid=myappid&courseid=course003(&email=user@test.com)
- Example response:
<success />
- Error codes:
- 1 : The course specified by the given courseid cannot be found
- 2 : Deleting the files associated with this course caused an internal security exception
getFileStructure
- Semantics: This method returns xml that represents the file structure of the course files belonging to the course named by the courseid parameter, along with some very basic metadata about the files, such as file length and last modified date. All dates shown are of the format yyyyMMddHHmmss and in the UTC timezone.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course
- Example call: http://cloud.scorm.com/api?method=rustici.course.getFileStructure&appid=myappid&courseid=course003
- Example response:
<dir name="photoshop_competency"> <file name="adlcp_v1p3.xsd" size="2846" modified="20090108210616"/> <file name="adlnav_v1p3.xsd" size="2109" modified="20090108210616"/> <file name="adlseq_v1p3.xsd" size="2649" modified="20090108210616"/> <file name="datatypes.dtd" size="6357" modified="20090108210616"/> <file name="Exam.htm" size="20073" modified="20090108210616"/> <dir name="images"> <file name="37.gif" size="70" modified="20090108210616"/> <file name="72.gif" size="169" modified="20090108210616"/> <file name="Addition.gif" size="136" modified="20090108210616"/> [...] <file name="ZoomToolIcon.gif" size="142" modified="20090108210616"/> </dir> [...] <file name="XMLSchema.dtd" size="16018" modified="20090108210616"/> </dir>
- Error Codes:
- 1 : Could not find the given course specified by courseid belonging to the given appid
deleteFiles
- Semantics: A call to this method will attempt to delete each file specified by the relative path named in the path parameter. The path specified is relative to the root of the course files belonging to the course named by the courseid parameter. The method returns a list of results for each path, and whether the deletion was successful.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course whose files are named for deletion
- path : The relative path (relative to the course file root) to the file(s) to be deleted. Note that this parameter can have multiple values, in which case, each file specified will be deleted (or attempted, that is).
- Example call:
http://cloud.scorm.com/api?method=rustici.course.deleteFiles&appid=myappid&courseid=course003&path=image1.jpg(&path=image2.jpg&path=image3.jpg)
- *Note that it could be fairly easy to exceed the maximum length of a query string based GET request with a long list of files, and hence the POST action should be used in those cases
- Example response:
<results> <result path="images/birdfeeder.jpg" deleted="true"/> <result path="images/doesnotexist.jpg" deleted="false"/> </results>
- Error Codes:
- 1 : Course named by courseid not found
- Any errors in deleting the named files will just report a deleted="false" for that file.
getAttributes
- Semantics: Calling this method will return the names and values of the editable attributes for the course named by the courseid parameter. These attributes can be updated with a call to updateAttributes, as detailed elsewhere in this doc.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course for which the attributes will be retrieved
- Example call: http://cloud.scorm.com/api?method=rustici.course.getAttributes&appid=myappid&courseid=course003
- Example response:
<attributes> <attribute name="alwaysFlowToFirstSco" value="false"/> <attribute name="commCommitFrequency" value="10000"/> <attribute name="commMaxFailedSubmissions" value="2"/> [...] <attribute name="validateInteractionResponses" value="true"/> <attribute name="wrapScoWindowWithApi" value="false"/> </attributes>
- Error Codes:
- 1 : Course named by courseid not found
updateAttributes
- Semantics: This method allows you to update the attributes belonging to the course named by courseid. The attribute names and values are specified as name/value parameters in the HTTP request, see example usage below. Any faulty values given will be ignored. An error free call to this method will return a list of attributes that have been changed along with their new values. (If an attribute is set to it's existing value, it will not appear in the returned list. Only changed values will appear.)
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course for which the attributes will be updated
- Example call: http://cloud.scorm.com/api?method=rustici.course.updateAttributes&appid=myappid&courseid=course003&showNavBar=true&showCourseStructure=false(and so on)
- Example response:
<attributes> <attribute name="showCourseStructure" value="false"/> <attribute name="showNavBar" value="true"/> </attributes>
- Error codes:
- 1 : Course named by courseid not found
getMetadata
- Semantics: A call to this method will return important metadata items associated with the specified course. Optional parameters can be included to specify both the scope of the metadata that is returned (course level only or activity level), as well as the format of the metadata (summary or detailed).
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course for which the attributes will be updated
- Optional Arguments:
- scope : The scope of the return metadata. If specified as "course" return only data about the root learning object. If specified as "activity", return data for every activity / learning object in the course.
- mdformat : If specified as summary, return only the most important subset of metadata such as title, description, duration, typical time, key words, and mastery score for each learning object. If specified as "detail", return a much larger set of data.
- Example call: http://cloud.scorm.com/api?method=rustici.course.getMetadata&appid=myappid&courseid=course003(&scope=activity&mdformat=detail)
- Example response:
- If mdformat is "course" or "activity": (*Note only learning
objects with metadata will contain a metadata element)
<package> <metadata> <title>Package Title</title> <description>Package Description</description> <duration>Package Duration</duration> <typicaltime>0</typicaltime> <keywords> <keyword>Training</keyword> </keywords> </metadata> <object id="B0"> <metadata> <title>Root Title</title> <description>Root Description</description> <duration>0</duration> <typicaltime>0</typicaltime> <keywords> <keyword>Training</keyword> </keywords> <metadata> [* if mdformat is "activity" <children> <object id="i1"> <metadata> <title>Title</title> <description>Description</description> <duration>0</duration> <typicaltime>0</typicaltime> <keywords> <keyword>Training</keyword> </keywords> <masteryscore/> </metadata> </object> </children>] </object> </package>
- If mdformat is "full":
*Yet to be implemented, for now return same as summary
- If mdformat is "course" or "activity": (*Note only learning
objects with metadata will contain a metadata element)
- Error codes:
- 1 : Course named by courseid not found
getManifest
- Semantics: This method provides a simple mechanism to download the imsmanifest.xml given course. If no error occurs during processing of the call, this method will not return any XML response, but rather an application/octet-stream response containing the data of the requested manifest.
- Required Arguments:
- appid : Your application id
- courseid : The id used to identify the course under which the assets should be found.
- Example call: http://cloud.scorm.com/api?method=rustici.course.getManifest&appid=myappid&courseid=course003
- Example response:
- Success will result in a file download, while an error will return error details in the common format
- Error Codes:
- 1 : Could not find the given course specified by courseid belonging to the given appid
getCourseList
- Semantics: This method will return a list of courses associated with the given appid. If the optional filter parameter is specified, it will be used as a regular expression against the course id to filter the return list of courses.
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- filter : A regular expression that will be used to filter the list of courses. Specifically only those courses whose courseid's match the given expression will be returned in the list.
- tags : A comma separated list of tags to filter results by. Results will include only courses which are tagged with every tag in the list
- Example call: http://cloud.scorm.com/api?method=rustici.course.getCourseList&appid=myappid(&filter=.*321&tags=test1,test2)
- Example response:
<courselist> <course id="test321" title="Photoshop Example -- Competency" versions="-1" registrations="2" > <tags> <tag>test1</tag> <tag>test2</tag> <tags> </course> <course id="course321" title="Another Test Course" versions="-1" registrations="5" > <tags></tags> </course> </courselist>
getCourseDetail
- Semantics: This method will return a number of details surrounding the course specified by the given appid and courseid parameters. It is typically most helpful in discovering version information about the given course. To read more about content versioning, please see Understanding Course Versioning
- Required Arguments:
- appid : Your application id
- courseid : The course id for the given course
- Example call: http://cloud.scorm.com/api?method=rustici.course.getCourseDetail&appid=myappid&courseid=course123
- Example response:
<course id="course123" title="Golf Explained - Sequencing Versions" versions="3" registrations="16" size="2040257" > <versions> <version> <versionId><![CDATA[0]]></versionId> <updateDate><![CDATA[2011-07-22T17:39:06.000+0000]]></updateDate> </version> <version> <versionId><![CDATA[1]]></versionId> <updateDate><![CDATA[2011-07-25T16:19:59.000+0000]]></updateDate> </version> <version> <versionId><![CDATA[2]]></versionId> <updateDate><![CDATA[2011-07-25T20:15:37.000+0000]]></updateDate> </version> </versions> <tags></tags> </course>
Registration Service (rustici.registration)
This service provides calls for creating and removing registrations, and launching existing registrations.
createRegistration
- Semantics: This method is used to create a new registration. A registration will contain a few pieces of information such as a learner name, a learner id, and optionally, information about where activity data should be posted (for client consumption), as well as a way to specify simple authentication schemes for posting said data, as noted below. A registration must be tied to a specific course at creation time. When the created registration is "launched", the course specified at creation time will be launched.
- Required Arguments:
- appid : Your application id
- courseid : The course for which this registration is being created
- regid : The id used to identify this registration (it must be unique)
- fname : The first name of the learner associated with this registration
- lname : The last name of the learner associated with this registration
- learnerid : The learner id associated with this registration (multiple registrations can be associated w/ the same learner id)
- Optional Arguments:
- email: If the email parameter is included, this registration will be attached to a SCORM Cloud website user (an "empty" user will be created if none with this email exists). Attaching registrations to a SCORM Cloud user via an email address will enhance the experience of both learners and administrators on the SCORM Cloud website, and it allows a centralizing of learning data for the user who owns the email address. It is optional, but highly recommended!
- postbackurl : Specifies a URL for which to post activity and
status data in real time as the course is completed
- If the authtype specified is form, or not included, then this status data is posted as 'data' (the key name) along with the other form variables. If the authtype is specified as httpbasic, then the data is HTTP POSTed as the body of the request. The data starts with the <registrationreport ... > element and uses the schema documented in getRegistrationResult
- For information on testing your postbackurl, see the testRegistrationPostUrl call.
- authtype : Optional parameter to specify how to authorize against the given postbackurl, can be "form" or "httpbasic". If form authentication, the username and password for authentication are submitted as form fields "username" and "password", and the registration data as the form field "data". If httpbasic authentication is used, the username and password are placed in the standard Authorization HTTP header, and the registration data is the body of the message (sent as text/xml content type). This field is set to "form" by default.
- urlname : You can optionally specify a login name to be used for credentials when posting to the URL specified in postbackurl
- urlpass : If credentials for the postbackurl are provided, this must be included, it is the password to be used in authorizing the postback of data to the URL specified by postbackurl
- resultsformat : This parameter allows you to specify a level of detail in the information that is posted back while the course is being taken. It may be one of three values: "course" (course summary), "activity" (activity summary, or "full" (full detail), and is set to "course" by default. The information will be posted as xml, and the format of that xml is specified below under the method "getRegistrationResult"
- Example call:
http://cloud.scorm.com/api?method=rustici.registration.createRegistration&appid=myappid&courseid=course003®id=myreg001&fname=jimbo&lname=roth&learnerid=jroth(postbackurl=[encoded
url]&authtype=form&urlname=iki&urlpass=secretish&resultformat=course&)
- *Note that it could be fairly easy to exceed the maximum length of a query string based GET using this call, and hence the POST action should be used in those cases
- Example response:
<success/>
- Error Codes:
- 1 : Couldn't find the course specified by courseid belonging to appid
- 2 : Registration already exists
- 3 : Postback URL login name specified without password
deleteRegistration
- Semantics: A call to this method will attempt to delete the registration named by regid, and will consequently report success or throw an error.
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- Example call: http://cloud.scorm.com/api?method=rustici.registration.deleteRegistration&appid=myappid®id=myreg001
- Example response:
<success/>
- Error codes:
- 1 : The registration specified by regid does not exist
resetRegistration
- Semantics: Calling this method will reset the specified registration. This is essentially the same as deleting and recreating the registration, and as such, will delete all the data associated with the registration (including launch history, etc.). If the course for which the registration is registered has multiple versions, the registration being reset will automatically be registered for the latest version.
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.registration.resetRegistration&appid=myappid®id=myreg001
- Example response:
<success/>
- Error codes:
- 1 : The registration specified by regid does not exist
getRegistrationList
- Semantics: This method will return a list of registrations associated with the given appid. If the optional filter parameter is specified, it will be used as a regular expression against the registration id to filter the returned list of registrations. Also, another optional parameter, coursefilter, can be used as a regular expression against the course id to filter the list so that only registrations for courses matching the expression will be returned.
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- courseid : Limit search to only registrations for the course specified by this courseid
- learnerid : Limit search to only registrations for the learner specified by this learnerid
- filter : A regular expression that will be used to filter the list of registrations. Specifically only those registrations whose regid's match the given expression will be returned in the list.
- coursefilter : A regular express that will be used to filter the list of registrations. Specifically only those registrations that are associated with courses whose courseid's match the given expression will be returned in the list.
- after : Return registrations updated (strictly) after this timestamp.
- until : Return registrations updated up to and including this timestamp.
- Example call: http://cloud.scorm.com/api?method=rustici.registration.getRegistrationList&appid=myappid(&filter=.*4&coursefilter=.*321&after=2011-02-01T21:39:23Z)
- Example response:
<registrationlist> <registration id="reg4" courseid="test321"> <appId>myappid</appId> <registrationId>reg4</registrationId> <courseId>test321</courseId> <courseTitle>Test Course</courseTitle> <learnerId>test_learner</learnerId> <learnerFirstName>Test</learnerFirstName> <learnerLastName>Learner</learnerLastName> <email>test@test.com</email> <createDate>2011-03-23T14:00:45.000+0000</createDate> <firstAccessDate>2011-06-06T16:08:18.000+0000</firstAccessDate> <lastAccessDate>2011-06-06T16:36:12.000+0000</lastAccessDate> <completedDate>2011-06-06T16:36:12.000+0000</completedDate> <instances /> </registration> ... </registrationlist>
getRegistrationDetail
- Semantics: This method will return some detail for the registration specified with the given appid and registrationid, including information regarding registration instances. For more information about registration instances and course versions, see Understanding Course Versioning.
- Required Arguments:
- appid : Your application id
- regid : The registration id for the given registration
- Example call: http://cloud.scorm.com/api?method=rustici.registration.getRegistrationDetail&appid=myappid®istrationid=reg123
- Example response:
<registration id="reg123" courseid="SequencingForcedSequential_SCORM20043rdEditionb0535515-a4c9-4dad-bd85-04bcc54f96b7"> <appId><![CDATA[myappid]]></appId> <registrationId><![CDATA[reg123]]></registrationId> <courseId><![CDATA[course123]]></courseId> <courseTitle><![CDATA[Golf Explained - Sequencing Forced]]></courseTitle> <lastCourseVersionLaunched><![CDATA[2]]></lastCourseVersionLaunched> <learnerId><![CDATA[test@test.com]]></learnerId> <learnerFirstName><![CDATA[Test]]></learnerFirstName> <learnerLastName><![CDATA[Man]]></learnerLastName> <email><![CDATA[test@test.com]]></email> <createDate><![CDATA[2011-07-25T20:05:01.000+0000]]></createDate> <firstAccessDate><![CDATA[2011-07-25T20:23:44.000+0000]]></firstAccessDate> <lastAccessDate><![CDATA[2011-07-25T20:55:09.000+0000]]></lastAccessDate> <completedDate><![CDATA[2011-07-25T20:33:20.000+0000]]></completedDate> <instances> <instance> <instanceId><![CDATA[0]]></instanceId> <courseVersion><![CDATA[1]]></courseVersion> <updateDate><![CDATA[2011-07-25T20:33:20.000+0000]]></updateDate> </instance> <instance> <instanceId><![CDATA[1]]></instanceId> <courseVersion><![CDATA[2]]></courseVersion> <updateDate><![CDATA[2011-07-25T20:55:08.000+0000]]></updateDate> </instance> </instances> </registration>
getRegistrationResult
- Semantics: A call to this method will return information about the specified registration, at a level of detail specified in the optional parameter "resultformat".
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- Optional Arguments:
- resultsformat : This optional parameter can be one of three values, "course", "activity", or "full". If specified as "course", only top level information such as completion status, success status, total time spent, and score will be returned. If specified as "activity", similar summary information will be return for every activity in the course. If specified as "full", the full set of CMI runtime and activity data is returned for every activity in the course. By default, "course" is used.
- Example Call: http://cloud.scorm.com/api?method=rustici.registration.getRegistrationResult&appid=myappid®id=myreg001(&resultsformat=activity)
- Example Response:
- If resultsformat is "course" (or not specified)
<registrationreport format="summary" regid="myreg001" instanceid="0"> <complete>complete</completion> <success>failed</success> <totaltime>19</totaltime> <score>0</score> </registrationreport>
- If resultsformat is "activity"
<registrationreport format="activity" regid="myreg001" instanceid="0"> <activity id="TOC1"> <title>Photoshop Example -- Competency</title> <attempts>1</attempts> <complete>incomplete</complete> <success>unknown</success> <time/> <score>0</score> <children> [if activity has children] <activity id="LESSON1"> <title>Lesson 1</title> ... <score>0</score> <children> ... </children> </activity> <activity> ... </activity> </children> </activity> </registrationreport>
- If resultformat is "full"
<registrationreport format="full" regid="myreg001" instanceid="0"> <activity id="preTEST"> <title>Pre Assessment</title> <satisfied>true</satisfied> <completed>true</completed> <progressstatus>true</progressstatus> <attempts>1</attempts> <suspended>false</suspended> <objectives> <objective id="PRIMARYOBJ"> <measurestatus>false</measurestatus> <normalizedmeasure>0.0</normalizedmeasure> <progressstatus>true</progressstatus> <satisfiedstatus>true</satisfiedstatus> </objective> ... </objectives> <runtime> <completion_status>completed</completion_status> <credit>Credit</credit> <entry>AbInitio</entry> <exit>Unknown</exit> <learnerpreference> <audio_level>1.0</audio_level> <language/> <delivery_speed>1.0</delivery_speed> <audio_captioning>0</audio_captioning> </learnerpreference> <location>null</location> <mode>Normal</mode> <progress_measure/> <score_scaled>68</score_scaled> <score_raw>534</score_raw> <total_time>0000:00:00.00</total_time> <timetracked>0000:00:04.47</timetracked> <success_status>Unknown</success_status> <suspend_data><![CDATA[user data]]></suspend_data> <comments_from_learner> <comment> <value /> <location /> <date_time /> </comment> ... </comments_from_learner> <comments_from_lms> <comment> ... </comment> ... </comments_from_lms> <interactions> <interaction id="1"> <objectives> <objective id="1" /> ... </objectives> <timestamp /> <correct_responses> <response id="1" /> ... </correct_responses> <weighting /> <learner_response /> <result /> <latency /> <description /> </interaction> ... </interactions> <objectives> <objective id="PRIMARYOBJ"> <score_scaled/> <score_min/> <score_raw/> <score_max/> <success_status>unknown</success_status> <completion_status>unknown</completion_status> <progress_measure/> <description>null</description> </objective> ... </objectives> <static> <completion_threshold/> <launch_data/> <learner_id>daveid</learner_id> <learner_name>dave e</learner_name> <max_time_allowed/> <scaled_passing_score/> <time_limit_action>Undefined</time_limit_action> </static> </runtime> <children> [if activity has children] <activity id="childactivity"> ... </acitivity> ... </children> </activity> </registrationreport>
- If resultsformat is "course" (or not specified)
- Error codes:
- 1 : The registration specified by the given regid does not exist
getRegistrationListResults
- Semantics: This method is, as it is titled, a combination of getRegistrationList and getRegistrationResult, and can be used for very basic reporting functionality. The response contains the chosen list of registrations, and each registration includes a report of the same format received from a call to getRegistrationResult. The single report included for each registration is obtained from the most recent instance of the registration. (For report of another instance, use getRegistrationResult and specify the instance id.)
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- courseid : Limit search to only registrations for the course specified by this courseid
- learnerid : Limit search to only registrations for the learner specified by this learnerid
- filter : A regular expression that will be used to filter the list of registrations. Specifically only those registrations whose regid's match the given expression will be returned in the list.
- coursefilter : A regular express that will be used to filter the list of registrations. Specifically only those registrations that are associated with courses whose courseid's match the given expression will be returned in the list.
- resultsformat : This optional parameter can be one of three values, "course", "activity", or "full". If specified as "course", only top level information such as completion status, success status, total time spent, and score will be returned. If specified as "activity", similar summary information will be return for every activity in the course. If specified as "full", the full set of CMI runtime and activity data is returned for every activity in the course. By default, "course" is used.
- after : Return registrations updated (strictly) after this timestamp.
- until : Return registrations updated up to and including this timestamp.
- Example call: http://cloud.scorm.com/api?method=rustici.course.getRegistrationListResults&appid=myappid(&filter=.*4&coursefilter=.*321&resultsformat=full&after=2011-02-01T21:39:23Z)
- Example response:
<registrationlist> <registration id="reg4" courseid="test321"> <appId>myappid</appId> <registrationId>reg4</registrationId> <courseId>test321</courseId> <courseTitle>Test Course</courseTitle> <learnerId>test_learner</learnerId> <learnerFirstName>Test</learnerFirstName> <learnerLastName>Learner</learnerLastName> <email>test@test.com</email> <createDate>2011-03-23T14:00:45.000+0000</createDate> <firstAccessDate>2011-06-06T16:08:18.000+0000</firstAccessDate> <lastAccessDate>2011-06-06T16:36:12.000+0000</lastAccessDate> <completedDate>2011-06-06T16:36:12.000+0000</completedDate> <instances /> [format of registrationreport element same as above in getRegistrationResult call] <registrationreport format="summary" regid="reg4" instanceid="2"> ... </registrationreport> </registration> ... </registrationlist>
launch
- Semantics: Calling this method will launch the given registration by redirecting the user's browser to the main launch page for the course associated with the registration. Before redirecting the user, this method will also drop a cookie on the user's machine allowing them temporary access to the course materials. Unlike nearly all the other web service calls, this method is intended to be called directly in a browser.
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- redirecturl : The URL upon which to redirect when the registration has completed. By default, this is simply a blank html page. For convenience, this parameter can alternatively be any of the following keywords: "closer", "blank", "message" which will redirect to a page that automatically tries to close the browser tab/window, a blank page, or a page with a simple message about the course being complete, respectively.
- Optional Arguments:
- cssurl : An absolute URL to a custom stylesheet that will be used to style the navigational menus and header of the SCORM "player" that displays the course content.
- learnerTags: Comma-delimited list of tags to associate with the learner who is launching the course. Any new tags are appended to the registration-independent tag list for this learner as well.
- courseTags: Comma-delimited list of tags to associate with the launched course. Any new tags are appended to the registration-independent tag list for this course as well.
- registrationTags: Comma-delimited list of tags to associate the the launched registration itself
- disableTracking: if set to "true", the registration will be launched with tracking disabled, and the launch will not result in any changes to the registration
- culture: This parameter should specify a culture code (see an example listing here). If specified, and supported, the navigation and alerts in the player will be displayed in the associated language. If not specified, the locale of the user's browser will be used.
- Example call: http://cloud.scorm.com/api?method=rustici.registration.launch&appid=myappid®id=myreg001(&redirecturl=http%3A//www.google.com&cssurl=http%3A//localhost/custom-stylesheet.css)
- Example response:
The user will be redirected to the launch page for the given registration. - Error codes:
- 1 : The registration specified by regid does not exist
getLaunchHistory
- Semantics: Calling this method will fetch a historical list of launches for the specified registration. Detailed information for each launch can be obtained using the getLaunchInfo method.
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.registration.getLaunchHistory&appid=myappid®id=myreg001
- Example response:
<launchhistory regid="e222daf6-6005-4344-a07e-0aaa46b21dc9"> <launch id="c7f31a43-706a-4f43-8ab9-ebbf0dde4cbc"> <completion>complete</completion> <satisfaction>failed</satisfaction> <measure_status>1</measure_status> <normalized_measure>0.2</normalized_measure> <experienced_duration_tracked>2628</experienced_duration_tracked> <launch_time>2011-04-05T19:06:37.780+0000</launch_time> <exit_time>2011-04-05T19:07:06.616+0000</exit_time> <update_dt>2011-04-05T19:07:06.616+0000</update_dt> </launch> <launch id="fc80087b-0fde-4263-8a89-29bee96eb65a"> <completion>unknown</completion> <satisfaction>unknown</satisfaction> <measure_status>0</measure_status> <normalized_measure>0.0</normalized_measure> <experienced_duration_tracked>2628</experienced_duration_tracked> <launch_time>2011-04-05T19:15:51.177+0000</launch_time> <exit_time>2011-04-05T19:15:59.450+0000</exit_time> <update_dt>2011-04-05T19:15:59.450+0000</update_dt> </launch> <launch id="ffd2d304-439c-4c59-8be8-5d3fc1eb3f92"> <completion>complete</completion> <satisfaction>failed</satisfaction> <measure_status>1</measure_status> <normalized_measure>0.27</normalized_measure> <experienced_duration_tracked>10223</experienced_duration_tracked> <launch_time>2011-04-05T19:16:07.214+0000</launch_time> <exit_time>2011-04-05T19:17:25.294+0000</exit_time> <update_dt>2011-04-05T19:17:25.294+0000</update_dt> </launch> </launchhistory> - Error codes:
- 1 : The registration specified by regid does not exist
getLaunchInfo
- Semantics: Calling this method will fetch detailed historical data for the specified launch. Launch ids for a given registration can be fetched using the getLaunchHistory method. The response xml will look much like the list from getLaunchHistory, but will also include a log element, with XML describing the user's actions during the launch.
- Required Arguments:
- appid : Your application id
- launchid : The unique identifier for this launch
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.registration.getLaunchInfo&appid=myappid&launchid=d6f31a43-706a-4f43-8ab9-ebbf0dde4cbc
- Example response:
<launch id="d6f31a43-706a-4f43-8ab9-ebbf0dde4cbc"> <completion>complete</completion> <satisfaction>failed</satisfaction> <measure_status>1</measure_status> <normalized_measure>0.2</normalized_measure> <experienced_duration_tracked>2628</experienced_duration_tracked> <launch_time>2011-04-05T19:06:37.780+0000</launch_time> <exit_time>2011-04-05T19:07:06.616+0000</exit_time> <update_dt>2011-04-05T19:07:06.616+0000</update_dt> <log> <RuntimeLog browser="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" trackingEnabled="" version="2009.1.0.15538"> <RuntimeEvent attemptNo="1" event="AttemptStart" id="0" itemIdentifier="golf_sample_default_org" timestamp="14:07:06.97" title="Golf Explained - Run-time Advanced Callz"/> <RuntimeEvent attemptNo="1" event="AttemptStart" id="1" itemIdentifier="item_1" timestamp="14:07:06.97" title="Golf Explained"/> <RuntimeEvent event="ResetRuntime" id="2" itemIdentifier="item_1" timestamp="14:07:06.97" title="Golf Explained"/> <RuntimeEvent event="LoadSco" id="3" itemIdentifier="item_1" timestamp="14:07:06.97" title="Golf Explained"/> <RuntimeEvent event="ApiInitialize" id="4" itemIdentifier="item_1" timestamp="14:07:08.222"/> <RuntimeEvent event="Set" id="5" itemIdentifier="item_1" key="completion" timestamp="14:07:08.222" value="incomplete"/> <RuntimeEvent event="Set" id="6" identifier="obj_playing" index="4" itemIdentifier="item_1" key="objectives completion" timestamp="14:07:08.238" value="incomplete"/> <RuntimeEvent event="Set" id="10" identifier="obj_handicapping" index="2" itemIdentifier="item_1" key="objectives completion" timestamp="14:07:22.394" value="incomplete"/> <RuntimeEvent event="Set" id="14" itemIdentifier="item_1" key="completion" timestamp="14:07:27.503" value="completed"/> <RuntimeEvent event="Set" id="16" identifier="com.scorm.golfsamples.interactions.playing_1" index="0" itemIdentifier="item_1" key="interactions description" timestamp="14:07:31.300" value="The rules of golf are maintained by:'?"/> [...] <RuntimeEvent event="Set" id="105" identifier="com.scorm.golfsamples.interactions.fun_3" index="14" itemIdentifier="item_1" key="interactions result" timestamp="14:07:31.410" value="incorrect"/> <RuntimeEvent event="Set" id="106" itemIdentifier="item_1" key="score.raw" timestamp="14:07:31.410" value="20"/> <RuntimeEvent event="Set" id="107" itemIdentifier="item_1" key="score.min" timestamp="14:07:31.410" value="0"/> <RuntimeEvent event="Set" id="108" itemIdentifier="item_1" key="score.max" timestamp="14:07:31.410" value="100"/> <RuntimeEvent event="Set" id="109" itemIdentifier="item_1" key="score.scaled" timestamp="14:07:31.410" value="0.2"/> <RuntimeEvent event="Set" id="110" itemIdentifier="item_1" key="cmi.exit" timestamp="14:07:32.566"/> <RuntimeEvent event="Set" id="111" itemIdentifier="item_1" key="nav.request" timestamp="14:07:32.566" value="exitAll"/> <RuntimeEvent event="Set" id="112" itemIdentifier="item_1" key="session time" timestamp="14:07:32.566" valueHundredths="2434"/> <RuntimeEvent event="ApiTerminate" id="113" itemIdentifier="item_1" timestamp="14:07:32.566"/> <RuntimeEvent event="UnloadSco" id="114" timestamp="14:07:33.253"/> <RuntimeEvent event="Rollup Completion" id="115" itemIdentifier="golf_sample_default_org" timestamp="14:07:33.253" value="completed"/> <RuntimeEvent event="Rollup Satisfaction" id="116" itemIdentifier="golf_sample_default_org" timestamp="14:07:33.253" value="failed"/> </RuntimeLog> </log> </launch> - Error codes:
- 1 : The registration specified by regid does not exist
resetGlobalObjectives
- Semantics: Calling this method will reset all global objectives associated with this registration, if any exist.
- Required Arguments:
- appid : Your application id
- regid : The unique identifier for this registration
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.registration.resetGlobalObjectives&appid=myappid®id=myreg001
- Example response:
<success/>
- Error codes:
- 1 : The registration specified by regid does not exist
updateLearnerInfo
- Semantics: Calling this method will update the learner information that was given during previous createRegistration calls. By specifying the learnerid, you can update the first and last name of the learner, and even update the learnerid itself, using the newid parameter.
- Required Arguments:
- appid : Your application id
- learnerid : The id of the learner whose info is being updated
- fname : The first name of the learner
- lname : The last name of the learner
- Optional Arguments:
- newid : The new id to assign to this learner
- Example call: http://cloud.scorm.com/api?method=rustici.registration.updateLearnerInfo&appid=myappid&learnerid=learner01&fname=Test&lname=Learner(&newid=learner101)
- Example response:
<success/>
testRegistrationPostUrl
- Semantics: This method provides a way to test a URL for posting registration results back to, as they would be posted when using the postbackurl in the createRegistration call. When called, an example registration result will be posted to the URL given, or else an error will be reported regarding why the post failed.
- Required Arguments:
- appid : Your application id
- postbackurl : Specifies a URL for which to post activity and
status data in real time as the course is completed
- If the authtype specified is form, or not included, then this status data is posted as 'data' (the key name) along with the other form variables. If the authtype is specified as httpbasic, then the data is HTTP POSTed as the body of the request. The data starts with the <registrationreport ... > element and uses the schema documented in getRegistrationResult
- Optional Arguments:
- authtype : Optional parameter to specify how to authorize against the given postbackurl, can be "form" or "httpbasic". If form authentication, the username and password for authentication are submitted as form fields "username" and "password", and the registration data as the form field "data". If httpbasic authentication is used, the username and password are placed in the standard Authorization HTTP header, and the registration data is the body of the message (sent as text/xml content type). This field is set to "form" by default.
- urlname : You can optionally specify a login name to be used for credentials when posting to the URL specified in postbackurl
- urlpass : If credentials for the postbackurl are provided, this must be included, it is the password to be used in authorizing the postback of data to the URL specified by postbackurl
- resultsformat : This parameter allows you to specify a level of detail in the information that is posted back while the course is being taken. It may be one of three values: "course" (course summary), "activity" (activity summary, or "full" (full detail), and is set to "course" by default. The information will be posted as xml, and the format of that xml is specified below under the method "getRegistrationResult"
- Example call: http://cloud.scorm.com/api?method=rustici.registration.testRegistrationPostUrl&appid=myappid&postbackurl=[encoded url](&authtype=form&urlname=iki&urlpass=secretish&resultformat=course&)
- Example response:
<success/>
- Error Codes:
Invitation Service (rustici.invitation)
This service provides calls to create and enable/disable SCORM Cloud invitations as well as for retrieving information about invitations.
createInvitation
- Semantics: Calling this method will create a new invitation in your SCORM Cloud account, customized with the given parameters, and will return the id for the newly created invitation.
- Required Arguments:
- appid : Your application id
- courseid : The course to which this invitation is being created
- public : A boolean ("true" or "false" only) parameter specifying whether the invitation is public or private. A "true" value creates a public invitation and "false" a private invitation. Public invitations will not be sent to recipients even if addresses are provided. A public invitation will have a URL associated with it which can be provided to learners. The destination of that public URL is a page that requires learners to enter a name and email in order for a registration to be created and the training launched.
Private invitations do not have public launch URLs, but instead creates a launch URL for a specific registration for each email specified in the "addresses" field. Registrations are created at invitation creation time for each email specified.
- Optional Arguments:
- emailSubject : The subject of the email that will be sent to any addresses provided (for private invitations). Below is a list of tags that can be added to the emailSubject field or emailBody field to be replaced by the course or user specific information when sent.
- [COURSE] - the course name
- [COURSE_DESCRIPTION] - the course description
- [COURSE_DURATION] - the course duration
- [USER] - the recipients name
- [URL] - the course launch URL
- [URL:name] - a link to the launch URL with text 'name'
- emailBody : The test that will be sent in the body of emails sent to any addresses provided (for private invitations). In addition to the 'tags' listed above, the emailBody also accepts html tags.
- addresses : A comma separated list of email addresses for which registrations will be created for private invitations.
- send : A boolean ("true" or "false" only) parameter specifying whether the private invitations will be emailed to the provided addresses or not.
- creatingUserEmail : The email of the user who is creating the invitation. This value is required in order to send private invitations.
- registrationCap : The id of the course used to select the dispatch group to download
- postbackurl : Specifies a URL for which to post activity and
status data in real time as the course is completed
- If the authtype specified is form, or not included, then this status data is posted as 'data' (the key name) along with the other form variables. If the authtype is specified as httpbasic, then the data is HTTP POSTed as the body of the request. The data starts with the <registrationreport ... > element and uses the schema documented in getRegistrationResult
- For information on testing your postbackurl, see the testRegistrationPostUrl call.
- authtype : Optional parameter to specify how to authorize against the given postbackurl, can be "form" or "httpbasic". If form authentication, the username and password for authentication are submitted as form fields "username" and "password", and the registration data as the form field "data". If httpbasic authentication is used, the username and password are placed in the standard Authorization HTTP header, and the registration data is the body of the message (sent as text/xml content type). This field is set to "form" by default.
- urlname : You can optionally specify a login name to be used for credentials when posting to the URL specified in postbackurl
- urlpass : If credentials for the postbackurl are provided, this must be included, it is the password to be used in authorizing the postback of data to the URL specified by postbackurl
- resultsformat : This parameter allows you to specify a level of detail in the information that is posted back while the course is being taken. It may be one of three values: "course" (course summary), "activity" (activity summary, or "full" (full detail), and is set to "course" by default. The information will be posted as xml, and the format of that xml is specified below under the method "getRegistrationResult"
- emailSubject : The subject of the email that will be sent to any addresses provided (for private invitations). Below is a list of tags that can be added to the emailSubject field or emailBody field to be replaced by the course or user specific information when sent.
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.createInvitation&appid=myappid&courseid=mycourseid&public=true&creatingUserEmail=myname@mydomain.com
- Example response:
937296cb-ae79-4190-bb6f-9a39b97785ac
createInvitationAsync
- Semantics: This method has the same behavior as the createInvitation service method, but when choosing to send private invitations, the individual learner registration creation and invitation email sending occurs asynchronously. The method will still return the invitation Id, but the job of creating the registrations and sending the invitation email may not yet be complete.
To check the status of your createInvitationAsync job, use the getInvitationStatus method with the invitation Id value returned from this method. - Required Arguments:
- appid : Your application id
- courseid : The course to which this invitation is being created
- public : A boolean ("true" or "false" only) parameter specifying whether the invitation is public or private. A "true" value creates a public invitation and "false" a private invitation. Public invitations will not be sent to recipients even if addresses are provided. A public invitation will have a URL associated with it which can be provided to learners. The destination of that public URL is a page that requires learners to enter a name and email in order for a registration to be created and the training launched.
Private invitations do not have public launch URLs, but instead creates a launch URL for a specific registration for each email specified in the "addresses" field. Registrations are created at invitation creation time for each email specified.
- Optional Arguments:
- emailSubject : The subject of the email that will be sent to any addresses provided (for private invitations). Below is a list of tags that can be added to the emailSubject field or emailBody field to be replaced by the course or user specific information when sent.
- [COURSE] - the course name
- [COURSE_DESCRIPTION] - the course description
- [COURSE_DURATION] - the course duration
- [USER] - the recipients name
- [URL] - the course launch URL
- [URL:name] - a link to the launch URL with text 'name'
- emailBody : The test that will be sent in the body of emails sent to any addresses provided (for private invitations). In addition to the 'tags' listed above, the emailBody also accepts html tags.
- addresses : A comma separated list of email addresses for which registrations will be created for private invitations.
- send : A boolean ("true" or "false" only) parameter specifying whether the private invitations will be emailed to the provided addresses or not.
- creatingUserEmail : The email of the user who is creating the invitation. This value is required in order to send private invitations.
- registrationCap : The id of the course used to select the dispatch group to download
- postbackurl : Specifies a URL for which to post activity and
status data in real time as the course is completed
- If the authtype specified is form, or not included, then this status data is posted as 'data' (the key name) along with the other form variables. If the authtype is specified as httpbasic, then the data is HTTP POSTed as the body of the request. The data starts with the <registrationreport ... > element and uses the schema documented in getRegistrationResult
- For information on testing your postbackurl, see the testRegistrationPostUrl call.
- authtype : Optional parameter to specify how to authorize against the given postbackurl, can be "form" or "httpbasic". If form authentication, the username and password for authentication are submitted as form fields "username" and "password", and the registration data as the form field "data". If httpbasic authentication is used, the username and password are placed in the standard Authorization HTTP header, and the registration data is the body of the message (sent as text/xml content type). This field is set to "form" by default.
- urlname : You can optionally specify a login name to be used for credentials when posting to the URL specified in postbackurl
- urlpass : If credentials for the postbackurl are provided, this must be included, it is the password to be used in authorizing the postback of data to the URL specified by postbackurl
- resultsformat : This parameter allows you to specify a level of detail in the information that is posted back while the course is being taken. It may be one of three values: "course" (course summary), "activity" (activity summary, or "full" (full detail), and is set to "course" by default. The information will be posted as xml, and the format of that xml is specified below under the method "getRegistrationResult"
- emailSubject : The subject of the email that will be sent to any addresses provided (for private invitations). Below is a list of tags that can be added to the emailSubject field or emailBody field to be replaced by the course or user specific information when sent.
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.createInvitationAsync&appid=myappid&courseid=mycourseid&public=false&creatingUserEmail=myname@mydomain.com&addresses=,name1@mydomain.com
- Example response:
937296cb-ae79-4190-bb6f-9a39b97785ac
getInvitationStatus
- Semantics: This method returns the status of the create registration and send email job associated with the creation of an invitation. This method is most relevant to invitations created using the createInvitationAsync method.
- Required Arguments:
- appid : Your application id
- invitationId : The id of the invitation to check the job status of
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.getInvitationStatus&appid=myappid&invitationId=937296cb-ae79-4190-bb6f-9a39b97785ac
- Example response:
<status>complete</status>
- Response Glossary:
- started: Job has been started and is in progress
- canceled: Job has been canceled
- complete: Job is complete
- error: Job threw exception(s) - error elements will also be returned with the response
- notfound: Job was not found. This will be returned for public invitations which do not have any jobs beyond creating the invitation.
getInvitationInfo
- Semantics: This method returns the details of the invitation specified by the sent invitationId.
- Required Arguments:
- appid : Your application id
- invitationId : The id of the invitation to check the job status of
- Optional Arguments:
- detail : A boolean ("true" or "false" only) parameter specifying whether to return registration summary info for any user invitations that are returned for the invitation.
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.getInvitationInfo&appid=myappid&invitationId=937296cb-ae79-4190-bb6f-9a39b97785ac&detail=true
- Example response:
<invitationInfo> <id><![CDATA[35568984-16cf-4d81-92dd-ea69eb4dacd4]]></id> <body><![CDATA[Dear [USER],<p>You have been invited to take 'Feedback 1.2 invite app'. To start your training click on the Play button or copy the training URL into your browser.</p><a href='[URL]'>Play course</a><br><br>URL: [URL]]]></body> <courseId><![CDATA[Feedback1.2inviteapp00ec1901-a17c-4165-9294-fdb105707541]]></courseId> <subject><![CDATA[Feedback 1.2 invite app]]></subject> <url/> <allowLaunch>true</allowLaunch> <allowNewRegistrations>true</allowNewRegistrations> <public>false</public> <created>true</created> <createdDate>2012-05-02T22:13:47.503+0000</createdDate> <userInvitations> <userInvitation> <email><![CDATA[email1@scorm.com]]></email> <url><![CDATA[http://cloud.scorm.com/fasttrack/InvitationLaunch?userInvitationId=12af1419-7d4d-464a-9c24-e3b0271272e0]]></url> <isStarted>false</isStarted> <registrationId><![CDATA[as5a3fe8-8e02-4677-af83-f6d818256278]]></registrationId> <registrationreport format="course" regid="as5a3fe8-8e02-4677-af83-f6d818256278" instanceid="0"> <complete>unknown</complete> <success>unknown</success> <totaltime>0</totaltime> <score>unknown</score> </registrationreport> </userInvitation> <userInvitation> <email><![CDATA[email2@scorm.com]]></email> <url><![CDATA[http://cloud.scorm.com/fasttrack/InvitationLaunch?userInvitationId=288bc606-765f-4c28-bf10-cb219ca8d9cd]]></url> <isStarted>false</isStarted> <registrationId><![CDATA[b2103cd4-8d94-44da-8e25-b0b8822e567b]]></registrationId> <registrationreport format="course" regid="b2103cd4-8d94-44da-8e25-b0b8822e567b" instanceid="0"> <complete>unknown</complete> <success>unknown</success> <totaltime>0</totaltime> <score>unknown</score> </registrationreport> </userInvitation> </userInvitations> </invitationInfo>
getInvitationList
- Semantics: This method returns a list of invitations that meet the filter criteria.
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- filter : A regular expression that will be used to filter the list of invitations. Specifically only those invitations whose invitation Id's match the given expression will be returned in the list.
- coursefilter : A regular express that will be used to filter the list of invitations. Specifically only those invitations that are associated with courses whose courseid's match the given expression will be returned in the list.
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.getInvitationList&appid=myappid&filter=35568984-16cf-4d81-92dd-ea69eb4dacd4
- Example response:
<invitationlist> <invitationInfo> <id><![CDATA[35568984-16cf-4d81-92dd-ea69eb4dacd4]]></id> <body><![CDATA[Dear [USER],<p>You have been invited to take 'Feedback 1.2 invite app'. To start your training click on the Play button or copy the training URL into your browser.</p><a href='[URL]'>Play course</a><br><br>URL: [URL]]]></body> <courseId><![CDATA[Feedback1.2inviteapp00ec1901-a17c-4165-9294-fdb105707541]]></courseId> <subject><![CDATA[Feedback 1.2 invite app]]></subject> <url/> <allowLaunch>true</allowLaunch> <allowNewRegistrations>true</allowNewRegistrations> <public>false</public> <created>true</created> <createdDate>2012-05-02T22:13:47.503+0000</createdDate> <userInvitations/> </invitationInfo> </invitationlist>
changeStatus
- Semantics: This method sets the availability settings of an invitation. An invitation with "enable" set to "true" can be launched. A public invitation with "open" set to "true" allows additional registrations to be created for the invitation.
- Required Arguments:
- appid : Your application id
- invitationId : The id of the invitation to check the job status of
- enable : A boolean ("true" or "false" only) parameter specifying whether to set the invitation to enabled (launchable) or not.
- Optional Arguments:
- open : A boolean ("true" or "false" only) parameter specifying whether a public invitation is still available for learner's to create new registrations. For public invitations, "open" defaults to "false" for this method. Invitations are open ("true") by default.
- Example call: http://cloud.scorm.com/api?method=rustici.invitation.getInvitationStatus&appid=myappid&invitationId=937296cb-ae79-4190-bb6f-9a39b97785ac
- Example response:
<success />
Tagging Service (rustici.tagging)
This service provides the ability to add and remove tags from learners and courses.
getCourseTags
- Semantics: This method will fetch the tags currently associated with the specified course
- Required Arguments:
- appid : Your application id
- courseid : The id of the course for which the tags will be retrieved
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.getCourseTags&appid=myappid&courseid=course003
- Example response:
<tags> <tag>compliance2009</tag> <tag>advanced</tag> </tags>
setCourseTags
- Semantics: This method will set all the tags for the specified course
- Required Arguments:
- appid : Your application id
- courseid : The id of the course for which the tags will be set
- tags : A comma separated list of tags to set for the course
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.setCourseTags&appid=myappid&courseid=course003&tags=compliance2009,advanced
- Example response:
<success />
addCourseTag
- Semantics: This method will associate the given tag with the specified course.
- Required Arguments:
- appid : Your application id
- courseid : The id of the course which the given tag will be associated with
- tag : The tag to associate with the course
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.addCourseTag&appid=myappid&courseid=course003&tag=compliance2009
- Example response:
<success />
removeCourseTag
- Semantics: This method will remove the given tag with the specified course.
- Required Arguments:
- appid : Your application id
- courseid : The id of the course which the given tag is associated with
- tag : The tag to remove from the course
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.removeCourseTag&appid=myappid&courseid=course003&tag=compliance2009
- Example response:
<success />
getLearnerTags
- Semantics: This method will fetch the tags currently associated with the specified learner
- Required Arguments:
- appid : Your application id
- learnerid : The id of the learner for which the tags will be retrieved
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.getLearnerTags&appid=myappid&learnerid=jstudent
- Example response:
<tags> <tag>humanresources</tag> <tag>division_a</tag> </tags>
setLearnerTags
- Semantics: This method will set all the tags for the specified learner
- Required Arguments:
- appid : Your application id
- learnerid : The id of the learner for which the tags will be set
- tags : A comma separated list of tags to set for the learner
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.setLearnerTags&appid=myappid&learnerid=jstudent&tags=humanresources,division_a
- Example response:
<success />
addLearnerTag
- Semantics: This method will associate the given tag with the specified learner.
- Required Arguments:
- appid : Your application id
- learnerid : The id of the learner which the given tag will be associated with
- tag : The tag to associate with the learner
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.addLearnerTag&appid=myappid&learnerid=jstudent&tag=humanresources
- Example response:
<success />
removeLearnerTag
- Semantics: This method will remove the given tag with the specified learner.
- Required Arguments:
- appid : Your application id
- learnerid : The id of the learner which the given tag is associated with
- tag : The tag to remove from the learner
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.removeLearnerTag&appid=myappid&learnerid=jstudent&tag=humanresources
- Example response:
<success />
getRegistrationTags
- Semantics: This method will fetch the tags currently associated with the specified registration
- Required Arguments:
- appid : Your application id
- regid : The id of the registration for which the tags will be retrieved
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.getRegistrationTags&appid=myappid®id=reg001
- Example response:
<tags> <tag>Invitation100</tag> <tag>JulyPromotion</tag> </tags>
setRegistrationTags
- Semantics: This method will set all the tags for the specified registration
- Required Arguments:
- appid : Your application id
- regid : The id of the registration for which the tags will be set
- tags : A comma separated list of tags to set for the registration
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.setRegistrationTags&appid=myappid®id=reg001&tags=Invitation100,JulyPromotion
- Example response:
<success />
addRegistrationTag
- Semantics: This method will associate the given tag with the specified registration.
- Required Arguments:
- appid : Your application id
- regid : The id of the registration which the given tag will be associated with
- tag : The tag to associate with the registration
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.addRegistrationTag&appid=myappid®id=reg001&tag=Invitation100
- Example response:
<success />
removeRegistrationTag
- Semantics: This method will remove the given tag with the specified registration.
- Required Arguments:
- appid : Your application id
- regid : The id of the registration which the given tag is associated with
- tag : The tag to remove from the registration
- Optional Arguments: None
- Example call: http://cloud.scorm.com/api?method=rustici.tagging.removeRegistrationTag&appid=myappid®id=reg001&tag=Invitation100
- Example response:
<success />
Reporting Service (rustici.reporting)
This service provides a set of methods for accessing information about or owned by the account designated by the appid, and ties in with the Reportage reporting application. For more information about accessing Reportage, check out the Reportage Integration Documentation.
getAccountInfo
- Semantics: This method returns information about the account specified by the given appid
- Required Arguments:
- appid : Your application id
- Example call: http://cloud.scorm.com/api?method=rustici.reporting.getAccountInfo&appid=myappid
- Example response:
<account> <email>example@email.com</email> <firstname>Test</firstname> <lastname>Man</lastname> <company>Test Company, Inc.</company> <accounttype>little</accounttype> <reglimit>50</reglimit> <strictlimit>false</strictlimit> <createdate>2009-10-22T08:55:08-0500</createdate> <usage> <monthstart>2009-10-22T08:55:08-0500</monthstart> <regcount>23</regcount> <totalregistrations>89</totalregistrations> <totalcourses>8</totalcourses> </usage> </account>
getReportageAuth
- Semantics : This method serves as the first step for entry into the Reportage application. It returns a session authentication that can be used in subsequent calls to launchReport. The parameters given affect the rights session, like navigation permissions, and access to admin privileges. For more information about accessing Reportage, check out the Reportage Integration Documentation
- Required Arguments:
- appid : Your application id
- navpermission : The navigation permissions for the session. This can be one of three values: NONAV, DOWNONLY, or FREENAV. NONAV will cause the Reportage session to prevent any navigation away from the original report or widget. DOWNONLY will allow the user to drill down to detailed subsections of the report. FREENAV will allow the user to use full navigation in Reportage, and the ability to change any reporting parameters they wish.
- Optional Arguments:
- admin : A boolean ("true" or "false" only) parameter specifying whether or not to grant admin privileges to the launching Reportage session. See Reportage documentation for more info.
- Example call : http://cloud.scorm.com/api?method=rustici.reporting.getReportageAuth&appid=myappid&navpermission=NONAV(&admin=true)
- Example response :
<auth enabled="true">appId=myappid&ts=20101026223117&admin=true&navPermission=NONAV&sig=66F16D0903D9D6D953E7EB5DE914620F</auth>
launchReport
- Semantics : This method serves as the entry for the Reportage application. The desired Reportage URL is passed through the reporturl parameter. The authentication and permissions for the session are passed using the auth parameter, which should match the authentication token retrieve from a previous call to getReportageAuth. For more information about accessing Reportage, check out the Reportage Integration Documentation
- Required Arguments:
- appid : Your application id
- auth : The reportage authentication token retrieved from a previous call to getReportageAuth
- reporturl : The plain text Reportage URL that you want to access. This would typically either be the Reportage homepage "Reportage/reportage.php?appId=[your appid here]" or a URL pointing to a specific report within Reportage. The latter type of URL includes lots of parameters of the report, such as the date range, demographic (via tags), specific course or learner, and so on. These URLs can be found in the Reportage UI as an administrative user, see Reportage user documentation for more info (and screenshots).
- Example call :
http://cloud.scorm.com/api?method=rustici.reporting.launchReport&appid=myappid&
auth=appId%3Dmyappid%26ts%3D20101026223117%26admin%3D true%26navPermission%3DNONAV%26sig%3D66F16D0903D9D6D953E7EB5DE914620F&
reporturl=http%3A//cloud.scorm.com/Reportage/reportage.php%3FappId%3Dmyappid (--note that the Reportage URL in this case is "http://cloud.scorm.com/Reportage/reportage.php?appId=myappid") - Example response : Redirect browser to requested Reportage URL. (In this case, to the Reportage home page.)
Dispatch Service (rustici.dispatch)
This service provides an interface to SCORM Dispatch, a tool used to deliver SCORM content from SCORM Cloud to client LMSs in the form of a simple and highly compatible SCORM 1.2 package. The three important entities to keep in mind when using the API are Course, Dispatch Destination, and Dispatch. A course is any host course that has been imported under your AppId. A dispatch destination should map to clients or locations where you'll be sending your dispatches. In this way, dispatches can be enabled or disabled (or downloaded) per client / location. Finally, a dispatch represents the intersection of a course and destination, and has the downloadable output of a simple SCORM 1.2 package that can then be launched at the given destination. The dispatch package does not contain the course assets of the target course, it just gives access to the package hosted on SCORM Cloud. A dispatch can be enabled or disabled at any time, even after deployment of the dispatch packages, allowing a system of centralized access for the dispatch creator.
getDestinationList
- Semantics: Calling this method will return a page of results showing the list of existing dispatch destinations in your account. Callers should assume another page of data is available by calling again with the page parameter incremented, until an empty list is returned.
- Required Arguments:
- appid : Your application id
- page : Which page of results to return. Page numbers start at 1.
- Optional Arguments:
- tags: A comma separated list of tags to filter results by. Results must be tagged with every tag in the list
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.getDestinationList&appid=myappid&page=1(&tags=test1,test2)
- Example response:
<dispatchDestinations page="1"> <dispatchDestination> <id>1eec6b17-326f-4678-a490-b870a0506140</id> <name>Noddy</name> <tags/> <createdBy>Test User</createdBy> <createDate>2010-07-29T19:14:39.000+0000</createDate> <updateDate>2010-07-29T19:14:39.000+0000</updateDate> </dispatchDestination> <dispatchDestination> <id>6922b1a3-791b-4597-8abb-48de707434a7</id> <name>Test Destination</name> <tags> <tag>test1</tag> </tags> <createdBy>Test User</createdBy> <createDate>2010-08-24T15:28:55.000+0000</createDate> <updateDate>2010-08-24T15:28:55.000+0000</updateDate> </dispatchDestination> </dispatchDestinations> - Error codes:
getDestinationInfo
- Semantics: Calling this method will return information about the dispatch destination named by the given destinationid parameter.
- Required Arguments:
- appid : Your application id
- destinationid : The id of the destination being accessed
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.getDestinationInfo&appid=myappid&destinationid=1eec6b17-326f-4678-a490-b870a0506140
- Example response:
<dispatchDestination> <id>1eec6b17-326f-4678-a490-b870a0506140</id> <name>Noddy</name> <tags/> <createdBy>Test User</createdBy> <createDate>2010-07-29T19:14:39.000+0000</createDate> <updateDate>2010-07-29T19:14:39.000+0000</updateDate> </dispatchDestination> - Error codes:
- 1 : Destination with given id does not exist
- 98 : Permission denied to access destination with given id
createDestination
- Semantics: Calling this method will create a new Dispatch Destination in your SCORM Cloud account, customized with the given parameters, and will return the id for the newly created destination.
- Required Arguments:
- appid : Your application id
- name : The name of the new destination
- Optional Arguments:
- tags : A comma separated list of tags to add to this destination
- email : The email address associated with the user creating this destination
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.createDestination&appid=myappid&name=Test+Destination(&tags=test1,test2&email=test@test.com)
- Example response:
<destinationId>6922b1a3-791b-4597-8abb-48de707434a7</destinationId>
- Error codes:
updateDestination
- Semantics: Calling this method will update the Dispatch Destination, identified with the given destinatonid, in your SCORM Cloud account.
- Required Arguments:
- appid : Your application id
- destinationid : The name of the new destination
- Optional Arguments:
- name : The new name for this destination
- tags : A comma separated list of tags to set for this destination
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.updateDestination&appid=myappid&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&name=Test+Destination+2(&tags=test1,test3)
- Example response:
<success />
- Error codes:
deleteDestination
- Semantics: Calling this method will delete the Dispatch Destination, identified with the given destinatonid, from your SCORM Cloud account.
- Required Arguments:
- appid : Your application id
- destinationid : The name of the new destination
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.deleteDestination&appid=myappid&destinationid=6922b1a3-791b-4597-8abb-48de707434a7
- Example response:
<success />
- Error codes:
getDispatchList
- Semantics: Calling this method will return a page of results showing the list of existing dispatches in your account. Callers should assume another page of data is available by calling again with the page parameter incremented, until an empty list is returned.
- Required Arguments:
- appid : Your application id
- page : Which page of results to return. Page numbers start at 1.
- Optional Arguments:
- destinationid : Show only dispatches belonging to the destination named by this id
- courseid : Show only dispatches for the course named by this id
- tags : A comma separated list of tags to filter results by. Results must be tagged with every tag in the list
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.getDispatchList&appid=myappid&page=1(&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&courseid=course001&tags=test1,test2)
- Example response:
<dispatches page="1"> <dispatch> <id>2737abf6-46f9-479d-a52b-34cd8e8dadae</id> <destinationId>1eec6b17-326f-4678-a490-b870a0506140</destinationId> <appId>N67DM67K0E</appId> <courseAppId>N67DM67K0E</courseAppId> <courseId>SequencingForcedSequential_SCORM20043rdEditionb0535515-a4c9-4dad-bd85-04bcc54f96b7</courseId> <enabled>true</enabled> <tags/> <notes></notes> <createdBy>Test User</createdBy> <createDate>2011-01-26T17:51:31.000+0000</createDate> <updateDate>2011-01-26T17:51:31.000+0000</updateDate> </dispatch> <dispatch> <id>6ecc95a8-a8a8-40d2-991c-a9e34314f695</id> <destinationId>6922b1a3-791b-4597-8abb-48de707434a7</destinationId> <appId>N88DM88K0E</appId> <courseAppId>N88DM88K0E</courseAppId> <courseId>RunTimeAdvancedCalls_SCORM20043rdEdition-1e6b40aa7-0fe8-44a0-95ce-5cdb960c6630</courseId> <enabled>true</enabled> <tags> <tag>newer</tag> </tags> <notes></notes> <createdBy>Test User</createdBy> <createDate>2011-02-24T18:00:33.000+0000</createDate> <updateDate>2011-02-24T18:00:33.000+0000</updateDate> </dispatch> </dispatches> - Error codes:
getDispatchInfo
- Semantics: Calling this method will return information about the dispatch named by the given dispatchid parameter.
- Required Arguments:
- appid : Your application id
- dispatchid : The id of the dispatch being accessed
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.getDispatchInfo&appid=myappid&dispatchid=6ecc95a8-a8a8-40d2-991c-a9e34314f695
- Example response:
<dispatch> <id>6ecc95a8-a8a8-40d2-991c-a9e34314f695</id> <destinationId>6922b1a3-791b-4597-8abb-48de707434a7</destinationId> <appId>N88DM88K0E</appId> <courseAppId>N88DM88K0E</courseAppId> <courseId>RunTimeAdvancedCalls_SCORM20043rdEdition-1e6b40aa7-0fe8-44a0-95ce-5cdb960c6630</courseId> <enabled>true</enabled> <tags> <tag>newer</tag> </tags> <notes></notes> <createdBy>Test User</createdBy> <createDate>2011-02-24T18:00:33.000+0000</createDate> <updateDate>2011-02-24T18:00:33.000+0000</updateDate> </dispatch> - Error codes:
- 1 : Dispatch with given id does not exist
- 98 : Permission denied to access dispatch with given id
createDispatch
- Semantics: Calling this method will create a new dispatch in your SCORM Cloud account, customized with the given parameters, and will return the id for the newly created dispatch.
- Required Arguments:
- appid : Your application id
- destinationid : The id of the destination this dispatch will be associated with
- courseid : The id of the course this dispatch will be associated with
- Optional Arguments:
- tags : A comma separated list of tags to add to this dispatch
- email : The email address associated with the user creating this dispatch
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.createDispatch&appid=myappid&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&courseid=course001(&tags=test1,test2&email=test@test.com)
- Example response:
<dispatchId>6ecc95a8-a8a8-40d2-991c-a9e34314f695</dispatchId>
- Error codes:
- 1 : Dispatch destination with given id does not exist
- 2 : Course with given id does not exist
- 98 : Permission denied to create dispatch against destination with given id
updateDispatches
- Semantics: Calling this method will update the selected dispatches in your SCORM Cloud account, using the parameters given. Selection of dispatches to update is based either on a specific dispatch using the dispatchid parameter, or groups of dispatches using the destinationid, courseid, or tags parameters in any combination.
- Required Arguments:
- appid : Your application id
- [dispatchid|destinationid|courseid|tags] : One of these parameters must be included (see below)
- Optional Arguments:
- dispatchid : The id of the dispatch to update
- destinationid : The id of the destination used to select the dispatch group to update
- courseid : The id of the course used to select the dispatch group to update
- tags : A comma separated list of tags used to select the dispatch group to update. Each dispatch selected will have to be tagged with each tag in the list.
- enabled : Setting "true" or "false" will enable or disable the selected group of dispatches
- addtags : A comma separated list of tags to add to the selected dispatches
- removetags : A comma separated list of tags to remove from the selected dispatches
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.updateDispatches&appid=myappid(&dispatchid=6ecc95a8-a8a8-40d2-991c-a9e34314f695&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&courseid=course001&tags=test1,test2&enabled=false&addtags=deprecated,old&removetags=test1)
- Example response:
<success />
- Error codes:
downloadDispatches
- Semantics: Calling this method will use the dispatches selected by the given parameters to create and deliver a package containing the resources used to import and launch those dispatches in client systems. The return of this call is a download stream containing a zip file, which in turn contains zip files for each of the selected dispatches.
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- dispatchid : The id of the dispatch to download
- destinationid : The id of the destination used to select the dispatch group to download
- courseid : The id of the course used to select the dispatch group to download
- tags : A comma separated list of tags used to select the dispatch group to download. Each dispatch selected will have to be tagged with each tag in the list.
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.downloadDispatches&appid=myappid(&dispatchid=6ecc95a8-a8a8-40d2-991c-a9e34314f695&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&courseid=course001&tags=test1,test2)
- Example response:
Call results in application/octet-stream for zip of zips file
- Error codes:
deleteDispatches
- Semantics: Calling this method will delete the selected dispatches from your SCORM Cloud account, using the parameters given. Selection of dispatches to delete is based either on a specific dispatch using the dispatchid parameter, or groups of dispatches using the destinationid, courseid, or tags parameters in any combination.
- Required Arguments:
- appid : Your application id
- [dispatchid|destinationid|courseid|tags] : One of these parameters must be included (see below)
- Optional Arguments:
- dispatchid : The id of the dispatch to delete
- destinationid : The id of the destination used to select the dispatch group to delete
- courseid : The id of the course used to select the dispatch group to delete
- tags : A comma separated list of tags used to select the dispatch group to delete. Each dispatch selected will have to be tagged with each tag in the list.
- Example call: http://cloud.scorm.com/api?method=rustici.dispatch.deleteDispatches&appid=myappid(&dispatchid=6ecc95a8-a8a8-40d2-991c-a9e34314f695&destinationid=6922b1a3-791b-4597-8abb-48de707434a7&courseid=course001&tags=test1,test2)
- Example response:
<success />
- Error codes:
Export Service (rustici.export)
This service provides a simple interface to request an export of the user data created on the SCORM Cloud. This data includes all the metadata and object xml for every course and registration.
start
- Semantics: Calling this method will start a new data export, and return an id that can be used to check on the status of the export using a call to rustici.export.status. Note that only one data export can be active at a time.
- Required Arguments:
- appid : Your application id
- Optional Arguments:
- Example call: http://cloud.scorm.com/api?method=rustici.export.start&appid=myappid
- Example response:
<export_id>937296cb-ae79-4190-bb6f-9a39b97785ac</export_id>
- Error codes:
- 1 : There is already a running export
cancel
- Semantics: Calling this method will cancel the export with the passed in export id.
- Required Arguments:
- appid : Your application id
- exportid : The id of the export to cancel
- Example call: http://cloud.scorm.com/api?method=rustici.export.cancel&appid=myappid&exportid=937296cb-ae79-4190-bb6f-9a39b97785ac
- Example response:
<success />
- Error codes:
- 1 : Export specified by exportid not found
status
- Semantics: A call to this method will return some detailed information about an export, including the export status (started, canceled, complete, error), the start date, the end date (if complete), the percent complete, and the server from which the export should be downloaded.
- Required Arguments:
- appid : Your application id
- exportid : The id of the export for which to retrieve status
- Example call: http://cloud.scorm.com/api?method=rustici.export.status&appid=myappid&exportid=937296cb-ae79-4190-bb6f-9a39b97785ac
- Example response:
<export id="5824b207-9311-4e7f-b4f0-0e8b46cffb51"> <appid>myappid</appid> <status>complete</status> <start_date>2009-10-22T08:52:00-0500</start_date> <end_date>2009-10-22T08:55:08-0500</end_date> (end date only present if status is complete) <percent_complete>100.0</percent_complete> <server_location>example1.dns.name</server_location> </export>
- Error codes:
- 1 : Export specified by the given export id not found
download
- Semantics: Calling this method returns the actual export data for a given export. Note that the export must be complete in order to download it's associated data. Also note that this call must be issued to the server listed in the server_location element (as returned by a status call).
- Required Arguments:
- appid : Your application id
- exportid : The id of the export to download
- Example call: [web service instance using server obtained in status call (ex: "http://example1.dns.name/EngineWebServices")]/api?method=rustici.export.download&appid=myappid&exportid=5824b207-9311-4e7f-b4f0-0e8b46cffb51
- Example response: A file containing the export data in xml format.
- Error codes:
- 1 : Export specified by the given export id not found
- 2 : Export specified is not complete
- 3 : Couldn't find the file data associated with the export (possibly incorrect server?)
list
- Semantics: This method returns a list of export data for all exports current and historical. The format of each export in the list is the same as that returned by the status call above.
- Required Arguments:
- appid : Your application id
- exportid : The id of the export for which to retrieve status
- Example call: http://cloud.scorm.com/api?method=rustici.export.status&appid=myappid&exportid=937296cb-ae79-4190-bb6f-9a39b97785ac
- Example response:
<exports> <export id="5824b207-9311-4e7f-b4f0-0e8b46cffb51"> <appid>myappid</appid> <status>complete</status> <start_date>2009-10-22T08:52:00-0500</start_date> <end_date>2009-10-22T08:55:08-0500</end_date> (end date only present if status is complete) <percent_complete>100.0</percent_complete> <server_location>example1.dns.name</server_location> </export> ... </exports>
Get Support
As always, if you have any questions, please shoot them over to us at support@scorm.com and we'll do our best to clear up any gray areas. We'd love the opportunity to use your feedback to make our documentation, service, and site even better!