IP Fraud Detection API — VPN, прокси, Tor и оценка риска

Прозрачный API оценки фрода по IP для риск- и антифрод-команд: реальное обнаружение выходных узлов Tor и анонимных прокси, документированная эвристика VPN/hosting, совпадения по десяти репутационным фидам threat-intel и сигнал цензуры на основе OONI — всё сведено в объяснимую оценку риска 0-100, где указан каждый сработавший вход, а не чёрный ящик.

Ищете VPN detection API, proxy/Tor detection API для проверки при регистрации или IP risk scoring API для антифрода на чекауте? Всё это — группа security этого сервиса: privacy.isTor и privacy.isProxy — реальные совпадения по курируемым спискам, threat.isMalicious — это threat intelligence IP lookup по десяти фидам, доступный на любом тарифе, включая анонимный, а fraud.score/fraud.level сводят всё в одно проверяемое число.

Эта страница — обоснование для оценки API как источника антифрод-сигналов; чтобы проверить один конкретный адрес прямо сейчас, используйте Детали IP — там те же поля, но для одного IP за раз. За деталями интеграции и примерами кода — на странице API для разработчиков, а для бизнес-оценки — на странице для бизнеса.

Опись сигналов — что на самом деле определяет каждое поле

Каждый сигнал ниже сверен с актуальным кодом и живым конфигом деплоя. Там, где сигнал — эвристика, а не подтверждённый факт, столбец ограничений говорит об этом прямо.

Сигнал (поле API) Что означает Источник данных Честное ограничение
Обнаружение Tor — privacy.isTor true, если адрес совпадает с поддерживаемым списком выходных узлов Tor. Курируемый список выходных узлов Tor, обновляется по расписанию. Только что подключившийся выходной узел может не попасть в список до следующего обновления — некоторое время возможен ложный false.
Обнаружение анонимного прокси — privacy.isProxy true, если адрес помечен как сеть анонимного прокси. Флаг анонимного прокси IPFire libloc — реальный курируемый датасет, а не догадка. Покрытие ограничено тем, что курирует libloc; анонимизирующий прокси вне этого датасета вернёт false, а не подтверждённый отрицательный результат.
Эвристика VPN/hosting — privacy.isVpn true только когда классификация сети адреса взята из курируемого списка правил hosting/datacenter — это сигнал hosting-природы адреса, а не список VPN-серверов. Классификация по правилам на основе X4BNet (network.classification.source равен rule, type — hosting или datacenter). Намеренно исключает более слабые cloud- и heuristic-совпадения hosting, поэтому недооценивает VPN-провайдеров вне размеченного диапазона — считайте это грубым сигналом hosting-природы, а не подтверждённым VPN-выходом.
Совпадение threat-intel — threat.isMalicious / threat.sources true, если адрес встречается в любом из настроенных репутационных фидов; sources[] называет, в каких именно. Десять фидов — Feodo Tracker, Spamhaus DROP, ET Compromised, Blocklist.de, CINS Army, DShield, StopForumSpam, ipsum и два фида MISP (CIRCL OSINT, Botvrij OSINT); какие тарифы получают этот сигнал, показано в таблице ниже. Основано на репутационных списках: адрес может выйти из всех списков, поэтому false означает лишь отсутствие совпадения в текущих фидах, а не гарантию безопасности.
Агрегированный уровень угрозы — threat.threatLevel Код серьёзности 1-4 (1=High, 2=Medium, 3=Low, 4=Undefined), агрегированный как самый серьёзный MISP threat_level_id среди всех совпавших записей, у которых он есть. MISP threat_level_id из фидов CIRCL OSINT и Botvrij OSINT — только эти два из десяти несут уровень серьёзности. Полностью отсутствует (не 0, а именно отсутствует) для чистого IP или когда совпадение подтверждено только остальными 8 (не-MISP) фидами; гейтится так же, как isMalicious/sources — verbose не нужен, в отличие от threat.reports[].
Доказательная база угрозы — threat.reports[] Полное событие MISP, лежащее в основе совпадения — организация, описание, дата и индикаторы, — а не просто вердикт да/нет. Сохранённые события MISP только из фидов CIRCL OSINT и Botvrij OSINT. Остальные 8 фидов влияют на isMalicious/sources, но не несут текста события; сам массив доступен только на аутентифицированном запросе на тарифе с verbose — на тарифах без verbose isMalicious/sources всё ещё доступны, но без доказательной базы.
Сигнал цензуры — censorship.isCensored true, если данные измерений показывают долю блокировок выше настроенного порога для связки ASN и страны вызывающего. Датасет сетевых измерений OONI (ooni.org). Сигнал уровня сети/страны, а не факт про конкретный адрес, и заполняется только там, где у OONI накоплено достаточно измерений для этой связки.
Оценка риска фрода — fraud.score / fraud.level / fraud.signals Оценка 0-100 и уровень low/medium/high, вычисленные из сигналов выше плюс качество обратного DNS и совпадение по bulk-mail; signals[] перечисляет, какие именно взвешенные входы сработали. Детерминированная взвешенная свёртка по собственным сигналам сервиса — настроенные веса и пороги, никогда не вызов платного стороннего fraud API. Настолько полна, насколько полны сами сигналы: низкая оценка означает, что ничего настроенного не сработало, а не внешнюю гарантию. Присутствует как объект всегда, если включена, даже для чистого IP (score 0, level low, signals []).

Какой тариф даёт доступ к каким сигналам

privacy, threat.isMalicious и оценка фрода входят в группу security; какие именно тарифы их получают, и на каком тарифе с verbose открывается полный массив доказательств threat.reports[], показано в таблице ниже — она загружается вживую из того же каталога, что использует страница тарифов, поэтому данные не устаревают.

Загрузка текущих лимитов тарифов…

* Лимиты в минуту и в день считаются на уникальный запрошенный IP-адрес. На шлюзе также действует отдельный лимит скорости запросов, независимый от указанных выше лимитов в минуту/в день, при превышении которого возвращается HTTP 429.

Пример: оценка регистрации или чекаута

Типичная интеграция вызывает группу security с IP-адресом посетителя при регистрации или на чекауте, а затем принимает решение по возвращённому уровню, а не по придуманному самостоятельно порогу.

curl
curl "https://ip.xakki.pro/api/v1/ip?include=security&ip=185.220.101.5"
Ответ (сокращённо)

Сокращённый реальный ответ для известного выходного узла Tor (для читаемости — полный справочник полей в документации API).

{
  "schemaVersion": 15,
  "status": "ok",
  "ip": "185.220.101.5",
  "flags": { "isTor": true },
  "network": {
    "classification": { "type": "datacenter", "source": "rule", "confidence": "high" }
  },
  "privacy": {
    "isProxy": true,
    "isVpn": true,
    "isTor": true,
    "isAnonymous": true,
    "isRelay": false,
    "isResidentialProxy": false
  },
  "threat": {
    "isMalicious": true,
    "sources": ["ipsum"]
  },
  "fraud": {
    "score": 100,
    "level": "high",
    "signals": ["hosting", "vpn", "tor", "malicious", "proxy"]
  },
  "tier": "anonymous"
}
Python

fraud.level уже разбит на уровни на стороне сервера по настроенным порогам, поэтому вызывающая сторона может ветвиться прямо по нему, а не подбирать собственное магическое число.

import requests

resp = requests.get(
    "https://ip.xakki.pro/api/v1/ip",
    params={"include": "security", "ip": visitor_ip},
    timeout=5,
)
resp.raise_for_status()
data = resp.json()

fraud = data.get("fraud") or {}
threat = data.get("threat") or {}
privacy = data.get("privacy") or {}

if threat.get("isMalicious") or fraud.get("level") == "high":
    action = "block"
elif fraud.get("level") == "medium" or privacy.get("isTor") or privacy.get("isProxy"):
    action = "step_up_verification"
else:
    action = "allow"

Готовы оценивать свой трафик?

Часто задаваемые вопросы

Обнаружение фрода и VPN/Tor по IP бесплатно?
Да — базовая классификация не требует регистрации. Группа security (privacy, threat, censorship и fraud) ограничена по уникальным IP в день, как и группы geo и network; анонимный тариф уже включает её, а бесплатный зарегистрированный аккаунт поднимает лимит выше.
Что на самом деле определяет privacy.isVpn?
Эвристику hosting/datacenter-природы: true только когда классификация сети адреса взята из курируемого списка правил X4BNet hosting/datacenter. Это не список VPN-серверов, и он намеренно исключает более слабые cloud- и heuristic-совпадения hosting — считайте это грубым сигналом hosting-природы, а не подтверждённым VPN-выходом.
fraud.score — это вызов платного стороннего fraud API?
Нет. fraud.score/fraud.level/fraud.signals — это детерминированная взвешенная свёртка по собственным сигналам сервиса (hosting-природа, VPN/Tor/прокси, совпадение threat-intel, цензура, качество обратного DNS, совпадение bulk-mail) с настроенными весами и порогами — каждый балл прослеживается до названного сигнала, в отличие от закрытой оценки стороннего вендора.
Вы определяете residential-прокси или relay?
Нет — privacy.isResidentialProxy и privacy.isRelay всегда возвращают false; для них пока нет подключённого источника данных, поэтому сервис этого не заявляет. Что реально работает: сопоставление по Tor (privacy.isTor) и флаг анонимного прокси IPFire libloc (privacy.isProxy).
В чём разница между threat.isMalicious и threat.reports?
isMalicious и sources[] доступны на любом тарифе и опираются на все десять настроенных репутационных фидов. reports[] — более глубокая доказательная база: текст события MISP, дата и индикаторы, — доступна только на аутентифицированном запросе на тарифе с verbose, и содержит реальный текст только для 2 из 10 фидов (CIRCL OSINT, Botvrij OSINT); остальные по-прежнему учитываются в isMalicious/sources, но без текста доказательства.