TRACIO анализирует IP-адрес каждого посетителя на стороне сервера. Он помечает VPN, прокси, выходные узлы Tor и адреса датацентров, а также определяет геолокацию на уровне города. Весь анализ выполняется на стороне сервера без каких-либо клиентских зависимостей.
IP Intelligence попадает в ваше приложение через payload вебхука: объект network (булевы
флаги VPN/прокси/Tor/датацентр, тип соединения и, на тарифах Pro и выше, proxy_detected) и
объект geo (страна, город, координаты, часовой пояс) доставляются с каждым вебхуком. ISP,
ASN и объект real_ip добавляются на тарифах Business и выше. Полную структуру payload и
проверку подписи смотрите в разделе Webhooks.
Классификация VPN, прокси, Tor и датацентра определяется по подключающемуся IP
с помощью коммерческих баз IP Intelligence (IP2Location для типа VPN/прокси/Tor,
MaxMind для геолокации и ASN). Каждый из этих четырёх флагов выводится как отдельное булево значение в объекте
network вебхука — в публичном payload нет разбивки по методам и оценки уверенности.
| Флаг | Поле | Значение |
|---|---|---|
| VPN | network.vpn | IP принадлежит известному VPN-провайдеру |
| Proxy | network.proxy | IP является датацентровым или резидентным прокси |
| Tor | network.tor | IP является известным выходным узлом Tor |
| Datacenter | network.datacenter | IP принадлежит облачному/хостинг-провайдеру |
{ "network": { "vpn": true, "proxy": true, "tor": false, "datacenter": false, "connection_type": "VPN" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}Датацентровые и резидентные прокси оба отображаются как network.proxy; происхождение
из датацентра дополнительно сообщается как network.datacenter. Классификация берётся из
базы прокси IP2Location, которая охватывает крупные облачные/хостинг-провайдеры (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr и другие).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connection_type": "DCH" }}network.proxy классифицирует адрес, с которого пришло соединение. Отдельная проверка
сравнивает трафик страниц визита с его сырым сетевым путём: если они уходят через разные
сети, между браузером и вашим сайтом стоит прокси или VPN, и визит помечается как
network.proxy_detected: true. Два адреса одного провайдера — NAT оператора, второй выход
того же VPN — не считаются.
На тарифах Business и выше публичный адрес, замеченный за прокси или VPN, отдаётся рядом с
адресом, с которого пришло соединение, вместе со страной и ISP — в поле network.real_ip. Оно
отсутствует, если такого адреса не наблюдалось, поэтому читайте его с защитой
(network.real_ip?.country); country и isp отсутствуют, если их не удалось определить.
{ "network": { "proxy": false, "proxy_detected": true, "real_ip": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}В Webhooks оба поля приходят под теми же именами при каждом визите. В
сводке посетителя в Data API они агрегированы как
network.proxy_detected_seen (был ли когда-либо прокси перед браузером) и
network.last_real_ip (последний наблюдавшийся адрес вместе с его страной и ISP).
Совпадение подключающегося IP с выходным узлом Tor отображается как network.tor. Отдельно
сам браузер Tor распознаётся на стороне клиента по его конфигурации защиты от
фингерпринтинга — независимо от сетевого пути — см.
Smart Signals.
Геолокация на уровне города определяется на стороне сервера по подключающемуся IP
(MaxMind) и доставляется в объекте geo вебхука.
| Поле | Тип | Описание | Тариф |
|---|---|---|---|
geo.country | string | Код страны ISO 3166-1 alpha-2 | Все |
geo.city | string | Название города | Все |
geo.lat | number | Приблизительная широта | Все |
geo.lon | number | Приблизительная долгота | Все |
geo.timezone | string | Идентификатор часового пояса IANA | Все |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}На тарифах Business и Enterprise дополнительно определяется оператор связи. В payload
вебхука оба поля лежат на объекте network, а ISP дублируется в geo.isp:
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}При чтении сессии через Data API раскладка немного другая:
isp лежит только на geo, а asn — на network. Данные те же, поверхности две —
читайте поле оттуда, куда его кладёт используемая вами поверхность.
На тарифах Pro и выше вебхук несёт блок velocity — насколько активно посетитель
перемещался в последнее время:
| Поле | Тип | Описание |
|---|---|---|
velocity.events5m | number | События этого посетителя за последние 5 минут |
velocity.unique_ips | number | Различные IP, замеченные у этого посетителя |
velocity.unique_locations | number | Различные локации, замеченные у этого посетителя |
Блок присутствует, когда счётчики посетителя доступны на момент события
(как правило, фаза primary). Отсутствие блока означает «нет данных», а не нули —
не трактуйте его отсутствие как «необычной активности нет».
Сопоставление с IP-блок-листами не входит в публичный контракт: ни payload вебхука, ни
дашборд не раскрывают категории блок-листов. Поверхность вебхука для сетевых рисков — это
булевы флаги network, proxy_detected, объект real_ip на Business, тип соединения и
счётчики velocity выше; используйте их вместе с полями decision и bot (см.
Smart Signals) для принятия решений о риске.
Здесь напрямую читается объект network из payload вебхука. Полный payload и проверку подписи смотрите в разделе
Webhooks.
// `payload` is the webhook delivery body (/docs/webhooks)function assessIPRisk(payload: WebhookPayload) { const { vpn, proxy, tor, datacenter } = payload.network
const risks: string[] = [] let riskLevel = "low"
if (tor) { risks.push("Tor exit node") riskLevel = "critical" }
if (vpn) { risks.push("VPN detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (proxy) { risks.push("Proxy detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (datacenter) { risks.push("Datacenter IP") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
return { riskLevel, risks }}