Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
As adoption of AB Connect increases, We need to ensure all partners have an optimal integration experience. In order to achieve this goal, API controls limit call frequency and payload sizes. Payload sizes have been constrained with a cap on the limit for a page (see Paging Data for details on payload constraints). The remainder of this section describes call throttling also known as rate limiting.
To ensure one client can not adversely affect another client's system performance rate limiting has been implemented on a per account basis. The rate limiting uses a token bucket model backed by Amazon's API Gateway. In summary, each account has a bucket. The system adds 5 tokens to an account's bucket every second and the bucket can hold up to 25 tokens. Each API call an account makes removes one token from the bucket. If you have not made any calls for a period of time and your bucket is full, you can make a burst of up to 25 calls. However, once your bucket is empty, you'll need to wait before making another call or you'll receive an HTTP 429 response.
Some accounts may have different limits and it is possible that these thresholds change over time, so it is recommended that implementation of a client-side throttling solution that is either self-adjusting or is easy to adjust manually. Depending on the client side architecture and implementation language, there may be client side throttling frameworks available that handle the complexity for your system.
If you have a particular need for a larger bucket size or bucket fill rate, contact AB Support for additional plans.
There are several URL Parameters where you will need to name specific properties of an object (like filter and fields). Generally speaking, see the endpoint's Response Attributes section for the properties that are available. Here are a few rules to keep in mind when constructing the property names.
The name of a property on an object is addressed using dot notation like object.property. E.g. disciplines.grades
JSON constructs in AB Connect responses that are inserted simply to adhere to JSON API requirements are not included in the property naming. E.g. if you want to address the standard_type of a standard object, the name is simply standard_type - not data.attributes.standard_type. Generally speaking, JSON API keywords can be left out of the names - things like attributes, relationships and data. Note that meta properties on relationships are the acception. We include the meta part of the property path to eliminate conflicts between object and relationship property names.
Access to the Academic Benchmarks data and services is licensed by breadth of coverage (authority and subject area) as well as depth of metadata and functionality. If you attempt to access a feature or piece of data and receive a 401 error, check your credentials and the details of the error message body. It may be that your current license does not support the call you are making. In some instances, you'll get a valid response, but the data related to one of these features will simply not be included in the response. E.g. if you are licensed for Standards, but not Topics, when you retrieve a Standard the topics relationship will not exist.
To clarify or discuss your licensing, contact AB Support at Instructure or your sales representative.
By default, list results are returned in order of decreasing relevance. However, you can specify a sort field using the sort argument in the URL query string. The format of the requests is:
E.g.
You can specify multiple criteria to ensure that items that may have duplicate values in one property have a secondary sort to guarantee order. E.g.
The default behavior is to sort in ascending order by the specified property. However, if you'd like descending order, prepend the property name with a hyphen/minus (U+002D) "-". E.g.
Custom attributes can be defined as text or numbers. If you aren't sure of the types for your custom attributes, contact AB Support for guidance.
It is possible to create custom attributes with the same name and different data types in different asset types (or when searching across multiple owners). If you sort on custom attributes of different types, ascending sorts put number attribute values above text attribute values. Descending sorts reverse the order. Note that within a given type, numbers are sorted numerically and text attributes are sorted alphabetically.
`sort[object of sort]=<property name>``sort[standards]=number.enhanced``sort[standards]=number.enhanced,statement.descr``sort[standards]=-number.enhanced`Explore services, tools, and guides to build seamless integrations in the Instructure ecosystem.
Instructure's Developer Portal is your gateway to integrating our learning management system with other tools, automating workflows, and building custom applications. Designed for flexibility and ease of use, our APIs and resources empower developers to create dynamic, efficient learning solutions. Start exploring and bring your ideas to life with the support of our comprehensive documentation and tools.
Access to the Academic Benchmarks data and services is licensed by breadth of coverage (authority and subject area) as well as depth of metadata and functionality. If you attempt to access a feature or piece of data and receive a 401 error, check your credentials and the details of the error message body. It may be that your current license does not support the call you are making. In some instances, you'll get a valid response, but the data related to one of these features will simply not be included in the response. E.g. if you are licensed for Standards, but not Topics, when you retrieve a Standard the topics relationship will not exist.
To clarify or discuss your licensing, contact AB Support at Instructure or your sales representative.
UTF-8 is the recommended character set for transmitting data using AB Connect - AB Connect stores data in UTF-8 and it is the most common character set on the web. However, as adoption for Unicode and UTF-8 has evolved over the life of Academic Benchmarks, we've built support for a few other character sets to support legacy situations. AB Connect supports RESPONSES in UTF-8, latin1, ISO-8859-1 or Windows-1252 character sets.
Note that at this time AB Connect does not support REQUESTS in any character set other than UTF-8.
To request a specific character set response, include the Accept-Charset HTTP header in your request and supply one of the supported values:
utf-8
iso-8859-1
latin1
windows-1252
In the case that utf-8 is desired, there is no need to actually include the Accept-Charset header as utf-8 is the default.
The AB Connect response includes a Content-Type header indicating the data type (application/json) as well as the character set of the response. E.g.
Welcome to the AB Connect interactive documentation. The documentation and related API were developed to help you integrate AB Connect data and decision support services into your system to power the discovery of your content as well as its relationships to academic standards (e.g. alignments) and other content. AB Connect is built upon the most comprehensive collection of connected K-12 standards metadata, machine learning algorithms and subject matter expert validation available.
If you find your users asking questions like the following, AB Connect has a solution for you.
I have a standard from Texas, is there a similar standard statement in Arizona?
I have a very useful lesson plan that is aligned to a Florida standard, but I'm teaching in California. What California standard might this lesson plan help me fulfill?
I have a very useful lesson plan aligned to a Nevada standard. Are there other similar lesson plans aligned to other state standards that I might use?
I want to create a lesson around the topic of equivalent numbers. Is there instructional material related to this topic that I can use to build my lesson?
I have an assessment item covering mass and energy equivalence. Is there any instructional material I could use to reinforce this concept?
I started tagging my assessment items with a few main concepts. What other concepts within standards may be related to these main concepts?
I have a lesson plan that is covering divisibility rules. What standards across 50 states cover this concept? What other materials cover this concept?
I have lessons aligned to Ohio's 2011 Science standards and they've just released the 2018 standards. How can I remap my alignments quickly?
This documentation describes the AB Connect API in great detail offering examples and an interactive to get you started right away. We invite you to learn more about AB Connect or take a test drive. to see working examples built using AB Connect.
© 2024 Instructure, Inc. All rights reserved.
Version 4.1 of AB Connect is and is structurally compliant with . Since JSON API does not explicitly state syntax of filter statements, Academic Benchmarks adopted a simple filtering syntax based on 's query $filter. Note that ODATA's syntax is not directly compatible with JSON API but was the inspiration for our solution.
When you send data through the interactive endpoints in the , you must authenticate in order to make the call and the responses are handled by a production Academic Benchmarks server so the functionality is real and complete.
If you are already a licensed customer and don't know your credentials or would like to inquire about purchasing a license, please reach out to at Instructure.
If you are not a customer but would like to become familiar with the API, you can request a sandbox account .
Errors are returned as HTTP codes in the 4XX range. All errors are accompanied by a JSON response that provides the details of the error so corrective action can be taken.
See the documentation for the individual endpoint for the specifics of the errors that apply to that endpoint.
Certify
Mastery Connect
`Content-Type: application/json; charset=utf-8` {
"errors": [
{
"source": {
"pointer": "a JSON Pointer RFC6901 to the associated entity in the request document E.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute.",
"parameter": "a string indicating which URI query parameter caused the error."
},
"detail": "<long error message>",
"status": "<error code - same as HTTP status code>",
"title": "<brief error message - typically same as the HTTP status title>"
},
...
]
}Services
Certify
Mastery Connect
LTI
Partner Facing Services
Detailed Docs
Explore comprehensive, easy-to-use API documentation to unlock the full potential of our ecosystem.
Simple search
Find API endpoints, guides, and developer tools all in one convenient location.
Partner Portal
Manage your products and connect directly with educational institutions via the Partner Portal.
All AB Connect v4.1 endpoints deal with lists of data. Unless you are requesting a single element using its GUID (or ID), the response will contain a list - even if there is just a single element in the list. For efficiency reasons, AB Connect breaks the list up into pages. The default page size is 10 elements except for the Clarifier which returns 5 Concepts and 5 Standards by default. The limit and offset arguments help your application manage the list of data by setting the page size and enabling the application to walk through the pages of the list. This way, you can strike the proper balance between efficiency and performance.
Note that in order to maintain server stability, page sizes are capped at 100 objects per page to prevent resource depletion on the server.
This section illustrates the general use of limit and offset but doesn't go into the details of any given particular endpoint.
As mentioned above, AB Connect limits the size of a response to 10 elements by default. This limit only applies to the primary list of elements for the endpoint. E.g. the Standards endpoint will break the Standards list into pages. However, if you request the Standards endpoint to include related Concepts, all Concepts related to each Standard will be returned in the single call regardless of length of the Concepts list.
When responding with a list, AB Connect supplies paging URLs in the links section of the response can use the next and previous links to walk the response list.
The first page of data includes next and last links. The next link supplies the URL to retrieve the next set of data based on your current page size (which is specified by the limit argument and defaults to 10). Note the use of the offset argument above to support the paging. Offset indicates how far into the list you'd like AB Connect to dive when responding to the request.
One of the middle pages of data should include not just next and last but also first and previous links to support bidirectional paging.
If you'd like to make the page responses larger or smaller, you can use the limit parameter. E.g.
In which case, the number of elements from the list that you receive for each request changes. This is also reflected in the links you get in response in order to enable the system to properly track page size as you navigate the list.
Between these two parameters, you should be able to control how your system receives responses and tune it for optimum performance.
When would you ever want your response to contain 0 elements? In addition to the object data contained in the response, most endpoints can return data in the meta object (like facets). If you want to explore the meta object without inducing the overhead of processing data elements in the list, set the limit to 0. E.g.
Will return something similar to the following:
Hello! Welcome to Instructure's Developer Documentation portal.
This portal contains API documentation for all Instructure products.
Below are some examples of things you can do using Instructure product APIs:
Integrate Canvas LMS into your applications.
For example,
between Canvas and your SIS or CRM
Retrieve and assessment results with API
Access rich educational data with Data Access Platform (DAP)
For example, get detailed analytics about your student performance
Create institutional reports
Or integrate Canvas data into your business intelligence tools
Improve your assessments with
You can quickly create and share quizzes
You can get quiz results for analysis
Save time by
Improve your classes
With for the students
about important events or milestones
on assignments and quizzes
If you would like to use the page with LLMs, you can feed the LLM this url:
To access API endpoints for most of our services you need to get an Access Key. The way of getting these Access keys may be different for each service. Go into the subsection of the service you would like to use and look for a subpage called Authentication, OAuth, Developer Keys.
Examples:
For Canvas LMS, find the Get started guide and
For Data Access Platform,
For Elevate Standards Alignment,
Take your authentication key or secret you got in the previous step.
Find an API you would like to try.
If there is a "Test it" button, you can click on it and test it on the spot.
Otherwise, use Postman or Terminal with curl for testing it.
When you make an API call, you'll typically get a response in JSON format. Here's how to quickly understand and use these responses:
A successful response usually looks something like this (this is just an example):
Each response includes data fields (like id, name, and course_code) clearly describing what you've requested. You can use these fields directly in your applications.
If something goes wrong, you'll get an error response, for example:
Errors come with clear messages indicating the problem. Common issues include authentication errors, incorrect parameters, or permission issues.
Some services, for example Canvas LMS, split API calls into multiple pages when you request a lot of data (like a long list of courses or users):
Check for a Link header in the response, which provides URLs for the next or previous page of results.
Example header:
You can follow these links to fetch all the data. Find more info about .
Use tools like or browser extensions (like JSONView) to visualize responses clearly.
Always refer to the specific API's documentation page for detailed descriptions of each data field.
Academic Benchmarks includes a controlled vocabulary of Concepts that has been used for over 15 years to aid in building relationships between content or assessment items (together referred to as Assets) and Standards. AB Connect Content Enrichment tools (Clarifier and prediction engine) are built on top of the Concepts. Each Concept represents a unique notion that a Standard or Asset covers. Academic Benchmarks unpacks Standards into groups of Concepts called key_ideas which can be retrieved via the Standards endpoint. Similarly, Assets can be related to Concepts which can act as an intermediary between Assets and Standards.
Topics are a similar intermediary controlled vocabulary but while Topics are comparatively broad or higher level than Standards, Concepts are very granular and operate at the unpacked Standard level.
The Concepts resource can be used to access the Academic Benchmarks Concepts and related metadata. Use of the API ensures the most current Concepts data is available to your application. At this point in time, the Concepts endpoint is relatively simple as the expectation is that partners will use Standards or Topics as a starting point for building an Asset's metadata profile and then refine it using the Clarifier. However, this endpoint does allow the caller to retrieve context of the Concept which can clarify ambiguous terms.
The relationship between Concepts and other objects are tracked and reported via the other objects. For example, to understand what Concepts a Standard encompasses, retrieve the concepts list via the Standard endpoint (or see the key_ideas field). Similarly, the Asset endpoint can be used to associate Assets with Concepts and retrieve the current relationship. See also the Clarifier endpoint to further explore potential relationships between Concepts, Standards and Assets.
All calls against the Concepts resource must be implemented as HTTP GET requests, and must include proper .
Note that access to AB Concepts is licensed separately. If your credentials are correct and you are still receiving a 401 error (or no results), check with to ensure you are licensed for Concepts. See the section on for a discussion on the licensing required for access to Key Ideas and Concepts.
In its simplest form, you are able to retrieve the details of a specific Concept by appending the AB GUID to the path portion of the URL.
Using filtering and facets, it is possible to retrieve sets of Concepts that match specific criteria. These Concepts are returned in an array of Concept objects. See the Introduction for an explanation on and the use of . This section covers the specifics of using these parameters with the Concepts resource.
The Asset Definition endpoint provides direct access to the properties on Assets. Asset type is an attribute on an Asset.
The Asset Definitions resource can be used to access different asset types for setting up a browse and filter experience on the Asset resource. See the documentation on the Asset endpoint for details.
All calls against the Asset Definitions resource must be implemented as HTTP GET requests, and must include proper Partner Authentication Credentials.
In its simplest form, you are able to retrieve the details of a specific Asset Definitions resource by appending the AB GUID to the path portion of the URL.
Using filterings, it is possible to retrieve sets of Asset Definitions that match specific criteria. These Asset Definitions are returned in an array of Asset Definitions objects. See the Introduction for an explanation on .
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Compound documents contain multiple collections to allow for side-loading of related objects. Side-loading is desirable when nested representation of related objects would result in potentially expensive repetition. For example, given a list of 50 comments by only 3 authors, a nested representation would include 50 author objects where a side-loaded representation would contain only 3 author objects.
`https://api.abconnect.instructure.com/rest/v4.1/<object>?...&limit=25`per_pageLinkTo retrieve additional pages, the returned Link headers should be used. These links should be treated as opaque. They will be absolute urls that include all parameters necessary to retrieve the desired current, next, previous, first, or last page. The one exception is that if an access_token parameter is sent for authentication, it will not be included in the returned links, and must be re-appended.
Pagination information is provided in the Link header:
The possible rel values are:
current - link to the current page of results.
next - link to the next page of results.
prev - link to the previous page of results.
first - link to the first page of results.
last - link to the last page of results.
These will only be included if they are relevant. For example, the first page of results will not contain a rel="prev" link. rel="last" may also be excluded if the total count is too expensive to compute on each request.
NOTE: Because HTTP header names are case-insensitive, please be sure you are not parsing the Link header in a case-sensitive way. The capitalization of the header name is not guaranteed.
This documentation is generated directly from the Canvas LMS source code, available on Github.
A compound document is a JSON object with two reserved properties ("meta" and "links"). The "meta" property is required and is described below; the "links" property is currently unused but reserved. All other properties of the compound document's root object should be interpreted as collections of model objects. A compound document will always contain at least one collection.
The "meta" property is a JSON object with one recognized property ("primaryCollection"). If present, the "meta.primaryCollection" property will contain the property name of one of the collections in the compound document. The primary collection contains the data most directly associated with the request. Any pagination indicated through a Link header accompanying a compound document applies to the primary collection.
Any remaining collections in a compound document are secondary collections and will contain objects related (perhaps indirectly, through other secondary objects) to those in the primary collection. Secondary collections should never be considered as ordered or complete.
Example:
This documentation is generated directly from the Canvas LMS source code, available on Github.
{
"meta": {"primaryCollection": "comments"},
"comments": [...],
"authors": [...]
} {
"links": {
"last": "https://api.abconnect.instructure.com/rest/v4.1/<object>?offset=248960",
"next": "https://api.abconnect.instructure.com/rest/v4.1/<object>?offset=10",
"self": "https://api.abconnect.instructure.com/rest/v4.1/<object>"
}
} {
"links": {
"last": "https://api.abconnect.instructure.com/rest/v4.1/<object>?offset=248960",
"next": "https://api.abconnect.instructure.com/rest/v4.1/<object>?offset=20",
"first": "https://api.abconnect.instructure.com/rest/v4.1/<object>",
"self": "https://api.abconnect.instructure.com/rest/v4.1/<object>?offset=10",
"prev": "https://api.abconnect.instructure.com/rest/v4.1/<object>"
}
} {
"links": {
"last": "https://api.abconnect.instructure.com/rest/v4.1/<object>?limit=25&offset=248950",
"next": "https://api.abconnect.instructure.com/rest/v4.1/<object>?limit=25&offset=25",
"self": "https://api.abconnect.instructure.com/rest/v4.1/<object>?limit=25"
}
}`https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0&facet_summary=*` {
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0"
},
"data": [ ],
"meta": {
"offset": 0,
"limit": 0,
"took": 232,
"count": 248969,
"facets": [
{
"facet": "document.publication.authorities",
"count": 54
...
},
...
]
},
...
}{
"id": 123,
"name": "Introduction to Biology",
"course_code": "BIO101"
}{
"errors": [
{
"message": "Invalid access token."
}
]
}Link: <https://canvas.instructure.com/api/v1/courses?page=2>; rel="next"Link: <https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueA>; rel="current",
<https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueB>; rel="next",
<https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueC>; rel="first",
<https://<canvas>/api/v1/courses/:id/discussion_topics.json?opaqueD>; rel="last"Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
For API resources, such as the API Change Log for additions, changes, deprecations, and removals, view the Canvas API page in the Canvas Community.
This documentation is generated directly from the Canvas LMS source code, available .
The Standards resource can be used to access academic Standards and related metadata. The API provides a simple integration point, eliminates the need to manage Standards data in your organization and system, and provides the foundation for additional connected metadata. Use of the API ensures the most current Standards data is available to your application.
One of the greatest benefits of AB Connect is the ability to navigate relationships between Standards, other Standards and Topics. Retrieving the related Standards and Topics is done in a similar fashion as attributes, but they are contained in the JSON API relationships response. Note that due to the JSON API standard, only the type and ID are returned in the relationship data. Keep in mind that the JSON API ID is the same as the AB GUID for these entities. If you'd like to retrieve the data of the related resources, use the include parameter.
Standards can also be related to Assets. Note that if a Standard is related to an Asset, Topics related to that same Standard automatically become related to Asset as "predicted" relationships when you are licensed for the Academic Benchmarks Topic Taxonomy. Note that this implied relationship is bidirectional, so relating a Topic to an Asset directly also generates predicted Standards relationships. Relationships between Standards and Assets are managed through the Asset endpoint. See the documentation on the Asset endpoint for details.
All calls against the Standards resource must be implemented as HTTP GET requests, and must include proper Partner Authentication Credentials.
In its simplest form, you are able to retrieve the details of a specific Standard by appending the AB GUID to the path portion of the URL.
Using filtering and facets, it is possible to retrieve sets of Standards that match specific criteria. These Standards are returned in an array of Standard objects. See the Introduction for an explanation on and the use of . This section covers the specifics of using these parameters with the Standards resource.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
GET /api/v1/accounts/search
Scope: url:GET|/api/v1/accounts/search
Returns a list of up to 5 matching account domains
Partial match on name / domain are supported
Request Parameters:
Example Request:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
GET /api/v1/brand_variables
Scope: url:GET|/api/v1/brand_variables
Will redirect to a static json file that has all of the brand variables used by this account. Even though this is a redirect, do not store the redirected url since if the account makes any changes it will redirect to a new url. Needs no authentication.
Example Request:
GET /api/v1/accounts/:account_id/brand_variables
Scope: url:GET|/api/v1/accounts/:account_id/brand_variables
GET /api/v1/courses/:course_id/brand_variables
Scope: url:GET|/api/v1/courses/:course_id/brand_variables
Will redirect to a static json file that has all of the brand variables used by the provided context. Even though this is a redirect, do not store the redirected url since if the sub-account makes any changes it will redirect to a new url.
Example Request:
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing account data using an LTI dev key. Allows a tool to get account information via LTI Advantage authorization scheme, which does not require a user session like normal developer keys do. Requires the account lookup scope on the LTI key.
An Account object looks like:
GET /api/lti/accounts/:account_id
Scope: url:GET|/api/lti/accounts/:account_id
Retrieve information on an individual account, given by local or global ID.
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
BETA: This API resource is not finalized, and there could be breaking changes before its final release.
API for retrieving API scopes
A Scope object looks like:
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
GET /api/v1/accounts/:account_id/scopes
Scope: url:GET|/api/v1/accounts/:account_id/scopes
A list of scopes that can be applied to developer keys and access tokens.
Request Parameters:
Returns a list of objects.
This documentation is generated directly from the Canvas LMS source code, available .
One of the challenges with adopting a new integration is coming up to speed on the basics of interacting with the partner system. To lower the slope of the learning curve, Academic Benchmarks has documented examples and developed apps. We are sharing the source to give developer's working examples of how to integrate with AB Connect.
Below are brief descriptions of efficient means for implementing solutions and useful examples apps with links to the where they can be downloaded. All samples and apps are offered as-is with no warranty. Although they are often usable as is, the main purpose is to illustrate how to interact with the AB Connect API. If any particular app doesn't do what you need, feel free to download a copy and modify it to meet your needs. This repository is not meant to host solutions for non-technical users nor is it a location to submit requests for changes or additions to the API or the samples listed here. Be sure to read the ReadMe for each app for details.
Among other things, AB Connect exposes the relationships between Standards. This app is a web page client that allows the user to browse Standards in their license, view the metadata profile of the Standard and find related Standards in other documents. The user is allowed to select from a set of relationships types when navigating across relationships. The types of relationships that are available is based on the licensing of the account used. If the account is not licensed for relationships, the app falls back to a simple Standards browser. This app is also an example of an integration with the embeddable Standards Browser widget (see
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Canvas LMS includes a REST API for accessing and modifying data externally from the main application, in your own programs and scripts. This documentation describes the resources that make up the API.
The Providers resource can be used to retrieve information about your Provider account as well as Providers that have shared all or some of their Assets with your organization and Providers with whom you have shared Assets. You can list all of the Providers related to you, filter the list of related Providers or lookup a specific Provider. The response contains the name of the related Provider as well as the Provider's unique GUID and a list of AB taxonomies they have licensed. In the special circumstance where your own Provider object shows up in the response, you will also see relationships listing Providers that are sharing Assets with you (Owners) as well as Providers with whom you are sharing assets (Consumers).
To locate your own Provider object, user the filter parameter and request Providers with ID _me. That is a special constant that matches yourself. While not terribly helpful with the Providers endpoint, you can also use _all as a match on Provider fields to indicate that you want to match on all Providers. This can be used with the owner.id property on the Assets resource where the default behavior is to only list Assets owned by you.
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Canvas includes a built in dynamic throttling mechanism to prevent a single user from abusing the system and causing adverse effects for others. It works by having a rate limit, and a cost for every request. Each request subtracts from your quota, and the quota is automatically replenished over time. In the event that your API request is throttled, you will receive a
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Masquerading is making an API call on behalf of another user. It will behave as if the target user had made the API call with their own access token (even if they don't have one), including permission checks, enrollments, etc. In order to masquerade via the API, the calling user must have the "Become other users" permission. If the target user is also an admin, the calling user must additionally have every permission that the target user has. For auditing purposes, all calls log both the calling user and the target user.
The Topics resource can be used to access the Academic Benchmarks Topic Taxonomy and related metadata. The API provides a simple integration point, eliminates the need to maintain a copy of the taxonomy locally and provides the foundation for additional connected metadata. Use of the API ensures the most current taxonomy is available to your application.
One of the benefits of AB Connect is the ability to navigate relationships between Topics and Standards. Topics can also be related to other Topics by the nature of their position in the hierarchy of the Topic Taxonomy (parent/child). Retrieving related Standards and Topics is done in a similar fashion as attributes, but they are contained in the JSON API relationships response. Note that due to the JSON API standard, only the type and ID are returned in the relationship data. Keep in mind that the JSON API ID is the same as the AB GUID for these entities. If you'd like to retrieve the data of the related Standards or Topics, use the include parameter.
Topics can also be related to Assets. Note that if a Topic is related to an Asset, Standards related to that same Topic automatically become related to the Asset as "predicted" (and vice versa). Relationships between Topics and Assets are managed through the Asset endpoint. See the documentation on the for details.
All calls against the Topics resource must be implemented as HTTP GET requests, and must include proper .
Note that the Academic Benchmarks Topic Taxonomy is licensed separately. If your credentials are correct and you are still receiving a 401 error (or no results), check with
429 Forbidden (Rate Limit Exceeded)To assist applications with planning, every request will return a X-Request-Cost header that is a floating point number of the amount that request deducted from your remaining quota. If throttling is applicable to this request, there will also be a X-Rate-Limit-Remaining header of your remaining quota.
Since the cost of a request is roughly based on the amount of time it takes to process, and the quota (by default) replenishes at a rate faster than real-time, any API client that makes no more than one simultaneous request is unlikely to be throttled. Parallel requests are subject to an additional pre-flight penalty to prevent a large number of incoming requests being able to bring the system down before their cost is counted against their quota. As soon as each request finishes, the pre-flight penalty is credited back to the quota, and only the actual cost of the request is counted.
For applications that go through the OAuth flow and obtain an access token for each user, each access token has its own quota, and the developer need not be concerned with requests from one user causing another user to be throttled.
This documentation is generated directly from the Canvas LMS source code, available on Github.
This is a very simple example app that does little more than illustrate a minimal integration with the embeddable Standards Browser widget. This app is a web page client that allows the user to browse Standards in their license and view the metadata profile of the Standard. See Using AB Connect's Embeddable Widgets below for more information. You can find the source in the standards-browser-min folder of our public repository. You can find a working version of the app here.
AB Connect includes a few taxonomies that can aid in the navigation of Standards and searchability of Assets. The Topics Browser is a basic example of how one could use topics to locate relevant Standards. You can find the source in the topicsBrowser folder of our public repository. You can find a working version of the app here.
This example app is designed to give you a quick leg up on showing alignments on your web site. This small sample allows the user to search for content by client_id (usually your internal ID for the content), AB Asset GUID or general text search. It then shows the alignments for the first Asset it finds in AB Connect that matches the search criteria. The user can narrow the scope of the authorities to show only alignments in one state (for example). You can find the source in the display-alignments folder of our public repository.
This is a web page client that allows the user to use faceting to search their Asset repository on AB Connect. Note that the app requires that the account already has a set of Assets and at least a minimal configuration that should take a couple of minutes to get it up and running in a demo mode. You can find the source in the asset-browser folder of our public repository.
This example is similar to the browser app but is a node.js based and generates a report with a mapping of a set of Standards from one document to another. The input and output are done through Excel files. There is a template supplied as part of the repository. You'll need to use another means for gathering the input which is a set of Standard GUIDs. One quick way to build the list is to use something like Postman to gather the Standards of interest. You can find the source in the relationships-report folder of our public repository.
The source for the Standards Browser Widget documented in Using AB Connect's Embeddable Widgets is accessable as well. This is a more complex example that spends more effort on the quality of the look and user experience. Where the other examples are good for accelerating API ramp up, the widget source code is best suited to situations where the widget itself is close to meeting your organization's needs but you need to add or modify some features. In that case, start with the existing widget and extend it to meet your needs. You can download the latest source here.
Here are basic instructions for building the supplied source for distribution. All commands must be executed in the directory where you've unzipped the source.
Download the source from here.
Unzip the file into a folder on your system.
Run the following commands in the folder where you placed the unzipped source.
npm install
npm run build
Use dist/widgets.js and dist/widgets.js.map
To obtain a production widgets bundle, follow these steps:
For a bash shell:
NODE_ENV=production npm run build
For Windows cmd.exe:
set NODE_ENV=production
npm run build
Use dist/widgets.js
The illustrative-postman-collections folder in our public repository hosts a set of Postman collections that can help get you started with API calls for various scenarios. The ReadMe file gives the details of the available collections.
name
string
campus name
domain
string
no description
latitude
number
no description
longitude
number
no description
group_by
string
The attribute to group the scopes by. By default no grouping is done.
Allowed values: resource_name
To get started, you'll want to review the general basics, including the information below and the page on Authentication using OAuth2.
For API resources, such as the API Change Log for additions, changes, deprecations, and removals, view the Canvas API page in the Canvas Community.
Please carefully review the Canvas API Policy before using the API.
All API access is over HTTPS, against your normal Canvas domain.
All API responses are in JSON format.
All integer ids in Canvas are 64 bit integers. String ids are also used in Canvas.
To force all ids to strings add the request header Accept: application/json+canvas-string-ids This will cause Canvas to return even integer IDs as strings, preventing problems with languages (particularly JavaScript) that can't properly process large integers.
All boolean parameters can be passed as true/false, t/f, yes/no, y/n, on/off, or 1/0. When using JSON format, a literal true/false is preferred, rather than as a string.
For POST and PUT requests, parameters are sent using standard HTML form encoding (the application/x-www-form-urlencoded content type).
POST and PUT requests may also optionally be sent in JSON format format. The content-type of the request must be set to application/json in this case. There is currently no way to upload a file as part of a JSON POST, the multipart form type must be used.
As an example, this HTML form request:
would translate into this JSON request:
With either encoding, all timestamps are sent and returned in ISO 8601 format (UTC time zone):
API authentication is done with OAuth2. If possible, using the HTTP Authorization header is recommended. Sending the access token in the query string or POST parameters is also supported.
OAuth2 Token sent in header:
OAuth2 Token sent in query string:
Read more about OAuth2 and how to get access tokens.
Note that if you make an API call using HTTP instead of HTTPS, you will be redirected to HTTPS. However, at that point, the credentials have already been sent in clear over the internet. Please make sure that you are using HTTPS.
Canvas LMS supports several experiences including Canvas Career and Canvas for Elementary. The vast majority of these API resources are shared, though some are applicable only to certain experiences.
This documentation is generated directly from the Canvas LMS code. You can generate this documentation yourself if you've set up a local Canvas environment following the instructions on Github. Run the following command from your Canvas directory:
This documentation is generated directly from the Canvas LMS source code, available on Github.
POST /api/v1/accounts/:account_id/developer_keys/:developer_key_id/developer_key_account_bindings
Scope: url:POST|/api/v1/accounts/:account_id/developer_keys/:developer_key_id/developer_key_account_bindings
Create a new Developer Key Account Binding. The developer key specified in the request URL must be available in the requested account or the requested account’s account chain. If the binding already exists for the specified account/key combination it will be updated.
Request Parameters:
workflow_state
string
The workflow state for the binding. Must be one of “on”, “off”, or “allow”. Defaults to “off”.
Returns a DeveloperKeyAccountBinding object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
To masquerade, add an as_user_id parameter to any request. It can be either a Canvas user ID, or an SIS user ID (as described in SIS IDs):
Masquerading could be useful in a number of use cases:
For developing an admin tool
For accessing APIs that can only be called on self (i.e. the activity stream as shown above)
For a portal type application that's already tightly integrated with an SIS and is managed by the school, to avoid going through the OAuth flow for every student
This documentation is generated directly from the Canvas LMS source code, available on Github.
curl 'https://<canvas>/api/v1/users/self/activity_stream?as_user_id=sis_user_id:brian' \
-H "Authorization: Bearer <token>"data-api-endpoint - A URL where the linked object can be accessed via the API
data-api-returntype - The type of data returned
For example, consider an assignment description containing a link to a wiki page in the same course. The description returned by the Get Assignment API might look like this:
The currently supported data-api-returntype values are:
Assignment
Discussion
Page
File
Folder
Quiz
Module
SessionlessLaunchUrl
If the API returns a list of objects instead of a single object, the data-api-returntype will be wrapped in square brackets, e.g. [Assignment].
This documentation is generated directly from the Canvas LMS source code, available on Github.
curl https://<canvas>/api/v1/accounts/search \
-G -H 'Authorization: Bearer <ACCESS_TOKEN>' \
-d 'name=utah'[
{
"name": "University of Utah",
"domain": "utah.edu",
"distance": null, // distance is always nil, but preserved in the api response for backwards compatibility
"authentication_provider": "canvas", // which authentication_provider param to pass to the oauth flow; may be NULL
},
...
]curl 'https://<canvas>/api/v1/brand_variables'curl 'https://<canvas>/api/v1/accounts/123/brand_variables'
-H 'Authorization: Bearer <token>'{
// the ID of the Account object
"id": 2,
// The display name of the account
"name": "Canvas Account",
// The UUID of the account
"uuid": "WvAHhY5FINzq5IyRIJybGeiXyFkG3SqHUPb7jZY5",
// The account's parent ID, or null if this is the root account
"parent_account_id": 1,
// The ID of the root account, or null if this is the root account
"root_account_id": 1,
// The state of the account. Can be 'active' or 'deleted'.
"workflow_state": "active"
}{
// The resource the scope is associated with
"resource": "courses",
// The localized resource name
"resource_name": "Courses",
// The controller the scope is associated to
"controller": "courses",
// The controller action the scope is associated to
"action": "index",
// The HTTP verb for the scope
"verb": "GET",
// The identifier for the scope
"scope": "url:GET|/api/v1/courses"
}name=test+name&file_ids[]=1&file_ids[]=2&sub[name]=foo&sub[message]=bar&flag=y{ "name": "test name", "file_ids": [1,2], "sub": { "name": "foo", "message": "bar" }, "flag": true }YYYY-MM-DDTHH:MM:SSZcurl -H "Authorization: Bearer <ACCESS-TOKEN>" "https://canvas.instructure.com/api/v1/courses"curl "https://canvas.instructure.com/api/v1/courses?access_token=<ACCESS-TOKEN>"bundle exec rake doc:api{
// The Canvas ID of the binding
"id": 1,
// The global Canvas ID of the account in the binding
"account_id": 10000000000001,
// The global Canvas ID of the developer key in the binding
"developer_key_id": 10000000000008,
// The workflow state of the binding. Will be one of 'on', 'off', or 'allow.'
"workflow_state": on,
// True if the requested context owns the binding
"account_owns_binding": true
}<a href="http://canvas.example.com/courses/123/pages/a-wiki-page"
data-api-endpoint="http://canvas.example.com/api/v1/courses/123/pages/a-wiki-page"
data-api-returntype="Page">More information here</a>In its simplest form, you are able to retrieve the details of a specific Provider by appending the AB GUID to the path portion of the URL.
Using filtering and facets, it is possible to retrieve sets of Providers that match specific criteria. These Providers are returned in an array of Provider objects. See the Introduction for an explanation on filtering and the use of facets. This section covers the specifics of using these parameters with the Providers resource. Note that by default, the endpoint returns your Provider object and the objects of all Providers related to you.
In its simplest form, you are able to retrieve the details of a specific Topic by appending the AB GUID to the path portion of the URL.
Using filtering and facets, it is possible to retrieve sets of Topics that match specific criteria. These Topics are returned in an array of Topics objects. See the Introduction for an explanation on filtering and the use of facets. This section covers the specifics of using these parameters with the Topics resource.
The main directive for filtering entities in AB Connect is the inclusion of the filter parameter in the URL query. This document outlines how to use filtering with AB Connect. Examples are given with different endpoints and objects but the general principles are independent of the object type or endpoint. In any case, the filter limits the results that are returned or updated by the request.
At its simplest, the filtering utilizes the following syntax:
E.g. the following URL retrieves alignable 5th grade math Standards from Kentucky.
That's a bit messy so let's break it down. The first part is the primary resource endpoint.
The next bit is the filter parameter. The square brackets contain the type of object being filtered. In this case, we are limiting the Standards being returned.
The value of the filter argument is the URL encoded filter string.
Let's decode it to make it readable:
That makes it a little more readable and clarifies the intent. The specifics of the field names aren't critical here. See the endpoint specific documentation for an explanation of each field.
At an atomic level, the most common filter statement appears like <property> <comparator> '<value>' but some functions are also supported (e.g. isempty(<property>)).
A <property> would be any attribute of the object being filtered. Examples of a property for a Standard would be level or status. Alternatively, a property can be the attribute of a complex property. E.g. for a Standard, <property> could also be number.raw or disciplines.subjects.code.
A <value> could be any value appropriate for the property in question. Values are delimited with single quotes.
Together, various operators, properties and values combine to build a logical statements. The following operators are supported by AB Connect in order of decreasing precedence by group.
Inequality operators can be used with date, number and text attributes but the results vary by attribute type. Date attributes filter chronologically. Number attributes filter numerically. Text attributes filter alphabetically.
Custom attributes can be defined as text or numbers. If you aren't sure of the types for your custom attributes, contact for guidance.
It is possible to create custom attributes with the same name and different data types in different asset types (or when searching across multiple owners). The treatment of inequalities filtering across multiple data types is deterministic but relatively complex and isn't covered here. Where possible, we recommend you avoid this situation by ensuring your custom attributes don't have name conflicts across data types where possible. For details on the way AB Connect handles filtering across mixed types, contact .
AB Connect also supports Boolean operations to combine atomic filter statements into complex statements. You can also use parentheses to group statements together.
disciplines.subjects.code eq 'MATH' and education_levels.grades.code eq '5' 5th grade math
document.publication.authorities.descr eq 'Kentucky DOE' and not disciplines.subjects.code eq 'MATH' Standards from Kentucky not related to math
(disciplines.subjects.code eq 'MATH' and education_levels.grades.code eq '5') or (disciplines.subjects.code eq 'ELA' and education_levels.grades.code eq '7') 5th grade math and 7th grade language arts Standards
One of the major improvements in AB Connect is the text filtering. The text filter is robust, will return results ordered by relevance and includes soft matches like partial matches. The format for text filtering is unique and utilizes a function style notation. There are two formats.
When filtering a particular field, include the field name as well as the value you are filtering for: query(<field>, <string>). For example, to filter for Standards that contain the words "adding" and "fractions" in their statement, the filter would look like:
Note that the text filter is a very soft filter and will often return more Standards than you would expect. The results will be ordered by relevance so the top responses are usually the most important. For example, in the query statement above, the system would return Standards that contain the words "adding fractions" first, followed by Standards that contain "adding" or "fractions". It will also return Standards that contain "add", "addition", etc.
To be more specific, break phrases up into separate statements and be explicit about the Boolean operations to join the queries. The following will only return Standards if they contain both "fractions" and some form of derivation of the word "adding".
To retrieve Standards that have the keywords in any general text field, remove the field name from the query statement: query(<string>). E.g.
When using this approach, the system will search any fields it considers to be a text field. The specific fields vary by endpoint:
Standards:
statement.descr
statement.combined_descr
statement.addendums.descr
In Standards documents, numbers are often separated, delimited or decorated with symbols (e.g. "24.B (i)"). Trying to ensure users are typing the numbers EXACTLY as they are entered in the Standards document is difficult. For this reason, AB Connect supports a soft match on the Standards' number.raw, number.enhanced, number.prefix_enhanced, number.alternate and number.root_enhanced fields when the query function is used. It treats any separator between alphanumeric values as a break between numbers and looks for Standards that match numbers returning results by how closely they match the results. In the example listed earlier, it will return Standards that have numbers that contain 24, B AND i first without regards to the separators used in the filter. It will follow that with Standards that contain two of the three, then Standards that contain any one of the numbers. Filtering for "24.B.i" will return the same results in the same order as filtering for "24-b-i" and "24.B (i)".
In ODATA, literal strings are quoted using single quotes ('). To include a single quote in a string literal in the filter, use a backslash to escape it ('). For example, to search for the word "don't" in Standards, you would use the following filter:
Sometimes it is handy to search for properties that are empty. What "empty" means depends on the property type so AB Connect has an isempty function that will match true on objects with no properties, arrays with no elements and scalar properties with null values. For example, the following filter will return all assets that are missing a subject.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Throughout the API, objects are referenced by internal IDs. You can also reference objects by SIS ID, by prepending the SIS ID with the name of the SIS field, like sis_course_id:. For instance, to retrieve the list of assignments for a course with SIS ID of A1234:
The following objects support SIS IDs in the API:
sis_account_id
sis_course_id
sis_group_id
Some objects support LTI IDs:
lti_context_id (for accounts, assignments, courses, groups, and users)
lti_1_1_id (for users, an alias of lti_context_id, which is sent in LTI 1.1 launches as user_id)
lti_1_3_id (for users, a separate value from
Additionally, some objects support special IDs:
Users support self to mean the current user.
Accounts support self to mean the root account for the current domain, default to mean the Default account, and site_admin to mean the Site Admin account.
Terms support default
SIS IDs should be encoded as UTF-8, and then escaped normally for inclusion in a URI. For instance the SIS ID CS/101.11é is encoded and escaped as CS%2F101%2E11%C3%A9.
Note that some web servers have difficulties with escaped characters, particularly forward slashes. They may require special configuration to properly pass encoded slashes to Rails.
For Apache and Passenger, the following settings should be set:
NoDecode
on
Also beware that if you use , you should enable the nocanon option. Similarly, should use the , or noescape flag. Other modules may also need additional configuration to prevent double-escaping of %2f (/) as %252f.
Prior versions of this API documentation described using a hex encoding to circumvent these issues, since the proper Apache/Passenger configuration was not known at the time. This format is deprecated, and will no longer be described, but will continue to be handled by the server for backwards compatibility.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for exporting courses as an ePub
A CourseEpubExport object looks like:
An EpubExport object looks like:
GET /api/v1/epub_exports
Scope: url:GET|/api/v1/epub_exports
A paginated list of all courses a user is actively participating in, and the latest ePub export associated with the user & course.
Returns a list of objects.
POST /api/v1/courses/:course_id/epub_exports
Scope: url:POST|/api/v1/courses/:course_id/epub_exports
Begin an ePub export for a course.
You can use the to track the progress of the export. The export’s progress is linked to with the progress_url value.
When the export completes, use the endpoint to retrieve a download URL for the exported content.
Returns an object.
GET /api/v1/courses/:course_id/epub_exports/:id
Scope: url:GET|/api/v1/courses/:course_id/epub_exports/:id
Get information about a single ePub export.
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for setting extensions on student assignment submissions. These cannot be set for discussion assignments or quizzes. For quizzes, use Quiz Extensions instead.
An AssignmentExtension object looks like:
POST /api/v1/courses/:course_id/assignments/:assignment_id/extensions
Scope: url:POST|/api/v1/courses/:course_id/assignments/:assignment_id/extensions
Responses
200 OK if the request was successful
403 Forbidden if you are not allowed to extend assignments for this course
400 Bad Request if any of the extensions are invalid
Request Parameters:
Example Request:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for managing conversations with AI Experiences.
GET /api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations
Scope: url:GET|/api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations
Get the active conversation for the current user and AI experience
POST /api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations
Scope: url:POST|/api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations
Initialize a new conversation with the AI experience
POST /api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations/:id/messages
Scope: url:POST|/api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations/:id/messages
Send a message to an existing conversation and get the AI response
Request Parameters:
DELETE /api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations/:id
Scope: url:DELETE|/api/v1/courses/:course_id/ai_experiences/:ai_experience_id/conversations/:id
Mark a conversation as completed/deleted
This documentation is generated directly from the Canvas LMS source code, available .
Standards evolve over time. An authority may make a major update to their Standards document. In this case, an authority re-issues an updated document that totally replaces the Standards of the past. This results in a new document being added to your license. Alternately, an authority may modify, remove or add individual Standards within the current document. If your organization is caching Standards data, it is important that you keep your cache fresh. While it is possible to purge your cache and retrieve the entire set of Standards periodically, that is inefficient and does not support the maintenance of alignments and other related data. It is more efficient and useful to request differential updates. With AB Connect, you do this using the events endpoint.
In addition to changes to Standards themselves, the events endpoint exposes changes to your access to Standards. Your access can change due to licensing changes or configuration of which Standards you have opted to have delivered. For the context of this documentation, we will refer to Standards as "deliverable" regardless of whether the changes were due to license or configuration changes because Events do not treat the various sources of the change differently. For information on changing your licensing or delivery, contact .
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Developer keys are OAuth2 client ID and secret pairs stored in Canvas that allow third-party applications to request access to Canvas API endpoints via the . Access is granted after a user authorizes an app and Canvas creates an API access token that’s returned in the final request of the OAuth2 flow.
`<endpoint URI>?filter[<object of filter>]=<URL encoded filter statement>``https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(disciplines.subjects.code%20eq%20%27MATH%27%20and%20education_levels.grades.code%20eq%20%275%27%20and%20document.publication.authorities.descr%20eq%20%27Kentucky%20DOE%27%20and%20utilizations.type%20eq%20%27alignable%27)``https://api.abconnect.instructure.com/rest/v4.1/standards``filter[standards]``(disciplines.subjects.code%20eq%20%27MATH%27%20and%20education_levels.grades.code%20eq%20%275%27%20and%20document.publication.authorities.descr%20eq%20%27Kentucky%20DOE%27%20and%20utilizations.type%20eq%20%27alignable%27)``(disciplines.subjects.code eq 'MATH' and education_levels.grades.code eq '5' and document.publication.authorities.descr eq 'Kentucky DOE' and utilizations.type eq 'alignable')`message
Required string
The user’s message to send to the AI
ne
Not equals. E.g. propertyX ne 'fruit'
gt
Greater than. E.g. propertyX gt 5
ge
Greater than or equal to. E.g. propertyX ge 5
lt
Less than. E.g. propertyX lt 5
le
Less than or equal to. E.g. propertyX le 5
in
The value of the specified property is in the supplied list of values. E.g. propertyX in ('value1', 'value2', 'value3')
Conditional
and
Combine two conditions and return true if both are true, otherwise false. E.g. propertyX eq 5 and propertyY ne 'A'
or
Combine two conditions and return true if either are true, otherwise false. E.g. propertyX eq 5 or propertyY ne 'A'
extensions.descr
legends.descr
Text properties on related entities as described in Filtering Resources by Properties on Related Resources
Assets:
title
Any custom attributes
Text properties on related entities as described in Filtering Resources by Properties on Related Resources
Topics:
descr
section.descr
Concepts:
descr
context
Grouping
( )
Precedence grouping
Primary
func()
Function call. E.g. isempty(concepts) or query('triangle pythagorean theorem') - see below for details)
Unary
not
Logical negation. E.g. not propertyX in ('a', 'b, 'c')
Comparator
eq
Equals. E.g. propertyX eq 'apple'
sis_group_category_idsis_integration_id (for users and courses)
sis_login_id
sis_section_id
sis_term_id
sis_user_id
lti_context_idsubcurrentcurrentassignment_extensions[][user_id]
Required integer
The ID of the user we want to add assignment extensions for.
assignment_extensions[][extra_attempts]
Required integer
Number of times the student is allowed to re-take the assignment over the limit.
Developer keys created in a root account, by root account administrators or Instructure employees, are only functional for the account they are created in and its sub-accounts. Developer keys created globally, by an Instructure employee, are functional in any Canvas account where they are enabled.
By scoping the tokens, Canvas allows root account administrators to manage the specific API endpoints that tokens issued from a developer key have access to.
Developer key scopes allow root account administrators to restrict the tokens issued from developer keys to a subset of Canvas API endpoints in their account.
Developer keys may be scoped or unscoped. Unscoped keys will have access to all Canvas resources available to the authorizing user. The following applies to scoped developer keys only:
Each Canvas API endpoint has an associated scope. Canvas developer key scopes can only be enabled/disabled by a root account administrator or an Instructure employee.
Scopes take the following form:
For example, the corresponding scope for the GET /api/v1/courses/:course_id/rubrics API endpoint would be
When requesting an access token, third-party applications should specify a scope parameter (see the oauth endpoints documentation). The requested scopes must be a subset of the scopes set for the developer key.
When a client makes any API request, Canvas will verify the requested endpoint's scope has been granted by the account administrator to the developer key of the request's access token.
If the requested endpoint's scope has not been granted Canvas will respond with 401 Unauthorized.
For developer keys created in a specific root account, administrators for that account may grant or revoke scopes. When requesting a developer key, application owners should communicate with administrators which scopes their integrations require.
For global developer keys, an Instructure employee may grant or revoke scopes.
Note: If a scope is removed from a developer key, all access tokens derived from that key will be invalidated. In this case, clients should request a new access token.
View the complete list of token scopes. Scopes may also be found beneath their corresponding endpoints in the "resources" documentation pages.
Developer key management features allow root account administrators to turn global developer keys "on" and "off" for only their account.
Root account administrators may enable or disable global developer keys for their specific account. This means that vendors who wish to have integrations that work in any Canvas account may request a global developer key from Instructure allowing account administrators enable the key for their account.
When a client uses the OAuth2 Auth endpoint as part of the flow to retrieve an access token canvas will check the developer key associated with the client_id. If the developer key is not enabled in the requested account, Canvas will respond with unauthorized_client.
When a client makes any API request, Canvas will check the developer key associated with the access token used in the request. If the developer key is not enabled for the requested account, Canvas will respond with 401 Unauthorized.
When clients request an access token they may specify what scopes the token needs (see the oauth endpoints documentation). Because the client sends the scopes they require in a GET request, the maximum number of scopes one access token can specify is limited by the maximum HTTP header size Canvas allows (8000 chars).
On average, an access token may use up to 110 scopes. This number will vary depending on the actual length of the scopes used and any other headers sent in the login oauth2 request along with the scopes.
If the number of scopes required by the client exceeds this limitation, a second access token with the remaining scopes should be requested.
Several Canvas APIs allow specifying an include parameter. This parameter allows nesting resources in JSON responses. For example, a request to the assignment index endpoint could be made to include the submission objects for each assignment.
Responses to requests made with a scoped access token only support this functionality when the 'Allow Include Parameters' option is also enabled. When this option is disabled, a request is made with a scoped token Canvas will ignore include and includes parameters.
During the lifetime of a developer key, scopes may be added or removed by account administrators. Below is a description of possible changes and how each will affect access tokens:
New scopes are added to a developer key
Access tokens issued prior to the addition of the new scope will continue to function. These access tokens will not, however, be usable with the new scope. To access the newly added resources clients should request a new access token with scopes. The requested scopes must be a subset of the scopes on the developer key.
Scopes are removed from a developer key
Access tokens issued prior to the removal of the scope(s) will not continue to function. Clients should request a new access token with scopes. The requested scopes must be a subset of the scopes on the developer key.
An unscoped developer key becomes scoped
Access tokens issued prior to the change will not continue to function. Clients should request a new access token with scopes. The requested scopes must be a subset of the scopes on the developer key.
If the client attempts to request a new access token without specifying scopes Canvas will respond with an error.
For details on unscoped vs scoped developer key see Developer Key Scopes above.
A scoped developer key becomes unscoped
Access tokens issued prior to the change will continue to function and have access to all resources of the authorizing user. Clients may continue to request scoped access tokens, but these tokens will be functional for all resources available to the authorizing user.
For details on unscoped vs scoped developer key see Developer Key Scopes above.
This documentation is generated directly from the Canvas LMS source code, available on Github.
:user_id parameter can always be replaced with self if the requesting user is asking for his/her own information.A CommunicationChannel object looks like:
GET /api/v1/users/:user_id/communication_channels
Scope: url:GET|/api/v1/users/:user_id/communication_channels
Returns a paginated list of communication channels for the specified user, sorted by position.
Example Request:
Returns a list of CommunicationChannel objects.
POST /api/v1/users/:user_id/communication_channels
Scope: url:POST|/api/v1/users/:user_id/communication_channels
Creates a new communication channel for the specified user.
Request Parameters:
communication_channel[address]
Required string
An email address or SMS number. Not required for “push” type channels.
communication_channel[type]
Required string
The type of communication channel.
In order to enable push notification support, the server must be properly configured (via ‘sns_credsin Vault) to communicate with Amazon Simple Notification Services, and the developer key used to create the access token from this request must have an SNS ARN configured on it.</p> Allowed values:email, sms, push`
communication_channel[token]
string
A registration id, device token, or equivalent token given to an app when registering with a push notification provider. Only valid for “push” type channels.
skip_confirmation
boolean
Only valid for site admins and account admins making requests; If true, the channel is automatically validated and no confirmation email or SMS is sent. Otherwise, the user must respond to a confirmation message to confirm the channel.
Example Request:
Returns a CommunicationChannel object.
DELETE /api/v1/users/:user_id/communication_channels/:id
Scope: url:DELETE|/api/v1/users/:user_id/communication_channels/:id
DELETE /api/v1/users/:user_id/communication_channels/:type/:address
Scope: url:DELETE|/api/v1/users/:user_id/communication_channels/:type/:address
Delete an existing communication channel.
Example Request:
Returns a CommunicationChannel object.
DELETE /api/v1/users/self/communication_channels/push
Scope: url:DELETE|/api/v1/users/self/communication_channels/push
Example Request:
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/users/self/bookmarks
Scope: url:GET|/api/v1/users/self/bookmarks
Returns the paginated list of bookmarks.
Example Request:
Returns a list of Bookmark objects.
POST /api/v1/users/self/bookmarks
Scope: url:POST|/api/v1/users/self/bookmarks
Creates a bookmark.
Request Parameters:
name
string
The name of the bookmark
url
string
The url of the bookmark
position
integer
The position of the bookmark. Defaults to the bottom.
data
string
The data associated with the bookmark
Example Request:
Returns a Bookmark object.
GET /api/v1/users/self/bookmarks/:id
Scope: url:GET|/api/v1/users/self/bookmarks/:id
Returns the details for a bookmark.
Example Request:
Returns a Bookmark object.
PUT /api/v1/users/self/bookmarks/:id
Scope: url:PUT|/api/v1/users/self/bookmarks/:id
Updates a bookmark
Request Parameters:
name
string
The name of the bookmark
url
string
The url of the bookmark
position
integer
The position of the bookmark. Defaults to the bottom.
data
string
The data associated with the bookmark
Example Request:
Returns a Folder object.
DELETE /api/v1/users/self/bookmarks/:id
Scope: url:DELETE|/api/v1/users/self/bookmarks/:id
Deletes a bookmark
Example Request:
This documentation is generated directly from the Canvas LMS source code, available on Github.
Authentication logs are stored for one year.
An AuthenticationEvent object looks like:
GET /api/v1/audit/authentication/logins/:login_id
Scope: url:GET|/api/v1/audit/authentication/logins/:login_id
List authentication events for a given login.
Request Parameters:
start_time
DateTime
The beginning of the time range from which you want events. Events are stored for one year.
end_time
DateTime
The end of the time range from which you want events.
GET /api/v1/audit/authentication/accounts/:account_id
Scope: url:GET|/api/v1/audit/authentication/accounts/:account_id
List authentication events for a given account.
Request Parameters:
start_time
DateTime
The beginning of the time range from which you want events. Events are stored for one year.
end_time
DateTime
The end of the time range from which you want events.
GET /api/v1/audit/authentication/users/:user_id
Scope: url:GET|/api/v1/audit/authentication/users/:user_id
List authentication events for a given user.
Request Parameters:
start_time
DateTime
The beginning of the time range from which you want events. Events are stored for one year.
end_time
DateTime
The end of the time range from which you want events.
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/career/experience_summary
Scope: url:GET|/api/v1/career/experience_summary
Returns the current user’s active experience and available experiences they can switch to.
Example Request:
Returns an ExperienceSummary object.
POST /api/v1/career/switch_experience
Scope: url:POST|/api/v1/career/switch_experience
Switch the current user’s active experience to the specified one.
Request Parameters:
experience
Required string
The experience to switch to.
Allowed values: academic, career
Example Request:
POST /api/v1/career/switch_role
Scope: url:POST|/api/v1/career/switch_role
Switch the current user’s role within the current experience.
Request Parameters:
role
Required string
The role to switch to.
Allowed values: learner, learning_provider
Example Request:
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/comm_messages
Scope: url:GET|/api/v1/comm_messages
Retrieve a paginated list of messages sent to a user.
Request Parameters:
user_id
Required string
The user id for whom you want to retrieve CommMessages
start_time
DateTime
The beginning of the time range you want to retrieve message from. Up to a year prior to the current date is available.
end_time
DateTime
The end of the time range you want to retrieve messages for. Up to a year prior to the current date is available.
Returns a list of CommMessage objects.
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/courses/:course_id/external_feeds
Scope: url:GET|/api/v1/courses/:course_id/external_feeds
GET /api/v1/groups/:group_id/external_feeds
Scope: url:GET|/api/v1/groups/:group_id/external_feeds
Returns the paginated list of External Feeds this course or group.
Example Request:
Returns a list of ExternalFeed objects.
POST /api/v1/courses/:course_id/external_feeds
Scope: url:POST|/api/v1/courses/:course_id/external_feeds
POST /api/v1/groups/:group_id/external_feeds
Scope: url:POST|/api/v1/groups/:group_id/external_feeds
Create a new external feed for the course or group.
Request Parameters:
url
Required string
The url to the external rss or atom feed
header_match
boolean
If given, only feed entries that contain this string in their title will be imported
verbosity
string
Defaults to “full”
Allowed values: full, truncate, link_only
Example Request:
Returns an ExternalFeed object.
DELETE /api/v1/courses/:course_id/external_feeds/:external_feed_id
Scope: url:DELETE|/api/v1/courses/:course_id/external_feeds/:external_feed_id
DELETE /api/v1/groups/:group_id/external_feeds/:external_feed_id
Scope: url:DELETE|/api/v1/groups/:group_id/external_feeds/:external_feed_id
Deletes the external feed.
Example Request:
Returns an ExternalFeed object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
A ReportParameters object looks like:
GET /api/v1/courses/:course_id/reports/:report_type/:id
Scope: url:GET|/api/v1/courses/:course_id/reports/:report_type/:id
Returns the status of a report.
Example Request:
Returns a Report object.
POST /api/v1/courses/:course_id/reports/:report_type
Scope: url:POST|/api/v1/courses/:course_id/reports/:report_type
Generates a report instance for the account. Note that “report” in the request must match one of the available report names.
Request Parameters:
course_id
integer
The id of the course to report on.
report_type
string
The type of report to generate.
parameters[]
Hash
The parameters will vary for each report. A few example parameters have been provided below. Note: the example parameters provided below may not be valid for every report.
parameters[section_ids[]]
integer
The sections of the course to report on. Note: this parameter has been listed to serve as an example and may not be valid for every report.
Returns a Report object.
GET /api/v1/courses/:course_id/reports/:report_type
Scope: url:GET|/api/v1/courses/:course_id/reports/:report_type
Returns the status of the last report initiated by the current user.
Example Request:
Returns a Report object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
`filter[standards]=(query(statement.descr, 'adding fractions'))``filter[standards]=(query(statement.descr, 'fractions') and query(statement.descr, 'adding'))``filter[standards]=(query('adding fractions'))``filter[standards]=(query('don\'t'))``filter[assets]=isempty(disciplines.subjects)`/api/v1/courses/sis_course_id:A1234/assignments// Combination of a Course & EpubExport.
{
// the unique identifier for the course
"id": 101,
// the name for the course
"name": "Maths 101",
// ePub export API object
"epub_export": null
}{
// the unique identifier for the export
"id": 101,
// the date and time this export was requested
"created_at": "2014-01-01T00:00:00Z",
// attachment api object for the export ePub (not present until the export
// completes)
"attachment": {"url":"https:\/\/example.com\/api\/v1\/attachments\/789?download_frd=1"},
// The api endpoint for polling the current progress
"progress_url": "https://example.com/api/v1/progress/4",
// The ID of the user who started the export
"user_id": 4,
// Current state of the ePub export: created exporting exported generating
// generated failed
"workflow_state": "exported"
}{
// The ID of the Assignment the extension belongs to.
"assignment_id": 2,
// The ID of the Student that needs the assignment extension.
"user_id": 3,
// Number of times the student is allowed to re-submit the assignment
"extra_attempts": 2
}{
"assignment_extensions": [{
"user_id": 3,
"extra_attempts": 2
},{
"user_id": 2,
"extra_attempts": 2
}]
}{
"assignment_extensions": [AssignmentExtension]
}url:<HTTP Verb>|<Canvas API Endpoint Path>url:GET|/api/v1/courses/:course_id/rubrics{
// The ID of the communication channel.
"id": 16,
// The address, or path, of the communication channel.
"address": "[email protected]",
// The type of communcation channel being described. Possible values are:
// 'email', 'push', 'sms'. This field determines the type of value seen in
// 'address'.
"type": "email",
// The position of this communication channel relative to the user's other
// channels when they are ordered.
"position": 1,
// The ID of the user that owns this communication channel.
"user_id": 1,
// The number of bounces the channel has experienced. This is reset if the
// channel sends successfully.
"bounce_count": 0,
// The time the last bounce occurred.
"last_bounce_at": "2012-05-30T17:00:00Z",
// The current state of the communication channel. Possible values are:
// 'unconfirmed' or 'active'.
"workflow_state": "active"
}curl https://<canvas>/api/v1/users/12345/communication_channels \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/users/1/communication_channels \
-H 'Authorization: Bearer <token>' \
-d 'communication_channel[address][email protected]' \
-d 'communication_channel[type]=email' \curl https://<canvas>/api/v1/users/5/communication_channels/3
-H 'Authorization: Bearer <token>
-X DELETEcurl https://<canvas>/api/v1/users/self/communication_channels/push
-H 'Authorization: Bearer <token>
-X DELETE
-d 'push_token=<push_token>'{
"id": 1,
"name": "Biology 101",
"url": "/courses/1",
"position": 1,
"data": {"active_tab":1}
}curl 'https://<canvas>/api/v1/users/self/bookmarks' \
-H 'Authorization: Bearer <token>'curl 'https://<canvas>/api/v1/users/self/bookmarks' \
-F 'name=Biology 101' \
-F 'url=/courses/1' \
-H 'Authorization: Bearer <token>'curl 'https://<canvas>/api/v1/users/self/bookmarks/1' \
-H 'Authorization: Bearer <token>'curl -X PUT 'https://<canvas>/api/v1/users/self/bookmarks/1' \
-F 'name=Biology 101' \
-F 'url=/courses/1' \
-H 'Authorization: Bearer <token>'curl -X DELETE 'https://<canvas>/api/v1/users/self/bookmarks/1' \
-H 'Authorization: Bearer <token>'{
// timestamp of the event
"created_at": "2012-07-19T15:00:00-06:00",
// authentication event type ('login' or 'logout')
"event_type": "login",
// ID of the pseudonym (login) associated with the event
"pseudonym_id": 9478,
// ID of the account associated with the event. will match the account_id in the
// associated pseudonym.
"account_id": 2319,
// ID of the user associated with the event will match the user_id in the
// associated pseudonym.
"user_id": 362
}{
// The current active experience. One of: 'academic', 'career_learner',
// 'career_learning_provider'.
"current_app": "career_learner",
// List of available experiences for the user. Can include: 'academic',
// 'career_learner', 'career_learning_provider'.
"available_apps": ["academic", "career_learner"]
}curl https://<canvas>/api/v1/career_experience/experience_summary \
-H 'Authorization: Bearer <token>'curl -X POST https://<canvas>/api/v1/career_experience/switch_experience \
-H 'Authorization: Bearer <token>' \
-d 'experience=academic'curl -X POST https://<canvas>/api/v1/career_experience/switch_role \
-H 'Authorization: Bearer <token>' \
-d 'role=learner'{
// The ID of the CommMessage.
"id": 42,
// The date and time this message was created
"created_at": "2013-03-19T21:00:00Z",
// The date and time this message was sent
"sent_at": "2013-03-20T22:42:00Z",
// The workflow state of the message. Possible values: 'created' : The message
// has been created, but not yet processed. 'staged' : The message is queued for
// sending. 'sending' : The message is being sent currently. 'sent' : The
// message has been successfully sent. 'bounced' : An error occurred during the
// sending of the message.'dashboard' : The message has been sent to the
// dashboard. 'closed' : The message has been sent and closed, typically for
// dashboard messages or messages sent to deleted users. 'cancelled' : The
// message was cancelled before it could be sent.
"workflow_state": "sent",
// The address that was put in the 'from' field of the message
"from": "[email protected]",
// The display name for the from address
"from_name": "Instructure Canvas",
// The address the message was sent to:
"to": "[email protected]",
// The reply_to header of the message
"reply_to": "[email protected]",
// The message subject
"subject": "example subject line",
// The plain text body of the message
"body": "This is the body of the message",
// The HTML body of the message.
"html_body": "<html><body>This is the body of the message</body></html>"
}{
// The ID of the feed
"id": 5,
// The title of the feed, pulled from the feed itself. If the feed hasn't yet
// been pulled, a temporary name will be synthesized based on the URL
"display_name": "My Blog",
// The HTTP/HTTPS URL to the feed
"url": "http://example.com/myblog.rss",
// If not null, only feed entries whose title contains this string will trigger
// new posts in Canvas
"header_match": "pattern",
// When this external feed was added to Canvas
"created_at": "2012-06-01T00:00:00-06:00",
// The verbosity setting determines how much of the feed's content is imported
// into Canvas as part of the posting. 'link_only' means that only the title and
// a link to the item. 'truncate' means that a summary of the first portion of
// the item body will be used. 'full' means that the full item body will be
// used.
"verbosity": "truncate"
}curl https://<canvas>/api/v1/courses/<course_id>/external_feeds \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/external_feeds \
-F url='http://example.com/rss.xml' \
-F header_match='news flash!' \
-F verbosity='full' \
-H 'Authorization: Bearer <token>'curl -X DELETE https://<canvas>/api/v1/courses/<course_id>/external_feeds/<feed_id> \
-H 'Authorization: Bearer <token>'{
// The unique identifier for the report.
"id": 1,
// The url to the report download.
"file_url": "https://example.com/some/path",
// The attachment api object of the report. Only available after the report has
// completed.
"attachment": null,
// The status of the report
"status": "complete",
// The date and time the report was created.
"created_at": "2013-12-01T23:59:00-06:00",
// The date and time the report started processing.
"started_at": "2013-12-02T00:03:21-06:00",
// The date and time the report finished processing.
"ended_at": "2013-12-02T00:03:21-06:00",
// The report parameters
"parameters": {"course_id":2,"start_at":"2012-07-13T10:55:20-06:00","end_at":"2012-07-13T10:55:20-06:00"},
// The progress of the report
"progress": 100
}// The parameters returned will vary for each report.
{
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/<course_id>/reports/<report_type>/<report_id>curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/<course_id>/reports/<report_type>When a document is added to your delivery, you will receive an Event with target set to document and change_type set to added. This Event indicates that you should request and download the Standards related to the specified document. E.g. you may receive an Event that looks something like:
That would initiate a process that requests Standards related to that document:
Similarly, if you receive an Event with change_type set to removed, your license requires that you purge the related document and references from your system.
Notes:
Delivery Events can occur on sections as well as documents.
Events that occur on Standards that are not delivered to you are not visible to you. The filtering of Events by deliverability is time sensitive so you will not receive Events that occurred on Standards that were not deliverable to you at the time of the Event, even if the Standard is deliverable at the time of the call.
Since Standards changes are delivered based on the status at the time of the Event, it is possible for you to receive Events on Standards that you no longer have access to. So if you receive a change Event for a Standard and your change management process tries to look up the details of the Standard but doesn't have access, silently skip the process because a removed Event is somewhere later in the queue. For example:
You are licensed to Standard A.
You sync up all changes.
Standard A changes so an Event is created and you have access to it.
You remove Standard A from your delivery.
You sync up changes.
You get a change Event for Standard A but you no longer have access to it.
You get a change Event to remove Standard A.
You can request individual Events but more commonly you would request Events that have occurred since your last sync. In previous versions, the filter for requesting updates focused the filter on the date. However, this can be problematic due to concurrency and race conditions. Now, AB Connect gives each Event a sequence number to ensure no Events are missed. After each refresh, store the sequence number of the last Event you received. Future requests should request Events with sequence numbers greater than the last one you received. E.g. if the last Event you received had a sequence number of 28974, the request may look like:
A couple of important notes about the sequence number:
Sequence numbers will not appear incremental. Each Event in the system gets a unique number and since the Events include partner specific Events (like changes in license and Standards delivery settings), Events received by any individual partner will not have incremental numbers.
New partners can use seq GT 0 to start. Since you will not receive Events that occur before your license was active, you won't be flooded with historical data. The first Events you will see will be Events to add documents (and possibly sections). You can use this approach to do the initial download of the Standards into your cache. However, if you've already downloaded all of the Standards you have access to, you will want to skip this first set of Events.
One of the advantages of using Events is that you can build a workflow around them. You may want to consider caching Events before acting on them in your system. That will allow you to put the changes into an editorial workflow so you can make decisions for accurately updating alignments and other relationships.
For example, if you receive an Event indicating a Standard has been deleted, you may want to flag content aligned to that Standard as being in need of an alignment review.
Unlike Standard change Events, deliverability Events should be acted upon immediately to ensure your system is in line with license agreements.
Using filtering, it is possible to retrieve sets of Events. These Events are returned in an array of Events objects. See the Introduction for an explanation on filtering. This section covers the specifics of using these parameters with the Events resource.
A note on filtering Events. Events can be filtered on the properties of the Event object AND on the same subset of properties of the Standards that are listed in the section on Filtering Resources by Properties on Related Resources. The exceptions are the Event affected_properties.new_value and affected_properties.previous_value fields since those are of variant types.
POST /api/v1/courses/:course_id/quiz_extensions
Scope: url:POST|/api/v1/courses/:course_id/quiz_extensions
Responses
200 OK if the request was successful
403 Forbidden if you are not allowed to extend quizzes for this course
Request Parameters:
user_id
Required integer
The ID of the user we want to add quiz extensions for.
extra_attempts
integer
Number of times the student is allowed to re-take the quiz over the multiple-attempt limit. This is limited to 1000 attempts or less.
extra_time
integer
The number of extra minutes to allow for all attempts. This will add to the existing time limit on the submission. This is limited to 10080 minutes (1 week)
manually_unlocked
boolean
Allow the student to take the quiz even if it’s locked for everyone else.
Example Request:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/announcements
Scope: url:GET|/api/v1/announcements
Returns the paginated list of announcements for the given courses and date range. Note that a context_code field is added to the responses so you can tell which course each announcement belongs to.
Request Parameters:
context_codes[]
Required string
List of context_codes to retrieve announcements for (for example, course_123). Only courses are presently supported. The call will fail unless the caller has View Announcements permission in all listed courses.
start_date
Date
Only return announcements posted since the start_date (inclusive). Defaults to 14 days ago. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ.
end_date
Date
Only return announcements posted before the end_date (inclusive). Defaults to 28 days from start_date. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ. Announcements scheduled for future posting will only be returned to course administrators.
available_after
Date
Only return announcements having locked_at nil or after available_after (exclusive). The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ. Effective only for students (who don’t have moderate forum right).
Example Request:
Example Response:
Returns a list of DiscussionTopic objects.
This documentation is generated directly from the Canvas LMS source code, available on Github.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
A Token object looks like:
GET /api/v1/users/:user_id/user_generated_tokens
Scope: url:GET|/api/v1/users/:user_id/user_generated_tokens
Returns a list of manually generated access tokens for the specified user. Note that the actual token values are only returned when the token is first created.
Request Parameters:
Returns a list of objects.
GET /api/v1/users/:user_id/tokens/:id
Scope: url:GET|/api/v1/users/:user_id/tokens/:id
The ID can be the actual database ID of the token, or the ‘token_hint’ value.
POST /api/v1/users/:user_id/tokens
Scope: url:POST|/api/v1/users/:user_id/tokens
Create a new access token for the specified user. If the user is not the current user, the token will be created as “pending”, and must be activated by the user before it can be used.
Request Parameters:
PUT /api/v1/users/:user_id/tokens/:id
Scope: url:PUT|/api/v1/users/:user_id/tokens/:id
Update an existing access token.
The ID can be the actual database ID of the token, or the ‘token_hint’ value.
Regenerating an expired token requires a new expiration date.
Request Parameters:
DELETE /api/v1/users/:user_id/tokens/:id
Scope: url:DELETE|/api/v1/users/:user_id/tokens/:id
The ID can be the actual database ID of the token, or the ‘token_hint’ value.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Manage account role assignments
An Admin object looks like:
GET /api/v1/accounts/:account_id/admins
Scope: url:GET|/api/v1/accounts/:account_id/admins
A paginated list of the admins in the account
Request Parameters:
Returns a list of objects.
POST /api/v1/accounts/:account_id/admins
Scope: url:POST|/api/v1/accounts/:account_id/admins
Flag an existing user as an admin within the account.
Request Parameters:
Returns an object.
DELETE /api/v1/accounts/:account_id/admins/:user_id
Scope: url:DELETE|/api/v1/accounts/:account_id/admins/:user_id
Remove the rights associated with an account admin role from a user.
Request Parameters:
Returns an object.
GET /api/v1/accounts/:account_id/admins/self
Scope: url:GET|/api/v1/accounts/:account_id/admins/self
A paginated list of the current user’s roles in the account. The results are the same as those returned by the endpoint with user_id set to self, except the “Admins - Add / Remove” permission is not required.
Returns a list of objects.
This documentation is generated directly from the Canvas LMS source code, available .
Academic Benchmarks refers to partner content and assessment items as Assets. In AB Connect, an Asset is the metadata that describes the content - not the actual content itself. The Assets resource can be used to perform a host of operations on partner Assets to allow you to manage and relate your Assets. You can create, modify and delete Assets. You can also build a metadata profile for your Assets which allow you to take advantage of the power of the AB Connect prediction engine to establish and maintain relationships between your Asset, Standards and other Assets. See the section on Licensing Considerations for a discussion on the licensing required for access to Assets.
In addition to the attributes and relationships built into AB Connect to support Content Enrichment and predictions, AB Connect allows you to define your own attributes to support needs such as advanced searching. These customer defined attributes are referred to as descriptors or custom attributes. They can be configured per Asset type either by you (if you have web access enabled for your account) or by AB Support.
Custom attributes are represented in the API in two ways: through the descriptors array or by direct named properties of the custom_attributes object property. The name of the property is defined in the Asset setup screens. The descriptors array was the initial implementation and has been kept for backwards compatibility but the direct named attributes are easier to work with (particularly when filtering) and are the recommended approach. To illustrate the payload for custom attributes, if the Asset type has a property named "Color", it will be represented in the descriptors array as an anonymous name/value pair like:
However, it will also be represented as a named attribute like:
A couple of key points:
When custom attributes are exchanged in JSON as named attributes, they are converted to lower case and any spaces or special characters are replaced by underscores. Multiple underscores in a row are collapsed into a single underscore. You won't need to think too much about this because the Asset type setup screen shows both the full property name and the JSON API attribute property name.
It is the responsibility of the client application to control the values of the custom attributes, so if you have single-valued properties or controlled vocabularies in your use case, ensure they are handled properly before sending the data to AB Connect.
The named attribute is an array. This is because custom attributes are multi-valued in AB Connect. In the descriptors array, this is represented by multiple anonymous objects with the same "name" and different "values". For example, if your Asset type is college logos, the University of Michigan Asset may have Color values of blue and yellow. The Color property would appear in the JSON as:
And:
Finally, all calls against the Asset resource must be implemented as HTTP GET, POST, DELETE or PATCH requests, and must include proper .
To create an Asset within the AB Connects system, you send a POST to the endpoint. The body of the POST contains the Asset definition in JSON format. The only required fields are client_id and asset_type. You can define your asset_type using the Academic Benchmarks web interface or have support set it up for you. If you do not know your asset_type or need to have one setup for you, contact for details.
Note: The Asset endpoint allows you to manipulate basic attributes of the Asset. To manage relationships, see the section on .
{% swagger src="../openapi.yml" path="/assets" method="post" %} openapi.yml {% endswagger %}
To work with an Asset, you've created, call the endpoint with a GET while supplying the AB GUID for the Asset. If you have your organization's ID for the Asset but not the AB GUID, see the section on and search on client_id to retrieve the AB GUID.
{% swagger src="../openapi.yml" path="/assets/{guid}" method="get" %} openapi.yml {% endswagger %}
To work with an Asset you've created, call the endpoint while supplying the AB GUID for the Asset. If you have your organization's ID for the Asset but not the AB GUID, see the section on and search on client_id to retrieve the AB GUID.
To update an Asset, PATCH the Asset URL (with GUID) sending JSON in the body similar to that in the create statement. The JSON body only needs to contain the attributes that need to be updated. You cannot update the client_id or asset_type once the Asset is created. If one of those needs to change, you will need to delete the old Asset and create a new one.
Notes on PATCHing Assets:
You do not need to include every field in a PATCH body. However, any field you include will replace the current value of that field on the Asset. For simple fields like title, that's not surprising. However, if you PATCH an object or array, you need to send the final state of that array or object - not just a single element. E.g. if the Asset has a descriptor with 5 name/value pairs on it and you send a PATCH to change 1 name/value pair, be sure to have copies of the other 4 name/value pairs in the descriptor array or the resulting Asset will only have one descriptor name/value pair.
If you are doing a bulk update of Assets where you are requesting a large number of Assets, paging through the list and PATCHing the Assets as you page, be sure to sort the list on a field you are not modifying - preferably on a unique fields like the GUID. If you leave the sort order to the default (relevance) or sort on a field you are changing, you will likely get duplicate and skipped Assets as you page through the list.
{% swagger src="../openapi.yml" path="/assets/{guid}" method="patch" %} openapi.yml {% endswagger %}
To delete an Asset you've created, call the endpoint while supplying the AB GUID for the Asset. If you have your organization's ID for the Asset but not the AB GUID, see the section on and search on client_id to retrieve the AB GUID.
Assets can be deleted by sending a DELETE to their "self" URL.
{% swagger src="../openapi.yml" path="/assets" method="delete" %} openapi.yml {% endswagger %}
Using filtering it is possible to retrieve sets of Assets that match specific criteria. These Assets are returned in an array of Asset objects. See the Introduction for an explanation on and . This section covers the specifics of using filtering with the Assets resource.
To find Assets related to Standards, search based on the Standard GUID in the `
alignments.id` field. E.g.
A similar approach can be applied to Topics and Concepts.
If you have your organization's identifier for the Asset, but not the AB GUID for it, you can retrieve the GUID by doing a search on client_id to locate the Asset. E.g.
filter[assets]=(client_id eq 'AJIH-45679')
With AB Connect, it is possible to share your Assets with other AB Connect customers (Providers) to facilitate application interoperability. You can allow other Providers (the Consumer) to search sets of your Assets and retrieve the metadata profile describing your content. See the section on the endpoint for an overview.
Assets include an owner relationship that references the object of the Provider to which the Asset belongs. By default, the Assets endpoint only searches the Assets you own. To search the Assets of other Providers, include owner.id in your filter criteria. You can get the IDs of the Owners to which you have access using the Providers endpoint. Alternatively, you can use the special keyword _all to search across all repositories to which you have access. E.g. filter[assets]=owner.id eq _all. You can also use the keyword _me to limit the search to just the Assets you own, but this is redundant with the approach of not specifying the owner.id at all.
Note that if you are including other Owners in your request, you can not include custom_attributes. Cross-owner searches can only operate on built-in properties.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for exporting courses and course content
A ContentExport object looks like:
GET /api/v1/courses/:course_id/content_exports
Scope: url:GET|/api/v1/courses/:course_id/content_exports
GET /api/v1/groups/:group_id/content_exports
Scope: url:GET|/api/v1/groups/:group_id/content_exports
GET /api/v1/users/:user_id/content_exports
Scope: url:GET|/api/v1/users/:user_id/content_exports
A paginated list of the past and pending content export jobs for a course, group, or user. Exports are returned newest first.
Returns a list of objects.
GET /api/v1/courses/:course_id/content_exports/:id
Scope: url:GET|/api/v1/courses/:course_id/content_exports/:id
GET /api/v1/groups/:group_id/content_exports/:id
Scope: url:GET|/api/v1/groups/:group_id/content_exports/:id
GET /api/v1/users/:user_id/content_exports/:id
Scope: url:GET|/api/v1/users/:user_id/content_exports/:id
Get information about a single content export.
Returns a object.
POST /api/v1/courses/:course_id/content_exports
Scope: url:POST|/api/v1/courses/:course_id/content_exports
POST /api/v1/groups/:group_id/content_exports
Scope: url:POST|/api/v1/groups/:group_id/content_exports
POST /api/v1/users/:user_id/content_exports
Scope: url:POST|/api/v1/users/:user_id/content_exports
Begin a content export job for a course, group, or user.
You can use the to track the progress of the export. The migration’s progress is linked to with the progress_url value.
When the export completes, use the endpoint to retrieve a download URL for the exported content.
Request Parameters:
Returns a object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing course and group collaboration information.
A Collaboration object looks like:
A Collaborator object looks like:
GET /api/v1/courses/:course_id/collaborations
Scope: url:GET|/api/v1/courses/:course_id/collaborations
GET /api/v1/groups/:group_id/collaborations
Scope: url:GET|/api/v1/groups/:group_id/collaborations
A paginated list of collaborations the current user has access to in the context of the course provided in the url. NOTE: this only returns ExternalToolCollaboration type collaborations.
Returns a list of objects.
GET /api/v1/collaborations/:id/members
Scope: url:GET|/api/v1/collaborations/:id/members
A paginated list of the collaborators of a given collaboration
Request Parameters:
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/potential_collaborators
Scope: url:GET|/api/v1/courses/:course_id/potential_collaborators
GET /api/v1/groups/:group_id/potential_collaborators
Scope: url:GET|/api/v1/groups/:group_id/potential_collaborators
A paginated list of the users who can potentially be added to a collaboration in the given context.
For courses, this consists of all enrolled users. For groups, it is comprised of the group members plus the admins of the course containing the group.
Returns a list of objects.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
An ErrorReport object looks like:
POST /api/v1/error_reports
Scope: url:POST|/api/v1/error_reports
Create a new error report documenting an experienced problem
Performs the same action as when a user uses the “help -> report a problem” dialog.
Request Parameters:
Example Request:
This documentation is generated directly from the Canvas LMS source code, available .
Facets are common filter criteria that will help you present useful filter options to your end users. To request a list of facets for your license and filter criteria, use the facet argument in the GET query. The results are returned in the meta section of the response.
The form of the request is:
facet=<CSV list of facet attributes>
Calculating the facet summaries returned in the meta.facet section of the response does incur some calculation overhead. It is negligible in most circumstances but you have control over how much faceting the server performs. The URL query parameter facet_summary allows you to specify which data fields are processed with the call. A few useful examples:
facet_summary=*
When there is a need to quickly identify and refer to a filtered collection of standards, the "Standard Collection" is what provides a solution. Standard Collection stores the filters object with a name and a guid as reference.
The "filters" is a JSON object that stores "filters (standard hierarchy)", "globalFilters". Searching filters are generated from this object to narrow down the result set the client wants to use.
The "name" identifies the standard collection in human readable format.
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Query audit log of course events.
For each endpoint, a compound document is returned. The primary collection of event objects is paginated, ordered by date descending. Secondary collections of courses, users and page_views related to the returned events are also included.
guid of specified concept
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of facet names that you are requesting the options on.
A comma separated list of facet names for which you are requesting summary information.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset definition
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
OK
Bad Request
Authentication Error
Entity not found
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified standard
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
A comma separated list of resource names that will be returned in the response. Standards have relationships with other resources (e.g. other Standards, Topics and Concepts). By default, those related resources are returned as references to other endpoints and only their IDs are included in the response. If you list the related resources by their relationship name in the include statement, the properties of the related resources are included as well.
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of facet names that you are requesting the options on.
A comma separated list of facet names for which you are requesting summary information.
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
A comma separated list of resource names that will be returned in the response.
OK
Bad Request
Authentication Error
Entity not found
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified topic
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
A comma separated list of resource names that will be returned in the response.
OK
Bad Request
Authentication Error
Entity not found
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of facet names that you are requesting the options on.
A comma separated list of facet names for which you are requesting summary information.
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
...
"data": {
"id": "0ae17409-38fd-4e26-809d-03a309139be2",
"type": "events",
"attributes": {
"seq": 12354,
"date_utc": "2017-11-12 00:00:00",
"change_type": "added",
"target": "document",
"section_guid": "721CFFCC-9BDD-11E6-ABFB-8C24CDC8CA83",
"document_guid": "351CFFCC-9BDD-11E6-ABFB-8C24CDC8CA83",
"affected_properties": []
},
"relationships": {
"standard": {
"data": {
}
},
"nondeliverable_standard": {
"data": { }
},
"deleted_standard": {
"data": {
}
}
}
}
...`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=document.id EQ '351CFFCC-9BDD-11E6-ABFB-8C24CDC8CA83'``https://api.abconnect.instructure.com/rest/v4.1/events?filter[events]=seq GT 28974&sort[events]=seq`{
// The ID of the Student that needs the quiz extension.
"user_id": 3,
// Number of times the student is allowed to re-take the quiz over the
// multiple-attempt limit.
"extra_attempts": 1,
// Amount of extra time allowed for the quiz submission, in minutes.
"extra_time": 60,
// The student can take the quiz even if it's locked for everyone else
"manually_unlocked": true,
// The time at which the quiz submission will be overdue, and be flagged as a
// late submission.
"end_at": "2013-11-07T13:16:18Z"
}{
"quiz_extensions": [{
"user_id": 3,
"extra_attempts": 2,
"extra_time": 20,
"manually_unlocked": true
},{
"user_id": 2,
"extra_attempts": 2,
"extra_time": 20,
"manually_unlocked": false
}]
}{
"quiz_extensions": [{
"user_id": 3,
"extend_from_now": 20
}]
}{
"quiz_extensions": [QuizExtension]
}curl https://<canvas>/api/v1/announcements?context_codes[]=course_1&context_codes[]=course_2 \
-H 'Authorization: Bearer <token>'[{
"id": 1,
"title": "Hear ye",
"message": "Henceforth, all assignments must be...",
"posted_at": "2017-01-31T22:00:00Z",
"delayed_post_at": null,
"context_code": "course_2",
...
}]{
// The internal database ID of the token.
"id": null,
// The time the token was created.
"created_at": null,
// The time the token will permanently expire, or null if it does not
// permanently expire.
"expires_at": null,
// The current state of the token. One of 'active', 'pending', 'disabled', or
// 'deleted'.
"workflow_state": null,
// Whether the token should be remembered across sessions. Only applicable for
// OAuth tokens.
"remember_access": null,
// The scopes associated with the token. If empty, there are no scope
// limitations.
"scopes": null,
// If the token was created while masquerading, this is the ID of the real user.
// Otherwise, null.
"real_user_id": null,
// The actual access token. Only included when the token is first created.
"token": null,
// A short, unique string that can be used to look up the token.
"token_hint": null,
// The ID of the user the token belongs to.
"user_id": null,
// The purpose of the token.
"purpose": null,
// If the token was created by an OAuth application, this is the name of that
// application. Otherwise, null.
"app_name": null,
// Whether the current user can manually regenerate this token.
"can_manually_regenerate": null
}// A collection of information around a specific notification of a problem
{
// The users problem summary, like an email subject line
"subject": "File upload breaking",
// long form documentation of what was witnessed
"comments": "When I went to upload a .mov file to my files page, I got an error. Retrying didn't help, other file types seem ok",
// categorization of how bad the user thinks the problem is. Should be one of
// [just_a_comment, not_urgent, workaround_possible, blocks_what_i_need_to_do,
// extreme_critical_emergency].
"user_perceived_severity": "just_a_comment",
// the email address of the reporting user
"email": "[email protected]",
// URL of the page on which the error was reported
"url": "https://canvas.instructure.com/courses/1",
// string describing the asset being interacted with at the time of error.
// Formatted '[type]_[id]'
"context_asset_string": "user_1",
// comma seperated list of roles the reporting user holds. Can be one
// [student], or many [teacher,admin]
"user_roles": "user,teacher,admin"
}extend_from_now
integer
The number of minutes to extend the quiz from the current time. This is mutually exclusive to extend_from_end_at. This is limited to 1440 minutes (24 hours)
extend_from_end_at
integer
The number of minutes to extend the quiz beyond the quiz’s current ending time. This is mutually exclusive to extend_from_now. This is limited to 1440 minutes (24 hours)
per_page
integer
The number of results to return per page. Defaults to 10. Maximum of 100.
token[purpose]
Required string
The purpose of the token.
token[expires_at]
DateTime
The time at which the token will expire.
token[scopes][]
Array
The scopes to associate with the token. Ignored if the default developer key does not have the “enable scopes” option enabled. In such cases, the token will inherit the user’s permissions instead.
token[purpose]
string
The purpose of the token.
token[expires_at]
DateTime
The time at which the token will expire.
token[scopes][]
Array
The scopes to associate with the token.
token[regenerate]
boolean
Regenerate the actual token.
BETA: This API resource is not finalized, and there could be breaking changes before its final release.
API for enabling/disabling the use of Content Security Policy headers and configuring allowed domains
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
GET /api/v1/courses/:course_id/csp_settings
Scope: url:GET|/api/v1/courses/:course_id/csp_settings
GET /api/v1/accounts/:account_id/csp_settings
Scope: url:GET|/api/v1/accounts/:account_id/csp_settings
Update multiple modules in an account.
API response field:
enabled
Whether CSP is enabled.
inherited
Whether the current CSP settings are inherited from a parent account.
settings_locked
Whether current CSP settings can be overridden by sub-accounts and courses.
effective_whitelist
If enabled, lists the currently allowed domains (includes domains automatically allowed through external tools).
tools_whitelist
(Account-only) Lists the automatically allowed domains with their respective external tools
current_account_whitelist
(Account-only) Lists the current list of domains explicitly allowed by this account. (Note: this list will not take effect unless CSP is explicitly enabled on this account)
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
PUT /api/v1/courses/:course_id/csp_settings
Scope: url:PUT|/api/v1/courses/:course_id/csp_settings
PUT /api/v1/accounts/:account_id/csp_settings
Scope: url:PUT|/api/v1/accounts/:account_id/csp_settings
Either explicitly sets CSP to be on or off for courses and sub-accounts, or clear the explicit settings to default to those set by a parent account
Note: If “inherited” and “settings_locked” are both true for this account or course, then the CSP setting cannot be modified.
Request Parameters:
status
Required string
If set to “enabled” for an account, CSP will be enabled for all its courses and sub-accounts (that have not explicitly enabled or disabled it), using the allowed domains set on this account. If set to “disabled”, CSP will be disabled for this account or course and for all sub-accounts that have not explicitly re-enabled it. If set to “inherited”, this account or course will reset to the default state where CSP settings are inherited from the first parent account to have them explicitly set.
Allowed values: enabled, disabled, inherited
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
PUT /api/v1/accounts/:account_id/csp_settings/lock
Scope: url:PUT|/api/v1/accounts/:account_id/csp_settings/lock
Can only be set if CSP is explicitly enabled or disabled on this account (i.e. “inherited” is false).
Request Parameters:
settings_locked
Required boolean
Whether sub-accounts and courses will be prevented from overriding settings inherited from this account.
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
POST /api/v1/accounts/:account_id/csp_settings/domains
Scope: url:POST|/api/v1/accounts/:account_id/csp_settings/domains
Adds an allowed domain for the current account. Note: this will not take effect unless CSP is explicitly enabled on this account.
Request Parameters:
domain
Required string
no description
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
POST /api/v1/accounts/:account_id/csp_settings/domains/batch_create
Scope: url:POST|/api/v1/accounts/:account_id/csp_settings/domains/batch_create
Adds multiple allowed domains for the current account. Note: this will not take effect unless CSP is explicitly enabled on this account.
Request Parameters:
domains
Required Array
no description
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
DELETE /api/v1/accounts/:account_id/csp_settings/domains
Scope: url:DELETE|/api/v1/accounts/:account_id/csp_settings/domains
Removes an allowed domain from the current account.
Request Parameters:
domain
Required string
no description
This documentation is generated directly from the Canvas LMS source code, available on Github.
active_only
boolean
Only return active announcements that have been published. Applies only to requesting users that have permission to view unpublished items. Defaults to false for users with access to view unpublished items, otherwise true and unmodifiable.
latest_only
boolean
Only return the latest announcement for each associated context. The response will include at most one announcement for each specified context in the context_codes[] parameter. Defaults to false.
include
array
Optional list of resources to include with the response. May include a string of the name of the resource. Possible values are: “sections”, “sections_user_count” if “sections” is passed, includes the course sections that are associated with the topic, if the topic is specific to certain sections of the course. If “sections_user_count” is passed, then:
user_id[]
[Integer]
Scope the results to those with user IDs equal to any of the IDs specified here.
search_term
string
The partial name or full ID of the admins to match and return in the results list. Must be at least 2 characters.
include_deleted
boolean
When set to true, returns admins who have been deleted
user_id
Required integer
The id of the user to promote.
role
string
DEPRECATED
The user’s admin relationship with the account will be
created with the given role. Defaults to ‘AccountAdmin’.
role_id
integer
The user’s admin relationship with the account will be created with the given role. Defaults to the built-in role for ‘AccountAdmin’.
send_confirmation
boolean
Send a notification email to the new admin if true. Default is true.
role
string
DEPRECATED
Account role to remove from the user.
role_id
Required integer
The id of the role representing the user’s admin relationship with the account.
export_type
Required string
“common_cartridge”
Export the contents of the course in the Common Cartridge (.imscc) format
“qti”
Export quizzes from a course in the QTI format
“zip”
Export files from a course, group, or user in a zip file
Allowed values: common_cartridge, qti, zip
skip_notifications
boolean
Don’t send the notifications about the export to the user. Default: false
select
Hash
The select parameter allows exporting specific data. The keys are object types like ‘files’, ‘folders’, ‘pages’, etc. The value for each key is a list of object ids. An id can be an integer or a string.
Multiple object types can be selected in the same call. However, not all object types are valid for every export_type. Common Cartridge supports all object types. Zip and QTI only support the object types as described below.
“folders”
Also supported for zip export_type.
“files”
Also supported for zip export_type.
“quizzes”
Also supported for qti export_type.
Allowed values: folders, files, attachments, quizzes, assignments, announcements, calendar_events, discussion_topics, modules, module_items, pages, rubrics
include[]
string
“collaborator_lti_id”: Optional information to include with each member. Represents an identifier to be used for the member in an LTI context.
“avatar_image_url”: Optional information to include with each member. The url for the avatar of a collaborator with type ‘user’.
Allowed values: collaborator_lti_id, avatar_image_url
error[http_env]
SerializedHash
A collection of metadata about the users’ environment. If not provided, canvas will collect it based on information found in the request. (Doesn’t have to be HTTPENV info, could be anything JSON object that can be serialized as a hash, a mobile app might include relevant metadata for itself)
error[subject]
Required string
The summary of the problem
error[url]
string
URL from which the report was issued
error[email]
string
Email address for the reporting user
error[comments]
string
The long version of the story from the user one what they experienced
manage_account_calendar_visibility permission may set calendars as visible. Administrators with the manage_account_calendar_events permission can create events in visible account calendars, and users associated with an account can add the calendar and see its events (if the calendar is visible). Events on calendars set as auto_subscribe calendars will appear on users' calendars even if they do not manually add it.An AccountCalendar object looks like:
GET /api/v1/account_calendars
Scope: url:GET|/api/v1/account_calendars
Returns a paginated list of account calendars available to the current user. Includes visible account calendars where the user has an account association.
Request Parameters:
search_term
string
When included, searches available account calendars for the term. Returns matching results. Term must be at least 2 characters.
Example Request:
Returns a list of AccountCalendar objects.
GET /api/v1/account_calendars/:account_id
Scope: url:GET|/api/v1/account_calendars/:account_id
Get details about a specific account calendar.
Example Request:
Returns an AccountCalendar object.
PUT /api/v1/account_calendars/:account_id
Scope: url:PUT|/api/v1/account_calendars/:account_id
Set an account calendar’s visibility and auto_subscribe values. Requires the ‘manage_account_calendar_visibility` permission on the account.
Request Parameters:
visible
boolean
Allow administrators with ‘manage_account_calendar_events` permission to create events on this calendar, and allow users to view this calendar and its events.
auto_subscribe
boolean
When true, users will automatically see events from this account in their calendar, even if they haven’t manually added that calendar.
Example Request:
Returns an AccountCalendar object.
PUT /api/v1/accounts/:account_id/account_calendars
Scope: url:PUT|/api/v1/accounts/:account_id/account_calendars
Set visibility and/or auto_subscribe on many calendars simultaneously. Requires the ‘manage_account_calendar_visibility` permission on the account.
Accepts a JSON array of objects containing 2-3 keys each: ‘id` (the account’s id, required), ‘visible` (a boolean indicating whether the account calendar is visible), and `auto_subscribe` (a boolean indicating whether users should see these events in their calendar without manually subscribing).
Returns the count of updated accounts.
Example Request:
GET /api/v1/accounts/:account_id/account_calendars
Scope: url:GET|/api/v1/accounts/:account_id/account_calendars
Returns a paginated list of account calendars for the provided account and its first level of sub-accounts. Includes hidden calendars in the response. Requires the ‘manage_account_calendar_visibility` permission.
Request Parameters:
search_term
string
When included, searches all descendent accounts of provided account for the term. Returns matching results. Term must be at least 2 characters. Can be combined with a filter value.
filter
string
When included, only returns calendars that are either visible or hidden. Can be combined with a search term.
Allowed values: visible, hidden
Example Request:
Returns a list of AccountCalendar objects.
GET /api/v1/accounts/:account_id/visible_calendars_count
Scope: url:GET|/api/v1/accounts/:account_id/visible_calendars_count
Returns the number of visible account calendars.
Example Request:
This documentation is generated directly from the Canvas LMS source code, available on Github.
A Conference object looks like:
GET /api/v1/courses/:course_id/conferences
Scope: url:GET|/api/v1/courses/:course_id/conferences
GET /api/v1/groups/:group_id/conferences
Scope: url:GET|/api/v1/groups/:group_id/conferences
Retrieve the paginated list of conferences for this context
This API returns a JSON object containing the list of conferences, the key for the list of conferences is “conferences”
Example Request:
Returns a list of Conference objects.
GET /api/v1/conferences
Scope: url:GET|/api/v1/conferences
Retrieve the paginated list of conferences for all courses and groups the current user belongs to
This API returns a JSON object containing the list of conferences. The key for the list of conferences is “conferences”.
Request Parameters:
state
string
If set to “live”, returns only conferences that are live (i.e., have started and not finished yet). If omitted, returns all conferences for this user’s groups and courses.
Example Request:
Returns a list of Conference objects.
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/courses/:course_id/blackout_dates
Scope: url:GET|/api/v1/courses/:course_id/blackout_dates
GET /api/v1/accounts/:account_id/blackout_dates
Scope: url:GET|/api/v1/accounts/:account_id/blackout_dates
Returns the list of blackout dates for the current context.
Returns a list of BlackoutDate objects.
GET /api/v1/courses/:course_id/blackout_dates/:id
Scope: url:GET|/api/v1/courses/:course_id/blackout_dates/:id
GET /api/v1/accounts/:account_id/blackout_dates/:id
Scope: url:GET|/api/v1/accounts/:account_id/blackout_dates/:id
Returns the blackout date with the given id.
Returns a BlackoutDate object.
GET /api/v1/courses/:course_id/blackout_dates/new
Scope: url:GET|/api/v1/courses/:course_id/blackout_dates/new
GET /api/v1/accounts/:account_id/blackout_dates/new
Scope: url:GET|/api/v1/accounts/:account_id/blackout_dates/new
Initialize an unsaved Blackout Date for the given context.
Returns a BlackoutDate object.
POST /api/v1/courses/:course_id/blackout_dates
Scope: url:POST|/api/v1/courses/:course_id/blackout_dates
POST /api/v1/accounts/:account_id/blackout_dates
Scope: url:POST|/api/v1/accounts/:account_id/blackout_dates
Create a blackout date for the given context.
Request Parameters:
start_date
Date
The start date of the blackout date.
end_date
Date
The end date of the blackout date.
event_title
string
The title of the blackout date.
Returns a BlackoutDate object.
PUT /api/v1/courses/:course_id/blackout_dates/:id
Scope: url:PUT|/api/v1/courses/:course_id/blackout_dates/:id
PUT /api/v1/accounts/:account_id/blackout_dates/:id
Scope: url:PUT|/api/v1/accounts/:account_id/blackout_dates/:id
Update a blackout date for the given context.
Request Parameters:
start_date
Date
The start date of the blackout date.
end_date
Date
The end date of the blackout date.
event_title
string
The title of the blackout date.
Returns a BlackoutDate object.
DELETE /api/v1/courses/:course_id/blackout_dates/:id
Scope: url:DELETE|/api/v1/courses/:course_id/blackout_dates/:id
DELETE /api/v1/accounts/:account_id/blackout_dates/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/blackout_dates/:id
Delete a blackout date for the given context.
Returns a BlackoutDate object.
PUT /api/v1/courses/:course_id/blackout_dates
Scope: url:PUT|/api/v1/courses/:course_id/blackout_dates
Create, update, and delete blackout dates to sync the db with the incoming data.
Request Parameters:
blackout_dates:
string
blackout_date, …
An object containing the array of BlackoutDates we want to exist after this operation. For array entries, if it has an id it will be updated, if not created, and if an existing BlackoutDate id is missing from the array, it will be deleted.
This documentation is generated directly from the Canvas LMS source code, available on Github.
GET /api/v1/users/:user_id/eportfolios
Scope: url:GET|/api/v1/users/:user_id/eportfolios
Get a list of all ePortfolios for the specified user.
Request Parameters:
include[]
string
deleted
Include deleted ePortfolios. Only available to admins who can
moderate_user_content.
Allowed values: deleted
Returns a list of ePortfolio objects.
GET /api/v1/eportfolios/:id
Scope: url:GET|/api/v1/eportfolios/:id
Get details for a single ePortfolio.
Returns an ePortfolio object.
DELETE /api/v1/eportfolios/:id
Scope: url:DELETE|/api/v1/eportfolios/:id
Mark an ePortfolio as deleted.
Returns an ePortfolio object.
GET /api/v1/eportfolios/:eportfolio_id/pages
Scope: url:GET|/api/v1/eportfolios/:eportfolio_id/pages
Get details for the pages of an ePortfolio
Returns a list of ePortfolioPage objects.
PUT /api/v1/eportfolios/:eportfolio_id/moderate
Scope: url:PUT|/api/v1/eportfolios/:eportfolio_id/moderate
Update the spam_status of an eportfolio. Only available to admins who can moderate_user_content.
Request Parameters:
spam_status
string
The spam status for the ePortfolio
Allowed values: marked_as_spam, marked_as_safe
Returns an ePortfolio object.
PUT /api/v1/users/:user_id/eportfolios
Scope: url:PUT|/api/v1/users/:user_id/eportfolios
Update the spam_status for all active eportfolios of a user. Only available to admins who can moderate_user_content.
Request Parameters:
spam_status
string
The spam status for all the ePortfolios
Allowed values: marked_as_spam, marked_as_safe
PUT /api/v1/eportfolios/:eportfolio_id/restore
Scope: url:PUT|/api/v1/eportfolios/:eportfolio_id/restore
Restore an ePortfolio back to active that was previously deleted. Only available to admins who can moderate_user_content.
Returns an ePortfolio object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
The event data for ConcludedEventData, UnconcludedEventData, PublishedEventData, UnpublishedEventData, DeletedEventData, RestoredEventData, ResetFromEventData, ResetToEventData, CopiedFromEventData, and CopiedToEventData objects will return a empty objects as these do not have any additional log data associated.
A CourseEventLink object looks like:
A CourseEvent object looks like:
A CreatedEventData object looks like:
An UpdatedEventData object looks like:
GET /api/v1/audit/course/courses/:course_id
Scope: url:GET|/api/v1/audit/course/courses/:course_id
List course change events for a given course.
Request Parameters:
start_time
DateTime
The beginning of the time range from which you want events.
end_time
DateTime
The end of the time range from which you want events.
Returns a list of CourseEvent objects.
GET /api/v1/audit/course/accounts/:account_id
Scope: url:GET|/api/v1/audit/course/accounts/:account_id
List course change events for a given account.
Request Parameters:
start_time
DateTime
The beginning of the time range from which you want events.
end_time
DateTime
The end of the time range from which you want events.
Returns a list of CourseEvent objects.
This documentation is generated directly from the Canvas LMS source code, available on Github.
(a) If sections were asked for and the topic is specific to certain
course sections sections, includes the number of users in each
section. (as part of the section json asked for above)
(b) Else, includes at the root level the total number of users in the
topic's context (group or course) that the topic applies to.{
// The unique identifier for the account role/user assignment.
"id": 1023,
// The account role assigned. This can be 'AccountAdmin' or a user-defined role
// created by the Roles API.
"role": "AccountAdmin",
// The user the role is assigned to. See the Users API for details.
"user": null,
// The status of the account role/user assignment.
"workflow_state": "deleted"
}{
// the unique identifier for the export
"id": 101,
// the date and time this export was requested
"created_at": "2014-01-01T00:00:00Z",
// the type of content migration: 'common_cartridge' or 'qti'
"export_type": "common_cartridge",
// attachment api object for the export package (not present before the export
// completes or after it becomes unavailable for download.)
"attachment": {"url":"https:\/\/example.com\/api\/v1\/attachments\/789?download_frd=1"},
// The api endpoint for polling the current progress
"progress_url": "https://example.com/api/v1/progress/4",
// The ID of the user who started the export
"user_id": 4,
// Current state of the content migration: created exporting exported failed
"workflow_state": "exported"
}{
// The unique identifier for the collaboration
"id": 43,
// A name for the type of collaboration
"collaboration_type": "Microsoft Office",
// The collaboration document identifier for the collaboration provider
"document_id": "oinwoenfe8w8ef_onweufe89fef",
// The canvas id of the user who created the collaboration
"user_id": 92,
// The canvas id of the course or group to which the collaboration belongs
"context_id": 77,
// The canvas type of the course or group to which the collaboration belongs
"context_type": "Course",
// The LTI launch url to view collaboration.
"url": null,
// The timestamp when the collaboration was created
"created_at": "2012-06-01T00:00:00-06:00",
// The timestamp when the collaboration was last modified
"updated_at": "2012-06-01T00:00:00-06:00",
"description": null,
"title": null,
// Another representation of the collaboration type
"type": "ExternalToolCollaboration",
// The LTI launch url to edit the collaboration
"update_url": null,
// The name of the user who owns the collaboration
"user_name": "John Danger"
}{
// The unique user or group identifier for the collaborator.
"id": 12345,
// The type of collaborator (e.g. 'user' or 'group').
"type": "user",
// The name of the collaborator.
"name": "Don Draper"
}curl https://<canvas>/api/v1/courses/1/collaborations/curl https://<canvas>/api/v1/courses/1/collaborations/1/members# Create error report
curl 'https://<canvas>/api/v1/error_reports' \
-X POST \
-F 'error[subject]="things are broken"' \
-F 'error[url]=http://<canvas>/courses/1' \
-F 'error[description]="All my thoughts on what I saw"' \
-H 'Authorization: Bearer <token>'{
// the ID of the account associated with this calendar
"id": 204,
// the name of the account associated with this calendar
"name": "Department of Chemistry",
// the account's parent ID, or null if this is the root account
"parent_account_id": 1,
// the ID of the root account, or null if this is the root account
"root_account_id": 1,
// whether this calendar is visible to users
"visible": true,
// whether users see this calendar's events without needing to manually add it
"auto_subscribe": false,
// number of this account's direct sub-accounts
"sub_account_count": 0,
// Asset string of the account
"asset_string": "account_4",
// Object type
"type": "account",
// url to get full detailed events
"calendar_event_url": "/accounts/2/calendar_events/%7B%7B%20id%20%7D%7D",
// whether the user can create calendar events
"can_create_calendar_events": true,
// API path to create events for the account
"create_calendar_event_url": "/accounts/2/calendar_events",
// url to open the more options event editor
"new_calendar_event_url": "/accounts/6/calendar_events/new"
}curl https://<canvas>/api/v1/account_calendars \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/account_calendars/204 \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/account_calendars/204 \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'visible=false' \
-d 'auto_subscribe=false'curl https://<canvas>/api/v1/accounts/1/account_calendars \
-X PUT \
-H 'Authorization: Bearer <token>' \
--data '[{"id": 1, "visible": true, "auto_subscribe": false}, {"id": 13, "visible": false, "auto_subscribe": true}]'curl https://<canvas>/api/v1/accounts/1/account_calendars \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/accounts/1/visible_calendars_count \
-H 'Authorization: Bearer <token>'{
"duration_minutes": 0,
"title": "course2: Test conference 3 [170]_0",
"updated_at": "2013-12-12T16:09:33.903-07:00",
"created_at": "2013-12-12T16:09:09.960-07:00",
"playback_url": "http://example.com/recording_url"
}{
// The id of the conference
"id": 170,
// The type of conference
"conference_type": "AdobeConnect",
// The 3rd party's ID for the conference
"conference_key": "abcdjoelisgreatxyz",
// The description for the conference
"description": "Conference Description",
// The expected duration the conference is supposed to last
"duration": 60,
// The date that the conference ended at, null if it hasn't ended
"ended_at": "2013-12-13T17:23:26Z",
// The date the conference started at, null if it hasn't started
"started_at": "2013-12-12T23:02:17Z",
// The title of the conference
"title": "Test conference",
// Array of user ids that are participants in the conference
"users": [1, 7, 8, 9, 10],
// Array of user ids that are invitees in the conference
"invitees": [1, 7, 8, 9, 10],
// Array of user ids that are attendees in the conference
"attendees": [1, 7, 8, 9, 10],
// True if the conference type has advanced settings.
"has_advanced_settings": false,
// If true the conference is long running and has no expected end time
"long_running": false,
// A collection of settings specific to the conference type
"user_settings": {"record":true},
// A List of recordings for the conference
"recordings": null,
// URL for the conference, may be null if the conference type doesn't set it
"url": null,
// URL to join the conference, may be null if the conference type doesn't set it
"join_url": null,
// The type of this conference's context, typically 'Course' or 'Group'.
"context_type": null,
// The ID of this conference's context.
"context_id": null
}curl 'https://<canvas>/api/v1/courses/<course_id>/conferences' \
-H "Authorization: Bearer <token>"
curl 'https://<canvas>/api/v1/groups/<group_id>/conferences' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/conferences' \
-H "Authorization: Bearer <token>"// Blackout dates are used to prevent scheduling assignments on a given date in
// course pacing.
{
// the ID of the blackout date
"id": 1,
// the context owning the blackout date
"context_id": 1,
"context_type": "Course",
// the start date of the blackout date
"start_date": "2022-01-01",
// the end date of the blackout date
"end_date": "2022-01-02",
// title of the blackout date
"event_title": "some title"
}{
// The database ID of the ePortfolio
"id": 1,
// The user ID to which the ePortfolio belongs
"user_id": 1,
// The name of the ePortfolio
"name": "My Academic Journey",
// Whether or not the ePortfolio is visible without authentication
"public": true,
// The creation timestamp for the ePortfolio
"created_at": "2021-09-20T18:59:37Z",
// The timestamp of the last time any of the ePortfolio attributes changed
"updated_at": "2021-09-20T18:59:37Z",
// The state of the ePortfolio. Either 'active' or 'deleted'
"workflow_state": "active",
// The timestamp when the ePortfolio was deleted, or else null
"deleted_at": "2021-09-20T18:59:37Z",
// A flag indicating whether the ePortfolio has been
// flagged or moderated as spam. One of 'flagged_as_possible_spam',
// 'marked_as_safe', 'marked_as_spam', or null
"spam_status": null
}{
// The database ID of the ePortfolio
"id": 1,
// The ePortfolio ID to which the entry belongs
"eportfolio_id": 1,
// The positional order of the entry in the list
"position": 1,
// The name of the ePortfolio
"name": "My Academic Journey",
// The user entered content of the entry
"content": "A long time ago...",
// The creation timestamp for the ePortfolio
"created_at": "2021-09-20T18:59:37Z",
// The timestamp of the last time any of the ePortfolio attributes changed
"updated_at": "2021-09-20T18:59:37Z"
}{
// ID of the course for the event.
"course": 12345,
// ID of the user for the event (who made the change).
"user": 12345,
// ID of the page view during the event if it exists.
"page_view": "e2b76430-27a5-0131-3ca1-48e0eb13f29b",
// ID of the course that this course was copied from. This is only included if
// the event_type is copied_from.
"copied_from": 12345,
// ID of the course that this course was copied to. This is only included if the
// event_type is copied_to.
"copied_to": 12345,
// ID of the SIS batch that triggered the event.
"sis_batch": 12345
}{
// ID of the event.
"id": "e2b76430-27a5-0131-3ca1-48e0eb13f29b",
// timestamp of the event
"created_at": "2012-07-19T15:00:00-06:00",
// Course event type The event type defines the type and schema of the
// event_data object.
"event_type": "updated",
// Course event data depending on the event type. This will return an object
// containing the relevant event data. An updated event type will return an
// UpdatedEventData object.
"event_data": "{}",
// Course event source depending on the event type. This will return a string
// containing the source of the event.
"event_source": "manual|sis|api",
// Jsonapi.org links
"links": {"course":"12345","user":"12345","page_view":"e2b76430-27a5-0131-3ca1-48e0eb13f29b"}
}// The created event data object returns all the fields that were set in the
// format of the following example. If a field does not exist it was not set.
// The value of each field changed is in the format of [:old_value, :new_value].
// The created event type also includes a created_source field to specify what
// triggered the creation of the course.
{
"name": [null, "Course 1"],
"start_at": [null, "2012-01-19T15:00:00-06:00"],
"conclude_at": [null, "2012-01-19T15:00:00-08:00"],
"is_public": [null, false],
// The type of action that triggered the creation of the course.
"created_source": "manual|sis|api"
}// The updated event data object returns all the fields that have changed in the
// format of the following example. If a field does not exist it was not
// changed. The value is an array that contains the before and after values for
// the change as in [:old_value, :new_value].
{
"name": ["Course 1", "Course 2"],
"start_at": ["2012-01-19T15:00:00-06:00", "2012-07-19T15:00:00-06:00"],
"conclude_at": ["2012-01-19T15:00:00-08:00", "2012-07-19T15:00:00-08:00"],
"is_public": [true, false]
}To create and update relationships on assets, see the section on Managing and Predicting Relationships.
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of facet names that you are requesting the options on.
A comma separated list of facet names for which you are requesting summary information.
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
facet_summary parameter does not impact overall system performance, such calls are throttled to 2 per second.facet_summary=<CSV list of facet attributes> - Return the summaries of the listed facets.
The facets that are available vary by endpoint and licensing. While some facets values offer additional properties, all of them have at least a guid and descr property. Note that Topic facets also offer information about their parents so a calling application can easily assemble the required tree without the added overhead of calls to the Topics endpoint.
By way of example, let's examine the facet capability of the Standards endpoint. This can be used as a convenient starting point for users browsing for Standards. It can also be used as a means for examining "categories" of Standards in your license. To get started, if you call the endpoint requesting all facet summaries without any filtering, the system will respond with the types of facets available and the number of elements in each facet. For convenience, we'll set the limit to 0 here so the system doesn't bother to respond with any actual Standards because at this point, we are only interested in the facets themselves which come back via the meta portion of the response.
The facet counts respect both your license limitations and the current filter. In this case, we are not specifying a filter, so the counts reflect our licensing.
If you wanted to build a user interface that offers the user control over each facet in filtering the Standards, you could request the elements for each facet and populate lists with the results. You may find that offering 10 facets is overwhelming for your users so you may want to select a few key facets. Perhaps we start by allowing the users to select an authority and subject. Let's retrieve the details of those two facets. The facet "names" are the values of the facet properties - in this case, document.publication.authorities and disciplines.subjects. Note that you can see in the response above that there are 17 subjects and 54 authorities in this license (although yours will vary). The example response below has been simplified to improve readability.
Once a user has selected an authority (Georgia DOE) and subject (Science), you may want to offer them a list of relevant strands. Note that there are 111 strands in this sample license. Let's limit the scope to Georgia DOE and Science and get the list of relevant strands to offer the user.
Now you see that there are only 7 relevant strands. One thing to note: the detail.count property is the number of Standards that match the associated criteria. For example, there are 28 Space Science related Standards in Georgia.
You can continue this approach to help the user narrow the Standards down to a manageable count and then present them to the user for selection.
Using faceting on Assets is similar to that of Standards with one major exception. Asset faceting can include custom attributes. E.g. if your Assets represent assessment items and you have an item_type field that may contain values like "Multiple Choice", "Essay", etc. you can request the facet summary by explicitly requesting facet_summary=custom_attributes.item_type and/or retrieve the details with facet=custom_attributes.item_type. The custom attributes may contain unique values (like a URL or external ID) and calculating the facets can impact performance.
Although this section focused on the Standards endpoint as an example, all endpoints except Clarifier support faceting.
The facet results appear in the meta section of the JSON API response.
Facet summaries that have high counts (counts in the thousands) may not be exact - they are approximate for performance reasons. If you need an exact count, you must request the facet. The count returned with the facet is accurate as are the counts returned with each facet value.
If you do not supply a facet_summary parameter, the system does not return any facet information.
If the facet or facet_summary arguments are combined with filter criteria, the results respect the filter requirements.
AB Connect does not support paging of facet data.
When requesting facets with a large number of values (count > 10,000) only the first 10,000 entries are returned. In general faceting on a large number of values has performance implications and should be avoided.
A quick way to retrieve facet information without cluttering the response with actual Standards data is to use the limit argument and set the limit to 0. For example:
https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0&facet_summary=* returns a minimal set of data including the facets and counts for your license. You can use this as a starting point if you are dynamically building a UI to allow users to select facet criteria.
The "guid" identifies the standard collection in machine readable format.
The "filters" object stores the filtering expression for the standard collection. This stores standard hierarchy and global filters which helps to filter to only the desired standards.
Here is a formal description about the filters object. For a practical explanation see the example below.
filters (object, required) - JSON API object for filters object containing various fields like: "filters (standard hierarchy)", "globalFilters"
filters (object) - Standard hierarchy
key (string) - Standard hierarchy element ID (guid or "root")
value (object) - Standard hierarchy element parameters
collections (array) - Array of GUIDs for the elements which are one level below in the hierarchy.
id (GUID) - GUID of the element in the hierarchy. (Same as the key.)
globalFilters (object) - Standard global filters: filtering by standard facets
key (string) - Standard facet description. (Eg: "document.publication.regions":)
value (object) - Standard facet parameters
Here is a filters object. Let's see how filter expression can be generated from it step-by-step:
The left side of the expression starts with filter[asset] =. There are two elements in the filters.facets array, so there will be two expressions on the right side. For example expressions expr_1 and expr_2. These are the basis of the filtering. The expr_1 is built up from filters.facets[0] and the expr_2 is built up from filters.facets[1].
Expressions are built up from a "field" and set of "values". The filter will give back those assets which have given the "values" on the given "field".
Let's find the "field" values. In the JSON object the "field" is defined by field.id.
Substitute these as "fields" into the filter expression.
Let's find the "values". The variables' names that are holding the "values" are defined by the facet.id. The "values" are those items in the selectedFilters object which have the object-path defined in the facet.id.
The variable for "values_1" is facet.id = "data.guid". Let's gather the values from selectedFilters.data.guid and generate the "values_1".
The variable for "values_2" is facet.id = "data.guid". Let's gather the values from selectedFilters.data.guid and generate the "values_2".
Finally substitute the "values" into the filter expression:
This example will filter only those assets which are in the grade: "Kindergarten" or "9th Grade" and are in the subject: "Mathematics".
To get the available facets for standards check the facet_summary at facets for details.
When there is a need to quickly identify and refer to a filtered collection of standards, the "Standard Collection" is what provides a solution. Standard Collection stores the filters object name and a guid as reference.
To list Standard Collections the partner has access to, send a GET to the endpoint.
To find a Standard Collection by exact name, send a GET to the endpoint with the collection_name parameter. This gives back only the case sensitive exact match if there is any.
To search Standard Collections by name, send a GET to the endpoint with the search_collection_name parameter. This search uses case insensitive partial matching.
To create a Standard Collection within the AB Connects system, you send a POST request to the endpoint. The body of the POST contains the Standard Collection definition in JSON format.
The response will be the same as a GET by GUID request for the created Standard Collection.
To get the Standard Collections you've created, call the endpoint with a GET while supplying the AB GUID for the Standard Collection. To retrieve the GUID, use the list and search functionality.
To update a Standard Collection, send a PATCH to the Standard Collection URL (with GUID) sending JSON in the body similar to that in the create statement. The JSON body only needs to contain the attributes that need to be updated. You can update the name or filters fields for the Standard Collection. You can update only one of these or all.
The response will contain the modified Standard Collection just as it would be in a GET by GUID request for the created Standard Collection.
To delete a Standard Collection you've created, send a DELETE the endpoint while supplying the AB GUID for the Standard Collection. If you have the name for the Standard Collection but not the AB GUID, see the section on searching for Standard Collections.
Successful operation
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
OK
Bad Request
Authentication Error
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
OK
Bad Request
Authentication Error
OK
Bad Request
Authentication Error
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
A comma separated list of facet names that you are requesting the options on.
A comma separated list of facet names for which you are requesting summary information.
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
OK
Bad Request
Authentication Error
By default, if the fields argument is not included in the request, AB Connect responds with the object ID and type. In order to request that AB Connect return additional properties in its response, use the fields URL parameter. The form is fields[<type>]=<CSV list of properties>.
To illustrate the usage, let's take a look at the properties of a Standard and how use of the fields parameter affects the system response. Let's begin with the default response.
`GET https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22"
},
"data": {
"type": "standards",
"id": "1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22"
},
"meta": {
"took": 66
}
}As you can see, the response does not include much useful information. Let's make the call again asking just for the main text of the Standard, its number and the AB standard_type.
`GET https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?fields[standards]=statement.descr,standard_type,number.enhanced`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?fields[standards]=statement.descr,standard_type,number.enhanced"
},
"data": {
"attributes": {
"number": {
"enhanced": "CCSS.Math.Content.HSN-VM.A.1"
},
"standard_type": "objective",
"statement": {
"descr": "Recognize vector quantities as having both magnitude and direction. Represent vector quantities by directed line segments, and use appropriate symbols for vectors and their magnitudes (e.g., ?, |?|, ||?||, ?)."
}
},
"type": "standards",
"id": "1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22"
},
"meta": {
"took": 156
}
}Conversely, if you really want it ALL, you can use an asterisk to indicate that you want the system to give you EVERYTHING! Note that this can have an impact on system performance so we strongly recommend you use the asterisk only for discovery when you are learning the API. To ensure the use of wildcards with the fields parameter does not impact overall system performance, such calls are throttled to 2 per second.
For brevity, we've removed some details in this example as the payload is quite large.
See the section on for insight into property names.
While the definition of a Standard or Topic can be helpful in adding value to your system, there is a lot of power in the relationships available in AB Connect. E.g. The Topics covered by a Standard are represented by a relationship between the Standard and one or more Topics. Assets are related to Standards when they are aligned. Standards are related to other Standards (like Peers).
AB Connect exposes these relationships via the data.relationships property. This section explains how to access the power of these relationships.
Some relationships in AB Connect have properties. E.g. Relationships between Assets and Standards have a disposition, prediction score, dates, etc. These properties are represented in the JSON as meta properties on the relationship. AB Connect allows you to address the relationship meta properties for use in either or . When referencing these properties, include meta. as part of the property path. E.g. fields[assets]=alignments.meta.date_created_utc
Resources can have many related objects - sometimes thousands. In order to maintain system performance, AB Connect limits the number of related objects that are returned when requesting a resource. Use paging on the relationship endpoint to retrieve more (or all) of the related objects.
Some relationships have limited cardinality. E.g. a Standard can have zero or one "parent". Other relationships are not limited but commonly have a small set of related entities. E.g. a Standard typically has a handful of Concepts, however in some extreme situations a Standard may have 50 Concepts. To optimize transmissions, AB Connect will return up to the first 25 related objects but if there are more than 25 related objects, AB Connect returns the first 10 relationships with paging URLs. Note that neither the page size (limit) nor the offset can be changed at this point - but can be changed on the relationship endpoint.
Here is an example of a response showing a Standard's related Peers and the paging URLs to retrieve more peer data. To get this data, you might make a call like:
To load the next page of Peers related to the Standard (00003506-B001-11DA-93BA-9A7258581090), follow the next URL:
https://api.abconnect.instructure.com/rest/v4.1/standards/00003506-B001-11DA-93BA-9A7258581090/peers?offset=10&fields[standards]=statement,number
The data available on the relationship endpoints is a conflation between the related object (attributes and relationships) and the relationship properties (meta).
Objects returned on the relationship endpoint do not support accessing their relationships nor including the further related data. For example, when viewing an Asset, you can see the alignments for that Asset, include related aligned Standards and page through the alignments at the relationship endpoint (assets/GUID/alignments). However, when you are viewing the properties of the aligned Standards on the alignment endpoint (assets/GUID/alignments), you can not include peers to those alignments nor can you page the peer standards. If you need to dig deeper into the aligned standards, you must request the data via the Standards endpoint.
See for details on working with the relationship endpoints.
The JSON API standard supports an include argument in the query string. The value of the include argument is a comma separated list of relationships on the specified endpoint. If the include statement appears in the query string, the resources returned in the relationships section and named in the statement are included in the response. This helps the caller avoid a second set of calls to retrieve the object details.
Note that it is important that you specify the relationship name in the include statement rather than the object type. For example, when retrieving Standards there are a number of relationships that are available: parent, ancestors, children, derivatives, origins, etc. Most of them are relationships to other Standards. If you asked the system to include "standards", it would not know which set you are actually requesting. You must explicitly request children (for example).
The generic form of the statement is:
For example:
Will return the details of the Standards related to the requested Topic.
If you include a relationship that does not appear in the request as a "relationship" by being included through the fields argument then the include block will be left out of the response.
E.g. https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?include=ancestors will NOT return the ancestors resources because that relationship is not delivered.
E.g. https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?fields[standards]=ancestors&include=ancestors
Sometimes it is convenient to filter the objects that are returned in the relationship. Meta properties on the relationship can always be used in filtering related objects. However, there are some scenarios where it is helpful to filter the related objects on key properties. E.g. one may only be interested in California Standards aligned to an Asset. To implement filtering related objects on all properties presents architectural challenges so to strike a balance and facilitate common use cases, AB Connect allows the caller to filter related object on specific properties on certain relationships.
When filtering on related objects, use the relationship name in the filter statement. E.g.
Will return math Assets and the alignments relationship for each Asset will only include Texas Standards aligned after March 12th 2020.
This section describes properties that can be be used when filtering objects related to the Asset.
When filtering aligned Standards, use the relationship name in the filter statement. E.g.
Supported properties include:
ancestors.id
concepts.context
concepts.descr
Notes:
deleted_alignments are filterable in a similar fashion as alignments.
You can use any of the "meta" properties on the relationship in the filtering - e.g. meta.score, meta.tags, etc. See the relationship definition for a complete list of meta properties.
Only data associated with accepted and predicted Topics are filterable. Filtering on Topics properties will not return any rejected Topics. The only supported property is the Topic description.
Note that the relationship and type of Topics is the same in this instance:
Only data associated with central and relevant Concepts are filterable. Filtering on Concept properties will not return any not_applicable or avoid Concepts. The only supported properties are the Concept description and context.
Note that the relationship and type of Concepts is the same in this instance:
When retrieving Concepts related to a Standard, you can filter the list on context and description.
One common need is to search across object relationships - for example, search for Assets based on properties of related Standards. Since this is a common need, AB Connect supports searching Assets based on key properties of related entities. E.g.
This will return Assets aligned to Standards in California. This can be combined with other properties on the Asset or related entities. E.g. to find Assets related to California Standards on a particular Topic
And combining that with Asset properties...
The text fields on the related entities are also indexed with the Asset full text search. This strengthens the Asset full text search in two ways.
When searching Assets for a key word or phrase, the engine will respond with Assets that are associated with that word or phrase through relationships and not just with the Asset properties.
Full text search results include the text of related entities when ranking results. E.g. If an Asset is related to multiple Concepts, Topics or Standards that contain the word "triangle" it will appear higher in the search results than an Asset that only mentions the word in a text field or has a few related entities that contain "triangle".
The following list shows related entity properties that can be included in an Asset search:
Standards
alignments.ancestors.id
alignments.concepts.context - this field is also included in full text searches once for each Standard that has this Concept in a Key Idea
Notes:
Assets can be filtered by deleted_alignments properties in a similar fashion as alignments, however, no deleted_alignments properties are included in an Asset's full text search.
The Academic Benchmarks Topics and Concepts are licensed separately. See the section on for a discussion on the licensing required for access to those taxonomies.
It is also possible to search on the properties of the relationship between Assets and entities with simple relationships to Assets (Standards, Topics, Concepts, etc.). In order to do that, address the relationship properties as if they were properties on the related entity itself. E.g. you can filter on accepted Standards with alignments.meta.disposition eq 'accepted'. To search for Assets that have accepted relationships with a specific standard, your filter statement will look like:
Note that you can use any of the "meta" properties on the relationship in the filtering - e.g. alignments.meta.score, alignments.meta.tags, etc. See the relationship definition for a complete list of meta properties.
Like Assets, Standards can also be filtered by some key properties on related entities. The following list shows related entity properties that can be included in a Standard search:
Concepts
concepts.context - this field is also included in full text searches
concepts.descr - this field is also included in full text searches
To search for resources by properties on related entities other than those listed above, use the search capability to locate the related entities of interest, build a list of related entities and then search the resource by the related entity IDs. For example, if you'd like to find Standards in Virginia that cover Exponents in the 8th grade, first search for the Topic. Topics are grade banded so you'll want to include the grade in your filter to ensure you are getting the correct Topic for the grade.
The result is Topic 06EA4018-32ED-11E0-8DE3-079AD51F4EFC. Then search the Standards for items in Virginia related to this Topic.
If the result of the first search resulted in multiple related Topics (say you also wanted to include Standards related to "Problem Solving"), you can include them all in the Standards filter using the "IN" clause. E.g.
Although we use Standards and their relationships to Topics in this example, the same approach can be taken for searching for any objects based on their relationship to other objects. E.g.
Locating Standards related to Concepts or other Standards
Locating Topics related to Standards or other Topics
Locating Assets related to other Assets or to properties of Standards, Topics or Concepts not listed above.
When searching across relationships and specifying the filter criteria, the filter property name is based on the relationship rather than the related object type. For example, standards is a resource type and the Standards endpoint has relationships with other Standards. However, those relationships are named parent, ancestors, origins, derivatives, children, peers, etc. If the filter referenced the type instead of the relationship name, the filter would read filter[standards]=(standards.id eq 'F97EA8C2-D9AE-11E2-8230-99ABD51F4EFC') and the system would have no way to know which relationship you were filtering on. Instead, if you were looking for Standards that were under a given Standard (i.e. Standards that had a certain Standard as an ancestor) the proper filter notation would be filter[standards]=(ancestors.id eq 'CB411CD4-D90D-11E2-8BD3-EF629DFF4B22')
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
GraphQL is a query API language that executes queries by using a type system based on defined input data. GraphQL provides more specific inquiries with faster results and populate multiple inputs into one query.
Note: GraphQL endpoint permissions mirror permissions for the REST API. A user is only granted access to view grades based on that user’s permissions. For instance, a student cannot view grades for another student, but an instructor can view grades for any student in a course.
.
Canvas has included the tool , an in-browser graphical interface for interacting with GraphQL endpoints.
The GraphiQL interface can be viewed by adding /graphiql to the end of your Canvas production URL (e.g. your-institution.instructure.com/graphiql).
The /graphiql access can also be added to a test or beta environment URL. Requests from the selected environment will always return that environment’s data.
The Explorer sidebar displays all available queries and mutations. Any selected items display in the GraphiQL window. Once a query or mutation is selected, any values displayed in purple text identify the value as an input argument.
The Canvas REST API will continue to be available.
Fields are being added to the GraphQL API on an as-needed basis. The GraphQL API does not include everything that is currently in the REST API. Feel free to submit pull requests on github to add additional features or talk about it in the #canvas-lms channel on libera.chat.
All GraphQL queries are posted to this endpoint.
Request Parameters
Example Request:
Example Response
id vs _id and the node fieldThe Canvas LMS GraphQL API follows the . Querying for an object's id will return a global identifier instead of the numeric ids that are used in the REST API. The traditional ids can be queried by requesting the _id field.
Most objects can be fetched by passing their GraphQL id to the node field:
A legacyNode field is also available to fetch objects via the REST-style ids:
For commonly accessed object types, type-specific fields are provided:
Canvas follows the for paginating collections. Request reasonable page sizes to avoid being limited.
Total Count in Connections
Some connection types support a totalCount field in pageInfo that provides the total number of items in the connection, regardless of pagination limits. This is useful for displaying "Page X of Y" pagination interfaces.
For details on which connections support totalCount and how to add it to new connections, see
Note: totalCount is only available on connections that have been explicitly configured for it. See app/graphql/types/HOWTO Connections.md for implementation details and performance considerations.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for creating, accessing and updating Content Sharing. Content shares are used to share content directly between users.
A ContentShare object looks like:
POST /api/v1/users/:user_id/content_shares
Scope: url:POST|/api/v1/users/:user_id/content_shares
Share content directly between two or more users
Request Parameters:
Example Request:
Returns a object.
GET /api/v1/users/:user_id/content_shares/sent
Scope: url:GET|/api/v1/users/:user_id/content_shares/sent
GET /api/v1/users/:user_id/content_shares/received
Scope: url:GET|/api/v1/users/:user_id/content_shares/received
Return a paginated list of content shares a user has sent or received. Use self as the user_id to retrieve your own content shares. Only linked observers and administrators may view other users’ content shares.
Example Request:
Returns a list of objects.
GET /api/v1/users/:user_id/content_shares/unread_count
Scope: url:GET|/api/v1/users/:user_id/content_shares/unread_count
Return the number of content shares a user has received that have not yet been read. Use self as the user_id to retrieve your own content shares. Only linked observers and administrators may view other users’ content shares.
Example Request:
GET /api/v1/users/:user_id/content_shares/:id
Scope: url:GET|/api/v1/users/:user_id/content_shares/:id
Return information about a single content share. You may use self as the user_id to retrieve your own content share.
Example Request:
Returns a object.
DELETE /api/v1/users/:user_id/content_shares/:id
Scope: url:DELETE|/api/v1/users/:user_id/content_shares/:id
Remove a content share from your list. Use self as the user_id. Note that this endpoint does not delete other users’ copies of the content share.
Example Request:
POST /api/v1/users/:user_id/content_shares/:id/add_users
Scope: url:POST|/api/v1/users/:user_id/content_shares/:id/add_users
Send a previously created content share to additional users
Request Parameters:
Example Request:
Returns a object.
PUT /api/v1/users/:user_id/content_shares/:id
Scope: url:PUT|/api/v1/users/:user_id/content_shares/:id
Mark a content share read or unread
Request Parameters:
Example Request:
Returns a object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for creating, accessing and updating AI Experiences. AI Experiences are used to create interactive AI-powered learning scenarios within courses.
An AiExperience object looks like:
GET /api/v1/courses/:course_id/ai_experiences
Scope: url:GET|/api/v1/courses/:course_id/ai_experiences
Retrieve the paginated list of AI experiences for a course
Request Parameters:
Returns a list of objects.
GET /api/v1/courses/:course_id/ai_experiences/:id
Scope: url:GET|/api/v1/courses/:course_id/ai_experiences/:id
Retrieve an AI experience by ID
Returns an object.
GET /api/v1/courses/:course_id/ai_experiences/new
Scope: url:GET|/api/v1/courses/:course_id/ai_experiences/new
Display the form for creating a new AI experience
GET /api/v1/courses/:course_id/ai_experiences/:id/edit
Scope: url:GET|/api/v1/courses/:course_id/ai_experiences/:id/edit
Display the form for editing an existing AI experience
POST /api/v1/courses/:course_id/ai_experiences
Scope: url:POST|/api/v1/courses/:course_id/ai_experiences
Create a new AI experience for the specified course
Request Parameters:
Returns an object.
PUT /api/v1/courses/:course_id/ai_experiences/:id
Scope: url:PUT|/api/v1/courses/:course_id/ai_experiences/:id
Update an existing AI experience
Request Parameters:
Returns an object.
DELETE /api/v1/courses/:course_id/ai_experiences/:id
Scope: url:DELETE|/api/v1/courses/:course_id/ai_experiences/:id
Delete an AI experience (soft delete - marks as deleted)
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
A Favorite object looks like:
GET /api/v1/users/self/favorites/courses
Scope: url:GET|/api/v1/users/self/favorites/courses
Retrieve the paginated list of favorite courses for the current user. If the user has not chosen any favorites, then a selection of currently enrolled courses will be returned.
See the for details on accepted include[] parameters.
Request Parameters:
Example Request:
Returns a list of objects.
GET /api/v1/users/self/favorites/groups
Scope: url:GET|/api/v1/users/self/favorites/groups
Retrieve the paginated list of favorite groups for the current user. If the user has not chosen any favorites, then a selection of groups that the user is a member of will be returned.
Example Request:
Returns a list of objects.
POST /api/v1/users/self/favorites/courses/:id
Scope: url:POST|/api/v1/users/self/favorites/courses/:id
Add a course to the current user’s favorites. If the course is already in the user’s favorites, nothing happens. Canvas for Elementary subject and homeroom courses can be added to favorites, but this has no effect in the UI.
Request Parameters:
Example Request:
Returns a object.
POST /api/v1/users/self/favorites/groups/:id
Scope: url:POST|/api/v1/users/self/favorites/groups/:id
Add a group to the current user’s favorites. If the group is already in the user’s favorites, nothing happens.
Request Parameters:
Example Request:
Returns a object.
DELETE /api/v1/users/self/favorites/courses/:id
Scope: url:DELETE|/api/v1/users/self/favorites/courses/:id
Remove a course from the current user’s favorites.
Request Parameters:
Example Request:
Returns a object.
DELETE /api/v1/users/self/favorites/groups/:id
Scope: url:DELETE|/api/v1/users/self/favorites/groups/:id
Remove a group from the current user’s favorites.
Request Parameters:
Example Request:
Returns a object.
DELETE /api/v1/users/self/favorites/courses
Scope: url:DELETE|/api/v1/users/self/favorites/courses
Reset the current user’s course favorites to the default automatically generated list of enrolled courses
Example Request:
DELETE /api/v1/users/self/favorites/groups
Scope: url:DELETE|/api/v1/users/self/favorites/groups
Reset the current user’s group favorites to the default automatically generated list of enrolled group
Example Request:
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Block Editor Templates are pre-build templates that can be used to create pages. The BlockEditorTemplate API allows you to create, retrieve, update, and delete templates.
A BlockEditorTemplate object looks like:
GET /api/v1/courses/:course_id/block_editor_templates
Scope: url:GET|/api/v1/courses/:course_id/block_editor_templates
A list of the block templates available to the current user.
Request Parameters:
Example Request:
Returns a list of objects.
This documentation is generated directly from the Canvas LMS source code, available .
When there is a need to quickly identify and refer to a filtered collection of assets, the "Asset Collection" is what provides a solution. Asset Collection stores the filters object with a name and a guid as reference.
The "filters" is a JSON object that stores "assetType" and "facets". Searching filters are generated from this object to narrow down the result set the client wants to use.
The "name" identifies the asset collection in human readable format.
"descriptors": [
{
"name": "Color",
"value": "blue"
}
], "custom_attributes": {
"color": ["blue"]
}, "descriptors": [
{
"name": "Color",
"value": "blue"
},
{
"name": "Color",
"value": "yellow"
}
], "custom_attributes": {
"color": ["blue","yellow"]
},filter[assets]=(alignments.id eq '6B29DCD6-29EB-11D8-9C6E-A97B3BAEC73A')
filter[assets]=(alignments.id in ('6B29DCD6-29EB-11D8-9C6E-A97B3BAEC73A','6DF95514-36D9-11E6-B844-14D399AB8BA3'))`GET https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0&facet_summary=*`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0&facet_summary=*"
},
"data": [],
"meta": {
"count": 378522,
"facets": [
{
"count": 14,
"facet": "education_levels.grades"
},
{
"facet": "education_levels.ece_ages",
"count": 8
},
{
"count": 54,
"facet": "document.publication.authorities"
},
{
"facet": "disciplines.strands",
"count": 111
},
{
"facet": "disciplines.subjects",
"count": 17
},
{
"count": 440,
"facet": "document"
},
{
"facet": "document.publication.regions",
"count": 54
},
{
"count": 5542,
"facet": "section"
},
{
"facet": "disciplines.ece_domains",
"count": 6
},
{
"facet": "document.publication",
"count": 163
}
],
"limit": 0,
"took": 336,
"offset": 0
}
}`GET https://api.abconnect.instructure.com/rest/v4.1/standards?facet=document.publication.authorities,disciplines.subjects&limit=0`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards?facet=document.publication.authorities,disciplines.subjects&limit=0"
},
"data": [],
"meta": {
"count": 378522,
"facets": [
{
"facet": "disciplines.subjects",
"details": [
{
"data": {
"descr": "Language Arts",
"guid": "F1FAC302-3B53-11E0-B042-495E9DFF4B22",
"code": "LANG"
},
"count": 120749
},
{
"count": 88449,
"data": {
"descr": "Science",
"guid": "F1FB3DD2-3B53-11E0-B042-495E9DFF4B22",
"code": "SCI"
}
},
{
"count": 85870,
"data": {
"code": "MATH",
"guid": "F1FB2F2C-3B53-11E0-B042-495E9DFF4B22",
"descr": "Mathematics"
}
},
{
"data": {
"code": "SOC",
"guid": "F1FB4B38-3B53-11E0-B042-495E9DFF4B22",
"descr": "Social Studies"
},
"count": 83445
},
{
"data": {
"code": "SCIT",
"descr": "Science and Technology",
"guid": "F1FC8A52-3B53-11E0-B042-495E9DFF4B22"
},
"count": 6638
},
...
],
"count": 17
},
{
"details": [
{
"data": {
"acronym": null,
"descr": "Virginia DOE",
"guid": "912F0480-F1B9-11E5-862E-0938DC287387"
},
"count": 20833
},
{
"data": {
"guid": "9129D578-F1B9-11E5-862E-0938DC287387",
"acronym": null,
"descr": "Maryland DOE"
},
"count": 17919
},
{
"data": {
"descr": "Pennsylvania DOE",
"acronym": null,
"guid": "912DF40A-F1B9-11E5-862E-0938DC287387"
},
"count": 15428
},
{
"data": {
"guid": "9127D390-F1B9-11E5-862E-0938DC287387",
"descr": "New York DOE",
"acronym": null
},
"count": 14565
},
{
"data": {
"acronym": null,
"descr": "Georgia DOE",
"guid": "91296E80-F1B9-11E5-862E-0938DC287387"
},
"count": 13192
},
...
],
"facet": "document.publication.authorities",
"count": 54
}
],
"limit": 0,
"took": 459,
"offset": 0
}
}`GET https://api.abconnect.instructure.com/rest/v4.1/standards?facet=disciplines.strands&filter[standards]=(document.publication.authorities.guid eq '91296E80-F1B9-11E5-862E-0938DC287387' and disciplines.subjects.code eq 'SCI')&limit=0`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards?facet=disciplines.strands&filter[standards]=(document.publication.authorities.guid%20eq%20%2791296E80-F1B9-11E5-862E-0938DC287387%27%20and%20disciplines.subjects.code%20eq%20%27SCI%27)&limit=0"
},
"data": [],
"meta": {
"took": 119,
"facets": [
{
"facet": "disciplines.strands",
"details": [
{
"count": 1416,
"data": {
"descr": "Nature of Science",
"guid": "81C5F6E2-046C-11E0-9AE1-661C9DFF4B22"
}
},
{
"data": {
"guid": "81C4A2BA-046C-11E0-9AE1-661C9DFF4B22",
"descr": "Life Science"
},
"count": 353
},
{
"data": {
"guid": "81C51DF8-046C-11E0-9AE1-661C9DFF4B22",
"descr": "Physical Science"
},
"count": 296
},
{
"data": {
"descr": "Scientific Inquiry",
"guid": "81C58A0E-046C-11E0-9AE1-661C9DFF4B22"
},
"count": 276
},
{
"data": {
"guid": "81C62CFC-046C-11E0-9AE1-661C9DFF4B22",
"descr": "Earth Science"
},
"count": 240
},
{
"data": {
"guid": "81C5544E-046C-11E0-9AE1-661C9DFF4B22",
"descr": "Environmental Science"
},
"count": 65
},
{
"count": 28,
"data": {
"descr": "Space Science",
"guid": "81C63AA8-046C-11E0-9AE1-661C9DFF4B22"
}
}
],
"count": 7
}
],
"limit": 0,
"count": 2690,
"offset": 0
}
} "filters": {
"assetType": "NLP_MHE",
"facets": [
{
"label": "Grade",
"id": "Grade",
"field": {
"name": "education_levels.grades",
"id": "education_levels.grades.guid"
},
"facet": {
"name": "data.descr",
"id": "data.guid"
},
"selectedFilters": [
{
"data": {
"descr": "Kindergarten",
"guid": "F1F9FA12-3B53-11E0-A421-F4B24952E9DF",
"code": "K",
"seq": 20
}
},
{
"data": {
"descr": "9th Grade",
"guid": "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22",
"code": "9",
"seq": 20,
}
},
],
},
{
"id": "Subject",
"label": "Subject",
"field": {
"name": "disciplines.subjects",
"id": "disciplines.subjects.ids"
},
"facet": {
"name": "data.descr",
"id": "data.guid"
},
"selectedFilters": [
{
"data": {
"descr": "Mathematics",
"guid": "495E9DFF-3B53-11E0-B042-C4B222F1FB2F",
"code": "MATH"
},
"count": 2488
}
]
}
]
} filter[asset] = expr_1 and expr_2 expr: field in (values)facets[0].field.id = "education_levels.grades.guid"`
facets[1].field.id = "disciplines.subjects.ids" filter[asset] = education_levels.grades.guid in (values_1) and disciplines.subjects.ids in (values_2) selectedFilters[0].data.guid = "F1F9FA12-3B53-11E0-A421-F4B24952E9DF"
selectedFilters[1].data.guid = "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22"
==>
values_1 = "F1F9FA12-3B53-11E0-A421-F4B24952E9DF", "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22" selectedFilters[0].data.guid = "495E9DFF-3B53-11E0-B042-C4B222F1FB2F"
==>
values_2 = "495E9DFF-3B53-11E0-B042-C4B222F1FB2F" filter[asset] = education_levels.grades in ("F1F9FA12-3B53-11E0-A421-F4B24952E9DF", "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22") and disciplines.subjects.ids in ("495E9DFF-3B53-11E0-B042-C4B222F1FB2F")GET /rest/v4.1/concepts/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/concepts?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/asset_definitions/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/asset_definitions?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/standards/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/standards?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/providers/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/providers?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/topics/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/topics?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
{
// The ID of the object the Favorite refers to
"context_id": 1170,
// The type of the object the Favorite refers to (currently, only 'Course' is
// supported)
"context_type": "Course"
}https://api.abconnect.instructure.com/rest/v4.1/standards?limit=0&filter[standards]=(document.publication.authorities.descr%20eq%20%27Kentucky%20DOE%27)&facet_summary=* returns the facets and counts for Kentucky DOE Standards.ancestorsincludeddisciplines.subjects.descrdisciplines.subjects.guid
document.descr
document.guid
document.publication.descr
document.publication.guid
document.publication.authorities.descr
document.publication.authorities.guid
document.publication.regions.descr
document.publication.regions.guid
education_levels.grades.descr
education_levels.grades.guid
number.raw
number.enhanced
number.prefix_enhanced
section.guid
section.descr
status
statement.descr
topics.descr
alignments.concepts.descr - this field is also included in full text searches once for each Standard that has this Concept in a Key Ideaalignments.document.disciplines.subjects.descr
alignments.document.disciplines.subjects.guid
alignments.document.descr - this field is also included in full text searches
alignments.document.guid
alignments.document.publication.descr - this field is also included in full text searches
alignments.document.publication.guid
alignments.document.publication.authorities.descr
alignments.document.publication.authorities.guid
alignments.document.publication.regions.descr
alignments.document.publication.regions.guid
alignments.education_levels.grades.descr
alignments.education_levels.grades.guid
alignments.number.raw
alignments.number.enhanced
alignments.number.prefix_enhanced
alignments.section.guid
alignments.section.descr - this field is also included in full text searches
alignments.status
alignments.statement.descr - this field is also included in full text searches
alignments.topics.descr - this field is also included in full text searches once for each Standard that covers this Topic
Topics - Only data associated with accepted and predicted Topics are searchable on the Asset
topics.descr - this field is also included in full text searches
Concepts - Only data associated with central and relevant Concepts are searchable on the Asset
concepts.context - this field is also included in full text searches
concepts.descr - this field is also included in full text searches
query
string
the GraphQL query to execute
variables
Hash
variable values as required by the supplied query
receiver_ids
Required Array
IDs of users to share the content with.
content_type
Required string
Type of content you are sharing.
Allowed values: assignment, discussion_topic, page, quiz, module, module_item
content_id
Required integer
The id of the content that you are sharing
receiver_ids
Array
IDs of users to share the content with.
read_state
string
Read state for the content share
Allowed values: read, unread
pedagogical_guidance
Required string
The pedagogical guidance for the experience.
workflow_state
string
The initial state of the experience. Defaults to ‘unpublished’. Allowed values: published, unpublished
pedagogical_guidance
Required string
The pedagogical guidance for the experience.
workflow_state
string
The state of the experience. Allowed values: published, unpublished
workflow_state
string
Only return experiences with the specified workflow state. Allowed values: published, unpublished, deleted
title
Required string
The title of the AI experience.
description
string
The description of the AI experience.
facts
string
The AI facts for the experience.
learning_objective
Required string
The learning objectives for this experience.
title
string
The title of the AI experience.
description
string
The description of the AI experience.
facts
string
The AI facts for the experience.
learning_objective
Required string
The learning objectives for this experience.
exclude_blueprint_courses
boolean
When set, only return courses that are not configured as blueprint courses.
id
Required string
The ID or SIS ID of the course to add. The current user must be registered in the course.
id
Required string
The ID or SIS ID of the group to add. The current user must be a member of the group.
id
Required string
the ID or SIS ID of the course to remove
id
Required string
the ID or SIS ID of the group to remove
include[]
string
no description
Allowed values: node_tree, thumbnail
sort
string
Sort results by this field.
Allowed values: name, created_at, updated_at
order
string
The sorting order. Defaults to ‘asc’.
Allowed values: asc, desc
drafts
boolean
If true, include draft templates. If false or omitted only published templates will be returned.
type[]
string
What type of templates should be returned.
Allowed values: page, section, block
There are three steps to uploading a file directly via POST:
Notify Canvas that you are uploading a file with a POST to the file creation endpoint. This POST will include the file name and file size, along with information about what context the file is being created in.
Upload the file using the information returned in the first POST request.
On successful upload, the API will respond with a redirect. This redirect needs to be followed to complete the upload, or the file may not appear.
The first step is to POST to the relevant API endpoint, depending on where you want to create the file. For example, to add a file to a course, you'd POST to /api/v1/courses/:course_id/files. Or to upload a file as part of a student homework submission, as the student you'd POST to /api/v1/courses/:course_id/assignments/:assignment_id/submissions/self/files or /api/v1/courses/:course_id/assignments/:assignment_id/submissions/comments/self/files for submission comments.
Note* The endpoint you choose to post files to will change the permissions set on the file. i.e. only files posted to the submissions comments endpoint can be attached to a submissions comment.
Arguments:
name
The filename of the file. Any UTF-8 name is allowed. Path components such as `/` and `\` will be treated as part of the filename, not a path to a sub-folder.
size
The size of the file, in bytes. This field is recommended, as it will let you find out if there's a quota issue before uploading the raw file.
content_type
The content type of the file. If not given, it will be guessed based on the file extension.
parent_folder_id
The id of the folder to store the file in. An error will be returned if this does not correspond to an existing folder. If this and parent_folder_path are sent an error will be returned. If neither is given, a default folder will be used.
parent_folder_path
The path of the folder to store the file in. The path separator is the forward slash `/`, never a back slash. The folder will be created if it does not already exist. This parameter only applies to file uploads in a context that has folders, such as a user, a course, or a group. If this and parent_folder_id are sent an error will be returned. If neither is given, a default folder will be used.
folder
[deprecated] Use parent_folder_path instead.
on_duplicate
How to handle duplicate filenames. If `overwrite`, then this file upload will overwrite any other file in the folder with the same name. If `rename`, then this file will be renamed if another file in the folder exists with the given name. If no parameter is given, the default is `overwrite`. This doesn't apply to file uploads in a context that doesn't have folders.
success_include[]
An array of additional information to include in the upload success response. See Files API for more information.
Example Request:
Example Response:
At this point, the file object has been created in Canvas in a "pending" state, with no content. It will not appear in any listings in the UI until the next two steps are completed. The returned Signature is valid for 30 minutes.
Using the data in the JSON response from Step 1, the application can now upload the actual file data, by POSTing a specially formulated request to the URL given in the upload_url field of the response.
Depending on how Canvas is configured, this upload URL might be another URL in the same domain, or a Amazon S3 bucket, or some other URL. In order to work with all Canvas installations, applications should be very careful to follow this documentation and not make any undocumented assumptions about the upload workflow.
This second request must be POSTed as a multipart/form-data request to accomodate the file data. The parameters POSTed with this request come directly from the upload_params part of the JSON response in Step 1.
The only addition is the file parameter which must be posted as the last parameter following all the others.
Example Request:
The access token is not sent with this request.
Example Response:
IMPORTANT: The request is signed, and will be denied if any parameters from the upload_params response are added, removed or modified. The parameters in upload_params may vary over time, and between Canvas installs. It's important for the application to copy over all of the parameters, and not rely on the names or values of the params for any functionality.
This example assumes there is a file called my_local_file.jpg in the current directory.
If Step 2 is successful, the response will be either a 3XX redirect or 201 Created with a Location header set as normal.
In the case of a 3XX redirect, the application needs to perform a GET to this location in order to complete the upload, otherwise the new file may not be marked as available. (Note: While a POST would be truer to REST semantics, a GET is required for forwards compatibility with the 201 Created response described below.) This request is back against Canvas again, and needs to be authenticated using the normal API access token authentication.
In the case of a 201 Created, the upload has been complete and the Canvas JSON representation of the file can be retrieved with a GET from the provided Location.
Example Request:
Example Response:
Instead of uploading a file directly, you can also provide Canvas a public HTTP or HTTPS URL from which to retrieve the file.
The first step is the same as with the "Uploading via POST" flow above, with the addition of a few new parameters:
url
The full URL to the file to be uploaded. This URL must be publicly accessible.
submit_assignment
A boolean to indicate whether or not to automatically submit the assignment the file is associated with if it is associated with an assignment. Defaults to true.
Example Request:
Example Response:
Canvas' file management is in a moment of transition. For the duration of this transition, there are two possible behaviors. The newer behavior includes additional fields in the response to the first request and expects an additional action from the application.
In the deprecated behavior, Canvas will initiate a "cloning" of the provided URL by downloading it via Canvas servers. The initial POST was sufficient to start this and no other action is necessary from the application.
In the newer behavior, Canvas delegates the cloning of the URL to the same service that accepts direct uploads. The cloning is kicked off by a POST by the application to the provided upload_url with the provided upload_params, in parallel with a direct upload. The service then informs Canvas directly when it is complete.
In either case, the cloning of the URL will be performed in the background, and the file will not necessarily be immediately available when the API calls complete. Instead, a progress object is provided which can be periodically polled to check the status of the upload.
You can distinguish the new behavior (and expected follow up) from the old behavior precisely by the presence or absence of the upload_url key.
If the response to the initial POST includes an upload_url, you must POST to it with the upload_params just as if you were performing a direct upload. The only exception is that the file parameter is omitted. The Content-Type is still expected to be multipart/form-data.
Example Request:
Example Response:
This step is not necessary with the old behavior.
If the application needs to know the outcome of the upload, it can use the {api:ProgressController#Show Progress endpoint} to query the status. On success, the created attachment's id will be returned in the results of the Progress object as id.
This documentation is generated directly from the Canvas LMS source code, available on Github.
{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"attributes": {
"descr": "text",
"disciplines": {
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"guid": "text",
"context": "text"
},
"id": "text",
"type": "text"
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1,
"facets": [
{
"count": 1,
"facet": "text",
"details": [
{
"data": {
"descr": "text",
"code": "text",
"guid": "text"
},
"count": 1
}
]
}
]
},
"data": [
{
"attributes": {
"descr": "text",
"disciplines": {
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"guid": "text",
"context": "text"
},
"id": "text",
"type": "text"
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"id": "text",
"type": "asset_definitions",
"attributes": {
"type": "text",
"asset_type": "text",
"properties": [
{
"filterable": "text",
"seq": 1,
"label": "text",
"field": {
"id": "text",
"name": "text"
},
"facet": {
"id": "text",
"name": "text"
}
}
],
"guid": "text"
}
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"id": "text",
"type": "asset_definitions",
"attributes": {
"type": "text",
"asset_type": "text",
"properties": [
{
"filterable": "text",
"seq": 1,
"label": "text",
"field": {
"id": "text",
"name": "text"
},
"facet": {
"id": "text",
"name": "text"
}
}
],
"guid": "text"
}
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
},
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1,
"facets": [
{
"count": 1,
"facet": "text",
"details": [
{
"data": {
"descr": "text",
"code": "text",
"guid": "text"
},
"count": 1
}
]
}
]
},
"data": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
],
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"type": "providers",
"id": "text",
"attributes": {
"guid": "text",
"descr": "text",
"taxonomies": [
"concepts"
]
},
"relationships": {
"owners": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"consumers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
}
},
"included": [
{
"type": "providers",
"id": "text",
"attributes": {
"guid": "text",
"descr": "text",
"taxonomies": [
"concepts"
]
},
"relationships": {
"owners": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"consumers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
}
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "providers",
"id": "text",
"attributes": {
"guid": "text",
"descr": "text",
"taxonomies": [
"concepts"
]
},
"relationships": {
"owners": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"consumers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
}
}
],
"included": [
{
"type": "providers",
"id": "text",
"attributes": {
"guid": "text",
"descr": "text",
"taxonomies": [
"concepts"
]
},
"relationships": {
"owners": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"consumers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
}
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"type": "text",
"id": "text",
"relationships": {
"parent": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"data": {
"id": "text",
"type": "text"
}
}
],
"links": {
"related": "text"
}
},
"standards": {
"links": {
"last": "text",
"related": "text",
"next": "text"
},
"data": [
{
"id": "text",
"type": "text"
}
]
}
},
"attributes": {
"date_modified_utc": "text",
"disciplines": {
"subjects": [
{
"descr": "text",
"code": "text",
"guid": "text"
}
]
},
"status": "active",
"guid": "text",
"document": {
"date_modified_utc": "text",
"guid": "text",
"revision_year": "text",
"adopt_year": "text",
"descr": "text"
},
"seq": 1,
"level": 1,
"section": {
"descr": "text",
"date_modified_utc": "text",
"seq": 1,
"guid": "text"
},
"uri": "text",
"descr": "text",
"education_levels": {
"grades": [
{
"descr": "text",
"guid": "text",
"code": "text",
"seq": 1
}
]
}
}
},
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1,
"facets": [
{
"count": 1,
"facet": "text",
"details": [
{
"data": {
"descr": "text",
"code": "text",
"guid": "text"
},
"count": 1
}
]
}
]
},
"data": [
{
"type": "text",
"id": "text",
"relationships": {
"parent": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"data": {
"id": "text",
"type": "text"
}
}
],
"links": {
"related": "text"
}
},
"standards": {
"links": {
"last": "text",
"related": "text",
"next": "text"
},
"data": [
{
"id": "text",
"type": "text"
}
]
}
},
"attributes": {
"date_modified_utc": "text",
"disciplines": {
"subjects": [
{
"descr": "text",
"code": "text",
"guid": "text"
}
]
},
"status": "active",
"guid": "text",
"document": {
"date_modified_utc": "text",
"guid": "text",
"revision_year": "text",
"adopt_year": "text",
"descr": "text"
},
"seq": 1,
"level": 1,
"section": {
"descr": "text",
"date_modified_utc": "text",
"seq": 1,
"guid": "text"
},
"uri": "text",
"descr": "text",
"education_levels": {
"grades": [
{
"descr": "text",
"guid": "text",
"code": "text",
"seq": 1
}
]
}
}
}
],
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1,
"facets": [
{
"count": 1,
"facet": "text",
"details": [
{
"data": {
"descr": "text",
"code": "text",
"guid": "text"
},
"count": 1
}
]
}
]
},
"data": [
{
"attributes": {
"document_guid": "text",
"guid": "text",
"date_utc": "text",
"affected_properties": [
{
"name": "text",
"previous_value": "text",
"new_value": "text"
}
],
"section_guid": "text",
"seq": 1,
"target": "standard",
"change_type": "text"
},
"type": "text",
"id": "text",
"relationships": {
"standard": {
"data": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"deleted_standard": {
"data": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"nondeliverable_standard": {
"data": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
}
}
}
],
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}GET /rest/v4.1/events?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
`GET https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?fields[standards]=*`
{
"links": {
"self": "https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22?fields[standards]=%2A"
},
"data": {
"type": "standards",
"id": "1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22",
"attributes": {
"statement": {
"addendums": [],
"combined_descr": "Recognize vector quantities as having both magnitude and direction. Represent vector quantities by directed line segments, and use appropriate symbols for vectors and their magnitudes (e.g., 𝙫, |𝙫|, ||𝙫||, 𝘷).",
"descr": "Recognize vector quantities as having both magnitude and direction. Represent vector quantities by directed line segments, and use appropriate symbols for vectors and their magnitudes (e.g., 𝙫, |𝙫|, ||𝙫||, 𝘷)."
},
"label": "Standard",
"education_levels": {
"grades": [
{
"code": "9",
"descr": "9th Grade",
"guid": "F1FA7154-3B53-11E0-B042-495E9DFF4B22",
"seq": 110
},
{
"seq": 120,
"guid": "F1FA7E92-3B53-11E0-B042-495E9DFF4B22",
"descr": "10th Grade",
"code": "10"
},
{
"code": "11",
"guid": "F1FA8BD0-3B53-11E0-B042-495E9DFF4B22",
"descr": "11th Grade",
"seq": 130
},
{
"guid": "F1FA9904-3B53-11E0-B042-495E9DFF4B22",
"descr": "12th Grade",
"seq": 140,
"code": "12"
}
],
"ece_ages": []
},
"number": {
"raw": "1.",
"prefix_enhanced": "CCSS.Math.Content.HSN-VM.A.1",
"enhanced": "CCSS.Math.Content.HSN-VM.A.1"
},
"utilizations": [
{
"guid": "3A6BCD99-F093-4782-9708-5E65F2DEC3F2",
"type": "alignable"
}
],
"in_list": "N",
"status": "active",
"captured_by": "AB",
"deepest" : "Y",
"disciplines": {
"subjects": [
{
"guid": "F1FB2F2C-3B53-11E0-B042-495E9DFF4B22",
"descr": "Mathematics",
"code": "MATH"
}
],
"_content_connections": [],
"strands": [
{
"guid": "81C28CFA-046C-11E0-9AE1-661C9DFF4B22",
"descr": "Patterns, Functions, and Algebra"
}
],
"genres": [],
"ece_domains": []
},
"key_ideas": [
{
"concepts": [
{
"guid": "0AADCE68-3BA2-11E1-A29D-011A9DFF4B22",
"descr": "Vectors"
},
{
"descr": "Mathematical Notation",
"guid": "0CB810D8-3BA2-11E1-A29D-011A9DFF4B22"
}
],
"guid": "75757524-D232-11DE-8EF1-B44B9DFF4B22"
},
{
"guid": "982B3456-D236-11DE-B34E-394D9DFF4B22",
"concepts": [
{
"descr": "Vectors",
"guid": "0AADCE68-3BA2-11E1-A29D-011A9DFF4B22"
},
{
"guid": "0BE351EA-3BA2-11E1-A29D-011A9DFF4B22",
"descr": "Vector Direction"
}
]
},
{
"concepts": [
{
"descr": "Vectors",
"guid": "0AADCE68-3BA2-11E1-A29D-011A9DFF4B22"
},
{
"guid": "0BE36E64-3BA2-11E1-A29D-011A9DFF4B22",
"descr": "Vector Magnitude"
}
],
"guid": "982B4BE4-D236-11DE-B34E-394D9DFF4B22"
}
],
"document": {
"assessment_year": null,
"disciplines": {
"primary_subject": {
"code": "MATH",
"guid": "F1FB2F2C-3B53-11E0-B042-495E9DFF4B22",
"descr": "Mathematics"
}
},
"adopt_year": "2010",
"source_url": "http://www.corestandards.org/Math/",
"revision_year": "2010",
"guid": "6C2635F0-6EC0-11DF-AB2D-366B9DFF4B22",
"date_modified_utc": "2018-02-13 16:26:49",
"descr": "Mathematics",
"obsolete_year": null,
"implementation_year": null,
"publication": {
"guid": "964E0FEE-AD71-11DE-9BF2-C9169DFF4B22",
"regions": [
{
"code": "US",
"guid": "91273AE8-F1B9-11E5-862E-0938DC287387",
"descr": "United States of America",
"type": "country"
},
{
"type": "other",
"guid": "A83297F2-901A-11DF-A622-0C319DFF4B22",
"descr": "CCSS",
"code": "CC"
}
],
"descr": "Common Core State Standards",
"authorities": [
{
"acronym": "CC",
"descr": "NGA Center/CCSSO",
"guid": "A83297F2-901A-11DF-A622-0C319DFF4B22"
}
],
"acronym": null,
"source_url": "http://www.corestandards.org/the-standards"
}
},
"topic_organizer": null,
"has_list": "N",
"date_deleted_utc": null,
"section": {
"_id": 21003,
"date_modified_utc": "2018-02-13 16:26:49",
"guid": "25EC8E56-7053-11DF-8EBF-BE719DFF4B22",
"descr": "High School - Number and Quantity",
"obsolete_year": null,
"seq": 2410,
"assessment_year": null,
"disciplines": {
"primary_subject": {
"code": "MATH",
"descr": "Mathematics",
"guid": "F1FB2F2C-3B53-11E0-B042-495E9DFF4B22"
}
},
"adopt_year": "2010",
"implementation_year": null,
"label": "Conceptual Category",
"number": null
},
"alt_identifiers": [
{
"type": "GUID",
"id": "05BAE0DE74104B1AADC31E85AA1A6128",
"source": "canonical"
},
{
"source": "canonical",
"id": "http://corestandards.org/Math/Content/HSN-VM/A/1",
"type": "URI"
}
],
"level": 3,
"date_modified_utc": "2014-06-19 16:36:44",
"guid": "1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22",
"seq": 30,
"extensions": [],
"uri": "https://api.abconnect.instructure.com/rest/v4.1/standards/1F9D5A8A-7053-11DF-8EBF-BE719DFF4B22",
"legends": [
{
"symbol_position": "before",
"descr": "Additional mathematics that students should learn in order to take advanced courses",
"symbol": "+"
}
],
"standard_type": "objective"
},
"relationships": {
"concepts": {
"data": [...]
},
"derivatives": {
"data": [...]
},
"peers": {
"data": [...]
},
"contexts": {
"data": [
{
"type": "standards",
"id": "1F9A411A-7053-11DF-8EBF-BE719DFF4B22"
}
]
},
"topics": {
"data": [
{
"type": "topics",
"id": "9E783750-4445-11E0-9271-67D4D51F4EFC"
}
]
},
"origins": {
"data": []
},
"parent": {
"data": {
"id": "1F9BE786-7053-11DF-8EBF-BE719DFF4B22",
"type": "standards"
}
},
"ancestors": {
"data": [
{
"type": "standards",
"id": "1F9A411A-7053-11DF-8EBF-BE719DFF4B22"
},
{
"id": "1F9BE786-7053-11DF-8EBF-BE719DFF4B22",
"type": "standards"
}
]
},
"peer_derivatives": {
"data": []
},
"children": {
"data": []
}
}
},
"meta": {
"took": 152
}
}`https://api.abconnect.instructure.com/rest/v4.1/standards?fields[standards]=peers,statement,number&filter[standards]=not isempty(peers) and utilizations.type eq alignable&include=peers` ...
{
"id": "00003506-B001-11DA-93BA-9A7258581090",
"type": "standards",
"relationships": {
"peers": {
"data": [
{
"type": "standards",
"id": "665CDF54-29E7-11D8-9805-987DA0705AD0"
},
{
"id": "BA13F3EA-29EB-11D8-9212-963E918BB192",
"type": "standards"
},
...
{
"type": "standards",
"id": "6573F63E-D88E-11D9-8407-9AE6FB2C8371"
}
],
"links": {
"related": "https://api.abconnect.instructure.com/rest/v4.1/standards/00003506-B001-11DA-93BA-9A7258581090/peers",
"next": "https://api.abconnect.instructure.com/rest/v4.1/standards/00003506-B001-11DA-93BA-9A7258581090/peers?offset=10",
"last": "https://api.abconnect.instructure.com/rest/v4.1/standards/00003506-B001-11DA-93BA-9A7258581090/peers?offset=80"
}
}
}
},
...`<endpoint URI>?include=<CSV list of relationships>``https://api.abconnect.instructure.com/rest/v4.1/topics/2CED2B98-4FD7-11E0-964D-6C069DFF4B22?fields[topics]=standards&include=standards`https://api.abconnect.instructure.com/rest/v4.1/assets?filter[assets]=disciplines.subjects.code eq 'MATH'&filter[alignments]=document.publication.authorities.guid eq '912830F6-F1B9-11E5-862E-0938DC287387' AND meta.date_created_utc gt '2020-03-12'...&filter[alignments]=document.publication.authorities.guid eq '912830F6-F1B9-11E5-862E-0938DC287387'&......&filter[topics]=query(descr,'square')&......&filter[concepts]=query(descr,'square') AND query(context,'exponents')&......&filter[concepts]=query(descr,'square') AND query(context,'exponents')&...`filter[assets]=(alignments.document.publication.authorities.descr eq 'California DOE')``filter[assets]=(alignments.document.publication.authorities.descr eq 'California DOE' and alignments.topics.descr eq 'Exponents and Roots')``filter[assets]=(alignments.document.publication.authorities.descr eq 'California DOE' and alignments.topics.descr eq 'Exponents and Roots' and education_levels.grades.code eq '8')``filter[assets]=(alignments.id eq '0029A5C3-3C0C-4127-9766-C44E5E255C26' and alignments.meta.disposition eq 'accepted')``filter[topics]=(query(descr, 'exponents') and education_levels.grades.code eq '8')``filter[standards]=(document.publication.authorities.descr eq 'Virginia DOE' and education_levels.grades.code eq '8' and topics.id eq '06EA4018-32ED-11E0-8DE3-079AD51F4EFC')``filter[standards]=(document.publication.authorities.descr eq 'Virginia DOE' and education_levels.grades.code eq '8' and topics.id in ('06EA4018-32ED-11E0-8DE3-079AD51F4EFC','067C7C8E-EBE5-11E5-AE48-F5189AAB8BA3'))`curl https://<canvas>/api/graphql \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-d query='query courseInfo($courseId: ID!) {
course(id: $courseId) {
id
_id
name
}
}' \
-d variables[courseId]=1{
"data": {
"course": {
"id": "Q291cnNlLTE=",
"_id": "1",
"name": "Mr. Ratburn's Class"
}
}
}{
node(id: "Q291cnNlLTE=") {
... on Course {
_id # traditional ids (e.g. "1")
name
term { name }
}
}
}{
# object type must be specified when using legacyNode
legacyNode(type: Course, _id: "1") {
... on Course {
_id
name
}
}
}{
# NOTE: id arguments will always take either GraphQL or rest-style ids
c1: course(id: "1") {
_id
name
}
c2: course(id: "Q291cnNlLTE=") {
_id
name
}
}{
course(id: "1") {
assignmentsConnection(
first: 10, # page size
after: "XYZ" # `endCursor` from previous page
) {
nodes {
id
name
}
pageInfo {
endCursor # this is your `after` value for the next request
hasNextPage
}
}
}
}{
assignment(id: "1") {
submissionsConnection(first: 10) {
nodes {
id
state
}
pageInfo {
hasNextPage
totalCount # total number of submissions (ignoring pagination)
}
}
}
}// Content shared between users
{
// The id of the content share for the current user
"id": 1,
// The name of the shared content
"name": "War of 1812 homework",
// The type of content that was shared. Can be assignment, discussion_topic,
// page, quiz, module, or module_item.
"content_type": "assignment",
// The datetime the content was shared with this user.
"created_at": "2017-05-09T10:12:00Z",
// The datetime the content was updated.
"updated_at": "2017-05-09T10:12:00Z",
// The id of the user who sent or received the content share.
"user_id": 1578941,
// The user who shared the content. This field is provided only to receivers; it
// is not populated in the sender's list of sent content shares.
"sender": {"id":1,"display_name":"Matilda Vargas","avatar_image_url":"http:\/\/localhost:3000\/image_url","html_url":"http:\/\/localhost:3000\/users\/1"},
// An Array of users the content is shared with. This field is provided only to
// senders; an empty array will be returned for the receiving users.
"receivers": [{"id":1,"display_name":"Jon Snow","avatar_image_url":"http:\/\/localhost:3000\/image_url2","html_url":"http:\/\/localhost:3000\/users\/2"}],
// The course the content was originally shared from.
"source_course": {"id":787,"name":"History 105"},
// Whether the recipient has viewed the content share.
"read_state": "read",
// The content export record associated with this content share
"content_export": {"id":42}
}curl 'https://<canvas>/api/v1/users/self/content_shares \
-d 'content_type=assignment' \
-d 'content_id=1' \
-H 'Authorization: Bearer <token>' \
-X POSTcurl 'https://<canvas>/api/v1/users/self/content_shares/received'curl 'https://<canvas>/api/v1/users/self/content_shares/unread_count'curl 'https://<canvas>/api/v1/users/self/content_shares/123'curl -X DELETE 'https://<canvas>/api/v1/users/self/content_shares/123'curl -X POST 'https://<canvas>/api/v1/users/self/content_shares/123/add_users?receiver_ids[]=789'curl -X PUT 'https://<canvas>/api/v1/users/self/content_shares/123?read_state=read'// An AI Experience for interactive learning
{
// The ID of the AI experience
"id": 234,
// The title for the AI experience
"title": "Customer Service Simulation",
// The description of the AI experience
"description": "Practice customer service skills in a simulated environment",
// The AI facts for the experience (optional)
"facts": "You are a customer service representative...",
// The learning objectives for this experience
"learning_objective": "Students will practice active listening and problem-solving",
// The pedagogical guidance for the experience
"pedagogical_guidance": "A customer is calling about a billing issue",
// The current published state of the AI experience
"workflow_state": "published",
// The course this experience belongs to
"course_id": 1578941
}curl https://<canvas>/api/v1/users/self/favorites/courses \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/users/self/favorites/groups \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/users/self/favorites/courses/1170 \
-X POST \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Length: 0'curl https://<canvas>/api/v1/users/self/favorites/group/1170 \
-X POST \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-H 'Content-Length: 0'curl https://<canvas>/api/v1/users/self/favorites/courses/1170 \
-X DELETE \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/users/self/favorites/groups/1170 \
-X DELETE \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/users/self/favorites/courses \
-X DELETE \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/users/self/favorites/group \
-X DELETE \
-H 'Authorization: Bearer <ACCESS_TOKEN>'{
// the ID of the page
"id": 1,
// name of the template
"name": "Navigation Bar",
// description of the template
"description": "A bar of links to other content",
// the creation date for the template
"created_at": "2012-08-06T16:46:33-06:00",
// the date the template was last updated
"updated_at": "2012-08-08T14:25:20-06:00",
// The JSON data that is the template
"node_tree": null,
// The version of the editor that created the template
"editor_version": "1.0",
// The type of template. One of 'block', 'section', or 'page'
"template_type": "page",
// String indicating what state this assignment is in.
"workflow_state": "unpublished"
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/123/block_editor_templates?sort=name&order=asc&drafts=truecurl 'https://<canvas>/api/v1/users/self/files' \
-F 'name=profile_pic.jpg' \
-F 'size=302185' \
-F 'content_type=image/jpeg' \
-F 'parent_folder_path=my_files/section1' \
-H "Authorization: Bearer <token>"{
"upload_url": "https://some-bucket.s3.amazonaws.com/",
"upload_params": {
"key": "/users/1234/files/profile_pic.jpg",
<unspecified parameters; key above will not necesarily be present either>
}
}curl '<upload_url>' \
-F 'key=/users/1234/files/profile_pic.jpg' \
<any other parameters specified in the upload_params response>
-F 'file=@my_local_file.jpg'HTTP/1.1 301 Moved Permanently
Location: https://<canvas>/api/v1/files/1234/create_success?uuid=ABCDEcurl -X POST '<Location>' \
-H 'Content-Length: 0' \
-H "Authorization: Bearer <token>"{
"id": 1234,
"url": "...url to download the file...",
"content-type": "image/jpeg",
"display_name": "profile_pic.jpg",
"size": 302185
}curl 'https://<canvas>/api/v1/users/self/files' \
-F 'url=http://example.com/my_pic.jpg' \
-F 'name=profile_pic.jpg' \
-F 'size=302185' \
-F 'content_type=image/jpeg' \
-F 'parent_folder_path=my_files/section1' \
-H "Authorization: Bearer <token>"{
"upload_url": "https://file-service.url/opaque",
"upload_params": {
/* unspecified parameters; contents should be treated as opaque */
},
"progress": {
/* amongst other tags, see the Progress API... */
"url": "https://canvas.example.edu/api/v1/progress/1"
"workflow_state": "running"
}
}curl '<upload_url>' \
-F 'target_url=http://example.com/my_pic.jpg' \
<any other parameters specified in the upload_params response>HTTP/1.1 201 CreatedparentId (GUID) - GUID for the element which is one level above in the hierarchy.
state (string) - State is saying if the item element in the hierarchy is selected or not. Values can be: "checked" [+], "indeterminate" [-], "unchecked" [ ]
type (string) - Type of position in the hierarchy. Values in hierarchical order: "region" > "publication" > "document" > "section" > "standard".
guid (GUID) - GUID of the element in the hierarchy. (Eg.: "A832862C-901A-11DF-A622-0C319DFF4B22")
name (text) - Value of the facet parameter. (Eg.: "California")
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
OK
Bad Request
Authentication Error
Entity not found
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
Created
guid of specified standard collection
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
OK
Bad Request
Authentication Error
Conflict
Unprocessable content
guid of specified standard collection
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
OK
Bad Request
Authentication Error
Entity not found
Unprocessable content
guid of specified standard collection
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
OK
Authentication Error
Unauthorized
Entity not found
OK
Bad Request
Authentication Error
The "guid" identifies the asset collection in machine readable format.
The "filters" object stores the filtering expression for the asset collection. This stores facets and asset types which helps to filter to only the desired assets.
Here is a formal description about the filters object. For a practical explanation see the example below.
filters (object, required) - JSON API object for filters object containing various fields like: assetType and facets.
assetType (string) - The Asset type defines the Asset's structure and is setup by in Academic Benchmarks an Administrative User.
facets (array) - List of facets derived from the Asset Definition.
(object)
label (string) - Name of the facet. Derived from Asset Definition: data[n].attributes.properties[m].label
id (string) - Same as label.
Filtering an asset query by a "field" and different "values" in AB API looks like this:
With multiple fields it look like this:
Similar filters are created from the filters object. The left side of the query is the same. On the right side the expressions divided by the and are generated from the filters.facets list elements. The field_1 and field_2 are defined by field.id. The "values" are those items in the selectedFilters object which have the object-path defined in the facet.id. If facet.id == "a.b" then the values will be selectedFilters[i].a.b.
Here is a filters object. Let's see how filter expression can be generated from it step-by-step:
The left side of the expression starts with filter[asset] =. There are two elements in the filters.facets array, so there will be two expressions on the right side. For example expressions expr_1 and expr_2. These are the basis of the filtering. The expr_1 is built up from filters.facets[0] and the expr_2 is built up from filters.facets[1].
Expressions are built up from a "field" and set of "values". The filter will give back those assets which have given the "values" on the given "field".
Let's find the "field" values. In the JSON object the "field" is defined by field.id.
Substitute these as "fields" into the filter expression.
Let's find the "values". The variables' names that are holding the "values" are defined by the facet.id. The "values" are those items in the selectedFilters object which have the object-path defined in the facet.id.
The variable for "values_1" is facet.id = "data.guid". Let's gather the values from selectedFilters.data.guid and generate the "values_1".
The variable for "values_2" is facet.id = "data.guid". Let's gather the values from selectedFilters.data.guid and generate the "values_2".
Finally substitute the "values" into the filter expression:
This example will filter only those assets which are in the grade: "Kindergarten" or "9th Grade" and are in the subject: "Mathematics".
When there is a need to quickly identify and refer to a filtered collection of assets, the "Asset Collection" is what provides a solution. Asset Collection stores the filters object with a name and a guid as reference.
To list Asset Collections the partner has access to, send a GET to the endpoint.
To find an Asset Collection by exact name, send a GET to the endpoint with the collection_name parameter. This gives back only the case sensitive exact match if there is any.
To search Asset Collections by name, send a GET to the endpoint with the search_collection_name parameter. This search uses case insensitive partial matching.
To create an Asset Collection within the AB Connects system, you send a POST request to the endpoint. The body of the POST contains the Asset Collection definition in JSON format.
The response will be the same as a GET by GUID request for the created Asset Collection. See in the "Retrieving the Details of an Asset Collection".
To get the Asset Collections you've created, call the endpoint with a GET while supplying the AB GUID for the Asset Collection. To retrieve the GUID, use the list and search functionality.
To update an Asset Collection, send a PATCH to the Asset Collection URL (with GUID) sending JSON in the body similar to that in the create statement. The JSON body only needs to contain the attributes that need to be updated. You can update the name, filters or advanced_search fields for the Asset Collection. You can update only one of these or all.
The response will contain the modified Asset Collection just as it would be in a GET by GUID request for the created Asset Collection. See in the "Retrieving Assets Collection".
To delete an Asset Collection you've created, send a DELETE the endpoint while supplying the AB GUID for the Asset Collection. If you have the name for the Asset Collection but not the AB GUID, see the section on searching for Asset Collections.
A ColumnDatum object looks like:
GET /api/v1/courses/:course_id/custom_gradebook_columns
Scope: url:GET|/api/v1/courses/:course_id/custom_gradebook_columns
A paginated list of all custom gradebook columns for a course
Request Parameters:
include_hidden
boolean
Include hidden parameters (defaults to false)
Returns a list of CustomColumn objects.
POST /api/v1/courses/:course_id/custom_gradebook_columns
Scope: url:POST|/api/v1/courses/:course_id/custom_gradebook_columns
Create a custom gradebook column
Request Parameters:
column[title]
Required string
no description
column[position]
integer
The position of the column relative to other custom columns
column[hidden]
boolean
Hidden columns are not displayed in the gradebook
column[teacher_notes]
boolean
Set this if the column is created by a teacher. The gradebook only supports one teacher_notes column.
Returns a CustomColumn object.
PUT /api/v1/courses/:course_id/custom_gradebook_columns/:id
Scope: url:PUT|/api/v1/courses/:course_id/custom_gradebook_columns/:id
Accepts the same parameters as custom gradebook column creation
Returns a CustomColumn object.
DELETE /api/v1/courses/:course_id/custom_gradebook_columns/:id
Scope: url:DELETE|/api/v1/courses/:course_id/custom_gradebook_columns/:id
Permanently deletes a custom column and its associated data
Returns a CustomColumn object.
POST /api/v1/courses/:course_id/custom_gradebook_columns/reorder
Scope: url:POST|/api/v1/courses/:course_id/custom_gradebook_columns/reorder
Puts the given columns in the specified order
200 OK is returned if successful
Request Parameters:
order[]
Required integer
no description
GET /api/v1/courses/:course_id/custom_gradebook_columns/:id/data
Scope: url:GET|/api/v1/courses/:course_id/custom_gradebook_columns/:id/data
This does not list entries for students without associated data.
Request Parameters:
include_hidden
boolean
If true, hidden columns will be included in the result. If false or absent, only visible columns will be returned.
Returns a list of ColumnDatum objects.
PUT /api/v1/courses/:course_id/custom_gradebook_columns/:id/data/:user_id
Scope: url:PUT|/api/v1/courses/:course_id/custom_gradebook_columns/:id/data/:user_id
Set the content of a custom column
Request Parameters:
column_data[content]
Required string
Column content. Setting this to blank will delete the datum object.
Returns a ColumnDatum object.
PUT /api/v1/courses/:course_id/custom_gradebook_column_data
Scope: url:PUT|/api/v1/courses/:course_id/custom_gradebook_column_data
Set the content of custom columns
{
}
Request Parameters:
column_data[]
Required Array
Column content. Setting this to an empty string will delete the data object.
Example Request:
Returns a Progress object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for account notifications.
An AccountNotification object looks like:
GET /api/v1/accounts/:account_id/account_notifications
Scope: url:GET|/api/v1/accounts/:account_id/account_notifications
Returns a list of all global notifications in the account for the current user Any notifications that have been closed by the user will not be returned, unless a include_past parameter is passed in as true. Admins can request all global notifications for the account by passing in an include_all parameter.
Request Parameters:
Example Request:
Returns a list of objects.
GET /api/v1/accounts/:account_id/account_notifications/:id
Scope: url:GET|/api/v1/accounts/:account_id/account_notifications/:id
Returns a global notification for the current user A notification that has been closed by the user will not be returned
Example Request:
Returns an object.
POST /api/v1/accounts/:account_id/account_notifications
Scope: url:POST|/api/v1/accounts/:account_id/account_notifications
Create and return a new global notification for an account.
Request Parameters:
Example Request:
Example Response:
PUT /api/v1/accounts/:account_id/account_notifications/:id
Scope: url:PUT|/api/v1/accounts/:account_id/account_notifications/:id
Update global notification for an account.
Request Parameters:
Example Request:
Example Response:
DELETE /api/v1/accounts/:account_id/account_notifications/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/account_notifications/:id
If the current user no longer wants to see this account notification, it can be closed with this call. This affects the current user only.
If the current user is an admin and they pass a remove parameter with a value of “true”, the account notification will be destroyed. This affects all users.
Request Parameters:
Example Request:
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
In continuing efforts to make the process of working with academic Standards easy and efficient, we have begun to create plug-able widgets that can be used directly in apps created by our partners. The widgets are designed to enable our partners to offer capabilities within their apps with only a few lines of code. We will continue to expand the capabilities of the widgets as well as add to the list of supported widgets over time.
Our initial offering is a widget that enables the end user to browse for and select Standards. We will continue to expand the capabilities to support faceted and full text search as well as search-by-number.
Instructure's Academic Benchmarks widgets are hosted on Amazon's Content Delivery Network (CDN) to ensure high availability and responsiveness.
The app is built on jQuery and completely embeds all requirements directly within the one package to ensure smooth integration. To plug the widget into your app, start by including the script into your HTML file:
<script src="https://widgets.academicbenchmarks.com/ABConnect/v4/dist/widgets.js"></script>
The required version of jQuery is encapsulated within the widget JavaScript to avoid version dependency issues but the order in which your app loads the various libraries matters. If you use jQuery, you should always load jQuery before the AB Connect widgets. We've bundled a version of jQuery in such a way as not to interfere with other versions that may be included on the page. To ensure the smoothest integration possible, the widget will handle the encapsulated jQuery in the following manor:
If jQuery was loaded into the page before the widgets, then the widgets will be installed into it but the widgets will use the encapsulated version of jQuery internally.
If jQuery is not loaded at all, then the encapsulated version of jQuery (and widgets) will be installed into the page. (version 2.2.4)
If jQuery is loaded after the widgets, then the version of jQuery (and widgets) installed by AB Connect will be rendered inaccessible.
Once the script is included, create a div to hold the widget. Note that the widget was designed for a minimum size of 800 x 600 px. If it is given more space than that, it will expand to take advantage of it. You can give the div any name/class/tag you like.
<div class="standardsBrowser" style="width: 800px; height: 600px;"></div>
Initializing the browser is as simple as:
$('.standardsBrowser').standardsBrowser(config);
The config object can be used to define the behavior of the widget as well as how it interacts with your app.
The configuration object you include in the widget initiation can help control the behavior of the widget. This section describes the properties of the configuration object and how they are used to control the widget.
uiEntityState - This is an object property that defines the initial values of elements in the UI as well as their visibility. Each property of the uiEntityState object contains an optional flag (named "show") indicating whether that element is visible and a value property indicating the initial value(s) of the element. If the "show" property is left out, the default is true. If the value property is left out, no initial selection is made. If the element property is not included, the element is visible with no initial selection. Properties:
authority - Indicates the drop-down listing the authorities available for browsing. The value property is the GUID of the initial authority selection.
E.g.:
would pre-select the Common Core Math Standards and hide the lists so the user couldn't change the selection.
selectMode - This is a property indicating whether the browser is in single select mode (single - the default) or multiple select mode (multiple). If false, the user can select multiple Standards at a time. Note that the selection is cleared when the user changes facet filtering, does a search or changes document. It is the responsibility of the parent app to offer a mechanism to build and manage a persistent list of Standards if appropriate for the app.
enableDoubleClick - This is a Boolean property indicating whether the browser supports double clicks (true). Default: false.
showAssetCount - This is a Boolean property indicating whether the browser should show a badge indicating the number of Assets that are related to the Standard. This can be used in situations where the parent app is using the Standards Browser as a first step in helping the user search for related Assets. Note that this capability requires that your organization stores your content metadata profile as Assets in AB Connect. The default is false.
Here is an example configuration object for an app that uses the browser for the selection of a single Standard.
The Standards Browser fires or forwards events to the parent app. Registering for most of the events is optional but the app must register for error events because the widget does not handle errors itself. Instead, it forwards them to the parent app so it can display the error using the same approach it displays errors from other elements of the UI.
The following events may be fired during the operation of the widget:
standardSelect - A Standard has been selected. The GUID of the Standard is forwarded with the event. The parent app may choose to ignore such events or it may take some action like enable buttons that allow the user to take action (like add the Standard to a list or close the selection card or dialog).
standardDoubleClick - A Standard has been double clicked. The GUID of the Standard is forwarded with the event. The parent app may choose to ignore such events or it may take some action like add the Standard to a list or close the selection card or dialog. Note that due to the way double clicks are handled in browsers, a double click action will actually create a select event for the Standard being clicked, followed by deselect events for ALL selected Standards followed by a double click event for the Standard being clicked.
The Standards Browser supports the following methods to help the parent app interact with it.
getConfiguration - Returns the uiEntityState object containing the current configuration. This will help the parent app re-launch the widget in the same state as it was when the user closed it. E.g. var state = $('.standardsBrowser').standardsBrowser('getConfiguration');
getSelection - Returns an array of GUIDs listing every Standard that is currently selected in the UI. E.g. var listGuids = $('.standardsBrowser').standardsBrowser('getSelection');
See the for examples illustrating how to embed the Standards Browser into your app.
Minimum Standards Browser - This is a minimum app that hosts the Standards Browser. Beyond illustrating the basics of using embeddable widgets in an app, this example shows the basic JSON body of the currently selected Standard. You can see the .
Integrated Relationship Browser - This is a version of the Relationship Browser app that uses the Standards Browser rather in place of the home-grown browser from the original Relationship Browser app. You can .
One common situation is having the user select a single Standard. You may want to do this when prompting a teacher to select a Standard related to a test item or starting the process of searching for items by alignment. The integration may look something like this:
Create a pop-up window (or div) that contains the Standards Browser widget in single select mode and buttons for "OK" and "Close".
Disable the "OK" button by default.
Listen for onStandardSelect events. When you receive one, enable the OK button.
Listen for onStandardDeselect events. When you receive one, disable the OK button.
Another common situation is having the user manage a list of Standards. This may come up when you want to allow a teacher to search for materials related to curriculum for the next quarter. The integration may look something like this:
Create an area on the page that contains the Standards Browser widget in multiselect mode as well as a separate list (we'll call this standardsList) and arrow buttons to allow user to add Standards to the standardsList and remove Standards from the list (perhaps ">>" and "<<" or "Add" and "Remove" buttons). You may also want some sort of Action button.
Disable the "Add" button by default.
Listen for onStandardSelect events. When you receive one, enable the "Add" button.
Listen for onStandardDeselect events. When you receive one, check getSelection to see if there are any Standards still selected. If not, disable the "Add" button.
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
API for viewing enrollment terms. For all actions, the specified account must be a root account and the caller must have permission to manage the account (when called on non-root accounts, the errorwill be indicate the appropriate root account).
GET /rest/v4.1/assets?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
filter[asset] = field_1 in (value_A, value_B) filter[asset] = field_1 in (value_A, value_B) and field_2 in (value_C, value_D) "filters": {
"assetType": "NLP_MHE",
"facets": [
{
"label": "Grade",
"id": "Grade",
"field": {
"name": "education_levels.grades",
"id": "education_levels.grades.guid"
},
"facet": {
"name": "data.descr",
"id": "data.guid"
},
"selectedFilters": [
{
"data": {
"descr": "Kindergarten",
"guid": "F1F9FA12-3B53-11E0-A421-F4B24952E9DF",
"code": "K",
"seq": 20
}
},
{
"data": {
"descr": "9th Grade",
"guid": "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22",
"code": "9",
"seq": 20,
}
},
],
},
{
"id": "Subject",
"label": "Subject",
"field": {
"name": "disciplines.subjects",
"id": "disciplines.subjects.ids"
},
"facet": {
"name": "data.descr",
"id": "data.guid"
},
"selectedFilters": [
{
"data": {
"descr": "Mathematics",
"guid": "495E9DFF-3B53-11E0-B042-C4B222F1FB2F",
"code": "MATH"
},
"count": 2488
}
]
}
]
} filter[asset] = expr_1 and expr_2 expr: field in (values)facets[0].field.id = "education_levels.grades.guid"`
facets[1].field.id = "disciplines.subjects.ids" filter[asset] = education_levels.grades.guid in (values_1) and disciplines.subjects.ids in (values_2) selectedFilters[0].data.guid = "F1F9FA12-3B53-11E0-A421-F4B24952E9DF"
selectedFilters[1].data.guid = "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22"
==>
values_1 = "F1F9FA12-3B53-11E0-A421-F4B24952E9DF", "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22" selectedFilters[0].data.guid = "495E9DFF-3B53-11E0-B042-C4B222F1FB2F"
==>
values_2 = "495E9DFF-3B53-11E0-B042-C4B222F1FB2F" filter[asset] = education_levels.grades in ("F1F9FA12-3B53-11E0-A421-F4B24952E9DF", "ABBAABBA-ACDC-ACDC-B042-495E9DFF4B22") and disciplines.subjects.ids in ("495E9DFF-3B53-11E0-B042-C4B222F1FB2F"){
// The ID of the custom gradebook column
"id": 2,
// When true, this column's visibility will be toggled in the Gradebook when a
// user selects to show or hide notes
"teacher_notes": false,
// header text
"title": "Stuff",
// column order
"position": 1,
// won't be displayed if hidden is true
"hidden": false,
// won't be editable in the gradebook UI
"read_only": true
}// ColumnDatum objects contain the entry for a column for each user.
{
"content": "Nut allergy",
"user_id": 2
}"column_data": [
{
"column_id": example_column_id,
"user_id": example_student_id,
"content": example_content
},
{
"column_id": example_column_id,
"user_id": example_student_id,
"content: example_content
}
]column[read_only]
boolean
Set this to prevent the column from being editable in the gradebook ui
Created
publication - Indicates the drop-down listing the publications available for browsing. The value property is the GUID of the initial publication selection.document - Indicates the drop-down listing the documents available for browsing. The value property is the GUID of the initial document selection.
assetCountFilter - This is a string property that is added to the AB Connect query that is used to retrieve the Asset count when the showAssetCount is true. By default, the widget counts any Assets that are owned by your account and are related to the Standard in question. However, you can pass a query string that is then appended to the query with an AND operator to further limit the query. E.g. you may want to further limit the results to a particular type of Asset or Assets of a particular media type. This property is optional and only used if showAssetCount is true.
authCredentials - This is an object property containing the authorization credentials. See the AB Connect documentation on authentication for details.
ID - Your partner ID
signature -signature generated from your partner key and the expires value
expires -expiration date of the signature
user - optional parameter for an ID specific to this user
onStandardSelect - An event handler defined by your app to handle selection events for Standards. The signature of the function must be function (event, GUID). The GUID of the Standard that was selected is the second parameter. This property is optional. Alternatively, you can register your event handlers directly via jQuery.
onStandardDoubleClick - An event handler defined by your app to handle double-click events for Standards. The signature of the function must be function (event, GUID). The GUID of the Standard that was clicked is the second parameter. This property is optional.
onStandardDeselect - An event handler defined by your app to handle deselection events for Standards. The signature of the function must be function (event, GUID). The GUID of the Standard that was deselected is the second parameter. Note that this event will fire multiple times in the event of multiple deselects (e.g. when multiple Standards are selected and the document or filter criteria changes). This property is optional.
onError - An event handler defined by your app to handle error events. In the event of warnings or soft error situations, the widget will do it's best to recover and restore normal working behavior while logging the issue in the console. However, error conditions that are unrecoverable (e.g. authentication errors) will be surfaced to the parent app. The signature of the function must be function (event, message). Message is a human readable message describing the error that occurred. While this parameter is technically optional so the developer can alternatively choose to register this handler directly with jQuery, the developer MUST create a handler using one method or another or there will be no user feedback on error conditions.
standardDeselecterror - An error has occurred and the widget is unable to self recover in a meaningful way.
Listen for onStandardDoubleClick events. When you receive one, record the GUID, close the dialog and return control to the parent app.
If the user selects OK:
Call getSelection to retrieve the selected Standard, record the GUID
Optionally call getConfiguration on the StandardsBrowser to grab the user selections for restoration later
Close the dialog and return control to the parent app
Listen for onStandardDoubleClick events. When you receive one, add the Standard related to the GUID to the list.
Listen for click events on the "Add" button. When you receive one, add the Standard related to the GUID to the list.
Listen for selection events on the standardsList. When you receive one, enable the "Remove" button.
Listen for deselection events on the standardsList. When you receive one, check to see if there are any Standards selected in the standardsList. If not, disable the "Remove" button.
Listen for click events on the "Remove" button. When you receive one, remove the selected Standard from the standardsList.
Listen for click events on the "Action" button. When you receive one:
Gather the list of Standards from standardsList
Optionally call getConfiguration on the StandardsBrowser to grab the user selections for restoration later
Pass control to the parent app. You may want to remove or hide the StandardsBrowser at this point depending on the needs of your app.
{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1,
"facets": [
{
"count": 1,
"facet": "text",
"details": [
{
"data": {
"descr": "text",
"code": "text",
"guid": "text"
},
"count": 1
}
]
}
]
},
"data": [
{
"relationships": {
"alignment_donors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"owner": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"deleted_alignments": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"alignments": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concept_donors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"id": "text",
"attributes": {
"prediction_algorithm": 1,
"date_modified_utc": "text",
"client_id": "text",
"guid": "text",
"custom_attributes": {
"ANY_ADDITIONAL_PROPERTY": [
"text"
]
},
"education_levels": {
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"descriptors": [
{
"value": "text",
"name": "text"
}
],
"title": "text",
"date_alignments_modified_utc": "text",
"disciplines": {
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"asset_type": "text"
},
"type": "assets"
}
],
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}{
"meta": {
"took": 1
}
}GET /rest/v4.1/standard_collections?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
POST /rest/v4.1/standard_collections?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 58
{
"data": {
"name": "text",
"filters": {},
"advanced_search": {}
}
}GET /rest/v4.1/standard_collections/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
PATCH /rest/v4.1/standard_collections/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 72
{
"data": {
"guid": "text",
"name": "text",
"filters": {},
"advanced_search": {}
}
}DELETE /rest/v4.1/standard_collections/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
uiEntityState: {
authority: {
show: false,
value: "A83297F2-901A-11DF-A622-0C319DFF4B22"
},
publication: {
show: false,
value: "964E0FEE-AD71-11DE-9BF2-C9169DFF4B22"
},
document: {
show: false,
value: "6C2635F0-6EC0-11DF-AB2D-366B9DFF4B22"
}
}var config = {
selectMode: 'single',
enableDoubleClick: false,
authCredentials: {
ID: gPartnerID,
signature: gSignature,
expires: gAuthExpires
},
onStandardSelect: function(event, GUID){
standardSelected(GUID);
},
onStandardDeselect: function(event, GUID){
noStandardSelected();
},
onError: function(event, message){
alert(message);
}
};field (object) - The field object for the property. Derived from Asset Definition: data[n].attributes.properties[m].field.
name (string) - The API-recognized name for the entity you are filtering by. This is the property you would use when asking for facets.
id (string) - API identifier for the field which uniquely identifies the entity being filtered by. This is the property you would use when constructing your filter statement as the key field.
facet (object) - The facets object for the property. Derived from Asset Definition: data.[n].attributes.properties.[m].facet
name (string) - The API Identifier for the human-readable property in the facets response.
id (GUID) - The API Identifier for the entity-unique property in the facets response. This is the property you would use when constructing your filter statement and thus must correspond with the values in this entity’s field.id.
selectedFilters (array) - The list of selected values for the queries.
(object) - This objects holds the elements to which the facid.id refers.
data (object) - The object details for this facet item. See the definition of the object for the specific facet for details, but they all have at least the descr and guid.
descr (string) - Facet value text.
guid (GUID) - Facet value GUID.
code (string) - Facet value code name.
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
OK
Bad Request
Authentication Error
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
Created
Bad Request
Authentication Error
Conflict
Unprocessable content
guid of specified asset collection
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
OK
Bad Request
Authentication Error
Entity not found
account_notification[icon]
string
The icon to display with the notification. Note: Defaults to warning.
Allowed values: warning, information, question, error, calendar
account_notification_roles[]
string
The role(s) to send global notification to. Note: ommitting this field will send to everyone Example:
account_notification[icon]
string
The icon to display with the notification.
Allowed values: warning, information, question, error, calendar
account_notification_roles[]
string
The role(s) to send global notification to. Note: ommitting this field will send to everyone Example:
include_past
boolean
Include past and dismissed global announcements.
include_all
boolean
Include all global announcements, regardless of user’s role or availability date. Only available to account admins.
show_is_closed
boolean
Include a flag for each notification indicating whether it has been read by the user.
account_notification[subject]
Required string
The subject of the notification.
account_notification[message]
Required string
The message body of the notification.
account_notification[start_at]
Required DateTime
The start date and time of the notification in ISO8601 format. e.g. 2014-01-01T01:00Z
account_notification[end_at]
Required DateTime
The end date and time of the notification in ISO8601 format. e.g. 2014-01-01T01:00Z
account_notification[subject]
string
The subject of the notification.
account_notification[message]
string
The message body of the notification.
account_notification[start_at]
DateTime
The start date and time of the notification in ISO8601 format. e.g. 2014-01-01T01:00Z
account_notification[end_at]
DateTime
The end date and time of the notification in ISO8601 format. e.g. 2014-01-01T01:00Z
remove
boolean
Destroy the account notification.
An EnrollmentTerm object looks like:
An EnrollmentTermsList object looks like:
POST /api/v1/accounts/:account_id/terms
Scope: url:POST|/api/v1/accounts/:account_id/terms
Create a new enrollment term for the specified account.
Request Parameters:
enrollment_term[name]
string
The name of the term.
enrollment_term[start_at]
DateTime
The day/time the term starts. Accepts times in ISO 8601 format, e.g. 2015-01-10T18:48:00Z.
enrollment_term[end_at]
DateTime
The day/time the term ends. Accepts times in ISO 8601 format, e.g. 2015-01-10T18:48:00Z.
enrollment_term[sis_term_id]
string
The unique SIS identifier for the term.
Returns an EnrollmentTerm object.
PUT /api/v1/accounts/:account_id/terms/:id
Scope: url:PUT|/api/v1/accounts/:account_id/terms/:id
Update an existing enrollment term for the specified account.
Request Parameters:
enrollment_term[name]
string
The name of the term.
enrollment_term[start_at]
DateTime
The day/time the term starts. Accepts times in ISO 8601 format, e.g. 2015-01-10T18:48:00Z.
enrollment_term[end_at]
DateTime
The day/time the term ends. Accepts times in ISO 8601 format, e.g. 2015-01-10T18:48:00Z.
enrollment_term[sis_term_id]
string
The unique SIS identifier for the term.
Returns an EnrollmentTerm object.
DELETE /api/v1/accounts/:account_id/terms/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/terms/:id
Delete the specified enrollment term.
Returns an EnrollmentTerm object.
GET /api/v1/accounts/:account_id/terms
Scope: url:GET|/api/v1/accounts/:account_id/terms
An object with a paginated list of all of the terms in the account.
Request Parameters:
workflow_state[]
string
If set, only returns terms that are in the given state. Defaults to ‘active’.
Allowed values: active, deleted, all
include[]
string
Array of additional information to include.
“overrides”
term start/end dates overridden for different enrollment types
“course_count”
the number of courses in each term
Allowed values: overrides
term_name
string
If set, only returns terms that match the given search keyword. Search keyword is matched against term name.
Example Request:
Example Response:
Returns an EnrollmentTermsList object.
GET /api/v1/accounts/:account_id/terms/:id
Scope: url:GET|/api/v1/accounts/:account_id/terms/:id
Retrieves the details for an enrollment term in the account. Includes overrides by default.
Example Request:
Returns an EnrollmentTerm object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
A Feature object looks like:
A FeatureFlag object looks like:
GET /api/v1/courses/:course_id/features
Scope: url:GET|/api/v1/courses/:course_id/features
GET /api/v1/accounts/:account_id/features
Scope: url:GET|/api/v1/accounts/:account_id/features
GET /api/v1/users/:user_id/features
Scope: url:GET|/api/v1/users/:user_id/features
A paginated list of all features that apply to a given Account, Course, or User.
Request Parameters:
hide_inherited_enabled
boolean
When true, feature flags that are enabled in a higher context and cannot be overridden will be omitted.
Example Request:
Returns a list of Feature objects.
GET /api/v1/courses/:course_id/features/enabled
Scope: url:GET|/api/v1/courses/:course_id/features/enabled
GET /api/v1/accounts/:account_id/features/enabled
Scope: url:GET|/api/v1/accounts/:account_id/features/enabled
GET /api/v1/users/:user_id/features/enabled
Scope: url:GET|/api/v1/users/:user_id/features/enabled
A paginated list of all features that are enabled on a given Account, Course, or User. Only the feature names are returned.
Example Request:
Example Response:
GET /api/v1/features/environment
Scope: url:GET|/api/v1/features/environment
Return a hash of global feature options that pertain to the Canvas user interface. This is the same information supplied to the web interface as ENV.FEATURES.
Example Request:
Example Response:
GET /api/v1/courses/:course_id/features/flags/:feature
Scope: url:GET|/api/v1/courses/:course_id/features/flags/:feature
GET /api/v1/accounts/:account_id/features/flags/:feature
Scope: url:GET|/api/v1/accounts/:account_id/features/flags/:feature
GET /api/v1/users/:user_id/features/flags/:feature
Scope: url:GET|/api/v1/users/:user_id/features/flags/:feature
Get the feature flag that applies to a given Account, Course, or User. The flag may be defined on the object, or it may be inherited from a parent account. You can look at the context_id and context_type of the returned object to determine which is the case. If these fields are missing, then the object is the global Canvas default.
Example Request:
Returns a FeatureFlag object.
PUT /api/v1/courses/:course_id/features/flags/:feature
Scope: url:PUT|/api/v1/courses/:course_id/features/flags/:feature
PUT /api/v1/accounts/:account_id/features/flags/:feature
Scope: url:PUT|/api/v1/accounts/:account_id/features/flags/:feature
PUT /api/v1/users/:user_id/features/flags/:feature
Scope: url:PUT|/api/v1/users/:user_id/features/flags/:feature
Set a feature flag for a given Account, Course, or User. This call will fail if a parent account sets a feature flag for the same feature in any state other than “allowed”.
Request Parameters:
state
string
“off”
The feature is not available for the course, user, or account and sub-accounts.
“allowed”
(valid only on accounts) The feature is off in the account, but may be enabled in sub-accounts and courses by setting a feature flag on the sub-account or course.
“on”
The feature is turned on unconditionally for the user, course, or account and sub-accounts.
Example Request:
Returns a FeatureFlag object.
DELETE /api/v1/courses/:course_id/features/flags/:feature
Scope: url:DELETE|/api/v1/courses/:course_id/features/flags/:feature
DELETE /api/v1/accounts/:account_id/features/flags/:feature
Scope: url:DELETE|/api/v1/accounts/:account_id/features/flags/:feature
DELETE /api/v1/users/:user_id/features/flags/:feature
Scope: url:DELETE|/api/v1/users/:user_id/features/flags/:feature
Remove feature flag for a given Account, Course, or User. (Note that the flag must be defined on the Account, Course, or User directly.) The object will then inherit the feature flags from a higher account, if any exist. If this flag was ‘on’ or ‘off’, then lower-level account flags that were masked by this one will apply again.
Example Request:
Returns a FeatureFlag object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing Assignment Group and Assignment information.
A GradingRules object looks like:
An AssignmentGroup object looks like:
GET /api/v1/courses/:course_id/assignment_groups
Scope: url:GET|/api/v1/courses/:course_id/assignment_groups
Returns the paginated list of assignment groups for the current context. The returned groups are sorted by their position field.
Request Parameters:
Returns a list of objects.
GET /api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Scope: url:GET|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Returns the assignment group with the given id.
Request Parameters:
Returns an object.
POST /api/v1/courses/:course_id/assignment_groups
Scope: url:POST|/api/v1/courses/:course_id/assignment_groups
Create a new assignment group for this course.
Request Parameters:
Returns an object.
PUT /api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Scope: url:PUT|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Modify an existing Assignment Group.
Request Parameters:
Returns an object.
DELETE /api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Scope: url:DELETE|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id
Deletes the assignment group with the given id.
Request Parameters:
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing account reports.
A Report object looks like:
A ReportParameters object looks like:
GET /api/v1/accounts/:account_id/reports
Scope: url:GET|/api/v1/accounts/:account_id/reports
Returns a paginated list of reports for the current context.
Request Parameters:
API response field:
name
The name of the report.
parameters
The parameters will vary for each report
last_run
Report
The last run of the report. This will be null if the report has never been run.
Example Request:
Example Response:
POST /api/v1/accounts/:account_id/reports/:report
Scope: url:POST|/api/v1/accounts/:account_id/reports/:report
Generates a report instance for the account. Note that “report” in the request must match one of the available report names. To fetch a list of available report names and parameters for each report (including whether or not those parameters are required), see .
Request Parameters:
Example Request:
Returns a object.
GET /api/v1/accounts/:account_id/reports/:report
Scope: url:GET|/api/v1/accounts/:account_id/reports/:report
Shows all reports that have been run for the account of a specific type.
Example Request:
Returns a list of objects.
GET /api/v1/accounts/:account_id/reports/:report/:id
Scope: url:GET|/api/v1/accounts/:account_id/reports/:report/:id
Returns the status of a report.
Example Request:
Returns a object.
DELETE /api/v1/accounts/:account_id/reports/:report/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/reports/:report/:id
Deletes a generated report instance.
Example Request:
Returns a object.
PUT /api/v1/accounts/:account_id/reports/:report/:id/abort
Scope: url:PUT|/api/v1/accounts/:account_id/reports/:report/:id/abort
Abort a report in progress
Example Request:
Returns a object.
This documentation is generated directly from the Canvas LMS source code, available .
In order to use the interactive , you will need to properly authenticate. If you do not have credentials, you can . Alternatively, you can inquire about purchasing a license, or request access for your company's account, via .
Once you have your partner ID and key, you can create signatures and start to make calls to the production version of AB Connect. From a high level, the signature is an HMAC SHA-256 hash of a message constructed in a specific format. Use the partner key that is given to you by AB Support for the hash key. The message has one required field (expires - expressed in seconds since epoch) and three optional values: user, method and resource. The delimiter between the fields is a bare newline character (no carriage return) typically denoted as "\n". The generalized form of the message is:
<expires>[\nuser][\nmethod][\nresource]
Here are some example messages and their interpretation:
1508419888
Welcome to Our New API Docs! This is the new home for all things API (previously at ).
Manage Canvas API Keys, used for OAuth access to this API. See for usage of these keys. Note that DeveloperKeys are also (currently) used for LTI 1.3 registration and OIDC access, but this endpoint deals with Canvas API keys. See
{
// The subject of the notifications
"subject": "Attention Students",
// The message to be sent in the notification.
"message": "This is a test of the notification system.",
// When to send out the notification.
"start_at": "2013-08-28T23:59:00-06:00",
// When to expire the notification.
"end_at": "2013-08-29T23:59:00-06:00",
// The icon to display with the message. Defaults to warning.
"icon": "information",
// (Deprecated) The roles to send the notification to. If roles is not passed
// it defaults to all roles
"roles": ["StudentEnrollment"],
// The roles to send the notification to. If roles is not passed it defaults to
// all roles
"role_ids": [1],
// The author of the notification. Available only to admins using include_all.
"author": {"id":1,"name":"John Doe"}
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/2/users/self/account_notificationscurl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/2/users/self/account_notifications/4curl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/2/account_notifications \
-d 'account_notification[subject]=New notification' \
-d 'account_notification[start_at]=2014-01-01T00:00:00Z' \
-d 'account_notification[end_at]=2014-02-01T00:00:00Z' \
-d 'account_notification[message]=This is a global notification'{
"subject": "New notification",
"start_at": "2014-01-01T00:00:00Z",
"end_at": "2014-02-01T00:00:00Z",
"message": "This is a global notification"
}curl -X PUT -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/2/account_notifications/1 \
-d 'account_notification[subject]=New notification' \
-d 'account_notification[start_at]=2014-01-01T00:00:00Z' \
-d 'account_notification[end_at]=2014-02-01T00:00:00Z' \
-d 'account_notification[message]=This is a global notification'{
"subject": "New notification",
"start_at": "2014-01-01T00:00:00Z",
"end_at": "2014-02-01T00:00:00Z",
"message": "This is a global notification"
}curl -X DELETE -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/2/account_notifications/4{
// The unique identifier for the enrollment term.
"id": 1,
// The SIS id of the term. Only included if the user has permission to view SIS
// information.
"sis_term_id": "Sp2014",
// the unique identifier for the SIS import. This field is only included if the
// user has permission to manage SIS information.
"sis_import_id": 34,
// The name of the term.
"name": "Spring 2014",
// The datetime of the start of the term.
"start_at": "2014-01-06T08:00:00-05:00",
// The datetime of the end of the term.
"end_at": "2014-05-16T05:00:00-04:00",
// The state of the term. Can be 'active' or 'deleted'.
"workflow_state": "active",
// Term date overrides for specific enrollment types
"overrides": {"StudentEnrollment":{"start_at":"2014-01-07T08:00:00-05:00","end_at":"2014-05-14T05:00:00-04:0"}},
// The number of courses in the term (available via include)
"course_count": 80
}{
// a paginated list of all terms in the account
"enrollment_terms": []
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/1/terms?include[]=overrides{
"enrollment_terms": [
{
"id": 1,
"name": "Fall 20X6"
"start_at": "2026-08-31T20:00:00Z",
"end_at": "2026-12-20T20:00:00Z",
"created_at": "2025-01-02T03:43:11Z",
"workflow_state": "active",
"grading_period_group_id": 1,
"sis_term_id": null,
"overrides": {
"StudentEnrollment": {
"start_at": "2026-09-03T20:00:00Z",
"end_at": "2026-12-19T20:00:00Z"
},
"TeacherEnrollment": {
"start_at": null,
"end_at": "2026-12-30T20:00:00Z"
}
}
}
]
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/1/terms/2{
// The symbolic name of the feature, used in FeatureFlags
"feature": "fancy_wickets",
// The user-visible name of the feature
"display_name": "Fancy Wickets",
// The type of object the feature applies to (RootAccount, Account, Course, or
// User):
// * RootAccount features may only be controlled by flags on root accounts.
// * Account features may be controlled by flags on accounts and their parent
// accounts.
// * Course features may be controlled by flags on courses and their parent
// accounts.
// * User features may be controlled by flags on users and site admin only.
"applies_to": "Course",
// The FeatureFlag that applies to the caller
"feature_flag": {"feature":"fancy_wickets","state":"allowed"},
// If true, a feature that is 'allowed' globally will be 'off' by default in
// root accounts. Otherwise, root accounts inherit the global 'allowed' setting,
// which allows sub-accounts and courses to turn features on with no root
// account action.
"root_opt_in": true,
// Whether the feature is a feature preview. If true, opting in includes ongoing
// updates outside the regular release schedule.
"beta": true,
// Indicates the feature is part of the Early Access Program.
"early_access_program": false,
// Whether the details of the feature are autoexpanded on page load vs. the user
// clicking to expand.
"autoexpand": true,
// A URL to the release notes describing the feature
"release_notes_url": "http://canvas.example.com/release_notes#fancy_wickets"
}{
// The type of object to which this flag applies (Account, Course, or User).
// (This field is not present if this FeatureFlag represents the global Canvas
// default)
"context_type": "Account",
// The id of the object to which this flag applies (This field is not present if
// this FeatureFlag represents the global Canvas default)
"context_id": 1038,
// The feature this flag controls
"feature": "fancy_wickets",
// The policy for the feature at this context. can be 'off', 'allowed',
// 'allowed_on', or 'on'.
"state": "allowed",
// If set, this feature flag cannot be changed in the caller's context because
// the flag is set 'off' or 'on' in a higher context
"locked": false
}curl 'http://<canvas>/api/v1/courses/1/features' \
-H "Authorization: Bearer <token>"curl 'http://<canvas>/api/v1/courses/1/features/enabled' \
-H "Authorization: Bearer <token>"["fancy_wickets", "automatic_essay_grading", "telepathic_navigation"]curl 'http://<canvas>/api/v1/features/environment' \
-H "Authorization: Bearer <token>"{ "telepathic_navigation": true, "fancy_wickets": true, "automatic_essay_grading": false }curl 'http://<canvas>/api/v1/courses/1/features/flags/fancy_wickets' \
-H "Authorization: Bearer <token>"curl -X PUT 'http://<canvas>/api/v1/courses/1/features/flags/fancy_wickets' \
-H "Authorization: Bearer " \
-F "state=on"curl -X DELETE 'http://<canvas>/api/v1/courses/1/features/flags/fancy_wickets' \
-H "Authorization: Bearer <token>"off, allowed, onenrollment_term[overrides][enrollment_type][start_at]
DateTime
The day/time the term starts, overridden for the given enrollment type. enrollment_type can be one of StudentEnrollment, TeacherEnrollment, TaEnrollment, or DesignerEnrollment
enrollment_term[overrides][enrollment_type][end_at]
DateTime
The day/time the term ends, overridden for the given enrollment type. enrollment_type can be one of StudentEnrollment, TeacherEnrollment, TaEnrollment, or DesignerEnrollment
enrollment_term[overrides][enrollment_type][start_at]
DateTime
The day/time the term starts, overridden for the given enrollment type. enrollment_type can be one of StudentEnrollment, TeacherEnrollment, TaEnrollment, or DesignerEnrollment
enrollment_term[overrides][enrollment_type][end_at]
DateTime
The day/time the term ends, overridden for the given enrollment type. enrollment_type can be one of StudentEnrollment, TeacherEnrollment, TaEnrollment, or DesignerEnrollment
override_sis_stickiness
boolean
Default is true. If false, any fields containing “sticky” changes will not be updated. See SIS CSV Format documentation for information on which fields can have SIS stickiness
grading_period_id
integer
The id of the grading period in which assignment groups are being requested (Requires grading periods to exist.)
scope_assignments_to_student
boolean
If true, all assignments returned will apply to the current user in the specified grading period. If assignments apply to other students in the specified grading period, but not the current user, they will not be returned. (Requires the grading_period_id argument and grading periods to exist. In addition, the current user must be a student.)
integration_data
Object
The integration data of the Assignment Group
integration_data
Object
The integration data of the Assignment Group
rules
string
The grading rules that are applied within this assignment group See the Assignment Group object definition for format
include[]
string
Associations to include with the group. “discussion_topic”, “all_dates”, “can_edit”, “assignment_visibility” & “submission” are only valid if “assignments” is also included. “score_statistics” requires that the “assignments” and “submission” options are included. The “assignment_visibility” option additionally requires that the Differentiated Assignments course feature be turned on. If “observed_users” is passed along with “assignments” and “submission”, submissions for observed users will also be included as an array. The “peer_review” option requires that the Peer Review Grading course feature be turned on and that “assignments” is included.
Allowed values: assignments, discussion_topic, all_dates, assignment_visibility, overrides, submission, observed_users, can_edit, score_statistics, peer_review
assignment_ids[]
string
If “assignments” are included, optionally return only assignments having their ID in this array. This argument may also be passed as a comma separated string.
exclude_assignment_submission_types[]
string
If “assignments” are included, those with the specified submission types will be excluded from the assignment groups.
Allowed values: online_quiz, discussion_topic, wiki_page, external_tool
override_assignment_dates
boolean
Apply assignment overrides for each assignment, defaults to true.
include[]
string
Associations to include with the group. “discussion_topic” and “assignment_visibility” and “submission” are only valid if “assignments” is also included. “score_statistics” is only valid if “submission” and “assignments” are also included. The “assignment_visibility” option additionally requires that the Differentiated Assignments course feature be turned on.
Allowed values: assignments, discussion_topic, assignment_visibility, submission, score_statistics
override_assignment_dates
boolean
Apply assignment overrides for each assignment, defaults to true.
grading_period_id
integer
The id of the grading period in which assignment groups are being requested (Requires grading periods to exist on the account)
name
string
The assignment group’s name
position
integer
The position of this assignment group in relation to the other assignment groups
group_weight
number
The percent of the total grade that this assignment group represents
sis_source_id
string
The sis source id of the Assignment Group
name
string
The assignment group’s name
position
integer
The position of this assignment group in relation to the other assignment groups
group_weight
number
The percent of the total grade that this assignment group represents
sis_source_id
string
The sis source id of the Assignment Group
move_assignments_to
integer
The ID of an active Assignment Group to which the assignments that are currently assigned to the destroyed Assignment Group will be assigned. NOTE: If this argument is not provided, any assignments in this Assignment Group will be deleted.
include[]
string
Array of additional information to include.
“description_html”
an HTML description of the report, with example output
“parameters_html”
an HTML form for the report parameters
Allowed values: description_html, params_html
parameters[]
Hash
The parameters will vary for each report. To fetch a list of available parameters for each report, see List Available Reports. A few example parameters have been provided below. Note that the example parameters provided below may not be valid for every report.
parameters[skip_message]
boolean
If true, no message will be sent to the user upon completion of the report.
parameters[course_id]
integer
The id of the course to report on. Note: this parameter has been listed to serve as an example and may not be valid for every report.
parameters[users]
boolean
If true, user data will be included. If false, user data will be omitted. Note: this parameter has been listed to serve as an example and may not be valid for every report.
1508419888\nbmarley - Same expiration time but the signature is only valid for Bob Marley's account. Note that if you supply a user, the user.id field must include the same value in the URL parameters.
1508419888\n\nGET - This signature can only be used for GET HTTP requests. Notice that the method is uppercase. This is a good approach when using AB Connect from public (or customer) facing web clients. It ensures that a hacker can't manipulate your Assets.
1508419888\n\nGET\nstandards - This signature can only be used for GET requests to standards. Notice that the resource is lowercase. If you have a web client that allows users to browse standards but you want to keep your Asset metadata profiles private, this will limit the scope accordingly.
NOTES:
Each field can have only one value, so you can't mix methods or support multiple endpoints. E.g. if you want to allow read access to both Standards and Topics, you'll need to create two signatures and use the appropriate signature for each call.
While the expires (auth.expires), signature (auth.signature) and optionally the user (user.id) are included in the URL parameters, the method and resource values are inferred from the actual call being made so there is no need to pass those as URL parameters.
If you specify a resource, you must specify a method. Allowing "all methods" on one endpoint is not currently supported. So, for example, your message can not look like 1508419888\n\n\nassets.
Once you have calculated the signature, include the authentication parameters in the URL of your call to AB Connect. The general form of the parameters is:
&partner.id=<ID>&auth.signature=<signature generated above>&auth.expires=<signature expiry in seconds since epoch>
or if you are including a user ID:
&partner.id=<ID>&auth.signature=<signature generated above>&auth.expires=<signature expiry in seconds since epoch>&user.id=<user>
So if your partner ID is test_account and your key is ajk84Hjk93h59skaAJ8732 and you want to generate a read-only signature that expires on Wed Dec 06 2017 09:20:29 GMT-0500 (Eastern Standard Time)...
Your message would be: 1512570029\n\nGET
Your signature would be a base64 encoding of the HMAC SHA-256 hash of the message: Sdcfa9xgRAUzQnlLik5nKj1ntqdB85jFYyFCkNxwD/M=
URL encoding each parameter value and assembling the parameters together, the authentication portion of the URL would be: &partner.id=test_account&auth.signature=Sdcfa9xgRAUzQnlLik5nKj1ntqdB85jFYyFCkNxwD%2FM%3D&auth.expires=1512570029
You can use the following code examples as a starting point for constructing an authentication signature for use when calling AB Connect. Note that these examples do not necessarily follow coding best-practices - e.g. they do not have proper error handling in place. They are intended to be simple examples to show the concepts necessary to perform API authentication. Also note that these examples don't include any method or resource limiters in the signature.
Due to the nature of web clients, anything available to the client application can be accessed by the user. The user can view the source and use Inspect/Developer mode to access variable values, etc. For this reason, you need to be particularly careful with security measures. If you are accessing AB Connect directly from a web client, consider the following when creating your signatures:
Keep your partner key secret. Don't send it to the web client for any reason. If someone malicious gets a hold of your partner key, they can create any signature they want at any time they want and do damage to your Asset profiles. If you suspect your partner key has been compromised, contact AB Support and ask to have a new partner key issued.
Keeping your partner key secure means you need to generate the signature on the server side and embed the signature in the page as it is served to the client. Alternatively, you can create a service that generates signatures on request for your web clients. However, if you do that, you'll need to layer your own security model on top of that to ensure the web client making the request has permissions to access the AB Connect signature.
Make the life of the signature reasonably short. What is reasonable for your situation is up to you. Perhaps limit read capabilities to an hour and update (POST, PATCH, DELETE) to a few minutes. One thing to consider what is the user experience with the signature expires. Does the page force a re-load to gain a new token? Does it make an authenticated call to your server via AJAX to renew the signature? Does the user need to re-authenticate or do you trust a session cookie?
Limit the method to the minimum required capabilities. Most web clients will only need read access (e.g. if you are offering the user a Standards or Asset browser). If you need to change permissions, consider creating a separate, short-lived signature for those situations.
See also the C# example project in the authentication folder of our github repository.
See also the Perl example project in the authentication folder of our github repository.
See also the PHP example project in the authentication folder of our github repository.
See also the Python2 example project in the authentication folder of our github repository.
See also the Python3 example project in the authentication folder of our github repository.
See also the VB example project in the authentication folder of our github repository.
See also the Java example project in the authentication folder of our github repository.
See also the NodeJS example project in the authentication folder of our github repository.
{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"guid": "text",
"name": "text",
"filters": {
"ANY_ADDITIONAL_PROPERTY": "anything"
},
"advanced_search": {
"ANY_ADDITIONAL_PROPERTY": "anything"
}
}
}GET /rest/v4.1/asset_collections?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
POST /rest/v4.1/asset_collections?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 58
{
"data": {
"name": "text",
"filters": {},
"advanced_search": {}
}
}GET /rest/v4.1/asset_collections/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
{
// Number of lowest scores to be dropped for each user.
"drop_lowest": 1,
// Number of highest scores to be dropped for each user.
"drop_highest": 1,
// Assignment IDs that should never be dropped.
"never_drop": [33, 17, 24]
}{
// the id of the Assignment Group
"id": 1,
// the name of the Assignment Group
"name": "group2",
// the position of the Assignment Group
"position": 7,
// the weight of the Assignment Group
"group_weight": 20,
// the sis source id of the Assignment Group
"sis_source_id": "1234",
// the integration data of the Assignment Group
"integration_data": {"5678":"0954"},
// the assignments in this Assignment Group (see the Assignment API for a
// detailed list of fields)
"assignments": [],
// the grading rules that this Assignment Group has
"rules": null
}{
// The unique identifier for the report.
"id": 1,
// The type of report.
"report": "sis_export_csv",
// The url to the report download.
"file_url": "https://example.com/some/path",
// The attachment api object of the report. Only available after the report has
// completed.
"attachment": null,
// The status of the report
"status": "complete",
// The date and time the report was created.
"created_at": "2013-12-01T23:59:00-06:00",
// The date and time the report started processing.
"started_at": "2013-12-02T00:03:21-06:00",
// The date and time the report finished processing.
"ended_at": "2013-12-02T00:03:21-06:00",
// The time (in seconds) the report has been waiting to run, has been running so
// far, or took to run to completion, depending on its current state.
"run_time": 33.3,
// The report parameters
"parameters": {"course_id":2,"start_at":"2012-07-13T10:55:20-06:00","end_at":"2012-07-13T10:55:20-06:00"},
// The progress of the report
"progress": 100,
// This is the current line count being written to the report. It updates every
// 1000 records.
"current_line": 12000
}// The parameters returned will vary for each report.
{
// The canvas id of the term to get grades from
"enrollment_term_id": 2,
// If true, deleted objects will be included. If false, deleted objects will be
// omitted.
"include_deleted": false,
// The id of the course to report on
"course_id": 2,
// The sort order for the csv, Options: 'users', 'courses', 'outcomes'.
"order": "users",
// If true, user data will be included. If false, user data will be omitted.
"users": false,
// If true, account data will be included. If false, account data will be
// omitted.
"accounts": false,
// If true, term data will be included. If false, term data will be omitted.
"terms": false,
// If true, course data will be included. If false, course data will be omitted.
"courses": false,
// If true, section data will be included. If false, section data will be
// omitted.
"sections": false,
// If true, enrollment data will be included. If false, enrollment data will be
// omitted.
"enrollments": false,
// If true, group data will be included. If false, group data will be omitted.
"groups": false,
// If true, data for crosslisted courses will be included. If false, data for
// crosslisted courses will be omitted.
"xlist": false,
"sis_terms_csv": 1,
"sis_accounts_csv": 1,
// If true, enrollment state will be included. If false, enrollment state will
// be omitted. Defaults to false.
"include_enrollment_state": false,
// Include enrollment state. Defaults to 'all' Options: ['active'| 'invited'|
// 'creation_pending'| 'deleted'| 'rejected'| 'completed'| 'inactive'| 'all']
"enrollment_state": ["all"],
// The beginning date for submissions. Max time range is 2 weeks.
"start_at": "2012-07-13T10:55:20-06:00",
// The end date for submissions. Max time range is 2 weeks.
"end_at": "2012-07-13T10:55:20-06:00"
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/<account_id>/reports/[
{
"report":"student_assignment_outcome_map_csv",
"title":"Student Competency",
"parameters":null,
"last_run": {
"id": 1,
"report": "student_assignment_outcome_map_csv",
"file_url": "https://example.com/some/path",
"status": "complete",
"created_at": "2013-12-01T23:59:00-06:00",
"started_at": "2013-12-02T00:03:21-06:00",
"ended_at": "2013-12-02T00:03:21-06:00"
},
{
"report":"grade_export_csv",
"title":"Grade Export",
"parameters":{
"term":{
"description":"The canvas id of the term to get grades from",
"required":true
}
},
"last_run": null
}
]curl -X POST \
https://<canvas>/api/v1/accounts/1/reports/provisioning_csv \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: multipart/form-data' \
-F 'parameters[users]=true' \
-F 'parameters[courses]=true' \
-F 'parameters[enrollments]=true'curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/<account_id>/reports/<report_type>curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/accounts/<account_id>/reports/<report_type>/<report_id>curl -H 'Authorization: Bearer <token>' \
-X DELETE \
https://<canvas>/api/v1/accounts/<account_id>/reports/<report_type>/<id>curl -H 'Authorization: Bearer <token>' \
-X PUT \
https://<canvas>/api/v1/accounts/<account_id>/reports/<report_type>/<id>/abortaccount_notification_roles: ["StudentEnrollment", "TeacherEnrollment"]account_notification_roles: ["StudentEnrollment", "TeacherEnrollment"] using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
var partnerID = "public"; // ID provided by AB.
var partnerKey = "2jfaWErgt2+o48gsk302kd"; // Key provided by AB.
var userID = "Bob"; // Optional. Partner defined string. Provides access only for queries with this `user.id`.
// Seconds since epoch. Example is 24 hours.
var expires = (long)Math.Floor(
(DateTime.UtcNow.AddHours(24) - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
);
var message = string.Format("{0}\n{1}", expires, userID);
var keyBytes = Encoding.UTF8.GetBytes(partnerKey);
var messageBytes = Encoding.UTF8.GetBytes(message);
string signature;
using (var hmac = new HMACSHA256(keyBytes))
{
signature = Convert.ToBase64String(hmac.ComputeHash(messageBytes));
}
var requestBuilder = new UriBuilder("https://api.abconnect.instructure.com/rest/v4.1/standards");
// user.id is optional
requestBuilder.Query = string.Format(
"partner.id={0}&auth.signature={1}&auth.expires={2}&user.id={3}",
WebUtility.UrlEncode(partnerID),
WebUtility.UrlEncode(signature),
expires,
WebUtility.UrlEncode(userID)
);
var request = WebRequest.Create(requestBuilder.Uri);
Console.WriteLine(new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd());
}
} #!/usr/bin/perl
use strict;
use Digest::SHA qw(hmac_sha256_base64);
use LWP::UserAgent;
my $partner_id = 'public'; # ID provided by AB.
my $partner_key = '2jfaWErgt2+o48gsk302kd'; # Key provided by AB.
my $expires = time() + 86400; # Seconds since epoch. Example is 24 hours.
my $user_id = 'Bob'; # Optional. Partner defined string. Provides access only for queries with this `user.id`.
my $message = "$expires\n$user_id";
my $signature = hmac_sha256_base64($message, $partner_key);
my $uri = URI->new();
$uri->scheme('https');
$uri->host('api.abconnect.instructure.com');
$uri->port(443);
$uri->path('rest/v4.1/standards');
# user.id is optional
$uri->query_form(
'partner.id' => $partner_id,
'auth.signature' => $signature,
'auth.expires' => $expires,
'user.id' => $user_id
);
my $req = HTTP::Request->new(GET => $uri);
my $ua = LWP::UserAgent->new();
my $response = $ua->request($req);
print 'response code = '.$response->{_rc}."\n";
if ($response->{_rc} && ($response->{_rc} == 200)) {
if ($response->{_content}) {
print $response->{_content};
}
} <!DOCTYPE html>
<HTML>
<HEAD>
</HEAD>
<BODY>
<?php
$partnerID = 'public'; // ID provided by AB.
$partnerKey = '2jfaWErgt2+o48gsk302kd'; // Key provided by AB.
$authExpires = time() + 3600; // Seconds since epoch. Example is 1 hour. Keep this shorter due to web exposure.
$userID = 'Bob'; // Optional. Partner defined string. Provides access only for queries with this `user.id`.
$url = 'https://api.abconnect.instructure.com/rest/v4.1/standards?';
$url .= 'partner.id=' . $partnerID;
// "GET" results read only signature to minimize security risks with web client exposure.
$message = $authExpires . "\n" . $userID . "\n" . "GET";
$sig = urlencode(base64_encode(hash_hmac('sha256', $message, $partnerKey, true))); // build the signature with the key
$url .= '&auth.signature=' . $sig;
$url .= '&auth.expires=' . $authExpires;
if ($url) {
$url .= '&user.id=' . $userID;
}
print '<H3>Generated Request URL</H3>';
print '<P>' . $url . '</P><BR />';
$response = file_get_contents($url);
print '<H3>JSON Response</H3>';
print '<P>' . $response . '</P>';
?>
</BODY>
</HTML> import time
import hashlib
import hmac
import base64
import urllib
partner_id = 'public' # ID provided by AB.
partner_key = '2jfaWErgt2+o48gsk302kd' # Key provided by AB.
expires = str(int(time.time() + 86400)) # Seconds since epoch. Example expires in 24 hours.
user_id = 'Bob' # Optional. Partner defined string. Provides access only for queries with this `user.id`.
message = expires + "\n" + user_id
digest = hmac.new(partner_key.encode(), message.encode(), digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
encoded_sig = urllib.quote_plus(signature)
# user.id is optional
parms = 'partner.id=' + partner_id + \
'&auth.signature=' + encoded_sig + \
'&auth.expires=' + expires + \
'&user.id=' + user_id
result = urllib.urlopen('https://api.abconnect.instructure.com/rest/v4.1/standards?' + parms).read()
print result import time
import hashlib
import hmac
import base64
import urllib.request
partner_id = 'public' # ID provided by AB.
partner_key = '2jfaWErgt2+o48gsk302kd' # Key provided by AB.
expires = str(int(time.time() + 86400)) # Seconds since epoch. Example expires in 24 hours.
user_id = 'Bob' # Optional. Partner defined string. Provides access only for queries with this `user.id`.
message = expires + "\n" + user_id
digest = hmac.new(partner_key.encode(), message.encode(), digestmod=hashlib.sha256).digest()
signature = base64.b64encode(digest).decode()
encoded_sig = urllib.parse.quote_plus(signature)
# user.id is optional
parms = 'partner.id=' + partner_id + \
'&auth.signature=' + encoded_sig + \
'&auth.expires=' + expires + \
'&user.id=' + user_id
result = urllib.request.urlopen('https://api.abconnect.instructure.com/rest/v4.1/standards?' + parms).read()
print (result) Imports System.Security.Cryptography
Imports System.Text
Imports System.Net
Imports System.IO
Module AuthModule
Sub Main()
Dim PartnerId As String = "public" ' ID provided by AB.
Dim PartnerKey As String = "2jfaWErgt2+o48gsk302kd" ' Key provided by AB.
Dim UserId As String = "Bob" ' Optional. Partner defined string. Provides access only for queries with this `user.id`.
' Seconds since epoch. Example is 24 hours.
Dim Expires = Math.Floor(
(DateTime.UtcNow.AddHours(24) - New DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds
)
Dim Message = Expires & vbLf & UserId
Dim KeyBytes() As Byte = Encoding.UTF8.GetBytes(PartnerKey)
Dim MessageBytes() As Byte = Encoding.UTF8.GetBytes(Message)
Dim Signature As String
Using myHMACSHA256 As New HMACSHA256(KeyBytes)
Signature = Convert.ToBase64String(myHMACSHA256.ComputeHash(MessageBytes))
End Using
Dim RequestBuilder As New UriBuilder("https://api.abconnect.instructure.com/rest/v4.1/standards")
' user.id is optional
RequestBuilder.Query = String.Format(
"partner.id={0}&auth.signature={1}&auth.expires={2}&user.id={3}",
WebUtility.UrlEncode(PartnerId),
WebUtility.UrlEncode(Signature),
Expires,
WebUtility.UrlEncode(UserId)
)
Dim Request = WebRequest.Create(RequestBuilder.Uri)
Dim Response As WebResponse = Request.GetResponse()
Dim ReceiveStream As Stream = Response.GetResponseStream()
Dim Encode As Encoding = Encoding.GetEncoding("utf-8")
Dim ReadStream As New StreamReader(ReceiveStream, Encode)
Dim ReadBuffer(256) As [Char]
Dim Count As Integer = ReadStream.Read(ReadBuffer, 0, 256)
While Count > 0
Dim StringData As New [String](ReadBuffer, 0, Count)
Console.Write(StringData)
Count = ReadStream.Read(ReadBuffer, 0, 256)
End While
Console.WriteLine("")
End Sub
End Module package AuthExample;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.Calendar;
import java.util.TimeZone;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
public class program {
public static void main(String[] args) {
String partnerID = "public"; // ID provided by AB.
String partnerKey = "2jfaWErgt2+o48gsk302kd"; // Key provided by AB.
String userID = "Bob"; // Optional. Partner defined string. Provides access only for queries with this `user.id`.
// Seconds since epoch. Example is 24 hours.
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
long expires = (long)Math.floor(cal.getTimeInMillis() / 1000) + 60*60*24;
String message = String.format("%d\n%s", expires, userID); // format message for signature
HttpsURLConnection connection = null;
try {
//
// generate signature and base64 encode it
//
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(partnerKey.getBytes("UTF-8"), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] hmacBytes = sha256_HMAC.doFinal(message.getBytes("UTF8"));
String signature = Base64.getEncoder().encodeToString(hmacBytes);
//
// pack the signature and other auth parameters in URL
//
String targetURL = String.format(
"https://api.abconnect.instructure.com/rest/v4.1/standards?partner.id=%s&auth.signature=%s&auth.expires=%d&user.id=%s",
URLEncoder.encode(partnerID, "UTF-8"),
URLEncoder.encode(signature, "UTF-8"),
expires,
URLEncoder.encode(userID, "UTF-8")
);
//
//Create connection
//
URL url = new URL(targetURL);
connection = (HttpsURLConnection) url.openConnection();
//
// Get Response
//
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = rd.readLine()) != null) {
System.out.println(line);
}
rd.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
} finally {
if (connection != null) {
connection.disconnect();
}
}
}
} #!/usr/bin/env node
var partner_id = 'public' // ID provided by AB.
var partner_key = '2jfaWErgt2+o48gsk302kd' // Key provided by AB.
var expires = Math.floor(Date.now() / 1000) + 86400; // Seconds since epoch. Example expires in 24 hours.
var user_id = 'Bob' // Optional. Partner defined string. Provides access only for queries with this `user.id`.
//
// Build the signature
//
var message = '' + expires;
if (user_id) {
message += "\n" + user_id;
}
var crypto = require('crypto');
var signature = crypto.createHmac('SHA256', partner_key).update(message).digest('base64')
//
// package the signature, expiration, etc. into a URL encoded query string fragment
//
var queryString = '&partner.id=' + encodeURIComponent(partner_id) + '&auth.signature=' + encodeURIComponent(signature) + '&auth.expires=' + encodeURIComponent(expires);
if (user_id) {
queryString += '&user.id=' + encodeURIComponent(user_id);
}
console.log("Authentication parameters: " + queryString);
var requester = require('sync-request');
var response;
var body;
try {
response = requester('GET', 'https://api.abconnect.instructure.com/rest/v4.1/standards?' + queryString);
body = response.getBody('utf-8');
} catch (e) {
console.log('' + e);
}
if (response) console.log("Response code: " + response.statusCode);
if (body) console.log("Response body:\n" + body);A DeveloperKey object looks like:
GET /api/v1/accounts/:account_id/developer_keys
Scope: url:GET|/api/v1/accounts/:account_id/developer_keys
List all developer keys created in the current account.
Request Parameters:
inherited
boolean
Defaults to false. If true, lists keys inherited from Site Admin (and consortium parent account, if applicable).
Returns a list of DeveloperKey objects.
POST /api/v1/accounts/:account_id/developer_keys
Scope: url:POST|/api/v1/accounts/:account_id/developer_keys
Create a new Canvas API key. Creating an LTI 1.3 registration is not supported here and should be done via the LTI Registration API.
Request Parameters:
developer_key
Required json
no description
developer_key[auto_expire_tokens]
boolean
Defaults to false. If true, access tokens generated by this key will expire after 1 hour.
developer_key[email]
string
Contact email for the key.
developer_key[icon_url]
string
URL for a small icon to display in key list.
Returns a DeveloperKey object.
PUT /api/v1/developer_keys/:id
Scope: url:PUT|/api/v1/developer_keys/:id
Update an existing Canvas API key. Updating an LTI 1.3 registration is not supported here and should be done via the LTI Registration API.
Request Parameters:
developer_key
Required json
no description
developer_key[auto_expire_tokens]
boolean
Defaults to false. If true, access tokens generated by this key will expire after 1 hour.
developer_key[email]
string
Contact email for the key.
developer_key[icon_url]
string
URL for a small icon to display in key list.
Returns a DeveloperKey object.
DELETE /api/v1/developer_keys/:id
Scope: url:DELETE|/api/v1/developer_keys/:id
Delete an existing Canvas API key. Deleting an LTI 1.3 registration should be done via the LTI Registration API.
Returns a DeveloperKey object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
A Module object looks like:
A ModuleItem object looks like:
A Progress object looks like:
GET /api/v1/courses/:course_id/course_pacing/:id
Scope: url:GET|/api/v1/courses/:course_id/course_pacing/:id
Returns a course pace for the course and pace id provided
Request Parameters:
course_id
Required integer
The id of the course
course_pace_id
Required integer
The id of the course_pace
Example Request:
Returns a CoursePace object.
POST /api/v1/courses/:course_id/course_pacing
Scope: url:POST|/api/v1/courses/:course_id/course_pacing
Creates a new course pace with specified parameters.
Request Parameters:
course_id
Required integer
The id of the course
end_date
Datetime
End date of the course pace
end_date_context
string
End date context (course, section, hupothetical)
start_date
Datetime
Start date of the course pace
Example Request:
Returns a CoursePace object.
PUT /api/v1/courses/:course_id/course_pacing/:id
Scope: url:PUT|/api/v1/courses/:course_id/course_pacing/:id
Returns the updated course pace
Request Parameters:
course_id
Required integer
The id of the course
course_pace_id
Required integer
The id of the course pace
end_date
Datetime
End date of the course pace
exclude_weekends
boolean
Course pace dates excludes weekends if true
Example Request:
Returns a CoursePace object.
DELETE /api/v1/courses/:course_id/course_pacing/:id
Scope: url:DELETE|/api/v1/courses/:course_id/course_pacing/:id
Returns the updated course pace
Request Parameters:
course_id
Required integer
The id of the course
course_pace_id
Required integer
The id of the course_pace
Example Request:
Returns a CoursePace object.
This documentation is generated directly from the Canvas LMS source code, available on Github.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Developer keys issued after Oct 2015 generate tokens with a 1 hour expiration. Applications must use to generate new access tokens.
Parameters
See of the OAuth2 RFC for more information about this process.
Parameters
Canvas API example responses
For grant_type of code or refresh_token:
When using grant_type=code (ex: for Canvas API access):
When using grant_type=refresh_token, the response will not contain a new refresh token since the same refresh token can be used multiple times:
If scope=/auth/userinfo was specified in the request (ex: when using Canvas as an authentication service) then the response that results from would be:
Examples using client_credentials
When using grant_type=client_credentials (ex: ):
Example request
This request must be signed by an RSA256 private key with a public key that is configured on the developer key as described in .
Below is an example of the decoded client_assertion JWT in the above request:
NOTE:
the value of the sub claim should match the client_id of the developer key in Canvas.
the value of the aud claim should contain either the domain of the Canvas account where the desired data resides, or the domain of the LTI 1.3 OIDC Auth endpoint, as described .
if the public key defined on the developer key is a JWK set (specified by an URL) the kid (key ID) value in the signed JWT header must match one of the public keys returned by the public key URL.
Example Response
If your application supports logout functionality, you can revoke your own access token. This is useful for security reasons, as well as removing your application from the list of tokens on the user's profile page. Simply make an authenticated request to the following endpoint by including an Authorization header or providing the access_token as a request parameter.
Parameters
Example responses
If your application needs to begin a normal web session in order to access features not supported via API (such as quiz taking), you can use your API access token in order to get a time-limited URL that can be fed to a browser or web view to begin a new web session.
Parameters
Example responses
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Developer keys issued after Oct 2015 generate tokens with a 1 hour expiration. Applications must use to generate new access tokens.
is a protocol designed to let third-party applications authenticate to perform actions as a user, without getting the user's password. Canvas uses OAuth2 (specifically ) for authentication and authorization of the Canvas API. Additionally, Canvas uses OAuth2 for service authentication (as described in the ).
When appropriate, applications should store the token locally, rather than requesting a new token for the same user each time the user uses the application. If the token is deleted or expires, the application will get a 401 Unauthorized error from the API, in which case the application should perform the OAuth flow again to receive a new token. You can differentiate this 401 Unauthorized from other cases where the user simply does not have permission to access the resource by checking that the WWW-Authenticate header is set.
Storing a token is in many ways equivalent to storing the user's password, so tokens should be stored and used in a secure manner, including but not limited to:
Don't embed tokens in web pages.
Don't pass tokens or session IDs around in URLs.
Properly secure the database or other data store containing the tokens.
For web applications, practice proper techniques to avoid session attacks such as cross-site scripting, request forgery, replay attacks, etc.
For testing your application before you've implemented OAuth, the simplest option is to generate an access token on your user's profile page. Note that asking any other user to manually generate a token and enter it into your application is a violation of . Applications in use by multiple users MUST use OAuth to obtain tokens.
To manually generate a token for testing:
Click the "profile" link in the top right menu bar, or navigate to /profile
Under the "Approved Integrations" section, click the button to generate a new access token.
Once the token is generated, you cannot view it again, and you'll have to generate a new token if you forget it. Remember that access tokens are password equivalent, so keep it secret.
Your application can rely on canvas for a user's identity. During step 1 of the web application flow below, specify the optional scope parameter as scope=/auth/userinfo. When the user is asked to grant your application access in step 2 of the web application flow, they will also be given an option to remember their authorization. If they grant access and remember the authorization, Canvas will skip step 2 of the request flow for future requests.
Canvas will not give a token back as part of a userinfo request. It will only provide the current user's name and id.
If your application will be used by others, you will need to implement the full OAuth2 token request workflow, so that you can request an access token for each user of your application.
Performing the OAuth2 token request flow requires an application client ID and client secret. To obtain these application credentials, you will need to register your application. The client secret should never be shared.
For Canvas Cloud (hosted by Instructure), developer keys are .
NOTE for LTI providers: Since developer keys are scoped to the institution they are issued from, tool providers that serve multiple institutions should store and look up the correct developer key based on the launch parameters (eg. custom_canvas_api_domain) sent during the LTI launch.
For , you can and secret in the Site Admin account of your Canvas install.
A basic request looks like:
See for details.
If the user accepts your request, Canvas redirects back to your request_uri with a specific query string, containing the OAuth2 response:
The app can then extract the code, and use it along with the client_id and client_secret to obtain the final access_key.
If your application passed a state parameter in step 1, it will be returned here in step 2 so that your app can tie the request and response together, whether the response was successful or an error occurred.
If the user doesn't accept the request for access, or if another error occurs, Canvas redirects back to your request_uri with an error parameter, rather than a code parameter, in the query string.
A list of possible error codes is found in the .
Canvas redirects to a page on canvas with a specific query string, containing parameters from the OAuth2 response:
At this point the app should notice that the URL of the webview has changed to contain code=<code> somewhere in the query string. The app can then extract the code, and use it along with the client_id and client_secret to obtain the final access_key.
To get a new access token and refresh token, send a with the following parameters:
Parameters
Note that the once the code issued in step 2 is used in a POST request to this endpoint, it is invalidated and further requests for tokens with the same code will fail.
Once you have an OAuth access token, you can use it to make API requests. If possible, using the HTTP Authorization header is recommended.
OAuth2 Token sent in header:
Sending the access token in the query string or POST parameters is also supported, but discouraged as it increases the chances of the token being logged or leaked in transit.
OAuth2 Token sent in query string:
Access tokens have a 1 hour lifespan. When the refresh flow is taken, Canvas will update the access token to a new value, reset the expiration timer, and return the new access token as part of the response. When refreshing tokens the user will not be asked to authorize the application again.
To refresh the access token, send a with the following parameters:
Parameters
The response to this request will not contain a new refresh token; the same refresh token is to be reused.
To logout, simply send a
LTI Advantage services, such as and , require use of a client credentials grant flow for request authentication. This workflow is best summarized on the IMS Security Framework (specifically ).
Our goal here is to highlight some nuances that might help you access these services in Canvas, rather than describing the specification in detail.
Before the client_credentials grant flow can be achieved, an . During developer key configuration, a public JWK can either be configured statically or can be dynamically rotated by providing JWKs by a URL that Canvas can reach. Tools may also use a previously issued client_credentials token to . The JWK must include an alg and use.
Example JWK
Once the developer key is configured and turned on, your tool can . This request must be signed by an RSA256 private key with a public key that is configured on the developer key as described in .
Once you have an access token, you can use it to make LTI service requests. The access token must be included as a Bearer token in the Authorization header:
Access tokens only work in the context of where a tool has been deployed. Tools can only access line items that are associated with their tool.
The following endpoints are currently supported:
This documentation is generated directly from the Canvas LMS source code, available .
// a Canvas API key (or LTI 1.3 registration)
{
// The Canvas ID of the DeveloperKey object
"id": 1,
// The display name
"name": "Test Key",
// Timestamp of the key's creation
"created_at": "2025-05-30T17:09:18Z",
// Timestamp of the key's last update
"updated_at": "2025-05-30T17:09:18Z",
// The state of the key
"workflow_state": "active",
// True if key represents an LTI 1.3 Registration. False for Canvas API keys
"is_lti_key": false,
// Contact email configured for key
"email": "[email protected]",
// URL for a small icon to display in key list
"icon_url": "https://example.com/icon.png",
// User-provided notes about key
"notes": "this key is for testing",
// User-specified code representing the vendor that uses the key
"vendor_code": "Google",
// The name of the account that owns the key
"account_name": "Test Account",
// True for all keys except Site Admin-level keys, which default to false.
// Controls visibility in the Inherited tab.
"visible": true,
// List of API endpoints key is allowed to access (API keys), or LTI 1.3 scopes
// (LTI keys)
"scopes": ["url:GET|/api/v1/accounts"],
// Deprecated in favor of redirect_uris. Do not use.
"redirect_uri": "no",
// List of URLs used during OAuth2 flow to validate given redirect URI (API
// keys), or to redirect to after login (LTI keys)
"redirect_uris": ["https://mytool.com/oauth2/redirect", "https://mytool.com/1_3/launch"],
// (API keys only) The number of active access tokens associated with the key
"access_token_count": 42,
// (API keys only) The last time an access token for this key was used in an API
// request
"last_used_at": "2025-05-30T17:09:18Z",
// (API keys only) If true, key is only usable in non-production environments
// (test, beta). Avoids problems with beta refresh.
"test_cluster_only": false,
// (API keys only) If true, allows `includes` parameters in API requests that
// match the scopes of this key
"allow_includes": true,
// (API keys only) If true, then token requests with this key must include
// scopes
"require_scopes": false,
// (API keys only) Used in OAuth2 client credentials flow to specify the
// audience for the access token
"client_credentials_audience": "external",
// (API keys only) The client secret used in the OAuth authorization_code flow.
"api_key": "sd45fg64....",
// (LTI keys only) The Canvas-style tool configuration for this key.
"tool_configuration": {"type":"Lti::ToolConfiguration"},
// (LTI keys only) The tool's public JWK in JSON format. Discouraged in favor of
// a url hosting a JWK set.
"public_jwk": {"e":"AQAB","etc":"etc"},
// (LTI keys only) The tool-hosted URL containing its public JWK keyset. Canvas
// may cache JWKs up to 5 minutes.
"public_jwk_url": "https://mytool.com/1_3/jwks",
// (LTI keys only) The LTI IMS Registration object for this key, if key was
// created via Dynamic Registration.
"lti_registration": {"type":"TODO Lti::IMS::Registration"},
// (LTI keys only) Returns true if key was created via Dynamic Registration.
"is_lti_registration": false,
// Unused.
"user_name": "",
// Unused.
"user_id": "",
// Correlates an API key to a product configuration.
"unified_tool_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
}{
// the ID of the course pace
"id": 5,
// the ID of the course
"course_id": 5,
// the ID of the user for this course pace
"user_id": 10,
// the state of the course pace
"workflow_state": "active",
// boolean value depending on exclude weekends setting
"exclude_weekends": true,
// array of strings representing the days of the work week
"selected_days_to_skip": [fri, sat],
// set if the end date is set from course
"hard_end_dates": true,
// date when course pace is created
"created_at": "2013-01-23T23:59:00-07:00",
// course end date
"end_date": "2013-01-23T23:59:00-07:00",
// date when course pace is updated
"updated_at": "2013-01-23T23:59:00-07:00",
// date when course pace is published
"published_at": "2013-01-23T23:59:00-07:00",
// the root account ID for this course pace
"root_account_id": 10,
// course start date
"start_date": "2013-01-23T23:59:00-07:00",
// list of modules and items for this course pace
"modules": null,
// progress of pace publishing
"progress": null
}{
// the ID of the module
"id": 5,
// the name of the module
"name": "Module 1",
// the position of the module
"position": 5,
// list of module items
"items": null,
// the ID of the context for this course pace
"context_id": 10,
// The given context for the course pace
"context_type": "Course"
}{
// the ID of the module item
"id": 5,
// the duration of the module item
"duration": 5,
// the course pace id of the module item
"course_pace_id": 5,
// the root account id of the module item
"root_account_id": 5,
// the module item id of the module item
"module_item_id": 5,
// The title of the item assignment
"assignment_title": "Assignment 9",
// The points of the item
"points_possible": 10.0,
// The link of the item assignment
"assignment_link": "/courses/105/modules/items/264",
// the current position of the module item
"position": 5,
// The module item type of the item assignment
"module_item_type": "Assignment",
// published boolean value for course pace
"published": true
}{
// the ID of the Progress object
"id": 1,
// the context owning the job.
"context_id": 1,
"context_type": "Account",
// the id of the user who started the job
"user_id": 123,
// the type of operation
"tag": "course_batch_update",
// percent completed
"completion": 100,
// the state of the job one of 'queued', 'running', 'completed', 'failed'
"workflow_state": "completed",
// the time the job was created
"created_at": "2013-01-15T15:00:00Z",
// the time the job was last updated
"updated_at": "2013-01-15T15:04:00Z",
// optional details about the job
"message": "17 courses processed",
// optional results of the job. omitted when job is still pending
"results": {"id":"123"},
// url where a progress update can be retrieved
"url": "https://canvas.example.edu/api/v1/progress/1"
}curl https://<canvas>/api/v1/courses/1/course_pacing/1 \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/course_pacing \
-X POST \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/course_pacing/1 \
-X PUT \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/course_pacing/1 \
-X DELETE \
-H 'Authorization: Bearer <token>'developer_key[name]
string
The display name.
developer_key[notes]
string
User-provided notes about the key.
developer_key[redirect_uri]
string
Deprecated in favor of redirect_uris. Do not use.
developer_key[redirect_uris]
array
List of URLs used during OAuth2 flow to validate given redirect URI.
developer_key[vendor_code]
string
User-specified code representing the vendor that uses the key.
developer_key[visible]
boolean
Defaults to true. If false, key will not be visible in the UI.
developer_key[test_cluster_only]
boolean
Defaults to false. If true, key is only usable in non-production environments (test, beta). Avoids problems with beta refresh.
developer_key[client_credentials_audience]
string
Used in OAuth2 client credentials flow to specify the audience for the access token.
developer_key[scopes]
array
List of API endpoints key is allowed to access.
developer_key[require_scopes]
boolean
If true, then token requests with this key must include scopes.
developer_key[allow_includes]
boolean
If true, allows ‘includes` parameters in API requests that match the scopes of this key.
developer_key[name]
string
The display name.
developer_key[notes]
string
User-provided notes about the key.
developer_key[redirect_uri]
string
Deprecated in favor of redirect_uris. Do not use.
developer_key[redirect_uris]
array
List of URLs used during OAuth2 flow to validate given redirect URI.
developer_key[vendor_code]
string
User-specified code representing the vendor that uses the key.
developer_key[visible]
boolean
Defaults to true. If false, key will not be visible in the UI.
developer_key[test_cluster_only]
boolean
Defaults to false. If true, key is only usable in non-production environments (test, beta). Avoids problems with beta refresh.
developer_key[client_credentials_audience]
string
Used in OAuth2 client credentials flow to specify the audience for the access token.
developer_key[scopes]
array
List of API endpoints key is allowed to access.
developer_key[require_scopes]
boolean
If true, then token requests with this key must include scopes.
developer_key[allow_includes]
boolean
If true, allows ‘includes` parameters in API requests that match the scopes of this key.
start_date_context
string
Start date context (course, section, hupothetical)
exclude_weekends
boolean
Course pace dates excludes weekends if true
selected_days_to_skip
string
Array
Course pace dates excludes weekends if true
hard_end_dates
boolean
Course pace uess hard end dates if true
workflow_state
string
The state of the course pace
course_pace_module_item_attributes[]
string
Module Items attributes
context_id
integer
Pace Context ID
context_type
string
Pace Context Type (Course, Section, User)
selected_days_to_skip
string
Array
Course pace dates excludes weekends if true
hard_end_dates
boolean
Course pace uess hard end dates if true
workflow_state
string
The state of the course pace
course_pace_module_item_attributes[]
string
Module Items attributes
scope
Optional
This can be used to specify what information the Canvas API access token will provide access to. Canvas API scopes may be found beneath their corresponding endpoints in the "resources" documentation pages. If the developer key does not require scopes and no scope parameter is specified, the access token will have access to all scopes. If the developer key does require scopes and no scope parameter is specified, Canvas will respond with "invalid_scope." To successfully pass multiple scope values, the scope parameter is included once, with multiple values separated by spaces. Passing multiple scope parameters, as is common in other areas of Canvas, causes only the last value to be applied to the generated token.
purpose
Optional
This can be used to help the user identify which instance of an application this token is for. For example, a mobile device application could provide the name of the device.
force_login
Optional
Set to '1' if you want to force the user to enter their credentials, even if they're already logged into Canvas. By default, if a user already has an active Canvas web session, they will not be asked to re-enter their credentials.
unique_id
Optional
Set to the user's username to be populated in the login form in the event that the user must authenticate.
prompt
Optional
If set to none, Canvas will immediately redirect to the redirect_uri. If the caller has a valid session with a "remember me" token or a token from a trusted Developer Key, the redirect will contain a code=XYZ param. If the caller has no session, the redirect will contain an error=login_required param. If the caller has a session, but no "remember me" or trusted token, the redirect will contain an error=interaction_required param.
code
Required for grant_type: authorization_code
Required if grant_type is authorization_code. The code you received in a redirect response.
refresh_token
Required for grant_type: refresh_token
Required if grant_type is refresh_token. The refresh_token you received in a redirect response.
client_assertion_type
Required for grant_type: client_credentials
Currently the only supported value for this field is `urn:ietf:params:oauth:client-assertion-type:jwt-bearer`.
client_assertion
Required for grant_type: client_credentials
The signed jwt used to request an access token. Includes the value of Developer Key id as the sub claim of the jwt body. Should be signed by the private key of the stored public key on the DeveloperKey.
scope
Required for grant_type: client_credentials
A list of scopes to be granted to the token. Currently only IMS defined scopes may be used.
client_id
Required
The client id for your registered application.
response_type
Required
The type of OAuth2 response requested. The only currently supported value is code.
redirect_uri
Required
The URL where the user will be redirected after authorization. The domain of this URL must match the domain of the redirect_uri stored on the developer key, or it must be a subdomain of that domain. For native applications, currently the only supported value is urn:ietf:wg:oauth:2.0:oob, signifying that the credentials will be retrieved out-of-band using an embedded browser or other functionality.
state
Optional
grant_type
Required
Values currently supported: "authorization_code", "refresh_token", and "client_credentials".
client_id
Required for grant_types: authorization_code, refresh_token
The client id for your registered application.
client_secret
Required for grant_types: authorization_code, refresh_token
The client secret for your registered application.
redirect_uri
Required for grant_types: authorization_code, refresh_token
access_token
The OAuth2 Canvas API access token.
token_type
The type of token that is returned.
user
A JSON object of canvas user id and user name.
refresh_token
The OAuth2 refresh token.
expires_in
Seconds until the access token expires.
canvas_region
For hosted Canvas, the AWS region (e.g. us-east-1) in which the institution that provided this token resides. For local or open source Canvas, this will have a value of "unknown". This field is safe to ignore.
access_token
The OAuth2 client_credentials access token.
token_type
The type of token that is returned.
expires_in
Seconds until the access token expires.
scope
The scope or space delimited list of scopes granted for the access token.
expire_sessions
Optional
Set this to '1' if you want to end all of the user's Canvas web sessions. Without this argument, the endpoint will leave web sessions intact.
Additionally, if the user logged in to Canvas via a delegated authentication provider, and the provider supports Single Log Out functionality, the response will contain a forward_url key. If you are still in control of the user's browsing session, it is recommended to then redirect them to this URL, in order to also log them out from where their session originated. Beware that it is unlikely that control will be returned to your application after this redirect.
return_to
Optional
An optional URL to begin the web session at. Otherwise the user will be sent to the dashboard.
Your application can pass Canvas an arbitrary piece of state in this parameter, which will be passed back to your application in Step 2. It's strongly encouraged that your application pass a unique identifier in the state parameter, and then verify in Step 2 that the state you receive back from Canvas is the same expected value. Failing to do this opens your application to the possibility of logging the wrong person in, as .
If a redirect_uri was passed to the initial request in step 1, the same redirect_uri must be given here.
For native applications, take advantage of user keychain stores and other operating system functionality for securely storing passwords.
grant_type
authorization_code
client_id
Your client_id
client_secret
Your client_secret
redirect_uri
If a redirect_uri was passed to the initial request in step 1, the same redirect_uri must be given here.
code
code from canvas
replace_tokens
(optional) If this option is set to `1`, existing access tokens issued for this developer key/secret will be destroyed and replaced with the new token that is returned from this request
grant_type
refresh_token
client_id
Your client_id
client_secret
Your client_secret
refresh_token
refresh_token from initial access_token request
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for retrieving the data exposed in Canvas Analytics
GET /api/v1/accounts/:account_id/analytics/terms/:term_id/activity
Scope: url:GET|/api/v1/accounts/:account_id/analytics/terms/:term_id/activity
GET /api/v1/accounts/:account_id/analytics/current/activity
Scope: url:GET|/api/v1/accounts/:account_id/analytics/current/activity
GET /api/v1/accounts/:account_id/analytics/completed/activity
Scope: url:GET|/api/v1/accounts/:account_id/analytics/completed/activity
Returns page view hits summed across all courses in the department. Two groupings of these counts are returned; one by day (by_date), the other by category (by_category). The possible categories are announcements, assignments, collaborations, conferences, discussions, files, general, grades, groups, modules, other, pages, and quizzes.
This and the other department-level endpoints have three variations which all return the same style of data but for different subsets of courses. All share the prefix /api/v1/accounts/<account_id>/analytics. The possible suffixes are:
Courses not yet offered or which have been deleted are never included.
/current and /completed are intended for use when the account has only one term. /terms/<term_id> is intended for use when the account has multiple terms.
The action follows the suffix.
Example Request:
Example Response:
GET /api/v1/accounts/:account_id/analytics/terms/:term_id/grades
Scope: url:GET|/api/v1/accounts/:account_id/analytics/terms/:term_id/grades
GET /api/v1/accounts/:account_id/analytics/current/grades
Scope: url:GET|/api/v1/accounts/:account_id/analytics/current/grades
GET /api/v1/accounts/:account_id/analytics/completed/grades
Scope: url:GET|/api/v1/accounts/:account_id/analytics/completed/grades
Returns the distribution of grades for students in courses in the department. Each data point is one student’s current grade in one course; if a student is in multiple courses, he contributes one value per course, but if he’s enrolled multiple times in the same course (e.g. a lecture section and a lab section), he only constributes on value for that course.
Grades are binned to the nearest integer score; anomalous grades outside the 0 to 100 range are ignored. The raw counts are returned, not yet normalized by the total count.
Shares the same variations on endpoint as the participation data.
Example Request:
Example Response:
GET /api/v1/accounts/:account_id/analytics/terms/:term_id/statistics
Scope: url:GET|/api/v1/accounts/:account_id/analytics/terms/:term_id/statistics
GET /api/v1/accounts/:account_id/analytics/current/statistics
Scope: url:GET|/api/v1/accounts/:account_id/analytics/current/statistics
GET /api/v1/accounts/:account_id/analytics/completed/statistics
Scope: url:GET|/api/v1/accounts/:account_id/analytics/completed/statistics
Returns numeric statistics about the department and term (or filter).
Shares the same variations on endpoint as the participation data.
Example Request:
Example Response:
GET /api/v1/accounts/:account_id/analytics/terms/:term_id/statistics_by_subaccount
Scope: url:GET|/api/v1/accounts/:account_id/analytics/terms/:term_id/statistics_by_subaccount
GET /api/v1/accounts/:account_id/analytics/current/statistics_by_subaccount
Scope: url:GET|/api/v1/accounts/:account_id/analytics/current/statistics_by_subaccount
GET /api/v1/accounts/:account_id/analytics/completed/statistics_by_subaccount
Scope: url:GET|/api/v1/accounts/:account_id/analytics/completed/statistics_by_subaccount
Returns numeric statistics about the department subaccounts and term (or filter).
Shares the same variations on endpoint as the participation data.
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/activity
Scope: url:GET|/api/v1/courses/:course_id/analytics/activity
Returns page view hits and participation numbers grouped by day through the entire history of the course. Page views is returned as a hash, where the hash keys are dates in the format “YYYY-MM-DD”. The page_views result set includes page views broken out by access category. Participations is returned as an array of dates in the format “YYYY-MM-DD”.
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/assignments
Scope: url:GET|/api/v1/courses/:course_id/analytics/assignments
Returns a list of assignments for the course sorted by due date. For each assignment returns basic assignment information, the grade breakdown, and a breakdown of on-time/late status of homework submissions.
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/student_summaries
Scope: url:GET|/api/v1/courses/:course_id/analytics/student_summaries
Returns a summary of per-user access information for all students in a course. This includes total page views, total participations, and a breakdown of on-time/late status for all homework submissions in the course.
Each student’s summary also includes the maximum number of page views and participations by any student in the course, which may be useful for some visualizations (since determining maximums client side can be tricky with pagination).
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/users/:student_id/activity
Scope: url:GET|/api/v1/courses/:course_id/analytics/users/:student_id/activity
Returns page view hits grouped by hour, and participation details through the entire history of the course.
‘page_views` are returned as a hash, where the keys are iso8601 dates, bucketed by the hour. `participations` are returned as an array of hashes, sorted oldest to newest.
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/users/:student_id/assignments
Scope: url:GET|/api/v1/courses/:course_id/analytics/users/:student_id/assignments
Returns a list of assignments for the course sorted by due date. For each assignment returns basic assignment information, the grade breakdown (including the student’s actual grade), and the basic submission information for the student’s submission if it exists.
Example Request:
Example Response:
GET /api/v1/courses/:course_id/analytics/users/:student_id/communication
Scope: url:GET|/api/v1/courses/:course_id/analytics/users/:student_id/communication
Returns messaging “hits” grouped by day through the entire history of the course. Returns a hash containing the number of instructor-to-student messages, and student-to-instructor messages, where the hash keys are dates in the format “YYYY-MM-DD”. Message hits include Conversation messages and comments on homework submissions.
Example Request:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available .
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
Configure blueprint courses
A BlueprintTemplate object looks like:
A BlueprintMigration object looks like:
A BlueprintRestriction object looks like:
A ChangeRecord object looks like:
An ExceptionRecord object looks like:
A BlueprintSubscription object looks like:
GET /api/v1/courses/:course_id/blueprint_templates/:template_id
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id
Using ‘default’ as the template_id should suffice for the current implmentation (as there should be only one template per course). However, using specific template ids may become necessary in the future
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/blueprint_templates/:template_id/associated_courses
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id/associated_courses
Returns a list of courses that are configured to receive updates from this blueprint
Example Request:
Returns a list of objects.
PUT /api/v1/courses/:course_id/blueprint_templates/:template_id/update_associations
Scope: url:PUT|/api/v1/courses/:course_id/blueprint_templates/:template_id/update_associations
Send a list of course ids to add or remove new associations for the template. Cannot add courses that do not belong to the blueprint course’s account. Also cannot add other blueprint courses or courses that already have an association with another blueprint course.
After associating new courses, to populate their contents from the blueprint.
Request Parameters:
Example Request:
POST /api/v1/courses/:course_id/blueprint_templates/:template_id/migrations
Scope: url:POST|/api/v1/courses/:course_id/blueprint_templates/:template_id/migrations
Begins a migration to push recently updated content to all associated courses. Only one migration can be running at a time.
Request Parameters:
Example Request:
Returns a object.
PUT /api/v1/courses/:course_id/blueprint_templates/:template_id/restrict_item
Scope: url:PUT|/api/v1/courses/:course_id/blueprint_templates/:template_id/restrict_item
If a blueprint course object is restricted, editing will be limited for copies in associated courses.
Request Parameters:
Example Request:
GET /api/v1/courses/:course_id/blueprint_templates/:template_id/unsynced_changes
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id/unsynced_changes
Retrieve a list of learning objects that have changed since the last blueprint sync operation. If no syncs have been completed, a ChangeRecord with a change_type of initial_sync is returned.
Returns a list of objects.
GET /api/v1/courses/:course_id/blueprint_templates/:template_id/migrations
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id/migrations
Shows a paginated list of migrations for the template, starting with the most recent. This endpoint can be called on a blueprint course. See also .
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/blueprint_templates/:template_id/migrations/:id
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id/migrations/:id
Shows the status of a migration. This endpoint can be called on a blueprint course. See also .
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/blueprint_templates/:template_id/migrations/:id/details
Scope: url:GET|/api/v1/courses/:course_id/blueprint_templates/:template_id/migrations/:id/details
Show the changes that were propagated in a blueprint migration. This endpoint can be called on a blueprint course. See also .
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/blueprint_subscriptions
Scope: url:GET|/api/v1/courses/:course_id/blueprint_subscriptions
Returns a list of blueprint subscriptions for the given course. (Currently a course may have no more than one.)
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations
Scope: url:GET|/api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations
Shows a paginated list of migrations imported into a course associated with a blueprint, starting with the most recent. See also .
Use ‘default’ as the subscription_id to use the currently active blueprint subscription.
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations/:id
Scope: url:GET|/api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations/:id
Shows the status of an import into a course associated with a blueprint. See also .
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations/:id/details
Scope: url:GET|/api/v1/courses/:course_id/blueprint_subscriptions/:subscription_id/migrations/:id/details
Show the changes that were propagated to a course associated with a blueprint. See also .
Example Request:
Returns a list of objects.
This documentation is generated directly from the Canvas LMS source code, available .
{
"access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
"token_type": "Bearer",
"user": {"id":42, "name": "Jimi Hendrix"},
"refresh_token": "tIh2YBWGiC0GgGRglT9Ylwv2MnTvy8csfGyfK2PqZmkFYYqYZ0wui4tzI7uBwnN2",
"expires_in": 3600,
"canvas_region": "us-east-1"
}
{
"access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
"token_type": "Bearer",
"user": {"id":42, "name": "Jimi Hendrix"},
"expires_in": 3600
}
{
"access_token": null,
"token_type": "Bearer",
"user":{"id": 42, "name": "Jimi Hendrix"}
}
{
"grant_type": "client_credentials",
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
"client_assertion": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjIwMTktMDYtMjFUMTQ6NTk6MzBaIn0.eyJpc3MiOiJodHRwczovL3d3dy5teS10b29sLmNvbSIsInN1YiI6Ilx1MDAzY2NsaWVudF9pZFx1MDAzZSIsImF1ZCI6Imh0dHA6Ly9cdTAwM2NjYW52YXNfZG9tYWluXHUwMDNlL2xvZ2luL29hdXRoMi90b2tlbiIsImlhdCI6MTU2MTc1MDAzMSwiZXhwIjoxNTYxNzUwNjMxLCJqdGkiOiJkZmZkYmRjZS1hOWYxLTQyN2ItOGZjYS02MDQxODIxOTg3ODMifQ.lUHCwDqx2ukKQ2vwoz_824IVcyq-rNdJKVpGUiJea5-Ybk_VfyKW5v0ky-4XTJrGHkDcj0T9J8qKfYbikqyetK44yXx1YGo-2Pn2GEZ26bZxCnuDUDhbqN8OZf4T8DnZsYP4OyhOseHERsHCzKF-SD2_Pk6ES5-Z8J55_aMyS3w3tl4nJtwsMm6FbMDp_FhSGE4xTwkBZ2KNM4JqkCwHGX_9KcpsPsHRFQjn9ysTeg-Qf7H2QFgFMFjsfQX-iSL_bQoC2npSz7rQ8awKMhCEYdMYZk2vVhQ7XQ8ysAyf3m1vlLbHjASpztcAB0lz_DJysT0Ep-Rh311Qf_vXHexjVA",
"scope": "https://purl.imsglobal.org/spec/lti-ags/lineitem https://purl.imsglobal.org/spec/lti-ags/result/read"
}
//Header
{
"typ": "JWT",
"alg": "RS256",
"kid": "2019-06-21T14:59:30Z"
}
//Payload
{
"iss": "https://www.my-tool.com",
"sub": "<client_id>",
"aud": "https://<canvas_domain>/login/oauth2/token",
"iat": 1561750031,
"exp": 1561750631,
"jti": "dffdbdce-a9f1-427b-8fca-604182198783"
}
{
"access_token" : "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ3d3cuZXhhbXBsZS5jb20iLCJpYXQiOiIxNDg1OTA3MjAwIiwiZXhwIjoiMTQ4NTkwNzUwMCIsImltc2dsb2JhbC5vcmcuc2VjdXJpdHkuc2NvcGUiOiJMdGlMaW5rU2V0dGluZ3MgU2NvcmUuaXRlbS5QVVQifQ.UWCuoD05KDYVQHEcciTV88YYtWWMwgb3sTbrjwxGBZA",
"token_type" : "Bearer",
"expires_in" : 3600,
"scope" : "https://purl.imsglobal.org/spec/lti-ags/lineitem https://purl.imsglobal.org/spec/lti-ags/result/read"
}
{
"forward_url": "https://idp.school.edu/opaque_url"
}
{
"session_url": "https://canvas.instructure.com/opaque_url"
}
/login/oauth2/auth?code=<code>curl -H "Authorization: Bearer <ACCESS-TOKEN>" "https://canvas.instructure.com/api/v1/courses"curl "https://canvas.instructure.com/api/v1/courses?access_token=<ACCESS-TOKEN>" "public_jwk": {
"kty":"RSA",
"alg":"RS256",
"e":"AQAB",
"kid":"8f796179-7ac4-48a3-a202-fc4f3d814fcd",
"n":"nZA7QWcIwj-3N_RZ1qJjX6CdibU87y2l02yMay4KunambalP9g0fU9yILwLX9WYJINcXZDUf6QeZ-SSbblET-h8Q4OvfSQ7iuu0WqcvBGy8M0qoZ7I-NiChw8dyybMJHgpiP_AyxpCQnp3bQ6829kb3fopbb4cAkOilwVRBYPhRLboXma0cwcllJHPLvMp1oGa7Ad8osmmJhXhN9qdFFASg_OCQdPnYVzp8gOFeOGwlXfSFEgt5vgeU25E-ycUOREcnP7BnMUk7wpwYqlE537LWGOV5z_1Dqcqc9LmN-z4HmNV7b23QZW4_mzKIOY4IqjmnUGgLU9ycFj5YGDCts7Q",
"use":"sig"
}
curl -H "Authorization: Bearer <ACCESS-TOKEN>" "https://<canvas_domain>/api/lti/courses/:course_id/names_and_roles"async
boolean
If async is true, then the course_assignments call can happen asynch- ronously and MAY return a response containing a progress_url key instead of an assignments array. If it does, then it is the caller’s responsibility to poll the API again to see if the progress is complete. If the data is ready (possibly even on the first async call) then it will be passed back normally, as documented in the example response.
sort_column
string
The order results in which results are returned. Defaults to “name”.
Allowed values: name, name_descending, score, score_descending, participations, participations_descending, page_views, page_views_descending
student_id
string
If set, returns only the specified student.
publish_after_initial_sync
boolean
If set, newly associated courses will be automatically published after the sync completes
course_ids_to_add
Array
Courses to add as associated courses
course_ids_to_remove
Array
Courses to remove as associated courses
comment
string
An optional comment to be included in the sync history.
send_notification
boolean
Send a notification to the calling user when the sync completes.
copy_settings
boolean
Whether course settings should be copied over to associated courses. Defaults to true for newly associated courses.
send_item_notifications
boolean
By default, new-item notifications are suppressed in blueprint syncs. If this option is set, teachers and students may receive notifications for items such as announcements and assignments that are created in associated courses (subject to the usual notification settings). This option requires the Blueprint Item Notifications feature to be enabled.
content_type
string
String, “assignment”
content_id
integer
The ID of the object.
restricted
boolean
Whether to apply restrictions.
restrictions
BlueprintRestriction
(Optional) If the object is restricted, this specifies a set of restrictions. If not specified, the course-level restrictions will be used. See Course API update documentation
* /current: includes all available courses in the default term
* /completed: includes all concluded courses in the default term
* /terms/<term_id>: includes all available or concluded courses in the
given term.curl https://<canvas>/api/v1/accounts/<account_id>/analytics/current/activity \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/completed/activity \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/terms/<term_id>/activity \
-H 'Authorization: Bearer <token>'{
"by_date": {
"2012-01-24": 1240,
"2012-01-27": 912,
},
"by_category": {
"announcements": 54,
"assignments": 256,
"collaborations": 18,
"conferences": 26,
"discussions": 354,
"files": 132,
"general": 59,
"grades": 177,
"groups": 132,
"modules": 71,
"other": 412,
"pages": 105,
"quizzes": 356
},
}curl https://<canvas>/api/v1/accounts/<account_id>/analytics/current/grades \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/completed/grades \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/terms/<term_id>/grades \
-H 'Authorization: Bearer <token>'{
"0": 95,
"1": 1,
"2": 0,
"3": 0,
...
"93": 125,
"94": 110,
"95": 142,
"96": 157,
"97": 116,
"98": 85,
"99": 63,
"100": 190
}curl https://<canvas>/api/v1/accounts/<account_id>/analytics/current/statistics \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/completed/statistics \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/terms/<term_id>/statistics \
-H 'Authorization: Bearer <token>'{
"courses": 27,
"subaccounts": 3,
"teachers": 36,
"students": 418,
"discussion_topics": 77,
"media_objects": 219,
"attachments": 1268,
"assignments": 290,
}curl https://<canvas>/api/v1/accounts/<account_id>/analytics/current/statistics_by_subaccount \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/completed/statistics_by_subaccount \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/accounts/<account_id>/analytics/terms/<term_id>/statistics_by_subaccount \
-H 'Authorization: Bearer <token>'{"accounts": [
{
"name": "some string",
"id": 188,
"courses": 27,
"teachers": 36,
"students": 418,
"discussion_topics": 77,
"media_objects": 219,
"attachments": 1268,
"assignments": 290,
}
]}curl https://<canvas>/api/v1/courses/<course_id>/analytics/activity \
-H 'Authorization: Bearer <token>'[
{
"date": "2012-01-24",
"participations": 3,
"views": 10
}
]curl https://<canvas>/api/v1/courses/<course_id>/analytics/assignments \
-H 'Authorization: Bearer <token>'[
{
"assignment_id": 1234,
"title": "Assignment 1",
"points_possible": 10,
"due_at": "2012-01-25T22:00:00-07:00",
"unlock_at": "2012-01-20T22:00:00-07:00",
"muted": false,
"min_score": 2,
"max_score": 10,
"median": 7,
"first_quartile": 4,
"third_quartile": 8,
"tardiness_breakdown": {
"on_time": 0.75,
"missing": 0.1,
"late": 0.15
}
},
{
"assignment_id": 1235,
"title": "Assignment 2",
"points_possible": 15,
"due_at": "2012-01-26T22:00:00-07:00",
"unlock_at": null,
"muted": true,
"min_score": 8,
"max_score": 8,
"median": 8,
"first_quartile": 8,
"third_quartile": 8,
"tardiness_breakdown": {
"on_time": 0.65,
"missing": 0.12,
"late": 0.23
"total": 275
}
}
]curl https://<canvas>/api/v1/courses/<course_id>/analytics/student_summaries \
-H 'Authorization: Bearer <token>'[
{
"id": 2346,
"page_views": 351,
"page_views_level": "1"
"max_page_view": 415,
"participations": 1,
"participations_level": "3",
"max_participations": 10,
"tardiness_breakdown": {
"total": 5,
"on_time": 3,
"late": 0,
"missing": 2,
"floating": 0
}
},
{
"id": 2345,
"page_views": 124,
"participations": 15,
"tardiness_breakdown": {
"total": 5,
"on_time": 1,
"late": 2,
"missing": 3,
"floating": 0
}
}
]curl https://<canvas>/api/v1/courses/<course_id>/analytics/users/<user_id>/activity \
-H 'Authorization: Bearer <token>'{
"page_views": {
"2012-01-24T13:00:00-00:00": 19,
"2012-01-24T14:00:00-00:00": 13,
"2012-01-27T09:00:00-00:00": 23
},
"participations": [
{
"created_at": "2012-01-21T22:00:00-06:00",
"url": "https://canvas.example.com/path/to/canvas",
},
{
"created_at": "2012-01-27T22:00:00-06:00",
"url": "https://canvas.example.com/path/to/canvas",
}
]
}curl https://<canvas>/api/v1/courses/<course_id>/analytics/users/<user_id>/assignments \
-H 'Authorization: Bearer <token>'[
{
"assignment_id": 1234,
"title": "Assignment 1",
"points_possible": 10,
"due_at": "2012-01-25T22:00:00-07:00",
"unlock_at": "2012-01-20T22:00:00-07:00",
"muted": false,
"min_score": 2,
"max_score": 10,
"median": 7,
"first_quartile": 4,
"third_quartile": 8,
"module_ids": [
1,
2
],
"submission": {
"posted_at": "2012-01-23T20:00:00-07:00",
"submitted_at": "2012-01-22T22:00:00-07:00",
"score": 10
}
},
{
"assignment_id": 1235,
"title": "Assignment 2",
"points_possible": 15,
"due_at": "2012-01-26T22:00:00-07:00",
"unlock_at": null,
"muted": true,
"min_score": 8,
"max_score": 8,
"median": 8,
"first_quartile": 8,
"third_quartile": 8,
"module_ids": [
1
],
"submission": {
"posted_at": null,
"submitted_at": "2012-01-22T22:00:00-07:00"
}
}
]curl https://<canvas>/api/v1/courses/<course_id>/analytics/users/<user_id>/communication \
-H 'Authorization: Bearer <token>'{
"2012-01-24":{
"instructorMessages":1,
"studentMessages":2
},
"2012-01-27":{
"studentMessages":1
}
}{
// The ID of the template.
"id": 1,
// The ID of the Course the template belongs to.
"course_id": 2,
// Time when the last export was completed
"last_export_completed_at": "2013-08-28T23:59:00-06:00",
// Number of associated courses for the template
"associated_course_count": 3,
// Details of the latest migration
"latest_migration": null
}{
// The ID of the migration.
"id": 1,
// The ID of the template the migration belongs to. Only present when querying a
// blueprint course.
"template_id": 2,
// The ID of the associated course's blueprint subscription. Only present when
// querying a course associated with a blueprint.
"subscription_id": 101,
// The ID of the user who queued the migration.
"user_id": 3,
// Current state of the content migration: queued, exporting, imports_queued,
// completed, exports_failed, imports_failed
"workflow_state": "running",
// Time when the migration was queued
"created_at": "2013-08-28T23:59:00-06:00",
// Time when the exports begun
"exports_started_at": "2013-08-28T23:59:00-06:00",
// Time when the exports were completed and imports were queued
"imports_queued_at": "2013-08-28T23:59:00-06:00",
// Time when the imports were completed
"imports_completed_at": "2013-08-28T23:59:00-06:00",
// User-specified comment describing changes made in this operation
"comment": "Fixed spelling in question 3 of midterm exam"
}// A set of restrictions on editing for copied objects in associated courses
{
// Restriction on main content (e.g. title, description).
"content": true,
// Restriction on points possible for assignments and graded learning objects
"points": true,
// Restriction on due dates for assignments and graded learning objects
"due_dates": false,
// Restriction on availability dates for an object
"availability_dates": true
}// Describes a learning object change propagated to associated courses from a
// blueprint course
{
// The ID of the learning object that was changed in the blueprint course.
"asset_id": 2,
// The type of the learning object that was changed in the blueprint course.
// One of 'assignment', 'attachment', 'discussion_topic', 'external_tool',
// 'quiz', 'wiki_page', 'syllabus', or 'settings'. For 'syllabus' or
// 'settings', the asset_id is the course id.
"asset_type": "assignment",
// The name of the learning object that was changed in the blueprint course.
"asset_name": "Some Assignment",
// The type of change; one of 'created', 'updated', 'deleted'
"change_type": "created",
// The URL of the changed object
"html_url": "https://canvas.example.com/courses/101/assignments/2",
// Whether the object is locked in the blueprint
"locked": false,
// A list of ExceptionRecords for linked courses that did not receive this
// update.
"exceptions": [{"course_id":101,"conflicting_changes":["points"]}]
}// Lists associated courses that did not receive a change propagated from a
// blueprint
{
// The ID of the associated course
"course_id": 101,
// A list of change classes in the associated course's copy of the item that
// prevented a blueprint change from being applied. One or more of ['content',
// 'points', 'due_dates', 'availability_dates'].
"conflicting_changes": ["points"]
}// Associates a course with a blueprint
{
// The ID of the blueprint course subscription
"id": 101,
// The ID of the blueprint template the associated course is subscribed to
"template_id": 1,
// The blueprint course subscribed to
"blueprint_course": {"id":2,"name":"Biology 100 Blueprint","course_code":"BIOL 100 BP","term_name":"Default term"}
}curl https://<canvas>/api/v1/courses/1/blueprint_templates/default \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/associated_courses \
-H 'Authorization: Bearer <ACCESS_TOKEN>'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/update_associations \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'course_ids_to_add[]=1' \
-d 'course_ids_to_remove[]=2' \curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/migrations \
-X POST \
-F 'comment=Fixed spelling in question 3 of midterm exam' \
-F 'send_notification=true' \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/restrict_item \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'content_type=assignment' \
-d 'content_id=2' \
-d 'restricted=true'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/migrations \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/migrations/:id \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/1/blueprint_templates/default/migrations/2/details \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/2/blueprint_subscriptions \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/2/blueprint_subscriptions/default/migrations \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/2/blueprint_subscriptions/default/migrations/:id \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/2/blueprint_subscriptions/default/7/details \
-H 'Authorization: Bearer <token>'Welcome to Our New API Docs! This is the new home for all things API (previously at ).
API for creating, accessing and updating appointment groups. Appointment groups provide a way of creating a bundle of time slots that users can sign up for (e.g. "Office Hours" or "Meet with professor about Final Project"). Both time slots and reservations of time slots are stored as Calendar Events.
An Appointment object looks like:
An AppointmentGroup object looks like:
GET /api/v1/appointment_groups
Scope: url:GET|/api/v1/appointment_groups
Retrieve the paginated list of appointment groups that can be reserved or managed by the current user.
Request Parameters:
scope
string
Defaults to “reservable”
Allowed values: reservable, manageable
context_codes[]
string
Array of context codes used to limit returned results.
include_past_appointments
boolean
Defaults to false. If true, includes past appointment groups
include[]
string
Array of additional information to include.
“appointments”
calendar event time slots for this appointment group
“child_events”
reservations of those time slots
“participant_count”
POST /api/v1/appointment_groups
Scope: url:POST|/api/v1/appointment_groups
Create and return a new appointment group. If new_appointments are specified, the response will return a new_appointments array (same format as appointments array, see “List appointment groups” action)
Request Parameters:
appointment_group[context_codes][]
Required string
Array of context codes (courses, e.g. course_1) this group should be linked to (1 or more). Users in the course(s) with appropriate permissions will be able to sign up for this appointment group.
appointment_group[sub_context_codes][]
string
Array of sub context codes (course sections or a single group category) this group should be linked to. Used to limit the appointment group to particular sections. If a group category is specified, students will sign up in groups and the participant_type will be “Group” instead of “User”.
appointment_group[title]
Required string
Short title for the appointment group.
appointment_group[description]
string
Longer text description of the appointment group.
Example Request:
GET /api/v1/appointment_groups/:id
Scope: url:GET|/api/v1/appointment_groups/:id
Returns information for a single appointment group
Request Parameters:
include[]
string
Array of additional information to include. See include[] argument of “List appointment groups” action.
“child_events”
reservations of time slots time slots
“appointments”
will always be returned
“all_context_codes”
PUT /api/v1/appointment_groups/:id
Scope: url:PUT|/api/v1/appointment_groups/:id
Update and return an appointment group. If new_appointments are specified, the response will return a new_appointments array (same format as appointments array, see “List appointment groups” action).
Request Parameters:
appointment_group[context_codes][]
Required string
Array of context codes (courses, e.g. course_1) this group should be linked to (1 or more). Users in the course(s) with appropriate permissions will be able to sign up for this appointment group.
appointment_group[sub_context_codes][]
string
Array of sub context codes (course sections or a single group category) this group should be linked to. Used to limit the appointment group to particular sections. If a group category is specified, students will sign up in groups and the participant_type will be “Group” instead of “User”.
appointment_group[title]
string
Short title for the appointment group.
appointment_group[description]
string
Longer text description of the appointment group.
Example Request:
DELETE /api/v1/appointment_groups/:id
Scope: url:DELETE|/api/v1/appointment_groups/:id
Delete an appointment group (and associated time slots and reservations) and return the deleted group
Request Parameters:
cancel_reason
string
Reason for deleting/canceling the appointment group.
Example Request:
GET /api/v1/appointment_groups/:id/users
Scope: url:GET|/api/v1/appointment_groups/:id/users
A paginated list of users that are (or may be) participating in this appointment group. Refer to the Users API for the response fields. Returns no results for appointment groups with the “Group” participant_type.
Request Parameters:
registration_status
string
Limits results to the a given participation status, defaults to “all”
Allowed values: all, registered, registered
GET /api/v1/appointment_groups/:id/groups
Scope: url:GET|/api/v1/appointment_groups/:id/groups
A paginated list of student groups that are (or may be) participating in this appointment group. Refer to the Groups API for the response fields. Returns no results for appointment groups with the “User” participant_type.
Request Parameters:
registration_status
string
Limits results to the a given participation status, defaults to “all”
Allowed values: all, registered, registered
GET /api/v1/appointment_groups/next_appointment
Scope: url:GET|/api/v1/appointment_groups/next_appointment
Return the next appointment available to sign up for. The appointment is returned in a one-element array. If no future appointments are available, an empty array is returned.
Request Parameters:
appointment_group_ids[]
string
List of ids of appointment groups to search.
Returns a list of CalendarEvent objects.
This documentation is generated directly from the Canvas LMS source code, available on Github.
// Date and time for an appointment
{
// The appointment identifier.
"id": 987,
// Start time for the appointment
"start_at": "2012-07-20T15:00:00-06:00",
// End time for the appointment
"end_at": "2012-07-20T15:00:00-06:00"
}{
// The ID of the appointment group
"id": 543,
// The title of the appointment group
"title": "Final Presentation",
// The start of the first time slot in the appointment group
"start_at": "2012-07-20T15:00:00-06:00",
// The end of the last time slot in the appointment group
"end_at": "2012-07-20T17:00:00-06:00",
// The text description of the appointment group
"description": "Es muy importante",
// The location name of the appointment group
"location_name": "El Tigre Chino's office",
// The address of the appointment group's location
"location_address": "Room 234",
// The number of participant who have reserved slots (see include[] argument)
"participant_count": 2,
// The start and end times of slots reserved by the current user as well as the
// id of the calendar event for the reservation (see include[] argument)
"reserved_times": [{"id":987,"start_at":"2012-07-20T15:00:00-06:00","end_at":"2012-07-20T15:00:00-06:00"}],
// Boolean indicating whether observer users should be able to sign-up for an
// appointment
"allow_observer_signup": false,
// The context codes (i.e. courses) this appointment group belongs to. Only
// people in these courses will be eligible to sign up.
"context_codes": ["course_123"],
// The sub-context codes (i.e. course sections and group categories) this
// appointment group is restricted to
"sub_context_codes": [course_section_234],
// Current state of the appointment group ('pending', 'active' or 'deleted').
// 'pending' indicates that it has not been published yet and is invisible to
// participants.
"workflow_state": "active",
// Boolean indicating whether the current user needs to sign up for this
// appointment group (i.e. it's reservable and the
// min_appointments_per_participant limit has not been met by this user).
"requiring_action": true,
// Number of time slots in this appointment group
"appointments_count": 2,
// Calendar Events representing the time slots (see include[] argument) Refer to
// the Calendar Events API for more information
"appointments": [],
// Newly created time slots (same format as appointments above). Only returned
// in Create/Update responses where new time slots have been added
"new_appointments": [],
// Maximum number of time slots a user may register for, or null if no limit
"max_appointments_per_participant": 1,
// Minimum number of time slots a user must register for. If not set, users do
// not need to sign up for any time slots
"min_appointments_per_participant": 1,
// Maximum number of participants that may register for each time slot, or null
// if no limit
"participants_per_appointment": 1,
// 'private' means participants cannot see who has signed up for a particular
// time slot, 'protected' means that they can
"participant_visibility": "private",
// Indicates how participants sign up for the appointment group, either as
// individuals ('User') or in student groups ('Group'). Related to
// sub_context_codes (i.e. 'Group' signups always have a single group category)
"participant_type": "User",
// URL for this appointment group (to update, delete, etc.)
"url": "https://example.com/api/v1/appointment_groups/543",
// URL for a user to view this appointment group
"html_url": "http://example.com/appointment_groups/1",
// When the appointment group was created
"created_at": "2012-07-13T10:55:20-06:00",
// When the appointment group was last updated
"updated_at": "2012-07-13T10:55:20-06:00"
}curl 'https://<canvas>/api/v1/appointment_groups.json' \
-X POST \
-F 'appointment_group[context_codes][]=course_123' \
-F 'appointment_group[sub_context_codes][]=course_section_234' \
-F 'appointment_group[title]=Final Presentation' \
-F 'appointment_group[participants_per_appointment]=1' \
-F 'appointment_group[min_appointments_per_participant]=1' \
-F 'appointment_group[max_appointments_per_participant]=1' \
-F 'appointment_group[new_appointments][0][]=2012-07-19T21:00:00Z' \
-F 'appointment_group[new_appointments][0][]=2012-07-19T22:00:00Z' \
-F 'appointment_group[new_appointments][1][]=2012-07-19T22:00:00Z' \
-F 'appointment_group[new_appointments][1][]=2012-07-19T23:00:00Z' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/appointment_groups/543.json' \
-X PUT \
-F 'appointment_group[publish]=1' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/appointment_groups/543.json' \
-X DELETE \
-F 'cancel_reason=El Tigre Chino got fired' \
-H "Authorization: Bearer <token>"“reserved_times”
the event id, start time and end time of reservations the current user has made)
“all_context_codes”
all context codes associated with this appointment group
Allowed values: appointments, child_events, participant_count, reserved_times, all_context_codes
all context codes associated with this appointment group
Allowed values: child_events, appointments, all_context_codes
appointment_group[location_name]
string
Location name of the appointment group.
appointment_group[location_address]
string
Location address.
appointment_group[publish]
boolean
Indicates whether this appointment group should be published (i.e. made available for signup). Once published, an appointment group cannot be unpublished. Defaults to false.
appointment_group[participants_per_appointment]
integer
Maximum number of participants that may register for each time slot. Defaults to null (no limit).
appointment_group[min_appointments_per_participant]
integer
Minimum number of time slots a user must register for. If not set, users do not need to sign up for any time slots.
appointment_group[max_appointments_per_participant]
integer
Maximum number of time slots a user may register for.
appointment_group[new_appointments][X][]
string
Nested array of start time/end time pairs indicating time slots for this appointment group. Refer to the example request.
appointment_group[participant_visibility]
string
“private”
participants cannot see who has signed up for a particular time slot
“protected”
participants can see who has signed up. Defaults to “private”.
Allowed values: private, protected
appointment_group[allow_observer_signup]
boolean
Whether observer users can sign-up for an appointment. Defaults to false.
appointment_group[location_name]
string
Location name of the appointment group.
appointment_group[location_address]
string
Location address.
appointment_group[publish]
boolean
Indicates whether this appointment group should be published (i.e. made available for signup). Once published, an appointment group cannot be unpublished. Defaults to false.
appointment_group[participants_per_appointment]
integer
Maximum number of participants that may register for each time slot. Defaults to null (no limit).
appointment_group[min_appointments_per_participant]
integer
Minimum number of time slots a user must register for. If not set, users do not need to sign up for any time slots.
appointment_group[max_appointments_per_participant]
integer
Maximum number of time slots a user may register for.
appointment_group[new_appointments][X][]
string
Nested array of start time/end time pairs indicating time slots for this appointment group. Refer to the example request.
appointment_group[participant_visibility]
string
“private”
participants cannot see who has signed up for a particular time slot
“protected”
participants can see who has signed up. Defaults to “private”.
Allowed values: private, protected
appointment_group[allow_observer_signup]
boolean
Whether observer users can sign-up for an appointment.
One of the most powerful features of AB Connect is the ability to build, predict and navigate relationships. These relationships are managed by direct connection (e.g. relating a Standard to an Asset), indirect reference (e.g. relating entities based on mutual relationships with other entities), prediction (when the system suggests a relationship) and through other system derived means. The following sections explain how to manage these relationships.
Note that some relationships are complex having multiple properties that exist on the relationship. These relationships are represented in AB Connect as relational objects and have their own endpoints. These relationship objects are not covered here but have their own sections in the documentation.
AB Connect offers a Content Enrichment service which helps to establish, maintain and predict relationships between Assets (content, assessment items, etc.), Standards, Topics, Concepts and other Assets. This system uses the Asset metadata profile, learning algorithms and relationship data we've built over 15 years of aligning content. Content Enrichment makes your Assets more discoverable and aids in building relationships. Content Enrichment uses intermediaries like Topics, Concepts and Key Ideas when relating Asset and Standards.
The AB Topic Taxonomy is a broad taxonomy used for general categorization of Standards. Every Standard in the core four subjects (language arts, math, science and social studies) is associated with at least one Topic. The use of Topics builds relationships quickly and easily. When a Standard is related to an Asset, a predicted relationship between the Asset and one or more Topics is established. This is a bi-directional capability so establishing a relationship between a Topic and an Asset will create predicted relationships between the Asset and Standards (typically multiple Standards - across all authorities in your license). The use of Topics to enrich your Assets is a very efficient way to power search-by-Standard capabilities in your system and enable the fast discovery of relationships.
The AB Concept Taxonomy is a granular means for identifying precise relationships between Standards and Assets. Concepts represent individual notions covered by an Asset or Standard. Concepts are linked together to build Key Ideas that are then associated with Standards. Key Ideas are similar to unpacked Standards and are a key component to the AB Content Enrichment Engine. As an Asset's Concept profile is defined, the prediction engine is able to more accurately predict relationships between the Asset and new Standards. Note that the prediction engine utilizes the Disciplines and Education Levels specified in the Assets and Standards profiles (when present) to assist in predictions. Connecting an Asset to Concepts or Standards outside of the Asset's Discipline and Education Level profile will not aid or alter the predictions or clarifications. See
for details on tagging content with Concepts and the section on for information on retrieving Key Idea data from a Standard.
However you choose to enrich your content, calling the Predictions endpoint engages the engine to predict relationships between your Asset and other entities in the system. While many aspects of the Asset metadata profile can impact predictions, the predictions are not actually generated until the predictions endpoint is called. This is true for changes in disciplines, education levels and relationships to Standards, Topics, Concepts and donors. See for details on using the prediction engine.
While a detailed explanation of Content Enrichment is beyond the scope of this API documentation, you can get more information by contacting at Instructure or your sales representative.
Note that use of Academic Benchmarks Assets, Topics, Concepts and Clarifier is enabled through licensing. See the section on for a discussion on how to enable these features.
AB Connect uses the metadata profiles of Topics, Standards and Assets to understand relationships, recommend additional relationships and determine where the recommendation engine needs further clarification. The profiles can impact the engine in many ways. A couple of things to be aware of when working with AB Connect and relationships between Assets, Topics and Standards:
If disciplines and education levels are defined on an Asset, they should match or at least overlap with those on the Topic or Standard if you hope to have the relationship shape the recommendations made by the system. When the descriptions do not match, the engine ignores the relationship for the purpose of recommendations and requesting clarifications.
Standards that do not have an utilization type of "alignable" typically do not impact future recommendations for the Asset relationships.
If you are working with Assets that are using v2 of the prediction engine (see the prediction_algorithm field), creating, deleting and modifying relationships between the Asset and Standards, Concepts or Topics upgrades the prediction algorithm to v3.
For example, if you have a 3rd grade Asset (education_levels.grades.code eq '3') and create a relationship between that Asset and the middle school Topic "Solving Equations", the system will not predict any relationships to Standards because the grade ranges don't match between the Topic and Asset.
Some AB Connect customers prefer to cache Asset and Standards data within their system and refresh the data periodically. To make this process more efficient and to support customer processes where changes may go through an internal review process, AB Connect allows you to search for Assets by the date that a relationship between a Standard and Asset changed. To do this, search for Assets where date_alignments_modified_utc is greater than a certain point in time. E.g.
Once you have a list of Assets where their relationships with Standards have changed recently, you can filter on the related Standards by date to see which specific changes have been made. E.g.
Some AB Connect customers display "alignments" (relationships between Assets and Standards) with their content. Often, they will know the Authority associated with the browser (e.g. a teacher registered in an LMS may have their state in their profile). In this case, it is possible to retrieve only the given Authority's Standards related to this Asset. To do this, search for Standards related to the Asset and filter the Standards by Authority. E.g.
This same concept can be used to filter on any of the "meta" fields on the relationship and the Standards properties listed in .
Similar to the Standards based example above, you may want to retrieve related Topics that are accepted. To do this, search for Topics related to the Asset and filter the disposition. E.g.
This same concept can be used to filter on any of the "meta" fields on the relationship and the Topics properties listed in .
Similar to the examples above, you may want to retrieve related Concepts that are central. To do this, search for Concepts related to the Asset and filter the emphasis. E.g.
This same concept can be used to filter on any of the "meta" fields on the relationship and the Concepts properties listed in .
AB Connect allows you to connect your Assets directly to Standards. Establishing relationships between Assets and Standards can power services like searching for Assets by Standards and gap analysis. Building (and rejecting) direct relationships like this can also be the first step accelerating Content Enrichment. Direct relationships can be very helpful in building and managing your Asset library but full Content Enrichment with intermediaries like Topics and Concepts can greatly accelerate the process and broaden the network of relationships quickly and efficiently.
You can create (and add) a direct relationship between an Asset and Standards by POSTing to /assets/{guid}/alignments. You can "accept" or "reject" a direct relationship. Accepting one is indicating that the relationship has been reviewed and is correct. Rejecting a relationship indicates that the relationship has been reviewed and there is no relationship between the Asset and Standard. This is known as the disposition of the relationship.
In addition to specifying the disposition, for accepted relationships, you can associate tags with the relationship. The meaning of the tag is partner defined and the following values are accepted:
Excellent
Good
Moderate
Encompassing
Since JSON API does not allow direct properties on relationships, the disposition and tags are stored in the relationship metadata.
To replace all existing relationships between and Asset and some Standards, PATCH the endpoint sending the new relationships in the PATCH body. The body is in the same format as when creating a relationship. In JSON API, relationships either exist or do not, so there isn't a mechanism to directly support altering relationship properties of a subset of the relationships. In order to alter the metadata on one or more relationships (e.g. disposition or tags), you must PATCH all relationships including the desired metadata for each relationship. Any relationships or relationship metadata properties NOT included in the PATCH body will be removed. Note that you can remove ALL relationships between Assets and Standards by sending an empty set in the PATCH body. E.g. { "data": [] }
It is possible to remove specific relationships between an Asset and one or more Standards using the DELETE method and including the Standards you'd like to remove from the Asset.
AB Connect allows you to filter and page through the list of Standards related to an Asset. This can be helpful if you are wanting to limit the alignments you are showing a user to those in their specified state or if you are caching Assets and only want to retrieve alignments that have changed since the last time you cached the data (for example).
You can filter and sort on relationship properties like meta.disposition and meta.date_modified_utc or on Standards properties. If you are using Standards properties in your filtering and sorting, you are limited to the fields listed in the Standards section of the documentation. Note that when using Standards properties for filtering here, you can drop the alignments. from the property name.
AB Connect allows you to filter and page through the list of Standards that used to be related to an Asset. This can be helpful if you are caching Assets and only want to retrieve alignments that have changed since the last time you cached the data. This is the only way to get the list of deleted alignments.
If you have licensed the Academic Benchmarks Topic Taxonomy (here referred to simply as Topics), Topics can assist with Asset searches and be a powerful tool to help establish relationships between Assets and Standards. One of the most powerful features of AB Connect is the ability to build, predict and navigate relationships. These relationships are managed by direct connection (e.g. relating a Topic to an Asset), indirect reference (e.g. automatically relating to Topics based in their relationships to Standards) and through other system derived means. The process of developing these relationships and describing an Asset with metadata is known as Content Enrichment because by associating an asset with the Academic Benchmark metadata, you gain access to a rich network of additional relationships that can serve to power search and discovery, alignment processes, and navigability within content.
Content Enrichment with the Academic Benchmarks Topic Taxonomy enables coarse-grained description and relationship management. The Topic Taxonomy was developed with browsability in mind, ...not only controlling the vocabulary, but also the organization in a rigid 4-level hierarchy that includes Subject > Grade Band > Branch > Topic. Topics represetn what should be learned at a broad level. The coarse-grained nature of the AB Topic Taxonomy enables a simple relationship management mechanism and can be used in your search technologies for advanced and efficient discovery capabilities. At its simplest, establishing a relationship between an Asset and a Topic enables AB Connect to predict relationships between the Asset and Standards. This is a bi-directional relationship, so the process could alternatively start with creating a direct relationship between a Standard and Asset which would predict relationships between the Asset and one or more Topics.
If you are in need of tighter relationship management, see and .
Enriching your Asset with Topics:
If you don't already have Assets in the system,
Use the to
Create a relationship between the Topic and Asset (see below)
Update the predictions made by the system (see ).
Note that use of Academic Benchmarks Assets, Topics, Concepts and Clarifier is enabled through licensing. See the section on for a discussion on how to enable these features.
You can create (and add) a direct relationship between an Asset and Topics by POSTing to /assets/{guid}/topics. You can "accept" or "reject" a direct relationship. Accepting one is indicating that the relationship has been reviewed and is correct. Rejecting a relationship indicates that the relationship has been reviewed and there is no relationship between the Asset and Topic. This is known as the disposition of the relationship. Since JSON API does not allow direct properties on relationships, the disposition is stored in the relationship metadata.
To replace all existing relationships between and Asset and some Topics, PATCH the endpoint sending the new relationships in the PATCH body. The body is in the same format as when creating a relationship. In JSON API, relationships either exist or do not, so there isn't a mechanism to directly support altering relationship properties of a subset of the relationships. In order to alter the metadata on one or more relationships (e.g. disposition), you must PATCH all relationships including the desired metadata for each relationship. Any relationships or relationship metadata properties NOT included in the PATCH body will be removed. Note that you can remove ALL relationships between Assets and Topics by sending an empty set in the PATCH body. E.g.
It is possible to remove specific relationships between an Asset and one or more Topics using the DELETE method and including the Topics relationships to remove from the Asset.
AB Connect allows you to filter and page through the list of Topics related to an Asset. This can be helpful if you are wanting to limit the Topics you are showing a user to those that have been accepted (for example).
You can filter and sort on relationship properties like meta.disposition or on Topics properties. If you are using Topics properties in your filtering, you are limited to the fields listed in the Topics section of the documentation. Note that when using Topics properties for filtering here, you can drop the topics. from the property name.
If you have licensed the Academic Benchmarks Concept Taxonomy, Concepts enable detailed definition of Asset metadata profiles which power precise search and relationship prediction capabilities. The Asset metadata included describes the Asset with a controlled vocabulary to reflect what should be learned at the most granular level. This level of granular description, combined with machine learning technology, results in an Asset profile that learns from user input, and updates recommendations automatically, facilitating easier change management of Standards. Beyond relationships management, Concepts can be used in your search technologies for advanced and efficient search capabilities.
The process of developing these relationships and describing an Asset with metadata is known as Content Enrichment because by associating an asset with the Academic Benchmark metadata, you gain access to a rich network of additional relationships that can serve to power search and discovery, alignment processes, and navigability within content. When you establish a relationship between a Concept and an Asset, you will notice that the system predictions between the Asset and Standards change and tighten. The Clarifier helps you to tune the system predictions and can be a very powerful addition to your arsenal. See the for details.
Here is an easy approach for tagging your Asset with Concepts:
If you don't already have Assets in the system,
Use the to
Create a relationship between the
Now if you , you'll see the accepted Standard relationship
Note that the context of the Concept is important. Any decisions regarding a relationship between a Concept and an Asset should be made with the context taken into consideration.
Note that use of Academic Benchmarks Assets, Topics, Concepts and Clarifier is enabled through licensing. See the section on for a discussion on how to enable these features.
You can create (and add) a relationship between an Asset and Concepts by POSTing to /assets/{guid}/concepts. Concepts have different types of relationships with Assets than Topics and Standards. Instead of accepting or rejecting a disposition, Concept relationships have an emphasis of either central, related, not_applicable or avoid. central indicates that the Concept is one of the key notions covered by the Asset. related indicates that the Asset covers the Concept but it is not core to the Asset. not_applicable indicates that the Concept is NOT relevant to the Asset (used to clarify Concepts to aid in predicting relationships). avoid indicates that this Concept is not only irrelevant to the Asset but Standards that relate to this Concept should be avoided when predicting relationships. Since JSON API does not allow direct properties on relationships, the disposition is stored in the relationship metadata.
To replace all existing relationships between and Asset and some Concepts, PATCH the endpoint sending the new relationships in the PATCH body. The body is in the same format as when creating a relationship. In JSON API, relationships either exist or do not, so there isn't a mechanism to directly support altering relationship properties of a subset of the relationships. In order to alter the metadata on one or more relationships (e.g. emphasis), you must PATCH all relationships including the desired metadata for each relationship. Any relationships or relationship metadata properties NOT included in the PATCH body will be removed. Note that you can remove ALL relationships between Assets and Concepts by sending an empty set in the PATCH body. E.g.
It is possible to remove specific relationships between an Asset and one or more Concepts using the DELETE method and including the Concepts remove from the Asset.
AB Connect allows you to filter and page through the list of Concepts related to an Asset. This can be helpful if you are wanting to limit the Concepts you are showing a user to those that are central (for example).
You can filter and sort on relationship properties like emphasis or on Concepts properties. If you are using Concepts properties in your filtering, you are limited to the fields listed in the Concepts section of the documentation. Note that when using Concepts properties for filtering here, you can drop the concepts. from the property name.
It is possible to configure the properties of an Asset to allow inter-Asset relationships to be managed. These are very rare use cases. If you have a need to express Asset-to-Asset relationships within AB Connect, start the project with a conversation with to discuss your use case. AB Support can setup your Asset configuration (asset_type) to allow you to manage these relationships.
AB Connect can support three inter-Asset relationship types:
parent - The parent relationship allows you to build a Asset hierarchy. No additional properties, data or services are conveyed through this relationship. It is simply a means for expressing a hierarchy. Note that there is no reciprocal children property and an Asset can have only one parent.
alignment_donors - Alignment Donors are Assets that convey relationships with Standards and Topics to their Recipients. A Recipient is an Asset that has one or more Assets listed in its alignment_donors relationship. Notes:
You can create (and add) a relationship between Assets by POSTing to /assets/{guid}/{relationship}. Parent relationships are single entities. The others must be arrays.
To replace all existing relationships between an Asset and its alignment_donors or concept_donors, PATCH the endpoint sending the new relationships in the PATCH body. The body is in the same format as when creating a relationship. In order to alter the relationships with PATCH, you must include all relationships you'd like to retain in the request. Any relationships of this type that are NOT included in the PATCH are removed. Note that you can remove ALL relationships between Assets and Concepts by sending an empty set in the PATCH body. E.g.
It is possible to remove specific relationships between a Assets using the DELETE method and including the Assets to remove.
The Predictions endpoint allows you to predict relationships between unrelated entities. AB Connect currently supports three prediction scenarios:
Predict Standards alignments and Topics for an Asset based on the metadata description of the Asset and machine learning algorithms
Predict Standards alignments for an Asset based on Crosswalk relationships
Predict Assets that would align to a Standard based on Crosswalk relationships
Note that access to Predictions is licensed. If your credentials are correct and you are still receiving a 401 error (or no results), check with to ensure you are licensed for Predictions. See the section on for a discussion on the licensing required for access to Predictions.
Working with Predictions for an Asset is implemented as follows:
Predicting Assets for Standards is implemented as follows:
Using the POST method, you can generate a set of predictions for the specified scenario. Calculating Predictions does not create relationships. It just calculates what relationships appear to be relevant. The relationships can be established as a later step. There are two algorithms for generating Predictions: machine learning and crosswalk relationships.
Machine Learning The machine learning algorithm for predicting relationships is called the "confidence" algorithm. At this point, confidence can only be used to predict Standards and Topics alignments for Assets. Attempting to use confidence to predict Assets for a Standard will result in an error. The Topics relationships are predicted based on the established relationships between the Topics and Standards already aligned to the Asset. Standards relationships are predicted based on the metadata definition of the Asset which includes alignments to other Standards, Topics, Concepts, subjects, etc.
Crosswalks When Crosswalks are used for prediction purposes, they represent two corners of a triangle, with an asset providing the third corner. Using existing alignments (and traversing the edges of the triangle), the system provides predictions of both new standards to assets as well as unaligned assets to new standards. This algorithm uses the Crosswalk relationships between Standards to identify additional relevant Standards. In the case of predicting related Assets, the system walks the Standards relationships and identifies Assets related to the connected Standards.
Note that the Crosswalk relationships are available directly to the calling application through the Standards endpoint, but the predictor simplifies use by navigating common relationships to generate Crosswalks between documents that aren't directly related. E.g. if you are attempting to predict from an Indiana Standard to a New Jersey Standard and Academic Benchmarks has not directly curated relationships between those documents, the predictor will use an intermediary document (perhaps one in Texas) to synthesize the relationships for the predictions. Note that the steps the system had to take to establish the prediction is available in the steps property. Predictions with 1 step are from directly connected Standards. Predictions with 2 are generated by walking from one authority to a common document then to the second authority. In this case, the relationships may lose some precision.
Usage Sometimes calculating Predictions can be resource intensive and take several seconds or even a few minutes. For this reason, the Predictions endpoint uses a queue model. The request to calculate Predictions returns a queue-status object. The queue-status object indicates the state of the queued processing of Predictions. If the calculations complete quickly (less than 30 seconds), the request response will indicate that the calculations are complete and you can GET the Predictions right away. If the calculations go beyond 30 seconds, the response will indicate that the calculations are continuing in which case you will need to check the queue periodically until you receive a response indicating that the calculations are complete. See for details on polling the queue.
Note that both the queue-status and predictions objects have GUIDs that are different from the related Asset GUID. If you are checking the queue status, use the links.self URL or construct the URL manually using the GUID in the data.id property. Similarly, once the predictions are complete, use the relationships.predictions.links.related property to locate the predicted alignments.
The Queue Status endpoint allows you to check on the Predictions calculations progress for long running Predictions.
Using the GET method, you can retrieve the queue-status and check the data.attributes.code field. pending means the Predictions are still being calculated. complete means the Predictions are ready. See the data.relationships.predictions.links.related property for a link to the results.
The Predictions endpoint allows you to retrieve the details of the Prediction set (like when it expires, what Asset it is related to) and start paging through predicted relationships.
Note that access to Predictions is licensed. If your credentials are correct and you are still receiving a 401 error (or no results), check with to ensure you are licensed for Predictions. See the section on for a discussion on the licensing required for access to Predictions.
Using the GET method, you can see what predictions the engine makes for the Asset metadata profile using the GUID or related URL (relationships.predictions.links.related) returned when calculating the predictions.
AB Connect allows you to filter and page through predicted standards. You can filter and sort on relationship properties like meta.score or on the item properties themselves.
To commit the Predictions to the Asset as alignments, POST to the predictions/assets endpoint supplying the Predictions GUID. This updates the predicted alignments on the Asset, replacing any previously predicted alignments and creating new deleted_alignments as appropriate.
Note that the POST has no request nor response body.
One key component to the prediction engine is the Clarifier which can be used on an Asset to request Concepts and Standards for which the system needs clarification regarding the status of the relationship between the Asset and Concepts/Standards. As the user provides input about clarifications, the system refines its calibration for the ranking of Asset-Standards relationship predictions. The Clarifier, combined with setting the disposition of Standards and the emphasis of Concepts, helps the user build an Asset profile that continues to learn and adapt as input is provided, making search capabilities stronger and relationship maintenance far simpler.
To retrieve clarifications for an Asset, call the Clarifier endpoint appending the AB GUID of the Asset in question to the path portion of the URL. If you do not know the AB GUID for the Asset in question, you can search the Asset endpoint filtering on the client_id which should be your ID for the Asset. See the section on for details on searching for Assets.
Note that access to the Clarifier is controlled by licensing. If your credentials are correct and you are still receiving a 401 error (or no results), check with to ensure you are licensed for the Clarifier. See the section on for a discussion on the licensing required for access to the Clarifier.
AB Connect allows you to filter and page through related objects. You can filter and sort on relationship properties like meta.same_text or, in the case of Concepts, descr or context.
AB Connect allows you to page through objects related to the Topic. Filtering the list of related objects is not supported at this point in time.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
An AuthenticationProvider object looks like:
A SSOSettings object looks like:
A FederatedAttributesConfig object looks like:
A FederatedAttributeConfig object looks like:
GET /api/v1/accounts/:account_id/authentication_providers
Scope: url:GET|/api/v1/accounts/:account_id/authentication_providers
Returns a paginated list of authentication providers
Example Request:
Returns a list of objects.
GET /api/v1/accounts/:account_id/authentication_providers/:id
Scope: url:GET|/api/v1/accounts/:account_id/authentication_providers/:id
Get the specified authentication provider
Example Request:
Returns an object.
POST /api/v1/accounts/:account_id/authentication_providers
Scope: url:POST|/api/v1/accounts/:account_id/authentication_providers
Add external authentication provider(s) for the account. Services may be Apple, CAS, Facebook, GitHub, Google, LDAP, LinkedIn, Microsoft, OpenID Connect, or SAML.
Each authentication provider is specified as a set of parameters as described below. A provider specification must include an ‘auth_type’ parameter with a value of ‘apple’, ‘canvas’, ‘cas’, ‘clever’, ‘facebook’, ‘github’, ‘google’, ‘ldap’, ‘linkedin’, ‘microsoft’, ‘openid_connect’, or ‘saml’. The other recognized parameters depend on this auth_type; unrecognized parameters are discarded. Provider specifications not specifying a valid auth_type are ignored.
You can set the ‘position’ for any provider. The config in the 1st position is considered the default. You can set ‘jit_provisioning’ for any provider besides Canvas. You can set ‘mfa_required’ for any provider.
For Apple, the additional recognized parameters are:
client_id [Required]
The developer’s client identifier, as provided by WWDR. Not available if configured globally for Canvas.
login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘sub’ (the default), or ‘email’
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘email’, ‘firstName’, ‘lastName’, and ‘sub’.
For Canvas, the additional recognized parameter is:
self_registration
‘all’, ‘none’, or ‘observer’ - who is allowed to register as a new user
For CAS, the additional recognized parameters are:
auth_base
The CAS server’s URL.
log_in_url [Optional]
An alternate SSO URL for logging into CAS. You probably should not set this.
For Clever, the additional recognized parameters are:
client_id [Required]
The Clever application’s Client ID. Not available if configured globally for Canvas.
client_secret [Required]
The Clever application’s Client Secret. Not available if configured globally for Canvas.
district_id [Optional]
A district’s Clever ID. Leave this blank to let Clever handle the details with its District Picker. This is required for Clever Instant Login to work in a multi-tenant environment.
For Facebook, the additional recognized parameters are:
app_id [Required]
The Facebook App ID. Not available if configured globally for Canvas.
app_secret [Required]
The Facebook App Secret. Not available if configured globally for Canvas.
login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘id’ (the default), or ‘email’
For GitHub, the additional recognized parameters are:
domain [Optional]
The domain of a GitHub Enterprise installation. I.e. github.mycompany.com. If not set, it will default to the public github.com.
client_id [Required]
The GitHub application’s Client ID. Not available if configured globally for Canvas.
client_secret [Required]
The GitHub application’s Client Secret. Not available if configured globally for Canvas.
For Google, the additional recognized parameters are:
client_id [Required]
The Google application’s Client ID. Not available if configured globally for Canvas.
client_secret [Required]
The Google application’s Client Secret. Not available if configured globally for Canvas.
hosted_domain [Optional]
A Google Apps domain to restrict logins to. See
For LDAP, the additional recognized parameters are:
auth_host
The LDAP server’s URL.
auth_port [Optional, Integer]
The LDAP server’s TCP port. (default: 389)
auth_over_tls [Optional]
Whether to use TLS. Can be ‘simple_tls’, or ‘start_tls’. For backwards compatibility, booleans are also accepted, with true meaning simple_tls. If not provided, it will default to start_tls.
For LinkedIn, the additional recognized parameters are:
client_id [Required]
The LinkedIn application’s Client ID. Not available if configured globally for Canvas.
client_secret [Required]
The LinkedIn application’s Client Secret. Not available if configured globally for Canvas.
login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘id’ (the default), or ‘emailAddress’
For Microsoft, the additional recognized parameters are:
application_id [Required]
The application’s ID.
application_secret [Required]
The application’s Client Secret (Password)
tenant [Optional]
See / Valid values are ‘common’, ‘organizations’, ‘consumers’, or an Azure Active Directory Tenant (as either a UUID or domain, such as contoso.onmicrosoft.com). Defaults to ‘common’
For OpenID Connect, the additional recognized parameters are:
client_id [Required]
The application’s Client ID.
client_secret [Required]
The application’s Client Secret.
authorize_url [Required]
The URL for getting starting the OAuth 2.0 web flow
For SAML, the additional recognized parameters are:
metadata [Optional]
An XML document to parse as SAML metadata, and automatically populate idp_entity_id, log_in_url, log_out_url, certificate_fingerprint, and identifier_format
metadata_uri [Optional]
A URI to download the SAML metadata from, and automatically populate idp_entity_id, log_in_url, log_out_url, certificate_fingerprint, and identifier_format. This URI will also be saved, and the metadata periodically refreshed, automatically. If the metadata contains multiple entities, also supply idp_entity_id to distinguish which one you want (otherwise the only entity in the metadata will be inferred). If you provide the URI ‘urn:mace:incommon’ or ‘’, the InCommon or UK Access Management Federation metadata aggregate, respectively, will be used instead, and additional validation checks will happen (including validating that the metadata has been properly signed with the appropriate key).
Example Request:
Returns an object.
PUT /api/v1/accounts/:account_id/authentication_providers/:id
Scope: url:PUT|/api/v1/accounts/:account_id/authentication_providers/:id
Update an authentication provider using the same options as the endpoint. You cannot update an existing provider to a new authentication type.
Example Request:
Returns an object.
DELETE /api/v1/accounts/:account_id/authentication_providers/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/authentication_providers/:id
Delete the config
Example Request:
PUT /api/v1/accounts/:account_id/authentication_providers/:id/restore
Scope: url:PUT|/api/v1/accounts/:account_id/authentication_providers/:id/restore
Restore an authentication provider back to active that was previously deleted. Only available to admins who can manage_account_settings for given root account.
Example Request:
Returns an object.
GET /api/v1/accounts/:account_id/sso_settings
Scope: url:GET|/api/v1/accounts/:account_id/sso_settings
The way to get the current state of each account level setting that’s relevant to Single Sign On configuration
You can list the current state of each setting with “update_sso_settings”
Example Request:
Returns a object.
PUT /api/v1/accounts/:account_id/sso_settings
Scope: url:PUT|/api/v1/accounts/:account_id/sso_settings
For various cases of mixed SSO configurations, you may need to set some configuration at the account level to handle the particulars of your setup.
This endpoint accepts a PUT request to set several possible account settings. All setting are optional on each request, any that are not provided at all are simply retained as is. Any that provide the key but a null-ish value (blank string, null, undefined) will be UN-set.
You can list the current state of each setting with “show_sso_settings”
Example Request:
Returns a object.
This documentation is generated directly from the Canvas LMS source code, available .
{
// Valid for SAML providers.
"identifier_format": "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
// Valid for all providers.
"auth_type": "saml",
// Valid for all providers.
"id": 1649,
// Valid for SAML providers.
"log_out_url": "http://example.com/saml1/slo",
// Valid for SAML and CAS providers.
"log_in_url": "http://example.com/saml1/sli",
// Valid for SAML providers.
"certificate_fingerprint": "111222",
// Valid for SAML providers.
"requested_authn_context": null,
// Valid for LDAP providers.
"auth_host": "127.0.0.1",
// Valid for LDAP providers.
"auth_filter": "filter1",
// Valid for LDAP providers.
"auth_over_tls": null,
// Valid for LDAP and CAS providers.
"auth_base": null,
// Valid for LDAP providers.
"auth_username": "username1",
// Valid for LDAP providers.
"auth_port": null,
// Valid for all providers.
"position": 1,
// Valid for SAML providers.
"idp_entity_id": "http://example.com/saml1",
// Valid for SAML providers.
"login_attribute": "nameid",
// Valid for SAML providers.
"sig_alg": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
// Just In Time provisioning. Valid for all providers except Canvas (which has
// the similar in concept self_registration setting).
"jit_provisioning": null,
"federated_attributes": null,
// If multi-factor authentication is required when logging in with this
// authentication provider. The account must not have MFA disabled.
"mfa_required": null
}login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘id’ (the default), ‘sis_id’, ‘email’, ‘student_number’, or ‘teacher_number’. Note that some fields may not be populated for all users at Clever.
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘id’, ‘sis_id’, ‘email’, ‘student_number’, and ‘teacher_number’.
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘email’, ‘first_name’, ‘id’, ‘last_name’, ‘locale’, and ‘name’.
login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘id’ (the default), or ‘login’
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘email’, ‘id’, ‘login’, and ‘name’.
login_attribute [Optional]
The attribute to use to look up the user’s login in Canvas. Either ‘sub’ (the default), or ‘email’
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘email’, ‘family_name’, ‘given_name’, ‘locale’, ‘name’, and ‘sub’.
auth_base [Optional]
A default treebase parameter for searches performed against the LDAP server.
auth_filter
LDAP search filter. Use {{login}} as a placeholder for the username supplied by the user. For example: “(sAMAccountName={{login}})”.
identifier_format [Optional]
The LDAP attribute to use to look up the Canvas login. Omit to use the username supplied by the user.
auth_username
Username
auth_password
Password
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘emailAddress’, ‘firstName’, ‘id’, ‘formattedName’, and ‘lastName’.
login_attribute [Optional]
See azure.microsoft.com/en-us/documentation/articles/active-directory-v2-tokens/#idtokens Valid values are ‘sub’, ‘email’, ‘oid’, or ‘preferred_username’. Note that email may not always be populated in the user’s profile at Microsoft. Oid will not be populated for personal Microsoft accounts. Defaults to ‘sub’
federated_attributes [Optional]
See FederatedAttributesConfig. Valid provider attributes are ‘email’, ‘name’, ‘preferred_username’, ‘oid’, and ‘sub’.
token_url [Required]
The URL for exchanging the OAuth 2.0 authorization code for an Access Token and ID Token
scope [Optional]
Space separated additional scopes to request for the token. Note that you need not specify the ‘openid’ scope, or any scopes that can be automatically inferred by the rules defined at openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
end_session_endpoint [Optional]
URL to send the end user to after logging out of Canvas. See openid.net/specs/openid-connect-session-1_0.html#RPLogout
userinfo_endpoint [Optional]
URL to request additional claims from. If the initial ID Token received from the provider cannot be used to satisfy the login_attribute and all federated_attributes, this endpoint will be queried for additional information.
login_attribute [Optional]
The attribute of the ID Token to look up the user’s login in Canvas. Defaults to ‘sub’.
federated_attributes [Optional]
See FederatedAttributesConfig. Any value is allowed for the provider attribute names, but standard claims are listed at openid.net/specs/openid-connect-core-1_0.html#StandardClaims
The SAML IdP’s entity ID
log_in_url
The SAML service’s SSO target URL
log_out_url [Optional]
The SAML service’s SLO target URL
certificate_fingerprint
The SAML service’s certificate fingerprint.
identifier_format
The SAML service’s identifier format. Must be one of:
urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress
urn:oasis:names:tc:SAML:2.0:nameid-format:entity
urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos
urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName
urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName
requested_authn_context [Optional]
The SAML AuthnContext
sig_alg [Optional]
If set, AuthnRequest, LogoutRequest, and LogoutResponse messages are signed with the corresponding algorithm. Supported algorithms are:
RSA-SHA1 and RSA-SHA256 are acceptable aliases.
federated_attributes [Optional]
See FederatedAttributesConfig. Any value is allowed for the provider attribute names.
// Settings that are applicable across an account's authentication
// configuration, even if there are multiple individual providers
{
// The label used for unique login identifiers.
"login_handle_name": "Username",
// The url to redirect users to for password resets. Leave blank for default
// Canvas behavior
"change_password_url": "https://example.com/reset_password",
// If a discovery url is set, canvas will forward all users to that URL when
// they need to be authenticated. That page will need to then help the user
// figure out where they need to go to log in. If no discovery url is
// configured, the first configuration will be used to attempt to authenticate
// the user.
"auth_discovery_url": "https://example.com/which_account",
// If an unknown user url is set, Canvas will forward to that url when a service
// authenticates a user, but that user does not exist in Canvas. The default
// behavior is to present an error.
"unknown_user_url": "https://example.com/register_for_canvas"
}// A mapping of Canvas attribute names to attribute names that a provider may
// send, in order to update the value of these attributes when a user logs in.
// The values can be a FederatedAttributeConfig, or a raw string corresponding
// to the "attribute" property of a FederatedAttributeConfig. In responses, full
// FederatedAttributeConfig objects are returned if JIT provisioning is enabled,
// otherwise just the attribute names are returned.
{
// A comma separated list of role names to grant to the user. Note that these
// only apply at the root account level, and not sub-accounts. If the attribute
// is not marked for provisioning only, the user will also be removed from any
// other roles they currently hold that are not still specified by the IdP.
"admin_roles": null,
// The full display name of the user
"display_name": null,
// The user's e-mail address
"email": null,
// The first, or given, name of the user
"given_name": null,
// The secondary unique identifier for SIS purposes
"integration_id": null,
// The user's preferred locale/language
"locale": null,
// The full name of the user
"name": null,
// The unique SIS identifier
"sis_user_id": null,
// The full name of the user for sorting purposes
"sortable_name": null,
// The surname, or last name, of the user
"surname": null,
// The user's preferred time zone
"timezone": null
}// A single attribute name to be federated when a user logs in
{
// The name of the attribute as it will be sent from the authentication provider
"attribute": "mail",
// If the attribute should be applied only when provisioning a new user, rather
// than all logins
"provisioning_only": false,
// (only for email) If the email address is trusted and should be automatically
// confirmed
"autoconfirm": false
}curl 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers' \
-H 'Authorization: Bearer <token>'curl 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers/<id>' \
-H 'Authorization: Bearer <token>'# Create LDAP config
curl 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers' \
-F 'auth_type=ldap' \
-F 'auth_host=ldap.mydomain.edu' \
-F 'auth_filter=(sAMAccountName={{login}})' \
-F 'auth_username=username' \
-F 'auth_password=bestpasswordever' \
-F 'position=1' \
-H 'Authorization: Bearer <token>'# Create SAML config
curl 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers' \
-F 'auth_type=saml' \
-F 'idp_entity_id=<idp_entity_id>' \
-F 'log_in_url=<login_url>' \
-F 'log_out_url=<logout_url>' \
-F 'certificate_fingerprint=<fingerprint>' \
-H 'Authorization: Bearer <token>'# Create CAS config
curl 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers' \
-F 'auth_type=cas' \
-F 'auth_base=cas.mydomain.edu' \
-F 'log_in_url=<login_url>' \
-H 'Authorization: Bearer <token>'# update SAML config
curl -X PUT 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers/<id>' \
-F 'idp_entity_id=<new_idp_entity_id>' \
-F 'log_in_url=<new_url>' \
-H 'Authorization: Bearer <token>'curl -X DELETE 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers/<id>' \
-H 'Authorization: Bearer <token>'curl -X PUT 'https://<canvas>/api/v1/accounts/<account_id>/authentication_providers/<id>/restore' \
-H 'Authorization: Bearer <token>'curl -XGET 'https://<canvas>/api/v1/accounts/<account_id>/sso_settings' \
-H 'Authorization: Bearer <token>'curl -XPUT 'https://<canvas>/api/v1/accounts/<account_id>/sso_settings' \
-F 'sso_settings[auth_discovery_url]=<new_url>' \
-F 'sso_settings[change_password_url]=<new_url>' \
-F 'sso_settings[login_handle_name]=<new_handle>' \
-H 'Authorization: Bearer <token>'Related
Partial
Limited
Best One
Maybe
Now if you retrieve the Asset, you'll see the accepted Topic relationship and a number of predicted Standards relationships
You can review the Standards and confirm the relationship between the strong matches and the Asset by creating a direct accepted relationship
You can also reject bad matches and delete erroneous matches.
Update the predictions made by the system (see Managing and Predicting Relationships ).
Use the Clarifier to request clarification Standards and Concepts.
Confirm relationships with Concepts (see below) and/or additional Standards to refine the metadata profile for the Asset
Update the predictions made by the system.
Repeat the clarification steps until the content is fully tagged and predicted relationships are strong.
Alignment Donor Assets (Assets appearing in an alignment_donor list on some other Asset) can not be deleted. To delete an Alignment Donor, remove it from all alignment_donor relationships and then delete the Asset.
Only Standards and Topics relationships with a disposition of predicted or accepted are conveyed to Recipients.
In the event of disposition conflict in the Donors, accepted takes precedence.
The relationship conveyence is dynamic so changes to Donors are reflected in Recipients. However, if an alignment (relationship to a Standard) is changed on the Alignment Donor, the new alignment will not appear on the Recipient until the Recipient Asset's predictions have been updated.
Standards and Topics relationships can be applied directly to Recipients to augment or override relationships conveyed from Donors.
It is not possible to delete conveyed relationships but it is possible to override them by creating the same relationship directly on the Recipient but setting the disposition to rejected.
concept_donors - Concept Donors are Assets that convey relationships with Concepts to their Recipients. A Recipient is an Asset that has one or more Assets listed in its concept_donors relationship. Notes:
Concept Donor Assets (Assets appearing in a concept_donors list on some other Asset) can not be deleted. To delete a Concept Donor, remove it from all concept_donors relationships and then delete the Asset.
In the event of emphasis conflict in the Donors, the order of precedence is central, related, not_applicable and then avoid.
Unlike Alignment Donors, with Concept Donors, Concepts relationships can NOT be applied directly to Concept Recipients.
The relationship conveyence is dynamic so changes to Donors are reflected in Recipients.
If a Concept is added, modified or deleted from a Donor, the Concept relationship change does not show up immediately on the Recipients. In order for the change to propagate to the Recipient, the Recipient has to be modified (be POSTed or PATCHed to) or the Recipient Asset's predictions have been updated.
If a Concept is added, modified or deleted from a Donor, the relationship predictions on the Recipient are not updated until the Recipient Asset's predictions have been updated.
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
guid of specified prediction
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
comma separated list of field names
OK
guid of specified prediction set
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
comma separated list of field names
comma separated list of field names
comma separated list of field names
A comma separated list of resource names that will be returned in the response.
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified prediction set
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified prediction set
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
an ODATA-like query string used to filter
a comma separated list of property names specifying the sort order of the returned results
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified prediction set
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
Accepted
guid of specified asset
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
A comma separated list of resource names that will be returned in the response.
comma separated list of field names
comma separated list of field names
comma separated list of field names
an ODATA-like query string used to filter
guid of specified standard
type of relationship
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified standard
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
guid of specified standard
Your partner ID - you should have gotten them from AB Support or when you signed up for a sandbox account.
Signature for the request authorization.
Expiration timestamp for the authorization.
comma separated list of field names
The page size for the response dataset. limit must be 100 or less.
How far into the dataset you are paging
/assets?filter[assets]=(date_alignments_modified_utc gt '2017-09-12 12:00:00') /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/alignments?filter[alignments]=(meta.date_modified_utc gt '2017-09-12 12:00:00') /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/alignments?filter[alignments]=(meta.date_created_utc gt '2017-09-12 12:00:00') /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/deleted_alignments?filter[deleted_alignments]=(meta.date_deleted_utc gt '2017-09-12 12:00:00') /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/alignments?filter[alignments]=(meta.disposition eq 'accepted' and document.publication.authorities.descr eq 'Texas DOE')&fields[standards]=number.enhanced,statement.descr /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/topics?filter[topics]=(meta.disposition eq 'accepted') /assets/00005A1C-3229-11E6-9E77-9DD429C466BA/concepts?filter[concepts]=(meta.emphasis eq 'central'){
"data": []
}{
"data": []
}{
"data": []
} POST Predictions to start the calculation process
if queue-status Response has code pending
loop until queue-status has code complete
GET queue-status with max_wait=25
endloop
if you want to review Predictions, GET Predictions and page/filter through them
POST to Predictions/Asset to update Predictions on Asset POST Predictions to start the calculation process
if queue-status Response has code pending
loop until queue-status has code complete
GET queue-status with max_wait=25
endloop
Review Predictions, GET Predictions and page/filter through them
Determine which Assets should get alignments to the standard in question
POST new alignments to those AssetsOK
OK
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Conflict
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Conflict
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Conflict
OK
Bad Request
Authentication Error
Conflict
Accepted
Bad Request
Authentication Error
Unprocessable content
OK
OK
OK
OK
OK
OK
OK
Accepted
No content
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Entity not found
OK
Bad Request
Authentication Error
Entity not found
Standards are organized hierarchically under authorities. An authority is an organization that has defined a set of academic Standards (e.g. Alabama DOE or NGA Center/CCSSO). Authorities have groups of Standards that we refer to as publications. Publications typically cover multiple subject areas. An example of a publication is New York's Next Generation Learning Standards. It covers both math and ELA. Within a publication, we organize Standards into documents based on subject and adoption year. So within New York's Next Generation Learning Standards, one of the documents is Mathematics 2017. Each document is organized into sections. A section is a group in the document that covers the Standards for a particular set - typically a grade (e.g. 2nd Grade) or course (e.g. Algebra II). Once you've gotten to the section level, the rest of the data is organized into a hierarchical structure of the Standards by level and are related by parent/child relationships. Let's walk through an example:
PATCH /rest/v4.1/assets/{guid}/alignments?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 98
{
"data": [
{
"id": "text",
"type": "Standards",
"meta": {
"disposition": "accepted",
"tags": [
"Excellent"
]
}
}
]
}GET /rest/v4.1/assets/{guid}/alignments?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/assets/{guid}/deleted_alignments?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
PATCH /rest/v4.1/assets/{guid}/topics?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 74
{
"data": [
{
"id": "text",
"type": "Topics",
"meta": {
"disposition": "accepted"
}
}
]
}GET /rest/v4.1/assets/{guid}/topics?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
PATCH /rest/v4.1/assets/{guid}/concepts?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 72
{
"data": [
{
"id": "text",
"type": "Concepts",
"meta": {
"emphasis": "central"
}
}
]
}GET /rest/v4.1/assets/{guid}/concepts?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/assets/{guid}/concepts?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"attributes": {
"descr": "text",
"disciplines": {
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"guid": "text",
"context": "text"
},
"id": "text",
"type": "text"
}
]
}PATCH /rest/v4.1/assets/{guid}/alignment_donors?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 40
{
"data": [
{
"id": "text",
"type": "Assets"
}
]
}PATCH /rest/v4.1/assets/{guid}/concept_donors?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 40
{
"data": [
{
"id": "text",
"type": "Assets"
}
]
}POST /rest/v4.1/predictions?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Content-Type: application/json
Accept: */*
Content-Length: 134
{
"data": {
"attributes": {
"algorithm": "confidence"
},
"relationships": {
"id": "text",
"type": "Assets",
"focus": [
{
"id": "text",
"type": "text"
}
]
}
}
}GET /rest/v4.1/predictions/queue-status/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/predictions/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/predictions/{guid}/standards?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/predictions/{guid}/topics?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/clarifier/{guid}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/standards/{guid}/{relationship}?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/standards/{guid}/topics?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
GET /rest/v4.1/standards/{guid}/concepts?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
POST /rest/v4.1/predictions/{guid}/asset?partner.id=text&auth.signature=text&auth.expires=text HTTP/1.1
Host: api.abconnect.instructure.com
Accept: */*
{
"meta": {
"took": 1
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"meta": {
"took": 1
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"id": "text",
"relationships": {
"parent": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"data": {
"id": "text",
"type": "text"
}
}
],
"links": {
"related": "text"
}
},
"standards": {
"links": {
"last": "text",
"related": "text",
"next": "text"
},
"data": [
{
"id": "text",
"type": "text"
}
]
}
},
"attributes": {
"date_modified_utc": "text",
"disciplines": {
"subjects": [
{
"descr": "text",
"code": "text",
"guid": "text"
}
]
},
"status": "active",
"guid": "text",
"document": {
"date_modified_utc": "text",
"guid": "text",
"revision_year": "text",
"adopt_year": "text",
"descr": "text"
},
"seq": 1,
"level": 1,
"section": {
"descr": "text",
"date_modified_utc": "text",
"seq": 1,
"guid": "text"
},
"uri": "text",
"descr": "text",
"education_levels": {
"grades": [
{
"descr": "text",
"guid": "text",
"code": "text",
"seq": 1
}
]
}
}
}
]
}{
"meta": {
"took": 1
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"attributes": {
"descr": "text",
"disciplines": {
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"guid": "text",
"context": "text"
},
"id": "text",
"type": "text"
}
]
}{
"meta": {
"took": 1
}
}{
"meta": {
"took": 1
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"id": "text",
"relationships": {
"asset": {
"links": {
"related": "text"
}
},
"predictions": {
"links": {
"related": "text"
}
},
"standard": {
"links": {
"related": "text"
}
}
},
"attributes": {
"code": "pending",
"guid": "text",
"status": "text"
},
"type": "queue-status"
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"id": "text",
"relationships": {
"asset": {
"links": {
"related": "text"
}
},
"predictions": {
"links": {
"related": "text"
}
},
"standard": {
"links": {
"related": "text"
}
}
},
"attributes": {
"code": "pending",
"guid": "text",
"status": "text"
},
"type": "queue-status"
}
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"type": "text",
"attributes": {
"date_expires_utc": "text",
"guid": "text",
"algorithm": "crosswalk",
"date_requested_utc": "text"
},
"id": "text",
"relationships": {
"standard": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"focus": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"standards": {
"data": [
{
"type": "text",
"id": "text",
"meta": {
"score": "text",
"disposition": "text",
"steps": 1
}
}
],
"links": {
"last": "text",
"related": "text",
"next": "text"
}
},
"assets": {
"data": {
"id": "text",
"type": "text",
"meta": {
"score": "text",
"disposition": "text",
"steps": 1
}
},
"links": {
"related": "text",
"next": "text",
"last": "text"
}
},
"topics": {
"data": {
"id": "text",
"type": "text",
"meta": {
"score": "text",
"disposition": "text",
"steps": 1
}
},
"links": {
"related": "text",
"next": "text",
"last": "text"
}
},
"asset": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
}
}
}
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"id": "text",
"relationships": {
"parent": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"data": {
"id": "text",
"type": "text"
}
}
],
"links": {
"related": "text"
}
},
"standards": {
"links": {
"last": "text",
"related": "text",
"next": "text"
},
"data": [
{
"id": "text",
"type": "text"
}
]
}
},
"attributes": {
"date_modified_utc": "text",
"disciplines": {
"subjects": [
{
"descr": "text",
"code": "text",
"guid": "text"
}
]
},
"status": "active",
"guid": "text",
"document": {
"date_modified_utc": "text",
"guid": "text",
"revision_year": "text",
"adopt_year": "text",
"descr": "text"
},
"seq": 1,
"level": 1,
"section": {
"descr": "text",
"date_modified_utc": "text",
"seq": 1,
"guid": "text"
},
"uri": "text",
"descr": "text",
"education_levels": {
"grades": [
{
"descr": "text",
"guid": "text",
"code": "text",
"seq": 1
}
]
}
}
}
]
}{
"links": {
"self": "text"
},
"meta": {
"took": 1
},
"data": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"type": "text",
"relationships": {
"clarification_concepts": [
{
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
],
"clarification_standards": [
{
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
]
}
},
"included": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"relationships": {
"related_courses": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakout_origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"ancestors": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"topics": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peers": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"breakouts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"crosswalks": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaced_by": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"replaces": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"concepts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"origins": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"peer_derivatives": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"parent": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"course_standards": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"contexts": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
},
"associations": {
"data": [
{
"type": "text",
"id": "text"
}
],
"links": {
"related": "text"
}
}
},
"attributes": {
"seq": 1,
"captured_by": "text",
"utilizations": [
{
"type": "alignable",
"guid": "text"
}
],
"uri": "text",
"statement": {
"addendums": [
{
"seq": 1,
"add_context": "Y",
"descr": "text",
"position": "before"
}
],
"combined_descr": "text",
"descr": "text"
},
"level": 1,
"date_modified_utc": "text",
"status": "active",
"legends": [
{
"symbol_position": "before",
"symbol": "text",
"descr": "text"
}
],
"standard_type": "organizational",
"label": "text",
"disciplines": {
"strands": [
{
"descr": "text",
"guid": "text"
}
],
"ece_domains": [
{
"guid": "text",
"code": "text",
"descr": "text"
}
],
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
],
"genres": [
{
"code": "text",
"guid": "text",
"descr": "text"
}
]
},
"alt_identifiers": [
{
"type": "GUID",
"source": "canonical",
"id": "text"
}
],
"date_deleted_utc": "text",
"in_list": "Y",
"guid": "text",
"key_ideas": [
{
"guid": "text",
"concepts": [
{
"descr": "text",
"guid": "text"
}
]
}
],
"document": {
"implementation_year": "text",
"descr": "text",
"date_modified_utc": "text",
"source_url": "text",
"assessment_year": "text",
"publication": {
"descr": "text",
"source_url": "text",
"extended_descr": "text",
"regions": [
{
"guid": "text",
"descr": "text",
"type": "country",
"code": "text"
}
],
"authorities": [
{
"guid": "text",
"descr": "text",
"acronym": "text"
}
],
"acronym": "text",
"publication_type": "standard",
"guid": "text"
},
"guid": "text",
"obsolete_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
},
"adopt_year": "text",
"revision_year": "text"
},
"deepest": "Y",
"number": {
"root_enhanced": "text",
"enhanced": "text",
"prefix_enhanced": "text",
"raw": "text",
"alternate": "text"
},
"education_levels": {
"ece_ages": [
{
"guid": "text",
"descr": "text",
"seq": 1
}
],
"grades": [
{
"guid": "text",
"descr": "text",
"code": "text",
"seq": 1
}
]
},
"section": {
"guid": "text",
"seq": 1,
"date_modified_utc": "text",
"descr": "text",
"implementation_year": "text",
"number": "text",
"assessment_year": "text",
"revision_year": "text",
"label": "text",
"obsolete_year": "text",
"adopt_year": "text",
"disciplines": {
"primary_subject": {
"code": "text",
"descr": "text",
"guid": "text"
}
}
},
"extensions": [
{
"type": "reference",
"guid": "text",
"descr": "text"
}
],
"has_list": "text",
"topic_organizer": "text"
},
"id": "text"
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"type": "text",
"id": "text",
"relationships": {
"parent": {
"data": {
"id": "text",
"type": "text"
},
"links": {
"related": "text"
}
},
"children": {
"data": [
{
"data": {
"id": "text",
"type": "text"
}
}
],
"links": {
"related": "text"
}
},
"standards": {
"links": {
"last": "text",
"related": "text",
"next": "text"
},
"data": [
{
"id": "text",
"type": "text"
}
]
}
},
"attributes": {
"date_modified_utc": "text",
"disciplines": {
"subjects": [
{
"descr": "text",
"code": "text",
"guid": "text"
}
]
},
"status": "active",
"guid": "text",
"document": {
"date_modified_utc": "text",
"guid": "text",
"revision_year": "text",
"adopt_year": "text",
"descr": "text"
},
"seq": 1,
"level": 1,
"section": {
"descr": "text",
"date_modified_utc": "text",
"seq": 1,
"guid": "text"
},
"uri": "text",
"descr": "text",
"education_levels": {
"grades": [
{
"descr": "text",
"guid": "text",
"code": "text",
"seq": 1
}
]
}
}
}
]
}{
"links": {
"self": "text",
"first": "text",
"last": "text",
"next": "text",
"prev": "text"
},
"meta": {
"took": 1,
"limit": 1,
"count": 1,
"offset": 1
},
"data": [
{
"attributes": {
"descr": "text",
"disciplines": {
"subjects": [
{
"code": "text",
"descr": "text",
"guid": "text"
}
]
},
"guid": "text",
"context": "text"
},
"id": "text",
"type": "text"
}
]
}document.publication.authorities). E.g.:The results from that call will include a set of authority facets in the meta.facet part of the JSON. For this example, let's look at the New York Standards.
Now that you have the GUID for the New York DOE authority, you can use that to narrow your focus to NY and request publications.
We'll pick the Next Generation Learning Standards and look at the documents.
Let's take that publication GUID and look for related documents.
Let's focus on the math document.
With the math document GUID, you can list the related sections.
Let's look at the Algebra II section.
Now we are ready to start to navigate the Standards. To start that process, look for Standards in the Algebra II section. The Standards are organized in a hierarchy but are not necessarily returned in that order so limit the response to the top level of the hierarchy and sort by the sequence so you are reproducing the section as a user would expect to see it. If you are using these calls to build a tree in a UI, you may want to request the children property be included in the response so your front-end code can decide whether or not to add an icon to allow the browser to expand this Standard to show its children. I'll leave it out of this example so I don't clutter the data response, but you could include that information using a fields parameter in the URL like: fields[standards]=seq,number,statement,children.
We'll ignore data paging here and assume that you can manage that part. Looking at the results, there are only a couple of branches at this level. We've simplified the data here to make it easier to read:
Now that we have the top level of Standards, we need to look at the children Standards. We'll start with the Operations and Algebraic Thinking branch and look for its children by searching for Standards that have this particular Standard as a parent. Again, we are sorting by the sequence order.
The results look something like the data below (again simplifying the response for clarity).
Now you can repeat that process for each Standard in this list - searching for Standards that have each of these as parents - until you reach the bottom of the hierarchy. As you do this, there are a few things to keep in mind:
Most documents are not consistent in the number of levels they have. The bottom level is often the level that represents a single learning objective but sometimes the bottom is an example and the level above is the objective.
Check the utilization.type of a Standard to validate its usage. alignable Standards are the learning objectives. These typically have Key Ideas, Topics and Concepts associated with them.
A common modern user interface element in selection scenarios is the "chip". A chip is a compact element that typically represents a more complex object in a tight space. If you are not familiar with chips, you can see examples on the Material Design site. The dominant attribute of chips is compactness. For this reason, the representation of a Standard as a chip is challenging. We find that using the enhanced (or pre-fix enhanced) number is the best representation of a standard on a chip combined with hover text or an info icon to allow the user to easily find a more complete definition of the Standard.
Be aware that numbers are not guaranteed to be unique and some Standards do not have numbers. When working with Standards that aren't numbered, you may want to fallback to showing the first 10-15 characters of the text. While that is not likely to be too informative, when you combine it with the ability to see more details about the standard, it should be enough for a user to understand its usage.
Standards with addenda with position set to after that have has_list set to Y are very rare, but they do occur periodically, and the rendering requires special treatment. In this case, addenda with position set to after should be displayed after the list of items. The final rendering is determined by your application, but here is an example and two likely renderings.
Statement: Determine the equation of a linear relation, given:
Before Addendum: It is expected that students will:
After Addendum: to solve problems.
Child List Standards:
a graph
a point and the slope
two points
a point and the equation of a parallel or perpendicular line
Standards are occasionally deleted when the authority makes changes that impact the intent of the Standard. When this happens, the Standard is deleted and the related GUID is "retired" so the integrity of related alignments is not tarnished by a change in the intent of the Standard. You can still access these Standards via AB Connect but there are a couple of things to keep in mind:
When looking up a standard by GUID (https://api.abconnect.instructure.com/rest/v4.1/standards/<GUID>), the system will respond with the standard regardless of whether it is deleted or not.
When filtering Standards, deleted Standards are excluded from filter results unless the filter criteria explicitly includes Standards with deleted status. E.g. status EQ 'deleted' or status IN ('active','deleted')
AB Connect tracks deleted Standards back to January 2008. Due to the evolution of the AB Connect data model, the amount of metadata available on deleted standards varies over time. Standards deleted in January 2008 have less metadata than modern standards.
Many AB Connect customers cache the data locally to support analytics and other operations that require performant combination of AB Connect data with local data. This article discusses the options for downloading that initial cache.
The first consideration is when your v4.1API access was enabled vs. when you became an Academic Benchmarks partner. If you are a new partner, the easiest approach is to implement use of the Events endpoint and start with seq GT 0. This will download all events as each document is added to your license and you can use these events to populate your local cache. See Using Events As A New Partner in the Events documentation for more details.
However, if you were a partner before v4.1was enabled for your account (or you became a customer before November 2018), the initial events to add documents to your license don't exist. In that case, a common approach is to have your system Navigate the Standards Organizational Structure and cache the Standards as the system walks the structure.
Many Academic Benchmarks partners opt to take advantage of AB Connect's fast search architecture to directly power their system search, standards and alignment activities while others prefer to cache the data locally. If you cache data, AB Connect has solutions that make updates and workflows like alignment maintenance efficient.
Standards evolve over time. Authorities frequently make minor changes to individual standards and periodically adopt new documents that replace existing standards. When a new document is adopted, it may be added to your standards delivery. Either way, it is important that you keep your cache fresh. While it is possible to purge your cache and retrieve the entire set of Standards periodically, that is inefficient and does not support the maintenance of alignments and other related data. It is more efficient and useful to request differential updates. With AB Connect, you do this using the events endpoint. You can read more about Events and keeping your cache current in the section on the Events endpoint.
As standards evolve and your content library changes and expands, you will need to update your local storage of alignments. See the paragraph titled "Locating Recent Changes to Relationships Between Assets and Standards" in the Managing and Predicting Relationships section for information on retrieving alignment changes.
If AB Connect is the system of truth for your content's metadata profiles, you can update your cache by locating and retrieving modified Assets. The following filter returns assets updated since September 2018.
Content publishers often partner with Academic Benchmarks as they expand their offerings by bringing content to new market segments and geographies through alignment to new standards. With such expansion, many publishers experience the challenge of aligning content and maintaining alignments across multiple states and authorities. AB Connect offers a wide array of metadata and functionality to assist. There are a couple of approaches you can take using AB Connect to address this challenge.
AB Connect includes standards relationships, which allow publishers to leverage existing standards alignments and expedite alignment of content from one authority to another, or across multiple states and markets segments. The advantage of this approach is a degree of automation that can drastically reduce the number of correlations that need to be hand reviewed.
Some standards documents have direct relationships to other documents - either historical (2021 document replaces the 2017 document) or from other authorities (a state derives its standards from the Common Core). For documents without a data relationship or a state published relationship to other standards, Academic Benchmarks subject matter experts curate a crosswalk relationship. E.g. Texas standards are not related to the Common Core. Academic Benchmarks curates relationships between various documents and captures the relationships in the Crosswalks field.
Standards related as Crosswalks share at least one skill. Crosswalks are based on close relationships where they are established by the authority and hand curation where they are not. Not all documents are directly crosswalked to every other document. At the time of the writing of this documentation, math, science and ELA in the US should all be mapped to at least one common document but the scope of coverage in subjects and regions will continue to expand. You can use the predictions endpoint to help get Crosswalks between documents that are not directly connected. See Generating Predictions for details.
Note that Crosswalks are not available on all accounts. See the section on Licensing Considerations for a discussion on the licensing required for access to Crosswalks.
If your content is aligned to a national document, you can use the Derivatives Relationship on the national standards to locate standards in a derived document - E.g. Common Core Math to California Common Core Content Standards.
Derivatives carry two key pieces of metadata to assist with automation: "same text" and "same Concepts." The former is true ("Y" in the API data model) if the standard in the national document is character for character the same as the standard in the derived document. The latter is true if the standard in the national document covers the same concepts. Derivatives with the same text and concepts can typically be automatically mapped to content. Most organizations automatically map derivatives with same concepts as well, but we recommend making that decision in coordination with your editorial team.
Notes:
In many cases, an authority will clearly state that their Standards are derived from a national document but in cases where they disclaim derivation but are very closely modeled after the national document, AB Connect still exposes derivative relationships.
While a Standard will often have a 1:1 mapping with a Standard in a derived state, it is possible that there are multiple Standards derived from the single national Standard. This typically happens when a state breaks out a compound Standard into multiple, more specific Standards.
There are relationships where the Standards have the same text but same Concepts is N. This occurs when a state has limited or otherwise changed the intent of the Standard through verbiage found in the hierarchical parentage of the Standard.
If your content is aligned to a derived document and you want to map to the national document, the Origins Relationship helps you do that - E.g. Georgia Standards of Excellence ELA to Common Core ELA. It is the inverse of the derivatives relationship. The approach and metadata are the same as that described above in the Derivatives section. Note that just as there may be multiple standards derived from one national standard, it is possible that a derived standard is a combination of multiple origin standards.
If your content is aligned to a derived document and you want to map to another state document derived from the same origin, you can use the Peer Derivatives Relationship. Peer derivatives are related through a common Origin Standard. An example of this relationship includes two states that have adopted the Common Core State Standards. The approach and metadata are largely the same as that of origins and derivatives but there is one caveat: the "same text" and "same concepts" metadata on the peer derivatives is with respect to the origin - not the standard you are starting from. In order to be confident that the existing alignment equates with an alignment to the new destination, both the origin AND the peer derivative same text (and/or same concepts) flags should be true. If the origin same text is Y but the peer derivative is N, then the text of the Standard you are starting with is not the same as the text of the peer derivative.
Derivatives, origins and peer derivatives are great where they exist, but how do you handle mapping alignments to non-derived authorities (e.g. Common Core to Texas) or where there is no derivative, origin or peer derivative in the destination document? Two additional relationships are provided between these documents: Peers and Crosswalks. This section gives an overview of Peers. See the above section for more details on Crosswalks.
Peers are standards that are related through alignments to common educational resources. These standards are crowd sourced from curated, targeted, resources. Due to the nature of peers, editorial staff typically review the system suggestions for applicability for their specific use case.
Note that peer relationships are strongest with math and ELA. They also offer relatively good coverage for science (grades 3-12) and some limited coverage for social studies (grades 6-12).
Where no other relationships yield good results, use Topics to casts a broad net and identify standards covering the same general topic in the desired document. This is a two-step process where you get the list of Topics a standard is related to and then look for standards in the destination state related to one or more of those Topics. Topics cover multiple grades, so you may want to add grade filtering when looking for similar standards.
Topics offer the loosest of the relationships and is good for identifying Standards that editorial staff may want to consider when other relationships don't provide more specific suggestions. Topics are available for the core 4 subject areas.
Academic Benchmarks has developed example application that can help accelerate the integration of relationships into your system and processes. See the Standards Relationship Browser and Standards Relationship Report generator in our Examples section. They include code samples that can be downloaded from the AB Connect repository and used as a starting point for your implementation.
In many instances the Standard in question does not have an exact match in the destination state. Since using relationships does not take the specifics of the content under consideration, your degree of automation is limited. Where there aren't exact matches, editorial staff will need to review system suggestions. With fewer and fewer states adhering to the Common Core, you may find that this isn't the most efficient approach for your team.
Content alignment is not a once and done situation. Standards are constantly evolving. Sometimes Standards within an existing document change. Other times the entire document is replaced by a new version. A one-time mapping using relationships doesn't address the maintenance of alignments over time.
Relationships tend to be strongest and most prevalent with ELA, math and science. Topics have good coverage of social studies.
Peer relationships are limited to authorities in the US.
Crosswalk relationships are currently focused on authorities in the US with limited support in other regions.
While using relationships to move from one document to another is relatively easy and efficient, at the end of the process you only have one more document's worth of alignments. As you expand your perspective to additional documents, as well as changes over time, you'll need to repeat this process. As you approach alignments across many authorities at one time, however, our robust machine-learning powered recommendation engine that uses your previous decisions to inform predictions can set you up to handle changes over time with a more holistic approach to alignment.
To assist, Academic Benchmarks created a recommendation engine that uses metadata descriptions of content to recommend alignments. In AB Connect, the content is represented by an Asset object and the metadata description is often referred to as an Asset profile.
Using either the API with a user interface in your system or AB Connect's alignment web solution, aligners describe content by tagging it with standards and education search terms. The recommendation engine uses the profile to make recommendations for additional standards.
While this approach takes more upfront effort from aligners to describe the content, it has several distinct advantages:
It works across all authorities and most subjects.
The engine updates recommendations as Standards are changed and new Standards become available easing long term maintenance.
Recommendations are made in the context of the specific content. The process of using relationships ignores the subtlety of the content description and errors can drift into alignments.
AB Connect can be a powerful solution for interoperability challenges between systems exchanging content. It is possible to share Assets with other AB Connect customers (referred to as Providers). The Provider who owns the Assets is referred to as the Owner. Providers that can search and read the Asset metadata profile are referred to as Consumers. When access is shared, the Consumer can use AB Connect to include the Owner's Assets in their search results and retrieve the Asset descriptions to power activities like displaying alignment information and finding related content. For example, if you are a Learning Management System (LMS) and have purchased lesson plans from one Provider and assessment questions from another, you can use AB Connect to search the lesson repository, retrieve the description of the plan and look for related questions in the assessment repository (Assets that cover the same Standards and Concepts as the lesson). This capability is facilitated using the Providers resource as well as the Owner property on the Assets. To share your Assets with other Providers, contact AB Support. We can configure the sharing for you.
When using AB Connect for interoperability, you don't need to be concerned about the AB license status of your partners. AB Connect automatically handles the Consumer's licensing and only shares data with them that they have been licensed for. This is true for reading the Asset data as well as searching. E.g. if you are using Concepts in your Asset description, a Consumer that is only licensed for Standards will not be able to include Concepts in their search criteria. Similarly, if you are only licensed for Standards, Consumers of your Assets will not be able to find them using Concepts (or Topics) because your Asset descriptions will not include Concepts (or Topics).
See the owner property in the section on Assets for details on searching by owner.
A common need in the industry is to exchange alignment and taxonomic metadata with partners to support reporting and discoverability. E.g. a school district purchases lessons from a provider. An administrator at the district imports the lesson into their LMS. While the lesson data is enough to run the lesson, alignment and taxonomies are required in order to support full discovery of the plans and analytics of the lesson usage.
What's the best way to share the content metadata with your partners?
AB Connect allows you (the Owner) to share your content's description (Asset metadata profile) with your partners (Consumers). The Consumers can retrieve your Asset's metadata directly from AB Connect using the AB Asset GUID. This approach has several advantages:
It is concise. One GUID is exchanged with your payload and it conveys the complete Asset metadata profile.
Alignments and other descriptive metadata change over time. New Standards documents are published. Alignments are adjusted. Standards are deleted. Concepts and Topics are added to the description. Exchanging the Asset GUID allows the Consumer to refresh the Asset profile dynamically.
Your AB Connect license is likely not the same as your partner's license. If you send them AB GUIDs that are not in their license, it is a violation of the license agreement and confusing for the recipient since they won't have matching data on their end. If you exchange data using the Asset profile, AB Connect filters the Consumer's view of the Asset to match their license.
Using this approach also enables your partners to search your Assets via AB Connect using the full Asset metadata profile. See the for more information on this advantage.
To setup your account to share your Asset descriptions with your partners, contact AB Support.
The taxonomic classification property in the LOM section of the manifest is a convenient place to pass the AB Asset GUID. As you can see in the example below, the GUID can be exchanged as a taxonomy entry using the source name AcademicBenchmarksAssetGUID.
For example:
While using the Asset GUID to exchange metadata with your partners is a better approach, there may be situations where you are limited to passing Standard GUIDs to a partner. The following sections outline how to include AB GUIDs in your payload.
Learnosity has integrated directly with AB Connect. This section of their documentation describes their implementation and how to configure Learnosity to work with AB for your content. While you can use custom tags in Learnosity to store your AB GUIDs with any tag name you'd like, to maximize compatibility with Learnosity's integration with AB Connect, we recommend you use the tag name lrn_ab_aligned. Following the Learnosity API documentation on setting tags, the tags portion of the payload might look like:
References
The Ed-Fi data model supports the tagging of assessment items with AB Standards GUIDs. In the Ed-Fi model, they are referred to as LearningStandards and the AB GUID is stored as the LearningStandardId.
Note that the Ed-Fi ODS will typically only house standards for the given education agency and any related origin standards that they are derived from. You will be unable to add alignments to standards in other states/districts.
References
Ed-Fi Data Standard v3.0
Ed-Fi Data Standard v2.2
IMS Global has a data element to help support the transmission of related Standards data. There does not appear to be a single page on the IMS site that concisely describes the exchange with explanations and examples, so we'll summarize it here.
Recommended Representation
The curriculumStandardsMetadata object has one optional property providerId. Per the IMS Global GUID registry the Academic Benchmarks provider ID is "AB".
The setOfGUIDs object has optional properties region and version. In spite of the inappropriate use of the phrase region, it is our recommendation that providers use the authority description (document.publication.authorities[0].descr) for this field. We'd recommend supplying the document adoption year (document.adopt_year) for the version and create a new setOfGUIDs for each document for which they are supplying Standards.
The setOfGUIDs body consists of repeated labelledGUID objects. That object consists of an optional label element and a required GUID element.
For example:
References
Thin Common Cartridge Curriculum Standards Metadata description (defers to the Common Cartridge definition)
In some situations, the consumer of alignment data may have difficulties resolving AB GUIDs they receive in a payload. The difficulties arise from two sources: stale partner caches of AB data and license differences. Both of these issues are addressed when using the API and using the Asset GUID as a means to exchange data. However, if you are exchanging individual Standards GUIDs, here are some tips:
If you receive a GUID that you don't recognize, it is either because it isn't a valid AB GUID, you aren't licensed for that particular GUID (e.g. it may be in a state or subject you haven't licensed), your cache is out of date or your partner's cache is out of date.
If you cache data, try refreshing your cache or call the API to retrieve that specific GUID. If your cache is stale and the GUID is new, the problem should be resolved. One alternative solution is to always use the API directly rather than cache data so you don't have to worry about a stale cache.
If your cache is up to date or you use the API dynamically, your partner may have a stale cache. In that case, the GUID they passed you may no longer be active. If you request the Standard by GUID from the API, even deleted Standards will be returned. You can check the Standard's status to confirm that it has been deleted.
Regardless of whether you cache data or not, if you aren't licensed for a GUID your partner passed to you, you won't be able to access it. However, you can verify this (and determine which additional units you may want to license) by requesting the Standard by GUID from the API. If it is a valid GUID but you aren't licensed for it, the API will respond with a 403. The error payload will include information that will help you work with to add it to your license.
If requesting the Standard by GUID from the API doesn't resolve the issue, the GUID your partner passed is not a valid AB GUID. Contact your partner to help resolve the issue.
In addition to traditional Standards, some authorities provide course definitions that are groups of Standards defined elsewhere but combined separately into a course. Course definitions are captured into publications where the publication_type is set to course. Those are special publications where the top level of Standards represent courses. The Standards that must be covered in the course are available in the course_standards relationship on the Standard. So, for example, to see the Standards that comprise the Florida CPALMS Language Arts - Kindergarten (#5010041) course, you would use the falling call:
The related_courses relationship points in the opposite direction, so you can get a list of courses that a Standard is used in by examining the related_courses relationship. Since related_courses points in the opposite direction of course_standards, an alternative call to the one above that returns the same data would be:
Or you could use a call like the following to get information on all of the courses that reference a standard:
From time to time, authorities edit their Standards and make minor or major changes. Minor changes are often reflected as change events on Standards but they can also result in the deleting of one Standard and a creation of another. This typically happens when the modification of the Standard is significant enough that it would impact alignments. In this case, the old GUID is retired and a new one to represent the new Standard is created. Major changes come in the form of new documents that replace all of the standards in older documents.
AB Connect offers a couple of solutions to help you manage your alignments as changes occur. One approach is to use AB Connect's prediction algorithms which maintain alignments based on the content description rather than fixed relationships with specific standards. This requires little to no extra work as alignments change. Another approach is to use the Standards relationships available in AB Connect. AB Connect supplies maps from outdated Standards to their replacements. We often refer to these as migration maps. These maps are exposed in the replaces and replaced_by relationships on the Standards. The replaced_by relationship points forward from outdated Standards to their replacements. The replaces relationship points backwards from the new Standards.
If you would like to use the prediction algorithms to maintain alignments, see the section on Managing and Predicting Relationships. If you would prefer to use the migration maps, the first step in the process would be to identify which workflow will work best for your organization. There are two general approaches that can be taken: starting with Standards or starting with Assets.
You may want to start with Standards if you have a local cache and use the events endpoint to sync the cache. In this case, you would get notifications for Standards that have been deleted or new documents that are available. You may have a different process for determining which new Standards you need to migrate alignments to or which old Standards you need to update. But whatever the approach, you start with a list of either outdated Standards or new Standards and you need to update alignments to ensure they are current.
If you are starting with a deleted or outdated Standard, the first step is to locate its replacement(s)(their may be more than one replacement). You can use the replaces relationship to search for standards that replace the Standard in question. E.g.
You can combine search criteria if you need to narrow the focus. For example, you can add document GUIDs to look for replacements in the same document when an individual Standard has been deleted.
The example above returns standard A34FE67F-9AEB-4A04-B14C-59BAE6A6404C which is NOT a "same concept" match. In this case, the interpretation of the applicability of the new Standards to the alignment may need to be reviewed by an aligner.
If you are only interested in exact concept matches, you can add that as a criteria. E.g.
But what about when a new document is added? How do you determine which Standards are being outdated? You can reverse the search direction. E.g. You know South Dakota released their 2018 English Language Arts Standards but you are currently aligned to the 2010 Standards. Where do you start? Grab a Standard from the 2018 document and either look at its replaces list or search for Standards in the 2010 document that are replaced by the Standard you are focusing on. We'll do the latter here because it is more interesting.
Here you'll get 00000CD0-D9E7-11E2-BBB0-00249DFF4B22. If you examine the relationship metadata you'll notice that they have the same concepts but not exact same wording.
Once you have the Standard that is being replaced and the Standard that is replacing it, the next step is to identify which Assets will need to be re-aligned. To locate Assets aligned to an outdated Standard (e.g. 0011921D-A923-435C-985F-FBB3C810E735), you can use a call like:
How you update the alignments is dependent on your editorial processes. E.g. can you automatically migrate alignments to new Standards as long as they have the same concepts? Or do you require the same text? What if the text is the same but the Standard moved to a new grade? These are questions that the editorial staff has already answered but they will need to be codified and applied to any automation you build.
Now let's flip that over. Rather than tightly monitor Standards, some organizations prefer a periodic review of their content alignments. In this case, you start with the Assets and look for alignments that need to be updated.
It is easy to locate Asset alignments to deleted standards. For a given Asset, you can find alignments to deleted standards using a call like:
Here we only search for Standards that are marked as accepted. There is no need to update rejected alignments and predicted alignments are automatically updated on the next snapshot (POST a set of predictions to the Asset).
Determining what alignments an Asset should have to new documents isn't possible directly from the Asset itself without using the alignment prediction functionality or examining the Standards (or at least documents) involved. So to add alignments to new documents, either use predictions, combine your asset centric approach with the Standards approach mentioned above or start with something like an alignment gap report.
One search you may find helpful is locating all Assets aligned to an older version of a document. So using the example that we used in the Standards centric approach above, the older document is South Dakota's 2010 Language Arts Standards (E1C9B054-DA22-11E2-95B3-3B359DFF4B22). To locate Assets that are good candidates for alignment to the 2018 document, use a call similar to:
When working with APIs, it's important to keep performance optimized. There are a few basic practices that can ensure top performance when working with AB Connect.
Calculating facets can be time consuming. Custom attributes on Assets can be particularly challenging as they may have unique values which will significantly impact performance. Only facet properties you need and avoid facetting properties that have unique values.
Another source of processing and network waste is the processing and returning large quantities of unused fields. We recommend using the fields parameter to request only the specific fields required for each call. Use fields[]=* only for discovery during programming. To ensure the use of wildcards with the fields parameter does not impact overall system performance, such calls are throttled to 2 per second.
Using sparse fieldsets and minimizing facet requests are simple changes that can have significant impact on the response times of calls, but the design of the your system's interaction with the API may have a larger impact.
It's tempting to make few calls and pull more data per call because you may need it. While this seems efficient on the surface, it can actually have notable impact on the overall API experience - particularly for user interfaces. In practice, it is typically more efficient and more interactive to make multiple calls and request only enough data to meet the immediate need.
Several examples:
One common mistake is to attempt to load a large set of Standards to populate a tree or set of drop-downs. This could take many seconds depending on whether you are loading a section, document or publication. A best practice is to lazy load the UI and request just enough information to show the user what they requested. The AB Connect Standards browser uses this approach for a very efficient interactive experience.
Another common scenario is searching for Assets and alignments. It is tempting to show all results or load large pages of Assets but this can result in a slow user experience and users don't typically scroll through large sets of data. It is better to show them a small page of results quickly and allow them to refine their search or page/infinite scroll the results.
It is tempting to show a lot of data in your search results but not only can this slow API response times but can clutter the user interface making it difficult to digest and navigate. Avoid things like attempting to show large quantities of properties or alignments in Asset search results. It's better to have a list or tiles with a simple title, perhaps a brief description, subject and grade. The user can use faceting to further narrow results and if they need details they drill down into the individual Asset to see things like alignments, concepts, etc.
Another common source of waste is retrieving and exposing irrelevant data to your users. If your user is an 8th grade math teacher from California, don't force them to select 8th grade math when searching for content. When displaying alignments, limit your queries to 8th grade math Standards in California. This will significantly reduce the data the system is processing and will speed up the response times.
A ContentMigration object looks like:
A Migrator object looks like:
GET /api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues
GET /api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues
GET /api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues
Scope: url:GET|/api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues
GET /api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues
Scope: url:GET|/api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues
Returns paginated migration issues
Example Request:
Returns a list of MigrationIssue objects.
GET /api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues/:id
GET /api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues/:id
GET /api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:GET|/api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues/:id
GET /api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:GET|/api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues/:id
Returns data on an individual migration issue
Example Request:
Returns a MigrationIssue object.
PUT /api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:PUT|/api/v1/accounts/:account_id/content_migrations/:content_migration_id/migration_issues/:id
PUT /api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:PUT|/api/v1/courses/:course_id/content_migrations/:content_migration_id/migration_issues/:id
PUT /api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:PUT|/api/v1/groups/:group_id/content_migrations/:content_migration_id/migration_issues/:id
PUT /api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues/:id
Scope: url:PUT|/api/v1/users/:user_id/content_migrations/:content_migration_id/migration_issues/:id
Update the workflow_state of a migration issue
Request Parameters:
workflow_state
Required string
Set the workflow_state of the issue.
Allowed values: active, resolved
Example Request:
Returns a MigrationIssue object.
GET /api/v1/accounts/:account_id/content_migrations
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations
GET /api/v1/courses/:course_id/content_migrations
Scope: url:GET|/api/v1/courses/:course_id/content_migrations
GET /api/v1/groups/:group_id/content_migrations
Scope: url:GET|/api/v1/groups/:group_id/content_migrations
GET /api/v1/users/:user_id/content_migrations
Scope: url:GET|/api/v1/users/:user_id/content_migrations
Returns paginated content migrations
Example Request:
Returns a list of ContentMigration objects.
GET /api/v1/accounts/:account_id/content_migrations/:id
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations/:id
GET /api/v1/courses/:course_id/content_migrations/:id
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/:id
GET /api/v1/groups/:group_id/content_migrations/:id
Scope: url:GET|/api/v1/groups/:group_id/content_migrations/:id
GET /api/v1/users/:user_id/content_migrations/:id
Scope: url:GET|/api/v1/users/:user_id/content_migrations/:id
Returns data on an individual content migration
Example Request:
Returns a ContentMigration object.
POST /api/v1/accounts/:account_id/content_migrations
Scope: url:POST|/api/v1/accounts/:account_id/content_migrations
POST /api/v1/courses/:course_id/content_migrations
Scope: url:POST|/api/v1/courses/:course_id/content_migrations
POST /api/v1/groups/:group_id/content_migrations
Scope: url:POST|/api/v1/groups/:group_id/content_migrations
POST /api/v1/users/:user_id/content_migrations
Scope: url:POST|/api/v1/users/:user_id/content_migrations
Create a content migration. If the migration requires a file to be uploaded the actual processing of the file will start once the file upload process is completed. File uploading works as described in the File Upload Documentation except that the values are set on a pre_attachment sub-hash.
For migrations that don’t require a file to be uploaded, like course copy, the processing will begin as soon as the migration is created.
You can use the Progress API to track the progress of the migration. The migration’s progress is linked to with the progress_url value.
The two general workflows are:
If no file upload is needed:
POST to create
Use the Progress specified in progress_url to monitor progress
For file uploading:
POST to create with file info in pre_attachment
Do file upload processing using the data in the pre_attachment data
GET the ContentMigration
Use the Progress specified in progress_url to monitor progress
Request Parameters:
migration_type
Required string
The type of the migration. Use the endpoint to see all available migrators. Default allowed values: canvas_cartridge_importer, common_cartridge_importer, course_copy_importer, zip_file_importer, qti_converter, moodle_converter
pre_attachment[name]
string
Required if uploading a file. This is the first step in uploading a file to the content migration. See the for details on the file upload workflow.
pre_attachment[*]
string
Other file upload properties, See
settings[file_url]
string
A URL to download the file from. Must not require authentication.
Example Request:
Returns a ContentMigration object.
PUT /api/v1/accounts/:account_id/content_migrations/:id
Scope: url:PUT|/api/v1/accounts/:account_id/content_migrations/:id
PUT /api/v1/courses/:course_id/content_migrations/:id
Scope: url:PUT|/api/v1/courses/:course_id/content_migrations/:id
PUT /api/v1/groups/:group_id/content_migrations/:id
Scope: url:PUT|/api/v1/groups/:group_id/content_migrations/:id
PUT /api/v1/users/:user_id/content_migrations/:id
Scope: url:PUT|/api/v1/users/:user_id/content_migrations/:id
Update a content migration. Takes same arguments as create except that you can’t change the migration type. However, changing most settings after the migration process has started will not do anything. Generally updating the content migration will be used when there is a file upload problem, or when importing content selectively. If the first upload has a problem you can supply new pre_attachment values to start the process again.
Returns a ContentMigration object.
GET /api/v1/accounts/:account_id/content_migrations/migrators
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations/migrators
GET /api/v1/courses/:course_id/content_migrations/migrators
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/migrators
GET /api/v1/groups/:group_id/content_migrations/migrators
Scope: url:GET|/api/v1/groups/:group_id/content_migrations/migrators
GET /api/v1/users/:user_id/content_migrations/migrators
Scope: url:GET|/api/v1/users/:user_id/content_migrations/migrators
Lists the currently available migration types. These values may change.
Returns a list of Migrator objects.
GET /api/v1/accounts/:account_id/content_migrations/:id/selective_data
Scope: url:GET|/api/v1/accounts/:account_id/content_migrations/:id/selective_data
GET /api/v1/courses/:course_id/content_migrations/:id/selective_data
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/:id/selective_data
GET /api/v1/groups/:group_id/content_migrations/:id/selective_data
Scope: url:GET|/api/v1/groups/:group_id/content_migrations/:id/selective_data
GET /api/v1/users/:user_id/content_migrations/:id/selective_data
Scope: url:GET|/api/v1/users/:user_id/content_migrations/:id/selective_data
Enumerates the content available for selective import in a tree structure. Each node provides a property copy argument that can be supplied to the Update endpoint to selectively copy the content associated with that tree node and its children. Each node may also provide a sub_items_url or an array of sub_items which you can use to obtain copy parameters for a subset of the resources in a given node.
If no type is sent you will get a list of the top-level sections in the content. It will look something like this:
When a type is provided, nodes may be further divided via sub_items. For example, using type=assignments results in a node for each assignment group and a sub_item for each assignment, like this:
To import the items corresponding to a particular tree node, use the property as a parameter to the Update endpoint and assign a value of 1, for example:
You can include multiple copy parameters to selectively import multiple items or groups of items.
Request Parameters:
type
string
The type of content to enumerate.
Allowed values: context_modules, assignments, quizzes, assessment_question_banks, discussion_topics, wiki_pages, context_external_tools, tool_profiles, announcements, calendar_events, rubrics, groups
GET /api/v1/courses/:course_id/content_migrations/:id/asset_id_mapping
Scope: url:GET|/api/v1/courses/:course_id/content_migrations/:id/asset_id_mapping
Given a complete course copy or blueprint import content migration, return a mapping of asset ids from the source course to the destination course that were copied in this migration or an earlier one with the same course pair and migration_type (course copy or blueprint).
The returned object’s keys are asset types as they appear in API URLs (announcements, assignments, discussion_topics, files, module_items, modules, pages, and quizzes). The values are a mapping from id in source course to id in destination course for objects of this type.
Example Request:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available on Github.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for creating and viewing course enrollments
A Grade object looks like:
An Enrollment object looks like:
GET /api/v1/courses/:course_id/enrollments
Scope: url:GET|/api/v1/courses/:course_id/enrollments
GET /api/v1/sections/:section_id/enrollments
Scope: url:GET|/api/v1/sections/:section_id/enrollments
GET /api/v1/users/:user_id/enrollments
Scope: url:GET|/api/v1/users/:user_id/enrollments
Depending on the URL given, return a paginated list of either (1) all of the enrollments in a course, (2) all of the enrollments in a section or (3) all of a user’s enrollments. This includes student, teacher, TA, and observer enrollments.
If a user has multiple enrollments in a context (e.g. as a teacher and a student or in multiple course sections), each enrollment will be listed separately.
note: Currently, only a root level admin user can return other users’ enrollments. A user can, however, return his/her own enrollments.
Enrollments scoped to a course context will include inactive states by default if the caller has account admin authorization and the state[] parameter is omitted.
Request Parameters:
Returns a list of objects.
GET /api/v1/accounts/:account_id/enrollments/:id
Scope: url:GET|/api/v1/accounts/:account_id/enrollments/:id
Get an Enrollment object by Enrollment ID
Request Parameters:
Returns an object.
POST /api/v1/courses/:course_id/enrollments
Scope: url:POST|/api/v1/courses/:course_id/enrollments
POST /api/v1/sections/:section_id/enrollments
Scope: url:POST|/api/v1/sections/:section_id/enrollments
Create a new user enrollment for a course or section.
Request Parameters:
Example Request:
Returns an object.
POST /api/v1/accounts/:account_id/bulk_enrollment
Scope: url:POST|/api/v1/accounts/:account_id/bulk_enrollment
Enrolls multiple users in one or more courses in a single operation.
Request Parameters:
Example Request:
Returns a object.
DELETE /api/v1/courses/:course_id/enrollments/:id
Scope: url:DELETE|/api/v1/courses/:course_id/enrollments/:id
Conclude, deactivate, or delete an enrollment. If the task argument isn’t given, the enrollment will be concluded.
Request Parameters:
Example Request:
Returns an object.
POST /api/v1/courses/:course_id/enrollments/:id/accept
Scope: url:POST|/api/v1/courses/:course_id/enrollments/:id/accept
accepts a pending course invitation for the current user
Example Request:
Example Response:
POST /api/v1/courses/:course_id/enrollments/:id/reject
Scope: url:POST|/api/v1/courses/:course_id/enrollments/:id/reject
rejects a pending course invitation for the current user
Example Request:
Example Response:
PUT /api/v1/courses/:course_id/enrollments/:id/reactivate
Scope: url:PUT|/api/v1/courses/:course_id/enrollments/:id/reactivate
Activates an inactive enrollment
Example Request:
Returns an object.
PUT /api/v1/courses/:course_id/users/:user_id/last_attended
Scope: url:PUT|/api/v1/courses/:course_id/users/:user_id/last_attended
Add last attended date to student enrollment in course
Request Parameters:
Example Request:
Returns an object.
BETA: This API endpoint is not finalized, and there could be breaking changes before its final release.
GET /api/v1/users/:user_id/temporary_enrollment_status
Scope: url:GET|/api/v1/users/:user_id/temporary_enrollment_status
Returns a JSON Object containing the temporary enrollment status for a user.
Request Parameters:
Example Response:
This documentation is generated directly from the Canvas LMS source code, available .
`https://api.abconnect.instructure.com/rest/v4.1/standards?facet=document.publication.authorities&limit=0&filter[standards]=status EQ 'active'` ...
{
"data": {
"guid": "9127D390-F1B9-11E5-862E-0938DC287387",
"acronym": null,
"descr": "New York DOE"
},
"count": 20047
},
....`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(document.publication.authorities.guid EQ '9127D390-F1B9-11E5-862E-0938DC287387' AND status EQ 'active')&facet=document.publication&limit=0` ...
{
"count": 2650,
"data": {
"title": "Next Generation Learning Standards",
"acronym": null,
"guid": "4D7B5584-9C82-11E7-8A3F-4EABBF03DF2F",
"descr": "Next Generation Learning Standards"
}
},
...`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(document.publication.guid EQ '4D7B5584-9C82-11E7-8A3F-4EABBF03DF2F' AND status EQ 'active')&facet=document&limit=0` ...
{
"count": 1300,
"data": {
"descr": "Mathematics",
"adopt_year": "2017",
"guid": "49C1ACA6-9CC6-11E7-8E55-D1F6CCC8CA83"
}
}
...`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(document.guid EQ '49C1ACA6-9CC6-11E7-8E55-D1F6CCC8CA83')&facet=section&limit=0` ...
{
"count": 149,
"data": {
"guid": "48382382-9CC7-11E7-BC16-0295BF03DF2F",
"descr": "Algebra II",
"seq": 2430
}
},
...`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(section.guid eq '6C23310C-6EC0-11DF-AB2D-366B9DFF4B22' and level eq 1)&sort[standards]=seq&fields[standards]=seq,number,statement,children` ...
{
"attributes": {
"number": {
"raw": "5.OA",
"enhanced": "CCSS.Math.Content.5.OA",
"prefix_enhanced": "CCSS.Math.Content.5.OA",
"alternate": "5.OA"
},
"statement": {
"addendums": [],
"descr": "Operations and Algebraic Thinking",
"combined_descr": "Operations and Algebraic Thinking"
}
},
"id": "1D9D7C1A-7053-11DF-8EBF-BE719DFF4B22",
"type": "standards"
},
{
"type": "standards",
"id": "1DACEABA-7053-11DF-8EBF-BE719DFF4B22",
"attributes": {
"statement": {
"combined_descr": "Number and Operations in Base Ten",
"descr": "Number and Operations in Base Ten",
"addendums": []
},
"number": {
"raw": "5.NBT",
"enhanced": "CCSS.Math.Content.5.NBT",
"prefix_enhanced": "CCSS.Math.Content.5.NBT",
"alternate": "5.NBT"
}
}
}
...`https://api.abconnect.instructure.com/rest/v4.1/standards?filter[standards]=(parent.id eq '1D9D7C1A-7053-11DF-8EBF-BE719DFF4B22')&sort[standards]=seq&fields[standards]=seq,number,statement,children` ...
{
"attributes": {
"number": {
"raw": null,
"prefix_enhanced": "CCSS.Math.Content.5.OA.A",
"enhanced": "CCSS.Math.Content.5.OA.A",
"alternate": "5.OA.A"
},
"statement": {
"combined_descr": "Write and interpret numerical expressions.",
"addendums": [],
"descr": "Write and interpret numerical expressions."
}
},
"id": "1D9F7E02-7053-11DF-8EBF-BE719DFF4B22",
"type": "standards"
},
{
"attributes": {
"number": {
"prefix_enhanced": "CCSS.Math.Content.5.OA.B",
"enhanced": "CCSS.Math.Content.5.OA.B",
"raw": null,
"alternate": "5.OA.B"
},
"statement": {
"descr": "Analyze patterns and relationships.",
"addendums": [],
"combined_descr": "Analyze patterns and relationships."
}
},
"id": "1DA6C82E-7053-11DF-8EBF-BE719DFF4B22",
"type": "standards"
}
... /assets?filter[assets]=(date_modified_utc gt '2018-09-12 12:00:00') ...
<metadata>
...
<lom xmlns="http://ltsc.ieee.org/xsd/LOM">
...
<classification>
<purpose>
<source>LOMv1.0</source>
<value>discipline</value>
</purpose>
<taxonPath>
<source>
<string xml:lang="en">AcademicBenchmarksAssetGUID</string>
</source>
<taxon>
<entry>
<string xml:lang="en">7E80697A-7440-11DF-93FA-01FD9CFF4B22</string>
</entry>
</taxon>
</taxonPath>
...
</classification>
...
</lom>
...
</metadata>
... ...
{
"tags": [
{
"type": "lrn_ab_aligned",
"name": "000DD508-29E9-11D8-8162-F2F2B6C137B9"
},
{
"type": "lrn_ab_aligned",
"name": "000b4dc7-adfc-46be-b72a-7a0ed91601fa"
},
{
"type": "lrn_ab_aligned",
"name": "00109D60-29E9-11D8-A8C1-FD5D7E873ABE"
}
]
}
... ...
<metadata>
<curriculumStandardsMetadataSet xmlns=/xsd/imscsmetadata_v1p0>
<curriculumStandardsMetadata providerId="AB">
<setOfGUIDs region="NGA Center/CCSSO" version="2010">
<labelledGUID>
<GUID>7E80697A-7440-11DF-93FA-01FD9CFF4B22</GUID>
</labelledGUID>
<labelledGUID>
<GUID>7E7EF798-7440-11DF-93FA-01FD9CFF4B22</GUID>
</labelledGUID>
</setOfGUIDs>
</curriculumStandardsMetadata>
</curriculumStandardsMetadataSet>
</metadata>
... /rest/v4.1/standards/2FADED92-647D-4183-89C1-17F28CF065ED?fields[standards]=statement,number,section,course_standards&include=course_standards /rest/v4.1/standards?filter[standards]=related_courses.id eq '2FADED92-647D-4183-89C1-17F28CF065ED&fields[standards]=number,statement,section' /rest/v4.1/standards/C3B5C384-E1BF-11DC-A10B-B5479DFF4B22?fields[standards]=statement,number,section,related_courses&include=related_courses /rest/v4.1/standards?filter[standards]=replaces.id eq '0011921D-A923-435C-985F-FBB3C810E735' /rest/v4.1/standards?filter[standards]=replaces.id eq '00CAA27E-AF8B-4385-AC22-285B911685B5' and replaces.same_concepts eq Y /rest/v4.1/standards?filter[standards]=replaced_by.id eq '8CB54468-0F56-4767-95DE-6D684CC9244F' and document.guid eq 'E1C9B054-DA22-11E2-95B3-3B359DFF4B22' /rest/v4.1/assets?filter[assets]=alignments.id eq '00000CD0-D9E7-11E2-BBB0-00249DFF4B22' /rest/v4.1/assets/02213D12-0A8A-11E8-AA1B-EB8924FEA1B3/alignments?filter[alignments]=status eq 'deleted' and meta.disposition eq 'accepted' /rest/v4.1/assets?filter[assets]=standards.document.guid eq 'E1C9B054-DA22-11E2-95B3-3B359DFF4B22'{
// the unique identifier for the issue
"id": 370663,
// API url to the content migration
"content_migration_url": "https://example.com/api/v1/courses/1/content_migrations/1",
// Description of the issue for the end-user
"description": "Questions in this quiz couldn't be converted",
// Current state of the issue: active, resolved
"workflow_state": "active",
// HTML Url to the Canvas page to investigate the issue
"fix_issue_html_url": "https://example.com/courses/1/quizzes/2",
// Severity of the issue: todo, warning, error
"issue_type": "warning",
// Link to a Canvas error report if present (If the requesting user has
// permissions)
"error_report_html_url": "https://example.com/error_reports/3",
// Site administrator error message (If the requesting user has permissions)
"error_message": "admin only message",
// timestamp
"created_at": "2012-06-01T00:00:00-06:00",
// timestamp
"updated_at": "2012-06-01T00:00:00-06:00"
}{
// the unique identifier for the migration
"id": 370663,
// the type of content migration
"migration_type": "common_cartridge_importer",
// the name of the content migration type
"migration_type_title": "Canvas Cartridge Importer",
// API url to the content migration's issues
"migration_issues_url": "https://example.com/api/v1/courses/1/content_migrations/1/migration_issues",
// attachment api object for the uploaded file may not be present for all
// migrations
"attachment": "{"url"=>"https://example.com/api/v1/courses/1/content_migrations/1/download_archive"}",
// The api endpoint for polling the current progress
"progress_url": "https://example.com/api/v1/progress/4",
// The user who started the migration
"user_id": 4,
// Current state of the content migration: pre_processing, pre_processed,
// running, waiting_for_select, completed, failed
"workflow_state": "running",
// timestamp
"started_at": "2012-06-01T00:00:00-06:00",
// timestamp
"finished_at": "2012-06-01T00:00:00-06:00",
// file uploading data, see {file:file.file_uploads.html File Upload
// Documentation} for file upload workflow This works a little differently in
// that all the file data is in the pre_attachment hash if there is no
// upload_url then there was an attachment pre-processing error, the error
// message will be in the message key This data will only be here after a create
// or update call
"pre_attachment": "{"upload_url"=>"", "message"=>"file exceeded quota", "upload_params"=>{}}"
}{
// The value to pass to the create endpoint
"type": "common_cartridge_importer",
// Whether this endpoint requires a file upload
"requires_file_upload": true,
// Description of the package type expected
"name": "Common Cartridge 1.0/1.1/1.2 Package",
// A list of fields this system requires
"required_settings": ["source_course_id"]
}curl https://<canvas>/api/v1/courses/<course_id>/content_migrations/<content_migration_id>/migration_issues \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/content_migrations/<content_migration_id>/migration_issues/<id> \
-H 'Authorization: Bearer <token>'curl -X PUT https://<canvas>/api/v1/courses/<course_id>/content_migrations/<content_migration_id>/migration_issues/<id> \
-H 'Authorization: Bearer <token>' \
-F 'workflow_state=resolved'curl https://<canvas>/api/v1/courses/<course_id>/content_migrations \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/content_migrations/<id> \
-H 'Authorization: Bearer <token>'(required if doing .zip file upload)curl 'https://<canvas>/api/v1/courses/<course_id>/content_migrations' \
-F 'migration_type=common_cartridge_importer' \
-F 'settings[question_bank_name]=importquestions' \
-F 'date_shift_options[old_start_date]=1999-01-01' \
-F 'date_shift_options[new_start_date]=2013-09-01' \
-F 'date_shift_options[old_end_date]=1999-04-15' \
-F 'date_shift_options[new_end_date]=2013-12-15' \
-F 'date_shift_options[day_substitutions][1]=2' \
-F 'date_shift_options[day_substitutions][2]=3' \
-F 'date_shift_options[shift_dates]=true' \
-F 'pre_attachment[name]=mycourse.imscc' \
-F 'pre_attachment[size]=12345' \
-H 'Authorization: Bearer <token>'[{
"type": "course_settings",
"property": "copy[all_course_settings]",
"title": "Course Settings"
},
{
"type": "context_modules",
"property": "copy[all_context_modules]",
"title": "Modules",
"count": 5,
"sub_items_url": "http://example.com/api/v1/courses/22/content_migrations/77/selective_data?type=context_modules"
},
{
"type": "assignments",
"property": "copy[all_assignments]",
"title": "Assignments",
"count": 2,
"sub_items_url": "http://localhost:3000/api/v1/courses/22/content_migrations/77/selective_data?type=assignments"
}][{
"type": "assignment_groups",
"title": "An Assignment Group",
"property": "copy[assignment_groups][id_i855cf145e5acc7435e1bf1c6e2126e5f]",
"sub_items": [{
"type": "assignments",
"title": "Assignment 1",
"property": "copy[assignments][id_i2102a7fa93b29226774949298626719d]"
}, {
"type": "assignments",
"title": "Assignment 2",
"property": "copy[assignments][id_i310cba275dc3f4aa8a3306bbbe380979]"
}]
}]copy[assignments][id_i310cba275dc3f4aa8a3306bbbe380979]=1curl https://<canvas>/api/v1/courses/<course_id>/content_migrations/<id>/asset_id_mapping \
-H 'Authorization: Bearer <token>'{
"assignments": {"13": "740", "14": "741"},
"discussion_topics": {"15": "743", "16": "744"}
}learning_outcomesattachmentssettings[content_export_id]
string
The id of a ContentExport to import. This allows you to import content previously exported from Canvas without needing to download and re-upload it.
settings[source_course_id]
string
The course to copy from for a course copy migration. (required if doing course copy)
settings[folder_id]
string
The folder to unzip the .zip file into for a zip_file_import.
settings[overwrite_quizzes]
boolean
Whether to overwrite quizzes with the same identifiers between content packages.
settings[question_bank_id]
integer
The existing question bank ID to import questions into if not specified in the content package.
settings[question_bank_name]
string
The question bank to import questions into if not specified in the content package, if both bank id and name are set, id will take precedence.
settings[insert_into_module_id]
integer
The id of a module in the target course. This will add all imported items (that can be added to a module) to the given module.
settings[insert_into_module_type]
string
If provided (and insert_into_module_id is supplied), only add objects of the specified type to the module.
Allowed values: assignment, discussion_topic, file, page, quiz
settings[insert_into_module_position]
integer
The (1-based) position to insert the imported items into the course (if insert_into_module_id is supplied). If this parameter is omitted, items will be added to the end of the module.
settings[move_to_assignment_group_id]
integer
The id of an assignment group in the target course. If provided, all imported assignments will be moved to the given assignment group.
settings[importer_skips]
Array
Set of importers to skip, even if otherwise selected by migration settings.
Allowed values: all_course_settings, visibility_settings
settings[import_blueprint_settings]
boolean
Import the “use as blueprint course” setting as well as the list of locked items from the source course or package. The destination course must not be associated with an existing blueprint course and cannot have any student or observer enrollments.
date_shift_options[shift_dates]
boolean
Whether to shift dates in the copied course
date_shift_options[old_start_date]
Date
The original start date of the source content/course
date_shift_options[old_end_date]
Date
The original end date of the source content/course
date_shift_options[new_start_date]
Date
The new start date for the content/course
date_shift_options[new_end_date]
Date
The new end date for the source content/course
date_shift_options[day_substitutions][X]
integer
Move anything scheduled for day ‘X’ to the specified day. (0-Sunday, 1-Monday, 2-Tuesday, 3-Wednesday, 4-Thursday, 5-Friday, 6-Saturday)
date_shift_options[remove_dates]
boolean
Whether to remove dates in the copied course. Cannot be used in conjunction with shift_dates.
selective_import
boolean
If set, perform a selective import instead of importing all content. The migration will identify the contents of the package and then stop in the waiting_for_select workflow state. At this point, use the List items endpoint to enumerate the contents of the package, identifying the copy parameters for the desired content. Then call the Update endpoint and provide these copy parameters to start the import.
select
Hash
For course_copy_importer migrations, this parameter allows you to select the objects to copy without using the selective_import argument and waiting_for_select state as is required for uploaded imports (though that workflow is also supported for course copy migrations). The keys are object types like ‘files’, ‘folders’, ‘pages’, etc. The value for each key is a list of object ids. An id can be an integer or a string. Multiple object types can be selected in the same call.
Allowed values: folders, files, attachments, quizzes, assignments, announcements, calendar_events, discussion_topics, modules, module_items, pages, rubrics
user_id
string
Filter by user_id (only valid for course or section enrollment queries). If set to the current user’s id, this is a way to determine if the user has any enrollments in the course or section, independent of whether the user has permission to view other people on the roster.
grading_period_id
integer
Return grades for the given grading_period. If this parameter is not specified, the returned grades will be for the whole course.
enrollment_term_id
integer
Returns only enrollments for the specified enrollment term. This parameter only applies to the user enrollments path. May pass the ID from the enrollment terms api or the SIS id prepended with ‘sis_term_id:’.
sis_account_id[]
string
Returns only enrollments for the specified SIS account ID(s). Does not look into sub_accounts. May pass in array or string.
sis_course_id[]
string
Returns only enrollments matching the specified SIS course ID(s). May pass in array or string.
sis_section_id[]
string
Returns only section enrollments matching the specified SIS section ID(s). May pass in array or string.
sis_user_id[]
string
Returns only enrollments for the specified SIS user ID(s). May pass in array or string.
created_for_sis_id[]
boolean
If sis_user_id is present and created_for_sis_id is true, Returns only enrollments for the specified SIS ID(s). If a user has two sis_id’s, one enrollment may be created using one of the two ids. This would limit the enrollments returned from the endpoint to enrollments that were created from a sis_import with that sis_user_id
enrollment[role]
Deprecated
Assigns a custom course-level role to the user.
enrollment[role_id]
integer
Assigns a custom course-level role to the user.
enrollment[enrollment_state]
string
If set to ‘active,’ student will be immediately enrolled in the course. Otherwise they will be required to accept a course invitation. Default is ‘invited.’.
If set to ‘inactive’, student will be listed in the course roster for teachers, but will not be able to participate in the course until their enrollment is activated.
Allowed values: active, invited, inactive
enrollment[course_section_id]
integer
The ID of the course section to enroll the student in. If the section-specific URL is used, this argument is redundant and will be ignored.
enrollment[limit_privileges_to_course_section]
boolean
If set, the enrollment will only allow the user to see and interact with users enrolled in the section given by course_section_id.
For teachers and TAs, this includes grading privileges.
Section-limited students will not see any users (including teachers and TAs) not enrolled in their sections.
enrollment[notify]
boolean
If true, a notification will be sent to the enrolled user. Notifications are not sent by default.
enrollment[self_enrollment_code]
string
If the current user is not allowed to manage enrollments in this course, but the course allows self-enrollment, the user can self- enroll as a student in the default section by passing in a valid code. When self-enrolling, the user_id must be ‘self’. The enrollment_state will be set to ‘active’ and all other arguments will be ignored.
enrollment[self_enrolled]
boolean
If true, marks the enrollment as a self-enrollment, which gives students the ability to drop the course if desired. Defaults to false.
enrollment[associated_user_id]
integer
For an observer enrollment, the ID of a student to observe. This is a one-off operation; to automatically observe all a student’s enrollments (for example, as a parent), please use the .
enrollment[sis_user_id]
string
Required if the user is being enrolled from another trusted account. The unique identifier for the user (sis_user_id) must also be accompanied by the root_account parameter. The user_id will be ignored.
enrollment[integration_id]
string
Required if the user is being enrolled from another trusted account. The unique identifier for the user (integration_id) must also be accompanied by the root_account parameter. The user_id will be ignored.
root_account
string
The domain of the account to search for the user. Will be a no-op unless the sis_user_id or integration_id parameter is also included.
type[]
string
A list of enrollment types to return. Accepted values are ‘StudentEnrollment’, ‘TeacherEnrollment’, ‘TaEnrollment’, ‘DesignerEnrollment’, and ‘ObserverEnrollment.’ If omitted, all enrollment types are returned. This argument is ignored if ‘role` is given.
role[]
string
A list of enrollment roles to return. Accepted values include course-level roles created by the Add Role API as well as the base enrollment types accepted by the ‘type` argument above.
state[]
string
Filter by enrollment state. If omitted, ‘active’ and ‘invited’ enrollments are returned. The following synthetic states are supported only when querying a user’s enrollments (either via user_id argument or via user enrollments endpoint): current_and_invited, current_and_future, current_future_and_restricted, current_and_concluded
Allowed values: active, invited, creation_pending, deleted, rejected, completed, inactive, current_and_invited, current_and_future, current_future_and_restricted, current_and_concluded
include[]
string
Array of additional information to include on the enrollment or user records. “avatar_url” and “group_ids” will be returned on the user record. If “current_points” is specified, the fields “current_points” and (if the caller has permissions to manage grades) “unposted_current_points” will be included in the “grades” hash for student enrollments.
Allowed values: avatar_url, group_ids, locked, observed_users, can_be_removed, uuid, current_points
id
Required integer
The ID of the enrollment object
enrollment[start_at]
DateTime
The start time of the enrollment, in ISO8601 format. e.g. 2012-04-18T23:08:51Z
enrollment[end_at]
DateTime
The end time of the enrollment, in ISO8601 format. e.g. 2012-04-18T23:08:51Z
enrollment[user_id]
Required string
The ID of the user to be enrolled in the course.
enrollment[type]
Required string
Enroll the user as a student, teacher, TA, observer, or designer. If no value is given, the type will be inferred by enrollment[role] if supplied, otherwise ‘StudentEnrollment’ will be used.
Allowed values: StudentEnrollment, TeacherEnrollment, TaEnrollment, ObserverEnrollment, DesignerEnrollment
user_ids[]
Required integer
The user IDs to enroll in the courses.
course_ids[]
Required integer
The course IDs to enroll each user in.
enrollment_type
string
Enroll each user as a student, teacher, TA, observer, or designer. If no value is given, the type will be ‘StudentEnrollment’.
Allowed values: StudentEnrollment, TeacherEnrollment, TaEnrollment, ObserverEnrollment, DesignerEnrollment
task
string
The action to take on the enrollment. When inactive, a user will still appear in the course roster to admins, but be unable to participate. (“inactivate” and “deactivate” are equivalent tasks)
Allowed values: conclude, delete, inactivate, deactivate
date
Date
The last attended date of a student enrollment in a course.
account_id
string
The ID of the account to check for temporary enrollment status. Defaults to the domain root account if not provided.
{
// The URL to the Canvas web UI page for the user's grades, if this is a student
// enrollment.
"html_url": "",
// The user's current grade in the class. Only included if user has permissions
// to view this grade.
"current_grade": "",
// The user's final grade for the class. Only included if user has permissions
// to view this grade.
"final_grade": "",
// The user's current score in the class. Only included if user has permissions
// to view this score.
"current_score": "",
// The user's final score for the class. Only included if user has permissions
// to view this score.
"final_score": "",
// The total points the user has earned in the class. Only included if user has
// permissions to view this score and 'current_points' is passed in the
// request's 'include' parameter.
"current_points": 150,
// The user's current grade in the class including muted/unposted assignments.
// Only included if user has permissions to view this grade, typically teachers,
// TAs, and admins.
"unposted_current_grade": "",
// The user's final grade for the class including muted/unposted assignments.
// Only included if user has permissions to view this grade, typically teachers,
// TAs, and admins..
"unposted_final_grade": "",
// The user's current score in the class including muted/unposted assignments.
// Only included if user has permissions to view this score, typically teachers,
// TAs, and admins..
"unposted_current_score": "",
// The user's final score for the class including muted/unposted assignments.
// Only included if user has permissions to view this score, typically teachers,
// TAs, and admins..
"unposted_final_score": "",
// The total points the user has earned in the class, including muted/unposted
// assignments. Only included if user has permissions to view this score
// (typically teachers, TAs, and admins) and 'current_points' is passed in the
// request's 'include' parameter.
"unposted_current_points": 150
}{
// The ID of the enrollment.
"id": 1,
// The unique id of the course.
"course_id": 1,
// The SIS Course ID in which the enrollment is associated. Only displayed if
// present. This field is only included if the user has permission to view SIS
// information.
"sis_course_id": "SHEL93921",
// The Course Integration ID in which the enrollment is associated. This field
// is only included if the user has permission to view SIS information.
"course_integration_id": "SHEL93921",
// The unique id of the user's section.
"course_section_id": 1,
// The Section Integration ID in which the enrollment is associated. This field
// is only included if the user has permission to view SIS information.
"section_integration_id": "SHEL93921",
// The SIS Account ID in which the enrollment is associated. Only displayed if
// present. This field is only included if the user has permission to view SIS
// information.
"sis_account_id": "SHEL93921",
// The SIS Section ID in which the enrollment is associated. Only displayed if
// present. This field is only included if the user has permission to view SIS
// information.
"sis_section_id": "SHEL93921",
// The SIS User ID in which the enrollment is associated. Only displayed if
// present. This field is only included if the user has permission to view SIS
// information.
"sis_user_id": "SHEL93921",
// The state of the user's enrollment in the course.
"enrollment_state": "active",
// User can only access his or her own course section.
"limit_privileges_to_course_section": true,
// The unique identifier for the SIS import. This field is only included if the
// user has permission to manage SIS information.
"sis_import_id": 83,
// The unique id of the user's account.
"root_account_id": 1,
// The enrollment type. One of 'StudentEnrollment', 'TeacherEnrollment',
// 'TaEnrollment', 'DesignerEnrollment', 'ObserverEnrollment'.
"type": "StudentEnrollment",
// The unique id of the user.
"user_id": 1,
// The unique id of the associated user. Will be null unless type is
// ObserverEnrollment.
"associated_user_id": null,
// The enrollment role, for course-level permissions. This field will match
// `type` if the enrollment role has not been customized.
"role": "StudentEnrollment",
// The id of the enrollment role.
"role_id": 1,
// The created time of the enrollment, in ISO8601 format.
"created_at": "2012-04-18T23:08:51Z",
// The updated time of the enrollment, in ISO8601 format.
"updated_at": "2012-04-18T23:08:51Z",
// The start time of the enrollment, in ISO8601 format.
"start_at": "2012-04-18T23:08:51Z",
// The end time of the enrollment, in ISO8601 format.
"end_at": "2012-04-18T23:08:51Z",
// The last activity time of the user for the enrollment, in ISO8601 format.
"last_activity_at": "2012-04-18T23:08:51Z",
// The last attended date of the user for the enrollment in a course, in ISO8601
// format.
"last_attended_at": "2012-04-18T23:08:51Z",
// The total activity time of the user for the enrollment, in seconds.
"total_activity_time": 260,
// The URL to the Canvas web UI page for this course enrollment.
"html_url": "https://...",
// The URL to the Canvas web UI page containing the grades associated with this
// enrollment.
"grades": {"html_url":"https:\/\/...","current_score":35,"current_grade":null,"final_score":6.67,"final_grade":null},
// A description of the user.
"user": {"id":3,"name":"Student 1","sortable_name":"1, Student","short_name":"Stud 1"},
// The user's override grade for the course.
"override_grade": "A",
// The user's override score for the course.
"override_score": 99.99,
// The user's current grade in the class including muted/unposted assignments.
// Only included if user has permissions to view this grade, typically teachers,
// TAs, and admins.
"unposted_current_grade": "",
// The user's final grade for the class including muted/unposted assignments.
// Only included if user has permissions to view this grade, typically teachers,
// TAs, and admins..
"unposted_final_grade": "",
// The user's current score in the class including muted/unposted assignments.
// Only included if user has permissions to view this score, typically teachers,
// TAs, and admins..
"unposted_current_score": "",
// The user's final score for the class including muted/unposted assignments.
// Only included if user has permissions to view this score, typically teachers,
// TAs, and admins..
"unposted_final_score": "",
// optional: Indicates whether the course the enrollment belongs to has grading
// periods set up. (applies only to student enrollments, and only available in
// course endpoints)
"has_grading_periods": true,
// optional: Indicates whether the course the enrollment belongs to has the
// Display Totals for 'All Grading Periods' feature enabled. (applies only to
// student enrollments, and only available in course endpoints)
"totals_for_all_grading_periods_option": true,
// optional: The name of the currently active grading period, if one exists. If
// the course the enrollment belongs to does not have grading periods, or if no
// currently active grading period exists, the value will be null. (applies only
// to student enrollments, and only available in course endpoints)
"current_grading_period_title": "Fall Grading Period",
// optional: The id of the currently active grading period, if one exists. If
// the course the enrollment belongs to does not have grading periods, or if no
// currently active grading period exists, the value will be null. (applies only
// to student enrollments, and only available in course endpoints)
"current_grading_period_id": 5,
// The user's override grade for the current grading period.
"current_period_override_grade": "A",
// The user's override score for the current grading period.
"current_period_override_score": 99.99,
// optional: The student's score in the course for the current grading period,
// including muted/unposted assignments. Only included if user has permission to
// view this score, typically teachers, TAs, and admins. If the course the
// enrollment belongs to does not have grading periods, or if no currently
// active grading period exists, the value will be null. (applies only to
// student enrollments, and only available in course endpoints)
"current_period_unposted_current_score": 95.8,
// optional: The student's score in the course for the current grading period,
// including muted/unposted assignments and including ungraded assignments with
// a score of 0. Only included if user has permission to view this score,
// typically teachers, TAs, and admins. If the course the enrollment belongs to
// does not have grading periods, or if no currently active grading period
// exists, the value will be null. (applies only to student enrollments, and
// only available in course endpoints)
"current_period_unposted_final_score": 85.25,
// optional: The letter grade equivalent of
// current_period_unposted_current_score, if available. Only included if user
// has permission to view this grade, typically teachers, TAs, and admins. If
// the course the enrollment belongs to does not have grading periods, or if no
// currently active grading period exists, the value will be null. (applies only
// to student enrollments, and only available in course endpoints)
"current_period_unposted_current_grade": "A",
// optional: The letter grade equivalent of current_period_unposted_final_score,
// if available. Only included if user has permission to view this grade,
// typically teachers, TAs, and admins. If the course the enrollment belongs to
// does not have grading periods, or if no currently active grading period
// exists, the value will be null. (applies only to student enrollments, and
// only available in course endpoints)
"current_period_unposted_final_grade": "B"
}curl https://<canvas>/api/v1/courses/:course_id/enrollments \
-X POST \
-F 'enrollment[user_id]=1' \
-F 'enrollment[type]=StudentEnrollment' \
-F 'enrollment[enrollment_state]=active' \
-F 'enrollment[course_section_id]=1' \
-F 'enrollment[limit_privileges_to_course_section]=true' \
-F 'enrollment[notify]=false'curl https://<canvas>/api/v1/courses/:course_id/enrollments \
-X POST \
-F 'enrollment[user_id]=2' \
-F 'enrollment[type]=StudentEnrollment'curl https://<canvas>/api/v1/accounts/:account_id/bulk_enrollment \
-X POST \
-F 'user_ids[]=1' \
-F 'user_ids[]=2' \
-F 'course_ids[]=10' \
-F 'course_ids[]=11' \curl https://<canvas>/api/v1/accounts/:account_id/bulk_enrollment \
-X POST \
-F 'user_ids[]=1' \
-F 'course_ids[]=10' \
-F 'course_ids[]=11' \
-F 'course_ids[]=12' \
-F 'enrollment_type=TeacherEnrollment' \curl https://<canvas>/api/v1/courses/:course_id/enrollments/:enrollment_id \
-X DELETE \
-F 'task=conclude'curl https://<canvas>/api/v1/courses/<course_id>/enrollments/:id/accept \
-X POST \
-H 'Authorization: Bearer <token>'{
"success": true
}curl https://<canvas>/api/v1/courses/<course_id>/enrollments/:id/reject \
-X POST \
-H 'Authorization: Bearer <token>'{
"success": true
}curl https://<canvas>/api/v1/courses/:course_id/enrollments/:enrollment_id/reactivate \
-X PUTcurl https://<canvas>/api/v1/courses/:course_id/user/:user_id/last_attended"
-X PUT => date="Thu%20Dec%2021%202017%2000:00:00%20GMT-0700%20(MST){
"is_provider": false, "is_recipient": true, "can_provide": false
}
Users may have other enrollments that grant privileges to multiple sections in the same course.
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for creating, accessing and updating calendar events.
A CalendarEvent object looks like:
An AssignmentEvent object looks like:
GET /api/v1/calendar_events
Scope: url:GET|/api/v1/calendar_events
Retrieve the paginated list of calendar events or assignments for the current user
Request Parameters:
Returns a list of objects.
GET /api/v1/users/:user_id/calendar_events
Scope: url:GET|/api/v1/users/:user_id/calendar_events
Retrieve the paginated list of calendar events or assignments for the specified user. To view calendar events for a user other than yourself, you must either be an observer of that user or an administrator.
Request Parameters:
Returns a list of objects.
POST /api/v1/calendar_events
Scope: url:POST|/api/v1/calendar_events
Create and return a new calendar event
Request Parameters:
Example Request:
GET /api/v1/calendar_events/:id
Scope: url:GET|/api/v1/calendar_events/:id
Returns detailed information about a specific calendar event or assignment.
Returns a object.
POST /api/v1/calendar_events/:id/reservations
Scope: url:POST|/api/v1/calendar_events/:id/reservations
POST /api/v1/calendar_events/:id/reservations/:participant_id
Scope: url:POST|/api/v1/calendar_events/:id/reservations/:participant_id
Reserves a particular time slot and return the new reservation
Request Parameters:
Example Request:
PUT /api/v1/calendar_events/:id
Scope: url:PUT|/api/v1/calendar_events/:id
Update and return a calendar event
Request Parameters:
Example Request:
DELETE /api/v1/calendar_events/:id
Scope: url:DELETE|/api/v1/calendar_events/:id
Delete an event from the calendar and return the deleted event
Request Parameters:
Example Request:
POST /api/v1/calendar_events/save_enabled_account_calendars
Scope: url:POST|/api/v1/calendar_events/save_enabled_account_calendars
Creates and updates the enabled_account_calendars and mark_feature_as_seen user preferences
Request Parameters:
Example Request:
POST /api/v1/courses/:course_id/calendar_events/timetable
Scope: url:POST|/api/v1/courses/:course_id/calendar_events/timetable
Creates and updates “timetable” events for a course. Can automaticaly generate a series of calendar events based on simple schedules (e.g. “Monday and Wednesday at 2:00pm” )
Existing timetable events for the course and course sections will be updated if they still are part of the timetable. Otherwise, they will be deleted.
Request Parameters:
Example Request:
GET /api/v1/courses/:course_id/calendar_events/timetable
Scope: url:GET|/api/v1/courses/:course_id/calendar_events/timetable
Returns the last timetable set by the endpoint
POST /api/v1/courses/:course_id/calendar_events/timetable_events
Scope: url:POST|/api/v1/courses/:course_id/calendar_events/timetable_events
Creates and updates “timetable” events for a course or course section. Similar to , but instead of generating a list of events based on a timetable schedule, this endpoint expects a complete list of events.
Request Parameters:
This documentation is generated directly from the Canvas LMS source code, available .
all_events
boolean
Defaults to false (uses start_date, end_date, and undated criteria). If true, all events are returned, ignoring start_date, end_date, and undated criteria.
context_codes[]
string
List of context codes of courses, groups, users, or accounts whose events you want to see. If not specified, defaults to the current user (i.e personal calendar, no course/group events). Limited to 10 context codes, additional ones are ignored. The format of this field is the context type, followed by an underscore, followed by the context id. For example: course_42
excludes[]
Array
Array of attributes to exclude. Possible values are “description”, “child_events” and “assignment”
includes[]
Array
Array of optional attributes to include. Possible values are “web_conference” and “series_natural_language”
important_dates
boolean
Defaults to false. If true, only events with important dates set to true will be returned.
blackout_date
boolean
Defaults to false. If true, only events with blackout date set to true will be returned.
all_events
boolean
Defaults to false (uses start_date, end_date, and undated criteria). If true, all events are returned, ignoring start_date, end_date, and undated criteria.
context_codes[]
string
List of context codes of courses, groups, users, or accounts whose events you want to see. If not specified, defaults to the current user (i.e personal calendar, no course/group events). Limited to 10 context codes, additional ones are ignored. The format of this field is the context type, followed by an underscore, followed by the context id. For example: course_42
excludes[]
Array
Array of attributes to exclude. Possible values are “description”, “child_events” and “assignment”
submission_types[]
Array
When type is “assignment”, specifies the allowable submission types for returned assignments. Ignored if type is not “assignment” or if exclude_submission_types is provided.
exclude_submission_types[]
Array
When type is “assignment”, specifies the submission types to be excluded from the returned assignments. Ignored if type is not “assignment”.
includes[]
Array
Array of optional attributes to include. Possible values are “web_conference” and “series_natural_language”
important_dates
boolean
Defaults to false If true, only events with important dates set to true will be returned.
blackout_date
boolean
Defaults to false If true, only events with blackout date set to true will be returned.
calendar_event[end_at]
DateTime
End date/time of the event.
calendar_event[location_name]
string
Location name of the event.
calendar_event[location_address]
string
Location address
calendar_event[time_zone_edited]
string
Time zone of the user editing the event. Allowed time zones are or friendlier .
calendar_event[all_day]
boolean
When true event is considered to span the whole day and times are ignored.
calendar_event[child_event_data][X][start_at]
DateTime
Section-level start time(s) if this is a course event. X can be any identifier, provided that it is consistent across the start_at, end_at and context_code
calendar_event[child_event_data][X][end_at]
DateTime
Section-level end time(s) if this is a course event.
calendar_event[child_event_data][X][context_code]
string
Context code(s) corresponding to the section-level start and end time(s).
calendar_event[duplicate][count]
number
Number of times to copy/duplicate the event. Count cannot exceed 200.
calendar_event[duplicate][interval]
number
Defaults to 1 if duplicate ‘count` is set. The interval between the duplicated events.
calendar_event[duplicate][frequency]
string
Defaults to “weekly”. The frequency at which to duplicate the event
Allowed values: daily, weekly, monthly
calendar_event[duplicate][append_iterator]
boolean
Defaults to false. If set to ‘true`, an increasing counter number will be appended to the event title when the event is duplicated. (e.g. Event 1, Event 2, Event 3, etc)
calendar_event[rrule]
string
The recurrence rule to create a series of recurring events. Its value is the defining how the event repeats. Unending series not supported.
calendar_event[blackout_date]
boolean
If the blackout_date is true, this event represents a holiday or some other special day that does not count in course pacing.
calendar_event[end_at]
DateTime
End date/time of the event.
calendar_event[location_name]
string
Location name of the event.
calendar_event[location_address]
string
Location address
calendar_event[time_zone_edited]
string
Time zone of the user editing the event. Allowed time zones are or friendlier .
calendar_event[all_day]
boolean
When true event is considered to span the whole day and times are ignored.
calendar_event[child_event_data][X][start_at]
DateTime
Section-level start time(s) if this is a course event. X can be any identifier, provided that it is consistent across the start_at, end_at and context_code
calendar_event[child_event_data][X][end_at]
DateTime
Section-level end time(s) if this is a course event.
calendar_event[child_event_data][X][context_code]
string
Context code(s) corresponding to the section-level start and end time(s).
calendar_event[rrule]
string
Valid if the event whose ID is in the URL is part of a series. This defines the shape of the recurring event series after it’s updated. Its value is the iCalendar RRULE. Unending series are not supported.
which
string
Valid if the event whose ID is in the URL is part of a series. Update just the event whose ID is in in the URL, all events in the series, or the given event and all those following. Some updates may create a new series. For example, changing the start time of this and all following events from the middle of a series.
Allowed values: one, all, following
calendar_event[blackout_date]
boolean
If the blackout_date is true, this event represents a holiday or some other special day that does not count in course pacing.
timetables[course_section_id][][location_name]
string
A location name to set for each event
events[][location_name]
string
Location name for the event
events[][code]
string
A unique identifier that can be used to update the event at a later time If one is not specified, an identifier will be generated based on the start and end times
events[][title]
string
Title for the meeting. If not present, will default to the associated course’s name
type
string
Defaults to “event”
Allowed values: event, assignment, sub_assignment
start_date
Date
Only return events since the start_date (inclusive). Defaults to today. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ.
end_date
Date
Only return events before the end_date (inclusive). Defaults to start_date. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ. If end_date is the same as start_date, then only events on that day are returned.
undated
boolean
Defaults to false (dated events only). If true, only return undated events and ignore start_date and end_date.
type
string
Defaults to “event”
Allowed values: event, assignment
start_date
Date
Only return events since the start_date (inclusive). Defaults to today. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ.
end_date
Date
Only return events before the end_date (inclusive). Defaults to start_date. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ. If end_date is the same as start_date, then only events on that day are returned.
undated
boolean
Defaults to false (dated events only). If true, only return undated events and ignore start_date and end_date.
calendar_event[context_code]
Required string
Context code of the course, group, user, or account whose calendar this event should be added to.
calendar_event[title]
string
Short title for the calendar event.
calendar_event[description]
string
Longer HTML description of the event.
calendar_event[start_at]
DateTime
Start date/time of the event.
participant_id
string
User or group id for whom you are making the reservation (depends on the participant type). Defaults to the current user (or user’s candidate group).
comments
string
Comments to associate with this reservation
cancel_existing
boolean
Defaults to false. If true, cancel any previous reservation(s) for this participant and appointment group.
calendar_event[context_code]
string
Context code of the course, group, user, or account to move this event to. Scheduler appointments and events with section-specific times cannot be moved between calendars.
calendar_event[title]
string
Short title for the calendar event.
calendar_event[description]
string
Longer HTML description of the event.
calendar_event[start_at]
DateTime
Start date/time of the event.
cancel_reason
string
Reason for deleting/canceling the event.
which
string
Valid if the event whose ID is in the URL is part of a series. Delete just the event whose ID is in in the URL, all events in the series, or the given event and all those following.
Allowed values: one, all, following
mark_feature_as_seen
boolean
Flag to mark account calendars feature as seen
enabled_account_calendars[]
Array
An array of account Ids to remember in the calendars list of the user
timetables[course_section_id][]
Array
An array of timetable objects for the course section specified by course_section_id. If course_section_id is set to “all”, events will be created for the entire course.
timetables[course_section_id][][weekdays]
string
A comma-separated list of abbreviated weekdays (Mon-Monday, Tue-Tuesday, Wed-Wednesday, Thu-Thursday, Fri-Friday, Sat-Saturday, Sun-Sunday)
timetables[course_section_id][][start_time]
string
Time to start each event at (e.g. “9:00 am”)
timetables[course_section_id][][end_time]
string
Time to end each event at (e.g. “9:00 am”)
course_section_id
string
Events will be created for the course section specified by course_section_id. If not present, events will be created for the entire course.
events[]
Array
An array of event objects to use.
events[][start_at]
DateTime
Start time for the event
events[][end_at]
DateTime
End time for the event
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing and configuring external tools on accounts and courses. "External tools" are IMS LTI links: http://www.imsglobal.org/developers/LTI/index.cfm.
For a definitive list of all supported placements for external tools and more information on configuring them, see the .
A ContextExternalTool object looks like:
A ContextExternalToolPlacement object looks like:
A ContextExternalToolMessageSettings object looks like:
An EstimatedDuration object looks like:
GET /api/v1/courses/:course_id/external_tools
Scope: url:GET|/api/v1/courses/:course_id/external_tools
GET /api/v1/accounts/:account_id/external_tools
Scope: url:GET|/api/v1/accounts/:account_id/external_tools
GET /api/v1/groups/:group_id/external_tools
Scope: url:GET|/api/v1/groups/:group_id/external_tools
Returns the paginated list of external tools for the current context. See the get request docs for a single tool for a list of properties on an external tool.
Request Parameters:
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/external_tools/sessionless_launch
Scope: url:GET|/api/v1/courses/:course_id/external_tools/sessionless_launch
GET /api/v1/accounts/:account_id/external_tools/sessionless_launch
Scope: url:GET|/api/v1/accounts/:account_id/external_tools/sessionless_launch
Returns a sessionless launch url for an external tool. Prefers the resource_link_lookup_uuid, but defaults to the other passed
NOTE: Either the resource_link_lookup_uuid, id, or url must be provided unless launch_type is assessment or module_item.
Request Parameters:
API response field:
id
The id for the external tool to be launched.
name
The name of the external tool to be launched.
url
The url to load to launch the external tool for the user.
Example Request:
GET /api/v1/courses/:course_id/external_tools/:external_tool_id
Scope: url:GET|/api/v1/courses/:course_id/external_tools/:external_tool_id
GET /api/v1/accounts/:account_id/external_tools/:external_tool_id
Scope: url:GET|/api/v1/accounts/:account_id/external_tools/:external_tool_id
Returns the specified external tool.
Returns a object.
POST /api/v1/courses/:course_id/external_tools
Scope: url:POST|/api/v1/courses/:course_id/external_tools
POST /api/v1/accounts/:account_id/external_tools
Scope: url:POST|/api/v1/accounts/:account_id/external_tools
Create an external tool in the specified course/account. The created tool will be returned, see the “show” endpoint for an example. If a client ID is supplied canvas will attempt to create a context external tool using the LTI 1.3 standard.
See the <a href=“file.lti_dev_key_config.html#placements-params”>Placements Documentation</a> for more information on what placements are available, the possible fields, and their accepted values.
Request Parameters:
Example Request:
Returns a object.
PUT /api/v1/courses/:course_id/external_tools/:external_tool_id
Scope: url:PUT|/api/v1/courses/:course_id/external_tools/:external_tool_id
PUT /api/v1/accounts/:account_id/external_tools/:external_tool_id
Scope: url:PUT|/api/v1/accounts/:account_id/external_tools/:external_tool_id
Update the specified external tool. Uses same parameters as create. Returns the updated tool.
NOTE: Any updates made to LTI 1.3 tools with this API will be overridden if any changes are made to the tool’s associated LTI Registration/Developer Key configuration. In almost all cases, changes should be made to the tool’s associated LTI Registration configuration, not individual tools.
Example Request:
Returns a object.
DELETE /api/v1/courses/:course_id/external_tools/:external_tool_id
Scope: url:DELETE|/api/v1/courses/:course_id/external_tools/:external_tool_id
DELETE /api/v1/accounts/:account_id/external_tools/:external_tool_id
Scope: url:DELETE|/api/v1/accounts/:account_id/external_tools/:external_tool_id
Remove the specified external tool
Example Request:
Returns a object.
POST /api/v1/accounts/:account_id/external_tools/rce_favorites/:id
Scope: url:POST|/api/v1/accounts/:account_id/external_tools/rce_favorites/:id
Mark the specified editor_button external tool as a favorite in the RCE editor for courses in the given account and its subaccounts (if the subaccounts haven’t set their own RCE Favorites). This places the tool in a preferred location in the RCE. Cannot mark more than 2 tools as RCE Favorites.
Example Request:
DELETE /api/v1/accounts/:account_id/external_tools/rce_favorites/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/external_tools/rce_favorites/:id
Unmark the specified external tool as a favorite in the RCE editor for the given account. The tool will remain available but will no longer appear in the preferred favorites location.
Example Request:
POST /api/v1/accounts/:account_id/external_tools/top_nav_favorites/:id
Scope: url:POST|/api/v1/accounts/:account_id/external_tools/top_nav_favorites/:id
Adds a dedicated button in Top Navigation for the specified tool for the given account. Cannot set more than 2 top_navigation Favorites.
Example Request:
DELETE /api/v1/accounts/:account_id/external_tools/top_nav_favorites/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/external_tools/top_nav_favorites/:id
Removes the dedicated button in Top Navigation for the specified tool for the given account.
Example Request:
GET /api/v1/external_tools/visible_course_nav_tools
Scope: url:GET|/api/v1/external_tools/visible_course_nav_tools
Get a list of external tools with the course_navigation placement that have not been hidden in course settings and whose visibility settings apply to the requesting user. These tools are the same that appear in the course navigation.
The response format is the same as for List external tools, but with additional context_id and context_name fields on each element in the array.
Request Parameters:
API response field:
context_id
The unique identifier of the associated context
context_name
The name of the associated context
Example Request:
Example Response:
GET /api/v1/courses/:course_id/external_tools/visible_course_nav_tools
Scope: url:GET|/api/v1/courses/:course_id/external_tools/visible_course_nav_tools
Get a list of external tools with the course_navigation placement that have not been hidden in course settings and whose visibility settings apply to the requesting user. These tools are the same that appear in the course navigation.
The response format is the same as Get visible course navigation tools.
Example Request:
This documentation is generated directly from the Canvas LMS source code, available .
{
// The ID of the calendar event
"id": 234,
// The title of the calendar event
"title": "Paintball Fight!",
// The start timestamp of the event
"start_at": "2012-07-19T15:00:00-06:00",
// The end timestamp of the event
"end_at": "2012-07-19T16:00:00-06:00",
// The HTML description of the event
"description": "<b>It's that time again!</b>",
// The location name of the event
"location_name": "Greendale Community College",
// The address where the event is taking place
"location_address": "Greendale, Colorado",
// the context code of the calendar this event belongs to (course, group, user,
// or account)
"context_code": "course_123",
// if specified, it indicates which calendar this event should be displayed on.
// for example, a section-level event would have the course's context code here,
// while the section's context code would be returned above)
"effective_context_code": null,
// the context name of the calendar this event belongs to (course, user or
// group)
"context_name": "Chemistry 101",
// a comma-separated list of all calendar contexts this event is part of
"all_context_codes": "course_123,course_456",
// Current state of the event ('active', 'locked' or 'deleted') 'locked'
// indicates that start_at/end_at cannot be changed (though the event could be
// deleted). Normally only reservations or time slots with reservations are
// locked (see the Appointment Groups API)
"workflow_state": "active",
// Whether this event should be displayed on the calendar. Only true for
// course-level events with section-level child events.
"hidden": false,
// Normally null. If this is a reservation (see the Appointment Groups API), the
// id will indicate the time slot it is for. If this is a section-level event,
// this will be the course-level parent event.
"parent_event_id": null,
// The number of child_events. See child_events (and parent_event_id)
"child_events_count": 0,
// Included by default, but may be excluded (see include[] option). If this is a
// time slot (see the Appointment Groups API) this will be a list of any
// reservations. If this is a course-level event, this will be a list of
// section-level events (if any)
"child_events": null,
// URL for this calendar event (to update, delete, etc.)
"url": "https://example.com/api/v1/calendar_events/234",
// URL for a user to view this event
"html_url": "https://example.com/calendar?event_id=234&include_contexts=course_123",
// The date of this event
"all_day_date": "2012-07-19",
// Boolean indicating whether this is an all-day event (midnight to midnight)
"all_day": false,
// When the calendar event was created
"created_at": "2012-07-12T10:55:20-06:00",
// When the calendar event was last updated
"updated_at": "2012-07-12T10:55:20-06:00",
// Various Appointment-Group-related fields.These fields are only pertinent to
// time slots (appointments) and reservations of those time slots. See the
// Appointment Groups API. The id of the appointment group
"appointment_group_id": null,
// The API URL of the appointment group
"appointment_group_url": null,
// If the event is a reservation, this a boolean indicating whether it is the
// current user's reservation, or someone else's
"own_reservation": false,
// If the event is a time slot, the API URL for reserving it
"reserve_url": null,
// If the event is a time slot, a boolean indicating whether the user has
// already made a reservation for it
"reserved": false,
// The type of participant to sign up for a slot: 'User' or 'Group'
"participant_type": "User",
// If the event is a time slot, this is the participant limit
"participants_per_appointment": null,
// If the event is a time slot and it has a participant limit, an integer
// indicating how many slots are available
"available_slots": null,
// If the event is a user-level reservation, this will contain the user
// participant JSON (refer to the Users API).
"user": null,
// If the event is a group-level reservation, this will contain the group
// participant JSON (refer to the Groups API).
"group": null,
// Boolean indicating whether this has important dates.
"important_dates": true,
// Identifies the recurring event series this event may belong to.
"series_uuid": null,
// An iCalendar RRULE for defining how events in a recurring event series
// repeat.
"rrule": null,
// Boolean indicating if is the first event in the series of recurring events.
"series_head": null,
// A natural language expression of how events occur in the series.
"series_natural_language": "Daily 5 times",
// Boolean indicating whether this has blackout date.
"blackout_date": true
}{
// A synthetic ID for the assignment
"id": "assignment_987",
// The title of the assignment
"title": "Essay",
// The due_at timestamp of the assignment
"start_at": "2012-07-19T23:59:00-06:00",
// The due_at timestamp of the assignment
"end_at": "2012-07-19T23:59:00-06:00",
// The HTML description of the assignment
"description": "<b>Write an essay. Whatever you want.</b>",
// the context code of the (course) calendar this assignment belongs to
"context_code": "course_123",
// Current state of the assignment ('published' or 'deleted')
"workflow_state": "published",
// URL for this assignment (note that updating/deleting should be done via the
// Assignments API)
"url": "https://example.com/api/v1/calendar_events/assignment_987",
// URL for a user to view this assignment
"html_url": "http://example.com/courses/123/assignments/987",
// The due date of this assignment
"all_day_date": "2012-07-19",
// Boolean indicating whether this is an all-day event (e.g. assignment due at
// midnight)
"all_day": true,
// When the assignment was created
"created_at": "2012-07-12T10:55:20-06:00",
// When the assignment was last updated
"updated_at": "2012-07-12T10:55:20-06:00",
// The full assignment JSON data (See the Assignments API)
"assignment": null,
// The list of AssignmentOverrides that apply to this event (See the Assignments
// API). This information is useful for determining which students or sections
// this assignment-due event applies to.
"assignment_overrides": null,
// Boolean indicating whether this has important dates.
"important_dates": true,
// An iCalendar RRULE for defining how events in a recurring event series
// repeat.
"rrule": "FREQ=DAILY;INTERVAL=1;COUNT=5",
// Trueif this is the first event in the series of recurring events.
"series_head": null,
// A natural language expression of how events occur in the series.
"series_natural_language": "Daily 5 times"
}curl 'https://<canvas>/api/v1/calendar_events.json' \
-X POST \
-F 'calendar_event[context_code]=course_123' \
-F 'calendar_event[title]=Paintball Fight!' \
-F 'calendar_event[start_at]=2012-07-19T21:00:00Z' \
-F 'calendar_event[end_at]=2012-07-19T22:00:00Z' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/calendar_events/345/reservations.json' \
-X POST \
-F 'cancel_existing=true' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/calendar_events/234' \
-X PUT \
-F 'calendar_event[title]=Epic Paintball Fight!' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/calendar_events/234' \
-X DELETE \
-F 'cancel_reason=Greendale layed off the janitorial staff :(' \
-F 'which=following'
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/calendar_events/save_enabled_account_calendars' \
-X POST \
-F 'mark_feature_as_seen=true' \
-F 'enabled_account_calendars[]=1' \
-F 'enabled_account_calendars[]=2' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/calendar_events/timetable' \
-X POST \
-F 'timetables[all][][weekdays]=Mon,Wed,Fri' \
-F 'timetables[all][][start_time]=11:00 am' \
-F 'timetables[all][][end_time]=11:50 am' \
-F 'timetables[all][][location_name]=Room 237' \
-H "Authorization: Bearer <token>"launch_type
string
The type of launch to perform on the external tool. Placement names (eg. “course_navigation”) can also be specified to use the custom launch url for that placement; if done, the tool id must be provided.
Allowed values: assessment, module_item
resource_link_lookup_uuid
string
The identifier to lookup a resource link.
shared_secret
Required string
The shared secret with the external tool
description
string
A description of the tool
url
string
The url to match links against. Either “url” or “domain” should be set, not both.
domain
string
The domain to match links against. Either “url” or “domain” should be set, not both.
icon_url
string
The url of the icon to show for this tool
text
string
The default text to show for this tool
custom_fields[field_name]
string
Custom fields that will be sent to the tool consumer; can be used multiple times
is_rce_favorite
boolean
(Deprecated in favor of and ) Whether this tool should appear in a preferred location in the RCE. This only applies to tools in root account contexts that have an editor button placement.
<placement_name>[<placement_configuration_key>]
variable
Set the <placement_configuration_key> value for a specific placement.
config_type
string
Configuration can be passed in as Common Cartridge XML instead of using query parameters. If this value is “by_url” or “by_xml” then an XML configuration will be expected in either the “config_xml” or “config_url” parameter. Note that the name parameter overrides the tool name provided in the XML.
Allowed values: by_url, by_xml
config_xml
string
XML tool configuration, as specified in the Common Cartridge XML specification. This is required if “config_type” is set to “by_xml”
config_url
string
URL where the server can retrieve an XML tool configuration, as specified in the Common Cartridge XML specification. This is required if “config_type” is set to “by_url”
not_selectable
boolean
Default: false. If set to true, and if resource_selection is set to false, the tool won’t show up in the external tool selection UI in modules and assignments
oauth_compliant
boolean
Default: false, if set to true LTI query params will not be copied to the post body.
unified_tool_id
string
The unique identifier for the tool in LearnPlatform
search_term
string
The partial name of the tools to match and return.
selectable
boolean
If true, then only tools that are meant to be selectable are returned.
include_parents
boolean
If true, then include tools installed in all accounts above the current context
placement
string
The placement type to filter by.
Return all tools at the current context as well as all tools from the parent, and filter the tools list to only those with a placement of ‘editor_button’
id
string
The external id of the tool to launch.
url
string
The LTI launch url for the external tool.
assignment_id
string
The assignment id for an assignment launch. Required if launch_type is set to “assessment”.
module_item_id
string
The assignment id for a module item launch. Required if launch_type is set to “module_item”.
client_id
Required string
The client id is attached to the developer key. If supplied all other parameters are unnecessary and will be ignored
name
Required string
The name of the tool
privacy_level
Required string
How much user information to send to the external tool.
Allowed values: anonymous, name_only, email_only, public
consumer_key
Required string
The consumer key for the external tool
context_codes[]
Required string
List of context_codes to retrieve visible course nav tools for (for example, course_123). Only courses are presently supported.
A ConversationParticipant object looks like:
GET /api/v1/conversations
Scope: url:GET|/api/v1/conversations
Returns the paginated list of conversations for the current user, most recent ones first.
Request Parameters:
scope
string
When set, only return conversations of the specified type. For example, set to “unread” to return only conversations that haven’t been read. The default behavior is to return all non-archived conversations (i.e. read and unread).
Allowed values: unread, starred, archived, sent
filter[]
string
When set, only return conversations for the specified courses, groups or users. The id should be prefixed with its type, e.g. “user_123”,
filter_mode
string
When filter[] contains multiple filters, combine them with this mode, filtering conversations that at have at least all of the contexts (“and”) or at least one of the contexts (“or”)
Allowed values: and, or, default or
interleave_submissions
boolean
(Obsolete) Submissions are no longer linked to conversations. This parameter is ignored.
API response field:
id
The unique identifier for the conversation.
subject
The subject of the conversation.
workflow_state
The current state of the conversation (read, unread or archived)
last_message
A <=100 character preview from the most recent message
last_message_at
The timestamp of the latest message
message_count
The number of messages in this conversation
subscribed
Indicates whether the user is actively subscribed to the conversation
private
Indicates whether this is a private conversation (i.e. audience of one)
starred
Whether the conversation is starred
properties
Additional conversation flags (last_author, attachments, media_objects). Each listed property means the flag is set to true (i.e. the current user is the most recent author, there are attachments, or there are media objects)
audience
Array of user ids who are involved in the conversation, ordered by participation level, then alphabetical. Excludes current user, unless this is a monologue.
audience_contexts
Most relevant shared contexts (courses and groups) between current user and other participants. If there is only one participant, it will also include that user’s enrollment(s)/ membership type(s) in each course/group
avatar_url
URL to appropriate icon for this conversation (custom, individual or group avatar, depending on audience)
participants
Array of users (id, name, full_name) participating in the conversation. Includes current user. If ‘include[]=participant_avatars` was passed as an argument, each user in the array will also have an “avatar_url” field. If `include[]=uuid` was passed as an argument, each user in the array will also have an “uuid” field
visible
Boolean, indicates whether the conversation is visible under the current scope and filter. This attribute is always true in the index API response, and is primarily useful in create/update responses so that you can know if the record should be displayed in the UI. The default scope is assumed, unless a scope or filter is passed to the create/update API call.
Example Response:
Returns a list of Conversation objects.
POST /api/v1/conversations
Scope: url:POST|/api/v1/conversations
Create a new conversation with one or more recipients. If there is already an existing private conversation with the given recipients, it will be reused.
Request Parameters:
recipients[]
Required string
An array of recipient ids. These may be user ids
subject
string
The subject of the conversation. This is ignored when reusing a conversation. Maximum length is 255 characters.
body
Required string
The message to be sent
force_new
boolean
Forces a new message to be created, even if there is an existing private conversation.
GET /api/v1/conversations/batches
Scope: url:GET|/api/v1/conversations/batches
Returns any currently running conversation batches for the current user. Conversation batches are created when a bulk private message is sent asynchronously (see the mode argument to the create API action).
Example Response:
GET /api/v1/conversations/:id
Scope: url:GET|/api/v1/conversations/:id
Returns information for a single conversation for the current user. Response includes all fields that are present in the list/index action as well as messages and extended participant information.
Request Parameters:
interleave_submissions
boolean
(Obsolete) Submissions are no longer linked to conversations. This parameter is ignored.
scope
string
Used when generating “visible” in the API response. See the explanation under the
Allowed values: unread, starred, archived
filter[]
string
Used when generating “visible” in the API response. See the explanation under the
filter_mode
string
Used when generating “visible” in the API response. See the explanation under the
Allowed values: and, or, default or
API response field:
participants
Array of relevant users. Includes current user. If there are forwarded messages in this conversation, the authors of those messages will also be included, even if they are not participating in this conversation. Fields include:
messages
Array of messages, newest first. Fields include:
id
The unique identifier for the message
created_at
The timestamp of the message
body
The actual message body
author_id
The id of the user who sent the message (see audience, participants)
generated
If true, indicates this is a system-generated message (e.g. “Bob added Alice to the conversation”)
media_comment
Audio/video comment data for this message (if applicable). Fields include: display_name, content-type, media_id, media_type, url
forwarded_messages
If this message contains forwarded messages, they will be included here (same format as this list). Note that those messages may have forwarded messages of their own, etc.
attachments
Array of attachments for this message. Fields include: display_name, content-type, filename, url
submissions
(Obsolete) Array of assignment submissions having comments relevant to this conversation. Submissions are no longer linked to conversations. This field will always be nil or empty.
Example Response:
PUT /api/v1/conversations/:id
Scope: url:PUT|/api/v1/conversations/:id
Updates attributes for a single conversation.
Request Parameters:
conversation[workflow_state]
string
Change the state of this conversation
Allowed values: read, unread, archived
conversation[subscribed]
boolean
Toggle the current user’s subscription to the conversation (only valid for group conversations). If unsubscribed, the user will still have access to the latest messages, but the conversation won’t be automatically flagged as unread, nor will it jump to the top of the inbox.
conversation[starred]
boolean
Toggle the starred state of the current user’s view of the conversation.
scope
string
Used when generating “visible” in the API response. See the explanation under the
Allowed values: unread, starred, archived
Example Response:
POST /api/v1/conversations/mark_all_as_read
Scope: url:POST|/api/v1/conversations/mark_all_as_read
Mark all conversations as read.
DELETE /api/v1/conversations/:id
Scope: url:DELETE|/api/v1/conversations/:id
Delete this conversation and its messages. Note that this only deletes this user’s view of the conversation.
Response includes same fields as UPDATE action
Example Response:
POST /api/v1/conversations/:id/add_recipients
Scope: url:POST|/api/v1/conversations/:id/add_recipients
Add recipients to an existing group conversation. Response is similar to the GET/show action, except that only includes the latest message (e.g. “joe was added to the conversation by bob”)
Request Parameters:
recipients[]
Required string
An array of recipient ids. These may be user ids or course/group ids prefixed with “course_” or “group_” respectively, e.g. =2&recipients[]=course_3
Example Response:
POST /api/v1/conversations/:id/add_message
Scope: url:POST|/api/v1/conversations/:id/add_message
Add a message to an existing conversation. Response is similar to the GET/show action, except that only includes the latest message (i.e. what we just sent)
An array of user ids. Defaults to all of the current conversation recipients. To explicitly send a message to no other recipients, this array should consist of the logged-in user id.
An array of message ids from this conversation to send to recipients of the new message. Recipients who already had a copy of included messages will not be affected.
Request Parameters:
body
Required string
The message to be sent.
attachment_ids[]
string
An array of attachments ids. These must be files that have been previously uploaded to the sender’s “conversation attachments” folder.
media_comment_id
string
Media comment id of an audio of video file to be associated with this message.
media_comment_type
string
Type of the associated media file.
Allowed values: audio, video
Example Response:
POST /api/v1/conversations/:id/remove_messages
Scope: url:POST|/api/v1/conversations/:id/remove_messages
Delete messages from this conversation. Note that this only affects this user’s view of the conversation. If all messages are deleted, the conversation will be as well (equivalent to DELETE)
Request Parameters:
remove[]
Required string
Array of message ids to be deleted
Example Response:
PUT /api/v1/conversations
Scope: url:PUT|/api/v1/conversations
Perform a change on a set of conversations. Operates asynchronously; use the progress endpoint to query the status of an operation.
Request Parameters:
conversation_ids[]
Required string
List of conversations to update. Limited to 500 conversations.
event
Required string
The action to take on each conversation.
Allowed values: mark_as_read, mark_as_unread, star, unstar, archive, destroy
Example Request:
Returns a Progress object.
GET /api/v1/conversations/find_recipients
Scope: url:GET|/api/v1/conversations/find_recipients
Deprecated, see the Find recipients endpoint in the Search API
GET /api/v1/conversations/unread_count
Scope: url:GET|/api/v1/conversations/unread_count
Get the number of unread conversations for the current user
Example Response:
This documentation is generated directly from the Canvas LMS source code, available on Github.
// An external tool configured for a specific context
{
// The unique identifier for the external tool
"id": 37,
// The name of the external tool
"name": "Basic 1.1 tool",
// A description of the external tool
"description": "Basic LTI 1.1 Tool",
// The launch URL for the external tool
"url": "http://example.com/launch",
// The domain to match links against. Note that this doesn't contain the
// protocol.
"domain": "example.com",
// The consumer key used by the tool (The associated shared secret is not
// returned)
"consumer_key": "key",
// Timestamp of the tool's creation
"created_at": "2037-07-21T13:29:31Z",
// Timestamp of the tool's last update
"updated_at": "2037-07-28T19:38:31Z",
// How much user information to send to the external tool
"privacy_level": "anonymous",
// Custom fields that will be sent to the tool consumer
"custom_fields": {"key":"value"},
// The current state of the external tool
"workflow_state": "public",
// Boolean determining whether this tool should be in a preferred location in
// the RCE. Only present if the tool can be an RCE favorite.
"is_rce_favorite": false,
// Boolean determining whether this tool should have a dedicated button in Top
// Navigation. Only present if the tool can be a top nav favorite.
"is_top_nav_favorite": false,
// The pixel width of the iFrame that the tool will be rendered in
"selection_width": 500,
// The pixel height of the iFrame that the tool will be rendered in
"selection_height": 500,
// The URL for the tool icon
"icon_url": "https://example.com/icon.png",
// Whether the tool is not selectable from assignment and modules
"not_selectable": false,
// The LTI version of the tool
"version": "1.1",
// The unique identifier for the tool in LearnPlatform
"unified_tool_id": null,
// The developer key id associated with this tool. Only present for LTI 1.3
// tools.
"developer_key_id": 123,
// The LTI registration id associated with this tool. Only present for LTI 1.3
// tools.
"lti_registration_id": 456,
// The unique identifier for the deployment of the tool
"deployment_id": "37:b82229c6e10bcb87beb1f1b287faee560ddc3109",
// Whether the tool can access the membership service. Only present if the
// feature is enabled.
"allow_membership_service_access": false,
// Whether to send the SIS email address in launches
"prefer_sis_email": false,
// The estimated duration for completing this tool. Only present for horizon
// courses when the tool has an estimated duration.
"estimated_duration": null,
// Configuration for account navigation placement. Null if not configured for
// this placement.
"account_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for analytics hub placement. Null if not configured for this
// placement.
"analytics_hub": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment edit placement. Null if not configured for this
// placement.
"assignment_edit": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment group menu placement. Null if not configured for
// this placement.
"assignment_group_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment index menu placement. Null if not configured for
// this placement.
"assignment_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment menu placement. Null if not configured for this
// placement.
"assignment_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment selection placement. Null if not configured for
// this placement.
"assignment_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for assignment view placement. Null if not configured for this
// placement.
"assignment_view": {"type":"ContextExternalToolPlacement"},
// Configuration for collaboration placement. Null if not configured for this
// placement.
"collaboration": {"type":"ContextExternalToolPlacement"},
// Configuration for conference selection placement. Null if not configured for
// this placement.
"conference_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for course assignments menu placement. Null if not configured
// for this placement.
"course_assignments_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for course home sub navigation placement. Null if not
// configured for this placement.
"course_home_sub_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for course navigation placement. Null if not configured for
// this placement.
"course_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for course settings sub navigation placement. Null if not
// configured for this placement.
"course_settings_sub_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for discussion topic index menu placement. Null if not
// configured for this placement.
"discussion_topic_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for discussion topic menu placement. Null if not configured for
// this placement.
"discussion_topic_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for editor button placement. Null if not configured for this
// placement.
"editor_button": {"type":"ContextExternalToolPlacement"},
// Configuration for file index menu placement. Null if not configured for this
// placement.
"file_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for file menu placement. Null if not configured for this
// placement.
"file_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for global navigation placement. Null if not configured for
// this placement.
"global_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for homework submission placement. Null if not configured for
// this placement.
"homework_submission": {"type":"ContextExternalToolPlacement"},
// Configuration for link selection placement. Null if not configured for this
// placement.
"link_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for migration selection placement. Null if not configured for
// this placement.
"migration_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for module group menu placement. Null if not configured for
// this placement.
"module_group_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for module index menu placement. Null if not configured for
// this placement.
"module_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for module index menu modal placement. Null if not configured
// for this placement.
"module_index_menu_modal": {"type":"ContextExternalToolPlacement"},
// Configuration for module menu modal placement. Null if not configured for
// this placement.
"module_menu_modal": {"type":"ContextExternalToolPlacement"},
// Configuration for module menu placement. Null if not configured for this
// placement.
"module_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for page index menu placement. Null if not configured for this
// placement.
"page_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for page menu placement. Null if not configured for this
// placement.
"page_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for post grades (sync grades) placement. Null if not configured
// for this placement.
"post_grades": {"type":"ContextExternalToolPlacement"},
// Configuration for quiz index menu placement. Null if not configured for this
// placement.
"quiz_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for quiz menu placement. Null if not configured for this
// placement.
"quiz_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for resource selection placement. Null if not configured for
// this placement. This placement is deprecated.
"resource_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for similarity detection placement. Null if not configured for
// this placement.
"similarity_detection": {"type":"ContextExternalToolPlacement"},
// Configuration for student context card placement. Null if not configured for
// this placement.
"student_context_card": {"type":"ContextExternalToolPlacement"},
// Configuration for submission type selection placement. Null if not configured
// for this placement.
"submission_type_selection": {"type":"ContextExternalToolPlacement"},
// Configuration for tool configuration placement. Null if not configured for
// this placement.
"tool_configuration": {"type":"ContextExternalToolPlacement"},
// Configuration for top navigation placement. Null if not configured for this
// placement.
"top_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for user navigation placement. Null if not configured for this
// placement.
"user_navigation": {"type":"ContextExternalToolPlacement"},
// Configuration for wiki index menu placement. Null if not configured for this
// placement.
"wiki_index_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for wiki page menu placement. Null if not configured for this
// placement.
"wiki_page_menu": {"type":"ContextExternalToolPlacement"},
// Configuration for activity asset processor placement. Null if not configured
// for this placement.
"ActivityAssetProcessor": {"type":"ContextExternalToolPlacement"},
// Configuration for activity asset processor contribution placement. Null if
// not configured for this placement.
"ActivityAssetProcessorContribution": {"type":"ContextExternalToolPlacement"},
// Configuration for placementless message types (currently only
// LtiEulaRequest).
"message_settings": [{"type":"LtiEulaRequest","enabled":true,"target_link_uri":"https:\/\/example.com\/eula","custom_fields":{"agreement_version":"2.1"}}]
}// Configuration for a specific placement of an external tool. If null, no
// configuration is present.
{
// Whether this placement is enabled
"enabled": true,
// The launch URL for this specific placement. Overrides the tool's default URL.
// For LTI 1.1 tools only.
"url": "http://example.com/launch?placement=course_navigation",
// The launch URL for this specific placement. Overrides the tool's default
// target_link_uri. For LTI 1.3 tools only.
"target_link_uri": "http://example.com/launch?placement=course_navigation",
// The text/label to display for this placement. Overridable by 'labels' in
// placement configuration.
"text": "Course Navigation Tool",
// The localized label for this placement. This is the resolved text after
// applying internationalization.
"label": "Course Navigation Tool",
// Internationalization labels for this placement. Keys are locale codes, values
// are localized text.
"labels": {"en":"Course Navigation","es":"Navegaci\u00f3n del Curso"},
// The LTI message type for this placement. Not all placements support all
// message types.
"message_type": "LtiResourceLinkRequest",
// The width of the iframe or popup for this placement
"selection_width": 500,
// The height of the iframe or popup for this placement
"selection_height": 500,
// The width of the launch window. Not standard everywhere yet.
"launch_width": 800,
// The height of the launch window. Not standard everywhere yet.
"launch_height": 600,
// The URL of the icon for this placement
"icon_url": "https://example.com/icon.png",
// The Canvas icon class to use for this placement instead of an icon URL
"canvas_icon_class": "icon-lti",
// Whether to allow fullscreen mode for this placement (top_navigation placement
// only)
"allow_fullscreen": true,
// Custom fields to be sent with this placement's launch. Merged with tool-level
// custom fields.
"custom_fields": {"placement_id":"course_nav","special_param":"value"},
// Controls who can see this placement
"visibility": "members",
// Comma-separated list of Canvas permissions required to launch from this
// placement. The user must have all permissions in order to launch the tool.
"required_permissions": "manage_course_content_edit,manage_course_content_read",
// Default display state for navigation placements. Only applies to
// account_navigation and course_navigation placements.
"default": "disabled",
// The layout type to use when launching the tool. For global_navigation and
// analytics_hub, defaults to 'full_width'.
"display_type": "full_width_in_context",
// When set to '_blank', opens placement in a new tab. Only '_blank' is
// supported.
"windowTarget": "_blank",
// Comma-separated list of media types that the tool can accept. Only valid for
// file_menu placement.
"accept_media_types": "image/*,video/*",
// If true, the tool will be launched in the tray. Only used by the
// editor_button placement.
"use_tray": true,
// An SVG path to use instead of an icon_url. Only valid for global_navigation
// placement.
"icon_svg_path_64": "M100,37L70.1,10.5v176H37...",
// Whether this placement should only be available at the root account level.
// Only applies to account_navigation placement.
"root_account_only": false,
// A description of this placement. Only valid for submission_type_selection
// placement. Maximum length of 255 characters.
"description": "Submit your work using our external tool",
// Whether resource selection is required for this placement. Only valid for
// submission_type_selection placement.
"require_resource_selection": true,
// If true, the tool will send the SIS email in the
// lis_person_contact_email_primary launch property. LTI 1.1 only.
"prefer_sis_email": false,
// If true, query parameters from the launch URL will not be copied to the POST
// body. LTI 1.1 only.
"oauth_compliant": true
}// Configuration for a placementless message type (message type that doesn't
// belong to a specific placement)
{
// The message type identifier (e.g., 'LtiEulaRequest')
"type": "LtiEulaRequest",
// Whether this message type is enabled
"enabled": true,
// The target URI for launching this message type
"target_link_uri": "https://example.com/eula",
// Custom fields specific to this message type.
"custom_fields": {"key":"value"}
}// An estimated duration for completing a learning activity
{
// The unique identifier for the estimated duration
"id": 123,
// The estimated duration in ISO 8601 format
"duration": "PT30M",
// Timestamp of when the estimated duration was created
"created_at": "2024-01-01T00:00:00Z",
// Timestamp of when the estimated duration was last updated
"updated_at": "2024-01-01T00:00:00Z"
}curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools?include_parents=true&placement=editor_button' \
-H "Authorization: Bearer <token>"parameters id, url, and launch_typeFinds the tool by id and returns a sessionless launch url
curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/sessionless_launch' \
-H "Authorization: Bearer <token>" \
-F 'id=<external_tool_id>'Finds the tool by launch url and returns a sessionless launch url
curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/sessionless_launch' \
-H "Authorization: Bearer <token>" \
-F 'url=<lti launch url>'Finds the tool associated with a specific assignment and returns a sessionless launch url
curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/sessionless_launch' \
-H "Authorization: Bearer <token>" \
-F 'launch_type=assessment' \
-F 'assignment_id=<assignment_id>'Finds the tool associated with a specific module item and returns a sessionless launch url
curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/sessionless_launch' \
-H "Authorization: Bearer <token>" \
-F 'launch_type=module_item' \
-F 'module_item_id=<module_item_id>'Finds the tool by id and returns a sessionless launch url for a specific placement
curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/sessionless_launch' \
-H "Authorization: Bearer <token>" \
-F 'id=<external_tool_id>' \
-F 'launch_type=<placement_name>'This would create a tool on this course with two custom fields and a course navigation tab
curl -X POST 'https://<canvas>/api/v1/courses/<course_id>/external_tools' \
-H "Authorization: Bearer <token>" \
-F 'name=LTI Example' \
-F 'consumer_key=asdfg' \
-F 'shared_secret=lkjh' \
-F 'url=https://example.com/ims/lti' \
-F 'privacy_level=name_only' \
-F 'custom_fields[key1]=value1' \
-F 'custom_fields[key2]=value2' \
-F 'course_navigation[text]=Course Materials' \
-F 'course_navigation[enabled]=true'This would create a tool on the account with navigation for the user profile page
curl -X POST 'https://<canvas>/api/v1/accounts/<account_id>/external_tools' \
-H "Authorization: Bearer <token>" \
-F 'name=LTI Example' \
-F 'consumer_key=asdfg' \
-F 'shared_secret=lkjh' \
-F 'url=https://example.com/ims/lti' \
-F 'privacy_level=name_only' \
-F 'user_navigation[url]=https://example.com/ims/lti/user_endpoint' \
-F 'user_navigation[text]=Something Cool'
-F 'user_navigation[enabled]=true'This would create a tool on the account with configuration pulled from an external URL
curl -X POST 'https://<canvas>/api/v1/accounts/<account_id>/external_tools' \
-H "Authorization: Bearer <token>" \
-F 'name=LTI Example' \
-F 'consumer_key=asdfg' \
-F 'shared_secret=lkjh' \
-F 'config_type=by_url' \
-F 'config_url=https://example.com/ims/lti/tool_config.xml'This would update the specified keys on this external tool
curl -X PUT 'https://<canvas>/api/v1/courses/<course_id>/external_tools/<external_tool_id>' \
-H "Authorization: Bearer <token>" \
-F 'name=Public Example' \
-F 'privacy_level=public'This would delete the specified external tool
curl -X DELETE 'https://<canvas>/api/v1/courses/<course_id>/external_tools/<external_tool_id>' \
-H "Authorization: Bearer <token>"curl -X POST 'https://<canvas>/api/v1/accounts/<account_id>/external_tools/rce_favorites/<id>' \
-H "Authorization: Bearer <token>"curl -X DELETE 'https://<canvas>/api/v1/accounts/<account_id>/external_tools/rce_favorites/<id>' \
-H "Authorization: Bearer <token>"curl -X POST 'https://<canvas>/api/v1/accounts/<account_id>/external_tools/top_nav_favorites/<id>' \
-H "Authorization: Bearer <token>"curl -X DELETE 'https://<canvas>/api/v1/accounts/<account_id>/external_tools/top_nav_favorites/<id>' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/external_tools/visible_course_nav_tools?context_codes[]=course_5' \
-H "Authorization: Bearer <token>"[{
"id": 1,
"domain": "domain.example.com",
"url": "http://www.example.com/ims/lti",
"context_id": 5,
"context_name": "Example Course",
...
},
{ ... }]curl 'https://<canvas>/api/v1/courses/<course_id>/external_tools/visible_course_nav_tools' \
-H "Authorization: Bearer <token>"{
// the unique identifier for the conversation.
"id": 2,
// the subject of the conversation.
"subject": "2",
// The current state of the conversation (read, unread or archived).
"workflow_state": "unread",
// A <=100 character preview from the most recent message.
"last_message": "sure thing, here's the file",
// the date and time at which the last message was sent.
"start_at": "2011-09-02T12:00:00Z",
// the number of messages in the conversation.
"message_count": 2,
// whether the current user is subscribed to the conversation.
"subscribed": true,
// whether the conversation is private.
"private": true,
// whether the conversation is starred.
"starred": true,
// Additional conversation flags (last_author, attachments, media_objects). Each
// listed property means the flag is set to true (i.e. the current user is the
// most recent author, there are attachments, or there are media objects)
"properties": null,
// Array of user ids who are involved in the conversation, ordered by
// participation level, then alphabetical. Excludes current user, unless this is
// a monologue.
"audience": null,
// Most relevant shared contexts (courses and groups) between current user and
// other participants. If there is only one participant, it will also include
// that user's enrollment(s)/ membership type(s) in each course/group.
"audience_contexts": null,
// URL to appropriate icon for this conversation (custom, individual or group
// avatar, depending on audience).
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-group-50.png",
// Array of users participating in the conversation. Includes current user.
"participants": null,
// indicates whether the conversation is visible under the current scope and
// filter. This attribute is always true in the index API response, and is
// primarily useful in create/update responses so that you can know if the
// record should be displayed in the UI. The default scope is assumed, unless a
// scope or filter is passed to the create/update API call.
"visible": true,
// Name of the course or group in which the conversation is occurring.
"context_name": "Canvas 101"
}{
// The user ID for the participant.
"id": 2,
// A short name the user has selected, for use in conversations or other less
// formal places through the site.
"name": "Shelly",
// The full name of the user.
"full_name": "Sheldon Cooper",
// If requested, this field will be included and contain a url to retrieve the
// user's avatar.
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-50.png",
// The Canvas UUID for the participant.
"uuid": "W9GQIcdoDTqwX8mxIunDQQVL6WZTaGmpa5xovmCB"
}"uuid:W9GQIcdoDTqwX8mxIunDQQVL6WZTaGmpa5xovmCB", or "course_456".
For users, you can use either their numeric ID or UUID prefixed with "uuid:".
Can be an array (by setting "filter[]") or single value (by setting "filter")[
{
"id": 2,
"subject": "conversations api example",
"workflow_state": "unread",
"last_message": "sure thing, here's the file",
"last_message_at": "2011-09-02T12:00:00Z",
"message_count": 2,
"subscribed": true,
"private": true,
"starred": false,
"properties": ["attachments"],
"audience": [2],
"audience_contexts": {"courses": {"1": ["StudentEnrollment"]}, "groups": {}},
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-group-50.png",
"participants": [
{"id": 1, "name": "Joe", "full_name": "Joe TA"},
{"id": 2, "name": "Jane", "full_name": "Jane Teacher"}
],
"visible": true,
"context_name": "Canvas 101"
}
](either numeric IDs or UUIDs prefixed with "uuid:"),
or course/group ids prefixed with "course_" or "group_" respectively, e.g.
recipients[]=1&recipients[]=uuid:W9GQIcdoDTqwX8mxIunDQQVL6WZTaGmpa5xovmCBx&recipients[]=course_3.
If the course/group has over 100 enrollments, 'bulk_message' and 'group_conversation' must be
set to true.[
{
"id": 1,
"subject": "conversations api example",
"workflow_state": "created",
"completion": 0.1234,
"tags": [],
"message":
{
"id": 1,
"created_at": "2011-09-02T10:00:00Z",
"body": "quick reminder, no class tomorrow",
"author_id": 1,
"generated": false,
"media_comment": null,
"forwarded_messages": [],
"attachments": []
}
}
]{
"id": 2,
"subject": "conversations api example",
"workflow_state": "unread",
"last_message": "sure thing, here's the file",
"last_message_at": "2011-09-02T12:00:00-06:00",
"message_count": 2,
"subscribed": true,
"private": true,
"starred": false,
"properties": ["attachments"],
"audience": [2],
"audience_contexts": {"courses": {"1": []}, "groups": {}},
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-50.png",
"participants": [
{"id": 1, "name": "Joe", "full_name": "Joe TA"},
{"id": 2, "name": "Jane", "full_name": "Jane Teacher"},
{"id": 3, "name": "Bob", "full_name": "Bob Student"}
],
"messages":
[
{
"id": 3,
"created_at": "2011-09-02T12:00:00Z",
"body": "sure thing, here's the file",
"author_id": 2,
"generated": false,
"media_comment": null,
"forwarded_messages": [],
"attachments": [{"id": 1, "display_name": "notes.doc", "uuid": "abcdefabcdefabcdefabcdefabcdef"}]
},
{
"id": 2,
"created_at": "2011-09-02T11:00:00Z",
"body": "hey, bob didn't get the notes. do you have a copy i can give him?",
"author_id": 2,
"generated": false,
"media_comment": null,
"forwarded_messages":
[
{
"id": 1,
"created_at": "2011-09-02T10:00:00Z",
"body": "can i get a copy of the notes? i was out",
"author_id": 3,
"generated": false,
"media_comment": null,
"forwarded_messages": [],
"attachments": []
}
],
"attachments": []
}
],
"submissions": []
}{
"id": 2,
"subject": "conversations api example",
"workflow_state": "read",
"last_message": "sure thing, here's the file",
"last_message_at": "2011-09-02T12:00:00-06:00",
"message_count": 2,
"subscribed": true,
"private": true,
"starred": false,
"properties": ["attachments"],
"audience": [2],
"audience_contexts": {"courses": {"1": []}, "groups": {}},
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-50.png",
"participants": [{"id": 1, "name": "Joe", "full_name": "Joe TA"}]
}{
"id": 2,
"subject": "conversations api example",
"workflow_state": "read",
"last_message": null,
"last_message_at": null,
"message_count": 0,
"subscribed": true,
"private": true,
"starred": false,
"properties": []
}{
"id": 2,
"subject": "conversations api example",
"workflow_state": "read",
"last_message": "let's talk this over with jim",
"last_message_at": "2011-09-02T12:00:00-06:00",
"message_count": 2,
"subscribed": true,
"private": false,
"starred": null,
"properties": [],
"audience": [2, 3, 4],
"audience_contexts": {"courses": {"1": []}, "groups": {}},
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-group-50.png",
"participants": [
{"id": 1, "name": "Joe", "full_name": "Joe TA"},
{"id": 2, "name": "Jane", "full_name": "Jane Teacher"},
{"id": 3, "name": "Bob", "full_name": "Bob Student"},
{"id": 4, "name": "Jim", "full_name": "Jim Admin"}
],
"messages":
[
{
"id": 4,
"created_at": "2011-09-02T12:10:00Z",
"body": "Jim was added to the conversation by Joe TA",
"author_id": 1,
"generated": true,
"media_comment": null,
"forwarded_messages": [],
"attachments": []
}
]
}{
"id": 2,
"subject": "conversations api example",
"workflow_state": "unread",
"last_message": "let's talk this over with jim",
"last_message_at": "2011-09-02T12:00:00-06:00",
"message_count": 2,
"subscribed": true,
"private": false,
"starred": null,
"properties": [],
"audience": [2, 3],
"audience_contexts": {"courses": {"1": []}, "groups": {}},
"avatar_url": "https://canvas.instructure.com/images/messages/avatar-group-50.png",
"participants": [
{"id": 1, "name": "Joe", "full_name": "Joe TA"},
{"id": 2, "name": "Jane", "full_name": "Jane Teacher"},
{"id": 3, "name": "Bob", "full_name": "Bob Student"}
],
"messages":
[
{
"id": 3,
"created_at": "2011-09-02T12:00:00Z",
"body": "let's talk this over with jim",
"author_id": 2,
"generated": false,
"media_comment": null,
"forwarded_messages": [],
"attachments": []
}
]
}{
"id": 2,
"subject": "conversations api example",
"workflow_state": "read",
"last_message": "sure thing, here's the file",
"last_message_at": "2011-09-02T12:00:00-06:00",
"message_count": 1,
"subscribed": true,
"private": true,
"starred": null,
"properties": ["attachments"]
}curl https://<canvas>/api/v1/conversations \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'event=mark_as_read' \
-d 'conversation_ids[]=1' \
-d 'conversation_ids[]=2'{'unread_count': '7'}include_all_conversation_ids
boolean
Default is false. If true, the top-level element of the response will be an object rather than an array, and will have the keys “conversations” which will contain the paged conversation data, and “conversation_ids” which will contain the ids of all conversations under this scope/filter in the same order.
include[]
string
“participant_avatars”
Optionally include an “avatar_url” key for each user participating in the conversation
“uuid”
Optionally include an “uuid” key for each user participating in the conversation
Allowed values: participant_avatars, uuid
group_conversation
boolean
Defaults to false. When false, individual private conversations will be created with each recipient. If true, this will be a group conversation (i.e. all recipients may see all messages and replies). Must be set true if the number of recipients is over the set maximum (default is 100).
attachment_ids[]
string
An array of attachments ids. These must be files that have been previously uploaded to the sender’s “conversation attachments” folder.
media_comment_id
string
Media comment id of an audio or video file to be associated with this message.
media_comment_type
string
Type of the associated media file
Allowed values: audio, video
mode
string
Determines whether the messages will be created/sent synchronously or asynchronously. Defaults to sync, and this option is ignored if this is a group conversation or there is just one recipient (i.e. it must be a bulk private message). When sent async, the response will be an empty array (batch status can be queried via the batches API)
Allowed values: sync, async
scope
string
Used when generating “visible” in the API response. See the explanation under the index API action
Allowed values: unread, starred, archived
filter[]
string
Used when generating “visible” in the API response. See the explanation under the index API action
filter_mode
string
Used when generating “visible” in the API response. See the explanation under the index API action
Allowed values: and, or, default or
context_code
string
The course or group that is the context for this conversation. Same format as courses or groups in the recipients argument.
include[]
string
“uuid”
Optionally include an “uuid” key for each user participating in the conversation
Allowed values: uuid
auto_mark_as_read
boolean
Default true. If true, unread conversations will be automatically marked as read. This will default to false in a future API release, so clients should explicitly send true if that is the desired behavior.
filter[]
string
Used when generating “visible” in the API response. See the explanation under the index API action
filter_mode
string
Used when generating “visible” in the API response. See the explanation under the index API action
Allowed values: and, or, default or
recipients[]
string
no description
included_messages[]
string
no description
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing account data.
An Account object looks like:
A TermsOfService object looks like:
A HelpLink object looks like:
A HelpLinks object looks like:
GET /api/v1/accounts
Scope: url:GET|/api/v1/accounts
A paginated list of accounts that the current user can view or manage. Typically, students and even teachers will get an empty list in response, only account admins can view the accounts that they are in.
Request Parameters:
Returns a list of objects.
GET /api/v1/manageable_accounts
Scope: url:GET|/api/v1/manageable_accounts
A paginated list of accounts where the current user has permission to create or manage courses. List will be empty for students and teachers as only admins can view which accounts they are in.
Returns a list of objects.
GET /api/v1/course_creation_accounts
Scope: url:GET|/api/v1/course_creation_accounts
A paginated list of accounts where the current user has permission to create courses.
Returns a list of objects.
GET /api/v1/course_accounts
Scope: url:GET|/api/v1/course_accounts
A paginated list of accounts that the current user can view through their admin course enrollments. (Teacher, TA, or designer enrollments). Only returns “id”, “name”, “workflow_state”, “root_account_id” and “parent_account_id”
Returns a list of objects.
GET /api/v1/accounts/:id
Scope: url:GET|/api/v1/accounts/:id
Retrieve information on an individual account, given by id or sis sis_account_id.
Returns an object.
GET /api/v1/accounts/:account_id/settings
Scope: url:GET|/api/v1/accounts/:account_id/settings
Returns a JSON object containing a subset of settings for the specified account. It’s possible an empty set will be returned if no settings are applicable. The caller must be an Account admin with the manage_account_settings permission.
Example Request:
Example Response:
GET /api/v1/settings/environment
Scope: url:GET|/api/v1/settings/environment
Return a hash of global settings for the root account This is the same information supplied to the web interface as ENV.SETTINGS.
Example Request:
Example Response:
GET /api/v1/accounts/:account_id/permissions
Scope: url:GET|/api/v1/accounts/:account_id/permissions
Returns permission information for the calling user and the given account. You may use ‘self` as the account id to check permissions against the domain root account. The caller must have an account role or admin (teacher/TA/designer) enrollment in a course in the account.
See also the and counterparts.
Request Parameters:
Example Request:
Example Response:
GET /api/v1/accounts/:account_id/sub_accounts
Scope: url:GET|/api/v1/accounts/:account_id/sub_accounts
List accounts that are sub-accounts of the given account.
Request Parameters:
Example Request:
Returns a list of objects.
GET /api/v1/accounts/:account_id/terms_of_service
Scope: url:GET|/api/v1/accounts/:account_id/terms_of_service
Returns the terms of service for that account
Returns a object.
GET /api/v1/accounts/:account_id/help_links
Scope: url:GET|/api/v1/accounts/:account_id/help_links
Returns the help links for that account
Returns a object.
GET /api/v1/manually_created_courses_account
Scope: url:GET|/api/v1/manually_created_courses_account
Returns the sub-account that contains manually created courses for the domain root account.
Returns an object.
GET /api/v1/accounts/:account_id/courses
Scope: url:GET|/api/v1/accounts/:account_id/courses
Retrieve a paginated list of courses in this account.
Request Parameters:
Returns a list of objects.
PUT /api/v1/accounts/:id
Scope: url:PUT|/api/v1/accounts/:id
Update an existing account.
Request Parameters:
Example Request:
Returns an object.
DELETE /api/v1/accounts/:account_id/users/:user_id
Scope: url:DELETE|/api/v1/accounts/:account_id/users/:user_id
Delete a user record from a Canvas root account. If a user is associated with multiple root accounts (in a multi-tenant instance of Canvas), this action will NOT remove them from the other accounts.
WARNING: This API will allow a user to remove themselves from the account. If they do this, they won’t be able to make API calls or log into Canvas at that account.
Example Request:
Returns an object.
DELETE /api/v1/accounts/:account_id/users
Scope: url:DELETE|/api/v1/accounts/:account_id/users
Delete multiple users from a Canvas root account. If a user is associated with multiple root accounts (in a multi-tenant instance of Canvas), this action will NOT remove them from the other accounts.
WARNING: This API will allow a user to remove themselves from the account. If they do this, they won’t be able to make API calls or log into Canvas at that account.
Example Request:
Returns a object.
PUT /api/v1/accounts/:account_id/users/bulk_update
Scope: url:PUT|/api/v1/accounts/:account_id/users/bulk_update
Updates multiple users in bulk.
Request Parameters:
Example Request:
Returns a object.
PUT /api/v1/accounts/:account_id/users/:user_id/restore
Scope: url:PUT|/api/v1/accounts/:account_id/users/:user_id/restore
Restore a user record along with the most recently deleted pseudonym from a Canvas root account.
Example Request:
Returns an object.
POST /api/v1/accounts/:account_id/sub_accounts
Scope: url:POST|/api/v1/accounts/:account_id/sub_accounts
Add a new sub-account to a given account.
Request Parameters:
Returns an object.
DELETE /api/v1/accounts/:account_id/sub_accounts/:id
Scope: url:DELETE|/api/v1/accounts/:account_id/sub_accounts/:id
Cannot delete an account with active courses or active sub_accounts. Cannot delete a root_account
Returns an object.
This documentation is generated directly from the Canvas LMS source code, available .
completed
boolean
If true, include only completed courses (these may be in state ‘completed’, or their enrollment term may have ended). If false, exclude completed courses. If not present, do not filter on completed status.
blueprint
boolean
If true, include only blueprint courses. If false, exclude them. If not present, do not filter on this basis.
blueprint_associated
boolean
If true, include only courses that inherit content from a blueprint course. If false, exclude them. If not present, do not filter on this basis.
public
boolean
If true, include only public courses. If false, exclude them. If not present, do not filter on this basis.
by_teachers[]
integer
List of User IDs of teachers; if supplied, include only courses taught by one of the referenced users.
by_subaccounts[]
integer
List of Account IDs; if supplied, include only courses associated with one of the referenced subaccounts.
hide_enrollmentless_courses
boolean
If present, only return courses that have at least one enrollment. Equivalent to ‘with_enrollments=true’; retained for compatibility.
state[]
string
If set, only return courses that are in the given state(s). By default, all states but “deleted” are returned.
Allowed values: created, claimed, available, completed, deleted, all
enrollment_term_id
integer
If set, only includes courses from the specified term.
search_term
string
The partial course name, code, or full ID to match and return in the results list. Must be at least 3 characters.
include[]
string
All explanations can be seen in the
“sections”, “needs_grading_count” and “total_scores” are not valid options at the account level
Allowed values: syllabus_body, term
sort
string
The column to sort results by.
Allowed values: course_status, course_name, sis_course_id, teacher, account_name
order
string
The order to sort the given column by.
Allowed values: asc, desc
search_by
string
The filter to search by. “course” searches for course names, course codes, and SIS IDs. “teacher” searches for teacher names
Allowed values: course, teacher
starts_before
Date
If set, only return courses that start before the value (inclusive) or their enrollment term starts before the value (inclusive) or both the course’s start_at and the enrollment term’s start_at are set to null. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ.
ends_after
Date
If set, only return courses that end after the value (inclusive) or their enrollment term ends after the value (inclusive) or both the course’s end_at and the enrollment term’s end_at are set to null. The value should be formatted as: yyyy-mm-dd or ISO 8601 YYYY-MM-DDTHH:MM:SSZ.
homeroom
boolean
If set, only return homeroom courses.
account[default_user_storage_quota_mb]
integer
The default user storage quota to be used, if not otherwise specified.
account[default_group_storage_quota_mb]
integer
The default group storage quota to be used, if not otherwise specified.
account[course_template_id]
integer
The ID of a course to be used as a template for all newly created courses. Empty means to inherit the setting from parent account, 0 means to not use a template even if a parent account has one set. The course must be marked as a template.
account[parent_account_id]
integer
The ID of a parent account to move the account to. The new parent account must be in the same root account as the original. The hierarchy of sub-accounts will be preserved in the new parent account. The caller must be an administrator in both the original parent account and the new parent account.
account[settings][restrict_student_past_view][value]
boolean
Restrict students from viewing courses after end date
account[settings][restrict_student_past_view][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][restrict_student_future_view][value]
boolean
Restrict students from viewing courses before start date
account[settings][microsoft_sync_enabled]
boolean
Determines whether this account has Microsoft Teams Sync enabled or not.
Note that if you are altering Microsoft Teams sync settings you must enable the Microsoft Group enrollment syncing feature flag. In addition, if you are enabling Microsoft Teams sync, you must also specify a tenant, login attribute, and a remote attribute. Specifying a suffix to use is optional.
account[settings][microsoft_sync_tenant]
string
The tenant this account should use when using Microsoft Teams Sync. This should be an Azure Active Directory domain name.
account[settings][microsoft_sync_login_attribute]
string
The attribute this account should use to lookup users when using Microsoft Teams Sync. Must be one of “sub”, “email”, “oid”, “preferred_username”, or “integration_id”.
account[settings][microsoft_sync_login_attribute_suffix]
string
A suffix that will be appended to the result of the login attribute when associating Canvas users with Microsoft users. Must be under 255 characters and contain no whitespace. This field is optional.
account[settings][microsoft_sync_remote_attribute]
string
The Active Directory attribute to use when associating Canvas users with Microsoft users. Must be one of “mail”, “mailNickname”, or “userPrincipalName”.
account[settings][restrict_student_future_view][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][lock_all_announcements][value]
boolean
Disable comments on announcements
account[settings][lock_all_announcements][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][usage_rights_required][value]
boolean
Copyright and license information must be provided for files before they are published.
account[settings][usage_rights_required][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][restrict_student_future_listing][value]
boolean
Restrict students from viewing future enrollments in course list
account[settings][restrict_student_future_listing][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][conditional_release][value]
boolean
Enable or disable individual learning paths for students based on assessment
account[settings][conditional_release][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][enable_course_paces][value]
boolean
Enable or disable course pacing
account[settings][enable_course_paces][locked]
boolean
Lock this setting for sub-accounts and courses
account[settings][password_policy]
Hash
Hash of optional password policy configuration parameters for a root account
allow_login_suspension boolean
Allow suspension of user logins upon reaching maximum_login_attempts
require_number_characters boolean
Require the use of number characters when setting up a new password
account[settings][enable_as_k5_account][value]
boolean
Enable or disable Canvas for Elementary for this account
account[settings][use_classic_font_in_k5][value]
boolean
Whether or not the classic font is used on the dashboard. Only applies if enable_as_k5_account is true.
account[settings][horizon_account][value]
boolean
Enable or disable Canvas Career for this account
override_sis_stickiness
boolean
Default is true. If false, any fields containing “sticky” changes will not be updated. See SIS CSV Format documentation for information on which fields can have SIS stickiness
account[settings][lock_outcome_proficiency][value]
boolean
DEPRECATED
Restrict instructors from changing mastery scale
account[lock_outcome_proficiency][locked]
boolean
DEPRECATED
Lock this setting for sub-accounts and courses
account[settings][lock_proficiency_calculation][value]
boolean
DEPRECATED
Restrict instructors from changing proficiency calculation method
account[lock_proficiency_calculation][locked]
boolean
DEPRECATED
Lock this setting for sub-accounts and courses
account[services]
Hash
Give this a set of keys and boolean values to enable or disable services matching the keys
account[default_group_storage_quota_mb]
integer
The default group storage quota to be used, if not otherwise specified.
include[]
string
Array of additional information to include.
“lti_guid”
the ‘tool_consumer_instance_guid’ that will be sent for this account on LTI launches
“registration_settings”
returns info about the privacy policy and terms of use
“services”
returns services and whether they are enabled (requires account management permissions)
“course_count”
returns the number of courses directly under each account
“sub_account_count”
returns the number of sub-accounts directly under each account
Allowed values: lti_guid, registration_settings, services, course_count, sub_account_count
permissions[]
string
List of permissions to check against the authenticated user. Permission names are documented in the List assignable permissions endpoint.
recursive
boolean
If true, the entire account tree underneath this account will be returned (though still paginated). If false, only direct sub-accounts of this account will be returned. Defaults to false.
order
string
Sorts the accounts by id or name. Only applies when recursive is false. Defaults to id.
Allowed values: id, name
include[]
string
Array of additional information to include.
“course_count”
returns the number of courses directly under each account
“sub_account_count”
returns the number of sub-accounts directly under each account
Allowed values: course_count, sub_account_count
with_enrollments
boolean
If true, include only courses with at least one enrollment. If false, include only courses with no enrollments. If not present, do not filter on course enrollment status.
enrollment_type[]
string
If set, only return courses that have at least one user enrolled in in the course with one of the specified enrollment types.
Allowed values: teacher, student, ta, observer, designer
enrollment_workflow_state[]
string
If set, only return courses that have at least one user enrolled in in the course with one of the specified enrollment workflow states.
Allowed values: active, completed, deleted, invited, pending, creation_pending, rejected, inactive
published
boolean
If true, include only published courses. If false, exclude published courses. If not present, do not filter on published status.
account[name]
string
Updates the account name
account[sis_account_id]
string
Updates the account sis_account_id Must have manage_sis permission and must not be a root_account.
account[default_time_zone]
string
The default time zone of the account. Allowed time zones are IANA time zones or friendlier Ruby on Rails time zones.
account[default_storage_quota_mb]
integer
The default course storage quota to be used, if not otherwise specified.
user_ids
string
Array
The IDs of the users to update.
user
Hash
The attributes to update for each user.
account[name]
Required string
The name of the new sub-account.
account[sis_account_id]
string
The account’s identifier in the Student Information System.
account[default_storage_quota_mb]
integer
The default course storage quota to be used, if not otherwise specified.
account[default_user_storage_quota_mb]
integer
The default user storage quota to be used, if not otherwise specified.
{
// the ID of the Account object
"id": 2,
// The display name of the account
"name": "Canvas Account",
// The UUID of the account
"uuid": "WvAHhY5FINzq5IyRIJybGeiXyFkG3SqHUPb7jZY5",
// The account's parent ID, or null if this is the root account
"parent_account_id": 1,
// The ID of the root account, or null if this is the root account
"root_account_id": 1,
// The storage quota for the account in megabytes, if not otherwise specified
"default_storage_quota_mb": 500,
// The storage quota for a user in the account in megabytes, if not otherwise
// specified
"default_user_storage_quota_mb": 50,
// The storage quota for a group in the account in megabytes, if not otherwise
// specified
"default_group_storage_quota_mb": 50,
// The default time zone of the account. Allowed time zones are
// {http://www.iana.org/time-zones IANA time zones} or friendlier
// {http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html Ruby on Rails
// time zones}.
"default_time_zone": "America/Denver",
// The account's identifier in the Student Information System. Only included if
// the user has permission to view SIS information.
"sis_account_id": "123xyz",
// The account's identifier in the Student Information System. Only included if
// the user has permission to view SIS information.
"integration_id": "123xyz",
// The id of the SIS import if created through SIS. Only included if the user
// has permission to manage SIS information.
"sis_import_id": 12,
// The number of courses directly under the account (available via include)
"course_count": 10,
// The number of sub-accounts directly under the account (available via include)
"sub_account_count": 10,
// The account's identifier that is sent as context_id in LTI launches.
"lti_guid": "123xyz",
// The state of the account. Can be 'active' or 'deleted'.
"workflow_state": "active"
}{
// Terms Of Service id
"id": 1,
// The given type for the Terms of Service
"terms_type": "default",
// Boolean dictating if the user must accept Terms of Service
"passive": false,
// The id of the root account that owns the Terms of Service
"account_id": 1,
// Content of the Terms of Service
"content": "To be or not to be that is the question",
// The type of self registration allowed
"self_registration_type": "["none", "observer", "all"]"
}{
// The ID of the help link
"id": "instructor_question",
// The name of the help link
"text": "Ask Your Instructor a Question",
// The description of the help link
"subtext": "Questions are submitted to your instructor",
// The URL of the help link
"url": "#teacher_feedback",
// The type of the help link
"type": "default",
// The roles that have access to this help link
"available_to": ["user", "student", "teacher", "admin", "observer", "unenrolled"]
}{
// Help link button title
"help_link_name": "Help And Policies",
// Help link button icon
"help_link_icon": "help",
// Help links defined by the account. Could include default help links.
"custom_help_links": [{"id":"link1","text":"Custom Link!","subtext":"Something something.","url":"https:\/\/google.com","type":"custom","available_to":["user","student","teacher","admin","observer","unenrolled"],"is_featured":true,"is_new":false,"feature_headline":"Check this out!"}],
// Default help links provided when account has not set help links of their own.
"default_help_links": [{"available_to":["student"],"text":"Ask Your Instructor a Question","subtext":"Questions are submitted to your instructor","url":"#teacher_feedback","type":"default","id":"instructor_question","is_featured":false,"is_new":true,"feature_headline":""}, {"available_to":["user","student","teacher","admin","observer","unenrolled"],"text":"Search the Canvas Guides","subtext":"Find answers to common questions","url":"https:\/\/community.canvaslms.com\/t5\/Guides\/ct-p\/guides","type":"default","id":"search_the_canvas_guides","is_featured":false,"is_new":false,"feature_headline":""}, {"available_to":["user","student","teacher","admin","observer","unenrolled"],"text":"Report a Problem","subtext":"If Canvas misbehaves, tell us about it","url":"#create_ticket","type":"default","id":"report_a_problem","is_featured":false,"is_new":false,"feature_headline":""}]
}curl https://<canvas>/api/v1/accounts/<account_id>/settings \
-H 'Authorization: Bearer <token>'{"microsoft_sync_enabled": true, "microsoft_sync_login_attribute_suffix": false}curl 'http://<canvas>/api/v1/settings/environment' \
-H "Authorization: Bearer <token>"{ "calendar_contexts_limit": 10, "open_registration": false, ...}curl https://<canvas>/api/v1/accounts/self/permissions \
-H 'Authorization: Bearer <token>' \
-d 'permissions[]=manage_account_memberships' \
-d 'permissions[]=become_user'{'manage_account_memberships': 'false', 'become_user': 'true'}curl https://<canvas>/api/v1/accounts/<account_id>/sub_accounts \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/accounts/<account_id> \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'account[name]=New account name' \
-d 'account[default_time_zone]=Mountain Time (US & Canada)' \
-d 'account[default_storage_quota_mb]=450'curl https://<canvas>/api/v1/accounts/3/users/5 \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-X DELETEcurl https://<canvas>/api/v1/accounts/3/users \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-X DELETE
-d 'user_ids[]=1' \
-d 'user_ids[]=2'curl https://<canvas>/api/v1/accounts/3/users/bulk_update \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'user_ids[]=1' \
-d 'user_ids[]=2' \
-d 'user[event]=suspend'curl https://<canvas>/api/v1/accounts/3/users/5/restore \
-H 'Authorization: Bearer <ACCESS_TOKEN>' \
-X PUTcourse_progressstorage_quota_used_mbtotal_studentsteachersaccount_nameconcludedpost_manuallyRequire the use of symbol characters when setting up a new password
minimum_character_length integer
Minimum number of characters required for a new password
maximum_login_attempts integer
Maximum number of login attempts before a user is locked out
Required feature option:
Enhance password optionsWelcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing and participating in discussion topics in groups and courses.
A FileAttachment object looks like:
A DiscussionTopic object looks like:
GET /api/v1/courses/:course_id/discussion_topics
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics
GET /api/v1/groups/:group_id/discussion_topics
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics
Returns the paginated list of discussion topics for this course or group.
Request Parameters:
Example Request:
Returns a list of objects.
POST /api/v1/courses/:course_id/discussion_topics
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics
POST /api/v1/groups/:group_id/discussion_topics
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics
Create an new discussion topic for the course or group.
Request Parameters:
Example Request:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id
Update an existing discussion topic for the course or group.
Request Parameters:
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id
Deletes the discussion topic. This will also delete the assignment, if it’s an assignment discussion.
Example Request:
POST /api/v1/courses/:course_id/discussion_topics/reorder
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/reorder
POST /api/v1/groups/:group_id/discussion_topics/reorder
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/reorder
Puts the pinned discussion topics in the specified order. All pinned topics should be included.
Request Parameters:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:id
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:id
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:id
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:id
Update an existing discussion entry.
The entry must have been created by the current user, or the current user must have admin rights to the discussion. If the edit is not allowed, a 401 will be returned.
Request Parameters:
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:id
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:id
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:id
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:id
Delete a discussion entry.
The entry must have been created by the current user, or the current user must have admin rights to the discussion. If the delete is not allowed, a 401 will be returned.
The discussion will be marked deleted, and the user_id and message will be cleared out.
Example Request:
GET /api/v1/courses/:course_id/discussion_topics/:topic_id
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id
GET /api/v1/groups/:group_id/discussion_topics/:topic_id
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id
Returns data on an individual discussion topic. See the List action for the response formatting.
Request Parameters:
Example Request:
GET /api/v1/courses/:course_id/discussion_topics/:topic_id/summaries
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id/summaries
GET /api/v1/groups/:group_id/discussion_topics/:topic_id/summaries
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id/summaries
Returns: (1) last userInput (what current user had keyed in to produce the last discussion summary), (2) last discussion summary generated by the current user for current discussion topic, based on userInput, (3) and some usage information.
Example Request:
Example Response:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/summaries
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/summaries
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/summaries
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/summaries
Generates a summary for a discussion topic. Returns the summary text and usage information.
Request Parameters:
Example Request:
Example Response:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/summaries/disable
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/summaries/disable
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/summaries/disable
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/summaries/disable
Deprecated, to remove after VICE-5047 gets merged Disables the summary for a discussion topic.
Example Request:
Example Response:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/summaries/:summary_id/feedback
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/summaries/:summary_id/feedback
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/summaries/:summary_id/feedback
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/summaries/:summary_id/feedback
Persists feedback on a discussion topic summary.
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/discussion_topics/:topic_id/view
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id/view
GET /api/v1/groups/:group_id/discussion_topics/:topic_id/view
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id/view
Return a cached structure of the discussion topic, containing all entries, their authors, and their message bodies.
May require (depending on the topic) that the user has posted in the topic. If it is required, and the user has not posted, will respond with a 403 Forbidden status and the body ‘require_initial_post’.
In some rare situations, this cached structure may not be available yet. In that case, the server will respond with a 503 error, and the caller should try again soon.
The response is an object containing the following keys:
“participants”: A list of summary information on users who have posted to the discussion. Each value is an object containing their id, display_name, and avatar_url.
“unread_entries”: A list of entry ids that are unread by the current user. this implies that any entry not in this list is read.
“entry_ratings”: A map of entry ids to ratings by the current user. Entries not in this list have no rating. Only populated if rating is enabled.
“forced_entries”: A list of entry ids that have forced_read_state set to true. This flag is meant to indicate the entry’s read_state has been manually set to ‘unread’ by the user, so the entry should not be automatically marked as read.
Example Request:
Example Response:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/entries
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/entries
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries
Create a new entry in a discussion topic. Returns a json representation of the created entry (see documentation for ‘entries’ method) on success.
Request Parameters:
Example Request:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/duplicate
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/duplicate
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/duplicate
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/duplicate
Duplicate a discussion topic according to context (Course/Group)
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/discussion_topics/:topic_id/entries
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries
GET /api/v1/groups/:group_id/discussion_topics/:topic_id/entries
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries
Retrieve the (paginated) top-level entries in a discussion topic.
May require (depending on the topic) that the user has posted in the topic. If it is required, and the user has not posted, will respond with a 403 Forbidden status and the body ‘require_initial_post’.
Will include the 10 most recent replies, if any, for each entry returned.
If the topic is a root topic with children corresponding to groups of a group assignment, entries from those subtopics for which the user belongs to the corresponding group will be returned.
Ordering of returned entries is newest-first by posting timestamp (reply activity is ignored).
API response field:
id
The unique identifier for the entry.
user_id
The unique identifier for the author of the entry.
editor_id
The unique user id of the person to last edit the entry, if different than user_id.
user_name
The name of the author of the entry.
message
The content of the entry.
read_state
The read state of the entry, “read” or “unread”.
forced_read_state
Whether the read_state was forced (was set manually)
created_at
The creation time of the entry, in ISO8601 format.
updated_at
The updated time of the entry, in ISO8601 format.
attachment
JSON representation of the attachment for the entry, if any. Present only if there is an attachment.
attachments
Deprecated. Same as attachment, but returned as a one-element array. Present only if there is an attachment.
recent_replies
The 10 most recent replies for the entry, newest first. Present only if there is at least one reply.
has_more_replies
True if there are more than 10 replies for the entry (i.e., not all were included in this response). Present only if there is at least one reply.
Example Response:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/replies
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/replies
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/replies
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/replies
Add a reply to an entry in a discussion topic. Returns a json representation of the created reply (see documentation for ‘replies’ method) on success.
May require (depending on the topic) that the user has posted in the topic. If it is required, and the user has not posted, will respond with a 403 Forbidden status and the body ‘require_initial_post’.
Request Parameters:
Example Request:
GET /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/replies
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/replies
GET /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/replies
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/replies
Retrieve the (paginated) replies to a top-level entry in a discussion topic.
May require (depending on the topic) that the user has posted in the topic. If it is required, and the user has not posted, will respond with a 403 Forbidden status and the body ‘require_initial_post’.
Ordering of returned entries is newest-first by creation timestamp.
API response field:
id
The unique identifier for the reply.
user_id
The unique identifier for the author of the reply.
editor_id
The unique user id of the person to last edit the entry, if different than user_id.
user_name
The name of the author of the reply.
message
The content of the reply.
read_state
The read state of the entry, “read” or “unread”.
forced_read_state
Whether the read_state was forced (was set manually)
created_at
The creation time of the reply, in ISO8601 format.
Example Response:
GET /api/v1/courses/:course_id/discussion_topics/:topic_id/entry_list
Scope: url:GET|/api/v1/courses/:course_id/discussion_topics/:topic_id/entry_list
GET /api/v1/groups/:group_id/discussion_topics/:topic_id/entry_list
Scope: url:GET|/api/v1/groups/:group_id/discussion_topics/:topic_id/entry_list
Retrieve a paginated list of discussion entries, given a list of ids.
May require (depending on the topic) that the user has posted in the topic. If it is required, and the user has not posted, will respond with a 403 Forbidden status and the body ‘require_initial_post’.
Request Parameters:
API response field:
id
The unique identifier for the reply.
user_id
The unique identifier for the author of the reply.
user_name
The author’s display name, or null for anonymous topics when the author is not an instructor.
message
The content of the reply.
read_state
The read state of the entry, “read” or “unread”.
forced_read_state
Whether the read_state was forced (was set manually)
created_at
The creation time of the reply, in ISO8601 format.
deleted
If the entry has been deleted, returns true. The user_id, user_name, and message will not be returned for deleted entries.
Example Request:
Example Response:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/read
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/read
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/read
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/read
Mark the initial text of the discussion topic as read.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Example Request:
PUT /api/v1/courses/:course_id/discussion_topics/read_all
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/read_all
PUT /api/v1/groups/:group_id/discussion_topics/read_all
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/read_all
Mark the initial text of all the discussion topics as read in the context.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id/read
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id/read
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id/read
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id/read
Mark the initial text of the discussion topic as unread.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Example Request:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/read_all
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/read_all
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/read_all
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/read_all
Mark the discussion topic and all its entries as read.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Request Parameters:
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id/read_all
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id/read_all
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id/read_all
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id/read_all
Mark the discussion topic and all its entries as unread.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Request Parameters:
Example Request:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/read
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/read
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/read
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/read
Mark a discussion entry as read.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Request Parameters:
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/read
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/read
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/read
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/read
Mark a discussion entry as unread.
No request fields are necessary.
On success, the response will be 204 No Content with an empty body.
Request Parameters:
Example Request:
POST /api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/rating
Scope: url:POST|/api/v1/courses/:course_id/discussion_topics/:topic_id/entries/:entry_id/rating
POST /api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/rating
Scope: url:POST|/api/v1/groups/:group_id/discussion_topics/:topic_id/entries/:entry_id/rating
Rate a discussion entry.
On success, the response will be 204 No Content with an empty body.
Request Parameters:
Example Request:
PUT /api/v1/courses/:course_id/discussion_topics/:topic_id/subscribed
Scope: url:PUT|/api/v1/courses/:course_id/discussion_topics/:topic_id/subscribed
PUT /api/v1/groups/:group_id/discussion_topics/:topic_id/subscribed
Scope: url:PUT|/api/v1/groups/:group_id/discussion_topics/:topic_id/subscribed
Subscribe to a topic to receive notifications about new entries
On success, the response will be 204 No Content with an empty body
Example Request:
DELETE /api/v1/courses/:course_id/discussion_topics/:topic_id/subscribed
Scope: url:DELETE|/api/v1/courses/:course_id/discussion_topics/:topic_id/subscribed
DELETE /api/v1/groups/:group_id/discussion_topics/:topic_id/subscribed
Scope: url:DELETE|/api/v1/groups/:group_id/discussion_topics/:topic_id/subscribed
Unsubscribe from a topic to stop receiving notifications about new entries
On success, the response will be 204 No Content with an empty body
Example Request:
This documentation is generated directly from the Canvas LMS source code, available .
filter_by
string
The state of the discussion topic to return. Currently only supports unread state.
Allowed values: all, unread
search_term
string
The partial title of the discussion topics to match and return.
exclude_context_module_locked_topics
boolean
For students, exclude topics that are locked by module progression. Defaults to false.
delayed_post_at
DateTime
If a timestamp is given, the topic will not be published until that time.
allow_rating
boolean
Whether or not users can rate entries in this topic.
lock_at
DateTime
If a timestamp is given, the topic will be scheduled to lock at the provided timestamp. If the timestamp is in the past, the topic will be locked.
podcast_enabled
boolean
If true, the topic will have an associated podcast feed.
podcast_has_student_posts
boolean
If true, the podcast will include posts from students as well. Implies podcast_enabled.
require_initial_post
boolean
If true then a user may not respond to other replies until that user has made an initial reply. Defaults to false.
assignment
Assignment
To create an assignment discussion, pass the assignment parameters as a sub-object. See the for the available parameters. The name parameter will be ignored, as it’s taken from the discussion title. If you want to make a discussion that was an assignment NOT an assignment, pass set_assignment = false as part of the assignment object
is_announcement
boolean
If true, this topic is an announcement. It will appear in the announcement’s section rather than the discussions section. This requires announcment-posting permissions.
pinned
boolean
If true, this topic will be listed in the “Pinned Discussion” section
position_after
string
By default, discussions are sorted chronologically by creation date, you can pass the id of another topic to have this one show up after the other when they are listed.
group_category_id
integer
If present, the topic will become a group discussion assigned to the group.
only_graders_can_rate
boolean
If true, only graders will be allowed to rate entries.
sort_order
string
Default sort order of the discussion. Accepted values are “asc”, “desc”.
Allowed values: asc, desc
sort_order_locked
boolean
If true, users cannot choose their prefered sort order
expanded
boolean
If true, thread will be expanded by default
expanded_locked
boolean
If true, users cannot choose their prefered thread expansion setting
sort_by_rating
boolean
(DEPRECATED) If true, entries will be sorted by rating.
attachment
File
A multipart/form-data form-field-style attachment. Attachments larger than 1 kilobyte are subject to quota restrictions.
specific_sections
string
A comma-separated list of sections ids to which the discussion topic should be made specific to. If it is not desired to make the discussion topic specific to sections, then this parameter may be omitted or set to “all”. Can only be present only on announcements and only those that are for a course (as opposed to a group).
lock_comment
boolean
If is_announcement and lock_comment are true, ‘Allow Participants to Comment’ setting is disabled.
delayed_post_at
DateTime
If a timestamp is given, the topic will not be published until that time.
lock_at
DateTime
If a timestamp is given, the topic will be scheduled to lock at the provided timestamp. If the timestamp is in the past, the topic will be locked.
podcast_enabled
boolean
If true, the topic will have an associated podcast feed.
podcast_has_student_posts
boolean
If true, the podcast will include posts from students as well. Implies podcast_enabled.
require_initial_post
boolean
If true then a user may not respond to other replies until that user has made an initial reply. Defaults to false.
assignment
Assignment
To create an assignment discussion, pass the assignment parameters as a sub-object. See the for the available parameters. The name parameter will be ignored, as it’s taken from the discussion title. If you want to make a discussion that was an assignment NOT an assignment, pass set_assignment = false as part of the assignment object
is_announcement
boolean
If true, this topic is an announcement. It will appear in the announcement’s section rather than the discussions section. This requires announcment-posting permissions.
pinned
boolean
If true, this topic will be listed in the “Pinned Discussion” section
position_after
string
By default, discussions are sorted chronologically by creation date, you can pass the id of another topic to have this one show up after the other when they are listed.
group_category_id
integer
If present, the topic will become a group discussion assigned to the group.
allow_rating
boolean
If true, users will be allowed to rate entries.
only_graders_can_rate
boolean
If true, only graders will be allowed to rate entries.
sort_order
string
Default sort order of the discussion. Accepted values are “asc”, “desc”.
Allowed values: asc, desc
sort_order_locked
boolean
If true, users cannot choose their prefered sort order
expanded
boolean
If true, thread will be expanded by default
expanded_locked
boolean
If true, users cannot choose their prefered thread expansion setting
sort_by_rating
boolean
(DEPRECATED) If true, entries will be sorted by rating.
specific_sections
string
A comma-separated list of sections ids to which the discussion topic should be made specific too. If it is not desired to make the discussion topic specific to sections, then this parameter may be omitted or set to “all”. Can only be present only on announcements and only those that are for a course (as opposed to a group).
lock_comment
boolean
If is_announcement and lock_comment are true, ‘Allow Participants to Comment’ setting is disabled.
“view”: A threaded view of all the entries in the discussion, containing the id, user_id, and message.
“new_entries”: Because this view is eventually consistent, it’s possible that newly created or updated entries won’t yet be reflected in the view. If the application wants to also get a flat list of all entries not yet reflected in the view, pass include_new_entries=1 to the request and this array of entries will be returned. These entries are returned in a flat array, in ascending created_at order.
include[]
string
If “all_dates” is passed, all dates associated with graded discussions’ assignments will be included. if “sections” is passed, includes the course sections that are associated with the topic, if the topic is specific to certain sections of the course. If “sections_user_count” is passed, then:
If “overrides” is passed, the overrides for the assignment will be included
Allowed values: all_dates, sections, sections_user_count, overrides
order_by
string
Determines the order of the discussion topic list. Defaults to “position”.
Allowed values: position, recent_activity, title
scope
string
Only return discussion topics in the given state(s). Defaults to including all topics. Filtering is done after pagination, so pages may be smaller than requested if topics are filtered. Can pass multiple states as comma separated string.
Allowed values: locked, unlocked, pinned, unpinned
only_announcements
boolean
Return announcements instead of discussion topics. Defaults to false
title
string
no description
message
string
no description
discussion_type
string
The type of discussion. Defaults to side_comment or not_threaded if not value is given. Accepted values are ‘side_comment’, ‘not_threaded’ for discussions that only allow one level of nested comments, and ‘threaded’ for fully threaded discussions.
Allowed values: side_comment, threaded, not_threaded
published
boolean
Whether this topic is published (true) or draft state (false). Only teachers and TAs have the ability to create draft state topics.
title
string
no description
message
string
no description
discussion_type
string
The type of discussion. Defaults to side_comment or not_threaded if not value is given. Accepted values are ‘side_comment’, ‘not_threaded’ for discussions that only allow one level of nested comments, and ‘threaded’ for fully threaded discussions.
Allowed values: side_comment, threaded, not_threaded
published
boolean
Whether this topic is published (true) or draft state (false). Only teachers and TAs have the ability to create draft state topics.
order[]
Required integer
The ids of the pinned discussion topics in the desired order. (For example, “order=104,102,103”.)
message
string
The updated body of the entry.
include[]
string
If “all_dates” is passed, all dates associated with graded discussions’ assignments will be included. if “sections” is passed, includes the course sections that are associated with the topic, if the topic is specific to certain sections of the course. If “sections_user_count” is passed, then:
If “overrides” is passed, the overrides for the assignment will be included
Allowed values: all_dates, sections, sections_user_count, overrides
userInput
string
Areas or topics for the summary to focus on.
_action
string
Required The action to take on the summary. Possible values are:
“seen”: Marks the summary as seen. This action saves the feedback if it’s not already persisted.
“like”: Marks the summary as liked.
“dislike”: Marks the summary as disliked.
“reset_like”: Resets the like status of the summary.
“regenerate”: Regenerates the summary feedback.
“disable_summary”: Disables the summary feedback.
Any other value will result in an error response.
message
string
The body of the entry.
attachment
string
a multipart/form-data form-field-style attachment. Attachments larger than 1 kilobyte are subject to quota restrictions.
message
string
The body of the entry.
attachment
string
a multipart/form-data form-field-style attachment. Attachments larger than 1 kilobyte are subject to quota restrictions.
ids[]
string
A list of entry ids to retrieve. Entries will be returned in id order, smallest id first.
forced_read_state
boolean
A boolean value to set all of the entries’ forced_read_state. No change is made if this argument is not specified.
forced_read_state
boolean
A boolean value to set all of the entries’ forced_read_state. No change is made if this argument is not specified.
forced_read_state
boolean
A boolean value to set the entry’s forced_read_state. No change is made if this argument is not specified.
forced_read_state
boolean
A boolean value to set the entry’s forced_read_state. No change is made if this argument is not specified.
rating
integer
A rating to set on this entry. Only 0 and 1 are accepted.
// A file attachment
{
"content-type": "unknown/unknown",
"url": "http://www.example.com/courses/1/files/1/download",
"filename": "content.txt",
"display_name": "content.txt"
}// A discussion topic
{
// The ID of this topic.
"id": 1,
// The topic title.
"title": "Topic 1",
// The HTML content of the message body.
"message": "<p>content here</p>",
// The URL to the discussion topic in canvas.
"html_url": "https://<canvas>/courses/1/discussion_topics/2",
// The datetime the topic was posted. If it is null it hasn't been posted yet.
// (see delayed_post_at)
"posted_at": "2037-07-21T13:29:31Z",
// The datetime for when the last reply was in the topic.
"last_reply_at": "2037-07-28T19:38:31Z",
// If true then a user may not respond to other replies until that user has made
// an initial reply. Defaults to false.
"require_initial_post": false,
// Whether or not posts in this topic are visible to the user.
"user_can_see_posts": true,
// The count of entries in the topic.
"discussion_subentry_count": 0,
// The read_state of the topic for the current user, 'read' or 'unread'.
"read_state": "read",
// The count of unread entries of this topic for the current user.
"unread_count": 0,
// Whether or not the current user is subscribed to this topic.
"subscribed": true,
// (Optional) Why the user cannot subscribe to this topic. Only one reason will
// be returned even if multiple apply. Can be one of: 'initial_post_required':
// The user must post a reply first; 'not_in_group_set': The user is not in the
// group set for this graded group discussion; 'not_in_group': The user is not
// in this topic's group; 'topic_is_announcement': This topic is an announcement
"subscription_hold": "not_in_group_set",
// The unique identifier of the assignment if the topic is for grading,
// otherwise null.
"assignment_id": null,
// The datetime to publish the topic (if not right away).
"delayed_post_at": null,
// Whether this discussion topic is published (true) or draft state (false)
"published": true,
// The datetime to lock the topic (if ever).
"lock_at": null,
// Whether or not the discussion is 'closed for comments'.
"locked": false,
// Whether or not the discussion has been 'pinned' by an instructor
"pinned": false,
// Whether or not this is locked for the user.
"locked_for_user": true,
// (Optional) Information for the user about the lock. Present when
// locked_for_user is true.
"lock_info": null,
// (Optional) An explanation of why this is locked for the user. Present when
// locked_for_user is true.
"lock_explanation": "This discussion is locked until September 1 at 12:00am",
// The username of the topic creator.
"user_name": "User Name",
// DEPRECATED An array of topic_ids for the group discussions the user is a part
// of.
"topic_children": [5, 7, 10],
// An array of group discussions the user is a part of. Fields include: id,
// group_id
"group_topic_children": [{"id":5,"group_id":1}, {"id":7,"group_id":5}, {"id":10,"group_id":4}],
// If the topic is for grading and a group assignment this will point to the
// original topic in the course.
"root_topic_id": null,
// If the topic is a podcast topic this is the feed url for the current user.
"podcast_url": "/feeds/topics/1/enrollment_1XAcepje4u228rt4mi7Z1oFbRpn3RAkTzuXIGOPe.rss",
// The type of discussion. Values are 'side_comment' or 'not_threaded', for
// discussions that only allow one level of nested comments, and 'threaded' for
// fully threaded discussions.
"discussion_type": "side_comment",
// The unique identifier of the group category if the topic is a group
// discussion, otherwise null.
"group_category_id": null,
// Array of file attachments.
"attachments": null,
// The current user's permissions on this topic.
"permissions": {"attach":true},
// Whether or not users can rate entries in this topic.
"allow_rating": true,
// Whether or not grade permissions are required to rate entries.
"only_graders_can_rate": true,
// DEPRECATED, Whether or not entries should be sorted by rating.
"sort_by_rating": true,
// How entries should be sorted by default.
"sort_order": "asc",
// Can users decide their preferred sort order.
"sort_order_locked": true,
// Threaded replies should be expanded by default.
"expand": true,
// Can users decide their preferred thread expand setting.
"expand_locked": true
}(a) If sections were asked for and the topic is specific to certain
course sections, includes the number of users in each
section. (as part of the section json asked for above)
(b) Else, includes at the root level the total number of users in the
topic's context (group or course) that the topic applies to.curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics \
-F title='my topic' \
-F message='initial message' \
-F podcast_enabled=1 \
-H 'Authorization: Bearer <token>'
-F 'attachment=@<filename>' \curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics \
-F title='my assignment topic' \
-F message='initial message' \
-F assignment[points_possible]=15 \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id> \
-F title='This will be positioned after Topic #1234' \
-F position_after=1234 \
-H 'Authorization: Bearer <token>'curl -X DELETE https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id> \
-H 'Authorization: Bearer <token>'curl -X PUT 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>' \
-F 'message=<message>' \
-H "Authorization: Bearer <token>"curl -X DELETE 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>' \
-H "Authorization: Bearer <token>"(a) If sections were asked for and the topic is specific to certain
course sections, includes the number of users in each
section. (as part of the section json asked for above)
(b) Else, includes at the root level the total number of users in the
topic's context (group or course) that the topic applies to.curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id> \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/summaries \
-H 'Authorization: Bearer <token>'{
"id": 1,
"userInput": "Give me a brief summary of the discussion.",
"text": "This is a summary of the discussion topic.",
"usage": { "currentCount": 1, "limit": 5 }
}curl https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/summaries \
-X POST \
-H 'Authorization: Bearer <token>'{
"id": 1,
"text": "This is a summary of the discussion topic.",
"usage": { "currentCount": 1, "limit": 5 }
}curl -X PUT https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/disable_summary \{
"success": true
}curl -X POST https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/summaries/<summary_id>/feedback \
-F '_action=like' \
-H "Authorization: Bearer{
"liked": true,
"disliked": false
}curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/view' \
-H "Authorization: Bearer <token>"{
"unread_entries": [1,3,4],
"entry_ratings": {3: 1},
"forced_entries": [1],
"participants": [
{ "id": 10, "display_name": "user 1", "avatar_image_url": "https://...", "html_url": "https://..." },
{ "id": 11, "display_name": "user 2", "avatar_image_url": "https://...", "html_url": "https://..." }
],
"view": [
{ "id": 1, "user_id": 10, "parent_id": null, "message": "...html text...", "replies": [
{ "id": 3, "user_id": 11, "parent_id": 1, "message": "...html....", "replies": [...] }
]},
{ "id": 2, "user_id": 11, "parent_id": null, "message": "...html..." },
{ "id": 4, "user_id": 10, "parent_id": null, "message": "...html..." }
]
}curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries.json' \
-F 'message=<message>' \
-F 'attachment=@<filename>' \
-H "Authorization: Bearer <token>"curl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/123/discussion_topics/123/duplicate
curl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/group/456/discussion_topics/456/duplicate[ {
"id": 1019,
"user_id": 7086,
"user_name": "[email protected]",
"message": "Newer entry",
"read_state": "read",
"forced_read_state": false,
"created_at": "2011-11-03T21:33:29Z",
"attachment": {
"content-type": "unknown/unknown",
"url": "http://www.example.com/files/681/download",
"filename": "content.txt",
"display_name": "content.txt" } },
{
"id": 1016,
"user_id": 7086,
"user_name": "[email protected]",
"message": "first top-level entry",
"read_state": "unread",
"forced_read_state": false,
"created_at": "2011-11-03T21:32:29Z",
"recent_replies": [
{
"id": 1017,
"user_id": 7086,
"user_name": "[email protected]",
"message": "Reply message",
"created_at": "2011-11-03T21:32:29Z"
} ],
"has_more_replies": false } ]curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>/replies.json' \
-F 'message=<message>' \
-F 'attachment=@<filename>' \
-H "Authorization: Bearer <token>"[ {
"id": 1015,
"user_id": 7084,
"user_name": "[email protected]",
"message": "Newer message",
"read_state": "read",
"forced_read_state": false,
"created_at": "2011-11-03T21:27:44Z" },
{
"id": 1014,
"user_id": 7084,
"user_name": "[email protected]",
"message": "Older message",
"read_state": "unread",
"forced_read_state": false,
"created_at": "2011-11-03T21:26:44Z" } ]curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entry_list?ids[]=1&ids[]=2&ids[]=3' \
-H "Authorization: Bearer <token>"[
{ ... entry 1 ... },
{ ... entry 2 ... },
{ ... entry 3 ... },
]curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/read.json' \
-X PUT \
-H "Authorization: Bearer <token>" \
-H "Content-Length: 0"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/read_all' \
-X POST \
-H "Authorization: Bearer <token>" \
-H "Content-Length: 0"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/read.json' \
-X DELETE \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/read_all.json' \
-X PUT \
-H "Authorization: Bearer <token>" \
-H "Content-Length: 0"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/read_all.json' \
-X DELETE \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>/read.json' \
-X PUT \
-H "Authorization: Bearer <token>"\
-H "Content-Length: 0"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>/read.json' \
-X DELETE \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/entries/<entry_id>/rating.json' \
-X POST \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/subscribed.json' \
-X PUT \
-H "Authorization: Bearer <token>" \
-H "Content-Length: 0"curl 'https://<canvas>/api/v1/courses/<course_id>/discussion_topics/<topic_id>/subscribed.json' \
-X DELETE \
-H "Authorization: Bearer <token>"Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing assignment information.
An ExternalToolTagAttributes object looks like:
A LockInfo object looks like:
A RubricRating object looks like:
A RubricCriteria object looks like:
An AssignmentDate object looks like:
A TurnitinSettings object looks like:
A NeedsGradingCount object looks like:
A ScoreStatistic object looks like:
An Assignment object looks like:
A BasicUser object looks like:
An AssignmentOverride object looks like:
DELETE /api/v1/courses/:course_id/assignments/:id
Scope: url:DELETE|/api/v1/courses/:course_id/assignments/:id
Delete the given assignment.
Example Request:
Returns an object.
GET /api/v1/courses/:course_id/assignments
Scope: url:GET|/api/v1/courses/:course_id/assignments
GET /api/v1/courses/:course_id/assignment_groups/:assignment_group_id/assignments
Scope: url:GET|/api/v1/courses/:course_id/assignment_groups/:assignment_group_id/assignments
Returns the paginated list of assignments for the current course or assignment group.
Request Parameters:
Returns a list of objects.
GET /api/v1/users/:user_id/courses/:course_id/assignments
Scope: url:GET|/api/v1/users/:user_id/courses/:course_id/assignments
Returns the paginated list of assignments for the specified user if the current user has rights to view. See for valid arguments.
POST /api/v1/courses/:course_id/assignments/:assignment_id/duplicate
Scope: url:POST|/api/v1/courses/:course_id/assignments/:assignment_id/duplicate
Duplicate an assignment and return a json based on result_type argument.
Request Parameters:
Example Request:
Returns an object.
GET /api/v1/courses/:course_id/assignments/:assignment_id/users/:user_id/group_members
Scope: url:GET|/api/v1/courses/:course_id/assignments/:assignment_id/users/:user_id/group_members
Returns student ids and names for the group.
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/assignments/:id
Scope: url:GET|/api/v1/courses/:course_id/assignments/:id
Returns the assignment with the given id.
Request Parameters:
Returns an object.
POST /api/v1/courses/:course_id/assignments
Scope: url:POST|/api/v1/courses/:course_id/assignments
Create a new assignment for this course. The assignment is created in the active state.
Request Parameters:
Returns an object.
PUT /api/v1/courses/:course_id/assignments/:id
Scope: url:PUT|/api/v1/courses/:course_id/assignments/:id
Modify an existing assignment.
Request Parameters:
Returns an object.
PUT /api/v1/courses/:course_id/assignments/bulk_update
Scope: url:PUT|/api/v1/courses/:course_id/assignments/bulk_update
Update due dates and availability dates for multiple assignments in a course.
Accepts a JSON array of objects containing two keys each: id, the assignment id, and all_dates, an array of AssignmentDate structures containing the base and/or override dates for the assignment, as returned from the endpoint with include[]=all_dates.
This endpoint cannot create or destroy assignment overrides; any existing assignment overrides that are not referenced in the arguments will be left alone. If an override is given, any dates that are not supplied with it will be defaulted. To clear a date, specify null explicitly.
All referenced assignments will be validated before any are saved. A list of errors will be returned if any provided dates are invalid, and no changes will be saved.
The bulk update is performed in a background job, use the to check its status.
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/assignments/:assignment_id/overrides
Scope: url:GET|/api/v1/courses/:course_id/assignments/:assignment_id/overrides
Returns the paginated list of overrides for this assignment that target sections/groups/students visible to the current user.
Returns a list of objects.
GET /api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Scope: url:GET|/api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Returns details of the the override with the given id.
Returns an object.
GET /api/v1/groups/:group_id/assignments/:assignment_id/override
Scope: url:GET|/api/v1/groups/:group_id/assignments/:assignment_id/override
Responds with a redirect to the override for the given group, if any (404 otherwise).
GET /api/v1/sections/:course_section_id/assignments/:assignment_id/override
Scope: url:GET|/api/v1/sections/:course_section_id/assignments/:assignment_id/override
Responds with a redirect to the override for the given section, if any (404 otherwise).
POST /api/v1/courses/:course_id/assignments/:assignment_id/overrides
Scope: url:POST|/api/v1/courses/:course_id/assignments/:assignment_id/overrides
One of student_ids, group_id, or course_section_id must be present. At most one should be present; if multiple are present only the most specific (student_ids first, then group_id, then course_section_id) is used and any others are ignored.
Request Parameters:
Example Request:
Returns an object.
PUT /api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Scope: url:PUT|/api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
All current overridden values must be supplied if they are to be retained; e.g. if due_at was overridden, but this PUT omits a value for due_at, due_at will no longer be overridden. If the override is adhoc and student_ids is not supplied, the target override set is unchanged. Target override sets cannot be changed for group or section overrides.
Request Parameters:
Example Request:
Returns an object.
DELETE /api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Scope: url:DELETE|/api/v1/courses/:course_id/assignments/:assignment_id/overrides/:id
Deletes an override and returns its former details.
Example Request:
Returns an object.
GET /api/v1/courses/:course_id/assignments/overrides
Scope: url:GET|/api/v1/courses/:course_id/assignments/overrides
Returns a list of specified overrides in this course, providing they target sections/groups/students visible to the current user. Returns null elements in the list for requests that were not found.
Request Parameters:
Example Request:
Returns a list of objects.
POST /api/v1/courses/:course_id/assignments/overrides
Scope: url:POST|/api/v1/courses/:course_id/assignments/overrides
Creates the specified overrides for each assignment. Handles creation in a transaction, so all records are created or none are.
One of student_ids, group_id, or course_section_id must be present. At most one should be present; if multiple are present only the most specific (student_ids first, then group_id, then course_section_id) is used and any others are ignored.
Errors are reported in an errors attribute, an array of errors corresponding to inputs. Global errors will be reported as a single element errors array
Request Parameters:
Example Request:
Returns a list of objects.
PUT /api/v1/courses/:course_id/assignments/overrides
Scope: url:PUT|/api/v1/courses/:course_id/assignments/overrides
Updates a list of specified overrides for each assignment. Handles overrides in a transaction, so either all updates are applied or none. See for available attributes.
All current overridden values must be supplied if they are to be retained; e.g. if due_at was overridden, but this PUT omits a value for due_at, due_at will no longer be overridden. If the override is adhoc and student_ids is not supplied, the target override set is unchanged. Target override sets cannot be changed for group or section overrides.
Errors are reported in an errors attribute, an array of errors corresponding to inputs. Global errors will be reported as a single element errors array
Request Parameters:
Example Request:
Returns a list of objects.
The following diagram provides an example to describe the structure of group assignments. It also shows the correspondence between the fields of an assignment override API request and the resources they map to.
The components in yellow are group sets. When creating or updating an assignment override, you will refer to the group set by the group_category_id field.
The components in green are groups. An assignment can become a group assignment iff it has a group_category_id that maps to an active group set, as well as a group_id that maps to an active, valid group. In the API, you will be specifying the group by the group_id field of the assignment_override construct.
Important: an assignment must be assigned to a group set (the group_category_id field) on creation for an override with a group_id to be effective.
See Also:
This documentation is generated directly from the Canvas LMS source code, available .
bucket
string
If included, only return certain assignments depending on due date and submission status.
Allowed values: past, overdue, undated, ungraded, unsubmitted, upcoming, future
assignment_ids[]
string
if set, return only assignments specified
order_by
string
Determines the order of the assignments. Defaults to “position”.
Allowed values: position, name, due_at
post_to_sis
boolean
Return only assignments that have post_to_sis set or not set.
new_quizzes
boolean
Return only New Quizzes assignments
assignment[turnitin_enabled]
boolean
Only applies when the Turnitin plugin is enabled for a course and the submission_types array includes “online_upload”. Toggles Turnitin submissions for the assignment. Will be ignored if Turnitin is not available for the course.
assignment[vericite_enabled]
boolean
Only applies when the VeriCite plugin is enabled for a course and the submission_types array includes “online_upload”. Toggles VeriCite submissions for the assignment. Will be ignored if VeriCite is not available for the course.
assignment[turnitin_settings]
string
Settings to send along to turnitin. See Assignment object definition for format.
assignment[integration_data]
string
Data used for SIS integrations. Requires admin-level token with the “Manage SIS” permission. JSON string required.
assignment[integration_id]
string
Unique ID from third party integrations
assignment[peer_reviews]
boolean
If submission_types does not include external_tool,discussion_topic, online_quiz, or on_paper, determines whether or not peer reviews will be turned on for the assignment.
assignment[automatic_peer_reviews]
boolean
Whether peer reviews will be assigned automatically by Canvas or if teachers must manually assign peer reviews. Does not apply if peer reviews are not enabled.
assignment[notify_of_update]
boolean
If true, Canvas will send a notification to students in the class notifying them that the content has changed.
assignment[group_category_id]
integer
If present, the assignment will become a group assignment assigned to the group.
assignment[grade_group_students_individually]
integer
If this is a group assignment, teachers have the options to grade students individually. If false, Canvas will apply the assignment’s score to each member of the group. If true, the teacher can manually assign scores to each member of the group.
assignment[external_tool_tag_attributes]
string
Hash of external tool parameters if submission_types is [“external_tool”]. See Assignment object definition for format.
assignment[points_possible]
number
The maximum points possible on the assignment.
assignment[grading_type]
string
The strategy used for grading the assignment. The assignment defaults to “points” if this field is omitted.
Allowed values: pass_fail, percent, letter_grade, gpa_scale, points, not_graded
assignment[due_at]
DateTime
The day/time the assignment is due. Must be between the lock dates if there are lock dates. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[lock_at]
DateTime
The day/time the assignment is locked after. Must be after the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[unlock_at]
DateTime
The day/time the assignment is unlocked. Must be before the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[description]
string
The assignment’s description, supports HTML.
assignment[assignment_group_id]
integer
The assignment group id to put the assignment in. Defaults to the top assignment group in the course.
assignment[assignment_overrides][]
AssignmentOverride
List of overrides for the assignment.
assignment[only_visible_to_overrides]
boolean
Whether this assignment is only visible to overrides (Only useful if ‘differentiated assignments’ account setting is on)
assignment[published]
boolean
Whether this assignment is published. (Only useful if ‘draft state’ account setting is on) Unpublished assignments are not visible to students.
assignment[grading_standard_id]
integer
The grading standard id to set for the course. If no value is provided for this argument the current grading_standard will be un-set from this course. This will update the grading_type for the course to ‘letter_grade’ unless it is already ‘gpa_scale’.
assignment[omit_from_final_grade]
boolean
Whether this assignment is counted towards a student’s final grade.
assignment[hide_in_gradebook]
boolean
Whether this assignment is shown in the gradebook.
assignment[quiz_lti]
boolean
Whether this assignment should use the Quizzes 2 LTI tool. Sets the submission type to ‘external_tool’ and configures the external tool attributes to use the Quizzes 2 LTI tool configured for this course. Has no effect if no Quizzes 2 LTI tool is configured.
assignment[moderated_grading]
boolean
Whether this assignment is moderated.
assignment[grader_count]
integer
The maximum number of provisional graders who may issue grades for this assignment. Only relevant for moderated assignments. Must be a positive value, and must be set to 1 if the course has fewer than two active instructors. Otherwise, the maximum value is the number of active instructors in the course minus one, or 10 if the course has more than 11 active instructors.
assignment[final_grader_id]
integer
The user ID of the grader responsible for choosing final grades for this assignment. Only relevant for moderated assignments.
assignment[grader_comments_visible_to_graders]
boolean
Boolean indicating if provisional graders’ comments are visible to other provisional graders. Only relevant for moderated assignments.
assignment[graders_anonymous_to_graders]
boolean
Boolean indicating if provisional graders’ identities are hidden from other provisional graders. Only relevant for moderated assignments.
assignment[graders_names_visible_to_final_grader]
boolean
Boolean indicating if provisional grader identities are visible to the the final grader. Only relevant for moderated assignments.
assignment[anonymous_grading]
boolean
Boolean indicating if the assignment is graded anonymously. If true, graders cannot see student identities.
assignment[allowed_attempts]
integer
The number of submission attempts allowed for this assignment. Set to -1 for unlimited attempts.
assignment[annotatable_attachment_id]
integer
The Attachment ID of the document being annotated.
Only applies when submission_types includes “student_annotation”.
assignment[asset_processors][]
Array
Document processors for this assignment. New document processors can only be added via the interactive LTI Deep Linking flow (in a browser), not via API token or JWT authentication. Deletion of document processors (passing an empty array) is allowed via API.
assignment[peer_review][points_possible]
number
The maximum points possible for peer reviews.
assignment[peer_review][grading_type]
string
The strategy used for grading peer reviews. Defaults to “points” if this field is omitted.
Allowed values: pass_fail, percent, letter_grade, gpa_scale, points, not_graded
assignment[peer_review][due_at]
DateTime
The day/time the peer reviews are due. Must be between the lock dates if there are lock dates. Accepts times in ISO 8601 format, e.g. 2025-08-20T12:10:00Z.
assignment[peer_review][lock_at]
DateTime
The day/time the peer reviews are locked after. Must be after the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2025-08-25T12:10:00Z.
assignment[peer_review][unlock_at]
DateTime
The day/time the peer reviews are unlocked. Must be before the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2025-08-15T12:10:00Z.
assignment[peer_review][peer_review_overrides][]
AssignmentOverride
List of overrides for the peer reviews.
assignment[turnitin_enabled]
boolean
Only applies when the Turnitin plugin is enabled for a course and the submission_types array includes “online_upload”. Toggles Turnitin submissions for the assignment. Will be ignored if Turnitin is not available for the course.
assignment[vericite_enabled]
boolean
Only applies when the VeriCite plugin is enabled for a course and the submission_types array includes “online_upload”. Toggles VeriCite submissions for the assignment. Will be ignored if VeriCite is not available for the course.
assignment[turnitin_settings]
string
Settings to send along to turnitin. See Assignment object definition for format.
assignment[sis_assignment_id]
string
The sis id of the Assignment
assignment[integration_data]
string
Data used for SIS integrations. Requires admin-level token with the “Manage SIS” permission. JSON string required.
assignment[integration_id]
string
Unique ID from third party integrations
assignment[peer_reviews]
boolean
If submission_types does not include external_tool,discussion_topic, online_quiz, or on_paper, determines whether or not peer reviews will be turned on for the assignment.
assignment[automatic_peer_reviews]
boolean
Whether peer reviews will be assigned automatically by Canvas or if teachers must manually assign peer reviews. Does not apply if peer reviews are not enabled.
assignment[notify_of_update]
boolean
If true, Canvas will send a notification to students in the class notifying them that the content has changed.
assignment[group_category_id]
integer
If present, the assignment will become a group assignment assigned to the group.
assignment[grade_group_students_individually]
integer
If this is a group assignment, teachers have the options to grade students individually. If false, Canvas will apply the assignment’s score to each member of the group. If true, the teacher can manually assign scores to each member of the group.
assignment[external_tool_tag_attributes]
string
Hash of external tool parameters if submission_types is [“external_tool”]. See Assignment object definition for format.
assignment[points_possible]
number
The maximum points possible on the assignment.
assignment[grading_type]
string
The strategy used for grading the assignment. The assignment defaults to “points” if this field is omitted.
Allowed values: pass_fail, percent, letter_grade, gpa_scale, points, not_graded
assignment[due_at]
DateTime
The day/time the assignment is due. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[lock_at]
DateTime
The day/time the assignment is locked after. Must be after the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[unlock_at]
DateTime
The day/time the assignment is unlocked. Must be before the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z.
assignment[description]
string
The assignment’s description, supports HTML.
assignment[assignment_group_id]
integer
The assignment group id to put the assignment in. Defaults to the top assignment group in the course.
assignment[assignment_overrides][]
AssignmentOverride
List of overrides for the assignment. If the assignment[assignment_overrides] key is absent, any existing overrides are kept as is. If the assignment[assignment_overrides] key is present, existing overrides are updated or deleted (and new ones created, as necessary) to match the provided list.
assignment[only_visible_to_overrides]
boolean
Whether this assignment is only visible to overrides (Only useful if ‘differentiated assignments’ account setting is on)
assignment[published]
boolean
Whether this assignment is published. (Only useful if ‘draft state’ account setting is on) Unpublished assignments are not visible to students.
assignment[grading_standard_id]
integer
The grading standard id to set for the course. If no value is provided for this argument the current grading_standard will be un-set from this course. This will update the grading_type for the course to ‘letter_grade’ unless it is already ‘gpa_scale’.
assignment[omit_from_final_grade]
boolean
Whether this assignment is counted towards a student’s final grade.
assignment[hide_in_gradebook]
boolean
Whether this assignment is shown in the gradebook.
assignment[moderated_grading]
boolean
Whether this assignment is moderated.
assignment[grader_count]
integer
The maximum number of provisional graders who may issue grades for this assignment. Only relevant for moderated assignments. Must be a positive value, and must be set to 1 if the course has fewer than two active instructors. Otherwise, the maximum value is the number of active instructors in the course minus one, or 10 if the course has more than 11 active instructors.
assignment[final_grader_id]
integer
The user ID of the grader responsible for choosing final grades for this assignment. Only relevant for moderated assignments.
assignment[grader_comments_visible_to_graders]
boolean
Boolean indicating if provisional graders’ comments are visible to other provisional graders. Only relevant for moderated assignments.
assignment[graders_anonymous_to_graders]
boolean
Boolean indicating if provisional graders’ identities are hidden from other provisional graders. Only relevant for moderated assignments.
assignment[graders_names_visible_to_final_grader]
boolean
Boolean indicating if provisional grader identities are visible to the the final grader. Only relevant for moderated assignments.
assignment[anonymous_grading]
boolean
Boolean indicating if the assignment is graded anonymously. If true, graders cannot see student identities.
assignment[allowed_attempts]
integer
The number of submission attempts allowed for this assignment. Set to -1 or null for unlimited attempts.
assignment[annotatable_attachment_id]
integer
The Attachment ID of the document being annotated.
Only applies when submission_types includes “student_annotation”.
assignment[asset_processors][]
Array
Document processors for this assignment. New document processors can only be added via the interactive LTI Deep Linking flow (in a browser), not via API token or JWT authentication. Deletion of document processors (passing an empty array) is allowed via API.
assignment[force_updated_at]
boolean
If true, updated_at will be set even if no changes were made.
assignment[peer_review][points_possible]
number
The maximum points possible for peer reviews.
assignment[peer_review][grading_type]
string
The strategy used for grading peer reviews. Defaults to “points” if this field is omitted.
Allowed values: pass_fail, percent, letter_grade, gpa_scale, points, not_graded
assignment[peer_review][due_at]
DateTime
The day/time the peer reviews are due. Must be between the lock dates if there are lock dates. Accepts times in ISO 8601 format, e.g. 2025-08-20T12:10:00Z.
assignment[peer_review][lock_at]
DateTime
The day/time the peer reviews are locked after. Must be after the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2025-08-25T12:10:00Z.
assignment[peer_review][unlock_at]
DateTime
The day/time the peer reviews are unlocked. Must be before the due date if there is a due date. Accepts times in ISO 8601 format, e.g. 2025-08-15T12:10:00Z.
assignment[peer_review][peer_review_overrides][]
AssignmentOverride
List of overrides for the peer reviews. When updating overrides:
Include “id” to update an existing override
Omit “id” to create a new override
assignment[submission_types][]
string
[DEPRECATED] Effective 2021-05-26 (notice given 2021-02-18)
Only applies if the assignment doesn’t have student submissions.
assignment_override[due_at]
DateTime
The day/time the overridden assignment is due. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect due date. May be present but null to indicate the override removes any previous due date.
assignment_override[unlock_at]
DateTime
The day/time the overridden assignment becomes unlocked. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect the unlock date. May be present but null to indicate the override removes any previous unlock date.
assignment_override[lock_at]
DateTime
The day/time the overridden assignment becomes locked. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect the lock date. May be present but null to indicate the override removes any previous lock date.
assignment_override[lock_at]
DateTime
The day/time the overridden assignment becomes locked. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect the lock date. May be present but null to indicate the override removes any previous lock date.
include[]
string
Optional information to include with each assignment:
submission
The current user’s current Submission
assignment_visibility
An array of ids of students who can see the assignment
all_dates
An array of AssignmentDate structures, one for each override, and also a base if the assignment has an “Everyone” / “Everyone Else” date
overrides
An array of AssignmentOverride structures
observed_users
An array of submissions for observed users
can_edit
an extra Boolean value will be included with each Assignment (and AssignmentDate if all_dates is supplied) to indicate whether the caller can edit the assignment or date. Moderated grading and closed grading periods may restrict a user’s ability to edit an assignment.
score_statistics
An object containing min, max, and mean score on this assignment. This will not be included for students if there are less than 5 graded assignments or if disabled by the instructor. Only valid if ‘submission’ is also included.
ab_guid
An array of guid strings for academic benchmarks
Allowed values: submission, assignment_visibility, all_dates, overrides, observed_users, can_edit, score_statistics, ab_guid
search_term
string
The partial title of the assignments to match and return.
override_assignment_dates
boolean
Apply assignment overrides for each assignment, defaults to true.
needs_grading_count_by_section
boolean
Split up “needs_grading_count” by sections into the “needs_grading_count_by_section” key, defaults to false
result_type
string
Optional information: When the root account has the feature ‘newquizzes_on_quiz_pageenabled and this argument is set to “Quiz” the response will be serialized into a quiz format(<a href="doc/api/quizzes.md#Quiz" title="quizzes">quizzes</a>); When this argument isn’t specified the response will be serialized into an assignment format;</p> Allowed values:Quiz`
include[]
string
Associations to include with the assignment. The “assignment_visibility” option requires that the Differentiated Assignments course feature be turned on. If “observed_users” is passed, submissions for observed users will also be included. For “score_statistics” to be included, the “submission” option must also be set. The “peer_review” option requires that the Peer Review Grading course feature be turned on.
Allowed values: submission, assignment_visibility, overrides, observed_users, can_edit, score_statistics, ab_guid, peer_review
override_assignment_dates
boolean
Apply assignment overrides to the assignment, defaults to true.
needs_grading_count_by_section
boolean
Split up “needs_grading_count” by sections into the “needs_grading_count_by_section” key, defaults to false
all_dates
boolean
All dates associated with the assignment, if applicable
assignment[name]
Required string
The assignment name.
assignment[position]
integer
The position of this assignment in the group when displaying assignment lists.
assignment[submission_types][]
string
List of supported submission types for the assignment. Unless the assignment is allowing online submissions, the array should only have one element.
If not allowing online submissions, your options are:
If you are allowing online submissions, you can have one or many allowed submission types:
Allowed values: online_quiz, none, on_paper, discussion_topic, external_tool, online_upload, online_text_entry, online_url, media_recording, student_annotation
assignment[allowed_extensions][]
string
Allowed extensions if submission_types includes “online_upload”
Example:
assignment[name]
string
The assignment name.
assignment[position]
integer
The position of this assignment in the group when displaying assignment lists.
assignment[submission_types][]
string
Only applies if the assignment doesn’t have student submissions.
List of supported submission types for the assignment. Unless the assignment is allowing online submissions, the array should only have one element.
If not allowing online submissions, your options are:
If you are allowing online submissions, you can have one or many allowed submission types:
Allowed values: online_quiz, none, on_paper, discussion_topic, external_tool, online_upload, online_text_entry, online_url, media_recording, student_annotation
assignment[allowed_extensions][]
string
Allowed extensions if submission_types includes “online_upload”
Example:
assignment_override[student_ids][]
integer
The IDs of the override’s target students. If present, the IDs must each identify a user with an active student enrollment in the course that is not already targetted by a different adhoc override.
assignment_override[title]
string
The title of the adhoc assignment override. Required if student_ids is present, ignored otherwise (the title is set to the name of the targetted group or section instead).
assignment_override[group_id]
integer
The ID of the override’s target group. If present, the following conditions must be met for the override to be successful:
the assignment MUST be a group assignment (a group_category_id is assigned to it)
the ID must identify an active group in the group set the assignment is in
the ID must not be targetted by a different override
See for more info.
assignment_override[course_section_id]
integer
The ID of the override’s target section. If present, must identify an active section of the assignment’s course not already targetted by a different override.
assignment_override[student_ids][]
integer
The IDs of the override’s target students. If present, the IDs must each identify a user with an active student enrollment in the course that is not already targetted by a different adhoc override. Ignored unless the override being updated is adhoc.
assignment_override[title]
string
The title of an adhoc assignment override. Ignored unless the override being updated is adhoc.
assignment_override[due_at]
DateTime
The day/time the overridden assignment is due. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect due date. May be present but null to indicate the override removes any previous due date.
assignment_override[unlock_at]
DateTime
The day/time the overridden assignment becomes unlocked. Accepts times in ISO 8601 format, e.g. 2014-10-21T18:48:00Z. If absent, this override will not affect the unlock date. May be present but null to indicate the override removes any previous unlock date.
assignment_overrides[][id]
Required string
Ids of overrides to retrieve
assignment_overrides[][assignment_id]
Required string
Ids of assignments for each override
assignment_overrides[]
Required AssignmentOverride
Attributes for the new assignment overrides. See Create an assignment override for available attributes
assignment_overrides[]
Required AssignmentOverride
Attributes for the updated overrides.

{
// URL to the external tool
"url": "http://instructure.com",
// Whether or not there is a new tab for the external tool
"new_tab": false,
// the identifier for this tool_tag
"resource_link_id": "ab81173af98b8c33e66a"
}{
// Asset string for the object causing the lock
"asset_string": "assignment_4",
// (Optional) Time at which this was/will be unlocked. Must be before the due
// date.
"unlock_at": "2013-01-01T00:00:00-06:00",
// (Optional) Time at which this was/will be locked. Must be after the due date.
"lock_at": "2013-02-01T00:00:00-06:00",
// (Optional) Context module causing the lock.
"context_module": "{}",
"manually_locked": true
}{
"points": 10,
"id": "rat1",
"description": "Full marks",
"long_description": "Student completed the assignment flawlessly."
}{
"points": 10,
// The id of rubric criteria.
"id": "crit1",
// (Optional) The id of the learning outcome this criteria uses, if any.
"learning_outcome_id": "1234",
// (Optional) The 3rd party vendor's GUID for the outcome this criteria
// references, if any.
"vendor_guid": "abdsfjasdfne3jsdfn2",
"description": "Criterion 1",
"long_description": "Criterion 1 more details",
"criterion_use_range": true,
"ratings": null,
"ignore_for_scoring": true
}// Object representing a due date for an assignment or quiz. If the due date
// came from an assignment override, it will have an 'id' field.
{
// (Optional, missing if 'base' is present) id of the assignment override this
// date represents
"id": 1,
// (Optional, present if 'id' is missing) whether this date represents the
// assignment's or quiz's default due date
"base": true,
"title": "Summer Session",
// The due date for the assignment. Must be between the unlock date and the lock
// date if there are lock dates
"due_at": "2013-08-28T23:59:00-06:00",
// The unlock date for the assignment. Must be before the due date if there is a
// due date.
"unlock_at": "2013-08-01T00:00:00-06:00",
// The lock date for the assignment. Must be after the due date if there is a
// due date.
"lock_at": "2013-08-31T23:59:00-06:00"
}{
"originality_report_visibility": "after_grading",
"s_paper_check": false,
"internet_check": false,
"journal_check": false,
"exclude_biblio": false,
"exclude_quoted": false,
"exclude_small_matches_type": "percent",
"exclude_small_matches_value": 50
}// Used by Assignment model
{
// The section ID
"section_id": "123456",
// Number of submissions that need grading
"needs_grading_count": 5
}// Used by Assignment model
{
// Min score
"min": 1,
// Max score
"max": 10,
// Mean score
"mean": 6,
// Upper quartile score
"upper_q": 10,
// Median score
"median": 6,
// Lower quartile score
"lower_q": 1
}{
// the ID of the assignment
"id": 4,
// the name of the assignment
"name": "some assignment",
// the assignment description, in an HTML fragment
"description": "<p>Do the following:</p>...",
// The time at which this assignment was originally created
"created_at": "2012-07-01T23:59:00-06:00",
// The time at which this assignment was last modified in any way
"updated_at": "2012-07-01T23:59:00-06:00",
// the due date for the assignment. returns null if not present. NOTE: If this
// assignment has assignment overrides, this field will be the due date as it
// applies to the user requesting information from the API.
"due_at": "2012-07-01T23:59:00-06:00",
// the lock date (assignment is locked after this date). returns null if not
// present. NOTE: If this assignment has assignment overrides, this field will
// be the lock date as it applies to the user requesting information from the
// API.
"lock_at": "2012-07-01T23:59:00-06:00",
// the unlock date (assignment is unlocked after this date) returns null if not
// present NOTE: If this assignment has assignment overrides, this field will be
// the unlock date as it applies to the user requesting information from the
// API.
"unlock_at": "2012-07-01T23:59:00-06:00",
// whether this assignment has overrides
"has_overrides": true,
// (Optional) all dates associated with the assignment, if applicable
"all_dates": null,
// the ID of the course the assignment belongs to
"course_id": 123,
// the URL to the assignment's web page
"html_url": "https://...",
// the URL to download all submissions as a zip
"submissions_download_url": "https://example.com/courses/:course_id/assignments/:id/submissions?zip=1",
// the ID of the assignment's group
"assignment_group_id": 2,
// Boolean flag indicating whether the assignment requires a due date based on
// the account level setting
"due_date_required": true,
// Allowed file extensions, which take effect if submission_types includes
// 'online_upload'.
"allowed_extensions": ["docx", "ppt"],
// An integer indicating the maximum length an assignment's name may be
"max_name_length": 15,
// Boolean flag indicating whether or not Turnitin has been enabled for the
// assignment. NOTE: This flag will not appear unless your account has the
// Turnitin plugin available
"turnitin_enabled": true,
// Boolean flag indicating whether or not VeriCite has been enabled for the
// assignment. NOTE: This flag will not appear unless your account has the
// VeriCite plugin available
"vericite_enabled": true,
// Settings to pass along to turnitin to control what kinds of matches should be
// considered. originality_report_visibility can be 'immediate',
// 'after_grading', 'after_due_date', or 'never' exclude_small_matches_type can
// be null, 'percent', 'words' exclude_small_matches_value: - if type is null,
// this will be null also - if type is 'percent', this will be a number between
// 0 and 100 representing match size to exclude as a percentage of the document
// size. - if type is 'words', this will be number > 0 representing how many
// words a match must contain for it to be considered NOTE: This flag will not
// appear unless your account has the Turnitin plugin available
"turnitin_settings": null,
// If this is a group assignment, boolean flag indicating whether or not
// students will be graded individually.
"grade_group_students_individually": false,
// (Optional) assignment's settings for external tools if submission_types
// include 'external_tool'. Only url and new_tab are included (new_tab defaults
// to false). Use the 'External Tools' API if you need more information about
// an external tool.
"external_tool_tag_attributes": null,
// Boolean indicating if peer reviews are required for this assignment
"peer_reviews": false,
// Boolean indicating peer reviews are assigned automatically. If false, the
// teacher is expected to manually assign peer reviews.
"automatic_peer_reviews": false,
// Integer representing the amount of reviews each user is assigned. NOTE: This
// key is NOT present unless you have automatic_peer_reviews set to true.
"peer_review_count": 0,
// String representing a date the reviews are due by. Must be a date that occurs
// after the default due date. If blank, or date is not after the assignment's
// due date, the assignment's due date will be used. NOTE: This key is NOT
// present unless you have automatic_peer_reviews set to true.
"peer_reviews_assign_at": "2012-07-01T23:59:00-06:00",
// Boolean representing whether or not members from within the same group on a
// group assignment can be assigned to peer review their own group's work
"intra_group_peer_reviews": false,
// The ID of the assignment’s group set, if this is a group assignment. For
// group discussions, set group_category_id on the discussion topic, not the
// linked assignment.
"group_category_id": 1,
// if the requesting user has grading rights, the number of submissions that
// need grading.
"needs_grading_count": 17,
// if the requesting user has grading rights and the
// 'needs_grading_count_by_section' flag is specified, the number of submissions
// that need grading split out by section. NOTE: This key is NOT present unless
// you pass the 'needs_grading_count_by_section' argument as true. ANOTHER
// NOTE: it's possible to be enrolled in multiple sections, and if a student is
// setup that way they will show an assignment that needs grading in multiple
// sections (effectively the count will be duplicated between sections)
"needs_grading_count_by_section": [{"section_id":"123456","needs_grading_count":5}, {"section_id":"654321","needs_grading_count":0}],
// the sorting order of the assignment in the group
"position": 1,
// (optional, present if Sync Grades to SIS feature is enabled)
"post_to_sis": true,
// (optional, Third Party unique identifier for Assignment)
"integration_id": "12341234",
// (optional, Third Party integration data for assignment)
"integration_data": {"5678":"0954"},
// the maximum points possible for the assignment
"points_possible": 12.0,
// the types of submissions allowed for this assignment list containing one or
// more of the following: 'discussion_topic', 'online_quiz', 'on_paper', 'none',
// 'external_tool', 'online_text_entry', 'online_url', 'online_upload',
// 'media_recording', 'student_annotation'
"submission_types": ["online_text_entry"],
// If true, the assignment has been submitted to by at least one student
"has_submitted_submissions": true,
// The type of grading the assignment receives; one of 'pass_fail', 'percent',
// 'letter_grade', 'gpa_scale', 'points'
"grading_type": "points",
// The id of the grading standard being applied to this assignment. Valid if
// grading_type is 'letter_grade' or 'gpa_scale'.
"grading_standard_id": null,
// Whether the assignment is published
"published": true,
// Whether the assignment's 'published' state can be changed to false. Will be
// false if there are student submissions for the assignment.
"unpublishable": false,
// Whether the assignment is only visible to overrides.
"only_visible_to_overrides": false,
// Whether or not this is locked for the user.
"locked_for_user": false,
// (Optional) Information for the user about the lock. Present when
// locked_for_user is true.
"lock_info": null,
// (Optional) An explanation of why this is locked for the user. Present when
// locked_for_user is true.
"lock_explanation": "This assignment is locked until September 1 at 12:00am",
// (Optional) id of the associated quiz (applies only when submission_types is
// ['online_quiz'])
"quiz_id": 620,
// (Optional) whether anonymous submissions are accepted (applies only to quiz
// assignments)
"anonymous_submissions": false,
// (Optional) the DiscussionTopic associated with the assignment, if applicable
"discussion_topic": null,
// (Optional) Boolean indicating if assignment will be frozen when it is copied.
// NOTE: This field will only be present if the AssignmentFreezer plugin is
// available for your account.
"freeze_on_copy": false,
// (Optional) Boolean indicating if assignment is frozen for the calling user.
// NOTE: This field will only be present if the AssignmentFreezer plugin is
// available for your account.
"frozen": false,
// (Optional) Array of frozen attributes for the assignment. Only account
// administrators currently have permission to change an attribute in this list.
// Will be empty if no attributes are frozen for this assignment. Possible
// frozen attributes are: title, description, lock_at, points_possible,
// grading_type, submission_types, assignment_group_id, allowed_extensions,
// group_category_id, notify_of_update, peer_reviews NOTE: This field will only
// be present if the AssignmentFreezer plugin is available for your account.
"frozen_attributes": ["title"],
// (Optional) If 'submission' is included in the 'include' parameter, includes a
// Submission object that represents the current user's (user who is requesting
// information from the api) current submission for the assignment. See the
// Submissions API for an example response. If the user does not have a
// submission, this key will be absent.
"submission": null,
// (Optional) If true, the rubric is directly tied to grading the assignment.
// Otherwise, it is only advisory. Included if there is an associated rubric.
"use_rubric_for_grading": true,
// (Optional) An object describing the basic attributes of the rubric, including
// the point total. Included if there is an associated rubric.
"rubric_settings": {"points_possible":"12"},
// (Optional) A list of scoring criteria and ratings for each rubric criterion.
// Included if there is an associated rubric.
"rubric": null,
// (Optional) If 'assignment_visibility' is included in the 'include' parameter,
// includes an array of student IDs who can see this assignment.
"assignment_visibility": [137, 381, 572],
// (Optional) If 'overrides' is included in the 'include' parameter, includes an
// array of assignment override objects.
"overrides": null,
// (Optional) If true, the assignment will be omitted from the student's final
// grade
"omit_from_final_grade": true,
// (Optional) If true, the assignment will not be shown in any gradebooks
"hide_in_gradebook": true,
// Boolean indicating if the assignment is moderated.
"moderated_grading": true,
// The maximum number of provisional graders who may issue grades for this
// assignment. Only relevant for moderated assignments. Must be a positive
// value, and must be set to 1 if the course has fewer than two active
// instructors. Otherwise, the maximum value is the number of active instructors
// in the course minus one, or 10 if the course has more than 11 active
// instructors.
"grader_count": 3,
// The user ID of the grader responsible for choosing final grades for this
// assignment. Only relevant for moderated assignments.
"final_grader_id": 3,
// Boolean indicating if provisional graders' comments are visible to other
// provisional graders. Only relevant for moderated assignments.
"grader_comments_visible_to_graders": true,
// Boolean indicating if provisional graders' identities are hidden from other
// provisional graders. Only relevant for moderated assignments with
// grader_comments_visible_to_graders set to true.
"graders_anonymous_to_graders": true,
// Boolean indicating if provisional grader identities are visible to the final
// grader. Only relevant for moderated assignments.
"grader_names_visible_to_final_grader": true,
// Boolean indicating if the assignment is graded anonymously. If true, graders
// cannot see student identities.
"anonymous_grading": true,
// The number of submission attempts a student can make for this assignment. -1
// is considered unlimited.
"allowed_attempts": 2,
// Whether the assignment has manual posting enabled. Only relevant for courses
// using New Gradebook.
"post_manually": true,
// (Optional) If 'score_statistics' and 'submission' are included in the
// 'include' parameter and statistics are available, includes the min, max, and
// mode for this assignment
"score_statistics": null,
// (Optional) If retrieving a single assignment and 'can_submit' is included in
// the 'include' parameter, flags whether user has the right to submit the
// assignment (i.e. checks enrollment dates, submission types, locked status,
// attempts remaining, etc...). Including 'can submit' automatically includes
// 'submission' in the include parameter. Not available when observed_users are
// included.
"can_submit": true,
// (Optional) The academic benchmark(s) associated with the assignment or the
// assignment's rubric. Only included if 'ab_guid' is included in the 'include'
// parameter.
"ab_guid": ["ABCD", "EFGH"],
// The id of the attachment to be annotated by students. Relevant only if
// submission_types includes 'student_annotation'.
"annotatable_attachment_id": null,
// (Optional) Boolean indicating whether student names are anonymized
"anonymize_students": false,
// (Optional) Boolean indicating whether the Respondus LockDown Browser® is
// required for this assignment.
"require_lockdown_browser": false,
// (Optional) Boolean indicating whether this assignment has important dates.
"important_dates": false,
// (Optional, Deprecated) Boolean indicating whether notifications are muted for
// this assignment.
"muted": false,
// Boolean indicating whether peer reviews are anonymous.
"anonymous_peer_reviews": false,
// Boolean indicating whether instructor anotations are anonymous.
"anonymous_instructor_annotations": false,
// Boolean indicating whether this assignment has graded submissions.
"graded_submissions_exist": false,
// Boolean indicating whether this is a quiz lti assignment.
"is_quiz_assignment": false,
// Boolean indicating whether this assignment is in a closed grading period.
"in_closed_grading_period": false,
// Boolean indicating whether this assignment can be duplicated.
"can_duplicate": false,
// If this assignment is a duplicate, it is the original assignment's course_id
"original_course_id": 4,
// If this assignment is a duplicate, it is the original assignment's id
"original_assignment_id": 4,
// If this assignment is a duplicate, it is the original assignment's
// lti_resource_link_id
"original_lti_resource_link_id": 4,
// If this assignment is a duplicate, it is the original assignment's name
"original_assignment_name": "some assignment",
// If this assignment is a duplicate, it is the original assignment's quiz_id
"original_quiz_id": 4,
// String indicating what state this assignment is in.
"workflow_state": "unpublished"
}{
// The user's ID
"id": "123456",
// The user's name
"name": "Dankey Kang"
}{
// the ID of the assignment override
"id": 4,
// the ID of the assignment the override applies to (present if the override
// applies to an assignment)
"assignment_id": 123,
// the ID of the quiz the override applies to (present if the override applies
// to a quiz)
"quiz_id": 123,
// the ID of the module the override applies to (present if the override applies
// to a module)
"context_module_id": 123,
// the ID of the discussion the override applies to (present if the override
// applies to an ungraded discussion)
"discussion_topic_id": 123,
// the ID of the page the override applies to (present if the override applies
// to a page)
"wiki_page_id": 123,
// the ID of the file the override applies to (present if the override applies
// to a file)
"attachment_id": 123,
// the IDs of the override's target students (present if the override targets an
// ad-hoc set of students)
"student_ids": [1, 2, 3],
// the ID of the override's target group (present if the override targets a
// group and the assignment is a group assignment)
"group_id": 2,
// the ID of the overrides's target section (present if the override targets a
// section)
"course_section_id": 1,
// the title of the override
"title": "an assignment override",
// the overridden due at (present if due_at is overridden)
"due_at": "2012-07-01T23:59:00-06:00",
// the overridden all day flag (present if due_at is overridden)
"all_day": true,
// the overridden all day date (present if due_at is overridden)
"all_day_date": "2012-07-01",
// the overridden unlock at (present if unlock_at is overridden)
"unlock_at": "2012-07-01T23:59:00-06:00",
// the overridden lock at, if any (present if lock_at is overridden)
"lock_at": "2012-07-01T23:59:00-06:00"
}curl https://<canvas>/api/v1/courses/<course_id>/assignments/<assignment_id> \
-X DELETE \
-H 'Authorization: Bearer <token>'curl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/123/assignments/123/duplicatecurl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/123/assignments/123/duplicate?result_type=Quizcurl https://<canvas>/api/v1/courses/1/assignments/1/users/1/group_members"online_quiz"
"none"
"on_paper"
"discussion_topic"
"external_tool""online_upload"
"online_text_entry"
"online_url"
"media_recording" (Only valid when the Kaltura plugin is enabled)
"student_annotation"allowed_extensions: ["docx","ppt"]"online_quiz"
"none"
"on_paper"
"discussion_topic"
"external_tool""online_upload"
"online_text_entry"
"online_url"
"media_recording" (Only valid when the Kaltura plugin is enabled)
"student_annotation"allowed_extensions: ["docx","ppt"]curl 'https://<canvas>/api/v1/courses/1/assignments/bulk_update' \
-X PUT \
--data '[{
"id": 1,
"all_dates": [{
"base": true,
"due_at": "2020-08-29T23:59:00-06:00"
}, {
"id": 2,
"due_at": "2020-08-30T23:59:00-06:00"
}]
}]' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/1/assignments/2/overrides.json' \
-X POST \
-F 'assignment_override[student_ids][]=8' \
-F 'assignment_override[title]=Fred Flinstone' \
-F 'assignment_override[due_at]=2012-10-08T21:00:00Z' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/1/assignments/2/overrides/3.json' \
-X PUT \
-F 'assignment_override[title]=Fred Flinstone' \
-F 'assignment_override[due_at]=2012-10-08T21:00:00Z' \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/1/assignments/2/overrides/3.json' \
-X DELETE \
-H "Authorization: Bearer <token>"curl 'https://<canvas>/api/v1/courses/12/assignments/overrides.json?assignment_overrides[][id]=109&assignment_overrides[][assignment_id]=122&assignment_overrides[][id]=99&assignment_overrides[][assignment_id]=111' \
-H "Authorization: Bearer <token>"curl "https://<canvas>/api/v1/courses/12/assignments/overrides.json" \
-X POST \
-F "assignment_overrides[][assignment_id]=109" \
-F 'assignment_overrides[][student_ids][]=8' \
-F "assignment_overrides[][title]=foo" \
-F "assignment_overrides[][assignment_id]=13" \
-F "assignment_overrides[][course_section_id]=200" \
-F "assignment_overrides[][due_at]=2012-10-08T21:00:00Z" \
-H "Authorization: Bearer <token>"curl "https://<canvas>/api/v1/courses/12/assignments/overrides.json" \
-X PUT \
-F "assignment_overrides[][id]=122" \
-F "assignment_overrides[][assignment_id]=109" \
-F "assignment_overrides[][title]=foo" \
-F "assignment_overrides[][id]=993" \
-F "assignment_overrides[][assignment_id]=13" \
-F "assignment_overrides[][due_at]=2012-10-08T21:00:00Z" \
-H "Authorization: Bearer <token>"
Omit an override from the list to delete it
Welcome to Our New API Docs! This is the new home for all things API (previously at Canvas LMS REST API Documentation).
API for accessing course information.
A Term object looks like:
A CourseProgress object looks like:
A Course object looks like:
A CalendarLink object looks like:
GET /api/v1/courses
Scope: url:GET|/api/v1/courses
Returns the paginated list of active courses for the current user.
Request Parameters:
Returns a list of objects.
GET /api/v1/users/:user_id/courses
Scope: url:GET|/api/v1/users/:user_id/courses
Returns a paginated list of active courses for this user. To view the course list for a user other than yourself, you must be either an observer of that user or an administrator.
Request Parameters:
Returns a list of objects.
GET /api/v1/courses/:course_id/users/:user_id/progress
Scope: url:GET|/api/v1/courses/:course_id/users/:user_id/progress
Return progress information for the user and course
You can supply self as the user_id to query your own progress in a course. To query another user’s progress, you must be a teacher in the course, an administrator, or a linked observer of the user.
Returns a object.
POST /api/v1/accounts/:account_id/courses
Scope: url:POST|/api/v1/accounts/:account_id/courses
Create a new course
Request Parameters:
Returns a object.
POST /api/v1/courses/:course_id/files
Scope: url:POST|/api/v1/courses/:course_id/files
Upload a file to the course.
This API endpoint is the first step in uploading a file to a course. See the for details on the file upload workflow.
Only those with the “Manage Files” permission on a course can upload files to the course. By default, this is Teachers, TAs and Designers.
GET /api/v1/courses/:course_id/students
Scope: url:GET|/api/v1/courses/:course_id/students
Returns the paginated list of students enrolled in this course.
DEPRECATED: Please use the endpoint and pass “student” as the enrollment_type.
Returns a list of objects.
GET /api/v1/courses/:course_id/users
Scope: url:GET|/api/v1/courses/:course_id/users
GET /api/v1/courses/:course_id/search_users
Scope: url:GET|/api/v1/courses/:course_id/search_users
Returns the paginated list of users in this course. And optionally the user’s enrollments in the course.
Request Parameters:
Returns a list of objects.
GET /api/v1/courses/:course_id/recent_students
Scope: url:GET|/api/v1/courses/:course_id/recent_students
Returns the paginated list of users in this course, ordered by how recently they have logged in. The records include the ‘last_login’ field which contains a timestamp of the last time that user logged into canvas. The querying user must have the ‘View usage reports’ permission.
Example Request:
Returns a list of objects.
GET /api/v1/courses/:course_id/users/:id
Scope: url:GET|/api/v1/courses/:course_id/users/:id
Return information on a single user.
Accepts the same include[] parameters as the :users: action, and returns a single user with the same fields as that action.
Returns an object.
GET /api/v1/courses/:course_id/content_share_users
Scope: url:GET|/api/v1/courses/:course_id/content_share_users
Returns a paginated list of users you can share content with. Requires the content share feature and the user must have the manage content permission for the course.
Request Parameters:
Example Request:
Returns a list of objects.
POST /api/v1/courses/:course_id/preview_html
Scope: url:POST|/api/v1/courses/:course_id/preview_html
Preview html content processed for this course
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/activity_stream
Scope: url:GET|/api/v1/courses/:course_id/activity_stream
Returns the current user’s course-specific activity stream, paginated.
For full documentation, see the API documentation for the user activity stream, in the user api.
GET /api/v1/courses/:course_id/activity_stream/summary
Scope: url:GET|/api/v1/courses/:course_id/activity_stream/summary
Returns a summary of the current user’s course-specific activity stream.
For full documentation, see the API documentation for the user activity stream summary, in the user api.
GET /api/v1/courses/:course_id/todo
Scope: url:GET|/api/v1/courses/:course_id/todo
Returns the current user’s course-specific todo items.
For full documentation, see the API documentation for the user todo items, in the user api.
DELETE /api/v1/courses/:id
Scope: url:DELETE|/api/v1/courses/:id
Delete or conclude an existing course
Request Parameters:
Example Response:
GET /api/v1/courses/:course_id/settings
Scope: url:GET|/api/v1/courses/:course_id/settings
Returns some of a course’s settings.
Example Request:
Example Response:
PUT /api/v1/courses/:course_id/settings
Scope: url:PUT|/api/v1/courses/:course_id/settings
Can update the following course settings:
Request Parameters:
Example Request:
GET /api/v1/courses/:course_id/student_view_student
Scope: url:GET|/api/v1/courses/:course_id/student_view_student
Returns information for a test student in this course. Creates a test student if one does not already exist for the course. The caller must have permission to access the course’s student view.
Example Request:
Returns an object.
GET /api/v1/courses/:id
Scope: url:GET|/api/v1/courses/:id
GET /api/v1/accounts/:account_id/courses/:id
Scope: url:GET|/api/v1/accounts/:account_id/courses/:id
Return information on a single course.
Accepts the same include[] parameters as the list action plus:
Request Parameters:
Returns a object.
PUT /api/v1/courses/:id
Scope: url:PUT|/api/v1/courses/:id
Update an existing course.
Arguments are the same as Courses#create, with a few exceptions (enroll_me).
If a user has content management rights, but not full course editing rights, the only attribute editable through this endpoint will be “syllabus_body”
If an account has set prevent_course_availability_editing_by_teachers, a teacher cannot change course[start_at], course[conclude_at], or course[restrict_enrollments_to_course_dates] here.
Request Parameters:
Example Request:
Example Response:
PUT /api/v1/accounts/:account_id/courses
Scope: url:PUT|/api/v1/accounts/:account_id/courses
Update multiple courses in an account. Operates asynchronously; use the to query the status of an operation.
Request Parameters:
Example Request:
Returns a object.
POST /api/v1/courses/:course_id/reset_content
Scope: url:POST|/api/v1/courses/:course_id/reset_content
Deletes the current course, and creates a new equivalent course with no content, but all sections and users moved over.
Returns a object.
GET /api/v1/courses/:course_id/effective_due_dates
Scope: url:GET|/api/v1/courses/:course_id/effective_due_dates
For each assignment in the course, returns each assigned student’s ID and their corresponding due date along with some grading period data. Returns a collection with keys representing assignment IDs and values as a collection containing keys representing student IDs and values representing the student’s effective due_at, the grading_period_id of which the due_at falls in, and whether or not the grading period is closed (in_closed_grading_period)
The list of assignment IDs for which effective student due dates are requested. If not provided, all assignments in the course will be used.
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/permissions
Scope: url:GET|/api/v1/courses/:course_id/permissions
Returns permission information for the calling user in the given course. See also the and counterparts.
Request Parameters:
Example Request:
Example Response:
GET /api/v1/courses/:course_id/bulk_user_progress
Scope: url:GET|/api/v1/courses/:course_id/bulk_user_progress
Returns progress information for all users enrolled in the given course.
You must be a user who has permission to view all grades in the course (such as a teacher or administrator).
Example Request:
Example Response:
POST /api/v1/courses/:id/dismiss_migration_limitation_message
Scope: url:POST|/api/v1/courses/:id/dismiss_migration_limitation_message
Remove alert about the limitations of quiz migrations that is displayed to a user in a course
you must be logged in to use this endpoint
Example Response:
POST /api/v1/courses/:course_id/restore/:version_id
Scope: url:POST|/api/v1/courses/:course_id/restore/:version_id
Restore a course to a prior version.
Request Parameters:
Example Request:
Returns a object.
GET /api/v1/courses/:course_id/course_copy/:id
Scope: url:GET|/api/v1/courses/:course_id/course_copy/:id
DEPRECATED: Please use the
Retrieve the status of a course copy
API response field:
id
The unique identifier for the course copy.
created_at
The time that the copy was initiated.
progress
The progress of the copy as an integer. It is null before the copying starts, and 100 when finished.
workflow_state
The current status of the course copy. Possible values: “created”, “started”, “completed”, “failed”
status_url
The url for the course copy status API endpoint.
Example Response:
POST /api/v1/courses/:course_id/course_copy
Scope: url:POST|/api/v1/courses/:course_id/course_copy
DEPRECATED: Please use the
Copies content from one course into another. The default is to copy all course content. You can control specific types to copy by using either the ‘except’ option or the ‘only’ option.
The response is the same as the course copy status endpoint
Request Parameters:
This documentation is generated directly from the Canvas LMS source code, available .
exclude_blueprint_courses
boolean
When set, only return courses that are not configured as blueprint courses.
include[]
string
“needs_grading_count”: Optional information to include with each Course. When needs_grading_count is given, and the current user has grading rights, the total number of submissions needing grading for all assignments is returned.
“syllabus_body”: Optional information to include with each Course. When syllabus_body is given the user-generated html for the course syllabus is returned.
state[]
string
If set, only return courses that are in the given state(s). By default, “available” is returned for students and observers, and anything except “deleted”, for all other enrollment types
Allowed values: unpublished, available, completed, deleted
account_id
string
If set, only include courses associated with this account
course[license]
string
The name of the licensing. Should be one of the following abbreviations (a descriptive name is included in parenthesis for reference):
‘private’ (Private Copyrighted)
‘cc_by_nc_nd’ (CC Attribution Non-Commercial No Derivatives)
course[is_public]
boolean
Set to true if course is public to both authenticated and unauthenticated users.
course[is_public_to_auth_users]
boolean
Set to true if course is public only to authenticated users.
course[public_syllabus]
boolean
Set to true to make the course syllabus public.
course[public_syllabus_to_auth]
boolean
Set to true to make the course syllabus public for authenticated users.
course[public_description]
string
A publicly visible description of the course.
course[allow_student_wiki_edits]
boolean
If true, students will be able to modify the course wiki.
course[allow_wiki_comments]
boolean
If true, course members will be able to comment on wiki pages.
course[allow_student_forum_attachments]
boolean
If true, students can attach files to forum posts.
course[open_enrollment]
boolean
Set to true if the course is open enrollment.
course[self_enrollment]
boolean
Set to true if the course is self enrollment.
course[restrict_enrollments_to_course_dates]
boolean
Set to true to restrict user enrollments to the start and end dates of the course. This value must be set to true in order to specify a course start date and/or end date.
course[term_id]
string
The unique ID of the term to create to course in.
course[sis_course_id]
string
The unique SIS identifier.
course[integration_id]
string
The unique Integration identifier.
course[hide_final_grades]
boolean
If this option is set to true, the totals in student grades summary will be hidden.
course[apply_assignment_group_weights]
boolean
Set to true to weight final grade based on assignment groups percentages.
course[time_zone]
string
The time zone for the course. Allowed time zones are or friendlier .
offer
boolean
If this option is set to true, the course will be available to students immediately.
enroll_me
boolean
Set to true to enroll the current user as the teacher.
skip_course_template
boolean
If this option is set to true, the template of the account will not be applied to this course It means copy_from_course_template will not be executed. This option is thought for a course copy.
course[default_view]
string
The type of page that users will see when they first visit the course
‘feed’ Recent Activity Dashboard
‘modules’ Course Modules/Sections Page
course[syllabus_body]
string
The syllabus body for the course
course[grading_standard_id]
integer
The grading standard id to set for the course. If no value is provided for this argument the current grading_standard will be un-set from this course.
course[grade_passback_setting]
string
Optional. The grade_passback_setting for the course. Only ‘nightly_sync’, ‘disabled’, and ” are allowed
course[course_format]
string
Optional. Specifies the format of the course. (Should be ‘on_campus’, ‘online’, or ‘blended’)
course[post_manually]
boolean
Default is false. When true, all grades in the course must be posted manually, and will not be automatically posted. When false, all grades in the course will be automatically posted.
enable_sis_reactivation
boolean
When true, will first try to re-activate a deleted course with matching sis_course_id if possible.
enrollment_role_id
integer
When set, only return courses where the user is enrolled with the specified course-level role. This can be a role created with the or a built_in role id with type ‘StudentEnrollment’, ‘TeacherEnrollment’, ‘TaEnrollment’, ‘ObserverEnrollment’, or ‘DesignerEnrollment’.
section_ids[]
integer
When set, only return users who are enrolled in the given section(s).
include[]
string
“enrollments”:
Optionally include with each Course the user’s current and invited enrollments. If the user is enrolled as a student, and the account has permission to manage or view all grades, each enrollment will include a ‘grades’ key with ‘current_score’, ‘final_score’, ‘current_grade’ and ‘final_grade’ values.
user_id
string
If this parameter is given and it corresponds to a user in the course, the page parameter will be ignored and the page containing the specified user will be returned instead.
user_ids[]
integer
If included, the course users set will only include users with IDs specified by the param. Note: this will not work in conjunction with the “user_id” argument but multiple user_ids can be included.
enrollment_state[]
string
When set, only return users where the enrollment workflow state is of one of the given types. “active” and “invited” enrollments are returned by default.
Allowed values: active, invited, rejected, completed, inactive
allow_student_organized_groups
boolean
Let students organize their own groups
allow_student_discussion_reporting
boolean
Let students report offensive discussion content
allow_student_anonymous_discussion_topics
boolean
Let students create anonymous discussion topics
filter_speed_grader_by_student_group
boolean
Filter SpeedGrader to only the selected student group
hide_final_grades
boolean
Hide totals in student grades summary
hide_distribution_graphs
boolean
Hide grade distribution graphs from students
hide_sections_on_course_users_page
boolean
Disallow students from viewing students in sections they do not belong to
lock_all_announcements
boolean
Disable comments on announcements
usage_rights_required
boolean
Copyright and license information must be provided for files before they are published.
restrict_student_past_view
boolean
Restrict students from viewing courses after end date
restrict_student_future_view
boolean
Restrict students from viewing courses before start date
show_announcements_on_home_page
boolean
Show the most recent announcements on the Course home page (if a Wiki, defaults to five announcements, configurable via home_page_announcement_limit). Canvas for Elementary subjects ignore this setting.
home_page_announcement_limit
integer
Limit the number of announcements on the home page if enabled via show_announcements_on_home_page
syllabus_course_summary
boolean
Show the course summary (list of assignments and calendar events) on the syllabus page. Default is true.
default_due_time
string
Set the default due time for assignments. This is the time that will be pre-selected in the Canvas user interface when setting a due date for an assignment. It does not change when any existing assignment is due. It should be given in 24-hour HH:MM:SS format. The default is “23:59:59”. Use “inherit” to inherit the account setting.
conditional_release
boolean
Enable or disable individual learning paths for students based on assessment
course[end_at]
DateTime
Course end date in ISO8601 format. e.g. 2011-01-01T01:00Z This value is ignored unless ‘restrict_enrollments_to_course_dates’ is set to true.
course[license]
string
The name of the licensing. Should be one of the following abbreviations (a descriptive name is included in parenthesis for reference):
‘private’ (Private Copyrighted)
‘cc_by_nc_nd’ (CC Attribution Non-Commercial No Derivatives)
course[is_public]
boolean
Set to true if course is public to both authenticated and unauthenticated users.
course[is_public_to_auth_users]
boolean
Set to true if course is public only to authenticated users.
course[public_syllabus]
boolean
Set to true to make the course syllabus public.
course[public_syllabus_to_auth]
boolean
Set to true to make the course syllabus to public for authenticated users.
course[public_description]
string
A publicly visible description of the course.
course[allow_student_wiki_edits]
boolean
If true, students will be able to modify the course wiki.
course[allow_wiki_comments]
boolean
If true, course members will be able to comment on wiki pages.
course[allow_student_forum_attachments]
boolean
If true, students can attach files to forum posts.
course[open_enrollment]
boolean
Set to true if the course is open enrollment.
course[self_enrollment]
boolean
Set to true if the course is self enrollment.
course[restrict_enrollments_to_course_dates]
boolean
Set to true to restrict user enrollments to the start and end dates of the course. Setting this value to false will remove the course end date (if it exists), as well as the course start date (if the course is unpublished).
course[term_id]
integer
The unique ID of the term to create to course in.
course[sis_course_id]
string
The unique SIS identifier.
course[integration_id]
string
The unique Integration identifier.
course[hide_final_grades]
boolean
If this option is set to true, the totals in student grades summary will be hidden.
course[time_zone]
string
The time zone for the course. Allowed time zones are or friendlier .
course[apply_assignment_group_weights]
boolean
Set to true to weight final grade based on assignment groups percentages.
course[storage_quota_mb]
integer
Set the storage quota for the course, in megabytes. The caller must have the “Manage storage quotas” account permission.
offer
boolean
If this option is set to true, the course will be available to students immediately.
course[event]
string
The action to take on each course.
‘claim’ makes a course no longer visible to students. This action is also called “unpublish” on the web site. A course cannot be unpublished if students have received graded submissions.
‘offer’ makes a course visible to students. This action is also called “publish” on the web site.
course[default_view]
string
The type of page that users will see when they first visit the course
‘feed’ Recent Activity Dashboard
‘wiki’ Wiki Front Page
course[syllabus_body]
string
The syllabus body for the course
course[syllabus_course_summary]
boolean
Optional. Indicates whether the Course Summary (consisting of the course’s assignments and calendar events) is displayed on the syllabus page. Defaults to true.
course[grading_standard_id]
integer
The grading standard id to set for the course. If no value is provided for this argument the current grading_standard will be un-set from this course.
course[grade_passback_setting]
string
Optional. The grade_passback_setting for the course. Only ‘nightly_sync’ and ” are allowed
course[course_format]
string
Optional. Specifies the format of the course. (Should be either ‘on_campus’ or ‘online’)
course[image_id]
integer
This is a file ID corresponding to an image file in the course that will be used as the course image. This will clear the course’s image_url setting if set. If you attempt to provide image_url and image_id in a request it will fail.
course[image_url]
string
This is a URL to an image to be used as the course image. This will clear the course’s image_id setting if set. If you attempt to provide image_url and image_id in a request it will fail.
course[remove_image]
boolean
If this option is set to true, the course image url and course image ID are both set to nil
course[remove_banner_image]
boolean
If this option is set to true, the course banner image url and course banner image ID are both set to nil
course[blueprint]
boolean
Sets the course as a blueprint course.
course[blueprint_restrictions]
BlueprintRestriction
Sets a default set to apply to blueprint course objects when restricted, unless use_blueprint_restrictions_by_object_type is enabled. See the documentation
course[use_blueprint_restrictions_by_object_type]
boolean
When enabled, the blueprint_restrictions parameter will be ignored in favor of the blueprint_restrictions_by_object_type parameter
course[blueprint_restrictions_by_object_type]
multiple BlueprintRestrictions
Allows setting multiple to apply to blueprint course objects of the matching type when restricted. The possible object types are “assignment”, “attachment”, “discussion_topic”, “quiz” and “wiki_page”. Example usage:
course[homeroom_course]
boolean
Sets the course as a homeroom course. The setting takes effect only when the course is associated with a Canvas for Elementary-enabled account.
course[sync_enrollments_from_homeroom]
string
Syncs enrollments from the homeroom that is set in homeroom_course_id. The setting only takes effect when the course is associated with a Canvas for Elementary-enabled account and sync_enrollments_from_homeroom is enabled.
course[homeroom_course_id]
string
Sets the Homeroom Course id to be used with sync_enrollments_from_homeroom. The setting only takes effect when the course is associated with a Canvas for Elementary-enabled account and sync_enrollments_from_homeroom is enabled.
course[template]
boolean
Enable or disable the course as a template that can be selected by an account
course[course_color]
string
Sets a color in hex code format to be associated with the course. The setting takes effect only when the course is associated with a Canvas for Elementary-enabled account.
course[friendly_name]
string
Set a friendly name for the course. If this is provided and the course is associated with a Canvas for Elementary account, it will be shown instead of the course name. This setting takes priority over course nicknames defined by individual users.
course[enable_course_paces]
boolean
Enable or disable Course Pacing for the course. This setting only has an effect when the Course Pacing feature flag is enabled for the sub-account. Otherwise, Course Pacing are always disabled.
course[conditional_release]
boolean
Enable or disable individual learning paths for students based on assessment
course[post_manually]
boolean
When true, all grades in the course will be posted manually. When false, all grades in the course will be automatically posted. Use with caution as this setting will override any assignment level post policy.
override_sis_stickiness
boolean
Default is true. If false, any fields containing “sticky” changes will not be updated. See SIS CSV Format documentation for information on which fields can have SIS stickiness
enrollment_type
string
When set, only return courses where the user is enrolled as this type. For example, set to “teacher” to return only courses where the user is enrolled as a Teacher. This argument is ignored if enrollment_role is given.
Allowed values: teacher, student, ta, observer, designer
enrollment_role
string
Deprecated When set, only return courses where the user is enrolled with the specified course-level role. This can be a role created with the Add Role API or a base role type of ‘StudentEnrollment’, ‘TeacherEnrollment’, ‘TaEnrollment’, ‘ObserverEnrollment’, or ‘DesignerEnrollment’.
enrollment_role_id
integer
When set, only return courses where the user is enrolled with the specified course-level role. This can be a role created with the Add Role API or a built_in role type of ‘StudentEnrollment’, ‘TeacherEnrollment’, ‘TaEnrollment’, ‘ObserverEnrollment’, or ‘DesignerEnrollment’.
enrollment_state
string
When set, only return courses where the user has an enrollment with the given state. This will respect section/course/term date overrides.
Allowed values: active, invited_or_pending, completed
include[]
string
“needs_grading_count”: Optional information to include with each Course. When needs_grading_count is given, and the current user has grading rights, the total number of submissions needing grading for all assignments is returned.
“syllabus_body”: Optional information to include with each Course. When syllabus_body is given the user-generated html for the course syllabus is returned.
“public_description”: Optional information to include with each Course. When public_description is given the user-generated text for the course public description is returned.
“total_scores”: Optional information to include with each Course. When total_scores is given, any student enrollments will also include the fields ‘computed_current_score’, ‘computed_final_score’, ‘computed_current_grade’, and ‘computed_final_grade’ (see Enrollment documentation for more information on these fields). This argument is ignored if the course is configured to hide final grades.
“current_grading_period_scores”: Optional information to include with each Course. When current_grading_period_scores is given and total_scores is given, any student enrollments will also include the fields ‘has_grading_periods’, ‘totals_for_all_grading_periods_option’, ‘current_grading_period_title’, ‘current_grading_period_id’, current_period_computed_current_score’, ‘current_period_computed_final_score’, ‘current_period_computed_current_grade’, and ‘current_period_computed_final_grade’, as well as (if the user has permission) ‘current_period_unposted_current_score’, ‘current_period_unposted_final_score’, ‘current_period_unposted_current_grade’, and ‘current_period_unposted_final_grade’ (see Enrollment documentation for more information on these fields). In addition, when this argument is passed, the course will have a ‘has_grading_periods’ attribute on it. This argument is ignored if the course is configured to hide final grades or if the total_scores argument is not included.
“grading_periods”: Optional information to include with each Course. When grading_periods is given, a list of the grading periods associated with each course is returned.
“term”: Optional information to include with each Course. When term is given, the information for the enrollment term for each course is returned.
“account”: Optional information to include with each Course. When account is given, the account json for each course is returned.
“course_progress”: Optional information to include with each Course. When course_progress is given, each course will include a ‘course_progress’ object with the fields: ‘requirement_count’, an integer specifying the total number of requirements in the course, ‘requirement_completed_count’, an integer specifying the total number of requirements in this course that have been completed, and ‘next_requirement_url’, a string url to the next requirement item, and ‘completed_at’, the date the course was completed (null if incomplete). ‘next_requirement_url’ will be null if all requirements have been completed or the current module does not require sequential progress. “course_progress” will return an error message if the course is not module based or the user is not enrolled as a student in the course.
“sections”: Section enrollment information to include with each Course. Returns an array of hashes containing the section ID (id), section name (name), start and end dates (start_at, end_at), as well as the enrollment type (enrollment_role, e.g. ‘StudentEnrollment’).
“storage_quota_used_mb”: The amount of storage space used by the files in this course
“total_students”: Optional information to include with each Course. Returns an integer for the total amount of active and invited students.
“passback_status”: Include the grade passback_status
“favorites”: Optional information to include with each Course. Indicates if the user has marked the course as a favorite course.
“teachers”: Teacher information to include with each Course. Returns an array of hashes containing the information for each teacher in the course.
“observed_users”: Optional information to include with each Course. Will include data for observed users if the current user has an observer enrollment.
“tabs”: Optional information to include with each Course. Will include the list of tabs configured for each course. See the for more information.
“course_image”: Optional information to include with each Course. Returns course image url if a course image has been set.
“banner_image”: Optional information to include with each Course. Returns course banner image url if the course is a Canvas for Elementary subject and a banner image has been set.
“concluded”: Optional information to include with each Course. Indicates whether the course has been concluded, taking course and term dates into account.
“post_manually”: Optional information to include with each Course. Returns true if the course post policy is set to “Manually”. Returns false if the the course post policy is set to “Automatically”.
Allowed values: needs_grading_count, syllabus_body, public_description, total_scores, current_grading_period_scores, grading_periods, term, account, course_progress, sections, storage_quota_used_mb, total_students, passback_status, favorites
state[]
string
If set, only return courses that are in the given state(s). By default, “available” is returned for students and observers, and anything except “deleted”, for all other enrollment types
Allowed values: unpublished, available, completed, deleted
enrollment_state
string
When set, only return courses where the user has an enrollment with the given state. This will respect section/course/term date overrides.
Allowed values: active, invited_or_pending, completed
homeroom
boolean
If set, only return homeroom courses.
course[name]
string
The name of the course. If omitted, the course will be named “Unnamed Course.”
course[course_code]
string
The course code for the course.
course[start_at]
DateTime
Course start date in ISO8601 format, e.g. 2011-01-01T01:00Z This value is ignored unless ‘restrict_enrollments_to_course_dates’ is set to true.
course[end_at]
DateTime
Course end date in ISO8601 format. e.g. 2011-01-01T01:00Z This value is ignored unless ‘restrict_enrollments_to_course_dates’ is set to true.
search_term
string
The partial name or full ID of the users to match and return in the results list.
sort
string
When set, sort the results of the search based on the given field.
Allowed values: username, last_login, email, sis_id
enrollment_type[]
string
When set, only return users where the user is enrolled as this type. “student_view” implies include[]=test_student. This argument is ignored if enrollment_role is given.
Allowed values: teacher, student, student_view, ta, observer, designer
enrollment_role
string
Deprecated When set, only return users enrolled with the specified course-level role. This can be a role created with the Add Role API or a base role type of ‘StudentEnrollment’, ‘TeacherEnrollment’, ‘TaEnrollment’, ‘ObserverEnrollment’, or ‘DesignerEnrollment’.
search_term
Required string
Term used to find users. Will search available share users with the search term in their name.
html
string
The html content to process
event
Required string
The action to take on the course.
Allowed values: delete, conclude
allow_final_grade_override
boolean
Let student final grades for a grading period or the total grades for the course be overridden
allow_student_discussion_topics
boolean
Let students create discussion topics
allow_student_forum_attachments
boolean
Let students attach files to discussions
allow_student_discussion_editing
boolean
Let students edit or delete their own discussion replies
include[]
string
“all_courses”: Also search recently deleted courses.
“permissions”: Include permissions the current user has for the course.
“observed_users”: Include observed users in the enrollments
“course_image”: Include course image url if a course image has been set
“banner_image”: Include course banner image url if the course is a Canvas for Elementary subject and a banner image has been set
“concluded”: Optional information to include with Course. Indicates whether the course has been concluded, taking course and term dates into account.
“lti_context_id”: Include course LTI tool id.
“post_manually”: Include course post policy. If the post policy is manually post grades, the value will be true. If the post policy is automatically post grades, the value will be false.
Allowed values: needs_grading_count, syllabus_body, public_description, total_scores, current_grading_period_scores, term, account, course_progress, sections, storage_quota_used_mb, total_students, passback_status, favorites, teachers
teacher_limit
integer
The maximum number of teacher enrollments to show. If the course contains more teachers than this, instead of giving the teacher enrollments, the count of teachers will be given under a teacher_count key.
course[account_id]
integer
The unique ID of the account to move the course to.
course[name]
string
The name of the course. If omitted, the course will be named “Unnamed Course.”
course[course_code]
string
The course code for the course.
course[start_at]
DateTime
Course start date in ISO8601 format, e.g. 2011-01-01T01:00Z This value is ignored unless ‘restrict_enrollments_to_course_dates’ is set to true, or the course is already published.
course_ids[]
Required string
List of ids of courses to update. At most 500 courses may be updated in one call.
event
Required string
The action to take on each course. Must be one of ‘offer’, ‘conclude’, ‘delete’, or ‘undelete’.
‘offer’ makes a course visible to students. This action is also called “publish” on the web site.
‘conclude’ prevents future enrollments and makes a course read-only for all participants. The course still appears in prior-enrollment lists.
‘delete’ completely removes the course from the web site (including course menus and prior-enrollment lists). All enrollments are deleted. Course content may be physically deleted at a future date.
‘undelete’ attempts to recover a course that has been deleted. (Recovery is not guaranteed; please conclude rather than delete a course if there is any possibility the course will be used again.) The recovered course will be unpublished. Deleted enrollments will not be recovered.
Allowed values: offer, conclude, delete, undelete
assignment_ids[]
string
no description
permissions[]
string
List of permissions to check against the authenticated user. Permission names are documented in the List assignable permissions endpoint.
version_id
Required integer
The version to restore to (use the syllabus_versions include parameter in the course show API to see available versions)
source_course
string
ID or SIS-ID of the course to copy the content from
except[]
string
A list of the course content types to exclude, all areas not listed will be copied.
Allowed values: course_settings, assignments, external_tools, files, topics, calendar_events, quizzes, wiki_pages, modules, outcomes
only[]
string
A list of the course content types to copy, all areas not listed will not be copied.
Allowed values: course_settings, assignments, external_tools, files, topics, calendar_events, quizzes, wiki_pages, modules, outcomes
{
"id": 1,
"name": "Default Term",
"start_at": "2012-06-01T00:00:00-06:00",
"end_at": null
}{
// total number of requirements from all modules
"requirement_count": 10,
// total number of requirements the user has completed from all modules
"requirement_completed_count": 1,
// url to next module item that has an unmet requirement. null if the user has
// completed the course or the current module does not require sequential
// progress
"next_requirement_url": "http://localhost/courses/1/modules/items/2",
// date the course was completed. null if the course has not been completed by
// this user
"completed_at": "2013-06-01T00:00:00-06:00"
}{
// the unique identifier for the course
"id": 370663,
// the SIS identifier for the course, if defined. This field is only included if
// the user has permission to view SIS information.
"sis_course_id": null,
// the UUID of the course
"uuid": "WvAHhY5FINzq5IyRIJybGeiXyFkG3SqHUPb7jZY5",
// the integration identifier for the course, if defined. This field is only
// included if the user has permission to view SIS information.
"integration_id": null,
// the unique identifier for the SIS import. This field is only included if the
// user has permission to manage SIS information.
"sis_import_id": 34,
// the full name of the course. If the requesting user has set a nickname for
// the course, the nickname will be shown here.
"name": "InstructureCon 2012",
// the course code
"course_code": "INSTCON12",
// the actual course name. This field is returned only if the requesting user
// has set a nickname for the course.
"original_name": "InstructureCon-2012-01",
// the current state of the course, also known as ‘status’. The value will be
// one of the following values: 'unpublished', 'available', 'completed', or
// 'deleted'. NOTE: When fetching a singular course that has a 'deleted'
// workflow state value, an error will be returned with a message of 'The
// specified resource does not exist.'
"workflow_state": "available",
// the account associated with the course
"account_id": 81259,
// the root account associated with the course
"root_account_id": 81259,
// the enrollment term associated with the course
"enrollment_term_id": 34,
// A list of grading periods associated with the course
"grading_periods": null,
// the grading standard associated with the course
"grading_standard_id": 25,
// the grade_passback_setting set on the course
"grade_passback_setting": "nightly_sync",
// the date the course was created.
"created_at": "2012-05-01T00:00:00-06:00",
// the start date for the course, if applicable
"start_at": "2012-06-01T00:00:00-06:00",
// the end date for the course, if applicable
"end_at": "2012-09-01T00:00:00-06:00",
// the course-set locale, if applicable
"locale": "en",
// A list of enrollments linking the current user to the course. for student
// enrollments, grading information may be included if include[]=total_scores
"enrollments": null,
// optional: the total number of active and invited students in the course
"total_students": 32,
// course calendar
"calendar": null,
// the type of page that users will see when they first visit the course -
// 'feed': Recent Activity Dashboard - 'wiki': Wiki Front Page - 'modules':
// Course Modules/Sections Page - 'assignments': Course Assignments List -
// 'syllabus': Course Syllabus Page other types may be added in the future
"default_view": "feed",
// optional: user-generated HTML for the course syllabus
"syllabus_body": "<p>syllabus html goes here</p>",
// optional: the number of submissions needing grading returned only if the
// current user has grading rights and include[]=needs_grading_count
"needs_grading_count": 17,
// optional: the enrollment term object for the course returned only if
// include[]=term
"term": null,
// optional: information on progress through the course returned only if
// include[]=course_progress
"course_progress": null,
// weight final grade based on assignment group percentages
"apply_assignment_group_weights": true,
// optional: the permissions the user has for the course. returned only for a
// single course and include[]=permissions
"permissions": {"create_discussion_topic":true,"create_announcement":true},
"is_public": true,
"is_public_to_auth_users": true,
"public_syllabus": true,
"public_syllabus_to_auth": true,
// optional: the public description of the course
"public_description": "Come one, come all to InstructureCon 2012!",
"storage_quota_mb": 5,
"storage_quota_used_mb": 5,
"hide_final_grades": false,
"license": "Creative Commons",
"allow_student_assignment_edits": false,
"allow_wiki_comments": false,
"allow_student_forum_attachments": false,
"open_enrollment": true,
"self_enrollment": false,
"restrict_enrollments_to_course_dates": false,
"course_format": "online",
// optional: this will be true if this user is currently prevented from viewing
// the course because of date restriction settings
"access_restricted_by_date": false,
// The course's IANA time zone name.
"time_zone": "America/Denver",
// optional: whether the course is set as a Blueprint Course (blueprint fields
// require the Blueprint Courses feature)
"blueprint": true,
// optional: Set of restrictions applied to all locked course objects
"blueprint_restrictions": {"content":true,"points":true,"due_dates":false,"availability_dates":false},
// optional: Sets of restrictions differentiated by object type applied to
// locked course objects
"blueprint_restrictions_by_object_type": {"assignment":{"content":true,"points":true},"wiki_page":{"content":true}},
// optional: whether the course is set as a template (requires the Course
// Templates feature)
"template": true
}{
// The URL of the calendar in ICS format
"ics": "https://canvas.instructure.com/feeds/calendars/course_abcdef.ics"
}curl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/<course_id>/recent_userscurl -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/<course_id>/content_share_users \
-d 'search_term=smith'curl https://<canvas>/api/v1/courses/<course_id>/preview_html \
-F 'html=<p><badhtml></badhtml>processed html</p>' \
-H 'Authorization: Bearer <token>'{
"html": "<p>processed html</p>"
}{ "delete": "true" }curl https://<canvas>/api/v1/courses/<course_id>/settings \
-X GET \
-H 'Authorization: Bearer <token>'{
"allow_student_discussion_topics": true,
"allow_student_forum_attachments": false,
"allow_student_discussion_editing": true,
"grading_standard_enabled": true,
"grading_standard_id": 137,
"allow_student_organized_groups": true,
"hide_final_grades": false,
"hide_distribution_graphs": false,
"hide_sections_on_course_users_page": false,
"lock_all_announcements": true,
"usage_rights_required": false,
"homeroom_course": false,
"default_due_time": "23:59:59",
"conditional_release": false
}curl https://<canvas>/api/v1/courses/<course_id>/settings \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'allow_student_discussion_topics=false'curl https://<canvas>/api/v1/courses/<course_id>/student_view_student \
-X GET \
-H 'Authorization: Bearer <token>'curl https://<canvas>/api/v1/courses/<course_id> \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'course[name]=New course name' \
-d 'course[start_at]=2012-05-05T00:00:00Z'{
"name": "New course name",
"course_code": "COURSE-001",
"start_at": "2012-05-05T00:00:00Z",
"end_at": "2012-08-05T23:59:59Z",
"sis_course_id": "12345"
}curl https://<canvas>/api/v1/accounts/<account_id>/courses \
-X PUT \
-H 'Authorization: Bearer <token>' \
-d 'event=offer' \
-d 'course_ids[]=1' \
-d 'course_ids[]=2'curl https://<canvas>/api/v1/courses/<course_id>/effective_due_dates
-X GET \
-H 'Authorization: Bearer <token>'{
"1": {
"14": { "due_at": "2015-09-05", "grading_period_id": null, "in_closed_grading_period": false },
"15": { due_at: null, "grading_period_id": 3, "in_closed_grading_period": true }
},
"2": {
"14": { "due_at": "2015-08-05", "grading_period_id": 3, "in_closed_grading_period": true }
}
}curl https://<canvas>/api/v1/courses/<course_id>/permissions \
-H 'Authorization: Bearer <token>' \
-d 'permissions[]=manage_grades'
-d 'permissions[]=send_messages'{'manage_grades': 'false', 'send_messages': 'true'}curl https://<canvas>/api/v1/courses/<course_id>/bulk_user_progress \
-H 'Authorization: Bearer <token>'[
{
"id": 1,
"display_name": "Test Student 1",
"avatar_image_url": "https://<canvas>/images/messages/avatar-50.png",
"html_url": "https://<canvas>/courses/1/users/1",
"pronouns": null,
"progress": {
"requirement_count": 2,
"requirement_completed_count": 1,
"next_requirement_url": "https://<canvas>/courses/<course_id>/modules/items/<item_id>",
"completed_at": null
}
},
{
"id": 2,
"display_name": "Test Student 2",
"avatar_image_url": "https://<canvas>/images/messages/avatar-50.png",
"html_url": "https://<canvas>/courses/1/users/2",
"pronouns": null,
"progress": {
"requirement_count": 2,
"requirement_completed_count": 2,
"next_requirement_url": null,
"completed_at": "2021-08-10T16:26:08Z"
}
}
]{ "success": "true" }curl -X POST -H 'Authorization: Bearer <token>' \
https://<canvas>/api/v1/courses/123/restore/4{'progress':100, 'workflow_state':'completed', 'id':257, 'created_at':'2011-11-17T16:50:06Z', 'status_url':'/api/v1/courses/9457/course_copy/257'}teachersobserved_userscourse_imagebanner_imageconcludedpost_manuallyobserved_usersall_coursespermissionscourse_imagebanner_imageconcludedlti_context_idpost_manually
“public_description”: Optional information to include with each Course. When public_description is given the user-generated text for the course public description is returned.
“total_scores”: Optional information to include with each Course. When total_scores is given, any student enrollments will also include the fields ‘computed_current_score’, ‘computed_final_score’, ‘computed_current_grade’, and ‘computed_final_grade’, as well as (if the user has permission) ‘unposted_current_score’, ‘unposted_final_score’, ‘unposted_current_grade’, and ‘unposted_final_grade’ (see Enrollment documentation for more information on these fields). This argument is ignored if the course is configured to hide final grades.
“current_grading_period_scores”: Optional information to include with each Course. When current_grading_period_scores is given and total_scores is given, any student enrollments will also include the fields ‘has_grading_periods’, ‘totals_for_all_grading_periods_option’, ‘current_grading_period_title’, ‘current_grading_period_id’, current_period_computed_current_score’, ‘current_period_computed_final_score’, ‘current_period_computed_current_grade’, and ‘current_period_computed_final_grade’, as well as (if the user has permission) ‘current_period_unposted_current_score’, ‘current_period_unposted_final_score’, ‘current_period_unposted_current_grade’, and ‘current_period_unposted_final_grade’ (see Enrollment documentation for more information on these fields). In addition, when this argument is passed, the course will have a ‘has_grading_periods’ attribute on it. This argument is ignored if the total_scores argument is not included. If the course is configured to hide final grades, the following fields are not returned: ‘totals_for_all_grading_periods_option’, ‘current_period_computed_current_score’, ‘current_period_computed_final_score’, ‘current_period_computed_current_grade’, ‘current_period_computed_final_grade’, ‘current_period_unposted_current_score’, ‘current_period_unposted_final_score’, ‘current_period_unposted_current_grade’, and ‘current_period_unposted_final_grade’
“grading_periods”: Optional information to include with each Course. When grading_periods is given, a list of the grading periods associated with each course is returned.
“term”: Optional information to include with each Course. When term is given, the information for the enrollment term for each course is returned.
“account”: Optional information to include with each Course. When account is given, the account json for each course is returned.
“course_progress”: Optional information to include with each Course. When course_progress is given, each course will include a ‘course_progress’ object with the fields: ‘requirement_count’, an integer specifying the total number of requirements in the course, ‘requirement_completed_count’, an integer specifying the total number of requirements in this course that have been completed, and ‘next_requirement_url’, a string url to the next requirement item, and ‘completed_at’, the date the course was completed (null if incomplete). ‘next_requirement_url’ will be null if all requirements have been completed or the current module does not require sequential progress. “course_progress” will return an error message if the course is not module based or the user is not enrolled as a student in the course.
“sections”: Section enrollment information to include with each Course. Returns an array of hashes containing the section ID (id), section name (name), start and end dates (start_at, end_at), as well as the enrollment type (enrollment_role, e.g. ‘StudentEnrollment’).
“storage_quota_used_mb”: The amount of storage space used by the files in this course
“total_students”: Optional information to include with each Course. Returns an integer for the total amount of active and invited students.
“passback_status”: Include the grade passback_status
“favorites”: Optional information to include with each Course. Indicates if the user has marked the course as a favorite course.
“teachers”: Teacher information to include with each Course. Returns an array of hashes containing the UserDisplay information for each teacher in the course.
“observed_users”: Optional information to include with each Course. Will include data for observed users if the current user has an observer enrollment.
“tabs”: Optional information to include with each Course. Will include the list of tabs configured for each course. See the List available tabs API for more information.
“course_image”: Optional information to include with each Course. Returns course image url if a course image has been set.
“banner_image”: Optional information to include with each Course. Returns course banner image url if the course is a Canvas for Elementary subject and a banner image has been set.
“concluded”: Optional information to include with each Course. Indicates whether the course has been concluded, taking course and term dates into account.
“post_manually”: Optional information to include with each Course. Returns true if the course post policy is set to Manually post grades. Returns false if the the course post policy is set to Automatically post grades.
Allowed values: needs_grading_count, syllabus_body, public_description, total_scores, current_grading_period_scores, grading_periods, term, account, course_progress, sections, storage_quota_used_mb, total_students, passback_status, favorites, teachers, observed_users, course_image, banner_image, concluded, post_manually
‘cc_by_nc_sa’ (CC Attribution Non-Commercial Share Alike)
‘cc_by_nc’ (CC Attribution Non-Commercial)
‘cc_by_nd’ (CC Attribution No Derivatives)
‘cc_by_sa’ (CC Attribution Share Alike)
‘cc_by’ (CC Attribution)
‘public_domain’ (Public Domain).
‘assignments’ Course Assignments List
‘syllabus’ Course Syllabus Page
other types may be added in the future
Allowed values: feed, wiki, modules, syllabus, assignments
“avatar_url”: Optionally include avatar_url.
“bio”: Optionally include each user’s bio.
“test_student”: Optionally include the course’s Test Student,
if present. Default is to not include Test Student.
“custom_links”: Optionally include plugin-supplied custom links for each student,
such as analytics information
“current_grading_period_scores”: if enrollments is included as
well as this directive, the scores returned in the enrollment will be for the current grading period if there is one. A ‘grading_period_id’ value will also be included with the scores. if grading_period_id is nil there is no current grading period and the score is a total score.
“uuid”: Optionally include the users uuid
Allowed values: enrollments, locked, avatar_url, test_student, bio, custom_links, current_grading_period_scores, uuid
‘cc_by_nc_sa’ (CC Attribution Non-Commercial Share Alike)
‘cc_by_nc’ (CC Attribution Non-Commercial)
‘cc_by_nd’ (CC Attribution No Derivatives)
‘cc_by_sa’ (CC Attribution Share Alike)
‘cc_by’ (CC Attribution)
‘public_domain’ (Public Domain).
‘conclude’ prevents future enrollments and makes a course read-only for all participants. The course still appears in prior-enrollment lists.
‘delete’ completely removes the course from the web site (including course menus and prior-enrollment lists). All enrollments are deleted. Course content may be physically deleted at a future date.
‘undelete’ attempts to recover a course that has been deleted. This action requires account administrative rights. (Recovery is not guaranteed; please conclude rather than delete a course if there is any possibility the course will be used again.) The recovered course will be unpublished. Deleted enrollments will not be recovered.
Allowed values: claim, offer, conclude, delete, undelete
‘modules’ Course Modules/Sections Page
‘assignments’ Course Assignments List
‘syllabus’ Course Syllabus Page
other types may be added in the future
Allowed values: feed, wiki, modules, syllabus, assignments
course[blueprint_restrictions_by_object_type][assignment][content]=1