CashoutGuard

Dokumentasi

Satu script di browser, satu panggilan API dari server Anda. Semua yang Anda perlukan untuk go live, dalam satu halaman.

Quick start

Anda memerlukan public key (pk_...) untuk browser dan secret key (sk_...) untuk server. Keduanya ada di dashboard, di menu Situs dan key.

1. Tambahkan script

Pasang tag ini di halaman tempat pengguna mendaftar, login, mengklik offer, atau mengajukan cashout. Script menginisialisasi dirinya sendiri dari data-key

<script src="https://cashoutguard.com/v1/agent.js" data-key="pk_live_YOUR_PUBLIC_KEY" async></script>

2. Kumpulkan dan kirim request_id ke server Anda

Panggil collect() di momen yang penting, dengan nama event-nya. Hasilnya berupa { request_id, visitor_id }

const { request_id } = await CashoutGuard.collect({ event: 'cashout' });

collect() tidak pernah reject. Jika gagal (diblokir, offline, timeout), hasilnya request_id: null beserta string error. Tetap kirim form-nya dan biarkan server Anda yang memutuskan.

3. Minta keputusan dari server Anda

Kirim POST event ke /v1/evaluate dengan secret key Anda di header Authorization: Bearer sk_live_...

Jangan pernah menaruh secret key di kode browser atau aplikasi mobile. Hanya server Anda yang boleh memanggil /v1/evaluate.

Request evaluate

POST https://cashoutguard.com/v1/evaluate menilai satu event untuk satu akun, menghubungkannya dengan perangkat, jaringan, dan alamat payout-nya, lalu mengembalikan keputusan. Kirim dalam format JSON.

FieldTipeWajibDeskripsi
eventstringWajibsignup, login, offer_click, conversion, cashout, atau custom.
account_idstringWajibID pengguna Anda, maksimal 191 karakter. Gunakan ID acak, bukan email.
request_idstringOpsionalDari collect() di browser. Berlaku 1 jam. Tanpa ini kami hanya punya data jaringan.
ipstringOpsionalIP pengguna. Hanya diperlukan jika Anda tidak punya request_id, misalnya untuk postback.
emailstringOpsionalDisimpan sebagai hash. Mendeteksi domain email sekali pakai dan email yang dipakai bersama antar akun.
payout_addressstringOpsionalEmail PayPal, wallet, atau rekening tujuan uang. Disimpan sebagai hash.
payout_methodstringOpsionalTeks bebas seperti paypal, usdt, atau giftcard.
amountnumberOpsionalJumlah cashout atau konversi.
currencystringOpsionalKode mata uang, misalnya USD. Default USD untuk cashout.
offer_idstringOpsionalID offer, untuk offer_click dan conversion. Dipakai untuk kecepatan offer.
offer_countrystringOpsionalNegara yang dibayar offer (kode ISO, mis. US), pada konversi. Pengguna di negara lain ditandai.
geo_countrystringOpsionalGeolokasi Anda sendiri untuk IP pengguna (kode ISO). Jika berbeda dengan milik kami, IP itu kemungkinan exit proxy.
transaction_idstringOpsionalID transaksi konversi dari jaringan. Dipakai untuk menangkap duplikat.
offer_namestringOpsionalJudul penawaran seperti yang dilihat pengguna Anda. Ditampilkan di seluruh dasbor menggantikan id mentah.
click_idstringOpsionalId klik Anda. Kirim nilai yang sama pada offer_click dan konversi agar keduanya terhubung.
sourcestringOpsionalAsal peristiwa, misalnya nama offerwall atau jaringan.
metaobjectOpsionalHingga 20 kolom teks tambahan yang disimpan bersama peristiwa (misalnya sub id).

Response

Bentuk response selalu sama. Field yang tidak relevan bernilai null.

  • score bernilai 0 sampai 100. Alasan-alasan digabungkan sehingga beberapa sinyal sedang bisa saling menambah tanpa melewati 100.
  • reasons berisi setiap sinyal yang terpicu, dari yang terkuat, beserta bobot, detail, dan label bahasa Inggris sederhana yang bisa langsung ditampilkan.
  • device.confidence menunjukkan seberapa unik perangkat tersebut. Fingerprint bisa dipalsukan, jadi kami tidak pernah mengklaim kepastian.
  • linked_accounts berisi akun lain yang memakai perangkat, alamat payout, atau email yang sama dengan akun ini.
  • cashout hanya diisi untuk event cashout dan menunjukkan statusnya di antrean review Anda.

Keputusan dan action

Bertindaklah berdasarkan field action, bukan decision. Ambang batas di bawah ini adalah default dan bisa diubah per situs di dashboard.

KeputusanSkor (default)action di shadowaction di enforceYang harus dilakukan
allow0-49allowallowLanjutkan seperti biasa.
review50-79allowreviewTahan cashout atau minta verifikasi tambahan. Akan muncul di antrean review Anda.
block80-100allowblockHentikan tindakannya. Bekukan saldo atau tolak pendaftaran.

Dalam shadow mode, action selalu allow, jadi kode yang sama aman dirilis sebelum Anda menerapkan enforce. Saat beralih ke enforce, tidak ada yang berubah di kode Anda.

Jenis event

Kirim event yang Anda punya. Signup dan cashout paling penting; conversion menjadi dasar pengecekan kecepatan offer.

EventKapan dikirimYang ditangkap
signupAkun dibuatMulti-akun, bot, pendaftaran lewat VPN, email sekali pakai
loginLogin berhasilBerbagi akun, perubahan negara, perangkat baru
offer_clickPengguna membuka offerMulai menghitung waktu untuk kecepatan offer
conversionPostback dari offerwall atau jaringanOffer selesai terlalu cepat, transaksi duplikat, lonjakan konversi
cashoutPengguna mengajukan penarikanAlamat payout yang dipakai bersama, velocity cashout, cashout dari akun baru
customApa pun yang ingin Anda nilaiSinyal perangkat dan jaringan

Offerwall dan postback

Konversi offerwall datang lewat postback, dari server ke server, tanpa browser. CashoutGuard menghubungkan setiap konversi ke klik yang memulainya, sehingga dinilai dengan perangkat dan jaringan klik tersebut.

1. Saat pengguna membuka penawaran

Kumpulkan di browser dan kirim offer_click dengan penawaran dan id klik Anda.

2. Saat postback tiba

Kirim conversion dari handler postback Anda dengan account_id dan click_id yang sama. Tidak perlu request_id. Sertakan IP pengguna jika offerwall memberikannya.

Konversi diperiksa untuk: selesai terlalu cepat untuk penawaran itu, konversi tanpa klik, klik dan konversi dari negara berbeda, pendapatan jauh di atas hari biasa akun, dan id transaksi ganda.

Jaringan offerwall

Jika Anda menjalankan jaringan dengan banyak publisher, kirim id akun yang menyertakan publisher dan aktifkan "Mode jaringan offerwall" di Situs. Akun hanya ditautkan dalam publisher yang sama, karena wajar jika satu orang memakai beberapa situs publisher Anda. Format: publisher_id:user_id

Katalog penawaran

POST /v1/offers mengirim nama penawaran Anda (hingga 1.000 per panggilan). Peristiwa lama dan baru akan menampilkan nama asli meskipun hanya membawa id.

Kode alasan

Kode-kode ini muncul di reasons[].code. Tampilkan teksnya ke moderator Anda; gunakan kodenya di logika Anda.

KodeArtiGrupBobot
ip_torExit node TorJaringan60
ip_vpnKoneksi VPNJaringan45
ip_datacenterIP datacenter / hostingJaringan40
timezone_mismatchZona waktu browser tidak cocok dengan lokasi IPJaringan20
webrtc_ip_leakIP asli bocor dari negara lainJaringan30
ip_multi_timezoneIP yang sama dengan banyak zona waktu berbeda (proxy)Jaringan50
proxy_farm_ipBeberapa akun di satu IP, semuanya dengan jam negara lain yang sama (proxy bersama)Jaringan60
provider_rotationBanyak penyedia internet dalam beberapa hari, dengan jam negara lain (proxy residensial berputar)Jaringan45
privacy_relayiCloud Private Relay (fitur privasi)Jaringan5
proxy_headersPermintaan lewat proxyJaringan20
geo_sources_disagreeSumber geolokasi tidak samaJaringan45
ip_shared_with_accountsIP yang sama dipakai akun lain hari iniJaringan25
country_changedNegara berubahJaringan15
impossible_travelPerjalanan mustahil: IP dari dua negara berjauhan dalam beberapa jamJaringan50
locale_country_mismatchBahasa browser dari negara lainJaringan30
phone_country_mismatchTelepon dari negara lain dari IPJaringan20
ip_flagged_on_networkIP diblokir di situs lainJaringan25
device_shared_with_accountsPerangkat dipakai bersama akun lainPerangkat55
automation_detectedBot atau alat otomatisasiPerangkat70
auto_clickerAuto-clicker di ponselPerangkat55
scripted_behaviorHalaman dipakai oleh skripPerangkat45
emulator_or_vmEmulator atau mesin virtualPerangkat45
browser_tamperingBrowser dimanipulasi / spoofingPerangkat35
device_rootedPonsel di-rootPerangkat25
incognitoMode penyamaranPerangkat10
device_spoofedModel ponsel palsuPerangkat55
emulator_profileProfil bawaan emulatorPerangkat60
cloud_phonePonsel cloudPerangkat60
phone_farm_displayLayar peternakan ponselPerangkat45
device_market_mismatchPonsel khusus China di luar negeriPerangkat25
storage_cleared_reappearedHapus cookie lalu kembali lagiPerangkat15
no_device_dataTidak ada data perangkatPerangkat15
request_reusedToken perangkat dipakai ulang oleh akun lainPerangkat40
device_farm_proxyPeternakan ponsel lewat proxy residensialPerangkat85
device_clonesKlon perangkat: satu ponsel yang mengatur ulang identitasnya agar tampak sebagai banyak akun baru di satu jaringanPerangkat55
payout_address_sharedAlamat payout dipakai akun lainAkun70
email_disposableEmail sekali pakaiAkun25
email_invalidAlamat email yang tidak bisa menerima surat (domain email tidak ada)Akun35
email_sharedEmail sama dengan akun lainAkun50
phone_sharedNomor telepon dipakai akun lainAkun50
phone_voipNomor VoIP atau virtualAkun40
phone_invalidNomor telepon tidak validAkun30
many_devices_per_accountTerlalu banyak perangkat di satu akunAkun20
flagged_on_networkDitandai di situs lain yang dilindungi CashoutGuardAkun45
face_same_personWajah sama dengan akun lainAkun0
offer_completed_too_fastOffer selesai terlalu cepat, tidak masuk akalPerilaku40
slow_after_clickKonversi lama setelah klikPerilaku0
conversion_velocityTerlalu banyak konversi per jamPerilaku30
conversion_without_clickKonversi tanpa klik dari wall AndaPerilaku35
click_conversion_country_mismatchKlik di satu negara, konversi di negara lainPerilaku30
offer_country_mismatchNegara offer berbeda dari penggunaPerilaku45
click_velocityTerlalu banyak klik offer dalam beberapa menitPerilaku35
earnings_spikePendapatan jauh di atas pengguna normalPerilaku30
source_high_reversalsSumber dengan banyak chargebackPerilaku45
offer_high_reversalsPenawaran dengan banyak chargebackPerilaku35
duplicate_transactionID transaksi duplikatPerilaku60
offer_repeated_other_publisherPenawaran yang sama sudah dikerjakan lewat publisher lainPerilaku85
offer_repeated_other_accountPenawaran yang sama sudah dikerjakan akun lain di perangkat iniPerilaku85
offer_farm_burstGelombang farm: banyak akun baru dengan perangkat farm di penawaran ini dalam beberapa jamPerilaku30
signup_burstLonjakan pendaftaran: beberapa akun mendaftar dalam hitungan detik dari IP berbedaPerilaku25
face_check_requiredPemeriksaan wajah diperlukan, belum dilakukanPerilaku0
face_check_failedPemeriksaan wajah gagalPerilaku0
publisher_farm_waveGelombang farm dari publisher-nya: sebagian besar akun baru yang dikirim ke penawaran ini berasal dari cloud phone atau emulatorPerilaku55
cashout_velocityTerlalu banyak cashout per hariPerilaku30
new_account_cashoutCashout dari akun yang baru dibuatPerilaku20
blocklistedAda di blocklist AndaDaftar Anda100

Bobot digabungkan dengan noisy-OR: score = 100 x (1 - hasil kali (1 - weight/100)). Dua sinyal bernilai 40 menghasilkan 64, bukan 80. Kecocokan dengan blocklist selalu menghasilkan 100.

Webhook

Atur URL webhook di dasbor. Kami mengirim POST untuk setiap peristiwa yang dinilai block (event.blocked), saat akun berubah menjadi block (account.blocked), dan saat tim Anda memutuskan penarikan (cashout.decided). Abaikan tipe yang tidak Anda pakai.

Setiap request ditandatangani dengan webhook secret Anda. HMAC-SHA256 (hex) dari raw body ada di header X-CashoutGuard-Signature

Balas dengan status 2xx apa pun. Pengiriman yang gagal akan dicoba ulang hingga 5 kali: setelah 10 detik, 1 menit, 5 menit, dan 15 menit.

Status akun

GET /v1/accounts/{account_id} mengembalikan gambaran risiko terkini sebuah akun tanpa membuat event.

POST /v1/accounts/{account_id}/status memungkinkan alat moderasi Anda sendiri mengubah status akun.

  • active: Penilaian normal.
  • allowlisted: Skor dibatasi di bawah ambang review. Untuk pengguna tepercaya dan staf.
  • blocked: Setiap event mengembalikan block dengan skor 100.

Pembatalan & akurasi

POST /v1/outcomes melaporkan apa yang terjadi pada konversi setelah kami beri skor: dibatalkan offerwall atau pengiklan (chargeback) atau dikonfirmasi valid. Kami mencocokkan id Anda dan mengukur mesin pada trafik Anda di halaman Akurasi.

Tanpa kode: unggah ekspor pembatalan bulanan dari offerwall Anda (CSV atau Excel) di halaman Akurasi. Kolom id kami temukan otomatis.

PHP, Node.js, Python, Android

Tidak perlu SDK. Panggilan HTTP biasa dengan timeout singkat sudah cukup. Contoh lengkap untuk cashout:

Error dan batasan

HTTPBodyArti
401missing_or_invalid_secret_keySecret key tidak ada, salah, atau sudah dicabut. Respons menyebut alasannya di "reason" (missing, public_key, unknown_secret, placeholder, malformed) dan cara memperbaikinya di "hint".
404not_foundAkun tidak ditemukan (endpoint akun).
422{ "message", "errors" }Body tidak valid. errors mencantumkan setiap field.
429Too Many RequestsBatas rate tercapai. API server mengizinkan 3.000 request per menit per situs.
401 · agent.jsunknown_public_keydata-key bukan kunci publik situs mana pun. Salin lagi pk_live_... dari Instalasi.
403 · agent.jsorigin_not_allowedDomain halaman tidak ada di origin yang diizinkan untuk situs. Tambahkan di Situs atau kosongkan daftarnya. localhost selalu bisa. agent.js juga menjelaskannya di konsol browser. WebView aplikasi mengirim origin "null": tambahkan null ke daftar untuk menerimanya. SDK Android native tidak memerlukan apa pun.
403account_suspendedAkun ditangguhkan, biasanya karena tagihan belum dibayar. Periksa Penagihan.
503temporarily_unavailableGangguan singkat di pihak kami. Izinkan aksinya dan coba lagi nanti.

Fail open: jika panggilan timeout atau error, izinkan tindakannya dan catat di log. Jangan biarkan gangguan di pihak kami menghentikan pengguna Anda.