Overview

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](&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) Authentication for web service calls is largely modeled off of the flickr model, which can be found here . In summary, each http request sent to a secured web services instance must contain the following parameters to pass the security check: appid : Your application id, acquired upon registration with the IKI services website 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 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) 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 201 202 203 204 205 : : : : : : Invalid service call (the method parameter is missing or incorrect) Service unavailable Method not found A required parameter for the called method is missing from the request An invalid format parameter is specified (for now format is ignored, only XML is returned) 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.

API Listing

Debug Service

(rustici.debug)

This unsecured service is to provide a very basic set of simple method calls to check the status of a running web service instance.

ping

This format is used for the timestamp that is part of the security mechanism. Also.course. after that it is no longer valid. and use the information returned in the latter call. If the optional domain parameter is included.importCourse (with the optional "path" parameter).scorm. Primarily. and a token id.debug. The token parameter must be specified. HTTP form w/ input of type file) data. the web service "core") and making sure the instance is up and running Required Arguments: none Optional Arguments: none Example call: http://cloud.upload.e. this service exists for uploading course zip files that can be used in a subsequent call to rustici.scorm. Every other parameter (other than the file data) must be specified on the querystring.com/api?method=rustici. and every upload operation must include the appid parameter. the file will be placed under this domain within the application's upload area. It's purpose is to have a simple way of testing the underlying mechanisms for delivering the web services (i. More details are found in the description for uploadFile below.ping Example response: <pong /> getTime Semantics: This method returns the time on the running instance. The token is roughly equivalent to an upload reservation. The token id can only be used once in a subsequent call to uploadFile. uploadFile should be called immediately after getUploadToken. In typical use. in (UTC/GMT) timezone in the form 'yyyyMMddHHmmss'.com/api?method=rustici.upload) This secured service provides a way to upload (over HTTP) files that can be used in subsequent web service calls.Semantics: This method simply responds to the user.getTime Example response: <currenttime tz="UTC">20081217152345</currenttime> Upload Service (rustici. Required Arguments: none Optional Arguments: none Example call: http://cloud. and include the id of the token retrieved from the call to getUploadToken above. Each application targetting the web services will be granted it's own upload area.debug. getUploadToken Semantics: This method returns an upload token. This method will return a relative path to the file (relative to the root of your specific application's upload area). Required Arguments: appid : Your application id Example call: web service instance /api?method=rustici. the server returned in . These two pieces of information are then used in a call to uploadFile.e. which is comprised of a server.getUploadToken&appid=myappid Example response: <token> <id>8a3a9a71-c779-4be8-9b85-1d09b98689d8</id> </token> uploadFile Semantics: This method expects the incoming HTTP request to be a POST of multipart (i.

zip" size="552868" modified="20081216200658"/> <file name="Photoshop_KnowledgePaced.scorm.com/api?method=rustici.uploadFile&appid=myappid&token=[id from previously obtained token]" enctype="multipart/form-data"> <input type="file" name="filedata" size="40" /> <br /> <input type="submit" value="Send" /> </form> Example response: <location>testdomain/Photoshop_None.upload. If the call failed. This allows developers to direct the user automatically to another page when a form is submitted in a browser. appending the following querystring parameters: a "success" parameter noting success/failure. Required Arguments: appid : Your application id file : The file(s) to be deleted.zip</location> Error codes: 1 2 3 4 5 : : : : : Invalid token File upload caused an IO error No file data was found in the request The file uploaded did not have the required extension (some instances may force uploads of only a certain type) Some other error occurred in uploading the file listFiles Semantics: A call to this method will return a listing of files that have been uploaded using the given appid.zip" size="553332" modified="20090108215221"/> </dir> deleteFiles Semantics: A call to this method will attempt to delete each file specified in the file parameter. Required Arguments: appid : Your application id token : The token id obtained from a call to getUploadToken Optional Arguments: redirecturl : The url that a browser should be redirected to after the operation completes.listFiles&appid=myappid Example response: <dir name="testdomain"> <file name="LMSTestPackage_API. Example call: An example call is best illustrated with a simple http form: <form id="uploadtester" method="post" action="http://cloud.scorm.upload.com/api?method=rustici. If the optional redirecturl parameter is specified. a "location" parameter that specifies the relative location of the uploaded file (relative to the root of your application). and a "msg" parameter specifying the error message. each file specified will be deleted (or attempted . Required Arguments: appid : Your application id Example call: http://cloud. in which case. Note that this parameter can have multiple values.getUploadToken must be used for the web service instance URL below.zip" size="106866" modified="20090109194600"/> <file name="Photoshop_Competency. and if successful. the url will be appended with an "errcode" parameter specifying the error code. the browser sending the request will be redirected to the given url.

and hence the POST action should be used in those cases Example response: <results> <result file="Photoshop_Remediation.zip *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.zip) Example response: <importresult successful="true"> <title>Photoshop Example -. This call expects that the file to be imported has already been uploaded.course. This allows for the import of an aggregation or a specific SCO/asset within an organization. Course Service (rustici. it returns an import result . or through FTP access.scorm.zip" deleted="true"/> <result file="NotReallyThere.upload.zip&file=NotReallyThere. the service will try to import the course named by the path parameter by looking for this path under the uploads area specific to the given appid. importCourse Semantics: If the path parameter is specified.com/api?method=rustici. if the zip file being imported does not contain an imsmanfiest. either through a web service call to rustici.com/api?method=rustici.importCourse&appid=myappid&courseid=course003&path=default/Course003. The difference is that this call is asynchronous and returns immediately.scorm. Instead of returning the results of a completed import. that is).upload. Example call: http://cloud.deleteFiles&appid=myappid&file=Photoshop_Remediation.uploadFile.to be deleted.xml file) importCourseAsync Semantics: The semantics of this method are similar to the importCourse method.course) This secured service allows for many operations related to courses. Required Arguments: appid : Your application id courseid : The id used to identify this course path : The relative path (rooted at your specific appid's upload area) where the zip file for importing can be found Optional Arguments: itemid: The item identifier of a specific learning object to import. Example call: http://cloud. including importing new courses and retrieving information about imported courses. use versionCourse) 2 : The file specified in the optional path parameter can't be found Also remember to check the successful flag on the importresult element.Competency</title> <message>Import Successful</message> [possibly <parserwarnings> <warning>[warning text]</warning> </parserwarnings> ] </importresult> Error codes: 1 : A course with the given courseid already exists (to create a new version of a course. as even a "successful" web service call to importCourse can result in a failed import (for example.zip" deleted="false" /> </results> Error Codes: Any errors in deleting the named files will just report a deleted="false" for that file. instead of waiting for the import process to complete.

The results of the import started can be retrieved using getAsyncImportResult. Required Arguments: appid : Your application id courseid : The id used to identify this course path : The relative path (rooted at your specific appid's upload area) where the zip file for importing can be found Optional Arguments: itemid: The item identifier of a specific learning object to import. Required Arguments: appid : Your application id token : The id of the token returned by importCourseAsync. the status will be set to "error" and details of the error will be added to the output. This allows for the import of an aggregation or a specific SCO/asset within an organization.scorm.com/api?method=rustici. A course must first exist in order to be specified (by courseid) in versionCourse.com/api?method=rustici.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 -. which should be used in subsequent calls to getAsyncImportResult to actually get the import results (or import errors).course. Other than this difference.scorm. See example call/response below. If the status is "finished". the import results will be included. the details of both the request and response match the importCourse call outlined above Required Arguments: Same as importCourse above Optional Arguments: . An import is started asynchronously using importCourseAsync. If an error or other exception has occurred during the import.course.zip) Example response: <token> <id>e2bfa26e-2e96-48e3-86a6-f435fba6dccb</id> </token> getAsyncImportResult Semantics: This call is the other necessary half of asynchronous importing. Example call: http://cloud. and additional information based on that status. Example call: http://cloud. The result of this call returns a status.importCourseAsync&appid=myappid&courseid=course003&path=default/Course003.Competency</title> <message>Import Successful</message> [possibly <parserwarnings> <warning>[warning text]</warning> </parserwarnings> ] </importresult> </importresults> versionCourse Semantics: This method is used to create a new version of an existing course.token.

zip Example response: Same as importCourse above Error codes: 1 : The course specified by the given courseid can not be found 2 : The file specified in the optional path parameter can't be found preview Semantics: Calling this method will preview the course by redirecting the user's browser.versionCourse&appid=myappid&courseid=course003&path=default/Course003. Optional Arguments: . 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: <result>true</result> getAssets Semantics: This method provides a simple mechanism to download files for a given course.course.com/api?method=rustici. this method will not return any XML response. by redirecting the user's 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 exists Semantics: This method is used to check a whether or not the specified course exists.scorm. If the optional path parameter is not specified. all the assets for the course will be returned in the zip file.Same as importCourse above Example call: http://cloud. This method is intended to be called directly in a browser.xml or metadata files. but rather an application/octet-stream response containing the data of the requested course assets. returned in the form of a zip file. 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 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. or many files at once. If no error occurs during processing of the call. This call provides a way to quickly retrieve important files like the imsmanifest. Required Arguments: appid : Your application id courseid : The id used to identify the course under which the assets should be found.

will be overlayed on top of the files belonging to the course specifed by courseid (and versionid). Required Arguments: appid : Your application id courseid : The id used to identify the course for deletion Optional Arguments: versionid : The version of the package which will be udpated. A call can optionally include a versionid parameter which will name a specific version of the course to be deleted. If absent. If this parameter is not specified. Example call: http://cloud. delete just the most recent version of the package. If this parameter has multiple values.scorm. use the most recent version. all versions of the package will be deleted.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. all the assets for the course will be returned in the zip file. which is sent through the request or specified by the optional path parameter. and each file will be at the relative path specified underneath that root.course. If this parameter has only a single value. just the one file will be returned. except that a new version of the course is not created.path : The (relative) file path to a specific asset. The path is relative to the course root.scorm. only the assets of the course are updated. each of the assets specified will be packaged together into a zip file. If "latest". use the most recent version.com/api?method-rustici. If absent. delete all versions of the package. Example call: http://cloud.course. Files found in the zip file. 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 Optional Arguments: versionid : The version of the package which will be deleted. while an error will return error details in the common format updateAssets Semantics: This method is very similar to versionCourse above.getAssets&appid=myappid&courseid=course003(&versionid=2&path=images/birdfeeder.com/api?method=rustici. the structure will exactly resemble the structure returned in the call to getFileStructure. Example call: http://cloud. The structure of the zip file will have the courseid as the root.) versionid : The version of the package which will be used.course.deleteCourse&appid=myappid&courseid=course003(&versionid=[version number] OR versionid=all) Example response: <success /> .updateAssets&appid=myappid&courseid=course003(&versionid=[version number]&path=default/Course003. If absent.jpg) Example response: Success will result in a file download.jpg&path=images/birdfeederscaled.com/api? method=rustici.scorm. (If no path specified. If absent.

that is).gif" size="136" modified="20090108210616"/> [.. If absent. If absent. and hence the .gif" size="142" modified="20090108210616"/> </dir> [. use the most recent version. use the most recent version.scorm.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.dtd" size="16018" modified="20090108210616"/> </dir> Error Codes: 1 : Could not find the given course specified by courseid (and versionid) 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.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. Including the optional versionid parameter will target a specific version of the course for this call. The method returns a list of results for each path. Example call: http://cloud. The path specified is relative to the root of the course files belonging to the course named by the courseid parameter..xsd" size="2846" modified="20090108210616"/> <file name="adlnav_v1p3. 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.deleteFiles&appid=myappid&courseid=course003&path=image1.jpg&path=image3.com/api?method=rustici.com/api? method=rustici.course.xsd" size="2109" modified="20090108210616"/> <file name="adlseq_v1p3.htm" size="20073" modified="20090108210616"/> <dir name="images"> <file name="37.. Note that this parameter can have multiple values.] <file name="ZoomToolIcon. Example call: http://cloud. Optional Arguments: versionid : The specific version of the course that you wish to act upon.gif" size="70" modified="20090108210616"/> <file name="72.scorm.jpg(&path=image2.course. Required Arguments: appid : Your application id courseid : The id used to identify the course Optional Arguments: versionid : The specific version of the course that you wish to act upon. in which case.xsd" size="2649" modified="20090108210616"/> <file name="datatypes.gif" size="169" modified="20090108210616"/> <file name="Addition. All dates shown are of the format yyyyMMddHHmmss and in the UTC timezone. each file specified will be deleted (or attempted.dtd" size="6357" modified="20090108210616"/> <file name="Exam. and whether the deletion was successful.] <file name="XMLSchema. such as file length and last modified date. along with some very basic metadata about the files.getFileStructure&appid=myappid&courseid=course003(&versionid=[version number]) Example response: <dir name="photoshop_competency"> <file name="adlcp_v1p3..

Any faulty values given will be ignored. it will not appear in the returned list.) Required Arguments: appid : Your application id courseid : The id used to identify the course for which the attributes will be updated Optional Arguments: versionid : The specific version of the course to target for this call.com/api? method=rustici.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. as detailed elsewhere in this doc.course.POST action should be used in those cases Example response: <results> <result path="images/birdfeeder.course.] <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. use the most recent version..updateAttributes&appid=myappid&courseid=course003&showNavBar=true&showCourseStructure=false(and so on) Example response: .com/api?method=rustici. (If an attribute is set to it's existing value.scorm. An error free call to this method will return a list of attributes that have been changed along with their new values. see example usage below. Example call: http://cloud. Required Arguments: appid : Your application id courseid : The id used to identify the course for which the attributes will be retrieved Optional Arguments: versionid : The specific version of the course to target for this call. If absent.getAttributes&appid=myappid&courseid=course003(&versionid=2) Example response: <attributes> <attribute name="alwaysFlowToFirstSco" value="false"/> <attribute name="commCommitFrequency" value="10000"/> <attribute name="commMaxFailedSubmissions" value="2"/> [. use the most recent version.scorm. Example call: http://cloud.. Only changed values will appear. The attribute names and values are specified as name/value parameters in the HTTP request. These attributes can be updated with a call to updateAttributes.jpg" deleted="true"/> <result path="images/doesnotexist. getAttributes Semantics: Calling this method will return the names and values of the editable attributes for the course named by the courseid parameter. If absent.

as well as the format of the metadata (summary or detailed). I'm awaiting Troy's return to get to some of the code related to his metadata editor) versionid : The specific version of the course to target for this call. use the most recent version. Example call: http://cloud. Optional parameters can be included to specify both the scope of the metadata that is returned (course level only or activity level). return data for every activity / learning object in the course. If specified as "detail".scorm. and mastery score for each learning object. mdformat : If specified as summary. description. duration. (*Edit note from DE: The detailed report is currently unimplemented. return a much larger set of data. If specified as "course" return only data about the root learning object. If specified as "activity". typical time. key words.<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.com/api? method=rustici.course. 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. return only the most important subset of metadata such as title. If absent.getCourseMetadata&appid=myappid&courseid=course003(&versionid=2&scope=activity&format=detailed) 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> .

a learner id. To create new instances of existing registrations.getCourseMetadata&appid=myappid(&filter=. Required Arguments: appid : Your application id courseid : The course for which this registration is being created . as well as a way to specify simple authentication schemes for posting said data. createRegistration Semantics: This method is used to create a new registration.<typicaltime>0</typicaltime> <keywords> <keyword>Training</keyword> </keywords> <masteryscore/> </metadata> </object> </children>] </object> </package> If mdformat is "full": *Yet to be implemented.scorm. for now return same as summary Error codes: 1 : Course named by courseid not found getCourseList Semantics: This method will return a list of courses associated with the given appid.Competency" versions="1" registrations="2" /> <course id="course321" title="Another Test Course" versions="2" registrations="5" /> </courselist> Registration Service (rustici. A registration must be tied to a specific course at creation time. Example call: http://cloud. and optionally.registration) This service provides calls for creating and removing registrations. information about where activity data should be posted (for client consumption). Required Arguments: appid : Your application id Optional Arguments: filter : A regular expression that will be used to filter the list of courses. When the created registration is "launched". and launching existing registrations.*321) Example response: <courselist> <course id="test321" title="Photoshop Example -. Specifically only those courses whose courseid's match the given expression will be returned in the list. as noted below. A registration will contain a few pieces of information such as a learner name. 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.com/api?method=rustici.course. the course specified at creation time will be launched. createNewInstance should be used instead.

and is set to "course" by default..scorm. Required Arguments: appid : Your application id regid : The unique identifier for this registration Example call: http://cloud. The information will be posted as xml. and the format of that xml is specified below under the method "getRegistrationResult" versionid : Optionally. this must be included.registration. If this parameter is missing. 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.com/api?method=rustici. 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. the most recent version of the package is used Example call: http://cloud. If form authentication. authtype : Optional parameter to specify how to authorize against the given postbackurl.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: postbackurl : Specifies a URL for which to post activity and status data in real time as the course is completed This status data is posted as 'data' (the key name) and starts with the <registrationreport . 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. > element and mirrors that schema found below. This field is set to "form" by default.com/api? method=rustici. It may be one of three values: "course" (course summary).createRegistration&appid=myappid&courseid=course003&regid=myreg001&fname=jimbo&lname=roth&learnerid=jroth(postbackurl=[encoded url]&authtype=form&urlname=iki&urlpass=secretish&resultformat=course&versionid=3) *Note that it could be fairly easy to exceed the maximum length of a query string based GET using this call. and will consequently report success or throw an error. specify a particular version of the course specified by courseid above. and the registration data as the form field "data".deleteRegistration&appid=myappid&regid=myreg001 Example response: <success/> Error codes: 1 : The registration specified by regid does not exist resetRegistration .registration. "activity" (activity summary. If httpbasic authentication is used. the username and password for authentication are submitted as form fields "username" and "password". the username and password are placed in the standard Authorization HTTP header.scorm. and the registration data is the body of the message (sent as text/xml content type). can be "form" or "httpbasic". or "full" (full detail)..

registration.321) Example response: <registrationlist> <registration id="reg4" courseid="test321"> <instances> <instance id="0" courseversion="0" /> <instance id="1" courseversion="0" /> <instance id="2" courseversion="1" /> .resetRegistration&appid=myappid&regid=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. "course". Specifically only those registrations that are associated with courses whose courseid's match the given expression will be returned in the list. </registrationlist> getRegistrationResult Semantics: A call to this method will return information about the specified registration. etc.. Also..com/api?method=rustici.4&coursefilter=. Example call: http://cloud. and as such. the registration being reset will automatically be registered for the latest version.scorm. 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. If the course for which the registration is registered has multiple versions.Semantics: Calling this method will reset the specified registration. </instances> </registration> . another optional parameter. it will be used as a regular expression against the registration id to filter the returned list of registrations. Specifically only those registrations whose regid's match the given expression will be returned in the list. coursefilter. Required Arguments: appid : Your application id regid : The unique identifier for this registration Optional Arguments: Example call: http://cloud. If the optional filter parameter is specified. coursefilter : A regular express that will be used to filter the list of registrations. If specified as "course".. This is essentially the same as deleting and recreating the registration.com/api?method=rustici. only top level . Required Arguments: appid : Your application id Optional Arguments: filter : A regular expression that will be used to filter the list of registrations. "activity".course. 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. will delete all the data associated with the registration (including launch history.scorm..getCourseMetadata&appid=myappid(&filter=. or "full".).

"course" is used.information such as completion status. If specified as "full".. </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. the full set of CMI runtime and activity data is returned for every activity in the course.com/api?method=rustici.. and score will be returned.registration. If specified as "activity". </children> </activity> <activity> ..scorm. total time spent.getRegistrationResult&appid=myappid&regid=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 -. By default. Example Call: http://cloud. similar summary information will be return for every activity in the course.. <score>0</score> <children> .0</normalizedmeasure> <progressstatus>true</progressstatus> <satisfiedstatus>true</satisfiedstatus> ... success status.Competency</title> <attempts>1</attempts> <complete>false</complete> <success>false</success> <time/> <score>0</score> <children> [if activity has children] <activity id="LESSON1"> <title>Lesson 1</title> .

00</total_time> <timetracked>0000:00:04...... </interactions> <objectives> <objective id="PRIMARYOBJ"> <score_scaled/> <score_min/> <score_raw/> <score_max/> . </comments_from_lms> <interactions> <interaction id="1"> <objectives> <objective id="1" /> ... </objectives> <runtime> <completion_status>completed</completion_status> <credit>Credit</credit> <entry>AbInitio</entry> <exit>Unknown</exit> <learnerpreference> <audio_level>1.</objective> . </objectives> <timestamp /> <correct_responses> <response id="1" /> ...0</audio_level> <language/> <delivery_speed>1..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> . </correct_responses> <weighting /> <learner_response /> <result /> <latency /> <description /> </interaction> ..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.

(For report of another instance. </children> </activity> </registrationreport> Error codes: 1 : The registration specified by the given regid does not exist getRegistrationListResults Semantics: This method is. If specified as "activity".getCourseMetadata&appid=myappid(&filter=.. or "full". The response contains the chosen list of registrations. By default. </acitivity> .com/api?method=rustici.4&coursefilter=. use getRegistrationResult and specify the instance id.course.scorm. only top level information such as completion status.. and can be used for very basic reporting functionality. a combination of getRegistrationList and getRegistrationResult. The single report included for each registration is obtained from the most recent instance of the registration. If specified as "course". Specifically only those registrations that are associated with courses whose courseid's match the given expression will be returned in the list.. "course". as it is titled. "activity". the full set of CMI runtime and activity data is returned for every activity in the course. Example call: http://cloud. success status. similar summary information will be return for every activity in the course. and score will be returned.<success_status>unknown</success_status> <completion_status>unknown</completion_status> <progress_measure/> <description>null</description> </objective> .) Required Arguments: appid : Your application id Optional Arguments: filter : A regular expression that will be used to filter the list of registrations. "course" is used... </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"> .321&resultsformat=full) Example response: <registrationlist> <registration id="reg4" courseid="test321"> <instances> <instance id="0" courseversion="0" /> <instance id="1" courseversion="0" /> <instance id="2" courseversion="1" /> . coursefilter : A regular express that will be used to filter the list of registrations. and each registration includes a report of the same format received from a call to getRegistrationResult. total time spent.. If specified as "full". resultsformat : This optional parameter can be one of three values. Specifically only those registrations whose regid's match the given expression will be returned in the list.

.registration.com/api?method=rustici.registration.. </registrationreport> </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. learnerTags: Comma-delimited list of tags to associate with the learner who is launching the course.launch&appid=myappid&regid=myreg001(&redirecturl=http%3A//www. [format of registrationreport element same as above in getRegistrationResult call] <registrationreport format="summary" regid="reg4" instanceid="2"> .. respectively. By default.css) Example response: The user will be redirected to the launch page for the given registration. this method is intended to be called directly in a browser.. Any new tags are appended to the registration-independent tag list for this course as well.. this parameter can alternatively be any of the following keywords: "closer".com/api? method=rustici. registrationTags: Comma-delimited list of tags to associate the the launched registration itself disableTracking: if set to "true". or a page with a simple message about the course being complete. "message" which will redirect to a page that automatically tries to close the browser tab/window. Required Arguments: appid : Your application id regid : The unique identifier for this registration Optional Arguments: Example call: http://cloud. 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.com&cssurl=http%3A//localhost/customstylesheet.scorm.google.. Any new tags are appended to the registration-independent tag list for this learner as well. a blank page. this is simply a blank html page. </instances> </registration> .. For convenience. Before redirecting the user. Unlike nearly all the other web service calls. the registration will be launched with tracking disabled. courseTags: Comma-delimited list of tags to associate with the launched course. "blank".scorm.resetGlobalObjectives&appid=myappid&regid=myreg001 Example response: . 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. this method will also drop a cookie on the user's machine allowing them temporary access to the course materials. 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. if any exist. and the launch will not result in any changes to the registration Example call: http://cloud.

export) This service provides a simple interface to request an export of the user data created on the SCORM Cloud.<success/> Error codes: 1 : The registration specified by regid does not exist Export Service (rustici. the percent complete.com/api?method=rustici.status&appid=myappid&exportid=937296cb-ae79-4190-bb6f-9a39b97785ac Example response: .export. the start date.export.scorm. and return an id that can be used to check on the status of the export using a call to rustici. This data includes all the metadata and object xml for every course and registration.com/api?method=rustici. canceled. complete.export. 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.export. Required Arguments: appid : Your application id exportid : The id of the export to cancel Example call: http://cloud. including the export status (started.status. Required Arguments: appid : Your application id Optional Arguments: Example call: http://cloud.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.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. the end date (if complete).scorm. error). start Semantics: Calling this method will start a new data export.com/api?method=rustici. Note that only one data export can be active at a time.

reporting) This service provides a set of methods for accessing information about or owned by the account designated . 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. Also note that this call must be issued to the server listed in the server_location element (as returned by a status call). 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.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.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.dns. </exports> Reporting Service (rustici.dns.0</percent_complete> <server_location>example1.name</server_location> </export> .export.dns. 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.0</percent_complete> <server_location>example1..download&appid=myappid&exportid=5824b207-9311-4e7f-b4f0-0e8b46cffb51 Example response: A file containing the export data in xml format.name/EngineWebServices")]/api? method=rustici.com/api?method=rustici. Note that the export must be complete in order to download it's associated data.<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.scorm.

demographic (via tags).scorm.com/Reportage/reportage.reporting. DOWNONLY will allow the user to drill down to detailed subsections of the report. and access to admin privileges. specific course or learner. reporturl : The plain text Reportage URL that you want to access. see Reportage user documentation for more info (and screenshots).php?appId=[your appid here]" or a URL pointing to a specific report within Reportage. Optional Arguments: admin : A boolean ("true" or "false" only) parameter specifying whether or not to grant admin privileges to the launching Reportage session.com</email> <firstname>Test</firstname> <lastname>Man</lastname> <company>Test Company.by the appid.com/api? method=rustici. to the Reportage home page.scorm. The latter type of URL includes lots of parameters of the report. NONAV will cause the Reportage session to prevent any navigation away from the original report or widget.) . getAccountInfo Semantics: This method returns information about the account specified by the given appid Required Arguments: appid : Your application id Example call: http://cloud. Inc. FREENAV will allow the user to use full navigation in Reportage.php%3FappId%3Dmyappid(&admin=false) (--note that the Reportage URL in this case is "http://cloud. The desired Reportage URL is passed through the reporturl parameter. Other parameters affect the session. such as the date range. These URLs can be found in the Reportage UI as an administrative user.scorm.com/api?method=rustici. Required Arguments: appid : Your application id navpermission : The navigation permissions for the session.scorm. This can be one of three values: NONAV.getAccountInfo&appid=myappid Example response: <account> <email>example@email. Example call : http://cloud.launchReport&appid=myappid&navpermission=NONAV&reporturl=http%3A//cloud. and the ability to change any reporting parameters they wish.php?appId=myappid") Example response : Redirect browser to requested Reportage URL. See Reportage documentation for more info. or FREENAV. like navigation permissions. This would typically either be the Reportage homepage "Reportage/reportage.</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> launchReport Semantics : This method serves as an entry for the Reportage application.reporting. (In this case.com/Reportage/reportage. DOWNONLY. and so on.