CashoutGuard

Dokümantasyon

Tarayıcıda tek bir script, sunucunuzdan tek bir API çağrısı. Yayına geçmek için gereken her şey tek sayfada.

Hızlı başlangıç

Tarayıcı için public key'inize (pk_...) ve sunucunuz için secret key'inize (sk_...) ihtiyacınız var. İkisi de panelde, Siteler ve anahtarlar bölümünde.

1. Script'i ekleyin

Bu etiketi kullanıcıların kayıt olduğu, giriş yaptığı, offer'lara tıkladığı veya cashout talep ettiği sayfalara ekleyin. Kendini şu öznitelikten başlatır: data-key

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

2. request_id'yi toplayıp sunucunuza gönderin

Önemli anda collect() fonksiyonunu olay adıyla çağırın. Dönen değer: { request_id, visitor_id }

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

collect() asla reject etmez. Başarısız olursa (engellendi, çevrimdışı, zaman aşımı) request_id: null ve bir hata metniyle resolve olur. Formu yine de gönderin, kararı sunucunuz versin.

3. Sunucunuzdan karar isteyin

Olayı, secret key'iniz header'da olacak şekilde /v1/evaluate adresine POST edin: Authorization: Bearer sk_live_...

Secret key'i asla tarayıcı koduna veya mobil uygulamaya koymayın. /v1/evaluate yalnızca sunucunuz tarafından çağrılmalı.

Evaluate isteği

POST https://cashoutguard.com/v1/evaluate bir hesap için tek bir olayı puanlar, onu cihazı, ağı ve ödeme adresiyle ilişkilendirir ve bir karar döndürür. JSON gönderin.

AlanTürZorunluAçıklama
eventstringZorunlusignup, login, offer_click, conversion, cashout veya custom.
account_idstringZorunluKullanıcı ID'niz, en fazla 191 karakter. E-posta değil, anlamsız (opaque) bir ID kullanın.
request_idstringİsteğe bağlıTarayıcıdaki collect() fonksiyonundan gelir. 1 saat geçerlidir. Bu olmadan elimizde yalnızca ağ verisi olur.
ipstringİsteğe bağlıKullanıcının IP'si. Yalnızca request_id'niz yoksa gerekir, örneğin postback'lerde.
emailstringİsteğe bağlıHash olarak saklanır. Tek kullanımlık alan adlarını ve hesaplar arasında paylaşılan e-postaları tespit eder.
payout_addressstringİsteğe bağlıParanın gittiği PayPal e-postası, cüzdan veya hesap. Hash olarak saklanır.
payout_methodstringİsteğe bağlıpaypal, usdt veya giftcard gibi serbest metin.
amountnumberİsteğe bağlıCashout veya dönüşüm tutarı.
currencystringİsteğe bağlıPara birimi kodu, örneğin USD. Cashout'lar için varsayılan USD.
offer_idstringİsteğe bağlıOffer ID'si, offer_click ve conversion için. Offer hızı hesabında kullanılır.
offer_countrystringİsteğe bağlıTeklifin ödeme yaptığı ülke (ISO kodu, ör. US), dönüşümlerde. Başka ülkedeki kullanıcı işaretlenir.
geo_countrystringİsteğe bağlıKullanıcı IP'sinin kendi konum veriniz (ISO kodu). Bizimkiyle uyuşmazsa IP muhtemelen bir proxy çıkışıdır.
transaction_idstringİsteğe bağlıBir dönüşümün ağ tarafındaki işlem ID'si. Mükerrerleri yakalamak için kullanılır.
offer_namestringİsteğe bağlıKullanıcılarınızın gördüğü teklif başlığı. Panelde ham kimlik yerine her yerde gösterilir.
click_idstringİsteğe bağlıTıklama kimliğiniz. Bağlanmaları için offer_click ve dönüşümde aynı değeri gönderin.
sourcestringİsteğe bağlıOlayın kaynağı, örneğin offerwall veya ağ adı.
metaobjectİsteğe bağlıOlayla birlikte saklanan en fazla 20 ek metin alanı (örneğin sub kimlikleri).

Yanıt

Yanıt her zaman aynı yapıdadır. Geçerli olmayan alanlar null olur.

  • score 0 ile 100 arasındadır. Nedenler birleştirilir; böylece birkaç orta düzey sinyal 100'ü aşmadan toplanır.
  • reasons tetiklenen her sinyali, en güçlüden başlayarak ağırlığı, ayrıntıları ve olduğu gibi gösterebileceğiniz sade İngilizce bir etiketle listeler.
  • device.confidence cihazın ne kadar benzersiz göründüğünü söyler. Fingerprint'ler taklit edilebilir, bu yüzden asla kesinlik iddia etmeyiz.
  • linked_accounts bu hesapla aynı cihazı, ödeme adresini veya e-postayı paylaşan diğer hesapları listeler.
  • cashout yalnızca cashout olaylarında doldurulur ve inceleme kuyruğunuzdaki durumu gösterir.

Kararlar ve action

decision alanına göre değil, action alanına göre hareket edin. Aşağıdaki eşikler varsayılandır ve panelden site bazında değiştirilebilir.

KararSkor (varsayılan)shadow'da actionenforce'ta actionNe yapmalı
allow0-49allowallowNormal şekilde devam edin.
review50-79allowreviewCashout'u bekletin veya ek doğrulama isteyin. İnceleme kuyruğunuzda görünür.
block80-100allowblockİşlemi durdurun. Bakiyeyi dondurun veya kaydı reddedin.

Shadow modunda action her zaman allow olur, bu yüzden aynı kodu enforce'a geçmeden önce güvenle yayına alabilirsiniz. Enforce'a geçtiğinizde kodunuzda hiçbir şey değişmez.

Olay türleri

Elinizdeki olayları gönderin. En önemlileri signup ve cashout; conversion olayları offer hızı kontrollerini besler.

OlayNe zaman gönderilirNeyi yakalar
signupHesap oluşturulduğundaÇoklu hesaplar, botlar, VPN ile kayıtlar, tek kullanımlık e-postalar
loginBaşarılı girişHesap paylaşımı, ülke değişiklikleri, yeni cihazlar
offer_clickKullanıcı bir offer açtığındaOffer hızı için sayacı başlatır
conversionOfferwall'dan veya ağdan gelen postbackÇok hızlı tamamlanan offer'lar, mükerrer işlemler, ani dönüşüm artışları
cashoutKullanıcı para çekme talep ettiğindePaylaşılan ödeme adresleri, cashout sıklığı, yeni hesaplardan cashout
customPuanlanmasını istediğiniz diğer her şeyCihaz ve ağ sinyalleri

Offerwall'lar ve postback'ler

Offerwall dönüşümleri postback ile, sunucudan sunucuya, tarayıcı olmadan gelir. CashoutGuard her dönüşümü onu başlatan tıklamaya bağlar; böylece dönüşüm o tıklamanın cihazı ve ağıyla puanlanır.

1. Kullanıcı bir teklifi açtığında

Tarayıcıda toplayın ve teklif ile tıklama kimliğinizle bir offer_click gönderin.

2. Postback geldiğinde

Postback işleyicinizden aynı account_id ve click_id ile bir conversion gönderin. request_id gerekmez. Offerwall veriyorsa kullanıcının IP'sini de iletin.

Dönüşümler şunlar için kontrol edilir: teklif için fazla hızlı tamamlanma, tıklamasız dönüşüm, farklı ülkelerden tıklama ve dönüşüm, hesabın olağan gününün çok üstünde kazanç ve yinelenen işlem kimlikleri.

Offerwall ağları

Çok sayıda yayıncısı olan bir ağ işletiyorsanız, yayıncıyı içeren hesap kimlikleri gönderin ve Siteler bölümünde "Offerwall ağı modu"nu açın. Böylece hesaplar yalnızca aynı yayıncı içinde bağlanır, çünkü bir kişinin yayıncılarınızın birkaç sitesini kullanması normaldir. Biçim: publisher_id:user_id

Teklif kataloğu

POST /v1/offers teklif adlarınızı gönderir (çağrı başına en fazla 1.000). Geçmiş ve gelecek olaylar yalnızca kimlik taşısa bile gerçek adı gösterir.

Neden kodları

Bu kodlar reasons[].code içinde görünür. Metni moderatörlerinize gösterin; mantığınızda kodu kullanın.

KodAnlamıGrupAğırlık
ip_torTor çıkış düğümüAğ60
ip_vpnVPN bağlantısıAğ45
ip_datacenterVeri merkezi / hosting IP'siAğ40
timezone_mismatchTarayıcı saat dilimi IP konumuyla uyuşmuyorAğ20
webrtc_ip_leakGerçek IP başka bir ülkeden sızdıAğ30
ip_multi_timezoneAynı IP'de çok sayıda farklı saat dilimi (proxy çıkışı)Ağ50
proxy_farm_ipTek IP'de, hepsi aynı yabancı saate sahip birden çok hesap (paylaşılan proxy)Ağ60
provider_rotationBirkaç günde birçok internet sağlayıcısı, yabancı saatle (dönen konut proxy'si)Ağ45
privacy_relayiCloud Private Relay (gizlilik özelliği)Ağ5
proxy_headersİstek bir proxy üzerinden geldiAğ20
geo_sources_disagreeKonum kaynakları uyuşmuyorAğ45
ip_shared_with_accountsAynı IP bugün başka hesaplarca da kullanıldıAğ25
country_changedÜlke değiştiAğ15
impossible_travelİmkânsız seyahat: birkaç saat içinde iki uzak ülkeden IPAğ50
locale_country_mismatchBaşka ülkenin tarayıcı diliAğ30
phone_country_mismatchIP'den farklı ülkeden telefonAğ20
ip_flagged_on_networkIP başka sitelerde engellendiAğ25
device_shared_with_accountsCihaz başka hesaplarla ortakCihaz55
automation_detectedBot veya otomasyon aracıCihaz70
auto_clickerTelefonda otomatik tıklayıcıCihaz55
scripted_behaviorSayfa betikle kullanıldıCihaz45
emulator_or_vmEmülatör veya sanal makineCihaz45
browser_tamperingTarayıcı manipülasyonu / sahtecilikCihaz35
device_rootedRoot'lu telefonCihaz25
incognitoGizli taramaCihaz10
device_spoofedSahte telefon modeliCihaz55
emulator_profileEmülatör varsayılan profiliCihaz60
cloud_phoneBulut telefonCihaz60
phone_farm_displayTelefon çiftliği ekranıCihaz45
device_market_mismatchYurt dışında yalnızca Çin'e özel telefonCihaz25
storage_cleared_reappearedÇerezleri silip geri döndüCihaz15
no_device_dataCihaz verisi gönderilmediCihaz15
request_reusedCihaz token'ı başka bir hesapça tekrar kullanıldıCihaz40
device_farm_proxyKonut proxyli telefon çiftliğiCihaz85
device_clonesCihaz klonları: tek bir ağda birçok yeni hesap gibi görünmek için kimliğini sıfırlayan bir telefonCihaz55
payout_address_sharedÖdeme adresi başka hesaplarca kullanılıyorHesap70
email_disposableTek kullanımlık e-postaHesap25
email_invalidE-posta alamayan adres (böyle bir e-posta alan adı yok)Hesap35
email_sharedBaşka bir hesapla aynı e-postaHesap50
phone_sharedTelefon başka hesaplarla ortakHesap50
phone_voipVoIP veya sanal numaraHesap40
phone_invalidGeçersiz telefon numarasıHesap30
many_devices_per_accountTek hesapta çok fazla cihazHesap20
flagged_on_networkCashoutGuard korumalı başka sitelerde işaretlendiHesap45
face_same_personDiğer hesaplarla aynı yüzHesap0
offer_completed_too_fastOffer imkânsız bir hızda tamamlandıDavranış40
slow_after_clickTıklamadan çok sonra dönüştüDavranış0
conversion_velocitySaatte çok fazla dönüşümDavranış30
conversion_without_clickOfferwall'unuzdan tıklama olmadan dönüşümDavranış35
click_conversion_country_mismatchBir ülkede tıklandı, başka bir ülkede dönüştüDavranış30
offer_country_mismatchTeklif ülkesi kullanıcınınkinden farklıDavranış45
click_velocityBirkaç dakikada çok fazla offer tıklamasıDavranış35
earnings_spikeKazanç normal kullanıcının çok üzerindeDavranış30
source_high_reversalsÇok ters ibraz alan kaynakDavranış45
offer_high_reversalsÇok ters ibraz alan teklifDavranış35
duplicate_transactionMükerrer işlem ID'siDavranış60
offer_repeated_other_publisherAynı teklif başka bir yayıncı üzerinden zaten yapılmışDavranış85
offer_repeated_other_accountAynı teklif bu cihazda başka bir hesapla zaten yapılmışDavranış85
offer_farm_burstÇiftlik dalgası: saatler içinde bu teklifte çiftlik cihazlı çok sayıda yeni hesapDavranış30
signup_burstKayıt patlaması: birkaç hesap farklı IP'lerden saniyeler içinde kaydolduDavranış25
face_check_requiredYüz kontrolü gerekli, henüz yapılmadıDavranış0
face_check_failedYüz kontrolü başarısızDavranış0
publisher_farm_waveYayıncısının çiftlik dalgası: bu teklife gönderdiği yeni hesapların çoğu bulut telefonlardan veya emülatörlerden geldiDavranış55
cashout_velocityGünde çok fazla cashoutDavranış30
new_account_cashoutYepyeni bir hesaptan cashoutDavranış20
blocklistedEngel listenizdeListeleriniz100

Ağırlıklar noisy-OR ile birleştirilir: score = 100 x (1 - (1 - weight/100) çarpımı). 40'lık iki sinyal 80 değil, 64 verir. Engel listesi eşleşmesi her zaman 100 verir.

Webhook'lar

Panelde bir webhook URL’si ayarlayın. block olarak puanlanan her olay (event.blocked), bir hesap block’a geçtiğinde (account.blocked) ve ekibiniz bir çekim kararı verdiğinde (cashout.decided) POST gönderiyoruz. Kullanmadığınız türleri yok sayın.

Her istek webhook secret'ınızla imzalanır. Ham gövdenin hex formatındaki HMAC-SHA256 değeri şu header'dadır: X-CashoutGuard-Signature

Herhangi bir 2xx durum koduyla yanıt verin. Başarısız gönderimler en fazla 5 kez yeniden denenir: 10 saniye, 1 dakika, 5 dakika ve 15 dakika sonra.

Hesap durumu

GET /v1/accounts/{account_id} olay oluşturmadan bir hesabın güncel risk görünümünü döndürür.

POST /v1/accounts/{account_id}/status kendi moderasyon araçlarınızın bir hesabın durumunu değiştirmesini sağlar.

  • active: Normal puanlama.
  • allowlisted: Skorlar inceleme eşiğinin altında sınırlanır. Güvenilir kullanıcılar ve ekip üyeleri için.
  • blocked: Her olay 100 skorla block döndürür.

İptaller ve doğruluk

POST /v1/outcomes puanladıktan sonra dönüşümlere ne olduğunu bildirir: offerwall veya reklamveren tarafından iptal edildi (chargeback) ya da geçerli onaylandı. Kimliklerinizi eşleştirip motoru Doğruluk sayfasında kendi trafiğinizde ölçeriz.

Kodsuz: offerwall'larınızın aylık iptal dosyasını (CSV veya Excel) Doğruluk sayfasına yükleyin. Kimlik sütununu otomatik buluruz.

PHP, Node.js, Python, Android

SDK gerekmez. Kısa zaman aşımlı sade bir HTTP çağrısı yeterli. Tam cashout örneği:

Hatalar ve limitler

HTTPGövdeAnlamı
401missing_or_invalid_secret_keySecret key eksik, yanlış veya iptal edilmiş. Yanıt nedenini "reason" (missing, public_key, unknown_secret, placeholder, malformed), çözümünü "hint" alanında verir.
404not_foundHesap bulunamadı (hesap endpoint'leri).
422{ "message", "errors" }Geçersiz gövde. errors her alanı listeler.
429Too Many Requestsİstek limitine ulaşıldı. Sunucu API'si site başına dakikada 3.000 isteğe izin verir.
401 · agent.jsunknown_public_keydata-key hiçbir sitenin açık anahtarı değil. pk_live_... anahtarını Kurulum'dan yeniden kopyalayın.
403 · agent.jsorigin_not_allowedSayfanın alan adı sitenin izin verilen kaynaklarında yok. Siteler bölümünden ekleyin veya listeyi boş bırakın. localhost her zaman çalışır. agent.js bunu tarayıcı konsolunda da açıklar. Uygulama WebView'ları "null" origin gönderir: kabul etmek için listeye null ekleyin. Yerel Android SDK için bir şey gerekmez.
403account_suspendedHesap askıya alındı, genellikle ödenmemiş bir fatura nedeniyle. Faturalandırmayı kontrol edin.
503temporarily_unavailableBizim tarafımızda kısa bir kesinti. İşleme izin verin ve daha sonra tekrar deneyin.

Fail open: çağrı zaman aşımına uğrarsa veya hata verirse işleme izin verin ve kaydını tutun. Bizim tarafımızdaki bir kesinti kullanıcılarınızı asla durdurmasın.