نظرة عامة
واجهة API الخارجية للمطورين منفصلة عمدًا عن واجهة API الخاصة بحسابات المستخدمين المدفوعة. وهي تمنح المطورين المعتمدين وصولًا محميًا بمفتاح API إلى أحكام أصالة النطاقات وبيانات مؤشرات درجة الأمان.
لا تعمل مفاتيح المطورين الخارجية على /api/v1 (واجهة API الخاصة بحسابات المستخدمين المدفوعة)، ولا تُرجع سجل النطاقات المتابَعة، ولا التقارير بعد تسجيل الدخول، ولا معرّفات ملكية الفحوصات، ولا حزم الأدلة المدفوعة.
نوعان من الفحص
يُجري MyDomainRisk فحوصات بمستويين مختلفين من العمق، وتمنحك هذه الواجهة المستوى الأقل عمقًا. والفرق ليس حدًّا لعدد الفحوصات التي يمكنك إجراؤها — بل هو فرق في حجم التحليل المُنجَز ومقدار التفاصيل المُرجَعة.
| الفحص السريع (هذه الواجهة) | درجة أو حكم، وعناوين ما عُثر عليه. الفحص نفسه، بالعمق نفسه والتفاصيل نفسها التي يحصل عليها الزائر على موقعنا — لا أكثر ولا أقل. |
|---|---|
| الفحص الكامل (بعد تسجيل الدخول) | تحليل أعمق مع النتائج التفصيلية، والإجراءات الموصى بها، والتقرير، والسجل. متاح في التطبيق، وعبر واجهة API الخاصة بالحساب لنطاقات الحساب نفسه. |
ما لا يفعله الفحص السريع
- لا يشرح النتيجة. تحصل على عنوان ودرجة خطورة، لا على التحليل الذي تستند إليه، ولا على خطوات المعالجة، ولا على المصادر التي أسهمت فيها.
- قد تكون درجته أعلى من درجة الفحص الكامل، ولا تكون أدنى منها أبدًا. فهو يقرأ مؤشر انكشاف أخف، لذا لا يمكن لأربعة فحوصات أعمق أن تخفضها. وعندما ينطبق ذلك،
coverage_noteيذكر ذلك في الاستجابة — فلا تعرض الرقم من دونه. وعندما يتعذّر جمع الأدلة الأساسية لا توجد درجة على الإطلاق (scoreقيمتها null، وليست صفرًا أبدًا) وscore_noteيوضح السبب. - قد يُرجع حكمًا مؤقتًا بشأن الأصالة. عندما تكون قيمة
enrichment_statusهيpending، فهذا يعني أن مؤشرين أبطأ لا يزالان قيد التشغيل وقد يتغيّر الحكم. لا يُرسَل إليك أي شيء عند انتهائهما. اطلب النطاق نفسه مجددًا بعد قليل وستحصل على الإجابة المكتملة، التي تُظهر القيمةcompleted. أما الحكم ذو القيمةnot_applicableفلم يحتج إلى أي مؤشر بطيء، ولن يتغيّر مهما تكرر الطلب. وهذا بالضبط سلوك الموقع — فالزائر لا يُبلَّغ أيضًا. - ربما لم يقرأ الصفحة الرئيسية.
homepage.reviewedيخبرك ما إذا كان قد قرأها، وhomepage.blocked_byيسمّي ما منعه. «لم يُعثر على شيء» و«تعذّر جلب الصفحة» إجابتان مختلفتان، ويجب ألا تُعرضا بالطريقة نفسها. - تُخزَّن النتائج مؤقتًا لمدة تصل إلى ٢٠ دقيقة ولا يوجد خيار لفرض التحديث. وقد لا يظهر بعدُ تغيير طرأ على النطاق خلال الدقائق القليلة الماضية.
لأنه الفحص نفسه الذي يمكن للزائر إجراؤه، فإنه يخضع للحصة نفسها: خمس مرات في الساعة. وهو لا يستهلك حصة الفحوصات اليومية للحساب، المخصصة للفحوصات الكاملة.
هذه إجابات على مستوى النتيجة لأغراض التقييم والفرز. ولا تغني عن فحص كامل لنطاق أنت مسؤول عنه.
عقد قابل للقراءة آليًا
يُنشر عقد API الكامل كمستند بصيغة OpenAPI 3.1 . تحقّق من صحة الاستجابات في CI لديك أو أنشئ منه عملاء برمجيين محددي الأنواع (typed clients) بدلًا من نسخ الجداول أدناه.
curl -sS https://mydomainrisk.com/openapi.jsonيمكن الوصول إلى المستند نفسه من مضيف API، الذي يعيد التوجيه إلى العنوان أعلاه:
curl -sSL https://api.mydomainrisk.com/api/developer/v1/openapi.jsonيتضمن القيم المسموح بها بدقة لكل حقل له مجموعة ثابتة من الإجابات — الأحكام، والتقديرات، وفئات الدرجات، ودرجات خطورة النتائج — فلا حاجة إلى استنتاج أي شيء في هذه الصفحة من أمثلة الاستجابات.
واجهتا API، وأيهما تحتاج
هناك واجهتان، وتجيبان عن سؤالين مختلفين. فواجهة API الفحص السريع (peek) للمطورين تجيب عن سؤال حول نطاق تسمّيه — مدى حمايته، أو ما إذا كان هو ما يدّعيه فعلًا — وتُرجع النتيجة نفسها التي يحصل عليها الزائر على الموقع. أما واجهة API الحساب فتقرأ حسابك أنت: النطاقات التي تتابعها، وسجل فحوصاتها وتقاريرها، لأغراض الأتمتة التي تديرها بنفسك.
كلتاهما متاحة في كل الخطط، بما فيها المجانية. الفرق ليس في الباب بل في الغرفة: كل مفتاح محكوم بحدود الخطة التي يتبع لها، و GET /me يُرجع تلك الحدود لتقرأها بدلًا من أن تخمّنها.
يحمل المفتاح أحد الدورين فقط ولا يمكن استخدامه للدور الآخر. يُرفض مفتاح المطوّر إذا أُرسل إلى نقطة نهاية خاصة بالحساب، ويُرفض العكس أيضًا.
المصادقة
مفاتيح واجهة API للمطورين متاحة في كل الخطط، بما فيها المجانية. يرتبط المفتاح بحساب مالكه ويستطيع فعل ما يستطيعه ذلك الحساب — لا أكثر. أنشئ مفتاحًا من نوع Developer API - authenticity and score advisory من قسم الحساب وأرسله كرمز Bearer.
Authorization: Bearer mdr_live_<id>_<secret>لا تستخدم مفاتيح المطورين إلا في شيفرة تعمل على الخادم. لا تضعها في JavaScript المتصفح، ولا في تطبيقات الجوال، ولا في المستودعات العامة، ولا في السجلات على جهة العميل.
تحقّق من صلاحية المفتاح قبل البناء عليه:
GET https://api.mydomainrisk.com/api/developer/v1/me
Authorization: Bearer mdr_live_<id>_<secret>
{
"api": "developer",
"version": "v1",
"scope": "developer_peek",
"tier": "pro",
"capabilities": [
{ "operation_id": "getDeveloperCapabilities", "method": "GET", "path": "/me" },
{ "operation_id": "checkDomainSecurity", "method": "GET", "path": "/peek/security" },
{ "operation_id": "checkDomainAuthenticity", "method": "GET", "path": "/peek/authenticity" }
],
"limits": {
"requests_per_minute_per_key": 120,
"requests_per_minute_per_ip": 60,
"requests_per_hour_per_subnet": 150,
"cache_max_age_seconds": 1200
},
"entitlements": {
"security_score_advisory": true,
"authenticity_verdict": true,
"account_data": false,
"force_refresh": false,
"consumes_account_daily_allowance": false
}
}لا تتضمن استجابة الإمكانات عمدًا البريد الإلكتروني للحساب ولا أي بيانات للعملاء.
إذا كنت تحتاج إلى الوصول إلى API وليس لديك حساب، أو تريد مناقشة ترتيب شراكة، فتواصل مع support@mydomainrisk.com.
مؤشر درجة الأمان
GET https://api.mydomainrisk.com/api/developer/v1/peek/security?domain=example.com
Authorization: Bearer mdr_live_<id>_<secret>مثال على الاستجابة:
{
"domain": "example.com",
"checked_at": "2026-08-17T12:00:00Z",
"score": 82,
"grade": "B",
"score_summary": {
"bucket": "goodWithGaps",
"label": "GOOD — GAPS REMAIN"
},
"score_basis": "point",
"score_note": null,
"findings": [
{
"title": "DMARC policy could be stronger",
"severity": "medium"
}
],
"total_findings": 1,
"cache": { "hit": false, "max_age_seconds": 1200 },
"scan_time_ms": 842
}حكم الأصالة
GET https://api.mydomainrisk.com/api/developer/v1/peek/authenticity?domain=example.com
Authorization: Bearer mdr_live_<id>_<secret>يمكنك إضافة سياق اختياري عن العلامة التجارية عندما يكون اسم الجهة المتوقعة معروفًا:
GET https://api.mydomainrisk.com/api/developer/v1/peek/authenticity?domain=example.com&expected_brand=Example%20Ltd
Authorization: Bearer mdr_live_<id>_<secret>مثال على الاستجابة:
{
"domain": "example.com",
"checked_at": "2026-08-17T12:00:00Z",
"verdict": "genuine",
"findings": [],
"total_findings": 0,
"factual": {
"resolves": true,
"registrar": "Example Registrar Ltd",
"age_days": 10950,
"has_tls": true
},
"cache": { "hit": false, "max_age_seconds": 1200 },
"scan_time_ms": 936
}الأصالة verdict — القيم الممكنة:
| genuine | لا يظهر أي قلق جوهري بشأن الأصالة. يُربط بالنجاح / الأخضر. |
|---|---|
| probablyLegit | مشروع على الأرجح مع تحفظات طفيفة. يُربط بالنجاح / الأخضر. |
| uncertain | يتعذّر التصنيف بثقة. ينبغي أن يراجعه إنسان. يُربط بالمراجعة / الأصفر. |
| suspicious | توجد مؤشرات مقلقة. تعامل معه بحذر. يُربط بالمراجعة أو الإخفاق / الأصفر-الأحمر. |
| malicious | مؤشرات قوية على نشاط خبيث أو انتحال للهوية. لا تعامله على أنه آمن. يُربط بالإخفاق / الأحمر. |
في عمليات التكامل البسيطة بنظام إشارات المرور، اربط genuine و probablyLegit بالنجاح، uncertain و suspicious بالمراجعة، و malicious بالإخفاق.
الحقول
حقول مؤشر درجة الأمان
| domain | النطاق بصيغته الموحّدة المُرسَل للفحص. |
|---|---|
| checked_at | وقت الفحص بصيغة ISO ٨٦٠١. قد تكون قيمته null لنتيجة مخزّنة مؤقتًا أُنشئت قبل إضافة هذا الحقل. |
| score | مؤشر درجة الأمان على مقياس من ٠ إلى ١٠٠. الأعلى أفضل — ٠ أسوأ نتيجة و١٠٠ أفضلها. تكون القيمة null عندما يتعذّر جمع الأدلة الأساسية (TLS، أو الترويسات، أو DNS، أو الانكشاف، أو CAA، أو MTA-STS) — وهي القاعدة التي يطبّقها الفحص الكامل؛ ويوضح score_note السبب. لا تعامل null على أنها صفر أبدًا. |
| grade | تقدير للعرض مشتق من الدرجة. إحدى القيم: A أو B أو C أو D أو F، أو null عندما تكون قيمة score هي null. نص للعرض — ابنِ منطقك على score_summary.bucket بدلًا منه. |
| score_summary | كائن يتضمن bucket وlabel، أو null عندما تكون قيمة score هي null — فالدرجة الغائبة ليس لها نطاق تصنيف. bucket إحدى القيم: strong، goodWithGaps، needsImprovement، atRisk، critical — مدرجة هنا من الأفضل إلى الأسوأ. أما label فهو الصياغة بلغة واضحة للفئة نفسها، وهو نص للعرض فقط. |
| score_basis | point، أو floor عندما يتعذّر قراءة ترويسات الأمان وحدها — فتكون الدرجة حينئذ حدًّا أدنى (هذه القيمة على الأقل). null عندما تكون قيمة score هي null. |
| score_note | سبب بلغة واضحة لدرجة الحد الأدنى أو لحجب الدرجة؛ وإلا فالقيمة null. |
| findings | مصفوفة بالنتائج العامة الحالية. يتضمن كل عنصر title وseverity فقط. severity إحدى القيم: critical، high، medium، low، info. |
| total_findings | عدد النتائج العامة الحالية. |
| cache | كائن يتضمن hit وmax_age_seconds. |
| scan_time_ms | مدة تنفيذ الطلب بالملّي ثانية. |
ابنِ منطقك على score_summary.bucket بدلًا من مقارنة score بعتباتك الخاصة. الفئة (bucket) جزء من العقد؛ أما العتبة التي تختارها بنفسك فليست كذلك، وستنحرف عن عتباتنا دون أي خطأ ينبّهك.
حقول حكم الأصالة
| domain | النطاق بصيغته الموحّدة أو مضيف عنوان URL المُرسَل للفحص. |
|---|---|
| checked_at | وقت الفحص بصيغة ISO ٨٦٠١. قد تكون قيمته null لنتيجة مخزّنة مؤقتًا أُنشئت قبل إضافة هذا الحقل. |
| verdict | إحدى القيم: genuine، probablyLegit، uncertain، suspicious، malicious — مدرجة من الأفضل إلى الأسوأ. لا تُرجَع أي قيمة أخرى أبدًا. probablyLegit حكم إيجابي؛ والتعامل معه كإخفاق أو كقيمة مجهولة هو أكثر أخطاء التكامل شيوعًا. |
| findings | مصفوفة بالنتائج العامة الحالية. يتضمن كل عنصر title وseverity فقط. |
| total_findings | عدد النتائج العامة الحالية. |
| factual | سياق وقائعي بحت: resolves وage_days وhas_tls وregistrar؛ وتكون قيم العمر أو جهة التسجيل غير المتاحة null. |
| cache | كائن يتضمن hit وmax_age_seconds. |
| scan_time_ms | مدة تنفيذ الطلب بالملّي ثانية. |
تُخزَّن النتائج مؤقتًا لمدة تصل إلى ٢٠ دقيقة. لا يوجد في واجهة API للمطورين خيار لفرض التحديث؛ اعرض النتائج كمؤشر حديث لا كقرار دائم بالنسبة إلى النطاقات التي ربما تغيّرت للتو.
الحدود والأخطاء
طلبات واجهة API للمطورين محدودة بـ ١٢٠ طلبًا في الدقيقة لكل مفتاح، و٦٠ في الدقيقة لكل عنوان IP، و١٥٠ في الساعة لكل شبكة فرعية.
الحصة التي تقيّد الفحص فعليًا هي خمس مرات في الساعة لكل عنوان IP — وهي الحصة نفسها التي يحصل عليها الزائر عند إجراء الفحص نفسه على موقعنا. أما الأرقام بالدقيقة أعلاه فهي ضوابط للدفعات المفاجئة تُضاف فوقها. /me يعرضها باسم peeks_per_hour_per_ip، وقراءة /me لا تُحتسب منها.
هذه الفحوصات لا تستهلك حصة الفحوصات اليومية للحساب. فتلك الحصة مخصصة للفحوصات الكاملة، وهي أعمق وأمر مختلف تمامًا.
| 400/422 | متن طلب أو سلسلة استعلام غير صالحة، أو نطاق مشوّه الصيغة. |
|---|---|
| 401 | مفتاح API مفقود، أو مشوّه الصيغة، أو غير معروف، أو ملغى. |
| 403 | نوع مفتاح خاطئ، أو حساب غير مؤهل للوصول إلى API. |
| 429 | بلوغ حد معدل الطلبات أو أحد ضوابط حماية المنصة. |
| 503 | مشكلة مؤقتة في قائمة الانتظار أو التخزين المؤقت أو مخزن الحصص. أعد المحاولة لاحقًا. |
| 504 | لم يكتمل الفحص في الخدمة المصدر في الوقت المحدد. أعد المحاولة لاحقًا. |
يُرجع كل إخفاق بنية JSON نفسها، على كل مسار وبكل رمز حالة. ابنِ منطقك على error.code، لا على نص الرسالة:
{ "error": { "code": "rate_limited", "message": "...", "retry_after_seconds": 30 } }| invalid_api_key | ٤٠١. مفتاح مفقود، أو مشوّه الصيغة، أو غير معروف، أو ملغى. |
|---|---|
| forbidden | ٤٠٣. نوع مفتاح خاطئ، أو الحساب غير مؤهل. |
| invalid_domain | ٤٢٢. تعذّر تحليل النطاق أو مضيف عنوان URL. |
| rate_limited | ٤٢٩. بلوغ إحدى الحصص — حصة الفحوصات بالساعة أو أحد ضوابط الدفعات المفاجئة. التزم بـ Retry-After، أو error.retry_after_seconds. |
| temporarily_unavailable | ٥٠٣. مشكلة عابرة في قائمة الانتظار أو التخزين المؤقت أو مخزن الحصص. |
| scan_timeout | ٥٠٤. لم يكتمل الفحص في الخدمة المصدر في الوقت المحدد. |
| request_failed | أي رمز حالة. الرمز الاحتياطي عندما لا ينطبق رمز أكثر تحديدًا. |
تعامل مع هذه القائمة على أنها الرموز التي تستحق المعالجة كلٌّ على حدة، لا على أنها مجموعة مغلقة: تعرّف على هذه الرموز واعتمد على رمز حالة HTTP في كل ما عداها، حتى لا يعطّل أي رمز جديد عملية التكامل لديك.
تتضمن الاستجابة ٤٢٩ ترويسة Retry-After إضافة إلى الحقل أعلاه. انتظر وفقًا لقيمتها بدلًا من فاصل زمني ثابت.
الاستخدام المقبول
واجهة API مخصصة لإجراءات العمل المشروعة في الأعمال والأمن ومكافحة الاحتيال وحماية العملاء والامتثال. ولا يُجري MyDomainRisk إلا تحليلًا خارجيًا غير تدخّلي.
مسموح
- فحوصات عند تسجيل العملاء والاشتراك.
- مراجعة العملاء والشركاء والنطاقات.
- إجراءات العمل الداخلية لمكافحة الاحتيال وإدارة المخاطر والأمن.
غير مسموح
- الاستغلال، أو محاكاة الهجمات، أو اختبار بيانات الدخول.
- تجاوز الحصص، أو فترات الانتظار، أو ضوابط الوصول.
- استخدام مفاتيح حسابات المستخدمين المدفوعة كمفاتيح مطورين خارجية.
الخصوصية ومعالجة البيانات
تتلقى واجهة API للمطورين النطاق والبيانات الوصفية للطلب اللازمة لتقديم الخدمة، والتحقق من هوية الجهة المتصلة، وتطبيق الحدود، وحماية المنصة. ولا يبيع MyDomainRisk البيانات المرسلة عبر API.
قد تُخزَّن نتائج واجهة API للمطورين مؤقتًا وتُحتسب ضمن إحصاءات استخدام مجمّعة، وفق نموذج التشغيل نفسه لفحوصات النطاقات العامة وسياسة الخصوصية لدى MyDomainRisk. للاستفسارات المتعلقة بالخصوصية، تواصل مع support@mydomainrisk.com.
سجل التغييرات
2026-06-25
حُدّثت وثائق المطورين العامة بإضافة التحقق من صلاحية المفاتيح، وأمثلة على استجابات JSON، وقيم الأحكام، وحدود معدل الطلبات، وإرشادات التخزين المؤقت لواجهة API الخارجية المنفصلة للمطورين.