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[], показано в таблице ниже — она загружается вживую из того же каталога, что использует страница тарифов, поэтому данные не устаревают.
Загрузка текущих лимитов тарифов…
| Тариф | Цена | Security / день | Доказательства threat (reports[]) |
|---|---|---|---|
* Лимиты в минуту и в день считаются на уникальный запрошенный IP-адрес. На шлюзе также действует отдельный лимит скорости запросов, независимый от указанных выше лимитов в минуту/в день, при превышении которого возвращается HTTP 429.
Пример: оценка регистрации или чекаута
Типичная интеграция вызывает группу security с IP-адресом посетителя при регистрации или на чекауте, а затем принимает решение по возвращённому уровню, а не по придуманному самостоятельно порогу.
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"
}
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, но без текста доказательства.