Skip to content
cursareDocs
Sign inGet started
Documentation
  • Overview
  • Index2
  • Organization17
  • Sales6
  • Insights8
  • Reports and safety7
  • Minor accounts8
  • Minor safety3
  • Offers11
  • Media1
  • Contents10
  • Learner delivery1
  • Learner runtime5
  • Learners12
  • Cohorts12
  • Intake forms5
  • Campaigns4
  • Teams8
  • Affiliates7
  • Links7
  • Reviews1
  • Integrations26
  • MCP2
  • Webhooks6

Cohorts

Cohort schedules, membership, tutors and discussion.

12 endpoints

List a content's cohorts

GET/contents/{id}/cohorts

Every cohort on the content, with its tutor, roster, and (for dated cohorts) schedule.

Path parameters

idstring

The content id.

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.

Path parameters

idstring

The content id.

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.

Path parameters

idstring

The cohort id.

Request body

endsAtdate-time | null
enrollClosesAtdate-time | null

Null falls back to closing enrollment at endsAt.

modeenum

openclosed

namestring
seatLimitinteger | null

Null = unlimited.

startsAtdate-time | null
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.

Path parameters

idstring

The cohort id.

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.

Path parameters

idstring

The cohort id.

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

idstring

The cohort id.

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

idstring

The cohort id.

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.

Path parameters

idstring

The cohort id.

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.

Path parameters

idstring

The cohort id.

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.

Path parameters

postIdstring

The post id.

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
  }
}

Your privacy choices

The technical Tag Manager container is required to apply your choices. Analytics and marketing cookies and storage remain optional and stay off until you authorize them. Privacy Policy.

Sign-in, security, core functions and consent enforcement.

Audience measurement such as Google Analytics.

Marketing storage, campaign attribution and optional tags.