CashoutGuard

التوثيق

سكربت واحد في المتصفح، واستدعاء API واحد من خادمك. كل ما تحتاجه للإطلاق في صفحة واحدة.

البدء السريع

تحتاج إلى مفتاحك العام (pk_...) للمتصفح ومفتاحك السري (sk_...) لخادمك. تجد كليهما في لوحة التحكم ضمن المواقع والمفاتيح.

1. أضف السكربت

ضع هذا الوسم في الصفحات التي يسجّل فيها المستخدمون أو يدخلون أو ينقرون على العروض أو يطلبون السحب. يهيّئ نفسه تلقائيًا من data-key

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

2. اجمع request_id وأرسله إلى خادمك

استدعِ collect() في اللحظة المهمة مع اسم الحدث. تُرجع النتيجة { request_id, visitor_id }

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

لا يُرفض collect() أبدًا. عند الفشل (حظر، أو انقطاع الاتصال، أو انتهاء المهلة) يُرجع request_id: null مع نص الخطأ. أرسل النموذج على أي حال ودع خادمك يقرر.

3. اطلب القرار من خادمك

أرسل الحدث بطلب POST إلى /v1/evaluate مع مفتاحك السري في الترويسة Authorization: Bearer sk_live_...

لا تضع المفتاح السري أبدًا في كود المتصفح أو في تطبيق جوال. يجب أن يستدعي خادمك وحده /v1/evaluate.

طلب التقييم

POST https://cashoutguard.com/v1/evaluate يقيّم حدثًا واحدًا لحساب واحد، ويربطه بجهازه وشبكته وعنوان السحب، ويُرجع قرارًا. أرسل البيانات بصيغة JSON.

الحقلالنوعمطلوبالوصف
eventstringمطلوبsignup أو login أو offer_click أو conversion أو cashout أو custom.
account_idstringمطلوبمعرّف المستخدم لديك، بحد أقصى 191 حرفًا. استخدم معرّفًا مبهمًا، لا بريدًا إلكترونيًا.
request_idstringاختياريمن collect() في المتصفح. صالح لمدة ساعة واحدة. بدونه لا تتوفر لدينا إلا بيانات الشبكة.
ipstringاختياريعنوان IP الخاص بالمستخدم. مطلوب فقط عندما لا يتوفر request_id، مثلًا في الـ postbacks.
emailstringاختيارييُخزَّن كقيمة مُجزَّأة (hash). يكشف النطاقات المؤقتة والبريد المشترك بين الحسابات.
payout_addressstringاختياريبريد PayPal أو المحفظة أو الحساب الذي تذهب إليه الأموال. يُخزَّن كقيمة مُجزَّأة (hash).
payout_methodstringاختيارينص حر مثل paypal أو usdt أو giftcard.
amountnumberاختياريمبلغ السحب أو التحويل.
currencystringاختياريرمز العملة، مثل USD. القيمة الافتراضية USD لطلبات السحب.
offer_idstringاختياريمعرّف العرض، لـ offer_click وconversion. يُستخدم لقياس سرعة إكمال العرض.
offer_countrystringاختياريالبلد الذي يدفع العرض مقابله (رمز ISO مثل US) في التحويلات. يُعلَّم المستخدم الموجود في بلد آخر.
geo_countrystringاختياريتحديدك الخاص لموقع عنوان IP للمستخدم (رمز ISO). إذا اختلف عن تحديدنا فالعنوان غالبًا مخرج بروكسي.
transaction_idstringاختياريمعرّف المعاملة لدى الشبكة الخاص بالتحويل. يُستخدم لكشف التكرار.
offer_namestringاختياريعنوان العرض كما يراه مستخدموك. يظهر في لوحة التحكم بدل المعرّف الخام.
click_idstringاختياريمعرّف النقرة لديك. أرسل القيمة نفسها في offer_click وفي التحويل لربطهما.
sourcestringاختياريمصدر الحدث، مثل اسم الـ Offerwall أو الشبكة.
metaobjectاختياريحتى 20 حقلًا نصيًا إضافيًا تُحفظ مع الحدث (مثل معرّفات sub).

الاستجابة

للاستجابة دائمًا الشكل نفسه. الحقول غير المنطبقة تكون قيمتها null.

  • score قيمتها من 0 إلى 100. تُدمج الأسباب بحيث تتراكم عدة إشارات متوسطة دون أن تتجاوز 100.
  • reasons تسرد كل إشارة تم رصدها، من الأقوى إلى الأضعف، مع وزنها وتفاصيلها وتسمية واضحة بالإنجليزية يمكنك عرضها كما هي.
  • device.confidence توضح مدى تفرّد الجهاز. يمكن انتحال البصمات، لذا لا ندّعي اليقين أبدًا.
  • linked_accounts تسرد الحسابات الأخرى التي تتشارك مع هذا الحساب جهازًا أو عنوان سحب أو بريدًا إلكترونيًا.
  • cashout يُعيَّن فقط لأحداث السحب ويوضح الحالة في قائمة المراجعة لديك.

القرارات والإجراءات

اعتمد على حقل action، لا على decision. الحدود أدناه هي القيم الافتراضية ويمكن تغييرها لكل موقع من لوحة التحكم.

القرارالدرجة (افتراضي)action في وضع الظلaction في وضع التنفيذما يجب فعله
allow0-49allowallowتابع كالمعتاد.
review50-79allowreviewعلّق طلب السحب أو اطلب تحققًا إضافيًا. سيظهر في قائمة المراجعة لديك.
block80-100allowblockأوقف الإجراء. جمّد الرصيد أو ارفض التسجيل.

في وضع الظل تكون قيمة action دائمًا allow، لذا يمكنك إطلاق الكود نفسه بأمان قبل التنفيذ. وعند الانتقال إلى وضع التنفيذ لا يتغير شيء في الكود.

أنواع الأحداث

أرسل الأحداث المتوفرة لديك. التسجيل والسحب هما الأهم، والتحويلات تغذّي فحوص سرعة إكمال العروض.

الحدثمتى يُرسلما الذي يكشفه
signupإنشاء حسابالحسابات المتعددة، والبوتات، والتسجيل عبر VPN، والبريد المؤقت
loginتسجيل دخول ناجحمشاركة الحسابات، وتغيّر البلد، والأجهزة الجديدة
offer_clickالمستخدم يفتح عرضًايبدأ حساب الوقت لقياس سرعة إكمال العرض
conversionpostback من الـ offerwall أو الشبكةالعروض المكتملة بسرعة مفرطة، والمعاملات المكررة، وموجات التحويلات
cashoutالمستخدم يطلب سحبًاعناوين السحب المشتركة، ووتيرة السحب، والسحب من حسابات جديدة
customأي شيء آخر تريد تقييمهإشارات الجهاز والشبكة

Offerwall وإشعارات postback

تصل تحويلات الـ Offerwall عبر postback من خادم إلى خادم دون متصفح. يربط CashoutGuard كل تحويل بالنقرة التي بدأته، فيُقيَّم بجهاز وشبكة تلك النقرة.

1. عندما يفتح المستخدم عرضًا

اجمع البيانات في المتصفح وأرسل offer_click مع العرض ومعرّف النقرة.

2. عندما يصل الـ postback

أرسل conversion من معالج الـ postback بنفس account_id وclick_id. لا حاجة إلى request_id. مرّر عنوان IP للمستخدم إذا وفّره الـ Offerwall.

تُفحص التحويلات بحثًا عن: إكمال أسرع من اللازم للعرض، تحويل بلا نقرة، نقرة وتحويل من دولتين مختلفتين، أرباح أعلى بكثير من اليوم المعتاد للحساب، ومعرّفات معاملات مكررة.

شبكات Offerwall

إذا كنت تدير شبكة بها ناشرون كثيرون، فأرسل معرّفات حسابات تتضمن الناشر وفعّل "وضع شبكة Offerwall" في المواقع. عندها تُربط الحسابات داخل الناشر نفسه فقط، لأن استخدام شخص واحد لعدة مواقع من ناشريك أمر طبيعي. الصيغة: publisher_id:user_id

كتالوج العروض

POST /v1/offers يرسل أسماء عروضك (حتى 1,000 في كل طلب). ستعرض الأحداث السابقة والقادمة الاسم الحقيقي حتى لو حملت المعرّف فقط.

رموز الأسباب

تظهر هذه الرموز في reasons[].code. اعرض النص للمشرفين لديك، واستخدم الرمز في منطق الكود.

الرمزالمعنىالمجموعةالوزن
ip_torعقدة خروج Torالشبكة60
ip_vpnاتصال عبر VPNالشبكة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_mismatchهاتف من دولة غير دولة الـ IPالشبكة20
ip_flagged_on_networkIP محظور في مواقع أخرىالشبكة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_voipرقم VoIP أو افتراضيالحساب40
phone_invalidرقم هاتف غير صالحالحساب30
many_devices_per_accountأجهزة كثيرة جدًا على حساب واحدالحساب20
flagged_on_networkمُعلَّم على مواقع أخرى يحميها CashoutGuardالحساب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معرّف معاملة مكررالسلوك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 تعطيان 64، لا 80. أي تطابق مع قائمة الحظر يعطي دائمًا 100.

Webhooks

عيّن رابط webhook في لوحة التحكم. نرسل طلب POST لكل حدث مُقيَّم بـ block (event.blocked)، وعندما يتحول حساب إلى block (account.blocked)، وعندما يقرر فريقك بشأن سحب (cashout.decided). تجاهل الأنواع التي لا تستخدمها.

كل طلب موقّع بسر الـ webhook الخاص بك. قيمة HMAC-SHA256 بالصيغة الست عشرية للمحتوى الخام موجودة في الترويسة X-CashoutGuard-Signature

ردّ بأي حالة 2xx. تُعاد محاولة التسليم الفاشل حتى 5 مرات: بعد 10 ثوانٍ، ثم دقيقة، ثم 5 دقائق، ثم 15 دقيقة.

حالة الحساب

GET /v1/accounts/{account_id} يُرجع تقييم المخاطر الحالي للحساب دون إنشاء حدث.

POST /v1/accounts/{account_id}/status يتيح لأدوات الإشراف الخاصة بك تغيير حالة الحساب.

  • active: تقييم عادي.
  • allowlisted: تبقى الدرجات دون حد المراجعة. للمستخدمين الموثوقين والموظفين.
  • blocked: كل حدث يُرجع block بدرجة 100.

الإلغاءات والدقة

POST /v1/outcomes يُبلغ بما حدث للتحويلات بعد تقييمها: ألغاها العرض أو المعلن (chargeback) أو تأكدت صحتها. نطابق معرفاتك مع التحويلات ونقيس المحرك على زياراتك في صفحة الدقة.

بدون برمجة: ارفع ملف الإلغاءات الشهري من شبكات العروض (CSV أو Excel) في صفحة الدقة، ونجد عمود المعرفات تلقائيًا.

PHP وNode.js وPython وAndroid

لا حاجة إلى SDK. يكفي استدعاء HTTP عادي بمهلة قصيرة. مثال كامل لطلب سحب:

الأخطاء والحدود

HTTPالمحتوىالمعنى
401missing_or_invalid_secret_keyالمفتاح السري مفقود أو خاطئ أو ملغى. يذكر الرد السبب في "reason" (missing وpublic_key وunknown_secret وplaceholder وmalformed) وطريقة الإصلاح في "hint".
404not_foundالحساب غير موجود (نقاط نهاية الحسابات).
422{ "message", "errors" }محتوى غير صالح. يسرد errors كل حقل.
429Too Many Requestsتم بلوغ حد الطلبات. تسمح واجهة API للخادم بـ 3,000 طلب في الدقيقة لكل موقع.
401 · agent.jsunknown_public_keyقيمة data-key ليست مفتاحًا عامًا لأي موقع. انسخ pk_live_... مجددًا من صفحة التثبيت.
403 · agent.jsorigin_not_allowedنطاق الصفحة غير موجود ضمن المصادر المسموح بها للموقع. أضفه من صفحة المواقع أو اترك القائمة فارغة. يعمل localhost دائمًا. يشرح agent.js ذلك أيضًا في وحدة تحكم المتصفح. ترسل WebViews في التطبيقات الأصل "null": أضف null إلى القائمة لقبولها. لا تحتاج حزمة Android الأصلية إلى أي شيء.
403account_suspendedالحساب موقوف، غالبًا بسبب فاتورة غير مدفوعة. راجع الفوترة.
503temporarily_unavailableانقطاع قصير من جهتنا. اسمح بالإجراء وأعد المحاولة لاحقًا.

الفشل المفتوح: إذا انتهت مهلة الاستدعاء أو حدث خطأ، اسمح بالإجراء وسجّله. لا تدع أي انقطاع لدينا يوقف مستخدميك.