Лимиты и квоты
Ответы 429 от AACsearch — диагностика per-key rate-лимитов, исчерпания месячной квоты и заголовков, по которым понятно когда повторять.
Два разных условия возвращают одинаковый HTTP 429:
Поле error | Значение | Сбрасывается когда |
|---|---|---|
rate_limit_exceeded | Превышен per-key rate запросов | Скользящее окно 60 секунд |
quota_exceeded | Месячная квота search-юнитов организации исчерпана | 1-го числа следующего календарного месяца, или при апгрейде тарифа |
Решения у них разные. Первое — "подождать и повторить"; второе — "потратить больше или ждать сброса".
Rate limit (на ключ)
У каждого API-ключа есть rateLimitPerMinute (по умолчанию 60). Запросы выше этого порога возвращают:
HTTP/1.1 429 Too Many Requests
Retry-After: 15
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1717201234
{
"error": "rate_limit_exceeded",
"message": "Rate limit of 60 req/min exceeded. Retry after 15 seconds."
}Проверки
-
Проверьте заголовки.
X-RateLimit-Limit— потолок per-key,X-RateLimit-Remaining— сколько осталось в текущем окне,Retry-After— сколько секунд ждать. -
Найдите ключ, упирающийся в лимит. Часто несколько фронтов делят один widget-ключ. Откройте Search → API Keys → ключ → "Last 24 hours" и поищите всплески.
-
Делаете один-поиск-на-нажатие? Наивный автокомплит может выпускать 5–10 запросов в секунду на пользователя. С 12 активными пользователями это 3 600 req/min с одного ключа.
Исправление
| Причина | Что сделать |
|---|---|
| Наивный автокомплит | Дебаунс на клиенте — 200 мс хороший дефолт. Или useDeferredValue (React 18+). См. browser SDK autocomplete pattern |
| Краулер / нежелательный трафик | Проверьте X-Forwarded-For в edge-логах; блокируйте ботов на edge до того как запрос дойдёт до AACsearch |
| Реальный высокий трафик | Поднимите per-key лимит в Search → API Keys (тоже ограничен квотой тарифа) или разнесите на несколько ключей с раздельными лимитами |
| Всплеск от разового скрипта | Подождите Retry-After секунд и повторите; не уходите в цикл без backoff |
Паттерн повтора
Уважайте Retry-After. Не повторяйте до его истечения, иначе bucket остаётся переполненным:
async function searchWithRateLimitRetry(query: string) {
for (let attempt = 0; attempt < 3; attempt++) {
try {
return await client.search({ q: query });
} catch (err) {
if (err instanceof AacSearchError && err.code === "rate_limit") {
const retryAfterSec = Number(err.response?.headers.get("Retry-After") ?? 5);
await new Promise((r) => setTimeout(r, retryAfterSec * 1000));
continue;
}
throw err;
}
}
throw new Error("rate-limited after 3 attempts");
}Quota exceeded (месячная)
Когда организация исчерпала месячную норму search-юнитов тарифа:
HTTP/1.1 429 Too Many Requests
{
"error": "quota_exceeded",
"message": "Monthly search-unit quota exhausted. Upgrade your plan or wait for reset."
}Один search-юнит = 1 поисковый запрос ИЛИ 1 проиндексированный документ. См. Тарифы и лимиты для цифр по тарифам.
Проверки
- Где вы по тарифу? Settings → Billing → Usage. Прогресс-бар показывает текущий расход против потолка.
- Причина ожидаемая? Если вчера запустили новый сторфронт — всплеск ожидаем. Если нет — ищите в логах беглые скрипты.
- Включён ли wallet overage? Платные тарифы могут включить overage — после этого запросы выше soft cap списываются с кошелька, а не возвращают 429.
Исправление
| Тариф | Что сделать |
|---|---|
| Free | Либо апгрейд на Starter+, либо ждать сброса 1-го числа |
| Starter / Pro / Business | Включите wallet overage в Settings → Billing → Overage; или переходите на следующий тариф |
| Enterprise | Свяжитесь с аккаунт-менеджером для пересчёта; квота контрактная, не enforced |
После включения overage следующий запрос выше soft cap списывает с кошелька (по цене за 1k search-юнитов). Hard cap блокирует только когда сам кошелёк пуст.
Разница между soft и hard cap
| Cap | Срабатывает | Поведение |
|---|---|---|
| Soft | Достигнута квота тарифа | Алерты идут на billing email; запросы продолжают обслуживаться, если включён overage budget |
| Hard | Квота тарифа + overage budget исчерпаны | Возвращается 429, поиск останавливается |
Без overage soft и hard cap совпадают.
Пакет диагностики
| Поле | Заметки |
|---|---|
| ID организации | обязательно |
| Уровень тарифа | из Settings → Billing |
| Окно | UTC-начало и конец всплеска |
| Префикс затронутого ключа | первые 12 символов |
| Образец ответа | полное тело включая заголовки X-RateLimit-* |
| Недавний объём | запросов в минуту за последний час |
Связанные
- Ошибки и rate limits — матрица кодов ошибок
- Тарифы и лимиты — уровни квот
- Биллинговые лимиты — биллинг-специфичные проблемы
- Browser SDK — паттерн дебаунса /
useDeferredValue
Ошибки авторизации
Ответы 401 / 403 от API AACsearch — диагностика отсутствующих заголовков, неверного префикса ключа, отозванных ключей, истечения scoped-токенов и ограничений по origin.
Пустые результаты
Поиск возвращает `found: 0` для запросов, которые должны находить совпадения — диагностика отсутствующих документов, слишком узких фильтров, фильтров токенов с ограниченной областью и несоответствий `queryBy`.