Основное
Ответы о превышении квоты теперь возвращают HTTP 429 с заголовком Retry-After, как это делают OpenAI, GitHub и Cloudflare. На странице с ценами появилась строка Bandwidth (на всех публичных тарифах пропускная способность не ограничена). А запросы, требующие exitCountries на тарифе без геотаргетинга, теперь получают четкий 403 код с указанием параметра и способа решения.
Что нового
Лимиты квот теперь возвращают HTTP 429, а не 402
Если вы достигли лимита тарифа (кредиты или пропускная способность), в ответ возвращается 429 Too Many Requests с Retry-After в каждом ответе и resets_at в теле с указанием на конец расчетного периода. Поле reason сообщает, какой лимит достигнут (plan_limit_credits или plan_limit_bandwidth), чтобы это не пересекалось с поминутными rate limit.
Почему это изменилось? 402 звучит правильно ("Payment Required"), но на практике именно так Stripe сообщает об отклоненных платежах, и многие HTTP-клиенты и proxy обрабатывают его некорректно. OpenAI, GitHub, Twilio и Cloudflare отклоняют превышенные квоты с кодом 429 и отдельным кодом ошибки. Следовать этому стандарту было правильным шагом, так как каждая библиотека для повторных попыток в мире уже знает, как работать с нашими ответами.
Значение Retry-After ограничено 24 часами для тех, кто использует подход с ожиданием и повтором. Если вам нужно точное время сброса, прочитайте resets_at из тела JSON.
Пропускная способность на странице цен: Unlimited
На странице /prices появилась строка Bandwidth в матрице сравнения. Каждый публичный тариф включает неограниченную пропускную способность, и теперь это явно указано в матрице. Это из тех вещей, которые не нужны, пока потенциальный клиент не спросит, а вы не можете найти цифру. Теперь она есть на странице.
Кастомные тарифы с ограничением пропускной способности показывают свои значения в гигабайтах в той же строке.
геотаргетинг ограничивается корректной ошибкой
Если request отправляет exitCountries, а тариф не включает функцию геотаргетинга, response будет 403 с сообщением, где указан параметр и способ решения. Раньше request проходил так, будто геотаргетинг разрешен. Теперь он сразу отклоняется с явной ошибкой.
Запросы без exitCountries не затрагиваются. Это срабатывает только тогда, когда вы действительно запрашиваете эту функцию.
Небольшие исправления панели управления в разделах Лимиты и Биллинг
Три исправления для удобства:
- Вкладка Limits. Сохраненная подвкладка (Overview / API keys / Limits & Features) восстанавливается до отрисовки, поэтому вы больше не увидите мелькание неверной вкладки при перезагрузке.
- API Keys. Поле поиска использует канонический шаблон поиска вместо обычного поля ввода.
- Billing. Метастроки под Payment Method теперь отображаются с правильными стилями (раньше они были без стилей).
Под капотом
Режимы применения ограничений тарифа теперь можно переключать на лету. Каждое из шести ограничений плоскости данных (одновременные запросы на продукт, поминутный rate limit, браузеры в день, кредиты, пропускная способность, функции), а также проверка создания ключей в плоскости управления могут быть переключены между состояниями off, signal и enforce через панель настроек нашей команды. Без повторного деплоя. Фоновое обновление опрашивает настройки каждые 60 секунд, а горячий путь остается синхронным.
Почему это важно для вас? Когда лимит ведет себя некорректно в production, мы можем ослабить его за минуту вместо релиза нового кода. Это также позволяет нам включать ограничения постепенно для каждого лимита, наблюдая за поведением реального трафика на каждом этапе. Режим сигнала записывает событие без блокировки, а принудительное применение включает ответ 429 или 403. Мы хотели, чтобы промежуточный этап был полноценным решением, а не аварийным переключателем.
Цифры
Retry-Afterограничение на отказы по квоте: 24 часа (реальное время сброса вresets_at)- Интервал опроса настроек runtime: 60 секунд
- Публичные тарифы с неограниченной пропускной способностью: все
Ограничитель тарифов был нашей основной задачей в течение месяца. Дальше: применение первых ограничений (кредиты и concurrency на продукт выглядят как естественная первая пара), а также email предупреждения после запуска этапа рассылок.