Расчёты
Лимиты и доступность
Лимит запросов в минуту, ответ 429 и заголовки, дневной бюджет и временная недоступность.
Лимит частоты запросов
API ограничивает число запросов по ключу или сессии, а запросы без ключа и сессии — по IP-адресу клиента:
| Уровень | Значение | Что получает клиент при превышении |
|---|---|---|
| Приложение API, запросы с API-ключом или сессией кабинета | 600 запросов в минуту на каждый ключ или сессию; окно в одну минуту, общий счётчик для всех маршрутов API | HTTP 429 в обычном JSON-формате ошибки с error.code=rate_limited |
| Приложение API, запросы без ключа и сессии | 300 запросов в минуту на IP-адрес; окно в одну минуту, общий счётчик для всех маршрутов API | HTTP 429 в обычном JSON-формате ошибки с error.code=rate_limited |
| Приложение API, все ключи и сессии одного IP-адреса вместе | потолок 1800 запросов в минуту на IP-адрес | HTTP 429 в том же JSON-формате, с Retry-After |
| Публичные картинки и публичный каталог моделей | 1200 запросов в минуту на IP-адрес, отдельный счётчик | HTTP 429 в обычном JSON-формате ошибки с error.code=rate_limited |
Вход на api.kvantora.ai |
около 30 запросов в секунду на IP-адрес, кратковременный всплеск — ещё до 90 запросов | HTTP 429 от входного сервера: HTML-страница вместо JSON, без error.code и без Retry-After |
Вход в кабинет (/api/auth/*) |
около 5 запросов в минуту на IP-адрес, запас — 10 запросов | HTTP 429 входного сервера; к вызовам API по ключу не относится |
У каждого ключа и каждой сессии свой счётчик: сотрудники и ключи компании за одним IP-адресом (офис, NAT) не делят один лимит, а общий потолок по адресу защищает от подбора и перегрузки. Несколько серверов с одним ключом делят счётчик этого ключа. Лимит не зависит от баланса и дневного бюджета ключа.
Ответ 429 приложения
{
"error": {
"code": "rate_limited",
"message": "Слишком много запросов. Подождите и повторите попытку: время ожидания указано в заголовке Retry-After",
"request_id": "req-…"
}
}Приложение сообщает состояние окна заголовками:
| Заголовок | Значение |
|---|---|
x-ratelimit-limit |
Сколько запросов разрешено за окно (600 с ключом или сессией, 300 без них) |
x-ratelimit-remaining |
Сколько запросов осталось в текущем окне |
x-ratelimit-reset |
Через сколько секунд окно обновится |
Retry-After |
В ответе 429: через сколько секунд повторить запрос |
Если заголовок Retry-After присутствует, выдержите указанную паузу. Если его нет (ответ входного сервера — HTML без Retry-After), подождите не менее секунды, затем повторяйте с нарастающей паузой и более редким темпом. Не используйте бесконечный автоматический повтор: ограничьте число попыток и увеличивайте паузу.
Отказ по частоте происходит до обработки запроса: резерв не создаётся и деньги не списываются. Повторяйте запрос с прежними телом и Idempotency-Key: если исходный запрос всё же был принят, вы получите его сохранённый результат, а не второй платный запуск. Ограничьте пул параллельных запросов заранее, не ждите 429.
Другие причины HTTP 429
HTTP 429 бывает и у дневного бюджета ключа. Различайте причины по error.code:
error.code |
Причина | Действие |
|---|---|---|
rate_limited |
Исчерпан лимит запросов в минуту | Подождать Retry-After и повторить тот же запрос |
api_key_daily_budget_exceeded |
Исчерпан дневной бюджет ключа | Повтор до смены дня не поможет: проверьте бюджет и резервы или задайте другой ключ |
Для api_key_daily_budget_exceeded в error.details приходят limit, spent, reserved, remaining (целые числа в микрорублях) и reset_at — момент, когда бюджет обновится.
Недоступность и MCP
Временная перегрузка возвращается как HTTP 503 service_unavailable с заголовком Retry-After, см. ошибки.
Для MCP одновременно выполняются до двух инструментов на организацию и до четырёх на процесс. Превышение возвращает isError=true и mcp_busy. Эти слоты не используются обычными API-запросами. Отключение MCP не отключает API.
Ограничения размера
Тело JSON-запроса API до 10 МиБ, MCP body до 64 КиБ, MCP result до 512 КиБ, файл до 50 МиБ. Дополнительные ограничения строк и массивов описаны в матрице совместимости.
Отказ доступности до отправки не равен неизвестному результату после отправки. Для неизвестного результата сохраняйте ID и резерв, см. ошибки.