--- title: Pencegahan penipuan — Penipuan iklan --- # Penipuan iklan Ini adalah **panduan skenario**. Integrasi inti tidak berubah — Anda memuat [Web SDK](../web-sdk), membaca sebuah [verdict](../verdict-reference), dan menarik data dari [Data API](../data-api) persis seperti yang dijelaskan di halaman-halaman itu. Halaman ini menambahkan sedikit spesifik yang hanya dibutuhkan skenario penipuan iklan. Perlindungan penipuan iklan menyaring bot dan trafik tidak valid dari kampanye berbayar, sehingga advertiser dan platform iklan membayar untuk klik dan impresi yang asli — bukan volume palsu. Yang membuatnya berbeda dari kasus penggunaan lain adalah bahwa **pihak ketiga mengirimkan pengunjung**, dan kedua belah pihak perlu menyepakati kesimpulan manusia / bot per-klik yang independen. ## Pemblokiran real-time di sumbernya Fraud Prevention berjalan inline di titik masuk dan mengembalikan verdict secara real-time — ini bukan laporan setelah kejadian. Siapa pun yang memiliki halaman tempat pengunjung mendarat dapat bertindak atas verdict itu seketika: - **Advertiser** menjalankan SDK pada landing page: trafik tidak valid terdeteksi — dan opsional diberi challenge — pada saat ia tiba, sebelum masuk ke funnel atau mendistorsi pelaporan. - **Platform trafik** menjalankan SDK pada pre-lander atau halaman redirect mereka sendiri: sebuah klik diverifikasi *sebelum* diteruskan, sehingga bot dihentikan di pintu masuk dan tidak pernah menjadi trafik yang terkirim. Satu-satunya syarat adalah halaman yang dapat menjalankan SDK: sebuah verdict membutuhkan sinyal browser, jadi 302 murni di sisi server tidak punya tempat untuk mengumpulkannya — tambahkan sebuah interstitial ringan dan pemblokiran real-time yang sama akan berlaku. Click token bertanda tangan dan Data API berada di atasnya untuk rekonsiliasi antar kedua sisi; pemblokiran inline real-time adalah mekanisme utama, dan pembersihan API setelahnya adalah cadangan untuk trafik tanpa interstitial. ## Dua peran - **Advertiser** — memiliki landing page tempat pengunjung tiba. Menjalankan Web SDK pada halaman tersebut untuk mendapatkan verdict bagi setiap kunjungan yang datang, dan menarik verdict dari Data API untuk merekonsiliasi apa yang ditagihkan kepadanya. - **Provider** (sumber trafik / iklan) — mengirimkan klik. Ia perlu **membuktikan kualitas dari apa yang dikirimnya**, sehingga ia menerbitkan sebuah click token per klik dan kemudian menggabungkan laporan pengirimannya dengan verdict independen. Kedua belah pihak mengautentikasi ke [Data API](../data-api) dengan kredensial aplikasi mereka sendiri dan membaca verdict per-klik yang sama, yang memungkinkan mereka merekonsiliasi tanpa saling mempercayai log mentah satu sama lain. ## Alur ujung-ke-ujung Urutan di bawah menunjukkan bagaimana satu klik berjalan dari pengiriman provider, melalui pengunjung dan landing page advertiser, hingga satu verdict yang **kemudian dibaca oleh kedua akun dari sisi mereka masing-masing**. ```mermaid sequenceDiagram autonumber participant P as Provider (akun B) participant V as Pengunjung participant A as Halaman advertiser + SDK participant F as Fraud Prevention API P->>P: Tanda tangani click_token (bot_kid + secret, membawa pkid) P->>V: Kirim tautan dengan ?_ctk=click_token V->>A: Klik → mendarat di halaman advertiser (URL membawa _ctk) A->>A: SDK membaca _ctk dari URL A->>F: POST terenkripsi /bot/verify
(app_key = advertiser, click_token = ditandatangani provider) F->>F: app_key → advertiser_app_id,
verifikasi pkid → provider_app_id, capai verdict,
tulis satu baris membawa kedua app_id F-->>A: verdict → onVerdict A->>A: Tangani sesuai verdict.action (catat / blokir / challenge) Note over P,F: Rekonsiliasi (lintas-akun) A->>F: GET /v1/bot dengan App-Key advertiser F-->>A: Baris yang sama (cocok pada advertiser_app_id) P->>F: GET /v1/bot dengan App-Key provider F-->>P: Baris yang sama (cocok pada provider_app_id) ``` Properti yang menentukan: **kedua app_id berada pada baris yang sama.** Advertiser membacanya yang dicocokkan pada `advertiser_app_id`, provider membacanya yang dicocokkan pada `provider_app_id` — dua akun berbeda, masing-masing menanyakan dengan App-Key-nya sendiri, masing-masing tiba pada verdict independen yang sama. Tidak ada pihak yang harus mengekspos atau mempercayai log mentah pihak lain untuk menyepakati apa yang terjadi pada suatu klik. ## Click token Sebuah **click token** mengikat klik yang dikirim provider ke verdict yang akhirnya diterima kunjungan tersebut. Ia adalah identifier per-klik yang disepakati kedua pihak. Kasus penggunaan Fraud Prevention lainnya tidak membutuhkan click token — mereka merekonsiliasi verdict tanpanya. Alurnya: 1. **Terbitkan** — provider memperoleh click token bertanda tangan (satu per klik) ketika ia mengarahkan pengunjung menuju landing page advertiser. 2. **Bawa pada URL tujuan** — tambahkan token yang diterbitkan ke landing URL sebagai parameter query: ``` https://advertiser.example/lp?click_token=ct_xxxxxxxx ``` 3. **Baca pada halaman** — [Web SDK](../web-sdk) membaca token dari URL secara otomatis. Jika Anda memakai nama parameter berbeda, atur `tokenParam`: ```js BotSignal.init({ appKey: 'YOUR_APP_KEY', tokenParam: 'click_token' }); ``` 4. **Rekonsiliasi** — cari klik tersebut nanti via Data API dan gabungkan kembali ke laporan pengiriman provider. ::: info Token sudah ditandatangani saat diterbitkan kepada Anda — Anda hanya perlu **membawanya hingga ke landing URL**. Tidak ada yang perlu ditandatangani atau dihitung di sisi Anda. ::: ### Opsi `tokenParam` Web SDK memperoleh satu opsi tambahan dalam skenario ini: | Opsi | Tipe | Default | Deskripsi | | --- | --- | --- | --- | | `tokenParam` | string | terdeteksi otomatis | Nama parameter query URL yang membawa click token provider (mis. `click_token`). SDK membacanya dari URL halaman dan mengikat verdict ke klik tersebut. Biarkan tidak diatur jika Anda tidak memakai click token. | ## Rekonsiliasi & penyelesaian Setelah kunjungan membawa click token, kedua belah pihak menyepakati verdict independen yang sama: - **Ambil verdict satu klik** — misalnya untuk membantah atau mengonfirmasi satu klik: ```bash GET /v1/bot/verdict?click_token=ct_xxx X-App-Key: YOUR_APP_KEY X-App-Secret: YOUR_APP_SECRET ``` - **Ekspor baris per-klik** — tarik rentang waktu dan gabungkan `click_token` setiap baris kembali ke log klik Anda sendiri: ```bash GET /v1/bot/export?from=2026-06-01&to=2026-06-30&format=csv X-App-Key: YOUR_APP_KEY X-App-Secret: YOUR_APP_SECRET ``` Setiap baris membawa `click_token` kunjungan (jika ada), timestamp, dan field verdict (`is_bot`, `score`, `level`, `action`). Advertiser mengecualikan klik yang ditandai dan klik bot dari apa yang dibayarnya; provider merekonsiliasi laporan pengirimannya dengan kesimpulan yang sama. Karena keduanya membaca **verdict independen yang sama**, penyelesaian tidak bergantung pada log mentah pihak mana pun. ## Model keamanan `cid` dan click token berjalan di dalam URL, jadi perlakukan keduanya sebagai pengenal — bukan kredensial: - **Membaca verdict memerlukan App-Key + App-Secret.** Data API mengautentikasi setiap panggilan dengan app secret Anda (dibandingkan dalam waktu konstan) dan hanya mengembalikan baris tempat aplikasi Anda berperan sebagai advertiser atau provider. Sebuah `cid` sendirian tidak mengambil apa pun — pihak ketiga yang menyalinnya dari URL tidak punya secret dan bukan bagian dari baris itu. - **Provider terikat oleh tanda tangan.** Click token ditandatangani HMAC dengan secret milik provider dan membawa `pkid` provider; ia tidak dapat dipalsukan, dan sebuah `cid` hanya dapat diklaim satu kali (terlindungi dari replay). - **Opsional, ikat juga advertiser-nya.** Tandatangani `app_key` advertiser tujuan ke dalam token sebagai `aud`. Verifikasi lalu mengharuskan app_key halaman cocok dengan `aud`, sehingga token yang diterbitkan untuk advertiser A tidak dapat mengatribusikan verdict pada advertiser B. Hilangkan `aud` maka halaman advertiser mana pun boleh menerima token tersebut. Efek bersihnya: verdict untuk sebuah `cid` hanya dapat dibaca oleh dua aplikasi yang terikat padanya — advertiser yang halamannya menjalankan SDK dan provider yang token-nya disodorkan — masing-masing mengautentikasi dengan App-Secret-nya sendiri. ## Langkah berikutnya - [Web SDK](../web-sdk) — kumpulkan verdict pada landing page - [Referensi verdict](../verdict-reference) — setiap field dan cara menindaknya - [Data API](../data-api) — tarik dan rekonsiliasi verdict di sisi server