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 keytype (string)
: the type of activity (see table above for accepted values)name (string)
: the name of the activityurl (text)
- only required and used when creating a Link activity: the URL of the Link activityfile_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 theCreate
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 theCreate
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 theCreate
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 theCreate
endpoint in order to create the mobile version of the activity hero image. Ahero_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 activitycourse_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 activityenable_forum (boolean)
: disable comments if set tofalse
(default istrue
)forum_email_list (text)
: the comment email listcreate_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 is enabled by default for File, Post and Link activities. To disable it, set this attribute value to
confirmation_message_value (text)
: the completion messagecertification_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/
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 keyid (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/
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 keyid (integer)
: the id of the Course record for which the package will be updatefile_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"
}
]