Расписание курса
Окна доступа по датам для курса, модулей и уроков — с дефолтным расписанием и переопределением на группу.
- GET
/api/v1/t/courses/:id/scheduleОкно расписания курса - PUT
/api/v1/t/courses/:id/scheduleЗадать окно расписания курса - DELETE
/api/v1/t/courses/:id/scheduleУбрать окно расписания курса - GET
/api/v1/t/courses/:id/schedule-treeВся дефолтная сетка курса - GET
/api/v1/t/modules/:id/scheduleОкно расписания модуля - PUT
/api/v1/t/modules/:id/scheduleЗадать окно расписания модуля - DELETE
/api/v1/t/modules/:id/scheduleУбрать окно расписания модуля - GET
/api/v1/t/lessons/:id/scheduleОкно расписания урока - PUT
/api/v1/t/lessons/:id/scheduleЗадать окно расписания урока - DELETE
/api/v1/t/lessons/:id/scheduleУбрать окно расписания урока - GET
/api/v1/t/groups/:id/course-scheduleСетка расписания группы для курса - PUT
/api/v1/t/groups/:id/course-scheduleЗадать окно в сетке группы - DELETE
/api/v1/t/groups/:id/course-scheduleУбрать окно из сетки группы
/api/v1/t/courses/:id/scheduleОкно расписания курса
Возвращает окно дат уровня курса в дефолтной сетке (group_id = null) или null, если оно не задано. Ответ — { window }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор курса. |
Пример запроса
curl https://api.edumentor.kz/api/v1/t/courses/c1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "window": {
"id": "sw1a2b3c-...",
"course_id": "c1a2b3c4-...",
"group_id": null,
"level": "course",
"module_id": null,
"lesson_id": null,
"starts_at": "2026-07-01T09:00:00Z",
"ends_at": "2026-07-31T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false,
"created_at": "2026-06-26T10:00:00Z",
"updated_at": "2026-06-26T10:00:00Z"
} }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid_id_format | id не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс не найден. |
/api/v1/t/courses/:id/scheduleЗадать окно расписания курса
Создаёт или обновляет окно дат уровня курса (дефолтная сетка). Идемпотентно по узлу: повторный PUT перезаписывает текущее окно. Ответ — { window } с сохранённой записью.
Все datetime — абсолютные моменты (UTC). По умолчанию контент недоступен вне окна. Задание будущей даты начала на опубликованном курсе закроет доступ студентам, которые уже его проходят (у границы начала нет послаблений).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор курса. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
starts_atопц. | string|null | Дата/время начала окна (ISO8601, абсолютный момент UTC) или null. Должно быть задано хотя бы одно из starts_at/ends_at.Пример: 2026-07-01T09:00:00Z |
ends_atопц. | string|null | Дата/время окончания окна (ISO8601) или null. Если заданы обе границы — starts_at ≤ ends_at.Пример: 2026-07-31T23:59:00Z |
allow_before_startопц. | boolean | Разрешить доступ ДО даты начала. По умолчанию false (до начала контент закрыт).Пример: false |
allow_after_endопц. | boolean | Разрешить доступ ПОСЛЕ даты окончания. По умолчанию false (после окончания контент закрыт, с поправкой на правило «первой попытки» для тестов/заданий).Пример: false |
Пример запроса
curl -X PUT https://api.edumentor.kz/api/v1/t/courses/c1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme" \
-H "Content-Type: application/json" \
-d '{
"starts_at": "2026-07-01T09:00:00Z",
"ends_at": "2026-07-31T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false
}'Пример ответа
{
"success": true,
"data": { "window": {
"id": "sw1a2b3c-...",
"course_id": "c1a2b3c4-...",
"group_id": null,
"level": "course",
"module_id": null,
"lesson_id": null,
"starts_at": "2026-07-01T09:00:00Z",
"ends_at": "2026-07-31T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false,
"created_at": "2026-06-26T10:00:00Z",
"updated_at": "2026-06-26T10:00:00Z"
} }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | schedule_window_no_bounds | Не указано ни starts_at, ни ends_at — окно должно ограничивать хотя бы одну сторону. |
| 400 | schedule_window_inverted | starts_at позже ends_at. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс/модуль/урок/группа не найдены в этой школе. |
/api/v1/t/courses/:id/scheduleУбрать окно расписания курса
Мягко удаляет окно уровня курса (дефолтная сетка). Идемпотентно. Ответ — { cleared: true }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор курса. |
Пример запроса
curl -X DELETE https://api.edumentor.kz/api/v1/t/courses/c1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "cleared": true }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_window_not_found | Окно не задано. |
/api/v1/t/courses/:id/schedule-treeВся дефолтная сетка курса
Возвращает все окна дефолтной сетки курса (уровни курс + модули + уроки, group_id = null) одним запросом — для построения дерева расписания в админке. Ответ — { course_id, group_id, windows }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор курса. |
Пример запроса
curl https://api.edumentor.kz/api/v1/t/courses/c1a2b3c4-.../schedule-tree \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": {
"course_id": "c1a2b3c4-...",
"group_id": null,
"windows": [
{
"id": "sw1a2b3c-...",
"course_id": "c1a2b3c4-...",
"group_id": null,
"level": "course",
"module_id": null,
"lesson_id": null,
"starts_at": "2026-07-01T09:00:00Z",
"ends_at": null,
"allow_before_start": false,
"allow_after_end": false,
"created_at": "2026-06-26T10:00:00Z",
"updated_at": "2026-06-26T10:00:00Z"
},
{
"id": "sw2b3c4d-...",
"course_id": "c1a2b3c4-...",
"group_id": null,
"level": "module",
"module_id": "m1a2b3c4-...",
"lesson_id": null,
"starts_at": null,
"ends_at": "2026-07-15T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false,
"created_at": "2026-06-26T10:00:00Z",
"updated_at": "2026-06-26T10:00:00Z"
}
]
}
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid_id_format | id не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс не найден. |
/api/v1/t/modules/:id/scheduleОкно расписания модуля
Возвращает окно дат уровня модуля в дефолтной сетке или null. Ответ — { window }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор модуля. |
Пример запроса
curl https://api.edumentor.kz/api/v1/t/modules/m1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "window": null }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid_id_format | id не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Модуль не найден. |
/api/v1/t/modules/:id/scheduleЗадать окно расписания модуля
Создаёт или обновляет окно дат уровня модуля (дефолтная сетка). Доступность вложена: модуль закрыт, если закрыт его курс ИЛИ собственное окно модуля.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор модуля. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
starts_atопц. | string|null | Дата/время начала окна (ISO8601, абсолютный момент UTC) или null. Должно быть задано хотя бы одно из starts_at/ends_at.Пример: 2026-07-01T09:00:00Z |
ends_atопц. | string|null | Дата/время окончания окна (ISO8601) или null. Если заданы обе границы — starts_at ≤ ends_at.Пример: 2026-07-31T23:59:00Z |
allow_before_startопц. | boolean | Разрешить доступ ДО даты начала. По умолчанию false (до начала контент закрыт).Пример: false |
allow_after_endопц. | boolean | Разрешить доступ ПОСЛЕ даты окончания. По умолчанию false (после окончания контент закрыт, с поправкой на правило «первой попытки» для тестов/заданий).Пример: false |
Пример запроса
curl -X PUT https://api.edumentor.kz/api/v1/t/modules/m1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme" \
-H "Content-Type: application/json" \
-d '{ "ends_at": "2026-07-15T23:59:00Z", "allow_after_end": false }'Пример ответа
{
"success": true,
"data": { "window": { "id": "sw2b3c4d-...", "level": "module", "module_id": "m1a2b3c4-...", "ends_at": "2026-07-15T23:59:00Z", "starts_at": null, "allow_before_start": false, "allow_after_end": false } }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | schedule_window_no_bounds | Не указано ни starts_at, ни ends_at — окно должно ограничивать хотя бы одну сторону. |
| 400 | schedule_window_inverted | starts_at позже ends_at. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс/модуль/урок/группа не найдены в этой школе. |
/api/v1/t/modules/:id/scheduleУбрать окно расписания модуля
Мягко удаляет окно уровня модуля. Каскадно убирает окна уроков этого модуля в той же сетке (окно урока не может пережить окно своего модуля). Ответ — { cleared: true }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор модуля. |
Пример запроса
curl -X DELETE https://api.edumentor.kz/api/v1/t/modules/m1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "cleared": true }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_window_not_found | Окно не задано. |
/api/v1/t/lessons/:id/scheduleОкно расписания урока
Возвращает окно дат уровня урока в дефолтной сетке или null. Ответ — { window }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор урока. |
Пример запроса
curl https://api.edumentor.kz/api/v1/t/lessons/l1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "window": null }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid_id_format | id не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Урок не найден. |
/api/v1/t/lessons/:id/scheduleЗадать окно расписания урока
Создаёт или обновляет окно дат уровня урока (дефолтная сетка). Окно урока можно задать ТОЛЬКО если у его модуля уже задано окно в той же сетке — иначе 409 module_schedule_required.
Если у урока есть тест / задание / пробное ЕНТ, ограничение по дате окончания действует только на ПЕРВУЮ попытку: студент, начавший/сдавший попытку до дедлайна, может перепройти тест или перезагрузить отклонённое задание и после дедлайна. Граница начала всегда закрывает доступ без послаблений.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор урока. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
starts_atопц. | string|null | Дата/время начала окна (ISO8601, абсолютный момент UTC) или null. Должно быть задано хотя бы одно из starts_at/ends_at.Пример: 2026-07-01T09:00:00Z |
ends_atопц. | string|null | Дата/время окончания окна (ISO8601) или null. Если заданы обе границы — starts_at ≤ ends_at.Пример: 2026-07-31T23:59:00Z |
allow_before_startопц. | boolean | Разрешить доступ ДО даты начала. По умолчанию false (до начала контент закрыт).Пример: false |
allow_after_endопц. | boolean | Разрешить доступ ПОСЛЕ даты окончания. По умолчанию false (после окончания контент закрыт, с поправкой на правило «первой попытки» для тестов/заданий).Пример: false |
Пример запроса
curl -X PUT https://api.edumentor.kz/api/v1/t/lessons/l1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme" \
-H "Content-Type: application/json" \
-d '{ "starts_at": "2026-07-03T00:00:00Z", "ends_at": "2026-07-05T23:59:00Z" }'Пример ответа
{
"success": true,
"data": { "window": { "id": "sw3c4d5e-...", "level": "lesson", "module_id": "m1a2b3c4-...", "lesson_id": "l1a2b3c4-...", "starts_at": "2026-07-03T00:00:00Z", "ends_at": "2026-07-05T23:59:00Z", "allow_before_start": false, "allow_after_end": false } }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | schedule_window_no_bounds | Не указано ни starts_at, ни ends_at — окно должно ограничивать хотя бы одну сторону. |
| 400 | schedule_window_inverted | starts_at позже ends_at. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс/модуль/урок/группа не найдены в этой школе. |
| 409 | module_schedule_required | У модуля урока не задано окно расписания — сначала задайте расписание модуля. |
/api/v1/t/lessons/:id/scheduleУбрать окно расписания урока
Мягко удаляет окно уровня урока. Ответ — { cleared: true }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор урока. |
Пример запроса
curl -X DELETE https://api.edumentor.kz/api/v1/t/lessons/l1a2b3c4-.../schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": { "cleared": true }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_window_not_found | Окно не задано. |
/api/v1/t/groups/:id/course-scheduleСетка расписания группы для курса
Возвращает все окна сетки группы для указанного курса (уровни курс + модули + уроки, group_id = id группы). Ответ — { course_id, group_id, windows }.
Если у студента есть группа со СВОЕЙ сеткой для курса, она ПОЛНОСТЬЮ заменяет дефолтную для него (узлы без окна в группе становятся без ограничений). При членстве в нескольких таких группах окна объединяются в пользу студента (по каждому узлу берётся наиболее мягкое окно).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор группы. |
Query-параметры
| Параметр | Тип | Описание |
|---|---|---|
course_idобяз. | uuid | Курс, чью сетку группы вернуть.Пример: c1a2b3c4-... |
Пример запроса
curl "https://api.edumentor.kz/api/v1/t/groups/g1a2b3c4-.../course-schedule?course_id=c1a2b3c4-..." \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme"Пример ответа
{
"success": true,
"data": {
"course_id": "c1a2b3c4-...",
"group_id": "g1a2b3c4-...",
"windows": [
{
"id": "sw9z8y7x-...",
"course_id": "c1a2b3c4-...",
"group_id": "g1a2b3c4-...",
"level": "course",
"module_id": null,
"lesson_id": null,
"starts_at": "2026-08-01T09:00:00Z",
"ends_at": "2026-08-31T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false,
"created_at": "2026-06-26T10:00:00Z",
"updated_at": "2026-06-26T10:00:00Z"
}
]
}
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | invalid_id_format | id группы или course_id не является корректным UUID. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Группа или курс не найдены в этой школе. |
/api/v1/t/groups/:id/course-scheduleЗадать окно в сетке группы
Создаёт или обновляет окно для конкретного узла (курс/модуль/урок) в сетке расписания группы. Узел задаётся полями level, module_id, lesson_id в теле.
level = course — module_id и lesson_id опускаются; level = module — обязателен module_id; level = lesson — обязательны module_id и lesson_id, и у модуля уже должно быть окно в этой же сетке группы (иначе 409 module_schedule_required).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор группы. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
course_idобяз. | uuid | Курс, к чьей сетке группы относится узел. |
levelобяз. | string | Уровень узла: course, module или lesson.Пример: module |
module_idопц. | uuid | Модуль (для level=module|lesson). |
lesson_idопц. | uuid | Урок (для level=lesson). |
windowобяз. | object | Окно: { starts_at, ends_at, allow_before_start, allow_after_end } (см. PUT окна курса). |
Пример запроса
curl -X PUT https://api.edumentor.kz/api/v1/t/groups/g1a2b3c4-.../course-schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme" \
-H "Content-Type: application/json" \
-d '{
"course_id": "c1a2b3c4-...",
"level": "course",
"window": {
"starts_at": "2026-08-01T09:00:00Z",
"ends_at": "2026-08-31T23:59:00Z",
"allow_before_start": false,
"allow_after_end": false
}
}'Пример ответа
{
"success": true,
"data": { "window": { "id": "sw9z8y7x-...", "group_id": "g1a2b3c4-...", "level": "course", "starts_at": "2026-08-01T09:00:00Z", "ends_at": "2026-08-31T23:59:00Z", "allow_before_start": false, "allow_after_end": false } }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 400 | schedule_window_no_bounds | Не указано ни starts_at, ни ends_at — окно должно ограничивать хотя бы одну сторону. |
| 400 | schedule_window_inverted | starts_at позже ends_at. |
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_target_not_found | Курс/модуль/урок/группа не найдены в этой школе. |
| 409 | module_schedule_required | Для окна уровня lesson у модуля нет окна в сетке этой группы. |
/api/v1/t/groups/:id/course-scheduleУбрать окно из сетки группы
Мягко удаляет окно конкретного узла в сетке группы. Узел задаётся в теле (course_id, level, module_id, lesson_id). Удаление окна модуля каскадно убирает окна его уроков в этой же сетке. Ответ — { cleared: true }.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
idобяз. | uuid | Идентификатор группы. |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
course_idобяз. | uuid | Курс, к чьей сетке группы относится узел. |
levelобяз. | string | Уровень узла: course, module или lesson.Пример: module |
module_idопц. | uuid | Модуль (для level=module|lesson). |
lesson_idопц. | uuid | Урок (для level=lesson). |
Пример запроса
curl -X DELETE https://api.edumentor.kz/api/v1/t/groups/g1a2b3c4-.../course-schedule \
-H "Authorization: Bearer <token>" \
-H "X-Tenant-Subdomain: acme" \
-H "Content-Type: application/json" \
-d '{ "course_id": "c1a2b3c4-...", "level": "course" }'Пример ответа
{
"success": true,
"data": { "cleared": true }
}Ошибки
| Код | error | Когда |
|---|---|---|
| 401 | unauthorized | Токен отсутствует, истёк или недействителен. |
| 403 | forbidden | Нет права manage_courses. |
| 404 | schedule_window_not_found | Окно для указанного узла не задано. |