GET /api/v1/lessons/{lessonId}
Returns one lesson and its resources, in rank order.
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed |
ADMIN | Allowed |
MEMBER | Conditional — with the program_director business role scoped to the organization, or as coach of the lesson's program |
| Parameter | Type | Required | Description |
|---|---|---|---|
lessonId | UUID | yes | Lesson visible from the key's school |
| Header | Required | Description |
|---|---|---|
x-api-key | yes | API key created for this school |
X-Correlation-Id | no | Caller correlation id, returned or generated |
curl "$COHORTE_API_BASE_URL/api/v1/lessons/$LESSON_ID" \
-H "x-api-key: $COHORTE_API_KEY"200 OK — the lesson and its resources.400 Bad Request — lessonId is not a UUID.401 Unauthorized — the key is missing, invalid, or no longer attached to a member.403 Forbidden — the bearer is not OWNER, ADMIN, an organization-scoped program_director of this school, nor the coach of this program.404 Not Found — the lesson is unknown or belongs to another school.The content is the complete Markdown, including any ## Pour ton agent
section (learner reads strip it — see
Get my lesson's agent section).
The lesson fields of
List the lessons of a program, plus:
| Field | Type | Nullable | Description |
|---|---|---|---|
data.resources[].id | UUID | no | Resource identifier |
data.resources[].resourceType | string | no | link or file |
data.resources[].title | string | no | Resource title |
data.resources[].url | string | yes | Address, for a link |
data.resources[].storagePath | string | yes | Stored path, for a file |
data.resources[].mimeType | string | yes | MIME type of the stored file |
data.resources[].sizeBytes | integer | yes | Size of the stored file |
data.resources[].position | integer | no | Rank in the lesson, starting at 1 |
data.resources[].createdAt | ISO 8601 string | no | Creation time, in UTC |
{
"success": true,
"data": {
"id": "5d9f3a60-1c2b-4e7d-8f4a-6b7c8d9e0f1a",
"programId": "9f2c0a1e-4b7d-4c1a-9e3f-2a6b8c0d1e2f",
"courseId": "3b8e2d41-7a6c-4f1e-8b25-9c0d1e2f3a4b",
"sectionId": "c41e7b03-9d2a-4e6f-b1c8-5a6b7c8d9e0f",
"title": "Structure a discovery call",
"content": "## Why it matters\n\nA discovery call decides the rest of the sale.",
"videoUrl": "https://vimeo.com/912440188",
"status": "published",
"position": 1,
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-04T17:12:00.000Z",
"resources": [
{
"id": "a2f4c681-3e5b-4d7c-9e18-8d9e0f1a2b3c",
"resourceType": "link",
"title": "Call grid",
"url": "https://example.com/grid",
"storagePath": null,
"mimeType": null,
"sizeBytes": null,
"position": 1,
"createdAt": "2026-09-04T17:12:00.000Z"
},
{
"id": "b9d1e243-7f6a-4c8b-a3d9-9e0f1a2b3c4d",
"resourceType": "file",
"title": "Call grid (PDF)",
"url": "https://files.example.com/lessons/5d9f3a60-1c2b-4e7d-8f4a-6b7c8d9e0f1a/resource/48213-call-grid.pdf",
"storagePath": "lessons/5d9f3a60-1c2b-4e7d-8f4a-6b7c8d9e0f1a/resource/48213-call-grid.pdf",
"mimeType": "application/pdf",
"sizeBytes": 184220,
"position": 2,
"createdAt": "2026-09-04T17:12:00.000Z"
}
]
},
"correlationId": "0f6b1d92-5c3e-4a8b-9d71-3e2f4a6b8c10"
}