GET /api/v1/video-resources
Lists the video library, most recently published first. A member key reads
published resources only, whatever status it asks for; the school team
can ask for unpublished ones.
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed — published or unpublished |
ADMIN | Allowed — published or unpublished |
MEMBER | Allowed — published only; an assigned coach also reads unpublished |
| Requirement | Rule for this endpoint |
|---|---|
| Business role | coach (any scope) reads unpublished resources |
| Resource scope | Organization from the API key |
| Participation | None — enrolled or not |
| Resource state | published for members |
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | no | Searched in titles and descriptions, up to 200 characters |
tag | string | no | One exact tag |
kind | string | no | video_answer or replay_other |
programId | UUID | no | Resources of one program |
status | string | no | published (default) or unpublished — ignored for members |
page | integer | no | From 1, default 1 |
limit | integer | no | 1 to 100, default 24 |
curl "$COHORTE_API_BASE_URL/api/v1/video-resources?tag=Architecture&limit=12" \
-H "x-api-key: $COHORTE_API_KEY"200 OK — one page of resources.400 Bad Request — a query parameter is invalid.401 Unauthorized — missing, unknown or expired key.403 Forbidden — the bearer is not a member of the school.| Field | Type | Nullable | Description |
|---|---|---|---|
success | boolean | no | true |
data[].id | UUID | no | Resource identifier |
data[].programId | UUID | no | Program of the resource |
data[].programName | string | no | Name of that program |
data[].kind | string | no | video_answer or replay_other |
data[].category | string | yes | replay or video for a replay_other; null for a video_answer and for resources published before categories existed (shown as a video) |
data[].title | string | no | Up to 200 characters |
data[].description | string | yes | Markdown, up to 10000 characters |
data[].tags | string[] | no | Up to 10 tags |
data[].status | string | no | published or unpublished |
data[].thumbnailMediaId | UUID | yes | Chosen image of the media library |
data[].thumbnailUrl | string | yes | Chosen image, otherwise the first video's image |
data[].videoCount | integer | no | Number of videos |
data[].authorName | string | yes | Name of the publisher |
data[].createdBy | UUID | no | Account of the publisher |
data[].publishedAt | ISO 8601 string | yes | Last publication, UTC |
data[].unpublishedAt | ISO 8601 string | yes | Last unpublication, UTC |
data[].createdAt | ISO 8601 string | no | Creation, UTC |
data[].updatedAt | ISO 8601 string | no | Last change, UTC |
pagination.total | integer | no | Resources matching the filters |
pagination.page | integer | no | Current page |
pagination.limit | integer | no | Page size |
pagination.totalPages | integer | no | Number of pages |
{
"success": true,
"data": [
{
"id": "6f2b1c3d-4e5f-4a6b-8c7d-9e0f1a2b3c4d",
"programId": "3a1f7c2e-5b6d-4e8f-9a0b-1c2d3e4f5a6b",
"programName": "Agentic AI Developer",
"kind": "video_answer",
"category": null,
"title": "How to structure a service layer",
"description": null,
"tags": ["Architecture"],
"status": "published",
"thumbnailMediaId": null,
"thumbnailUrl": null,
"videoCount": 2,
"authorName": "Mike",
"createdBy": "0b1c2d3e-4f5a-4b6c-8d7e-9f0a1b2c3d4e",
"publishedAt": "2026-10-18T10:00:00.000Z",
"unpublishedAt": null,
"createdAt": "2026-10-18T10:00:00.000Z",
"updatedAt": "2026-10-18T10:00:00.000Z"
}
],
"pagination": {"total": 1, "page": 1, "limit": 12, "totalPages": 1},
"correlationId": "c0ffee00-1111-4222-8333-444455556666"
}