Cohort schedules, membership, tutors and discussion.
List a content's cohorts
GET/contents/{id}/cohorts
Every cohort on the content, with its tutor, roster, and (for dated cohorts) schedule.
Responses
200List a content's cohorts.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/contents/{id}/cohorts \
--header 'Authorization: Bearer cr_live_…'
{
"data": [
{
"endsAt": "2026-01-31T12:00:00.000Z",
"enrollClosesAt": "2026-01-31T12:00:00.000Z",
"id": "string",
"members": [
{
"email": "learner@example.com",
"image": "string",
"name": "string",
"role": "member",
"userId": "string"
}
],
"mode": "open",
"name": "string",
"offerId": "string",
"seatLimit": 0,
"startsAt": "2026-01-31T12:00:00.000Z",
"tutorName": "string",
"tutorUserId": "string"
}
]
}
Create a cohort
POST/contents/{id}/cohorts
On a cohort-delivered offer the cohort requires startsAt and endsAt. A tutor must hold the cohort role on the course's team (or be its owner) or be an enrolled learner.
Request body
namestringrequired
Cohort name, up to 80 characters.
endsAtdate-time
Cohort end. Required for cohort-delivered offers.
enrollClosesAtdate-time
Optional enrollment cutoff before endsAt.
modeenum
open = learners self-join; closed = staff assigns. Defaults to open.
openclosed
offerIdstring
Owning offer. Omit to use the course's primary offer.
seatLimitinteger | null
Seat cap for this cohort. Null or omitted = unlimited.
startsAtdate-time
Cohort start. Required for cohort-delivered offers; drip anchors here.
tutorUserIdstring | null
The cohort's tutor (Cursare user id). Null or omitted = no tutor.
Responses
201Create a cohort.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/contents/{id}/cohorts \
--request POST \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"name": "string",
"endsAt": "2026-01-31T12:00:00.000Z",
"enrollClosesAt": "2026-01-31T12:00:00.000Z",
"mode": "open",
"offerId": "string",
"seatLimit": 0,
"startsAt": "2026-01-31T12:00:00.000Z",
"tutorUserId": "string"
}'
{
"data": {
"id": "string",
"mode": "open",
"name": "string",
"offerId": "string",
"tutorUserId": "string"
}
}
Update a cohort
PATCH/cohorts/{id}
Rename, switch open/closed, (re)assign the tutor, or adjust the schedule/seat cap. Only the fields present in the body are changed; null clears a nullable field. A cohort on a cohort-delivered offer cannot have its start or end cleared.
Request body
enrollClosesAtdate-time | null
Null falls back to closing enrollment at endsAt.
seatLimitinteger | null
Null = unlimited.
tutorUserIdstring | null
The cohort's tutor (Cursare user id). Null removes the tutor.
Responses
200Update a cohort.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id} \
--request PATCH \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"endsAt": "2026-01-31T12:00:00.000Z",
"enrollClosesAt": "2026-01-31T12:00:00.000Z",
"mode": "open",
"name": "string",
"seatLimit": 0,
"startsAt": "2026-01-31T12:00:00.000Z",
"tutorUserId": "string"
}'
{
"data": {
"id": "string",
"updated": true
}
}
Delete a cohort
DELETE/cohorts/{id}
Removes an empty cohort and its discussion. A cohort referenced by a learner or pending request is refused (400) — move them first.
Responses
200Delete a cohort.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id} \
--request DELETE \
--header 'Authorization: Bearer cr_live_…'
{
"data": {
"deleted": true,
"id": "string"
}
}
Add or move a learner into a cohort
POST/cohorts/{id}/members
The user must have an active enrollment in the cohort's exact offer. The enrollment stores at most one cohort — assigning another replaces it.
Request body
userIdstringrequired
The Cursare user id of an enrolled learner.
Responses
201Add or move a learner into a cohort.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id}/members \
--request POST \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"userId": "string"
}'
{
"data": {
"assigned": true,
"cohortId": "string",
"userId": "string"
}
}
Remove a learner from a cohort
DELETE/cohorts/{id}/members/{userId}
Clears the cohort from a self-paced learner. Cohort-delivery learners must be moved instead.
Path parameters
userIdstring
The Cursare user id.
Responses
200Remove a learner from a cohort.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id}/members/{userId} \
--request DELETE \
--header 'Authorization: Bearer cr_live_…'
{
"data": {
"cohortId": "string",
"removed": true,
"userId": "string"
}
}
Set a member's Star badge
PATCH/cohorts/{id}/members/{userId}
Promote a member to star (peer recognition — a badge, never moderation power) or demote them back to member.
Path parameters
userIdstring
The Cursare user id.
Request body
roleenumrequired
memberstar
Responses
200Set a member's Star badge.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id}/members/{userId} \
--request PATCH \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"role": "member"
}'
{
"data": {
"cohortId": "string",
"role": "member",
"userId": "string"
}
}
List a cohort's discussion
GET/cohorts/{id}/discussion
The cohort's discussion threads — top-level posts (pinned first, then newest) with their replies. Read-only: posts are authored by enrolled members on the course page.
Responses
200List a cohort's discussion.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id}/discussion \
--header 'Authorization: Bearer cr_live_…'
{
"data": [
{
"authorImage": "string",
"authorName": "string",
"badge": "instructor",
"body": "string",
"createdAt": "2026-01-31T12:00:00.000Z",
"id": "string",
"pinnedAt": "2026-01-31T12:00:00.000Z",
"replies": [
{
"authorImage": "string",
"authorName": "string",
"badge": "instructor",
"body": "string",
"createdAt": "2026-01-31T12:00:00.000Z",
"id": "string",
"userId": "string"
}
],
"resolvedAt": "2026-01-31T12:00:00.000Z",
"sectionId": "string",
"userId": "string"
}
]
}
Post to a cohort's discussion
POST/cohorts/{id}/discussion
Create a top-level post, or a reply (set parentId). Posted AS a specified author (authorEmail) who must be an org staff member or this cohort's tutor — the API never posts as a plain learner, so it can't forge a member's post. Fires discussion.post.created.
Request body
authorEmailemailrequired
The author — must be an org staff member or this cohort's tutor.
bodystringrequired
The post text.
parentIdstring
Set to reply to a top-level post; omit for a new top-level post.
sectionIdstring
Tag a top-level post to a course section (ignored on replies).
Responses
201Post to a cohort's discussion.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/cohorts/{id}/discussion \
--request POST \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"authorEmail": "learner@example.com",
"body": "string",
"parentId": "string",
"sectionId": "string"
}'
{
"data": {
"id": "string"
}
}
Resolve or reopen a question
POST/discussion/{postId}/resolve
Mark a top-level question answered, or reopen it. Staff or the cohort tutor.
Path parameters
postIdstring
The post id (a top-level question).
Request body
resolvedbooleanrequired
true marks it answered; false reopens it.
Responses
200Resolve or reopen a question.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/discussion/{postId}/resolve \
--request POST \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"resolved": true
}'
{
"data": {
"resolved": true
}
}
Pin or unpin a post
POST/discussion/{postId}/pin
Pin a top-level post to the top of the discussion, or unpin it. Staff or the cohort tutor.
Path parameters
postIdstring
The post id (top-level).
Request body
pinnedbooleanrequired
true pins it; false unpins it.
Responses
200Pin or unpin a post.
400Validation failed or the request body is malformed.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/discussion/{postId}/pin \
--request POST \
--header 'Authorization: Bearer cr_live_…' \
--header 'Content-Type: application/json' \
--data '{
"pinned": true
}'
{
"data": {
"pinned": true
}
}
Delete a post
DELETE/discussion/{postId}
Delete a post. Deleting a top-level post also removes its replies. The author, the cohort tutor, or staff.
Responses
200Delete a post.
401Missing, invalid or revoked API key.
403The key's organization does not own this resource.
404The resource does not exist (or belongs to another org).
429Rate limit exceeded (240 reads/min, 60 writes/min per key).
500Unexpected server error.
curl https://api.cursare.com/v1/discussion/{postId} \
--request DELETE \
--header 'Authorization: Bearer cr_live_…'
{
"data": {
"deleted": true
}
}