Ограничения частоты
Как это устроено
Лимит стоит не на всём API, а точечно — на маршрутах, где он действительно нужен: вход, публичные формы, страница проверки подлинности, тяжёлая проверка таблицы, письма наружу. По умолчанию маршрут ничем не ограничен.
Счёт ведётся по маршруту и по тому, кто обращается. Лимит на вход не расходуется обращениями к публичной форме и наоборот. Счётчики общие для всех процессов приложения, лежат в Redis и живут ровно одно окно.
Кто обращается, определяется так:
- запрос по токену (из кабинета или выданному через OAuth) считается на организацию — с какого бы адреса он ни пришёл. Агенты Claude и ChatGPT ходят к нам с общих облачных адресов за многих пользователей сразу, и счёт по IP делил бы один предел между чужими организациями;
- человек в кабинете и публичные адреса — по IP-адресу.
Объём выпуска ограничивается условиями организации — пробой или планом, — а не частотой запросов: см. GET /api/org/usage.
Где лимиты есть
Из адресов, доступных по токену (по токену — на организацию):
| Маршрут | Лимит |
|---|---|
POST /mcp — сервер MCP, любые запросы: вызовы инструментов, список, рукопожатие | 300 запросов в минуту на организацию |
POST /api/documents/{id}/sheets/{sheetId}/preview — превью листа | 30 запросов в минуту на организацию |
POST /api/documents/{id}/sheets/{sheetId}/background/from-url — фон по ссылке | 30 запросов в минуту |
POST /api/documents/{id}/assets/from-url — картинка по ссылке | 30 запросов в минуту |
POST /api/documents/{id}/validation | 40 запросов за 5 минут |
POST /api/documents/{id}/validation/fix | 80 запросов за 5 минут |
POST /api/documents/{id}/validation/exclude | 80 запросов за 5 минут |
POST /api/mail/templates/{documentId}/test-send — пробное письмо по черновику шаблона | 5 запросов в минуту на организацию; отказ — 400, а не 429 |
POST /api/mailing/test и POST /api/mailing/text/{id}/test — пробные письма рассылок | 5 запросов в минуту на организацию, общий счётчик; отказ — 400, а не 429 |
POST /api/analytics/digest/preview — пробная месячная сводка на свою почту | 5 запросов в час |
POST /api/onboarding/events — счётчики обучения в кабинете | 120 запросов в минуту |
POST /api/documents/{id}/issue — один документ по API | 120 запросов в минуту на организацию |
Обращения в поддержку токену закрыты (403): их пишет человек в кабинете — новое обращение не чаще 10 раз в час, ответ в нём — 30 раз в час.
Превью, MCP, пробные письма и выдача по API считаются на организацию всегда — и по токену, и из кабинета. Отказ пробного письма по частоте приходит кодом 400 с текстом «Слишком часто. Подождите N секунд и попробуйте снова». Инструменты MCP вызывают REST изнутри сервера, поэтому каждый вызов инструмента расходует и лимит /mcp, и лимит маршрута, который он вызывает: например, validate_recipients — ещё и лимит проверки.
Вход агентов через OAuth и ссылка на архив — по IP-адресу:
| Маршрут | Лимит |
|---|---|
POST /api/oauth/register — регистрация клиента OAuth | 600 запросов в час |
POST /api/oauth/token — обмен кода на токен | 300 запросов в минуту |
GET /api/v1/archive/{token} — скачивание по ссылке на архив | 30 запросов в минуту |
Публичные адреса, доступные без токена:
| Маршрут | Лимит |
|---|---|
GET /api/v1/verify/{id} | 30 запросов в минуту |
GET /api/v1/public/org/{slug} | 60 запросов в минуту |
GET /api/v1/public/org/{slug}/search | 20 запросов в минуту |
GET /api/referral-offer | 20 запросов за 5 минут |
POST /api/v1/leads — заявка на разговор об условиях | 5 запросов за 10 минут |
GET /api/v1/recipient/{token} — страница документа по ссылке из письма | 60 запросов за 5 минут |
GET /api/v1/recipient/{token}/pdf — файл документа по той же ссылке | 30 запросов за 10 минут |
GET /api/v1/t/o/{emailId} — пиксель открытия письма | 60 запросов в минуту |
GET /api/v1/u/{emailId} и GET /api/v1/u/{emailId}/confirm — отписка | по 30 запросов за 5 минут |
POST /api/v1/payments/yookassa — уведомления платёжного сервиса | 120 запросов за 5 минут |
POST /api/v1/payments/tochka — уведомления банка о поступлениях | 120 запросов за 5 минут |
Формы выдачи — на сайте организации (Тильда и наш скрипт формы) и по ссылке:
| Маршрут | Лимит |
|---|---|
GET /api/v1/forms/{token} — страница формы по ссылке | 120 запросов за 5 минут |
POST /api/v1/tilda/submit | 20 запросов за 5 минут на форму, не больше 100 с адреса |
POST /api/v1/tilda-create — приём с серверов Тильды | 120 запросов за 5 минут |
POST /api/v1/tilda/confirm | 15 запросов за 10 минут на заявку, не больше 100 с адреса |
GET /api/v1/tilda/confirm/{requestId}/{code} | 15 запросов за 10 минут |
GET /api/v1/tilda/status/{requestId} | 120 запросов за 5 минут на заявку, не больше 600 с адреса |
GET /api/v1/tilda/download/{requestId} | 20 запросов за 10 минут на заявку, не больше 100 с адреса |
POST /api/v1/tilda/my | 10 запросов за 5 минут |
POST /api/v1/tilda/my/confirm | 15 запросов за 10 минут |
GET /api/v1/tilda/my/{listId}, GET /api/v1/tilda/my/{listId}/download/{requestId} | по 60 запросов за 10 минут |
У tilda-create лимит по адресу общий на все сайты сразу: Тильда шлёт со своих серверов. От накрутки там защищает суточный предел интеграции (dailyLimit).
Заявки, коды, опрос и скачивание считаются по форме или по заявке вместе с адресом, а не по одному адресу: класс школы выходит в интернет с одного IP, и общий предел отказал бы двадцатому ученику, хотя каждый заполнил форму один раз. Перебор держит общий потолок адреса во второй колонке, а подбор кода — сама заявка: после пяти неверных кодов она закрывается.
Вход и учётная запись — это адреса человека, а не программы, но лимиты на них тоже есть:
| Маршрут | Лимит |
|---|---|
POST /api/auth/login | 10 запросов за 5 минут |
POST /api/auth/login/totp | 5 запросов за 5 минут |
POST /api/auth/register | 5 запросов за 10 минут |
POST /api/auth/resend-verification | 3 запроса за 10 минут |
POST /api/auth/verify | 10 запросов за 10 минут |
POST /api/auth/forgot | 3 запроса за 15 минут |
POST /api/auth/reset | 10 запросов за 15 минут |
DELETE /api/auth/account | 5 запросов за 15 минут |
POST /api/auth/totp/setup, /enable, /disable | по 10 запросов за 10 минут |
POST /api/auth/totp/backup-codes | 5 запросов за 15 минут |
POST /api/team-invite/accept | 10 запросов за 15 минут |
Остальные маршруты кабинета — документы, получатели, выпуск, реестр, рассылка — частотой не ограничены (через MCP — в пределах общих 300 вызовов в минуту). Это не приглашение молотить их в тысячу потоков: сервис общий, и разумный темп в ваших же интересах.
Ответ при превышении
HTTP/1.1 429 Too Many Requests
Content-Type: application/json{
"message": "Слишком много попыток. Повторите через 43 с."
}Код ошибки — в статусе HTTP, поля statusCode в теле нет. У превью, выдачи по API и сервера MCP текст свой («Слишком много превью…», «Не больше 120 документов по API в минуту…», «Слишком часто…»), но число секунд в нём есть всегда.
Число секунд в сообщении — время до конца текущего окна. Отдельного заголовка Retry-After в ответе нет, значение придётся взять из текста.
Сервер MCP при превышении своего предела отвечает 429 с телом JSON-RPC:
{
"jsonrpc": "2.0",
"id": null,
"error": { "code": -32600, "message": "Слишком часто. Повторите через 12 с." }
}Если же лимит сработал на маршруте внутри инструмента, сам запрос к /mcp отвечает 200, а инструмент возвращает ошибку с isError: true и текстом «Ошибка 429: …».
Как вести себя программе
- Не гонитесь за скоростью там, где ответ не изменится: список получателей и состояние задания меняются медленно.
- Задание выпуска опрашивайте не чаще раза в 2–3 секунды. Тысяча документов печатается минутами, а не миллисекундами. Через MCP удобнее
get_jobсwaitSeconds: он ждёт на стороне сервера и тратит один вызов вместо двадцати. - Получив
429, подождите указанное число секунд и повторите. Повтор сразу же продлевает ожидание, а не сокращает его. - При недоступности Redis сервис считает обращения в памяти процесса. Лимит при этом становится мягче, но не исчезает.