Документация LMS версия 2026.09.180

Документация/API/Формат

Раздел описывает первый рабочий срез API. Срез в разработке: маршрутов ещё нет, экран ключей появится вместе с ним — до выкатки проверить запросы не обо что.

Формат

Скучная страница, которую читают один раз и потом сверяются. Здесь всё, что одинаково у всех операций.

Базовый адрес #

https://{домен-школы}/api/v1

Общего адреса нет и не будет: это коробка, у каждой школы свой домен. Адрес своей установки видно на экране создания ключа — там же рядом готовый пример запроса с подставленным ключом.

Одно исключение: публичная проверка сертификата живёт в корне школы, а не под /api/v1, и не требует авторизации.

Транспорт и тело #

Только HTTPS. HTTP отвечает 400 без перенаправления.

Тело — application/json; charset=utf-8. Никакого base64 внутри form-urlencoded, как в классическом API GetCourse.

Именование #

Ресурсы во множественном числе, поля в snake_case, идентификаторы в пути.

Вложенность не глубже двух уровней. /v1/courses/{id}/modules — да, /v1/courses/{id}/modules/{id}/lessons/{id}/assignments — нет: вместо этого /v1/assignments?lesson_id=…. Глубокая вложенность выглядит логично и перестаёт работать, как только объект понадобится получить не через родителя.

Идентификаторы #

Префиксные, типизированные, устойчивые к перебору:

usr_01HQZX3M8K4N2P      пользователь
crs_01HQZX41B7RC9S      курс
lsn_01HQZX4G2XVD5T      урок
enr_01HQZX52NAQF7V      обучение на курсе
sub_01HQZX5PDMWG3W      ответ на задание
ord_01HQZX68HKYJ1X      заказ
pay_01HQZX6TSCZL8Y      платёж
prd_01HQZX7B4FMN2Z      продукт
off_01HQZX7QGVPR6A      тариф
seg_01HQZX8D9JTS4B      сегмент
scn_01HQZX8XKQWU7C      сценарий
web_01HQZX9F5NZV1D      вебинар

Префикс сразу говорит, что за объект, и делает ошибку «передал идентификатор заказа туда, где ждали платёж» видимой мгновенно — а не через три часа отладки, когда 404 наконец покажется странным.

Числовых идентификаторов нет намеренно: по ним перебирается вся база.

Даты #

ISO 8601 с таймзоной, всегда:

2026-08-03T14:30:00+03:00

Никаких "2026-08-03 14:30:00" — строка без пояса требует догадки о том, чей это пояс, и догадка однажды окажется неверной. Сервер работает в UTC, а показывается всё в поясе школы.

Деньги #

Целое число в минорных единицах и код валюты — всегда парой:

{ "amount": 1490000, "currency": "RUB" }

Это 14 900 рублей.

Целое — потому что дробные числа не складываются точно, и на сотой операции копейка разъезжается. Парой с валютой — потому что у валют разный порядок: у иены нулевой, у динара три знака, и число без кода валюты бессмысленно.

Булевы — булевы #

true, а не "true" и не 1. Числа — числа. Пустое значение — null, а не пустая строка.

Конверт ответа #

Объект отдаётся напрямую, без обёртки:

{
  "id": "usr_01HQZX3M8K4N2P",
  "email": "student@example.com",
  "first_name": "Мария",
  "created_at": "2026-08-01T10:15:00+03:00"
}

Список — с курсором:

{
  "data": [ { "id": "usr_01HQZX3M8K4N2P", "email": "student@example.com" } ],
  "has_more": true,
  "next_cursor": "eyJpZCI6InVzcl8wMUhRWlgzTThLNE4yUCJ9"
}

Обходить список до тех пор, пока has_more равно true, подставляя next_cursor в следующий запрос. Разбирать сам курсор не нужно и не следует: это закодированная позиция, и её устройство может измениться.

Подробнее про обход, фильтры и сортировку — Пагинация.

Служебные заголовки в каждом ответе #

Заголовок Что это
X-Request-Id Идентификатор запроса. Логируйте его у себя — см. Ошибки
X-RateLimit-Limit Лимит для этого класса операций
X-RateLimit-Remaining Сколько осталось
X-RateLimit-Reset Когда счётчик обнулится

Состав полей #

Чего на этой странице нет: состава полей у объектов. Формат конверта, дат, денег и идентификаторов решён и не изменится, а какие именно поля у заказа — это то, что выводится из валидаторов, а их пока нет. См. Чего в справочнике ещё нет.

Эта страница в Markdown