Проверка 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 | нет | 30 | 1…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 — в сжатой форме) |
isPublic | bool | адрес публично маршрутизируемый. false для приватных диапазонов (10/8, 172.16/12, 192.168/16), loopback (127/8), link-local, multicast и прочих служебных диапазонов |
ipVersion | целое | 4 или 6 |
isWhitelisted | bool | адрес найден в белом списке оператора (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 имён, которые резолвятся в этот адрес (может быть пустым) |
isTor | bool | адрес является выходным узлом 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 Network | CDN |
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"}}]} |
422 | ipAddress не является IPv4/IPv6 | {"errors":[{"detail":"The ip address must be a valid IPv4 or IPv6 address.","status":422,"source":{"parameter":"ipAddress"}}]} |
422 | maxAgeInDays вне 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