Website : rimsha.abasa.com
backdoor
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
canvas
/
public
/
doc
/
api
/
Filename :
file.assignment_tools.html
back
Copy
<!DOCTYPE html> <html> <head> <meta name="Content-Type" content="text/html;charset=UTF-8"> <meta charset="UTF-8"> <title># Introduction - Canvas LMS REST API Documentation</title> <link rel="stylesheet" href="css/common.css" type="text/css" media="screen" charset="utf-8" /> <link href="css/prettify.css" rel="stylesheet" type="text/css" media="screen" /> <script src="js/jquery.min.js" type="text/javascript"></script> <script src="js/prettify.js" type="text/javascript"></script> <script type="text/javascript"> $(function() { // set up pretty-printing in static docs generated from .md files $('pre.code.bash').addClass('prettyprint language-bash'); $('pre.code.html').addClass('prettyprint language-html'); $('pre.code.xml').addClass('prettyprint language-xml'); $('pre.code.json').addClass('prettyprint language-js'); $('pre.code.javascript').addClass('prettyprint language-js'); prettyPrint(); }); </script> </head> <body> <div id="header"> <h1> <a href="index.html">Canvas LMS - REST API and Extensions Documentation</a> </h1> </div> <div id="sidebar"> <nav> <div class="expand-all-toggle"> <input id="toggle-input" type="checkbox" onClick="toggle(this)"> <label for="toggle-input" class="toggle-label">Expand all</label> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-basics" type="checkbox" > <label class="ac-label" for="sidebar-basics">Basics</label> <div class="ac-text"> <div class="ac-sub"> <a class="" href="file.graphql.html">GraphQL</a><a class="" href="file.changelog.html">API Change Log</a><a class="" href="file.object_ids.html">SIS IDs</a><a class="" href="file.pagination.html">Pagination</a><a class="" href="file.throttling.html">Throttling</a><a class="" href="file.compound_documents.html">Compound Documents</a><a class="" href="file.file_uploads.html">File Uploads</a><a class="" href="file.endpoint_attributes.html">API Endpoint Attributes</a><a class="" href="file.masquerading.html">Masquerading</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-oauth2" type="checkbox" > <label class="ac-label" for="sidebar-oauth2">OAuth2</label> <div class="ac-text"> <div class="ac-sub"> <a class="" href="file.oauth.html">OAuth2 Overview</a><a class="" href="file.oauth_endpoints.html">OAuth2 Endpoints</a><a class="" href="file.developer_keys.html">Developer Keys</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-resources" type="checkbox" > <label class="ac-label" for="sidebar-resources">Resources</label> <div class="ac-text"> <div class="ac-sub"> <a href="all_resources.html" class="">All Resources Reference</a> <a class="" href="access_tokens.html">Access Tokens</a> <a class="" href="account_calendars.html">Account Calendars</a> <a class="" href="account_notifications.html">Account Notifications</a> <a class="" href="account_reports.html">Account Reports</a> <a class="" href="accounts.html">Accounts</a> <a class="" href="accounts_(lti).html">Accounts (LTI)</a> <a class="" href="admins.html">Admins</a> <a class="" href="announcement_external_feeds.html">Announcement External Feeds</a> <a class="" href="announcements.html">Announcements</a> <a class="" href="api_token_scopes.html">API Token Scopes</a> <a class="" href="appointment_groups.html">Appointment Groups</a> <a class="" href="assignment_extensions.html">Assignment Extensions</a> <a class="" href="assignment_groups.html">Assignment Groups</a> <a class="" href="assignments.html">Assignments</a> <a class="" href="authentication_providers.html">Authentication Providers</a> <a class="" href="authentications_log.html">Authentications Log</a> <a class="" href="blackout_dates.html">Blackout Dates</a> <a class="" href="blueprint_courses.html">Blueprint Courses</a> <a class="" href="bookmarks.html">Bookmarks</a> <a class="" href="brand_configs.html">Brand Configs</a> <a class="" href="calendar_events.html">Calendar Events</a> <a class="" href="collaborations.html">Collaborations</a> <a class="" href="comm_messages.html">CommMessages</a> <a class="" href="communication_channels.html">Communication Channels</a> <a class="" href="conferences.html">Conferences</a> <a class="" href="content_exports.html">Content Exports</a> <a class="" href="content_migrations.html">Content Migrations</a> <a class="" href="content_security_policy_settings.html">Content Security Policy Settings</a> <a class="" href="content_shares.html">Content Shares</a> <a class="" href="conversations.html">Conversations</a> <a class="" href="course_audit_log.html">Course Audit log</a> <a class="" href="course_pace.html">Course Pace</a> <a class="" href="course_quiz_extensions.html">Course Quiz Extensions</a> <a class="" href="courses.html">Courses</a> <a class="" href="custom_gradebook_columns.html">Custom Gradebook Columns</a> <a class="" href="discussion_topics.html">Discussion Topics</a> <a class="" href="enrollment_terms.html">Enrollment Terms</a> <a class="" href="enrollments.html">Enrollments</a> <a class="" href="e_portfolios.html">ePortfolios</a> <a class="" href="e_pub_exports.html">ePub Exports</a> <a class="" href="error_reports.html">Error Reports</a> <a class="" href="external_tools.html">External Tools</a> <a class="" href="favorites.html">Favorites</a> <a class="" href="feature_flags.html">Feature Flags</a> <a class="" href="files.html">Files</a> <a class="" href="grade_change_log.html">Grade Change Log</a> <a class="" href="gradebook_history.html">Gradebook History</a> <a class="" href="grading_period_sets.html">Grading Period Sets</a> <a class="" href="grading_periods.html">Grading Periods</a> <a class="" href="grading_standards.html">Grading Standards</a> <a class="" href="group_categories.html">Group Categories</a> <a class="" href="groups.html">Groups</a> <a class="" href="history.html">History</a> <a class="" href="inst_access_tokens.html">InstAccess tokens</a> <a class="" href="jw_ts.html">JWTs</a> <a class="" href="late_policy.html">Late Policy</a> <a class="" href="learning_object_dates.html">Learning Object Dates</a> <a class="" href="line_items.html">Line Items</a> <a class="" href="live_assessments.html">LiveAssessments</a> <a class="" href="logins.html">Logins</a> <a class="" href="lti_resource_links.html">LTI Resource Links</a> <a class="" href="media_objects.html">Media Objects</a> <a class="" href="moderated_grading.html">Moderated Grading</a> <a class="" href="modules.html">Modules</a> <a class="" href="names_and_role.html">Names and Role</a> <a class="" href="notification_preferences.html">Notification Preferences</a> <a class="" href="originality_reports.html">Originality Reports</a> <a class="" href="outcome_groups.html">Outcome Groups</a> <a class="" href="outcome_imports.html">Outcome Imports</a> <a class="" href="outcome_results.html">Outcome Results</a> <a class="" href="outcomes.html">Outcomes</a> <a class="" href="pages.html">Pages</a> <a class="" href="peer_reviews.html">Peer Reviews</a> <a class="" href="planner.html">Planner</a> <a class="" href="poll_sessions.html">Poll Sessions</a> <a class="" href="poll_choices.html">PollChoices</a> <a class="" href="polls.html">Polls</a> <a class="" href="poll_submissions.html">PollSubmissions</a> <a class="" href="proficiency_ratings.html">Proficiency Ratings</a> <a class="" href="progress.html">Progress</a> <a class="" href="public_jwk.html">Public JWK</a> <a class="" href="quiz_assignment_overrides.html">Quiz Assignment Overrides</a> <a class="" href="quiz_extensions.html">Quiz Extensions</a> <a class="" href="quiz_ip_filters.html">Quiz IP Filters</a> <a class="" href="quiz_question_groups.html">Quiz Question Groups</a> <a class="" href="quiz_questions.html">Quiz Questions</a> <a class="" href="quiz_reports.html">Quiz Reports</a> <a class="" href="quiz_statistics.html">Quiz Statistics</a> <a class="" href="quiz_submission_events.html">Quiz Submission Events</a> <a class="" href="quiz_submission_files.html">Quiz Submission Files</a> <a class="" href="quiz_submission_questions.html">Quiz Submission Questions</a> <a class="" href="quiz_submission_user_list.html">Quiz Submission User List</a> <a class="" href="quiz_submissions.html">Quiz Submissions</a> <a class="" href="quizzes.html">Quizzes</a> <a class="" href="result.html">Result</a> <a class="" href="roles.html">Roles</a> <a class="" href="rubrics.html">Rubrics</a> <a class="" href="score.html">Score</a> <a class="" href="search.html">Search</a> <a class="" href="sections.html">Sections</a> <a class="" href="services.html">Services</a> <a class="" href="shared_brand_configs.html">Shared Brand Configs</a> <a class="" href="sis_import_errors.html">SIS Import Errors</a> <a class="" href="sis_imports.html">SIS Imports</a> <a class="" href="sis_integration.html">SIS Integration</a> <a class="" href="smart_search.html">Smart Search</a> <a class="" href="submission_comments.html">Submission Comments</a> <a class="" href="submissions.html">Submissions</a> <a class="" href="tabs.html">Tabs</a> <a class="" href="temporary_enrollment_pairings.html">Temporary Enrollment Pairings</a> <a class="" href="user_observees.html">User Observees</a> <a class="" href="users.html">Users</a> <a class="" href="what_if_grades.html">What If Grades</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-outcomes" type="checkbox" > <label class="ac-label" for="sidebar-outcomes">Outcomes</label> <div class="ac-text"> <div class="ac-sub"> <a href="file.outcomes_csv.html" class="">Outcomes CSV Format</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-groupCategories" type="checkbox" > <label class="ac-label" for="sidebar-groupCategories">Group Categories</label> <div class="ac-text"> <div class="ac-sub"> <a href="file.group_category_csv.html" class="">Group Categories CSV Format</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-sis" type="checkbox" > <label class="ac-label" for="sidebar-sis">SIS</label> <div class="ac-text"> <div class="ac-sub"> <a href="file.sis_csv.html" class="">SIS CSV Format</a> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-externalTools" type="checkbox" checked > <label class="ac-label" for="sidebar-externalTools">External Tools</label> <div class="ac-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-externalTools-lti" type="checkbox" checked > <label class="ac-label level1-label" for="sidebar-externalTools-lti">LTI</label> <div class="ac-sub-text"> <a class="" href="file.tools_intro.html">Introduction</a><a class="" href="file.registration.html">Registration</a><a class="" href="file.lti_dev_key_config.html">Configuring</a><a class="" href="file.tools_variable_substitutions.html">Variable Substitutions</a><a class="" href="file.content_item.html">Deep Linking</a><a class="current" href="">Grading</a><a class="" href="file.provisioning.html">Provisioning</a><a class="" href="file.lti_window_post_message.html">PostMessage</a> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-externalTools-lti-placements" type="checkbox" > <label class="ac-label level2-label" for="sidebar-externalTools-lti-placements">Placements</label> <div class="ac-sub-text-nested"> <a class="" href="file.placements_overview.html">Placements Overview</a><a class="" href="file.navigation_tools.html">Navigation</a><a class="" href="file.homework_submission_placement.html">Homework Submission</a><a class="" href="file.editor_button_placement.html">Editor Button</a><a class="" href="file.migration_selection_placement.html">Migration Selection</a><a class="" href="file.link_selection_placement.html">Link Selection (Modules)</a><a class="" href="file.assignment_selection_placement.html">Assignment Selection</a><a class="" href="file.collaborations_placement.html">Collaborations</a> </div> </div> </div> </div> <a href="file.xapi.html" class="">xAPI</a> <a href="file.canvas_roles.html" class="">Canvas Roles</a> </div> <div class="ac-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-externalTools-plagiarism" type="checkbox" > <label class="ac-label level1-label" for="sidebar-externalTools-plagiarism">Plagiarism Detection Platform</label> <div class="ac-sub-text"> <a href="file.plagiarism_platform.html" class="">Overview</a> <a class="" href="plagiarism_detection_platform_assignments.html">Plagiarism Detection Platform Assignments</a> <a class="" href="plagiarism_detection_platform_users.html">Plagiarism Detection Platform Users</a> <a class="" href="plagiarism_detection_submissions.html">Plagiarism Detection Submissions</a> <a class="" href="webhooks_subscriptions_for_plagiarism_platform.html">Webhooks Subscriptions for Plagiarism Platform</a> <a href="file.jwt_access_tokens.html" class="">JWT Access Tokens</a> </div> </div> </div> </div> <div class="ac-container"> <input name="header" class="ac-input" id="sidebar-dataServices" type="checkbox" > <label class="ac-label" for="sidebar-dataServices">Data Services</label> <div class="ac-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-dataServices-liveEvents" type="checkbox" > <label class="ac-label level1-label" for="sidebar-dataServices-liveEvents">Live Events</label> <div class="ac-sub-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-dataServices-liveEvents-overview" type="checkbox" > <label class="ac-label level2-label" for="sidebar-dataServices-liveEvents-overview">Overview</label> <div class="ac-sub-text-nested"> <a class="" href="file.data_service_introduction.html">Introduction</a><a class="" href="file.data_service_setup.html">Setup</a><a class="" href="file.data_service_caliper_structure.html">Caliper</a><a class="" href="file.data_service_canvas_event_metadata.html">Metadata</a> </div> </div> <span class="sub-label">Event Format</span> </div> <div class="ac-sub-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-dataServices-liveEvents-eventFormat-canvas" type="checkbox" > <label class="ac-label level2-label" for="sidebar-dataServices-liveEvents-eventFormat-canvas">Canvas</label> <div class="ac-sub-text-nested"> <a class="" href="file.data_service_canvas_account.html">Account</a><a class="" href="file.data_service_canvas_asset.html">Asset</a><a class="" href="file.data_service_canvas_assignment.html">Assignment</a><a class="" href="file.data_service_canvas_attachment.html">Attachment</a><a class="" href="file.data_service_canvas_content.html">Content</a><a class="" href="file.data_service_canvas_conversation.html">Conversation</a><a class="" href="file.data_service_canvas_course.html">Course</a><a class="" href="file.data_service_canvas_discussion.html">Discussion</a><a class="" href="file.data_service_canvas_enrollment.html">Enrollment</a><a class="" href="file.data_service_canvas_grade.html">Grade</a><a class="" href="file.data_service_canvas_group.html">Group</a><a class="" href="file.data_service_canvas_learning.html">Learning</a><a class="" href="file.data_service_canvas_logged.html">Logged</a><a class="" href="file.data_service_canvas_module.html">Module</a><a class="" href="file.data_service_canvas_outcome.html">Outcome</a><a class="" href="file.data_service_canvas_plagiarism.html">Plagiarism</a><a class="" href="file.data_service_canvas_quiz.html">Quiz</a><a class="" href="file.data_service_canvas_rubric.html">Rubric</a><a class="" href="file.data_service_canvas_sis.html">Sis</a><a class="" href="file.data_service_canvas_submission.html">Submission</a><a class="" href="file.data_service_canvas_syllabus.html">Syllabus</a><a class="" href="file.data_service_canvas_user.html">User</a><a class="" href="file.data_service_canvas_wiki.html">Wiki</a> </div> </div> </div> <div class="ac-sub-text"> <div class="ac-sub"> <input name="header" class="ac-input" id="sidebar-dataServices-liveEvents-eventFormat-caliper" type="checkbox" > <label class="ac-label level2-label" for="sidebar-dataServices-liveEvents-eventFormat-caliper">Caliper IMS 1.1</label> <div class="ac-sub-text-nested"> <a class="" href="file.data_service_caliper_assessment.html">Assessment</a><a class="" href="file.data_service_caliper_basic.html">Basic</a><a class="" href="file.data_service_caliper_forum.html">Forum</a><a class="" href="file.data_service_caliper_grading.html">Grading</a><a class="" href="file.data_service_caliper_navigation_events.html">Navigation Events</a><a class="" href="file.data_service_caliper_session.html">Session</a> </div> </div> </div> </div> </div> </div> <div class="sidebar-trailing-background"></div> <script> function toggle(source) { let expandText = document.querySelector('label[for="toggle-input"]') let isChecked = document.querySelector('input[id="toggle-input"]').checked let checkboxes = document.querySelectorAll('input[name="header"]'); checkboxes.forEach(checkbox => { if (checkbox !== source) { checkbox.checked = source.checked } }); expandText.innerHTML = isChecked ? 'Collapse all' : 'Expand all' } </script> </nav> </div> <div id="content"><div id='filecontents'><h1 id="introduction">Introduction</h1> <p>External tools can be associated with Canvas assignments so that students are able to experience an integrated offering of the tool. Tools can also leverage LTI services to return submissions and/or scores back to the Canvas gradebook.</p> <p>The specifics for how grading is achieved depend on the LTI version being used:</p> <ul> <li><a href="#lti_advantage">LTI Advantage: Assignment and Grading Services</a></li> <li><a href="#outcomes_service">LTI 1.1 Grade Passback Tools</a></li> </ul> <p>Tools become associated with Canvas assignments either through the UI during <a href="https://community.canvaslms.com/t5/Instructor-Guide/How-do-I-add-an-assignment-using-an-external-app/ta-p/656" target="_blank">assignment creation</a>, or by the tool using the <a href="/doc/api/line_items.html" target="_blank">Line Items Service</a> to create assignments.</p> <p>If configured in via the Canvas UI, Course Designers (Admins/Instructors) will see a submission type called "External Tool" during assignment creation where they can select a tool configuration to use for the assignment. The <a href="file.assignment_selection_placement.html" target="_blank"> assignment_selection placement</a> is often used in conjunction with the <a href="file.content_item.html" target="_blank">deep linking specification</a> to allow an Instructor or Course Designer to launch out to the tool and select a specific resource to be associated to the assignment. When students view the assignment, instead of seeing a standard Canvas assignment they'll see the tool loaded in an iframe on the page.</p> <p><a name="lti_advantage"></a></p> <h1 id="lti-advantage-assignment-and-grading-services">LTI Advantage: Assignment and Grading Services</h1> <p>LTI 1.3 tools can be configured to have access to the <a href="https://www.imsglobal.org/spec/lti-ags/v2p0/" target="_blank"> Assignment and Grading Services</a> (AGS). Assignment and Grading Services are a powerful way for tools to interact with the LMS gradebook to save time for instructors and students.</p> <p>Some examples of use cases that are uniquely solvable using AGS that were not resolvable by the LTI 1.1 Outcomes Service include:</p> <ul> <li>External tools can return scores for assignments without the need of students ever accessing the tool.</li> <li>Using the Line Items service tools can create columns to store grades in the gradebook without the need for instructors to manually create them using <a href="file.assignment_selection_placement.html" target="_blank">deep linking and the assignment_selection placement</a>.</li> <li>Previously returned scores can be cleared out.</li> </ul> <p>In addition to permitting these use cases, many more use cases are described in the <a href="https://www.imsglobal.org/spec/lti/v1p3/impl#lti-advantage-use-cases" target="_blank">IMS LTI Advantage Implementation Guide</a>.</p> <h2 id="configuring">Configuring</h2> <p>To configure an LTI 1.3 tool that has access to AGS, an <a href="https://community.canvaslms.com/t5/Admin-Guide/How-do-I-configure-an-LTI-key-for-an-account/ta-p/140" target="_blank">LTI Developer Key must be created</a> with the desired scopes enabled. This can either be done via the "Manual" method, or by providing raw JSON or a secure URL that hosts JSON. A full list and description of available scopes is described in the <a href="https://www.imsglobal.org/spec/lti-ags/v2p0/" target="_blank"> AGS documentation</a>.</p> <p>For example, the following JSON would create an LTI 1.3 tool that has access to read and write scores, check for existing scores, and manage line items (ex. assignments) that are associated with the tool:</p> <pre class="code"><code class=""><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>title</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Cool AGS Tool </span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>scopes</span><span class='label_end'>":</span><span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://purl.imsglobal.org/spec/lti-ags/scope/lineitem</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://purl.imsglobal.org/spec/lti-ags/scope/result.readonly</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://purl.imsglobal.org/spec/lti-ags/scope/score</span><span class='tstring_end'>"</span></span> <span class='rbracket'>]</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>extensions</span><span class='label_end'>":</span><span class='lbracket'>[</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>domain</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>agsexample.com</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>tool_id</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ags-tool-123</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>platform</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>canvas.instructure.com</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>settings</span><span class='label_end'>":</span><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Cool AGS Text</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>icon_url</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://some.icon.url</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>placements</span><span class='label_end'>":</span><span class='lbracket'>[</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>text</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Embed Tool Content as a Canvas Assignment</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>enabled</span><span class='label_end'>":</span><span class='kw'>true</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>icon_url</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://some.icon.url</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>placement</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>assignment_selection</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>message_type</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>LtiDeepLinkingRequest</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>target_link_uri</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://your.target_link_uri/deeplinkexample</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span> <span class='rbracket'>]</span> <span class='rbrace'>}</span> <span class='rbrace'>}</span> <span class='rbracket'>]</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>public_jwk</span><span class='label_end'>":</span><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>kty</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>RSA</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>alg</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>RS256</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>e</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>AQAB</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>kid</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>8f796169-0ac4-48a3-a202-fa4f3d814fcd</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>n</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>nZD7QWmIwj-3N_RZ1qJjX6CdibU87y2l02yMay4KunambalP9g0fU9yZLwLX9WYJINcXZDUf6QeZ-SSbblET-h8Q4OvfSQ7iuu0WqcvBGy8M0qoZ7I-NiChw8dyybMJHgpiP_AyxpCQnp3bQ6829kb3fopbb4cAkOilwVRBYPhRLboXma0cwcllJHPLvMp1oGa7Ad8osmmJhXhM9qdFFASg_OCQdPnYVzp8gOFeOGwlXfSFEgt5vgeU25E-ycUOREcnP7BnMUk7wpwYqlE537LWGOV5z_1Dqcqc9LmN-z4HmNV7b23QZW4_mzKIOY4IqjmnUGgLU9ycFj5YGDCts7Q</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>use</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>sig</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>description</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>1.3 Test Tool</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>target_link_uri</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://your.target_link_uri</span><span class='tstring_end'>"</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>oidc_initiation_url</span><span class='label_end'>":</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>https://your.oidc_initiation_url</span><span class='tstring_end'>"</span></span> <span class='rbrace'>}</span> </code></pre> <p>NOTE: Using AGS does not require configuration of any specific placements, so the placement(s) here could be any placement(s).</p> <h2 id="available-services">Available Services</h2> <p>Canvas supports the following AGS services:</p> <ul> <li><a href="/doc/api/line_items.html" target="_blank">Line Items</a></li> <li><a href="/doc/api/score.html" target="_blank">Score</a></li> <li><a href="/doc/api/result.html" target="_blank">Result</a></li> </ul> <h2 id="accessing-ags">Accessing AGS</h2> <p>Before a tool can run AGS requests, it must be available in the course that it wishes to interact with, and also complete the <a href="file.oauth.html#accessing-lti-advantage-services" target="_blank"> OAuth2 Client Credentials</a> grant to obtain an access token. This covered in depth in the <a href="https://www.imsglobal.org/spec/security/v1p0/#securing_web_services" target="_blank"> IMS LTI Security Framework, SEC 4</a>.</p> <h2 id="request-throttling">Request Throttling</h2> <p>Like all requests made to the Canvas API, AGS requests are throttled (see the <a href="/doc/api/file.throttling.html" target="_blank">Throttling docs</a> for details) to ensure that Canvas stays up and running. Unlike normal API requests which are made with a token specific to a user, AGS tokens are specific to a tool installation for a Course or an Account, and so there is the possibility of many more requests in a short amount of time. As long as you as a tool provider keep requests more-or-less sequential, and pay attention to the request throttling headers as detailed in the above doc, even this elevated level of requests per token should not be limited.</p> <h2 id="common-error-codes">Common Error Codes</h2> <p>Below are some common error codes that you might encounter while using the Assignment and Grade Services API. Each code also comes with some advice for fixing your issue.</p> <table><thead> <tr> <th>Code</th> <th>Associated Message</th> <th>Resolution</th> <th>Notes</th> </tr> </thead><tbody> <tr> <td>400</td> <td><parameter> is missing</td> <td>Ensure you're passing all required parameters</td> <td></td> </tr> <tr> <td>400</td> <td>Provided timestamp of <timestamp> not a valid timestamp</td> <td>Ensure you're passing a correctly formatted, valid timestamp</td> <td></td> </tr> <tr> <td>400</td> <td>Provided timestamp of <timestamp> before last updated timestamp of <timestamp></td> <td>Ensure the timestamp you're passing isn't before when the result was last updated</td> <td></td> </tr> <tr> <td>400</td> <td>Provided submitted_at timestamp of <timestamp> in the future</td> <td>Ensure the provided timestamp isn't too far in the future</td> <td></td> </tr> <tr> <td>401</td> <td>Invalid Developer Key</td> <td>Ensure your credentials point to the correct developer key and that the key is on</td> <td></td> </tr> <tr> <td>401</td> <td>Access Token not linked to a Tool associated with this Context</td> <td>Ensure that your tool is installed and available in the specified context</td> <td></td> </tr> <tr> <td>404</td> <td>The specified resource does not exist.</td> <td>Verify that the course, resource link, line item, or any other such resource that you're specifying exists</td> <td></td> </tr> <tr> <td>404</td> <td>Context not found</td> <td>Ensure that the context you're specifying actually exists.</td> <td></td> </tr> <tr> <td>412</td> <td>Tool does not have permission to view line_item</td> <td>Ensure the specified line item is associated with your tool</td> <td></td> </tr> <tr> <td>412</td> <td>The specified LTI link ID is not associated with the line item</td> <td>Ensure the resourceLinkId you're passing is associated with this line item</td> <td></td> </tr> <tr> <td>422</td> <td>This course has concluded. AGS requests will no longer be accepted for this course.</td> <td>Reopen the specified course or stop sending requests for this course</td> <td>Only returned if the ags_improved_course_concluded_response_codes feature flag is enabled</td> </tr> <tr> <td>422</td> <td>User not found in course or is not a student</td> <td>Ensure the user you're specifying exists or is a student</td> <td></td> </tr> <tr> <td>422</td> <td>ScoreMaximum must be greater than or equal to 0</td> <td>Ensure you're passing a valid value for ScoreMaximum</td> <td></td> </tr> <tr> <td>422</td> <td>ScoreMaximum not supplied when ScoreGiven present</td> <td>Ensure you're providing a ScoreMaximum in any request with a ScoreGiven</td> <td></td> </tr> <tr> <td>422</td> <td>Content items must be provided with submission type 'online_upload'</td> <td>Ensure you specify the correct submission type when providing submission files</td> <td></td> </tr> <tr> <td>422</td> <td>The maximum number of allowed attempts has been reached for this submission</td> <td>Add additional attempts or stop sending submission requests for the specified student</td> <td></td> </tr> </tbody></table> <h2 id="extensions">Extensions</h2> <p>Canvas has extended several AGS endpoints to support deeper grading integrations. Here, we will focus on these extensions and describe how tools can be configured to leverage AGS in Canvas.</p> <h3 id="line-item-extension-creating-deep-linked-assignments">Line Item Extension: Creating deep linked assignments</h3> <p>The <a href="/doc/api/line_items.html" target="_blank">Line Item service</a> has been extended to allow an external tool to not only create gradebook columns (i.e. assignments) in Canvas, but also connect the column/assignment to a specific LTI resource on the external tool. This means that when the student accesses the assignment from Canvas, they are able to see the external tool content directly in the page, complete their assessment on the tool side, and have grades returned without the instructor having to manually create assignments in Canvas.</p> <p>This also allows tools to introduce new workflows, such as allowing instructors to launch from a Course Navigation Placement, select multiple resources, and import them into their course.</p> <h3 id="score-extension-creating-submission-data">Score Extension: Creating submission data</h3> <p>The <a href="/doc/api/score.html" target="_blank">Score service</a> has been extended to allow an external tool to submission data back to the Canvas Gradebook. This data is then exposed in the Submission Details and SpeedGrader Views so that both students and teachers can see what was submitted to the external tool without leaving Canvas. Support for basic urls, text, and LTI links are supported.</p> <p><a name="outcomes_service"></a></p> <h1 id="lti-1-1-grade-passback-tools">LTI 1.1 Grade Passback Tools</h1> <p>Tools can know that they have been launched in a graded context because additional parameters are sent across when a student accesses the external tool assignment. Specifically, the <code>lis_outcome_service_url</code> and <code>lis_result_sourced_id</code> are sent as specified in the LTI 1.1 specification. Grades are passed back to Canvas from the tool's servers using the <a href="http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560472"> outcomes component of LTI 1.1</a>. Notably, one of the major limitations of the LTI 1.1 Outcomes Service is the inability of tools to return grades <em>before</em> a student accesses the assignment from Canvas. If this functionality is desirable, you should upgrade to LTI Advantage's Assignment and Grading Services.</p> <p><strong>Note</strong> that in the past Canvas would return a 200 HTTP response code, even if the XML in the body of the response indicated failure. This behavior has changed, and now if the <code>imsx_codeMajor</code> in the XML response is not <code>success</code>, then Canvas will return a 422 (Unprocessable Entity) HTTP response code.</p> <h2 id="data-return-extension">Data Return Extension</h2> <p>Canvas sends an extension parameter for assignment launches that allows the tool provider to pass back values as submission text in canvas. The key is <code>ext_outcome_data_values_accepted</code> and the value is a comma separated list of types of data accepted. The currently available data types are <code>url</code> and <code>text</code>. The added launch parameter will look like this:</p> <p><code>ext_outcome_data_values_accepted=url,text</code></p> <h3 id="returning-data-values-from-tool-provider">Returning Data Values from Tool Provider</h3> <p>If the external tool wants to supply these values, it can augment the POX sent with the grading value. <a href="http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560473">LTI replaceResult POX</a></p> <p>Only one type of resultData should be sent, if multiple types are sent the tool consumer behavior is undefined and is implementation-specific. Canvas will take the text value and ignore the url value if both are sent.</p> <h4 id="text">Text</h4> <p>Add a <code>resultData</code> node with a <code>text</code> node of plain text in the same encoding as the rest of the document within it like this:</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> <!-- Added element --> <resultData> <text>text data for canvas submission</text> </resultData> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h4 id="url">URL</h4> <p>Add a <code>resultData</code> node with a <code>url</code> node within it like this:</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> <!-- Added element --> <resultData> <url>https://www.example.com/cool_lti_link_submission</url> </resultData> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h4 id="lti-launch-url">LTI Launch URL</h4> <p>Add a <code>resultData</code> node with a <code>ltiLaunchUrl</code> node like this:</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> <!-- Added element --> <resultData> <ltiLaunchUrl>https://some.launch.url/launch?lti_submission_id=42</ltiLaunchUrl> </resultData> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h2 id="total-score-return-extension">Total Score Return Extension</h2> <p>Canvas sends an extension parameter for assignment launches that allows the tool provider to pass back a raw score value instead of a percentage. The key is <code>ext_outcome_result_total_score_accepted</code> and the value is <code>true</code>. The added launch parameter will look like this:</p> <p><code>ext_outcome_result_total_score_accepted=true</code></p> <h3 id="returning-total-score-from-tool-provider">Returning Total Score from Tool Provider</h3> <p>If the external tool wants to supply this value, it can augment the POX sent with the grading value. <a href="http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560473">LTI replaceResult POX</a></p> <p>Simply add a node called <code>resultTotalScore</code> instead of <code>resultScore</code>. If both are sent, then <code>resultScore</code> will be ignored. The <code>textString</code> value should be an Integer or Float value.</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <!-- Added element --> <resultTotalScore> <language>en</language> <textString>50</textString> </resultTotalScore> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h1 id="submission-details-return-extension">Submission Details Return Extension</h1> <p>Canvas sends an extension parameter for assignment launches that allows the tool provider to pass back submission metadata not directly related to the result.</p> <p>Details about the submission the external tool wants to supply should augment the POX sent with the grading value. <a href="http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560473">LTI replaceResult POX</a> Simply add a node called <code>submissionDetails</code> to the <code>replaceResultRequest</code> node. Any data regarding the submission that is not related directly to the result will be included in this node.</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <!-- Added element --> <submissionDetails> ... </submissionDetails> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h2 id="submission-submitted-at-timestamp-extension">Submission Submitted At Timestamp Extension</h2> <p>Canvas sends an extension parameter for assignment launches that allows the tool provider to pass back the submission submitted at timestamp. The key is <code>ext_outcome_submission_submitted_at_accepted</code> and the value is <code>true</code>. The added launch parameter will look like this:</p> <p><code>ext_outcome_submission_submitted_at_accepted=true</code></p> <h3 id="submission-submitted-at-timestamp-from-tool-provider">Submission Submitted At Timestamp from Tool Provider</h3> <p>If the external tool wants to supply this value, it can augment the POX sent with the submission submitted at value. <a href="http://www.imsglobal.org/LTI/v1p1/ltiIMGv1p1.html#_Toc319560473">LTI replaceResult POX</a></p> <p>Simply add a node called <code>submittedAt</code> to the <code>submissionDetails</code> node. The text string must be an <a href="https://tools.ietf.org/html/rfc3339">iso8601 formatted timestamp</a>. If included, then it will override any existing submitted_at value on the submission even when result score or result total score are not present.</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <submissionDetails> <!-- Added element --> <submittedAt> 2017-04-16T18:54:36.736+00:00 </submittedAt> </submissionDetails> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h3 id="submission-prioritize-non-tool-grade-from-tool-provider">Submission Prioritize Non-tool Grade from Tool Provider</h3> <p>If an external tool wants to honor/preserve any grading done in Canvas by a human, it can augment the POX sent with a prioritize non-tool grade tag.</p> <p>Simply add a node called <code>prioritizeNonToolGrade</code> to the <code>submissionDetails</code> node. The tag expects no data, just its presence is all that is required for Canvas. If included, any grading done by something other than an LTI tool will be preserved.</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <submissionDetails> <!-- Added element --> <prioritizeNonToolGrade/> </submissionDetails> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> <h3 id="submission-needs-additional-review">Submission Needs Additional Review</h3> <p>If an external tool wants to tell canvas that grading isn't final and additional review is needed by the instructor, it can augment the POX sent with the needs additional review grade tag.</p> <p>Simply add a node called <code>needsAdditionalReview</code> to the <code>submissionDetails</code> node. The tag expects no data, just its presence is all that is required for Canvas. If included, the Canvas gradebook will signal to the teacher additional grading action is needed.</p> <pre class="code xml"><code class="xml"><?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns="http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>999999123</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <replaceResultRequest> <submissionDetails> <!-- Added element --> <needsAdditionalReview/> </submissionDetails> <resultRecord> <sourcedGUID> <sourcedId>3124567</sourcedId> </sourcedGUID> <result> <resultScore> <language>en</language> <textString>0.92</textString> </resultScore> </result> </resultRecord> </replaceResultRequest> </imsx_POXBody> </imsx_POXEnvelopeRequest> </code></pre> </div></div> <script type="text/javascript"> $('h2.api_method_name').each(function(i, el) { var subtopic = $(el).data('subtopic'); var $a = $(el).find('a'); if ($.trim($a[0].innerHTML) == '') return; var $row = $('table#quicklinks tr').filter(function() { return $(this).data('subtopic') == subtopic; }); if ($row.length == 0) { $row = $('<tr/>').appendTo($('table#quicklinks')); $row.data('subtopic', subtopic); $('<th/>').append(subtopic).appendTo($row); $('<td/>').appendTo($row); } var link = $('<a/>').attr('href', '#'+$(el).attr('name')).append($.trim($a[0].innerHTML)); $row.find('td').append(link); }); </script> <div id="footer"> © Instructure, Inc. Generated on Tue Aug 27 19:26:40 2024<br> This documentation is generated directly from the Canvas LMS source code, available <a href="https://github.com/instructure/canvas-lms">on Github</a>. </div> </body> </html>