Лимиты запросов
Каждый ключ API имеет дневную квоту запросов. Лимит считается на ключ, а не на IP-адрес клиента, и обнуляется в 00:00 UTC.
Раздел «API v2»: Обзор · Проверка IP (CHECK) · Жалобы по IP (REPORTS) · Отправить жалобу (REPORT) · Чёрный список (BLACKLIST) · Проверка подсети (CHECK-BLOCK) · Массовые жалобы (BULK-REPORT) · Удаление жалоб (CLEAR-ADDRESS) · Лимиты · Ошибки · Fail2Ban, CSF, Suricata · FAQ
Дневные лимиты по тарифам
| Тариф | Запросов в сутки | Для чего хватает |
|---|---|---|
| free | 1 000 | проверка адресов вручную, небольшой Fail2Ban, тесты |
| premium | 50 000 | рабочий мониторинг, регулярные выгрузки блэклиста, средний трафик жалоб |
| admin | 1 000 000 | платформенные задачи и обслуживание (служебный уровень) |
Отличие от AbuseIPDB.com: у нас один общий счётчик на ключ для всех эндпоинтов v2. На abuseipdb.com у каждого эндпоинта (
check,reports,blacklist, …) свой отдельный дневной лимит. У насcheckиreports«съедают» одну и ту же квоту — учитывайте это при планировании.
Лимит можно поднять в личном кабинете: https://abuseipdb.ru/dashboard → «API-ключи» → тариф ключа. Значения лимитов настраиваются оператором и могут отличаться от таблицы — актуальные числа всегда приходят в заголовке X-RateLimit-Limit.
Заголовки ответа
Эти заголовки приходят на каждом успешном ответе v2, а не только при ошибке:
| Заголовок | Что означает |
|---|---|
X-RateLimit-Limit | дневной лимит ключа |
X-RateLimit-Remaining | сколько запросов осталось на сегодня |
X-RateLimit-Reset | момент сброса квоты (unix timestamp, 00:00 UTC) |
Retry-After | только при 429: через сколько секунд можно повторить |
Пример ответа с исчерпанной квотой:
HTTP/1.1 429 Too Many Requests
Content-Type: application/json; charset=utf-8
Retry-After: 29241
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1545973200
{
"errors": [
{
"detail": "Daily rate limit of 1000 requests exceeded for this endpoint. See headers for additional details.",
"status": 429
}
]
}
Заголовки X-RateLimit-* доступны и при ошибках, и для CORS-клиентов — они перечислены в Access-Control-Expose-Headers (расширение AbuseIPDB.RU).
Явные примеры ошибок (для приёмки интеграции)
Все три примера ниже можно выполнить как есть — они показывают ожидаемое тело ответа.
# 401 — запрос без ключа
curl -i -G https://api.abuseipdb.ru/api/v2/check \
--data-urlencode "ipAddress=8.8.8.8" \
-H "Accept: application/json"
# Ожидаемо: HTTP/1.1 401
# {"errors":[{"detail":"Authentication failed. You have not provided a valid API key.","status":401}]}
# 422 — невалидный параметр
curl -i -G https://api.abuseipdb.ru/api/v2/check \
--data-urlencode "ipAddress=8.8.8.8" \
-d maxAgeInDays=999 \
-H "Key: $API_KEY" \
-H "Accept: application/json"
# Ожидаемо: HTTP/1.1 422
# {"errors":[{"detail":"The max age in days must be between 1 and 365.","status":422,"source":{"parameter":"maxAgeInDays"}}]}
# 429 — дневная квота исчерпана (нужен ключ, у которого квота уже израсходована)
curl -i -G https://api.abuseipdb.ru/api/v2/check \
--data-urlencode "ipAddress=8.8.8.8" \
-H "Key: $API_KEY" \
-H "Accept: application/json"
# Ожидаемо: HTTP/1.1 429, Retry-After: <секунды до 00:00 UTC>
# {"errors":[{"detail":"Daily rate limit of 1000 requests exceeded for this endpoint. See headers for additional details.","status":429}]}
Отдельный вид 429 — короткий лимит на отправку жалоб: You can only report the same IP address (…) once in 15 minutes. Он не связан с дневной квотой и описан в REPORT.
Когда сбрасывается квота
- Квота обнуляется в 00:00 UTC каждые сутки. Русское время — 03:00 МСК (UTC+3).
X-RateLimit-Resetсодержит точный unix timestamp сброса.Retry-Afterпри429— число секунд до сброса. Рекомендуется ждать именно столько, а не «примерно час».- Пересоздание ключа не обнуляет квоту: счётчик привязан к ключу.
Коды ответа, связанные с лимитами
| Код | Когда | Что делать |
|---|---|---|
429 | дневная квота исчерпана | ждать Retry-After, затем повторить; не долбить в цикле |
429 | повторная жалоба на тот же адрес в течение 15 минут | подождать 15 минут или перестать дублировать жалобы |
403 | эндпоинт требует более высокого тарифа (clear-address — только admin) | сменить ключ/тариф, не повторять |
Как уложиться в лимит
| Приём | Эффект |
|---|---|
Кэшировать ответы /check на 5–15 минут | оценка меняется медленно, повторная проверка того же IP почти всегда бессмысленна |
Использовать check-block вместо сотен check | один запрос на целую подсеть вместо N запросов |
perPage=100 в /reports | максимум данных за один запрос |
bulk-report вместо тысяч report | один запрос на 10 000 жалоб |
Выгружать /blacklist по расписанию (раз в 5–60 минут), а не на каждый запрос пользователя | один запрос на обновление firewall |
Не использовать /check на каждый HTTP-запрос сайта | проверяйте адрес при входе/регистрации и кэшируйте результат |
Обрабатывать Retry-After и backoff с джиттером | не создаёт «стадо» повторов после сброса квоты |
Пример клиента с корректной обработкой лимита:
import time
import requests
API_KEY = "YOUR_OWN_API_KEY"
BASE = "https://api.abuseipdb.ru/api/v2"
def check_with_backoff(ip: str, attempts: int = 3) -> dict:
for attempt in range(1, attempts + 1):
response = requests.get(
f"{BASE}/check",
params={"ipAddress": ip},
headers={"Key": API_KEY, "Accept": "application/json"},
timeout=15,
)
if response.status_code == 429:
wait = int(response.headers.get("Retry-After", "60"))
if attempt == attempts:
raise RuntimeError(f"квота исчерпана, повтор через {wait} с")
time.sleep(min(wait, 3600))
continue
response.raise_for_status()
return response.json()["data"]
raise RuntimeError("unreachable")
Проверка состояния API без расхода квоты
GET https://api.abuseipdb.ru/api/v2/status не требует ключа и не расходует дневной лимит:
curl -s https://api.abuseipdb.ru/api/v2/status -H "Accept: application/json"
{
"data": {
"status": "ok",
"apiVersion": "v2",
"compatibleWith": "abuseipdb.com",
"platformVersion": "1.2.3",
"generatedAt": "2026-11-07T02:00:00+00:00",
"categories": 23,
"reports": { "total": 128, "today": 12, "last": "2026-11-07T01:59:58+00:00" },
"endpoints": ["check", "reports", "blacklist", "report", "bulk-report", "check-block", "clear-address"],
"authentication": ["Key header", "Authorization: Bearer", "?key="],
"cors": true
}
}
/status — расширение AbuseIPDB.RU; на abuseipdb.com его нет.
Версия 2.2.0 · AbuseIPDB.RU · webmaster@abuseipdb.ru · source: docs/ABUSE-API-limits.md