CashoutGuard

डॉक्यूमेंटेशन

ब्राउज़र में एक स्क्रिप्ट, आपके सर्वर से एक API कॉल। लाइव होने के लिए जो कुछ चाहिए, सब एक ही पेज पर।

क्विक स्टार्ट

ब्राउज़र के लिए आपको अपनी public key (pk_...) और सर्वर के लिए अपनी secret key (sk_...) चाहिए। दोनों डैशबोर्ड में Sites and keys के अंदर मिलेंगी।

1. स्क्रिप्ट जोड़ें

यह टैग उन पेजों पर लगाएं जहां यूज़र साइन अप, लॉग इन, ऑफ़र क्लिक या कैशआउट रिक्वेस्ट करते हैं। यह खुद को इससे initialize करता है: data-key

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

2. request_id कलेक्ट करके अपने सर्वर पर भेजें

ज़रूरी मौके पर इवेंट के नाम के साथ collect() कॉल करें। यह इसमें resolve होता है: { request_id, visitor_id }

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

collect() कभी reject नहीं होता। फ़ेल होने पर (ब्लॉक, ऑफ़लाइन, टाइमआउट) यह request_id: null और एक error string के साथ resolve होता है। फिर भी फ़ॉर्म भेजें और फ़ैसला अपने सर्वर को करने दें।

3. अपने सर्वर से फ़ैसला पूछें

इवेंट को /v1/evaluate पर POST करें और अपनी secret key इस हेडर में भेजें: Authorization: Bearer sk_live_...

Secret key को कभी भी ब्राउज़र कोड या मोबाइल ऐप में न डालें। /v1/evaluate सिर्फ़ आपका सर्वर ही कॉल करे।

Evaluate रिक्वेस्ट

POST https://cashoutguard.com/v1/evaluate एक अकाउंट के एक इवेंट को स्कोर करता है, उसे उसके डिवाइस, नेटवर्क और पेआउट एड्रेस से जोड़ता है, और एक decision लौटाता है। JSON भेजें।

फ़ील्डटाइपज़रूरीविवरण
eventstringज़रूरीsignup, login, offer_click, conversion, cashout या custom।
account_idstringज़रूरीआपकी यूज़र ID, ज़्यादा से ज़्यादा 191 कैरेक्टर। ईमेल नहीं, कोई opaque ID इस्तेमाल करें।
request_idstringवैकल्पिकब्राउज़र में collect() से मिलता है। 1 घंटे तक वैध। इसके बिना हमारे पास सिर्फ़ नेटवर्क डेटा होता है।
ipstringवैकल्पिकयूज़र का IP। तभी ज़रूरी जब आपके पास request_id न हो, जैसे postbacks के लिए।
emailstringवैकल्पिकहैश के रूप में सेव होता है। डिस्पोज़ेबल डोमेन और अकाउंट्स के बीच शेयर किए गए ईमेल पकड़ता है।
payout_addressstringवैकल्पिकPayPal ईमेल, वॉलेट या वो अकाउंट जिसमें पैसा जाता है। हैश के रूप में सेव होता है।
payout_methodstringवैकल्पिकफ़्री टेक्स्ट, जैसे paypal, usdt या giftcard।
amountnumberवैकल्पिककैशआउट या कन्वर्ज़न की रकम।
currencystringवैकल्पिककरेंसी कोड, जैसे USD। कैशआउट के लिए डिफ़ॉल्ट USD है।
offer_idstringवैकल्पिकऑफ़र ID, offer_click और conversion के लिए। ऑफ़र स्पीड के लिए इस्तेमाल होती है।
offer_countrystringवैकल्पिकवह देश जिसके लिए ऑफ़र भुगतान करता है (ISO कोड, जैसे US), कन्वर्ज़न पर। दूसरे देश का यूज़र फ़्लैग होता है।
geo_countrystringवैकल्पिकयूज़र के IP की आपकी अपनी जियोलोकेशन (ISO कोड)। हमसे अलग हो तो IP संभवतः प्रॉक्सी एग्ज़िट है।
transaction_idstringवैकल्पिककिसी कन्वर्ज़न की नेटवर्क ट्रांज़ैक्शन ID। डुप्लिकेट पकड़ने के लिए इस्तेमाल होती है।
offer_namestringवैकल्पिकऑफ़र का शीर्षक, जैसा आपके यूज़र देखते हैं। डैशबोर्ड में ID की जगह यही दिखता है।
click_idstringवैकल्पिकआपकी क्लिक ID। offer_click और कन्वर्ज़न दोनों में एक ही मान भेजें ताकि वे जुड़ जाएँ।
sourcestringवैकल्पिकइवेंट कहाँ से आया, जैसे ऑफ़रवॉल या नेटवर्क का नाम।
metaobjectवैकल्पिकइवेंट के साथ सेव होने वाले 20 तक अतिरिक्त टेक्स्ट फ़ील्ड (जैसे sub ID)।

रिस्पॉन्स

रिस्पॉन्स का ढांचा हमेशा एक जैसा रहता है। जो फ़ील्ड लागू नहीं होते, वे null होते हैं।

  • score 0 से 100 तक होता है। कारणों को इस तरह जोड़ा जाता है कि कई मीडियम सिग्नल मिलकर बढ़ें, पर 100 से ऊपर न जाएं।
  • reasons हर ट्रिगर हुए सिग्नल की लिस्ट देता है, सबसे मज़बूत पहले, उसके वेट, डिटेल्स और सीधे दिखाने लायक़ सरल अंग्रेज़ी लेबल के साथ।
  • device.confidence बताता है कि डिवाइस कितना यूनिक दिखता है। फ़िंगरप्रिंट स्पूफ़ किए जा सकते हैं, इसलिए हम कभी पक्का होने का दावा नहीं करते।
  • linked_accounts उन दूसरे अकाउंट्स की लिस्ट देता है जो इस अकाउंट के साथ डिवाइस, पेआउट एड्रेस या ईमेल शेयर करते हैं।
  • cashout सिर्फ़ cashout इवेंट्स के लिए सेट होता है और आपकी रिव्यू क्यू में स्टेटस बताता है।

Decisions और actions

decision पर नहीं, action फ़ील्ड के हिसाब से कदम उठाएं। नीचे दिए थ्रेशोल्ड डिफ़ॉल्ट हैं और डैशबोर्ड में हर साइट के लिए बदले जा सकते हैं।

Decisionस्कोर (डिफ़ॉल्ट)shadow में actionenforce में actionक्या करें
allow0-49allowallowसामान्य रूप से आगे बढ़ें।
review50-79allowreviewकैशआउट होल्ड करें या अतिरिक्त वेरिफ़िकेशन मांगें। यह आपकी रिव्यू क्यू में दिखता है।
block80-100allowblockएक्शन रोक दें। बैलेंस फ़्रीज़ करें या साइन अप रिजेक्ट करें।

Shadow मोड में action हमेशा allow होता है, इसलिए enforce करने से पहले भी वही कोड शिप करना सुरक्षित है। Enforce पर स्विच करने पर आपके कोड में कुछ नहीं बदलता।

इवेंट टाइप

आपके पास जो इवेंट हैं, वो भेजें। Signup और cashout सबसे अहम हैं; conversions से ऑफ़र स्पीड चेक चलते हैं।

इवेंटकब भेजेंक्या पकड़ता है
signupअकाउंट बनामल्टी-अकाउंट, बॉट, VPN साइन अप, डिस्पोज़ेबल ईमेल
loginसफल लॉगिनअकाउंट शेयरिंग, देश बदलना, नए डिवाइस
offer_clickयूज़र कोई ऑफ़र खोलता हैऑफ़र स्पीड के लिए घड़ी शुरू करता है
conversionOfferwall या नेटवर्क से postbackबहुत तेज़ पूरे हुए ऑफ़र, डुप्लिकेट ट्रांज़ैक्शन, कन्वर्ज़न की बाढ़
cashoutयूज़र विड्रॉल रिक्वेस्ट करता हैशेयर किए गए पेआउट एड्रेस, कैशआउट वेलोसिटी, नए अकाउंट से कैशआउट
customकुछ भी और जिसे आप स्कोर कराना चाहेंडिवाइस और नेटवर्क सिग्नल

ऑफ़रवॉल और पोस्टबैक

ऑफ़रवॉल कन्वर्ज़न पोस्टबैक से, सर्वर से सर्वर, बिना ब्राउज़र के आते हैं। CashoutGuard हर कन्वर्ज़न को उसे शुरू करने वाले क्लिक से जोड़ता है, इसलिए उसका स्कोर उसी क्लिक के डिवाइस और नेटवर्क से बनता है।

1. जब यूज़र कोई ऑफ़र खोलता है

ब्राउज़र में कलेक्ट करें और ऑफ़र व अपनी क्लिक ID के साथ offer_click भेजें।

2. जब पोस्टबैक आता है

अपने पोस्टबैक हैंडलर से उसी account_id और click_id के साथ conversion भेजें। request_id की ज़रूरत नहीं। अगर ऑफ़रवॉल यूज़र का IP देता है तो उसे भी भेजें।

कन्वर्ज़न की जाँच होती है: ऑफ़र के लिए बहुत तेज़ पूरा होना, बिना क्लिक का कन्वर्ज़न, क्लिक और कन्वर्ज़न अलग देशों से, अकाउंट के सामान्य दिन से बहुत ज़्यादा कमाई, और डुप्लिकेट ट्रांज़ैक्शन ID।

ऑफ़रवॉल नेटवर्क

अगर आप कई पब्लिशर्स वाला नेटवर्क चलाते हैं, तो पब्लिशर सहित अकाउंट ID भेजें और Sites में "ऑफ़रवॉल नेटवर्क मोड" चालू करें। तब अकाउंट केवल उसी पब्लिशर के भीतर जुड़ते हैं, क्योंकि एक व्यक्ति का कई पब्लिशर्स की साइटें इस्तेमाल करना सामान्य है। फ़ॉर्मैट: publisher_id:user_id

ऑफ़र कैटलॉग

POST /v1/offers आपके ऑफ़र के नाम भेजता है (हर कॉल में 1,000 तक)। पुराने और नए इवेंट असली नाम दिखाएँगे, भले ही उनमें केवल ID हो।

रीज़न कोड

ये कोड reasons[].code में आते हैं। अपने मॉडरेटर्स को टेक्स्ट दिखाएं; अपने लॉजिक में कोड इस्तेमाल करें।

कोडमतलबग्रुपवेट
ip_torTor एग्ज़िट नोडनेटवर्क60
ip_vpnVPN कनेक्शननेटवर्क45
ip_datacenterडेटासेंटर / होस्टिंग IPनेटवर्क40
timezone_mismatchब्राउज़र का टाइमज़ोन IP लोकेशन से मेल नहीं खातानेटवर्क20
webrtc_ip_leakअसली IP किसी दूसरे देश में लीक हुआनेटवर्क30
ip_multi_timezoneएक ही IP पर कई अलग टाइमज़ोन (प्रॉक्सी एग्ज़िट)नेटवर्क50
proxy_farm_ipएक IP पर कई खाते, सभी में एक ही विदेशी घड़ी (साझा प्रॉक्सी)नेटवर्क60
provider_rotationकुछ दिनों में कई इंटरनेट प्रदाता, विदेशी घड़ी के साथ (घूमने वाला रेज़िडेंशियल प्रॉक्सी)नेटवर्क45
privacy_relayiCloud Private Relay (प्राइवेसी फीचर)नेटवर्क5
proxy_headersअनुरोध प्रॉक्सी से आयानेटवर्क20
geo_sources_disagreeजियोलोकेशन स्रोत मेल नहीं खातेनेटवर्क45
ip_shared_with_accountsआज यही IP दूसरे अकाउंट्स ने भी इस्तेमाल कियानेटवर्क25
country_changedदेश बदल गयानेटवर्क15
impossible_travelअसंभव यात्रा: कुछ घंटों में दो दूर देशों के IPनेटवर्क50
locale_country_mismatchदूसरे देश की ब्राउज़र भाषानेटवर्क30
phone_country_mismatchIP से अलग देश का फ़ोननेटवर्क20
ip_flagged_on_networkदूसरी वेबसाइटों पर ब्लॉक IPनेटवर्क25
device_shared_with_accountsडिवाइस दूसरे अकाउंट्स के साथ शेयर हैडिवाइस55
automation_detectedबॉट या ऑटोमेशन टूलडिवाइस70
auto_clickerफ़ोन पर ऑटो-क्लिकरडिवाइस55
scripted_behaviorस्क्रिप्ट से पेज का इस्तेमालडिवाइस45
emulator_or_vmएमुलेटर या वर्चुअल मशीनडिवाइस45
browser_tamperingब्राउज़र से छेड़छाड़ / स्पूफिंगडिवाइस35
device_rootedरूटेड फ़ोनडिवाइस25
incognitoप्राइवेट ब्राउज़िंगडिवाइस10
device_spoofedनकली फ़ोन मॉडलडिवाइस55
emulator_profileएमुलेटर का डिफ़ॉल्ट प्रोफ़ाइलडिवाइस60
cloud_phoneक्लाउड फ़ोनडिवाइस60
phone_farm_displayफ़ोन फ़ार्म डिस्प्लेडिवाइस45
device_market_mismatchसिर्फ़ चीन वाला फ़ोन विदेश मेंडिवाइस25
storage_cleared_reappearedकुकीज़ साफ़ करके फिर लौटाडिवाइस15
no_device_dataकोई डिवाइस डेटा नहीं भेजा गयाडिवाइस15
request_reusedडिवाइस टोकन किसी दूसरे अकाउंट ने दोबारा इस्तेमाल कियाडिवाइस40
device_farm_proxyरेज़िडेंशियल प्रॉक्सी पर फ़ोन फ़ार्मडिवाइस85
device_clonesडिवाइस क्लोन: एक फ़ोन अपनी पहचान रीसेट करके एक नेटवर्क पर कई नए खाते बन रहा हैडिवाइस55
payout_address_sharedपेआउट एड्रेस दूसरे अकाउंट्स भी इस्तेमाल कर रहे हैंअकाउंट70
email_disposableडिस्पोज़ेबल ईमेलअकाउंट25
email_invalidऐसा ईमेल जिस पर मेल नहीं आ सकता (ऐसा कोई मेल डोमेन नहीं)अकाउंट35
email_sharedकिसी दूसरे अकाउंट वाला ही ईमेलअकाउंट50
phone_sharedदूसरे अकाउंट के साथ साझा फ़ोन नंबरअकाउंट50
phone_voipVoIP या वर्चुअल नंबरअकाउंट40
phone_invalidअमान्य फ़ोन नंबरअकाउंट30
many_devices_per_accountएक अकाउंट पर बहुत ज़्यादा डिवाइसअकाउंट20
flagged_on_networkCashoutGuard से सुरक्षित अन्य वेबसाइटों पर चिह्नितअकाउंट45
face_same_personदूसरे अकाउंट जैसा ही चेहराअकाउंट0
offer_completed_too_fastऑफ़र नामुमकिन रफ़्तार से पूरा हुआबिहेवियर40
slow_after_clickक्लिक के काफ़ी देर बाद कन्वर्ज़नबिहेवियर0
conversion_velocityएक घंटे में बहुत ज़्यादा कन्वर्ज़नबिहेवियर30
conversion_without_clickआपकी वॉल से क्लिक के बिना कन्वर्ज़नबिहेवियर35
click_conversion_country_mismatchएक देश से क्लिक, दूसरे देश से कन्वर्ज़नबिहेवियर30
offer_country_mismatchऑफ़र का देश यूज़र के देश से अलगबिहेवियर45
click_velocityकुछ ही मिनटों में बहुत ज़्यादा ऑफ़र क्लिकबिहेवियर35
earnings_spikeआम यूज़र से कहीं ज़्यादा कमाईबिहेवियर30
source_high_reversalsज़्यादा चार्जबैक वाला सोर्सबिहेवियर45
offer_high_reversalsज़्यादा चार्जबैक वाला ऑफ़रबिहेवियर35
duplicate_transactionडुप्लिकेट ट्रांज़ैक्शन IDबिहेवियर60
offer_repeated_other_publisherयही ऑफ़र पहले ही किसी दूसरे पब्लिशर से किया जा चुका हैबिहेवियर85
offer_repeated_other_accountयही ऑफ़र इस डिवाइस पर दूसरे अकाउंट से पहले ही किया गयाबिहेवियर85
offer_farm_burstफ़ार्म की लहर: कुछ घंटों में इस ऑफ़र पर फ़ार्म डिवाइस वाले कई नए खातेबिहेवियर30
signup_burstसाइनअप की बौछार: कई खाते अलग-अलग IP से कुछ सेकंड में बनेबिहेवियर25
face_check_requiredचेहरे की जाँच ज़रूरी है, अभी नहीं हुईबिहेवियर0
face_check_failedचेहरे की जाँच फ़ेलबिहेवियर0
publisher_farm_waveइसके पब्लिशर की फ़ार्म लहर: इस ऑफ़र पर भेजे गए ज़्यादातर नए खाते क्लाउड फ़ोन या एमुलेटर से आएबिहेवियर55
cashout_velocityएक दिन में बहुत ज़्यादा कैशआउटबिहेवियर30
new_account_cashoutबिल्कुल नए अकाउंट से कैशआउटबिहेवियर20
blocklistedआपकी ब्लॉकलिस्ट मेंआपकी लिस्ट100

वेट्स को noisy-OR से जोड़ा जाता है: score = 100 x (1 - product of (1 - weight/100))। 40 के दो सिग्नल 80 नहीं, 64 देते हैं। ब्लॉकलिस्ट मैच हमेशा 100 देता है।

Webhooks

डैशबोर्ड में वेबहुक URL सेट करें। block स्कोर वाले हर इवेंट (event.blocked), किसी अकाउंट के block होने (account.blocked) और आपकी टीम के कैशआउट फ़ैसले (cashout.decided) पर हम POST भेजते हैं। जो टाइप इस्तेमाल न करें उन्हें अनदेखा करें।

हर रिक्वेस्ट आपके webhook secret से साइन की जाती है। Raw body का hex HMAC-SHA256 इस हेडर में होता है: X-CashoutGuard-Signature

किसी भी 2xx स्टेटस के साथ जवाब दें। फ़ेल हुई डिलीवरी 5 बार तक दोबारा भेजी जाती है: 10 सेकंड, 1 मिनट, 5 मिनट और 15 मिनट बाद।

अकाउंट स्टेटस

GET /v1/accounts/{account_id} इवेंट बनाए बिना किसी अकाउंट का मौजूदा रिस्क व्यू लौटाता है।

POST /v1/accounts/{account_id}/status आपके अपने मॉडरेशन टूल्स को किसी अकाउंट का स्टेटस बदलने देता है।

  • active: नॉर्मल स्कोरिंग।
  • allowlisted: स्कोर रिव्यू थ्रेशोल्ड से नीचे सीमित रहते हैं। भरोसेमंद यूज़र्स और स्टाफ़ के लिए।
  • blocked: हर इवेंट स्कोर 100 के साथ block लौटाता है।

रिवर्सल और सटीकता

POST /v1/outcomes बताता है कि स्कोर के बाद कन्वर्ज़न का क्या हुआ: ऑफ़रवॉल या विज्ञापनदाता ने रिवर्स किया (chargeback) या वैध माना। हम आपके ids मिलाकर Accuracy पेज पर आपके ट्रैफ़िक पर इंजन मापते हैं।

बिना कोड: Accuracy पेज पर अपने ऑफ़रवॉल का मासिक रिवर्सल एक्सपोर्ट (CSV या Excel) अपलोड करें। id कॉलम हम खुद ढूंढ लेते हैं।

PHP, Node.js, Python, Android

किसी SDK की ज़रूरत नहीं। छोटे टाइमआउट वाली एक सादी HTTP कॉल काफ़ी है। कैशआउट का पूरा उदाहरण:

  • cashoutguard.php: PHP 7.4+, एक फ़ाइल, Composer नहीं। बस require करें।
  • composer require cashoutguard/cashoutguard-php: वही PHP क्लाइंट README के साथ, आपके vendor फ़ोल्डर के लिए।
  • npm install @cashoutguard/node: Node 18+, TypeScript टाइप्स के साथ।
  • cashoutguard-wordpress.zip: WordPress प्लगइन: हर पेज पर ब्राउज़र स्क्रिप्ट, साइनअप और लॉगिन का स्कोर, और कैशआउट, ऑफ़रवॉल कन्वर्ज़न व रिवर्सल के लिए हुक।

एरर और लिमिट

HTTPबॉडीमतलब
401missing_or_invalid_secret_keySecret key नहीं है, गलत है या रद्द की जा चुकी है। जवाब में कारण "reason" (missing, public_key, unknown_secret, placeholder, malformed) में और सुधार "hint" में होता है।
404not_foundअकाउंट नहीं मिला (account endpoints)।
422{ "message", "errors" }बॉडी अमान्य है। errors हर फ़ील्ड की लिस्ट देता है।
429Too Many Requestsरेट लिमिट पूरी हो गई। सर्वर API हर साइट के लिए प्रति मिनट 3,000 रिक्वेस्ट की अनुमति देता है।
401 · agent.jsunknown_public_keydata-key किसी साइट की पब्लिक की नहीं है। Install से pk_live_... फिर से कॉपी करें।
403 · agent.jsorigin_not_allowedपेज का डोमेन साइट के allowed origins में नहीं है। Sites में जोड़ें या सूची खाली छोड़ दें। localhost हमेशा चलता है। agent.js ब्राउज़र कंसोल में भी यह बताता है। ऐप के WebView "null" origin भेजते हैं: इन्हें स्वीकार करने के लिए सूची में null जोड़ें। नेटिव Android SDK को कुछ नहीं चाहिए।
403account_suspendedअकाउंट सस्पेंड है, आम तौर पर बकाया बिल की वजह से। Billing देखें।
503temporarily_unavailableहमारी तरफ़ छोटी रुकावट। एक्शन होने दें और बाद में फिर कोशिश करें।

Fail open: अगर कॉल टाइमआउट हो या एरर आए, तो एक्शन को allow करें और लॉग कर लें। हमारे आउटेज की वजह से अपने यूज़र्स को कभी न रोकें।