TRACIO analiza la dirección IP de cada visitante en el servidor. Marca VPN, proxies, nodos de salida de Tor y orígenes de datacenter, y resuelve la geolocalización a nivel de ciudad y el ASN. Todo el análisis se ejecuta en el servidor, sin dependencias del cliente.
IP Intelligence llega a su aplicación a través del payload del webhook: el
objeto network (booleanos de VPN/proxy/Tor/datacenter más el tipo de conexión) y el
objeto geo (país, ciudad, coordenadas, zona horaria, ISP) se entregan en cada
webhook. Consulte Webhooks para la forma completa del payload y la verificación
de firma.
La clasificación de VPN, proxy, Tor y datacenter se resuelve a partir de la IP de conexión
usando bases de datos comerciales de IP intelligence (IP2Location para el tipo de VPN/proxy/Tor,
MaxMind para la geolocalización y el ASN). Cada una se expone como un único booleano en el
objeto network del webhook: no hay desglose por método ni puntuación de confianza en
el payload público.
| Flag | Campo | Significado |
|---|---|---|
| VPN | network.vpn | La IP pertenece a un proveedor de VPN conocido |
| Proxy | network.proxy | La IP es un proxy de datacenter o residencial |
| Tor | network.tor | La IP es un nodo de salida de Tor conocido |
| Datacenter | network.datacenter | La IP pertenece a un proveedor de cloud/hosting |
{ "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}Los proxies de datacenter y residenciales se exponen ambos como network.proxy; el origen
de datacenter se reporta adicionalmente como network.datacenter. La clasificación proviene
de la base de datos de proxies de IP2Location, que cubre los principales proveedores de cloud/hosting (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr y otros).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}Una coincidencia de nodo de salida de Tor en la IP de conexión se expone como network.tor. Por separado,
el propio navegador Tor se detecta en el cliente mediante su configuración anti-fingerprinting
(resistencia de canvas/WebGL, zona horaria UTC, tamaño de pantalla redondeado) — consulta
Smart Signals.
La geolocalización a nivel de ciudad y el ASN se resuelven en el servidor a partir de la IP de conexión
(MaxMind) y se entregan en el objeto geo del webhook.
| Campo | Tipo | Descripción |
|---|---|---|
geo.country | string | Código de país ISO 3166-1 alpha-2 |
geo.city | string | Nombre de la ciudad |
geo.lat | number | Latitud aproximada |
geo.lon | number | Longitud aproximada |
geo.timezone | string | Identificador de zona horaria IANA |
geo.isp | string | Nombre del proveedor de servicios de internet |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}La coincidencia con listas de bloqueo de IP y el seguimiento de velocidad (actividad cruzada entre IP / entre países)
no forman parte del contrato público actual. Ni el payload del webhook ni
el panel exponen categorías de listas de bloqueo ni intervalos de velocidad. La superficie del webhook
para el riesgo de red se limita a los flags booleanos de network y al
tipo de conexión; úselos junto con los campos decision y bot (consulte
Smart Signals) para las decisiones de riesgo.
Esto lee directamente el objeto network del payload del webhook. Consulte
Webhooks para el payload completo y la verificación de firma.
// `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 }}