Лимиты частоты
Каждый API-ключ может отправлять фиксированное число запросов в минуту: 60, если договор не задаёт другое значение. Текущий лимит владелец видит в разделе Настройки → API-ключи.
Лимит учитывает все запросы с ключом, включая запросы к полям и запросы, которые закончились ответом 202 или ошибкой. У каждого ключа свой счётчик, поэтому два ключа одной организации могут использовать лимит полностью.
Если лимит превышен
Заголовок раздела «Если лимит превышен»Запросы сверх лимита отклоняет шлюз API, и они не оплачиваются:
HTTP/1.1 429 Too Many RequestsRetry-After: 17Content-Type: application/json
{"success": false, "error": {"code": "rate_limited", "message": "Rate limit exceeded."}}Подождите столько секунд, сколько указано в Retry-After, и отправьте запрос снова.
curl --retry 5 \ "https://api.agrosat.uz/v1/fields" -H "X-API-Key: $AGROSAT_API_KEY"С --retry curl учитывает Retry-After при ответе 429. Ответ 202 он не повторяет.
import time
def request(session, method, url, **kwargs): for _ in range(5): r = session.request(method, url, timeout=60, **kwargs) if r.status_code != 429: return r time.sleep(int(r.headers.get("Retry-After", "60"))) return rasync function request(url, init = {}) { for (let attempt = 0; ; attempt++) { const res = await fetch(url, init); if (res.status !== 429 || attempt === 4) return res; const wait = Number(res.headers.get("Retry-After") ?? 60); await new Promise((resolve) => setTimeout(resolve, wait * 1000)); }}Как не упираться в лимит
Заголовок раздела «Как не упираться в лимит»- Растягивайте массовые операции, например регистрацию большого числа полей, во времени, а не отправляйте их пачкой.
- Опрашивайте
GET /v1/fields/{id}раз вRetry-Afterсекунд, не чаще. - Не запрашивайте повторно то, что уже получили, например статистику за прошедшие даты.
- Используйте отдельный ключ для каждого окружения, чтобы тесты не съедали лимит продакшена.
Что дальше
Заголовок раздела «Что дальше»Готовность поляКак ждать 202, не тратя запросы впустую.
ОшибкиВсе коды ошибок и советы по повторам.
