Deteksi bot TRACIO mengidentifikasi browser otomatis, alat headless, dan serangan berbasis skrip menggunakan arsitektur dua lapis: pengumpulan di sisi klien oleh browser agent dan analisis di sisi server. Cakupannya meliputi framework otomasi arus utama, browser headless, agen penjelajah AI, dan browser antidetect dengan false positive nyaris nol, sekaligus secara otomatis memasukkan crawler mesin pencari yang sah ke dalam allowlist.
Browser agent menjalankan serangkaian pemeriksaan yang luas dan melaporkan hasilnya.
Di server, hasil-hasil itu dibobot menjadi skor bot, dan skor tersebut dipetakan ke
sebuah verdict. Sejumlah kecil indikator yang tak ambigu bersifat menentukan dengan
sendirinya dan memaksa verdict bot terlepas dari hasil lainnya.
Pemeriksaan mana yang berjalan, bagaimana bobotnya, dan di mana ambangnya berada tidak dipublikasikan — pada paket mana pun. Mendokumentasikannya sama saja dengan memberi tahu operator bot secara persis apa yang harus diubah agar lolos dari proteksi. Sebagai gantinya Anda menerima verdict, label tipe bot, dan — pada paket Business ke atas — kode alasan yang menyebutkan kelas pengamatan di balik keputusan tersebut.
Setiap identifikasi membawa verdict bot. Verdict itu sampai kepada Anda sebagai
bot.result di payload webhook dan sebagai result.bot di SDK
klien.
| Hasil | Deskripsi |
|---|---|
human | Tidak ada indikator otomasi yang ditemukan. Crawler mesin pencari terverifikasi juga menjadi human. |
bot | Otomasi atau akses berbasis skrip terdeteksi. Label bot.type menyertainya. |
uncertain | Sinyal campuran atau lemah — tidak jelas manusia maupun jelas otomatis. |
Ini dipetakan ke field bisnis decision.action (real, fake, atau suspicious)
yang dipakai di seluruh dashboard dan payload webhook.
bot.score menyertai verdict. Pada payload webhook versi 2 nilainya desimal
0..100 — angka yang sama dengan yang ditampilkan dashboard untuk kunjungan itu.
(Pada skema versi 1 yang dibekukan, nilainya pecahan 0..1; lihat
Webhooks.)
bot.type hadir ketika hasilnya bot. Isinya bisa berupa nama bot atau runtime
yang dikenali, atau sebuah famili ketika menyebut pemeriksaan spesifiknya akan
mengungkap cara kerja internal detektor:
bot.type | Arti |
|---|---|
playwright, jsdom, electron | Runtime otomasi yang disebutkan berhasil diidentifikasi |
browser_use, claude_computer_use, skyvern, genspark, fellou | Agen penjelajah AI yang disebutkan berhasil diidentifikasi |
automation | Perkakas otomasi, tanpa menyebut pemeriksaan spesifiknya |
headless | Browser yang berjalan tanpa antarmuka pengguna |
antidetect | Build antidetect / pemalsu fingerprint |
extension | Ekstensi browser yang menjalankan otomasi, proxy, atau VPN |
privacy_browser | Build browser yang diperkuat privasinya (misalnya Mullvad Browser) |
other | Terdeteksi, tetapi di luar kosakata yang dipublikasikan |
Daftar ini sengaja dibuat tertutup: pemeriksaan yang ditambahkan ke detektor besok
akan muncul sebagai other, bukan membocorkan nama internalnya. Perlakukan
bot.type sebagai label untuk percabangan logika, bukan sebagai enum lengkap yang
harus divalidasi — runtime bernama terus bertambah dari waktu ke waktu.
Pada paket Business dan Enterprise, payload webhook membawa array reasons —
maksimal delapan entri, diurutkan berdasarkan tingkat kepentingan. Sebuah kode
menyebutkan kelas pengamatan, tidak pernah pemeriksaan di baliknya:
| Kode | Artinya |
|---|---|
automation_signature | Jejak perkakas otomasi |
headless_browser | Browser tanpa antarmuka pengguna |
anonymous_browser | Build yang diperkuat privasinya atau antidetect yang dibuat tampak biasa |
privacy_hardening | Pengaturan privasi yang agresif |
behavior_anomaly | Pola interaksi yang tidak manusiawi |
fingerprint_tampering | Nilai-nilai yang seharusnya saling cocok ternyata tidak |
environment_anomaly | Lingkungan runtime tidak konsisten secara internal |
identity_mismatch | Identitas yang dinyatakan berbeda dengan yang teramati |
virtual_environment | Emulator, bukan perangkat keras fisik |
strong_automation_evidence | Indikator bot yang tak ambigu — menentukan dengan sendirinya |
detection_signal | Pemeriksaan lain yang terpicu |
severity bernilai high, medium, atau low, dan nilainya adalah porsi verdict
yang disumbangkan kelas ini pada kunjungan tersebut — bukan properti tetap dari
kodenya. Kode yang sama bisa datang sebagai high pada satu kunjungan dan low
pada kunjungan lain, jadi jangan menyimpannya sebagai konstanta.
privacy_hardening perlu perhatian khusus: kode ini terpicu pada pengunjung biasa
yang peduli privasi sama seringnya seperti pada upaya penghindaran. Timbanglah
bersama sinyal lain, jangan bertindak hanya berdasarkan kode ini.
virtual_environment berasal dari deteksi emulator. Di web tidak ada verdict
terpisah "berjalan di bawah hypervisor": petunjuk yang dapat dilihat browser —
renderer perangkat lunak generik, jumlah inti yang luar biasa rendah — sama seringnya
muncul pada mesin biasa tanpa driver GPU dan di dalam sesi remote desktop, jadi kami
tidak mengubahnya menjadi verdict yang harus Anda ragukan lagi.
| Kemampuan | Ketersediaan |
|---|---|
| Deteksi otomasi, headless, dan agen AI | Semua paket |
| Allowlist crawler terverifikasi | Semua paket |
| Deteksi emulator | Semua paket |
Indikator antidetect (bot.antidetectScore, 0..100) | Pro ke atas |
| Kode alasan, blok perilaku | Business ke atas |
| Deteksi DevTools | Business ke atas |
Penilaian antidetect masih dikalibrasi.
bot.antidetectScoredilaporkan agar Anda dapat mengamatinya dan menyetel kebijakan Anda sendiri — perlakukan sebagai masukan bagi keputusan risiko Anda, bukan sebagai alasan tunggal untuk memblokir.
Pemeriksaan khusus mobile tidak efektif di web. Deteksi root, jailbreak, aplikasi kloning/ganda, dan Frida bergantung pada sinyal native yang tidak dapat dikumpulkan browser. TRACIO hanya menyediakan SDK browser, jadi andalkan verdict otomasi, headless, agen AI, antidetect, emulator, dan perilaku yang sepenuhnya aktif di web.
Bot baik yang dikenal diidentifikasi dari user-agent-nya, lalu diverifikasi terhadap IP yang terhubung — pencarian reverse DNS pada IP tersebut, pemeriksaan bahwa hostname yang dihasilkan memang milik domain operatornya, dan pencarian maju yang memastikan hostname itu kembali me-resolve ke IP yang sama. Inilah prosedur verifikasi yang dipublikasikan sendiri oleh para operator crawler.
| Crawler | Domain terverifikasi |
|---|---|
.googlebot.com, .google.com | |
| Bing | .search.msn.com |
| Apple | .applebot.apple.com |
| Yahoo | .crawl.yahoo.net |
| Yandex | .yandex.com, .yandex.net, .yandex.ru |
| DuckDuckGo | .duckduckgo.com |
Crawler terverifikasi menjadi human. Permintaan yang mengaku sebagai Googlebot
padahal IP-nya jelas milik pihak lain diklasifikasikan sebagai bot — sekadar
pencarian yang tidak ditemukan atau timeout tidak dianggap sebagai bukti pemalsuan.
Dinamika interaksi — gerakan pointer, ritme ketikan, scrolling — masuk ke dalam
verdict sebagai bukti apakah ada manusia yang hadir, bukan manusia yang mana.
Pada paket Business ke atas, agregatnya dikirim di blok behavior pada webhook:
{ "behavior": { "score": 87, "verdict": "human", "confidence": 0.92 }}score berkisar 0..100 (makin tinggi makin manusiawi), verdict bernilai
human, uncertain, atau bot, dan confidence (0..1) menyatakan seberapa
banyak bukti yang menopang verdict itu — kunjungan singkat dengan dua gerakan
pointer akan bernilai rendah di sini sekalipun verdict-nya tampak menentukan.
Blok ini hadir hanya ketika penilaian perilaku memang berjalan untuk kunjungan tersebut. Blok yang tidak ada berarti "tidak ada data", tidak pernah berarti "tidak ada yang mencurigakan" — jangan membaca ketiadaannya sebagai sinyal bersih.
SDK klien menyediakan boolean praktis result.bot.detected, plus confidence pada
skala 0..100:
const result = await tracio.getResult()
if (result.bot.detected) { console.warn(`Bot detected (confidence ${result.bot.confidence})`) showCaptcha() return}
await login(credentials)Di server Anda, bertindaklah berdasarkan pengiriman webhook.
Verdict bot berada di objek bot — bot.result dan bot.type:
// `event` is the webhook delivery body (/docs/webhooks)app.post("/webhook/tracio", async (req, res) => { const event = req.body
if (event.bot?.result === "bot") { await db.blockedRequests.insert({ visitorId: event.visitorId, botType: event.bot.type, ip: event.ip, timestamp: new Date(), }) }
res.status(200).send("OK")})Nilai nol dan kosong dihilangkan dari payload, jadi bacalah bot.type secara
defensif alih-alih menjadikannya wajib di skema Anda.
Deteksi bot TRACIO dirancang untuk false positive nyaris nol, tetapi kasus tepi tetap ada:
| Skenario | Risiko | Mitigasi |
|---|---|---|
Ekstensi browser yang mengubah navigator | Rendah | Validasi silang di banyak pemeriksaan mencegah pemicuan oleh satu pemeriksaan |
| Perangkat lunak keamanan korporat | Sangat rendah | Klasifikasi headless menuntut bukti yang menguatkan |
| Alat aksesibilitas | Tidak ada | API aksesibilitas tidak memengaruhi deteksi bot |
| Pengguna VPN/proxy | Tidak ada | Penanda jaringan dilacak terpisah dari verdict bot |
Jika Anda melihat false positive, tinjau bot.type (dan reasons pada Business ke
atas) untuk memahami kelas pengamatan mana yang terpicu, lalu sesuaikan kebijakan
Anda. Lihat Pemecahan Masalah untuk penyebab yang umum.