GET /api/v1/me/enrollments/{enrollmentId}/learning-context
Answers "where am I?" for one of your enrollments: the lesson to resume, the
three progress dimensions, each step with its access verdict, and your tasks with
due dates and the feedback already published to you. Nothing is computed into a
percentage and nothing is invented: an unmeasured dimension says measured: false.
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed — reads the key holder's own learning only |
ADMIN | Allowed — reads the key holder's own learning only |
MEMBER | Allowed — reads the key holder's own learning only |
| Requirement | Rule for this endpoint |
|---|---|
| Business role | None |
| Resource scope | One enrollment of the key holder, in the key's organization |
| Participation | The enrollment must be yours |
| Resource state | A suspended enrollment returns null sections, as in Cohorte |
| Parameter | Type | Required | Description |
|---|---|---|---|
enrollmentId | UUID | yes | One of your enrollments |
curl "$COHORTE_API_BASE_URL/api/v1/me/enrollments/$ENROLLMENT_ID/learning-context" \
-H "x-api-key: $COHORTE_API_KEY"200 OK — the learning context.400 Bad Request — enrollmentId is not a UUID.401 Unauthorized — missing, unknown or expired key.404 Not Found — not one of your enrollments, or another school's.| Field | Type | Nullable | Description |
|---|---|---|---|
data.enrollment | object | no | Same shape as List my enrollments |
data.resume | object | yes | {lessonId, title, eyebrow, updatedAt, cohorteUrl} of the lesson to resume |
data.progress | object | yes | learning, execution, outcome: {measured: false} or {measured: true, completed, total, asOf}; plus completedLessonIds |
data.steps[] | array | yes | {id, position, title, lessonIds, access}; access.state is unlocked or locked with a reason |
data.tasks[] | array | yes | {id, stepId, title, instructions, requirement, dueAt, completedAt, deliverable, submission} |
data.tasks[].submission.feedback | object | yes | Only a decided review: {decision, feedback, expectedCorrections, reviewerName, decidedAt} |
{
"success": true,
"data": {
"enrollment": {"id": "6a1c2b3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d", "programName": "Agentic AI Developer", "status": "active"},
"resume": {
"lessonId": "0f1e2d3c-4b5a-4968-8778-695a4b3c2d1e",
"title": "Tool calling",
"eyebrow": "Agentic AI Developer · Week 3",
"updatedAt": "2026-10-04T18:12:00.000Z",
"cohorteUrl": "https://your-school.cohorte.app/school/your-school/learn/6a1c2b3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d/lessons/0f1e2d3c-4b5a-4968-8778-695a4b3c2d1e"
},
"progress": {
"learning": {"measured": true, "completed": 9, "total": 36, "asOf": "2026-10-05T08:00:00.000Z"},
"execution": {"measured": false},
"outcome": {"measured": false},
"completedLessonIds": ["…"]
},
"steps": [{"id": "…", "position": 1, "title": "Week 1", "lessonIds": ["…"], "access": {"state": "unlocked"}}],
"tasks": [{"id": "…", "title": "Ship your first agent", "requirement": "required", "dueAt": "2026-10-10T22:00:00.000Z", "completedAt": null, "deliverable": null, "submission": null}]
},
"correlationId": "c0ffee00-1111-4222-8333-444455556666"
}stepAccess follows the current primary composition for every enrollment. Removed or archived steps and their tasks disappear from current projections; tasks without a milestone remain. The published lesson catalogue stays program-wide. Completion, submissions and validations remain personal and are never deleted when content is removed. Dates, prerequisites and permissions still apply. A missing primary has no current steps; an empty primary does not fall back to an older version.