TRACIO menganalisis alamat IP setiap pengunjung di sisi server. Ia menandai VPN, proxy, node keluar Tor, dan asal datacenter, serta menyelesaikan geolokasi tingkat kota. Semua analisis berjalan di sisi server tanpa dependensi di sisi klien.
IP intelligence sampai ke aplikasi Anda melalui payload webhook: objek
network (boolean VPN/proxy/Tor/datacenter, tipe koneksi, dan — pada Pro ke atas —
proxy_detected) dan objek
geo (negara, kota, koordinat, zona waktu) dikirimkan pada setiap
webhook. ISP, ASN, dan objek real_ip ditambahkan pada paket Business ke atas. Lihat
Webhooks untuk bentuk payload lengkap dan verifikasi tanda tangan.
Klasifikasi VPN, proxy, Tor, dan datacenter diselesaikan dari IP yang terhubung
menggunakan basis data IP intelligence komersial (IP2Location untuk tipe VPN/proxy/Tor,
MaxMind untuk geolokasi dan ASN). Masing-masing dari keempat flag ini ditampilkan sebagai satu boolean pada
objek network webhook — tidak ada perincian per-metode atau skor keyakinan dalam
payload publik.
| Flag | Field | Arti |
|---|---|---|
| VPN | network.vpn | IP milik penyedia VPN yang dikenal |
| Proxy | network.proxy | IP adalah proxy datacenter atau residensial |
| Tor | network.tor | IP adalah node keluar Tor yang dikenal |
| Datacenter | network.datacenter | IP milik penyedia cloud/hosting |
{ "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}Proxy datacenter dan residensial keduanya ditampilkan sebagai network.proxy; asal
datacenter juga dilaporkan sebagai network.datacenter. Klasifikasi berasal dari
basis data proxy IP2Location, yang mencakup penyedia cloud/hosting utama (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr, dan lainnya).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connection_type": "DCH" }}network.proxy mengklasifikasikan alamat asal koneksi. Pemeriksaan terpisah membandingkan
trafik halaman sebuah kunjungan dengan jalur jaringan mentahnya: ketika keduanya keluar
melalui jaringan yang berbeda, ada proxy atau VPN di antara browser dan situs Anda, dan
kunjungan tersebut dilaporkan dengan network.proxy_detected: true. Dua alamat dari
penyedia yang sama — carrier NAT, jalur keluar kedua dari VPN yang sama — tidak dihitung.
Pada Business ke atas, alamat publik yang teramati di balik proxy atau VPN dikirimkan
berdampingan dengan alamat asal koneksi, lengkap dengan negara dan ISP-nya, sebagai
network.real_ip. Field ini tidak ada bila alamat seperti itu tidak teramati, jadi bacalah
dengan penjaga (network.real_ip?.country); country dan isp tidak ada bila tidak dapat
diselesaikan.
{ "network": { "proxy": false, "proxy_detected": true, "real_ip": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}Di Webhooks kedua field tiba dengan nama yang sama pada setiap kunjungan.
Ringkasan pengunjung Data API mengagregasikannya sebagai
network.proxy_detected_seen (apakah pernah ada proxy di depan) dan network.last_real_ip
(alamat terbaru, beserta negara dan ISP-nya).
Kecocokan node keluar Tor pada IP yang terhubung ditampilkan sebagai network.tor. Secara terpisah,
Tor Browser itu sendiri dikenali di sisi klien dari konfigurasi anti-fingerprinting-nya,
terlepas dari jalur jaringannya — lihat
Smart Signals.
Geolokasi tingkat kota diselesaikan di sisi server dari IP yang terhubung
(MaxMind) dan dikirimkan pada objek geo webhook.
| Field | Tipe | Deskripsi | Paket |
|---|---|---|---|
geo.country | string | Kode negara ISO 3166-1 alpha-2 | Semua |
geo.city | string | Nama kota | Semua |
geo.lat | number | Perkiraan lintang | Semua |
geo.lon | number | Perkiraan bujur | Semua |
geo.timezone | string | Pengidentifikasi zona waktu IANA | Semua |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}Pada paket Business dan Enterprise, operator juga diidentifikasi. Pada payload webhook,
kedua field berada pada objek network, dan ISP diulang sebagai geo.isp:
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}Saat membaca sesi melalui Data API, pembagiannya sedikit berbeda: isp
hanya berada pada geo dan asn pada network. Data yang sama pada dua permukaan — baca field
dari tempat permukaan yang Anda gunakan meletakkannya.
Pada Pro ke atas, webhook membawa blok velocity — seberapa banyak pengunjung berpindah
belakangan ini:
| Field | Tipe | Deskripsi |
|---|---|---|
velocity.events5m | number | Event dari pengunjung ini dalam 5 menit terakhir |
velocity.unique_ips | number | IP berbeda yang terlihat untuk pengunjung ini |
velocity.unique_locations | number | Lokasi berbeda yang terlihat untuk pengunjung ini |
Blok ini ada ketika penghitung pengunjung tersedia pada saat event (biasanya fase
primary). Blok yang tidak ada berarti “tidak ada data”, bukan nol — jangan
memperlakukan ketiadaannya sebagai “tidak ada aktivitas yang tidak biasa”.
Pencocokan blocklist IP bukan bagian dari kontrak publik: baik payload webhook maupun
dashboard tidak mengekspos kategori blocklist. Permukaan webhook untuk risiko jaringan
adalah flag boolean network, proxy_detected, objek real_ip pada Business, tipe koneksi,
dan penghitung velocity di atas — gunakan
semuanya bersama dengan field decision dan bot (lihat
Smart Signals) untuk keputusan risiko.
Ini membaca objek network dari payload webhook secara langsung. Lihat
Webhooks untuk payload lengkap dan verifikasi tanda tangan.
// `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 }}