Remove students from a group, without rewriting its membership. This endpoint never adds anyone. The identifiers travel in the request body, so they never appear in access logs.
Moving a section. Add the students to the new group with POST /v3/groups/{id}/students first, then remove them here: a student is never left without a group if one of the calls fails.
Up to 100 students per call. Send studentIds or studentExternalReferenceIds, never both, with 1 to 100 identifiers. The limit counts the identifiers sent, duplicates included; a student listed twice is processed once, so removedCount can be lower than the number of identifiers sent. To replace a whole membership use PUT /v3/groups/{id}/students.
Not idempotent, by design. Removing a student who is not a member of the group is rejected with STUDENT_NOT_IN_GROUP, and one such student refuses the whole list: nobody is removed, and the error names every non-member. Your view of the membership and ours disagree, and that deserves an error rather than a silent success. A successful removal therefore fails if you replay it — treat that code as benign if your events can be delivered more than once.
Who keeps their place on a course anyway, when cascadeToCourses is true: a student who also reaches that course through another group they still belong to. That is the only case, which is why coursesUpdatedCount can be lower than the number of upcoming courses of the group. A declared absence or an existing signature does not keep a student on the attendance; the absence itself is kept, and is applied again automatically if the student is added back to the group.
With cascadeToCourses=false nobody is taken off anything: only the group membership changes, and every student keeps their place on every course.
All or nothing. An unknown or archived student fails the whole call and writes nothing; the error names every one of them.
Rate limit: standard. Concurrency: two identical calls sent at the same moment share a single execution; a call replayed after the response has come back runs again in full.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||

