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

Документация/API/Лимиты

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

Лимиты

Это ваш сервер. Лимиты защищают его от того, чтобы интеграция положила школу, а не вас — от того, чтобы пользоваться своими данными. Отсюда и значения, и возможность их менять.

Значения по умолчанию #

Класс операций Лимит Настраивается
Чтение 600 запросов в минуту на ключ да
Запись 120 запросов в минуту на ключ да
Массовые операции 10 одновременных задач да
Экспорт 20 задач в час да
Отправка сообщений по лимиту транспорта нет

Считается на ключ, а не на школу: одна интеграция, упёршаяся в лимит, не мешает другой. Это ещё один довод заводить отдельный ключ на каждую интеграцию.

Последняя строка не настраивается, потому что лимит не наш: почтовый провайдер и Telegram считают отправку сами, и обойти их мы не можем, даже если очень захотим.

Для сравнения: у GetCourse экспорт — 100 запросов за 2 часа на весь аккаунт, без возможности изменить, причём каждый опрос «готов ли файл» тоже расходует квоту. Разница здесь не в цифре, а в том, что у нас это параметр вашей установки.

Заголовки в каждом ответе #

X-RateLimit-Limit: 600
X-RateLimit-Remaining: 587
X-RateLimit-Reset: 1785790800
Заголовок Что значит
X-RateLimit-Limit Лимит для этого класса операций
X-RateLimit-Remaining Сколько осталось в текущем окне
X-RateLimit-Reset Когда окно обнулится, время в секундах эпохи

Они приходят в каждом ответе, а не только в отказе. Это позволяет притормозить до того, как упрётесь, а не после: если Remaining подошёл к нулю за десять секунд до Reset, разумнее подождать эти десять секунд, чем получить 429 и ждать столько же.

Что делать при 429 #

HTTP/1.1 429 Too Many Requests
Retry-After: 12

Уважайте Retry-After. Он в секундах, и это не рекомендация: игнорирование и повтор в цикле — самый быстрый способ получить более жёсткий лимит и подозрение на неисправную интеграцию.

Правильный обработчик:

1. Получили 429 — прочитать Retry-After.
2. Заголовка нет — подождать с ростом: 1, 2, 4, 8 секунд, не больше минуты.
3. Повторить ТОТ ЖЕ запрос. При обходе списка — с тем же курсором,
   иначе обход начнётся сначала и не закончится никогда.
4. Операция записи — повторять с тем же ключом идемпотентности,
   см. [Идемпотентность](/api/idempotency/).

Пункт 4 — то, ради чего ключ идемпотентности вообще существует: после 429 вы точно знаете, что операция не выполнилась, но после таймаута — не знаете, и повтор без ключа создаёт второй заказ.

Как не упираться #

Не опрашивайте по расписанию — подпишитесь. Опрос «не появилось ли чего» каждую минуту тратит лимит на ответы «ничего». Для этого есть вебхуки, и они же дают реакцию в секунду вместо минуты.

Берите список, а не объекты по одному. Один запрос со limit=100 вместо ста запросов по одному — та же работа за один процент лимита.

Разворачивайте связи одним запросом. expand вместо N+1 запросов — см. Пагинация.

Просите только нужные поля. fields не экономит лимит, но экономит время ответа, а значит вы успеваете больше в то же окно.

Экспорт — для объёмов. Выгрузить сто тысяч человек обходом списка можно, но это тысяча запросов; задача экспорта делает то же одним вызовом.

Как поменять #

Все лимиты, кроме отправки сообщений, — параметры установки и меняются в настройках школы.

Прежде чем поднимать, стоит посмотреть на причину. Лимит в 600 запросов в минуту на чтение — это десять запросов в секунду непрерывно; интеграция, которой этого не хватает, обычно опрашивает то, на что можно подписаться. Поднятый лимит в этом случае просто переносит проблему на базу.

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

Чего здесь ещё нет #

Проверенных на живой нагрузке цифр. Значения выше — проектные. Они выбраны из соображения «интеграция не должна класть школу», а не измерены на установке с реальным трафиком: публичного API пока нет, измерять нечего.

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