We use the term “Activity” in the Intellum Platform, but for historical reasons, it is “Course” in our data and API.

All Course records are stored in the courses table--the type column stores the Activity type:

For each kind of activity we have a specific model:

Activity Type / Name in the UI Class Name / type attribute value
Path CourseCurriculum
Link CourseUrl
Page CoursePage
File CourseFile
SCORM CourseScorm
AICC CourseAicc
Assessment CourseAssessment
Post CourseSelfPost
Collection CourseCollection


Description of Course Attributes & Associations




Only the student-facing data are listed

Field in the Admin UI attribute notes
Activity title name (string)
Passing grade mastery_score (integer) Can only be used only by Assessments, Event, SCORM, AICC, and Evolve activities
Duration duration (integer) Stored in seconds
Published date published_on (date)
Description course_text_field -> instructions (text) Stored in a CourseTextField record pointing to the activity through its course_id attribute
Activity cover art picture_id (integer) ResourceCoursePicture record id
Hero image hero_picture_id (integer) ResourceHeroPicture record id
Social Url social_url (string)
Certificate certificate_id (integer) CertificateTemplate record id
Achievement certification_id (integer) Certification record id
Tribe discussions tribe_id Identifier of the Tribe in TribeSocial
Enable "Mark As Complete" button Can only be used by Post, File, Link, and Event activities
When enabled this attribute value is "confirmation", else value is nil
Completion message course_confirmation -> msg (text) Can only be used by Post, File, Link, and Event activities
A CourseConfirmation record points to the activity through its course_id attribute
Comments enabled forum -> is_active (boolean) Stored in a Forum record pointed to by the Course attribute forum_id
Comments email list forum -> email_list (text) comma separated emails
Include activity in catalog in_catalog (boolean)
Summary summary (text)
Keywords keywords (text)
Require student confirmation show_disclaimer (boolean)
Confirmation message course_text_field -> disclaimer (text)
Catalog Details course_text_field -> description (text)
This activity awards an achievement certification -> is_active (boolean) When creating a Course record along with an achievement makes sure to set this value to true if you want the achievement to be enabled
Achievement name certification -> name (string) required when creating a certification
Achievement description certification -> description (text)
Achievement expires after X months certification -> expiry_period (integer) number of months
Achievement badge certification ->badge_file_name (string),badge_content_type (string), badge_file_size (string)
Difficulty difficulty (integer) 1, 2, or 3
Show related activities show_related_activities_paths_and_prerequisites (boolean)
Survey survey_id (integer) Survey record id
Content content (text)
Set course as an equivalent equivalent_parent_id (integer) Value is null: the course is neither a parent equivalent nor a child
Value is the course id itself: the course is an equivalent parent
Value is the id of another course: the course is the equivalent child of the other course
Retakes allowed allows_retakes (boolean)
How many days to lock retake after failure retake_lockout_period (integer) Stored in days
Activity is a page component is_page_component (boolean) Activity is not viewable outside the context of a page
This is a scheduled activity is_scheduled (boolean) Set to true during Course creation if you want the ability to schedule sessions. Collections cannot be scheduled.



LIST

Resource: /api/v2/courses

HTTPS Request Method: GET

Description: The full list of Activities associated with the account.

Activity list results are limited to 50 records and can be paginated.

Required Parameters:

  • api_key

Optional Parameters:

  • *page - (integer). The page you want to request. Every page is 50 records long at most. If not present, page 1 is assumed.
  • course[id] - (integer)
  • course[code] - (string)
  • course[is_active] - (boolean)
  • course[type] - (string)
  • course[name] - (string)
  • *course[author] - (string)
  • course[custom_a] - (string) ...
  • course[custom_j] - (string)
  • course[in_catalog] - (boolean)
  • course[is_public] - (boolean)
  • course[is_page_component] - (boolean)
  • course[is_featured] - (Boolean)
  • course[requires_authorization] - (boolean)
  • course[has_waitlist] - (boolean)
  • course[is_restricted] - (boolean)
  • course[completion_type] - (string)
  • course[invitation_email] - (Boolean)
  • course[interactions_is_active] - (boolean)
  • course[created_on] - (datetime)
  • course[updated_on] - (datetime)
  • *course[tribe_id] - (integer)
  • picture - (boolean) ; include course picture URL if true

Example Request:

curl -X GET -d '{"api_key": "123456", "course": {"created_on": "2010-04-19 00:00:00,2015-04-19 23:59:59", "code": "abc123"}}' -H "Content-type: application/json" -H "Accept: application/json" https://YOURSUBDOMAIN.exceedlms.com/api/v2/courses

Example Response

[
 {
 "access_until_due_date": false,
 "account_id": 2,
 "active_enrollment_count": 0,
 "aicc_course_id": null,
 "aicc_course_system": null,
 "aliased_id": null,
 "attendance_max": null,
 "attendance_min": null,
 "author": "foo",
 "blog_id": null,
 "catalog_weight": null,
 "certificate_id": null,
 "charge_student": false,
 "code": "qwe",
 "completion_type": null,
 "course_package_id": null,
 "course_root": null,
 "created_on": "2015-03-12T14:50:31-05:00",
 "credit_units": "2.0",
 "custom_a": null,
 "custom_b": null,
 "custom_c": null,
 "custom_d": null,
 "custom_e": null,
 "custom_f": null,
 "custom_g": null,
 "custom_h": null,
 "custom_i": null,
 "custom_j": null,
 "due_within": null,
 "duration": null,
 "forum_id": null,
 "has_waitlist": false,
 "hero_picture_id": null,
 "hide_until": null,
 "id": 134,
 "in_catalog": false,
 "interactions_is_active": null,
 "invitation_email": null,
 "is_active": true,
 "is_featured": false,
 "is_public": false,
 "is_restricted": false,
 "keywords": null,
 "last_error": null,
 "launch_courseware_or_assessment_directly_from_lp": null,
 "launch_window_height": 600,
 "launch_window_width": 800,
 "mastery_score": null,
 "mobile_content_supported": null,
 "name": "testie LP",
 "picture_id": null,
 "prevent_history_launch": false,
 "price": null,
 "recommended_picture_id": null,
 "reply_to_address": null,
 "requires_authorization": false,
 "resource_id": null,
 "retrospect_range": null,
 "review_average": 0.0,
 "show_disclaimer": false,
 "summary": null,
 "token": null,
 "tribe_social_stream_id": null,
 "tribe_social_stream_name": null,
 "tribe_social_stream_share_link": null,
 "updated_by": "demo Demo",
 "updated_on": "2015-03-18T02:04:08-05:00",
 "vectors": null,
 "vendor_id": null,
 "waitlist_items_count": 0,
 "waitlist_max": null
 }
]

The following optional parameters are also available:

  • fields (string): a comma separated list of the attributes to return, instead of returning all the attributes. Example: "id, type".
  • code (string): query on an individual code value or multiple values.

*Individual code example: *

GET /api/v2/courses?api_key=123&course[code]=i-383289999

Multiple code values example:

GET /api/v2/courses?api_key=123&course[code][]=i-123&course[code][]=i-456&course[code][]=i-789
  • Will return all courses with codes i-123 i-456 i-789

  • Note: the query string format is slightly different for sending an array of values: [code][ ]= instead of [code]= (note extra, empty [ ])

You can retrieve the full URLs of the various pictures associated with an activity in the Read or List endpoints, passing the parameter include_picture_urls with the value 1. This parameter will only work for JSON responses.

Example request:

curl -X "GET" "https://your-domain.exceedlms.com/api/v2/courses?api_key=your-api-key&include_picture_urls=1" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json"


Description of the Course attributes for picture URLs

Field in the Admin UI attribute
Activity cover art picture_url_full
Hero Image hero_picture_url_full
Hero Image hero_picture_url_thumb
Recommended Image recommended_picture_url_thumb
Recommended Image recommended_picture_url_small
Recommended Image recommended_picture_url_medium
Background Image background_picture_url_thumb

You can retrieve the show and enroll URLS for an activity, passing the parameter include_catalog_urls with the value 1. The include_catalog_urls parameter will only work for JSON responses.

Example request:

curl -X "GET" "https://your-domain.exceedlms.com/api/v2/courses?api_key=your-api-key&include_catalog_urls=1" \
     -H "Content-Type: application/json" \
     -H "Accept: application/json"




READ

Resource: /api/v2/courses/{id}

HTTPS Request Method: GET

Description: Look up an Activity based on the Activity id.

Optional Parameters:

  • course[code] - look up the Activity using the code. When this param is used, the id parameter is ignored.

Example Request:

curl -i -X GET -H "Content-type: application/json" -H "Accept: application/json" https://YOURSUBDOMAIN.exceedlms.com/api/v2/courses/1?api_key=123456

Example Response

<?xml version="1.0" encoding="UTF-8"?>
<object>
 <access-until-due-date type="boolean">false</access-until-due-date>
 <account-id type="integer">1234</account-id>
 <active-enrollment-count type="integer">0</active-enrollment-count>
 <aicc-course-id nil="true"></aicc-course-id>
 <aicc-course-system nil="true"></aicc-course-system>
 <aliased-id type="integer" nil="true"></aliased-id>
 <attendance-max type="integer" nil="true"></attendance-max>
 <attendance-min type="integer" nil="true"></attendance-min>
 <author>Jane Doe</author>
 <blog-id type="integer" nil="true"></blog-id>
 <catalog_weight type="integer" nil="true"></catalog_weight>
 <certificate-id type="integer" nil="true"></certificate-id>
 <charge-student type="boolean">false</charge-student>
 <code>12345A</code>
 <completion-type nil="true"></completion-type>
 <course-package-id type="integer" nil="true"></course-package-id>
 <course-root nil="true"></course-root>
 <created-on type="datetime">2014-05-21T16:20:51-04:00</created-on>
 <credit-units type="decimal" nil="true"></credit-units>
 <custom-a>0</custom-a>
 <custom-b></custom-b>
 <custom-c>Jane Doe</custom-c>
 <custom-d nil="true"></custom-d>
 <custom-e nil="true"></custom-e>
 <custom-f nil="true"></custom-f>
 <custom-g nil="true"></custom-g>
 <custom-h nil="true"></custom-h>
 <custom-i nil="true"></custom-i>
 <custom-j nil="true"></custom-j>
 <due-within type="integer" nil="true"></due-within>
 <duration type="integer">0</duration>
 <forum-id type="integer" nil="true"></forum-id>
 <has-waitlist type="boolean">false</has-waitlist>
 <hide-until type="integer" nil="true"></hide-until>
 <id type="integer">1234</id>
 <in-catalog type="boolean">false</in-catalog>
 <interactions-is-active type="boolean" nil="true"></interactions-is-active>
 <invitation-email type="boolean" nil="true"></invitation-email>
 <is-active type="boolean">true</is-active>
 <is-featured type="boolean">false</is-featured>
 <is-public type="boolean">false</is-public>
 <is-restricted type="boolean">false</is-restricted>
 <last-error nil="true"></last-error>
 <launch-window-height type="integer">600</launch-window-height>
 <launch-window-width type="integer">800</launch-window-width>
 <mastery-score type="integer" nil="true"></mastery-score>
 <mobile-content-supported type="boolean" nil="true"></mobile-content-supported>
 <name>Hello World</name>
 <picture-id type="integer" nil="true"></picture-id>
 <prevent-history-launch type="boolean">false</prevent-history-launch>
 <price type="decimal" nil="true"></price>
 <reply-to-address nil="true"></reply-to-address>
 <requires-authorization type="boolean">false</requires-authorization>
 <resource-id type="integer" nil="true"></resource-id>
 <retrospect-range type="integer" nil="true"></retrospect-range>
 <review-average type="float">0.0</review-average>
 <show-disclaimer type="boolean">false</show-disclaimer>
 <summary></summary>
 <token nil="true"></token>
 <tribe-social-stream-id nil="true"></tribe-social-stream-id>
 <tribe-social-stream-name nil="true"></tribe-social-stream-name>
 <tribe-social-stream-share-link nil="true"></tribe-social-stream-share-link>
 <updated-by>Jane Doe</updated-by>
 <updated-on type="datetime">2014-07-22T18:55:07-04:00</updated-on>
 <vectors type="tsvector" nil="true"></vectors>
 <vendor-id type="integer" nil="true"></vendor-id>
 <waitlist-items-count type="integer">0</waitlist-items-count>
 <waitlist-max type="integer" nil="true"></waitlist-max>
</object>




CREATE

Resource: /api/v2/courses

HTTPS Request Method: POST

Description: Create a new activity object.

Required parameters:

  • api_key (string): the account API key
  • type (string): the type of activity (see table above for accepted values)
  • name (string): the name of the activity
  • url (text)- only required and used when creating a Link activity: the URL of the Link activity
  • file_url (text) - only required and used when creating a File, SCORM, AICC, or Evolve package activity: the URL from where the file will be fetched by the Create endpoint in order to create the activity. For performance reason please store the File in a Google Cloud Storage bucket.
  • aicc_url (text) - only required when creating an AICC form activity: the URL of the AICC form URL.

Optional parameters:
See the list of attributes in the example responses of the Courses API documentation and in the Description of the Course attributes and associations section above. Additionally the following parameters are available:

  • cover_art_url (text): the URL from where the image will be fetched by the Create endpoint in order to create the activity cover art. For performance reason please store the File in a Google Cloud Storage bucket. Maximum file size is 10 megabytes.
  • hero_image_url (text): the URL from where the image will be fetched by the Create endpoint in order to create the activity hero image. For performance reasons please store the File in a Google Cloud Storage bucket. Maximum file size is 10 megabytes.
  • hero_mobile_image_url (text): the URL from where the image will be fetched by the Create endpoint in order to create the mobile version of the activity hero image. A hero_image_url must be present or the hero image must already exist. For performance reasons please store the File in a Google Cloud Storage bucket. Maximum file size is 3 megabytes.
  • course_text_field_attributes["instructions"] (text): the description of the activity
  • course_text_field_attributes["disclaimer"] (text): the confirmation message of the activity (leveraged only if the activity show_disclaimer attribute is set to true)
  • course_text_field_attributes["description"] (text): the catalog details of the activity
  • enable_forum (boolean): disable comments if set to false (default is true)
  • forum_email_list (text): the comment email list
  • create_confirmation (boolean): only leveraged for Event, File, Post and Link activities (other types of activity never have a confirmation button)
    • confirmation is enabled by default for File, Post and Link activities. To disable it, set this attribute value to false
    • confirmation is disabled by default for Event activities. To disable it, set this attribute value to true
  • confirmation_message_value (text): the completion message
    • certification_attributes["active"]
    • certification_attributes["name"]
    • certification_attributes["description"]
    • certification_attributes["expiry_period"]
  • certification_badge_url (text): the attributes to create an achievement along the activity creation and associate it to the activity. Only name is required.
  • makes sure to set the active value to true if you want the achievement to be enabled
  • certification_badge_url (text): the URL from where the badge image will be fetched by the Create endpoint in order to create the certification badge. For performance reason please store the File in a Google Cloud Storage bucket. Maximum file size is 10 megabytes.
  • sequence_attributes["control_mode"] (text): optional, only for paths, indicates whether the sections must be completed in order ("flow") or not ("choice", default value)._

Note: The following parameters are limited to 255 characters:

  • type
  • name
  • code
  • author
  • summary
  • completion_type
  • social_url
  • locale

Response:

  • on success: a 200 HTTP code and the activity record data in the body
  • on failure: a 422 HTTP code and an array of the errors in the body

Example requests:

Create a Link activity pointing to “http://example.com”: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"url": "http://example.com", "name": "My Link Activity", "type": "CourseUrl" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

*Create a Link activity pointing to “http://example.com”, with a hero image: * curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"url": "http://example.com", "name": "My Link Activity", "type": "CourseUrl", "hero_image_url": "https://storage.googleapis.com/path/to/hero-image.jpg" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a File activity with a myvideo.mp4 file: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"file_url": "https://storage.googleapis.com/path/to/myvideo.mp4", "name": "My Video Activity", "type": "CourseFile" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a SCORM activity with a scorm.zip file: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"file_url": "https://storage.googleapis.com/path/to/scorm.zip", "name": "My SCORM Activity", "type": "CourseSCORM" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a Path activity: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"name": "My Path Activity", "type": "CourseCurriculum" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a Path activity with the description “My Path Description”: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"name": "My Path Activity", "type": "CourseCurriculum", course_text_field_attributes: { instructions: "My Path Description" } } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create an Event activity with Completion button enabled and Completion message "Got It!": curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"name": "My Event Activity", "type": "CourseEvent", "create_confirmation": "true", "confirmation_message_value": "Got It!" } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a Post activity with a certification having a badge: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"name": "My Activity", "type": "CourseSelfPost", "certification_badge_url": "https://storage.googleapis.com/path/to/achievement-badge.png", certification_attributes: { name: "The Achievement" } } }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value

Create a Post activity that is a scheduled activity: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": {"name": "My Activity", "type": "CourseSelfPost", "is_scheduled": true} }' https://your-domain.exceedlms.com/api/v2/courses?api_key=your-domain-api-key-value




UPDATE

Resource: /api/v2/courses/ (id being the id attribute of the Course record to update)

HTTPS Request Method: PUT or PATCH (we handle PUT and PATCH requests in the same exact way)

Description: Update an existing activity object.

Required parameters:

  • api_key (string): the account API key
  • id (integer): the id attribute value of the Course record to update

Optional parameters:

  • See the list of required and optional parameters of the Create endpoint
  • To disable existing confirmation, set creation_confirmation to false
  • To enable or disable comments set enable_forum to true or false

Response:
on success: a 200 HTTP code and the activity record data in the body
on failure: a 422 HTTP code and an array of the errors in the body

*Example requests: *

Update the name of the activity with id 25: curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"name": "My New Course Name"} }' https://your-domain.exceedlms.com/api/v2/courses/25?api_key=your-domain-api-key-value

Update the URL of the Link activity with id 26: curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"url": "http://example.com/my-new-path"} }' https://your-domain.exceedlms.com/api/v2/courses/26?api_key=your-domain-api-key-value

Update the file of the File activity with id 27: curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"file_url": "https://storage.googleapis.com/path/to/my-new-video.mp4"} }' https://your-domain.exceedlms.com/api/v2/courses/27?api_key=your-domain-api-key-value

Set the covert art of activity with id 28 (it replaces the existing cover art if there was one already): curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"cover_art_url": "https://storage.googleapis.com/path/to/my-cover-art.png"} }' https://your-domain.exceedlms.com/api/v2/courses/26?api_key=your-domain-api-key-value

To delete cover art (id 323) without replacing it for activity (id 28): curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"picture_attributes": {"id": "323", "_destroy": "1"} } }' https://your-domain.exceedlms.com/api/v2/courses/28?api_key=your-domain-api-key-value

*To delete hero image (id 111) without replacing it for activity (id 28) * curl -H "Content-type: application/json" -H "Accept: application/json" -X PUT -d '{ "course": {"hero_picture_attributes": {"id": "111", "_destroy": "1"} } }' https://your-domain.exceedlms.com/api/v2/courses/28?api_key=your-domain-api-key-value




UPDATE PACKAGE

Resource: /api/v2/courses//update_package (id being the id attribute of the Course record to update)

HTTPS Request Method: PUT or PATCH (we handle PUT and PATCH requests in the same exact way)

Description: Update the SCORM, AICC, or Evolve package of an existing activity object.

Required parameters:

  • api_key (string): the account API key
  • id (integer): the id of the Course record for which the package will be update
  • file_url (string): the URL from where the new package will be fetched by the Update Package endpoint in order to update the activity. For performance reason please store the File in a Google Cloud Storage bucket.

Response:

on success: a 200 HTTP code and the activity record data in the body
on failure: a 422 HTTP code and an array of the errors in the body. Important note: in case an invalid package is provided and thus the endpoint returns this error code, please note that the previous valid SCORM, AICC, or Evolve package is no longer associated to the activity. This is the same behavior than in the LMS admin UI, and is due to the LMS internal implementation.

Example request:

Update an existing SCORM activity (id 33) with a new-scorm.zip file: curl -H "Content-type: application/json" -H "Accept: application/json" -X POST -d '{ "course": { "file_url": "https://storage.googleapis.com/path/to/new-scorm.zip" } }' https://your-domain.exceedlms.com/api/v2/courses/33/update_package?api_key=your-domain-api-key-value




DELETE

Resource: /api/v2/courses/{id}

HTTP Request Method: DELETE

Description: Delete an Activity based on the Activity id.

Optional Parameters:

  • course[code] - lookup the Activity using the code. When this param is used, the id parameter is ignored.

Example Request:

curl -i -X DELETE -H "Content-type: application/json" -H "Accept: application/json" https://YOURSUBDOMAIN.exceedlms.com/api/v2/courses/5?api_key=12345

Response:

  • On successful deletion, it returns a 200 HTTP response code with an empty body.


LIST DELETIONS

Resource: /api/v2/courses/deletions

HTTP Request Method: GET

Description: List all of the deleted courses

Required Parameters:

  • api_key

Optional Parameters:

  • page - (integer). The page number you want to request. Every page is 1,000 records long at most, and results are returned in id order. Page 1 is assumed if no page number is provided, but unpaginated requests are subject to API rate limitations.
  • deleted_at - (date) when this parameter is passed the LMS returns all deletions after the specified date.

Dates and datetimes should be in YYYY-MM-DD

Example Request

curl -i -X GET -H "Content-type: application/json" -H "Accept: application/json" https://YOURSUBDOMAIN.exceedlms.com/api/v2/courses/deletions?api_key=123456

Example Response:

[
{
"id": 1000000001,
"account_id": 100001,
"code": '',
"deleted_at": "2019-05-07T10:54:45.669-04:00"
},
{
"id": 2000000001,
"account_id":  100001,
"code": '123',
"deleted_at": "2019-05-07T11:10:04.111-04:00"
}
]