التوثيق
أضف الوكيل إلى صفحة التسجيل، واستدعِ نقطة نهاية واحدة من خادمك، ثم تصرّف وفق القرار.
بداية سريعة
1. أضف الوكيل إلى صفحة التسجيل
يجمع إشارات الجهاز ويضع رمز زائر قصير العمر في حقل مخفي اسمه attrelix_visitor داخل كل نموذج في الصفحة. ويوفّر أيضًا window.attrelix.token() لتطبيقات الصفحة الواحدة.
<script src="https://attrelix.com/v1.js?v=0bbe74b52d" data-key="pk_live_…" async></script> // single-page apps: wait for the token before you submit const visitor = await window.attrelix.token();
2. افحص التسجيل من خادمك
أرسل البريد وعنوان IP للعميل ورمز الزائر مع مفتاحك السري. اختياري: external_id (معرّف المستخدم لديك) وuser_agent وcard_fingerprint (مثل card.fingerprint من Stripe).
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"jdoe+7@gmail.com","ip":"203.0.113.9","visitor":"vt1.…"}'
# Python r = requests.post("https://attrelix.com/v1/check", timeout=3, headers={"Authorization": f"Bearer {SECRET}"}, json={"email": email, "ip": ip, "visitor": form["attrelix_visitor"]}) decision = r.json().get("decision", "allow") if r.ok else "allow"
3. تصرّف وفق القرار
allow: امنح الأرصدة المجانية. review: اطلب شيئًا يكلّف المزرعة مالًا — بطاقة أو رقم هاتف — أو امنح أرصدة أقل. block: ارفض الحساب أو الأرصدة. وإذا فشل الاستدعاء فاسمح: لا تحجب مستخدمين حقيقيين بسببنا أبدًا.
المفاتيح والرموز
- المفتاح العام (pk_live_…): عام بطبيعته. يوضع في صفحتك ولا يستطيع سوى جمع الإشارات، من المصادر التي تسمح بها في لوحة التحكم.
- المفتاح السري (sk_live_…): للخادم فقط. يشغّل الفحوص ويقرأ النتائج. لا نخزّن إلا بصمته: انسخه عند إنشائه.
- رمز الزائر: موقّع منا، صالح 15 دقيقة ولفحص واحد، ومرتبط بمشروعك. الرمز المستخدم مرتين، أو الآتي من شبكة غير شبكة التسجيل، يرفع الدرجة.
POST /v1/check
جسم الطلب (JSON). أرسل واحدًا على الأقل من email أو ip أو visitor.
| العنوان الذي كتبه المستخدم. | |
| ip | عنوان IP للعميل في طلب التسجيل (لا عنوان خادمك). |
| visitor | قيمة attrelix_visitor من النموذج. |
| user_agent | ترويسة User-Agent لطلب التسجيل. |
| external_id | معرّف الحساب لديك إن كان موجودًا. |
| card_fingerprint | بصمة بطاقة، عند إضافة بطاقة أثناء التسجيل. |
الاستجابة
قيمة decision هي allow أو review أو block. وscore من 0 إلى 100: مجموع نقاط الأسباب بحد أقصى. لكل سبب رمز ثابت يمكنك تسجيله أو عرضه.
{
"id": "chk_3fJ8kQ2mN7pX1aZb",
"decision": "block",
"score": 100,
"reasons": [
{ "code": "linked_accounts_10", "points": 45, "detail": "14" },
{ "code": "alias_of_existing", "points": 30, "detail": "3 variants of jdoe@gmail.com" },
{ "code": "datacenter_ip", "points": 25, "detail": "aws" }
],
"email": { "normalized": "jdoe@gmail.com", "disposable": false, "relay": false, "mx": "yes", … },
"network": { "ip": "3.88.0.1", "type": "datacenter", "provider": "aws", "signups_24h": 2 },
"device": { "id": "dev_9c1e…", "token": "valid", "browser": "Firefox 144", "flags": ["canvas_noise"] },
"linked": { "accounts": 14, "by_device": 12, "by_card": 0, "cluster": "cl_7q2f…" },
"latency_ms": 38
}
الأخطاء
تأتي الأخطاء بصيغة JSON: {"error": code, "message": text}.
| 401 | مفتاح مفقود أو مجهول أو ملغى أو من نوع خاطئ (مفتاح pk_ على /v1/check). |
| 400 | الجسم ليس JSON أو لا يحتوي email ولا ip ولا visitor. |
| 402 | نفدت فحوص الخطة الشهرية. |
| 403 | عمل الوكيل على مصدر لم تسمح به. |
| 429 | طلبات كثيرة جدًا من عنوان واحد. |
احتساب الدرجة
تُجمع النقاط بحد أقصى 100. الافتراضي: مراجعة من 50 وحظر من 80 — وكلاهما قابل للتعديل. صندوق البريد المؤقت وحده يكفي للمراجعة؛ ولا تبلغها أي إشارة جهاز أو شبكة بمفردها.
| الرمز | النقاط | المعنى |
|---|---|---|
| invalid_email | +50 | العنوان غير صالح |
| disposable_email | +50 | نطاق بريد مؤقت |
| no_mx | +35 | النطاق لا يستقبل البريد |
| alias_of_existing | +30 | كتابة أخرى لصندوق بريد سبق رصده |
| relay_email | +10 | عنوان خدمة إعادة توجيه |
| plus_tag | +5 | وسم + أو نقاط Gmail |
| tor_exit | +35 | عقدة خروج Tor |
| datacenter_ip | +25 | عنوان مركز بيانات أو سحابة |
| vpn_ip | +20 | عنوان VPN |
| ip_signups_24h | +10 | 3+ حسابات من هذا العنوان خلال 24 ساعة |
| ip_signups_24h_high | +25 | 10+ حسابات من هذا العنوان خلال 24 ساعة |
| subnet_burst | +15 | 10+ حسابات من هذه الشبكة الفرعية خلال ساعة |
| automation_webdriver | +40 | أتمتة عبر WebDriver |
| headless_browser | +40 | متصفح بلا واجهة |
| automation_cdp | +10 | أتمتة عبر بروتوكول DevTools (Puppeteer، Playwright) |
| antidetect_browser | +15 | متصفح مضاد للكشف (عدة تمويهات معًا) |
| headless_viewport | +15 | نافذة بلا شريط متصفح أو تبويبات |
| webgl_os_mismatch | +25 | بطاقة الرسوميات تعود لنظام تشغيل آخر |
| memory_cpu_mismatch | +10 | عدد الأنوية والذاكرة غير متوافقين |
| no_human_interaction | +30 | أُرسل فورًا دون كتابة أو حركة فأرة أو لمس |
| instant_signup | +25 | اكتمل تعبئته وإرساله خلال ثانية من تحميل الصفحة |
| os_mismatch | +20 | نظام التشغيل يناقض نفسه |
| browser_mismatch | +20 | المتصفح يناقض وكيل المستخدم الخاص به |
| fonts_mismatch | +15 | الخطوط لا تطابق النظام المُعلن |
| canvas_noise | +15 | بصمة canvas عشوائية |
| software_renderer | +15 | رسوميات برمجية (آلة افتراضية أو بلا واجهة) |
| zero_window | +15 | نافذة بلا أبعاد |
| permissions_mismatch | +15 | حالات أذونات متناقضة |
| no_plugins | +10 | Chrome لسطح المكتب بلا إضافات |
| no_languages | +10 | متصفح بلا لغات |
| utc_timezone | +5 | الساعة على UTC |
| token_missing | 0–100 | لا يوجد رمز زائر (لم يُحمَّل الوكيل أو حُجب) |
| token_invalid | +30 | رمز زائر مزوّر أو لمشروع آخر |
| token_replayed | +35 | رمز زائر مستخدم من قبل |
| token_expired | +10 | رمز زائر منتهي الصلاحية |
| token_ip_mismatch | +8 | رمز جُمع على شبكة أخرى |
| token_ua_mismatch | +15 | رمز جمعه متصفح آخر |
| linked_accounts | +15 | مرتبط بحسابات أخرى |
| linked_accounts_3 | +30 | مرتبط بـ 3+ حسابات |
| linked_accounts_10 | +45 | مرتبط بـ 10+ حسابات |
| shared_card | +30 | بطاقة استخدمها حساب آخر |
| device_burst | +15 | 5+ فحوص من هذا الجهاز خلال ساعة |
مصادر البيانات
نطاقات البريد المؤقت: مشروع disposable-email-domains (CC0) ومشروع disposable/disposable-email-domains (MIT)، تُحدَّث يوميًا. نطاقات مراكز البيانات: القوائم المنشورة من AWS وGoogle Cloud وOracle Cloud وDigitalOcean وLinode. Tor: قائمة عُقد الخروج من Tor Project، تُحدَّث كل ساعة.
الآن: 98,644 نطاق بريد مؤقت و21,665 نطاق عناوين.