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

Проверка IP (CHECK)

GET https://api.abuseipdb.ru/api/v2/check — репутация одного IP-адреса: оценка AbuseIPDB Confidence Score, страна, тип использования, ISP, Tor и последние жалобы.

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

Запрос

# -G превращает -d в query-параметры: CHECK — это GET-запрос.
curl -G https://api.abuseipdb.ru/api/v2/check \
  --data-urlencode "ipAddress=118.25.6.39" \
  -d maxAgeInDays=90 \
  -d verbose \
  -H "Key: YOUR_OWN_API_KEY" \
  -H "Accept: application/json"

IPv6-адрес и network содержат двоеточия, поэтому значение всегда передавайте URL-кодированным (--data-urlencode в curl делает это сам):

curl -G https://api.abuseipdb.ru/api/v2/check \
  --data-urlencode "ipAddress=2001:4860:4860::8888" \
  -d maxAgeInDays=90 \
  -H "Key: YOUR_OWN_API_KEY" \
  -H "Accept: application/json"

Параметры

ПараметрОбязателенПо умолчаниюДопустимые значенияОписание
ipAddressда—IPv4 или IPv6проверяемый адрес; обязателен, без него 422
maxAgeInDaysнет301…365учитывать только жалобы не старше N дней; вне диапазона — 422
verboseнетвыключенфлагдобавить reports[] и countryName; см. ниже

verbose — флаг присутствия: ?verbose, ?verbose=1, ?verbose=true включают подробный ответ, а ?verbose=0, ?verbose=false, ?verbose=no — выключают. Пустое значение приравнивается к включённому флагу.

Ответ

С verbose ответ выглядит так (значения — пример):

{
  "data": {
    "ipAddress": "118.25.6.39",
    "isPublic": true,
    "ipVersion": 4,
    "isWhitelisted": false,
    "abuseConfidenceScore": 100,
    "countryCode": "CN",
    "countryName": "China",
    "usageType": "Data Center/Web Hosting/Transit",
    "isp": "Tencent Cloud Computing (Beijing) Co. Ltd",
    "domain": "tencent.com",
    "hostnames": [],
    "isTor": false,
    "totalReports": 1,
    "numDistinctUsers": 1,
    "lastReportedAt": "2018-12-20T20:55:14+00:00",
    "reports": [
      {
        "reportedAt": "2018-12-20T20:55:14+00:00",
        "comment": "Dec 20 20:55:14 srv206 sshd[13937]: Invalid user oracle from 118.25.6.39",
        "categories": [18, 22],
        "reporterId": 1,
        "reporterCountryCode": "US",
        "reporterCountryName": "United States"
      }
    ]
  }
}

Без verbose те же данные приходят без reports[] и без countryName — это рекомендуемый режим, если вам нужна только оценка: ответ в разы легче.

Расшифровка каждого поля

ПолеТипЧто означает
ipAddressстрокапроверенный адрес в нормализованной записи (IPv6 — в сжатой форме)
isPublicboolадрес публично маршрутизируемый. false для приватных диапазонов (10/8, 172.16/12, 192.168/16), loopback (127/8), link-local, multicast и прочих служебных диапазонов
ipVersionцелое4 или 6
isWhitelistedboolадрес найден в белом списке оператора (admin_ip_allow) или в списке abuseipdb.whitelist_cidrs. В AbuseIPDB.RU значение всегда true/false; на abuseipdb.com может быть null, если белый список не проверялся
abuseConfidenceScoreцелое 0…100оценка «насколько адрес злоупотребляет»; формула — в FAQ. 0 — жалоб нет
countryCodeстрока или nullдвухбуквенный код страны по ISO 3166-1 alpha-2 ("CN", "RU")
countryNameстрока или nullназвание страны по-английски; только с verbose
usageTypeстрока или nullтип использования адреса; полный список значений — ниже
ispстрока или nullпровайдер или организация, которой принадлежит адрес
domainстрока или nullдомен, связанный с адресом (если известен)
hostnamesмассив строкдо 20 имён, которые резолвятся в этот адрес (может быть пустым)
isTorboolадрес является выходным узлом Tor
totalReportsцелоечисло жалоб внутри окна maxAgeInDays
numDistinctUsersцелоечисло различных репортёров внутри окна; один пользователь, пожаловавшийся десять раз, считается один раз
lastReportedAtстрока или nullвремя последней жалобы, ISO 8601 UTC с явным смещением; null, если жалоб нет
reportsмассивпоследние жалобы (не более 10 000), новые первыми; только с verbose

Поля одной жалобы в reports[]:

ПолеТипЧто означает
reportedAtстрокавремя инцидента, ISO 8601 UTC (2026-11-07T02:00:00+00:00)
commentстрокатекст жалобы; очищен от управляющих символов, не длиннее 1024 символов
categoriesмассив целыхидентификаторы категорий из диапазона 1…23, отсортированы; расшифровка — на /categories
reporterIdцелое или nullвнутренний идентификатор репортёра; null для анонимных
reporterCountryCodeстрока или nullкод страны репортёра
reporterCountryNameстрока или nullназвание страны репортёра; только с verbose

Все значения usageType

ЗначениеКогда выставляется
Commercialкоммерческая сеть
Organizationнекоммерческая организация
Governmentгосударственная сеть
Militaryвоенная сеть
University/College/Schoolобразовательное учреждение
Libraryбиблиотека
Content Delivery NetworkCDN
Fixed Line ISPпроводной провайдер
Mobile ISPмобильный оператор
Data Center/Web Hosting/Transitдата-центр, хостинг, транзитный оператор
Search Engine Spiderкраулер поисковой системы
Reservedслужебный или зарезервированный диапазон (isPublic=false)

Если тип определить нельзя, приходит null — это не ошибка.

Что важно знать о CHECK

  • totalReports и numDistinctUsers считаются внутри maxAgeInDays. При maxAgeInDays=30 старые жалобы в счёт не входят, а lastReportedAt показывает последнюю жалобу именно в этом окне.
  • verbose ограничен 10 000 жалоб. Если их больше, придут самые свежие; полный список — через REPORTS с пагинацией.
  • isWhitelisted — не повод для действия. Белый список даёт адресу презумпцию невиновности, но окончательное решение принимайте по abuseConfidenceScore.
  • Кэшируйте ответ. Оценка меняется медленно; для массовых проверок кэш на 5–15 минут экономит дневной лимит (Лимиты).
  • Локальная база. Если по адресу ещё нет жалоб в AbuseIPDB.RU, но у платформы есть ранее полученные сведения об адресе (геоданные, ASN, закэшированная оценка), CHECK возвращает их как справочные; totalReports при этом остаётся локальным счётчиком. На abuseipdb.com такого поведения нет — это особенность перехода.

Ошибки CHECK

КодПричинаТело
401ключ не передан, неверен, отозван или истёк{"errors":[{"detail":"Authentication failed. You have not provided a valid API key.","status":401}]}
422нет ipAddress{"errors":[{"detail":"The ipAddress field is required.","status":422,"source":{"parameter":"ipAddress"}}]}
422ipAddress не является IPv4/IPv6{"errors":[{"detail":"The ip address must be a valid IPv4 or IPv6 address.","status":422,"source":{"parameter":"ipAddress"}}]}
422maxAgeInDays вне 1…365{"errors":[{"detail":"The max age in days must be between 1 and 365.","status":422,"source":{"parameter":"maxAgeInDays"}}]}
429исчерпан дневной лимит ключа{"errors":[{"detail":"Daily rate limit of 1000 requests exceeded for this endpoint. See headers for additional details.","status":429}]}

Полный разбор — Обработка ошибок.

Примеры

cURL — см. выше. Python с обработкой ошибок и таймаутом:

import requests

API_KEY = "YOUR_OWN_API_KEY"
BASE = "https://api.abuseipdb.ru/api/v2"

def check_ip(ip: str, max_age_days: int = 90, verbose: bool = False) -> dict:
    params = {"ipAddress": ip, "maxAgeInDays": max_age_days}
    if verbose:
        params["verbose"] = 1
    response = requests.get(
        f"{BASE}/check",
        params=params,
        headers={"Key": API_KEY, "Accept": "application/json"},
        timeout=15,
    )
    if response.status_code == 429:
        retry_after = int(response.headers.get("Retry-After", "60"))
        raise RuntimeError(f"Лимит исчерпан, повторите через {retry_after} с")
    response.raise_for_status()
    return response.json()["data"]

data = check_ip("8.8.8.8")
print(data["abuseConfidenceScore"], data["totalReports"])

PHP — без зависимостей:

<?php
function abuseipdb_check(string $ip, int $maxAgeDays = 90): array
{
    $query = http_build_query(['ipAddress' => $ip, 'maxAgeInDays' => $maxAgeDays]);
    $ch = curl_init('https://api.abuseipdb.ru/api/v2/check?' . $query);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Key: ' . getenv('ABUSEIPDB_KEY'), 'Accept: application/json'],
        CURLOPT_TIMEOUT => 15,
    ]);
    $body = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    if ($status !== 200) {
        throw new RuntimeException("API v2 HTTP $status: $body");
    }

    return json_decode($body, true)['data'];
}

Дальше: Жалобы по IP (REPORTS) — если нужен полный список жалоб, а не последние 10 000.

Версия 2.2.0 · AbuseIPDB.RU · webmaster@abuseipdb.ru · source: docs/ABUSE-API-check.md