Отправить жалобу (REPORT)
POST https://api.abuseipdb.ru/api/v2/report — отправить одну жалобу на IP-адрес. Это ядро сервиса: каждая жалоба делает базу точнее и возвращает вам обновлённую оценку адреса.
Раздел «API v2»: Обзор · Проверка IP (CHECK) · Жалобы по IP (REPORTS) · Отправить жалобу (REPORT) · Чёрный список (BLACKLIST) · Проверка подсети (CHECK-BLOCK) · Массовые жалобы (BULK-REPORT) · Удаление жалоб (CLEAR-ADDRESS) · Лимиты · Ошибки · Fail2Ban, CSF, Suricata · FAQ
Запрос
# POST: отправляем данные формы (application/x-www-form-urlencoded)
curl https://api.abuseipdb.ru/api/v2/report \
--data-urlencode "ip=89.205.125.160" \
-d categories=18,22 \
--data-urlencode "comment=SSH login attempts with user root." \
--data-urlencode "timestamp=2023-10-18T11:25:11-04:00" \
-H "Key: YOUR_OWN_API_KEY" \
-H "Accept: application/json"
Параметры
| Параметр | Обязателен | По умолчанию | Ограничения | Описание |
|---|---|---|---|---|
ip | да | — | валидный публичный IPv4 или IPv6 | адрес нарушителя. Локальные, приватные, служебные и документационные диапазоны отклоняются с 422 (полный список — ниже) |
categories | да | — | целые 1…23 через запятую | хотя бы одна категория; неизвестный идентификатор — 422 |
comment | нет | пусто | до 1024 символов | описание атаки: строки логов, порты, имена пользователей. Управляющие символы вырезаются |
timestamp | нет | текущее время | ISO 8601 | время атаки или первого наблюдения; приводится к UTC |
categories можно передать и массивом (categories[]=18&categories[]=22) — это расширение AbuseIPDB.RU, удобное для PHP-форм.
comment и timestamp очищаются и нормализуются на сервере. timestamp принимает ISO 8601 со смещением (2023-10-18T11:25:11-04:00), Z, простую дату и unix-время; мусор возвращает 422, а не молча подменяется на «сейчас».
Три способа передать тело
Все три работают одинаково — выбирайте тот, что удобнее вашему клиенту.
# 1. application/x-www-form-urlencoded (как в примере выше): -d и --data-urlencode
# 2. application/json
curl https://api.abuseipdb.ru/api/v2/report \
-H "Content-Type: application/json" \
-H "Key: YOUR_OWN_API_KEY" \
-H "Accept: application/json" \
--data '{"ip":"89.205.125.160","categories":"18,22","comment":"SSH brute-force","timestamp":"2023-10-18T11:25:11-04:00"}'
# 3. multipart/form-data — удобно, если комментарий содержит переводы строк и двоичные символы
curl https://api.abuseipdb.ru/api/v2/report \
-F "ip=89.205.125.160" \
-F "categories=18,22" \
-F "comment=SSH login attempts" \
-H "Key: YOUR_OWN_API_KEY" \
-H "Accept: application/json"
Ответ
{
"data": {
"ipAddress": "89.205.125.160",
"abuseConfidenceScore": 52
}
}
| Поле | Что означает |
|---|---|
ipAddress | адрес, по которому сохранена жалоба |
abuseConfidenceScore | пересчитанная оценка адреса после сохранения жалобы, 0…100 |
Формула оценки описана в FAQ: учитываются различные репортёры и свежесть их последних жалоб.
Дедупликация: одна жалоба на адрес за 15 минут
Один и тот же репортёр не может пожаловаться на один и тот же адрес чаще, чем раз в 15 минут. Повторная жалоба в это окно не сохраняется и возвращает 429 с точным текстом AbuseIPDB:
{
"errors": [
{
"detail": "You can only report the same IP address (`89.205.125.160`) once in 15 minutes.",
"status": 429,
"source": { "parameter": "ip" }
}
]
}
- Окно считается от момента сохранения, а не от указанного в
timestampвремени инцидента. - Ограничение — на пару «репортёр + адрес»: разные репортёры могут жаловаться на один адрес одновременно.
- Повторная жалоба по прошествии 15 минут сохраняется и снова влияет на оценку.
- Уникальный индекс в базе не даёт двум одновременным запросам обойти правило.
Какие адреса репортить нельзя
Жалоба означает «этот адрес атаковал меня». Такой адрес обязан быть глобально маршрутизируемым: локальные и служебные диапазоны не могут быть источником удалённой атаки, а диапазоны для примеров (RFC) никому не принадлежат. Поэтому отчёт по ним отклоняется с 422:
{
"errors": [
{
"detail": "The ip address must be a public IPv4 or IPv6 address. Local, private, reserved and documentation ranges cannot be reported.",
"status": 422,
"source": { "parameter": "ip" }
}
]
}
Полный запрещённый список (32 диапазона):
Локальные/приватные: 10.0.0.0/8, 100.64.0.0/10 (CGNAT), 127.0.0.0/8 (loopback), 169.254.0.0/16 (link-local), 172.16.0.0/12, 192.168.0.0/16, ::1/128, fc00::/7 (ULA), fe80::/10 (IPv6 link-local).
Служебные/зарезервированные: 0.0.0.0/8, 192.0.0.0/24, 192.88.99.0/24, 198.18.0.0/15, 224.0.0.0/4 (multicast), 240.0.0.0/4, 255.255.255.255/32, ::/128, ::ffff:0:0/96 (IPv4-mapped), 64:ff9b::/96 и 64:ff9b:1::/48 (NAT64), 100::/64, 2001::/32 (Teredo), 2001:2::/48, 2001:10::/28 и 2001:20::/28 (ORCHID), 2002::/16 (6to4), ff00::/8 (multicast).
Диапазоны для примеров: 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 (RFC 5737), 2001:db8::/32 (RFC 3849), 3fff::/20 (RFC 9637).
Это сознательное ужесточение: база публичная, и жалоба на
192.168.1.5или127.0.0.1
не приносит пользы никому — такой адрес всё равно нельзя заблокировать на периметре.
Как тогда тестировать интеграцию
- Возьмите публичный адрес, который контролируете (например, IP своего же сервера или
второго сервера в другом дата-центре) — это безопасно: жалоба описывает атаку, а не портит чужой адрес.
- Отправьте жалобу один раз →
200. Отправьте её же сразу повторно →429с текстом
«You can only report the same IP address once in 15 minutes.» — это и есть проверка дедупликации.
- Для проверки форматов ответов используйте стабильные публичные адреса (
8.8.8.8,1.1.1.1)
на чтение и GET /api/v2/status.
- Проверка
GET /api/v2/checkпо-прежнему принимает локальные адреса (вернётisPublic=false,
usageType=Reserved) — ограничение касается только отправки жалоб.
Категории жалоб
categories — список целых идентификаторов 1…23 через запятую. Дубликаты схлопываются, порядок значения не имеет. Эту же таблицу можно посмотреть на странице /categories.
| ID | Русское название | Описание |
|---|---|---|
| 1 | Компрометация DNS | Изменение DNS-записей с целью перенаправления трафика |
| 2 | Отравление DNS-кэша | Подмена кэша DNS-серверов (cache poisoning) |
| 3 | Мошеннические заказы | Фиктивные или мошеннические заказы |
| 4 | DDoS-атака | Участие в распределённой атаке на отказ в обслуживании (обычно в составе ботнета) |
| 5 | Перебор FTP | Брутфорс учётных данных FTP |
| 6 | Ping of Death | Атака переразмеренными IP-пакетами |
| 7 | Фишинг | Фишинговые сайты и письма |
| 8 | Мошенничество VoIP | Мошенничество в VoIP-телефонии |
| 9 | Открытый прокси | Открытый прокси, релей или выходной узел Tor |
| 10 | Веб-спам | Спам в комментариях и форумах, реферер-спам, спам через CMS |
| 11 | Почтовый спам | Спам-письма, заражённые вложения, фишинговые письма |
| 12 | Спам в блогах | Спам-комментарии в блогах CMS |
| 13 | VPN-адрес | Сопутствующая категория для адреса VPN-выхода |
| 14 | Сканирование портов | Сканирование открытых портов и уязвимых сервисов |
| 15 | Взлом | Попытки несанкционированного взлома |
| 16 | SQL-инъекция | Попытки SQL-инъекций |
| 17 | Подмена отправителя | Подмена адреса отправителя e-mail |
| 18 | Брутфорс | Перебор учётных данных на веб-логинах и сервисах SSH, FTP, SIP, SMTP, RDP и др. |
| 19 | Плохой веб-бот | Скрейпинг страниц и боты, игнорирующие robots.txt |
| 20 | Заражённый хост | Хост, вероятно, заражён и используется для атак или размещения вредоносного контента |
| 21 | Атака на веб-приложение | Пробы и эксплуатация веб-приложений: CMS, интернет-магазины, форумы, phpMyAdmin |
| 22 | SSH | Злоупотребления SSH; используйте вместе с более конкретными категориями |
| 23 | Атака на IoT | Атака, нацеленная на устройства интернета вещей |
Правила: неизвестный или отсутствующий идентификатор — 422 с source.parameter=categories; дубликаты схлопываются; все 23 идентификатора — допустимы.
Персональные данные (PII)
Внимание. Комментарии к жалобам видны другим пользователям. Вырезайте персональные данные: имена, логины реальных людей, адреса, телефоны, содержимое переписки, токены и пароли. Ответственность за раскрытые в комментарии данные лежит на отправителе.
Безопасный комментарий — это фрагмент технического лога без персональных данных:
Nov 7 02:14:07 srv sshd[1234]: Failed password for invalid user admin from 203.0.113.7 port 51544 ssh2
Плохой комментарий: содержит e-mail, телефон или полное имя сотрудника.
Примеры
Python:
import requests
from datetime import datetime, timezone
API_KEY = "YOUR_OWN_API_KEY"
BASE = "https://api.abuseipdb.ru/api/v2"
def report_ip(ip: str, categories: list[int], comment: str = "", when: str | None = None) -> dict:
payload = {
"ip": ip,
"categories": ",".join(str(c) for c in categories),
"comment": comment[:1024],
}
if when is not None:
payload["timestamp"] = when
response = requests.post(
f"{BASE}/report",
data=payload,
headers={"Key": API_KEY, "Accept": "application/json"},
timeout=15,
)
if response.status_code == 429:
# либо дедупликация 15 минут, либо дневной лимит — смотрите detail
raise RuntimeError(response.json()["errors"][0]["detail"])
response.raise_for_status()
return response.json()["data"]
print(report_ip("89.205.125.160", [18, 22], "SSH brute-force from 127.0.0.1"))
PHP:
<?php
function report_ip(string $ip, array $categories, string $comment = ''): array
{
$ch = curl_init('https://api.abuseipdb.ru/api/v2/report');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'ip' => $ip,
'categories' => implode(',', $categories),
'comment' => mb_substr($comment, 0, 1024),
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Key: ' . getenv('ABUSEIPDB_KEY'),
'Accept: application/json',
'Content-Type: application/x-www-form-urlencoded',
],
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'];
}
Ошибки REPORT
| Код | Причина | source.parameter |
|---|---|---|
401 | ключ отсутствует/неверен/отозван | — |
422 | не указан ip | ip |
422 | ip не IPv4/IPv6 | ip |
422 | не указан categories | categories |
422 | категории не в диапазоне 1…23 | categories |
422 | timestamp не разбирается как дата | timestamp |
429 | повторная жалоба на этот адрес в течение 15 минут | ip |
429 | исчерпан дневной лимит | — |
Точные примеры тел — Обработка ошибок. Массовая отправка — BULK-REPORT. Удаление своих жалоб — CLEAR-ADDRESS.
Версия 2.2.0 · AbuseIPDB.RU · webmaster@abuseipdb.ru · source: docs/ABUSE-API-report.md