TRACIO analizează adresa IP a fiecărui vizitator pe partea de server. Marchează VPN-uri, proxy-uri, noduri de ieșire Tor și origini de tip datacenter și rezolvă geolocalizarea la nivel de oraș și ASN-ul. Întreaga analiză rulează pe partea de server, fără dependențe pe partea de client.
IP intelligence ajunge în aplicația dvs. prin payload-ul webhook: obiectul
network (valorile booleene VPN/proxy/Tor/datacenter plus tipul de conexiune) și
obiectul geo (țară, oraș, coordonate, fus orar, ISP) sunt livrate cu fiecare
webhook. Consultați Webhooks pentru structura completă a payload-ului și
verificarea semnăturii.
Clasificarea VPN, proxy, Tor și datacenter este rezolvată pe baza IP-ului de conectare
folosind baze de date comerciale de IP intelligence (IP2Location pentru tipul VPN/proxy/Tor,
MaxMind pentru geolocalizare și ASN). Fiecare este expusă ca o singură valoare booleană în
obiectul network al webhook-ului — nu există o defalcare pe metode sau un scor de încredere în
payload-ul public.
| Flag | Câmp | Semnificație |
|---|---|---|
| VPN | network.vpn | IP-ul aparține unui furnizor VPN cunoscut |
| Proxy | network.proxy | IP-ul este un proxy datacenter sau residential |
| Tor | network.tor | IP-ul este un nod de ieșire Tor cunoscut |
| Datacenter | network.datacenter | IP-ul aparține unui furnizor 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}Proxy-urile de tip datacenter și residential apar ambele ca network.proxy; originea de tip datacenter
este raportată suplimentar ca network.datacenter. Clasificarea provine din
baza de date de proxy IP2Location, care acoperă principalii furnizori cloud/hosting (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr și alții).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}O potrivire cu un nod de ieșire Tor pe IP-ul de conectare apare ca network.tor. Separat,
browserul Tor în sine este detectat pe partea de client prin configurația sa anti-fingerprinting
(rezistență canvas/WebGL, fus orar UTC, dimensiune a ecranului rotunjită) — consultați
Smart Signals.
Geolocalizarea la nivel de oraș și ASN-ul sunt rezolvate pe partea de server din IP-ul de conectare
(MaxMind) și livrate în obiectul geo al webhook-ului.
| Câmp | Tip | Descriere |
|---|---|---|
geo.country | string | Cod de țară ISO 3166-1 alpha-2 |
geo.city | string | Numele orașului |
geo.lat | number | Latitudine aproximativă |
geo.lon | number | Longitudine aproximativă |
geo.timezone | string | Identificator de fus orar IANA |
geo.isp | string | Numele furnizorului de internet |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}Potrivirea cu liste de blocare IP și urmărirea velocity (activitate între IP-uri / între țări)
nu fac parte din contractul public actual. Nici payload-ul webhook, nici
dashboard-ul nu expun categorii de liste de blocare sau intervale de velocity. Suprafața
webhook pentru riscul de rețea se limitează la flag-urile booleene network și
tipul de conexiune; folosiți-le împreună cu câmpurile decision și bot (consultați
Smart Signals) pentru deciziile de risc.
Aceasta citește direct obiectul network din payload-ul webhook. Consultați
Webhooks pentru payload-ul complet și verificarea semnăturii.
// `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 }}