A TRACIO analisa o endereço IP de cada visitante no servidor. Ela sinaliza VPNs, proxies, nós de saída Tor e origens de datacenter, e resolve geolocalização em nível de cidade e ASN. Toda a análise roda no servidor, sem dependências no lado do cliente.
A IP intelligence chega à sua aplicação através do payload do webhook: o
objeto network (booleanos de VPN/proxy/Tor/datacenter mais o tipo de conexão) e o
objeto geo (país, cidade, coordenadas, fuso horário, ISP) são entregues em cada
webhook. Consulte Webhooks para a forma completa do payload e a
verificação de assinatura.
A classificação de VPN, proxy, Tor e datacenter é resolvida a partir do IP de
conexão usando bancos de dados comerciais de inteligência de IP (IP2Location para
o tipo VPN/proxy/Tor, MaxMind para geolocalização e ASN). Cada uma é exposta como
um único booleano no objeto network do webhook — não há detalhamento por método
nem pontuação de confiança no payload público.
| Sinalização | Campo | Significado |
|---|---|---|
| VPN | network.vpn | O IP pertence a um provedor de VPN conhecido |
| Proxy | network.proxy | O IP é um proxy de datacenter ou residencial |
| Tor | network.tor | O IP é um nó de saída Tor conhecido |
| Datacenter | network.datacenter | O IP pertence a um provedor de nuvem/hospedagem |
{ "network": { "vpn": true, "proxy": false, "tor": false, "datacenter": false, "connectionType": "residential" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}Proxies de datacenter e residenciais aparecem ambos como network.proxy; a origem
de datacenter é adicionalmente reportada como network.datacenter. A classificação
vem do banco de dados de proxy do IP2Location, que cobre os principais provedores
de nuvem/hospedagem (AWS, Google Cloud, Azure, Oracle Cloud, Alibaba Cloud,
DigitalOcean, Hetzner, OVH, Linode/Akamai, Vultr, e outros).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}Uma correspondência de nó de saída Tor no IP de conexão aparece como network.tor.
Separadamente, o próprio Tor Browser é detectado no lado do cliente via sua
configuração anti-fingerprinting (resistência de canvas/WebGL, fuso horário UTC,
tamanho de tela arredondado) — consulte Smart Signals.
A geolocalização em nível de cidade e o ASN são resolvidos no servidor a partir do
IP de conexão (MaxMind) e entregues no objeto geo do webhook.
| Campo | Tipo | Descrição |
|---|---|---|
geo.country | string | Código de país ISO 3166-1 alpha-2 |
geo.city | string | Nome da cidade |
geo.lat | number | Latitude aproximada |
geo.lon | number | Longitude aproximada |
geo.timezone | string | Identificador de fuso horário IANA |
geo.isp | string | Nome do provedor de acesso à internet |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}A correspondência de listas de bloqueio de IP e o rastreamento de velocidade
(atividade cross-IP / cross-país) não fazem parte do contrato público atual.
Nem o payload do webhook nem o dashboard expõem categorias de lista de bloqueio ou
intervalos de velocidade. A superfície do webhook para risco de rede se limita às
sinalizações booleanas de network e ao tipo de conexão; use-as em conjunto com os
campos decision e bot (consulte Smart Signals) para
decisões de risco.
Isto lê diretamente o objeto network do payload do webhook. Consulte
Webhooks para o payload completo e a verificação de assinatura.
// `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 }}