Тема
Войти Регистрация

Лимиты запросов

Каждый ключ API имеет дневную квоту запросов. Лимит считается на ключ, а не на IP-адрес клиента, и обнуляется в 00:00 UTC.

Раздел «API v2»: Обзор · Проверка IP (CHECK) · Жалобы по IP (REPORTS) · Отправить жалобу (REPORT) · Чёрный список (BLACKLIST) · Проверка подсети (CHECK-BLOCK) · Массовые жалобы (BULK-REPORT) · Удаление жалоб (CLEAR-ADDRESS) · Лимиты · Ошибки · Fail2Ban, CSF, Suricata · FAQ

Дневные лимиты по тарифам

ТарифЗапросов в суткиДля чего хватает
free1 000проверка адресов вручную, небольшой Fail2Ban, тесты
premium50 000рабочий мониторинг, регулярные выгрузки блэклиста, средний трафик жалоб
admin1 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