GET /api/v1/enrollments/{enrollmentId}/deadline-extensions
Returns every deadline extension ever granted on one enrollment: the active ones first, then the cancelled and replaced ones, most recent first. Nothing is ever removed from this history.
| 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, or coach assigned to this enrollment |
| Resource scope | Enrollment of the organization attached to the API key |
| Participation | An assigned coach reads the history of their own enrollments only |
| Resource state | None — closed enrollments keep their history |
Reading the history takes the same authorization as granting an extension. A
bearer who cannot extend deadlines on this enrollment receives 404, exactly
like an unknown enrollment.
| 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 |
X-Correlation-Id | no | Caller correlation id, returned or generated |
curl "$COHORTE_API_BASE_URL/api/v1/enrollments/$ENROLLMENT_ID/deadline-extensions" \
-H "x-api-key: $COHORTE_API_KEY"200 OK — the history, possibly empty.401 Unauthorized — the key is missing, invalid, or no longer attached to a member; code is unauthorized.404 Not Found — the enrollment is unknown, belongs to another organization, or the bearer cannot read its deadlines. The three are deliberately not distinguished.| Field | Type | Nullable | Description |
|---|---|---|---|
success | boolean | no | true for a successful request |
data[].id | UUID | no | Extension identifier |
data[].enrollmentId | UUID | no | Enrollment the exception belongs to |
data[].memberTaskId | UUID | no | Program action whose deadline moved |
data[].memberTaskTitle | string | yes | Title of that action |
data[].dueAt | ISO 8601 string | no | Deadline granted to this member, in UTC |
data[].reason | string | no | Reason given, for your team |
data[].createdBy | UUID | no | Account that granted the extension |
data[].createdByName | string | yes | Display name of that account |
data[].createdAt | ISO 8601 string | no | When the extension was recorded, in UTC |
data[].revokedAt | ISO 8601 string | yes | When it was cancelled or replaced; null while it applies |
data[].revokedBy | UUID | yes | Account that cancelled it |
data[].revokedByName | string | yes | Display name of that account |
data[].revokeReason | string | yes | replaced when a newer extension took over, otherwise null |
data[].active | boolean | no | true while this extension is the one that applies |
correlationId | UUID | no | Correlation id for support |
{
"success": true,
"data": [
{
"id": "8e2a4b71-0000-4000-8000-000000000000",
"enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
"memberTaskId": "3b0e51a4-0000-4000-8000-000000000000",
"memberTaskTitle": "Record ten discovery calls",
"dueAt": "2026-09-27T18:00:00.000Z",
"reason": "Second extension after the resumption call.",
"createdBy": "6d41ab55-0000-4000-8000-000000000000",
"createdByName": "Ines Fabre",
"createdAt": "2026-09-12T09:30:00.000Z",
"revokedAt": null,
"revokedBy": null,
"revokedByName": null,
"revokeReason": null,
"active": true
},
{
"id": "7c1d9a20-0000-4000-8000-000000000000",
"enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
"memberTaskId": "3b0e51a4-0000-4000-8000-000000000000",
"memberTaskTitle": "Record ten discovery calls",
"dueAt": "2026-09-20T18:00:00.000Z",
"reason": "Short hospital stay, resumption agreed.",
"createdBy": "6d41ab55-0000-4000-8000-000000000000",
"createdByName": "Ines Fabre",
"createdAt": "2026-09-05T10:00:00.000Z",
"revokedAt": "2026-09-12T09:30:00.000Z",
"revokedBy": "6d41ab55-0000-4000-8000-000000000000",
"revokedByName": "Ines Fabre",
"revokeReason": "replaced",
"active": false
}
],
"correlationId": "0f6b1d92-0000-4000-8000-000000000000"
}memberTaskId to
follow one action.revokeReason is null on an extension cancelled explicitly, and replaced
when a newer extension on the same action took over.