POST /api/v1/enrollments/{enrollmentId}/pause
Interrupts one participation without erasing anything: history, path and future rights stay in place. You choose what happens to deadlines and to the member's access while the pause lasts, and both choices are made here — not when the enrollment resumes. Reminders for the current action, automatic recalculation of the next action and presence in the work queue stop until then. No other enrollment is affected.
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed |
ADMIN | Allowed |
MEMBER | Conditional — only with a business role below |
| Requirement | Rule for this endpoint |
|---|---|
| Business role | program_director scoped to the organization |
| Resource scope | Enrollment of the organization attached to the API key |
| Participation | Not applicable — an assigned coach cannot pause a participation |
| Resource state | The enrollment must be active |
Interrupting a participation decides someone's access to the product, so it is an operating decision: a coach assigned to the enrollment can document sessions and plan interventions, but cannot pause. A platform-wide role grants nothing here. An enrollment of another organization is refused without revealing whether it exists.
| Parameter | Type | Required | Description |
|---|---|---|---|
enrollmentId | UUID | yes | Enrollment visible from the key's organization |
| Header | Required | Description |
|---|---|---|
x-api-key | yes | API key created for this organization |
Idempotency-Key | yes | Stable key for this pause intention |
X-Correlation-Id | no | Caller correlation id, returned or generated |
| Field | Type | Required | Nullable | Description |
|---|---|---|---|---|
reason | string | yes | no | 1 to 2000 characters; visible to your team and in the enrollment history |
effectiveAt | ISO 8601 string | no | no | When the interruption starts. Defaults to now; a past value is accepted, a future one is refused |
deadlinePolicy | string | yes | no | shift or keep |
accessPolicy | string | yes | no | read_only or suspended |
deadlinePolicy decides what happens when the enrollment resumes:
shift — relative deadlines, the current action, open blockers and planned
interventions all move forward by the length of the pause;keep — nothing moves, and delays accumulate.accessPolicy decides what the member can still do:
read_only — the member can re-read lessons; deliverables, completions and
blockers are refused with a message that names the pause;suspended — the program leaves the member's view until the enrollment
resumes.Both policies refuse the same writes. Only reading differs.
{
"reason": "Sick leave for three weeks.",
"effectiveAt": "2026-08-20T09:00:00.000Z",
"deadlinePolicy": "shift",
"accessPolicy": "read_only"
}curl -X POST "$COHORTE_API_BASE_URL/api/v1/enrollments/ENROLLMENT_ID/pause" \
-H "x-api-key: $COHORTE_API_KEY" \
-H "Idempotency-Key: pause-2026-08-20" \
-H 'Content-Type: application/json' \
-d '{"reason":"Sick leave for three weeks.","deadlinePolicy":"shift","accessPolicy":"read_only"}'201 Created — the participation is paused.200 OK — the same Idempotency-Key replayed the original pause.400 Bad Request — missing Idempotency-Key, invalid JSON, an empty reason, an unknown policy, an effective date in the future, or an enrollment that is not active.401 Unauthorized — the key is missing, invalid, or no longer attached to a member.403 Forbidden — the bearer cannot change the lifecycle of enrollments in this organization.404 Not Found — the enrollment is unknown or belongs to another organization.| Field | Type | Nullable | Description |
|---|---|---|---|
success | boolean | no | true for a successful request |
replayed | boolean | no | true when the idempotency key replayed a pause |
data.id | UUID | no | Pause identifier |
data.enrollmentId | UUID | no | Enrollment that is paused |
data.reason | string | no | Reason given for the pause |
data.effectiveAt | ISO 8601 string | no | When the interruption starts, in UTC |
data.deadlinePolicy | string | no | shift or keep |
data.accessPolicy | string | no | read_only or suspended |
data.pausedBy | UUID | yes | Account that paused the participation, or null when the product paused it automatically |
data.pausedByName | string | yes | Display name of that account, null when there is none |
data.pausedByActorType | string | no | human when a person paused the participation, system when the product did |
data.reactivatedAt | ISO 8601 string | yes | null while the pause is open |
data.reactivatedBy | UUID | yes | null while the pause is open |
data.reactivatedByName | string | yes | null while the pause is open |
data.shiftDays | integer | no | 0 until the enrollment resumes |
data.resumeNote | string | yes | null until the enrollment resumes |
data.createdAt | ISO 8601 string | no | When the pause was recorded, in UTC |
correlationId | UUID | no | Correlation id for support |
{
"success": true,
"replayed": false,
"data": {
"id": "9f2c0a1e-0000-4000-8000-000000000000",
"enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
"reason": "Sick leave for three weeks.",
"effectiveAt": "2026-08-20T09:00:00.000Z",
"deadlinePolicy": "shift",
"accessPolicy": "read_only",
"pausedBy": "6d41ab55-0000-4000-8000-000000000000",
"pausedByName": "Paul Vidal",
"pausedByActorType": "human",
"reactivatedAt": null,
"reactivatedBy": null,
"reactivatedByName": null,
"shiftDays": 0,
"resumeNote": null,
"createdAt": "2026-08-20T09:00:05.000Z"
},
"correlationId": "0f6b1d92-0000-4000-8000-000000000000"
}active — only an active participation can be
paused.Idempotency-Key returns the original pause and opens
no second period, audit entry or event.effectiveAt — not the recording time — is what dates the pause and what the
shift is counted from. Backdating an interruption that already started is the
normal case.enrollment.paused event are written in one
transaction, together with the cancellation of the current action's reminder.