We have relocated to Instructure Developer Documentation Portal. ๐ Please update your bookmarks. This page will automatically redirect after July 1, 2026.
Groups API
Groups serve as the data for a few different ideas in Canvas. The first is that they can be a community in the canvas network. The second is that they can be organized by students in a course, for study or communication (but not grading). The third is that they can be organized by teachers or account administrators for the purpose of projects, assignments, and grading. This last kind of group is always part of a group category, which adds the restriction that a user may only be a member of one group per category.
All of these types of groups function similarly, and can be the parent context for many other types of functionality and interaction, such as collections, discussions, wikis, and shared files.
Group memberships are the objects that tie users and groups together.
A Group object looks like:
{
// The ID of the group.
"id": 17,
// The display name of the group.
"name": "Math Group 1",
// A description of the group. This is plain text.
"description": null,
// Whether or not the group is public. Currently only community groups can be
// made public. Also, once a group has been set to public, it cannot be changed
// back to private.
"is_public": false,
// Whether or not the current user is following this group.
"followed_by_user": false,
// How people are allowed to join the group. For all groups except for
// community groups, the user must share the group's parent course or account.
// For student organized or community groups, where a user can be a member of as
// many or few as they want, the applicable levels are
// 'parent_context_auto_join', 'parent_context_request', and 'invitation_only'.
// For class groups, where students are divided up and should only be part of
// one group of the category, this value will always be 'invitation_only', and
// is not relevant. * If 'parent_context_auto_join', anyone can join and will be
// automatically accepted. * If 'parent_context_request', anyone can request to
// join, which must be approved by a group moderator. * If 'invitation_only',
// only those how have received an invitation my join the group, by accepting
// that invitation.
"join_level": "invitation_only",
// The number of members currently in the group
"members_count": 0,
// The url of the group's avatar
"avatar_url": "https://<canvas>/files/avatar_image.png",
// The course or account that the group belongs to. The pattern here is that
// whatever the context_type is, there will be an _id field named after that
// type. So if instead context_type was 'account', the course_id field would be
// replaced by an account_id field.
"context_type": "Course",
// The course or account name that the group belongs to.
"context_name": "Course 101",
"course_id": 3,
// Certain types of groups have special role designations. Currently, these
// include: 'communities', 'student_organized', and 'imported'. Regular
// course/account groups have a role of null.
"role": null,
// The ID of the group's category.
"group_category_id": 4,
// The SIS ID of the group. Only included if the user has permission to view SIS
// information.
"sis_group_id": "group4a",
// The id of the SIS import if created through SIS. Only included if the user
// has permission to manage SIS information.
"sis_import_id": 14,
// the storage quota for the group, in megabytes
"storage_quota_mb": 50,
// optional: the permissions the user has for the group. returned only for a
// single group and include[]=permissions
"permissions": {"create_discussion_topic":true,"create_announcement":true},
// optional: A list of users that are members in the group. Returned only if
// include[]=users. WARNING: this collection's size is capped (if there are an
// extremely large number of users in the group (thousands) not all of them will
// be returned). If you need to capture all the users in a group with certainty
// or experiencing slow response consider using the paginated
// /api/v1/groups/<group_id>/users endpoint.
"users": null,
// Indicates whether this group category is non-collaborative. A value of true
// means these group categories rely on the manage_tags permissions and do not
// have collaborative features
"non_collaborative": null
}
A GroupMembership object looks like:
{
// The id of the membership object
"id": 92,
// The id of the group object to which the membership belongs
"group_id": 17,
// The id of the user object to which the membership belongs
"user_id": 3,
// The current state of the membership. Current possible values are 'accepted',
// 'invited', and 'requested'
"workflow_state": "accepted",
// Whether or not the user is a moderator of the group (the must also be an
// active member of the group to moderate)
"moderator": true,
// optional: whether or not the record was just created on a create call (POST),
// i.e. was the user just added to the group, or was the user already a member
"just_created": true,
// The id of the SIS import if created through SIS. Only included if the user
// has permission to manage SIS information.
"sis_import_id": 4
}
List your groups GroupsController#index
GET /api/v1/users/self/groups
url:GET|/api/v1/users/self/groups
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| context_type | string |
Only include groups that are in this type of context.
Allowed values: |
|
| include[] | string |
- "tabs": Include the list of tabs configured for each group. See the
List available tabs API for more information.
Allowed values: |
Example Request:
curl https://<canvas>/api/v1/users/self/groups?context_type=Account \
-H 'Authorization: Bearer <token>'
List the groups available in a context. GroupsController#context_index
GET /api/v1/accounts/:account_id/groups
url:GET|/api/v1/accounts/:account_id/groups
GET /api/v1/courses/:course_id/groups
url:GET|/api/v1/courses/:course_id/groups
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| only_own_groups | boolean | Will only include groups that the user belongs to if this is set | |
| include[] | string |
- "tabs": Include the list of tabs configured for each group. See the
List available tabs API for more information.
Allowed values: |
|
| collaboration_state | string | Filter groups by their collaboration state: - "all": Return both collaborative and non-collaborative groups - "collaborative": Return only collaborative groups (default) - "non_collaborative": Return only non-collaborative groups |
Example Request:
curl https://<canvas>/api/v1/courses/1/groups \
-H 'Authorization: Bearer <token>'
Bulk fetch user tags for multiple users in a course GroupsController#bulk_user_tags
GET /api/v1/courses/:course_id/bulk_user_tags
url:GET|/api/v1/courses/:course_id/bulk_user_tags
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| course_id | integer | The ID of the course context (from the route). | |
| user_ids[] | integer | An array of user IDs to fetch tags for. |
Example Request:
curl "https://<canvas>/api/v1/courses/1/bulk_user_tags?user_ids[]=35&user_ids[]=79" \
-H 'Authorization: Bearer <token>'
Get a single group GroupsController#show
GET /api/v1/groups/:group_id
url:GET|/api/v1/groups/:group_id
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| include[] | string |
- "permissions": Include permissions the current user has
for the group.
- "tabs": Include the list of tabs configured for each group. See the
List available tabs API for more information.
Allowed values: |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id> \
-H 'Authorization: Bearer <token>'
Create a group GroupsController#create
POST /api/v1/groups
url:POST|/api/v1/groups
POST /api/v1/group_categories/:group_category_id/groups
url:POST|/api/v1/group_categories/:group_category_id/groups
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| name | string | The name of the group | |
| description | string | A description of the group | |
| is_public | boolean | whether the group is public (applies only to community groups) | |
| join_level | string |
no description
Allowed values: |
|
| storage_quota_mb | integer | The allowed file storage for the group, in megabytes. This parameter is ignored if the caller does not have the manage_storage_quotas permission. | |
| sis_group_id | string | The sis ID of the group. Must have manage_sis permission to set. |
Example Request:
curl https://<canvas>/api/v1/groups \
-F 'name=Math Teachers' \
-F 'description=A place to gather resources for our classes.' \
-F 'is_public=true' \
-F 'join_level=parent_context_auto_join' \
-H 'Authorization: Bearer <token>'
Edit a group GroupsController#update
PUT /api/v1/groups/:group_id
url:PUT|/api/v1/groups/:group_id
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| name | string | The name of the group | |
| description | string | A description of the group | |
| is_public | boolean | Whether the group is public (applies only to community groups). Currently you cannot set a group back to private once it has been made public. | |
| join_level | string |
no description
Allowed values: |
|
| avatar_id | integer | The id of the attachment previously uploaded to the group that you would like to use as the avatar image for this group. | |
| storage_quota_mb | integer | The allowed file storage for the group, in megabytes. This parameter is ignored if the caller does not have the manage_storage_quotas permission. | |
| members[] | string | An array of user ids for users you would like in the group. Users not in the group will be sent invitations. Existing group members who aren't in the list will be removed from the group. | |
| sis_group_id | string | The sis ID of the group. Must have manage_sis permission to set. | |
| 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 |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id> \
-X PUT \
-F 'name=Algebra Teachers' \
-F 'join_level=parent_context_request' \
-H 'Authorization: Bearer <token>'
Delete a group GroupsController#destroy
DELETE /api/v1/groups/:group_id
url:DELETE|/api/v1/groups/:group_id
Example Request:
curl https://<canvas>/api/v1/groups/<group_id> \
-X DELETE \
-H 'Authorization: Bearer <token>'
Invite others to a group GroupsController#invite
POST /api/v1/groups/:group_id/invite
url:POST|/api/v1/groups/:group_id/invite
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| invitees[] | Required | string | An array of email addresses to be sent invitations. |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/invite \
-F 'invitees[]=leonard@example.com' \
-F 'invitees[]=sheldon@example.com' \
-H 'Authorization: Bearer <token>'
List group's users GroupsController#users
GET /api/v1/groups/:group_id/users
url:GET|/api/v1/groups/:group_id/users
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| search_term | string | The partial name or full ID of the users to match and return in the results list. Must be at least 2 characters. | |
| include[] | string |
"avatar_url": Include users' avatar_urls.
Allowed values: |
|
| exclude_inactive | boolean | Whether to filter out inactive users from the results. Defaults to false unless explicitly provided. |
Example Request:
curl https://<canvas>/api/v1/groups/1/users \
-H 'Authorization: Bearer <token>'
Upload a file GroupsController#create_file
POST /api/v1/groups/:group_id/files
url:POST|/api/v1/groups/:group_id/files
Preview processed html GroupsController#preview_html
POST /api/v1/groups/:group_id/preview_html
url:POST|/api/v1/groups/:group_id/preview_html
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| html | string | The html content to process |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/preview_html \
-F 'html=<p><badhtml></badhtml>processed html</p>' \
-H 'Authorization: Bearer <token>'
Example Response:
{
"html": "<p>processed html</p>"
}
Group activity stream GroupsController#activity_stream
GET /api/v1/groups/:group_id/activity_stream
url:GET|/api/v1/groups/:group_id/activity_stream
Group activity stream summary GroupsController#activity_stream_summary
GET /api/v1/groups/:group_id/activity_stream/summary
url:GET|/api/v1/groups/:group_id/activity_stream/summary
Permissions GroupsController#permissions
GET /api/v1/groups/:group_id/permissions
url:GET|/api/v1/groups/:group_id/permissions
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| permissions[] | string | List of permissions to check against the authenticated user. Permission names are documented in the List assignable permissions endpoint. |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/permissions \
-H 'Authorization: Bearer <token>' \
-d 'permissions[]=read_roster'
-d 'permissions[]=send_messages_all'
Example Response:
{'read_roster': 'true', 'send_messages_all': 'false'}
List group memberships GroupMembershipsController#index
GET /api/v1/groups/:group_id/memberships
url:GET|/api/v1/groups/:group_id/memberships
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| filter_states[] | string |
Only list memberships with the given workflow_states. By default it will
return all memberships.
Allowed values: |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/memberships \
-F 'filter_states[]=invited&filter_states[]=requested' \
-H 'Authorization: Bearer <token>'
Get a single group membership GroupMembershipsController#show
GET /api/v1/groups/:group_id/memberships/:membership_id
url:GET|/api/v1/groups/:group_id/memberships/:membership_id
GET /api/v1/groups/:group_id/users/:user_id
url:GET|/api/v1/groups/:group_id/users/:user_id
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/memberships/<membership_id> \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/groups/<group_id>/users/<user_id> \
-H 'Authorization: Bearer <token>'
Create a membership GroupMembershipsController#create
POST /api/v1/groups/:group_id/memberships
url:POST|/api/v1/groups/:group_id/memberships
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| user_id | string | - The ID of the user for individual membership creation. | |
| members[] | integer | - Bulk add multiple users to a differentiation tag. | |
| all_in_group_course | boolean | - If true, add all enrolled students from the course. | |
| exclude_user_ids[] | integer | - An array of user IDs to exclude when using all_in_group_course. |
Example Request:
(Individual membership creation)
curl https://<canvas>/api/v1/groups/<group_id>/memberships \
-F 'user_id=self' \
-H 'Authorization: Bearer <token>'
(Bulk addition using members array)
curl https://<canvas>/api/v1/groups/<group_id>/memberships \
-F 'members[]=123' \
-F 'members[]=456' \
-H 'Authorization: Bearer <token>'
(Bulk addition using all_in_group_course with exclusions)
curl https://<canvas>/api/v1/groups/<group_id>/memberships \
-F 'all_in_group_course=true' \
-F 'exclude_user_ids[]=123' \
-H 'Authorization: Bearer <token>'
Update a membership GroupMembershipsController#update
PUT /api/v1/groups/:group_id/memberships/:membership_id
url:PUT|/api/v1/groups/:group_id/memberships/:membership_id
PUT /api/v1/groups/:group_id/users/:user_id
url:PUT|/api/v1/groups/:group_id/users/:user_id
Request Parameters:
| Parameter | Type | Description | |
|---|---|---|---|
| workflow_state | string |
Currently, the only allowed value is "accepted"
Allowed values: |
|
| moderator | string | no description |
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/memberships/<membership_id> \
-F 'moderator=true'
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/groups/<group_id>/users/<user_id> \
-F 'moderator=true'
-H 'Authorization: Bearer <token>'
Leave a group GroupMembershipsController#destroy
DELETE /api/v1/groups/:group_id/memberships/:membership_id
url:DELETE|/api/v1/groups/:group_id/memberships/:membership_id
DELETE /api/v1/groups/:group_id/users/:user_id
url:DELETE|/api/v1/groups/:group_id/users/:user_id
Example Request:
curl https://<canvas>/api/v1/groups/<group_id>/memberships/<membership_id> \
-X DELETE \
-H 'Authorization: Bearer <token>'
curl https://<canvas>/api/v1/groups/<group_id>/users/<user_id> \
-X DELETE \
-H 'Authorization: Bearer <token>'
Bulk delete memberships Bulk deletes memberships by providing an array of user IDs. GroupMembershipsController#destroy_bulk
DELETE /api/v1/groups/:group_id/users
url:DELETE|/api/v1/groups/:group_id/users