> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# بيانات اختبار البيئة التجريبية: القيم السحرية والمستندات

> اختبر Didit في البيئة التجريبية: سيناريوهات، وقيم سحرية، ومستندات عينات ورموز OTP لنتائج محددة دون فوترة أو بيانات شخصية.

تُعد **البيئة التجريبية** في Didit المقابلة لبطاقات الاختبار في Stripe أو قوالب المستندات في Sumsub: فهي تتيح لك إعادة إنتاج أي نتيجة تحقق بشكل حتمي، دون التعامل مع مزودين حقيقيين أو بيانات شخصية حقيقية أو المساس برصيدك.

> [!NOTE]
>
> المصدر المرجعي الموثوق لهذه البيانات هو `serialize_catalog()` في خدمة التحقق، ويتم توفيره مباشرة عبر `GET /v1/sandbox/scenarios/`. يتم إنشاء نسخة خاضعة لاختبارات الانحراف داخل `docs/sandbox/SANDBOX_REFERENCE.md` في مستودع `service-didit-verification` عبر الأمر `pipenv run python scripts/generate_sandbox_reference.py`. تعكس هذه الصفحة ذلك المرجع — واعتمد دائمًا على endpoint الخاص بالكتالوج المباشر إذا بدا أي شيء هنا قديمًا. يتطلب endpoint الخاص بالكتالوج المصادقة: أرسل مفتاح API الخاص بك (`x-api-key`) بالطريقة نفسها التي ترسلها في أي استدعاء آخر، أو token الجلسة إذا كنت تقرأه من داخل جلسة قيد التشغيل.

## نموذج البيئة

البيئة التجريبية هي **وضع يُطبَّق لكل تطبيق** (`ApplicationDetail.mode == SANDBOX`)، وهي الفكرة ذاتها لوضع الاختبار في Stripe. عندما تعمل الجلسة تحت تطبيق في البيئة التجريبية:

* تتم **محاكاة** كل مزود خارجي (OCR، وفحص AML، ومطابقة الوجه، وكشف الحيوية، والتحقق عبر NFC، ورقم الهاتف، والبريد الإلكتروني، وعنوان IP، وإثبات العنوان، والتحقق من قواعد البيانات، وDocument AI) — ولا يتم استدعاء أي طرف ثالث على الإطلاق.
* **يعمل كشف الحيوية تمامًا كما يعمل في بيئة الإنتاج.** ينفذ سير العمل الخاص بكشف الحيوية التفاعلي عملية الالتقاط التفاعلي الحقيقية في البيئة التجريبية، سواء في المسار المستضاف أو عبر التسليم للويب من خلال حزم SDK الأصلية، مما يتيح لك اختبار التجربة التي سيحصل عليها المستخدمون. يتم محاكاة *نتيجة* كشف الحيوية فقط، عبر السيناريو أو القيمة السحرية، ويسجل التقرير الطريقة التي يهيئها سير عملك.
* **النطاقات المخصصة لبيئة الإنتاج فقط.** لا يمكن لتطبيق في البيئة التجريبية إضافة [نطاق مخصص](https://docs.didit.me/ar/console/custom-domain.md)؛ تعمل جلسات البيئة التجريبية دائمًا على النطاق الافتراضي لصفحة التحقق المستضافة.
* الجلسات **لا تُفوتر أبدًا** ويتم تجاوز التحقق من الرصيد.
* يتم تطبيق حصة محددة لكل تطبيق تبلغ **500 عملية إنشاء جلسة / 24 ساعة**.
* تحمل webhooks القيمة `"environment": "sandbox"` (بينما تحمل جلسات بيئة الإنتاج القيمة `"environment": "live"`).
* يعرض المسار المستضاف بيئة الجلسة حتى تتمكن واجهة المستخدم من تحذير المستخدمين من رفع معلومات شخصية حقيقية.
* **لا تعتمد النتائج إطلاقًا على وحدات البكسل (الصور)**: تأتي البيانات المستخرجة والحالات من السيناريو / القيمة السحرية. بينما يتم تخزين الوسائط الملتقطة نفسها (المستندات، وصورة سيلفي، والفيديو، وملفات إثبات العنوان) بصورة فعلية، تمامًا مثل جلسات بيئة الإنتاج.

## مراقبة المعاملات في البيئة التجريبية

البيئة التجريبية **مبنية على نموذج الجلسات**: فهي تحاكي المزودين الذين قد تستدعيهم جلسة التحقق. لا تعتمد مراقبة المعاملات على أي مزود لتتم محاكاته، لذا يسلك التطبيق في البيئة التجريبية المسار الآخر: يتم تخزين المعاملة، ولكن **لا يتم تشغيل أي شيء يتخذ قراراً أو يُجري فحصاً أو يرسل إشعاراً أو يفرض رسوماً عليها على الإطلاق**.

يتم حفظ المعاملة المنشأة في تطبيق في البيئة التجريبية وإرجاعها كالمعتاد، ولا ينطبق أي مما يلي عليها:

* **عدم تقييم القواعد.** يكون `rule_runs` فارغاً، أياً كان الوضع الذي تعمل به قواعدك. لا يتم تشغيل أي قاعدة في وضع `ACTIVE` على تطبيق في البيئة التجريبية، لذا تظل المعاملة بحالة `APPROVED` مع درجة `0` ولا يتم فتح أي تنبيه أو حالة.
* **عدم إجراء فحص AML / فحص المحافظ.** يكون `provider_results` فارغاً حتى لمعاملات العملات المشفرة في تطبيق تم تمكين المراقبة فيه.
* **عدم إرسال أي webhooks.** لا يتم تسليم `transaction.created` ولا `transaction.status.updated` لمعاملة في البيئة التجريبية.
* **عدم احتساب أي فوترة.** يتم تسجيل حدث استخدام بسعر `0.0000` ويبقى رصيدك دون تغيير.

تحمل كل استجابة معاملة حقلاً باسم `environment` (بقيمة `"live"` أو `"sandbox"`)، لذا فإن خلو `rule_runs` لا يترك أي مجال للبس: تعني القيمة `"sandbox"` أن القواعد لم تُقيَّم، وليس أنه لم تتطابق أي منها. توضح Business Console الأمر نفسه في بطاقة *المخاطر والقرار* للمعاملة بدلاً من مجرد عرض عبارة "لم يتم تقييم أي قواعد".

> [!NOTE]
>
> **تُعد Travel Rule الاستثناء الوحيد لقاعدة "عدم تشغيل أي شيء".** في تطبيق تم تمكين Travel Rule فيه، لا تزال معاملة `travelRule` في البيئة التجريبية تشغل محرك التبادل: إذ يتم إنشاء سجل التحويل ويتنقل بين حالاته المختلفة.
> ما لا تفعله البيئة التجريبية مطلقاً هو التواصل مع أي جهة خارج Didit.
> الطرف المقابل الوحيد لها هو [Didit Test VASP](https://docs.didit.me/ar/transaction-monitoring/travel-rule-sandbox.md)، المدمج في المنصة: لا تصل أي رسالة امتثال إلى VASP حقيقي طرف مقابل عبر أي مسار (`TRP`، أو عضوية شبكة قمت بربطها، أو البريد الإلكتروني، أو `INTERNAL`)، ويتم تخطي فحص إسناد VASP الطرف المقابل، كما لا يؤدي الإلغاء إلى إرسال أي شيء إلى طرف مقابل.
> يتم تسليم أحداث webhook الخاصة بـ `travel_rule.status.updated` مع وسمها بـ `"environment": "sandbox"`.
>
> **صادر** - معاملة `travelRule` ترسلها أنت.
> يتم تشغيل فحص `threshold_amount` أولاً، وفي البيئة التجريبية لا ينطبق إلا عند إرسال `transaction_details.amount_in_default_currency`، لأن البيئة التجريبية لا تقوم بتحويل العملات، وبدون ذلك يُعتبر كل تحويل في البيئة التجريبية أعلى من الحد.
> تنتهي صلاحية التحويل الذي لم يتم الرد عليه بعد `confirmation_timeout_hours`، ثم تنطبق نتيجة `timeout_outcome` المحددة لديك على المعاملة.
> أعلى من الحد، ينطبق فحص المحفظة ذاتية الاستضافة كالمعتاد: ينتقل التحويل المتجه إلى [محفظة ذاتية الاستضافة مُعلنة](https://docs.didit.me/ar/transaction-monitoring/travel-rule.md#المحافظ-ذاتية-الاستضافة-المُصرَّح-بها) إلى حالة `UNCONFIRMED_OWNERSHIP` دون إرسال أي شيء، ويمكنك إكماله في البيئة التجريبية عبر [أداة ملكية المحفظة](https://docs.didit.me/ar/transaction-monitoring/wallet-ownership-widget.md)، أو عبر [تأكيد الملكية](https://docs.didit.me/ar/management-api/travel-rule/confirm-ownership.md) عندما تكون المحفظة الوجهة موجودة بالفعل في دفتر عناوين المحافظ لديك.
> أي تحويل آخر أعلى من الحد يذهب إلى Didit Test VASP عبر مسار `TEST_VASP`، والذي يرد عليه داخل Didit وفق السيناريو الذي تختاره بحسب محفظة المستفيد أو اسمه: فيكتمل، أو يُرفض، أو لا يتطابق، أو يصبح `COUNTERPARTY_VASP_NOT_REACHABLE`، أو تنتهي صلاحيته (حيث تنطبق نتيجة `timeout_outcome` الخاصة بك على المعاملة) أو ينتظر ملكية المحفظة.
> راجع [اختبار Travel Rule في البيئة التجريبية](https://docs.didit.me/ar/transaction-monitoring/travel-rule-sandbox.md) للاطلاع على كل سيناريو.
>
> **وارد** - `POST /v3/travel-rule/inbound/`. لا يقوم التسجيل بالإرسال عبر أي مسار مطلقاً، لذا لا يوجد شيء خاضع للمحاكاة فيه: تقوم البيئة التجريبية بمطابقة الإيداع مع دفتر عناوين المحافظ الخاص بك وتسويته بشكل متزامن، تماماً كما تفعل بيئة الإنتاج. ويؤول إلى نتيجة فعلية بدلاً من `AWAITING_COUNTERPARTY` - وهي: `ON_HOLD` (عدم وجود تطابق في دفتر العناوين)، أو `UNCONFIRMED_OWNERSHIP` (الإدخال المطابق غير موثق الملكية)، أو `COUNTERPARTY_MISMATCHED_DATA` (اسم المستفيد لا يطابق صاحب المحفظة)، أو `COMPLETED` ثم `FINISHED` (تطابق مع إدخال تم التحقق منه).
> لاستلام تحويل من Didit Test VASP بدلاً من ذلك، استخدم [تشغيل تحويل وارد من Test VASP](https://docs.didit.me/ar/management-api/travel-rule/trigger-test-vasp-inbound.md) باستخدام إحدى محافظ دفتر العناوين الخاصة بك.

### سيناريوهات Test VASP لـ Travel Rule

يسرد الكتالوج `travel_rule.scenarios` هذه السيناريوهات الصادرة. عيّن اسم المستفيد أدناه في معاملة `travelRule` صادرة بعد تمكين Travel Rule في تطبيقك في البيئة التجريبية. يتم تشغيل فحوصات الحد والمحفظة ذاتية الاستضافة المُعلنة الموضحة أعلاه أولاً.

| السيناريو | اسم المستفيد | النتيجة |
| - | - | - |
| `accept` | `Didit Test VASP` | `COMPLETED` |
| `decline` | `Didit Test VASP Decline` | `COUNTERPARTY_VASP_GENERAL_DECLINE` |
| `name_mismatch` | `Didit Test VASP Name Mismatch` | `COUNTERPARTY_MISMATCHED_DATA` |
| `not_reachable` | `Didit Test VASP Not Reachable` | `COUNTERPARTY_VASP_NOT_REACHABLE` بعد محاولات إعادة التسليم |
| `timeout` | `Didit Test VASP Timeout` | `EXPIRED` عند تشغيل فحص انتهاء الصلاحية بعد المهلة المحددة بدقيقة واحدة |
| `self_hosted` | `Didit Test VASP Self Hosted` | `UNCONFIRMED_OWNERSHIP` |

يمكنك أيضاً اختيار سيناريو باستخدام عنوان محفظة المستفيد بدلاً من الاسم (تكون الأولوية للمحفظة في حال تم تعيين كليهما)، ويكتمل التحويل الذي لا يحدد أياً منهما كـ `accept`. يسرد [اختبار Travel Rule في البيئة التجريبية](https://docs.didit.me/ar/transaction-monitoring/travel-rule-sandbox.md) محفظة كل سيناريو ونتيجته الدقيقة.

يقبل [مُشغِّل Test VASP للتحويلات الواردة](https://docs.didit.me/ar/management-api/travel-rule/trigger-test-vasp-inbound.md) القيمتين `accept` و`name_mismatch` فقط في حقل `scenario` الخاص به.

> [!NOTE]
>
> **كيفية تجربة قاعدة قبل تفعيلها في بيئة الإنتاج.** استخدم
> [الاختبار الرجعي](https://docs.didit.me/ar/transaction-monitoring/rules-api.md#الإنشاء-والاختبار-الرجعي-والتفعيل): فهو يعيد
> تشغيل القاعدة على سجل معاملاتك الفعلي ويعرض تقارير عن `evaluated` /
> `matched` / `affected_entities` دون المساس بحالة أي معاملة. ادمج ذلك
> مع وضع `TEST` في تطبيق بيئة الإنتاج - حيث يتم تقييم قاعدة `TEST` على كل معاملة جديدة
> في بيئة الإنتاج وتسجيل ما كان سيتطابق معها، دون تغيير الدرجة أو الحالة -
> ثم انتقل إلى `ACTIVE` بمجرد أن تبدو انتقائية القاعدة مناسبة.

## كيفية التبديل بين الإنتاج والبيئة التجريبية

تعد بيئة الإنتاج والبيئة التجريبية **تطبيقات منفصلة**، وبالتالي لا تختلط حركة مرور الاختبار وبيانات الإنتاج مطلقاً. يمتلك كل تطبيق `mode` بقيمة `live` أو `sandbox`:

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

يتم قبول الحقل `sandbox_scenario` (عند إنشاء الجلسة وفي واجهة برمجة تطبيقات فحص AML المستقلة) ونقاط endpoint الخاصة بالمحاكاة فقط في تطبيقات البيئة التجريبية؛ ويتم رفضها في تطبيقات الإنتاج.

## البيئة التجريبية في مسار التحقق المستضاف

تُظهر الجلسات المنشأة ضمن تطبيق في البيئة التجريبية واجهة مستخدم إضافية في مسار التحقق المستضاف (الرابط `url` الذي يتم إرجاعه بواسطة `POST /v3/session/`):

* **شريط البيئة التجريبية داخل البطاقة.** تعرض كل شاشة شريطاً داخل البطاقة - "بيانات اختبار فقط - لا توجد استدعاءات حقيقية" - بحيث يكون من الواضح دائماً أن الجلسة لا تستدعي مزودين حقيقيين ولا تلمس رصيدك أبداً. يتم تخزين الوسائط الملتقطة كما في أي جلسة، لذا استخدم عينات المستندات وبيانات الاختبار بدلاً من مستندات الهوية الحقيقية أو المعلومات الشخصية.
* **أداة اختيار السيناريو قبل بدء المسار.** قبل بدء عملية الالتقاط، ترشد أداة اختيار داخل البطاقة المستخدم لاختيار نتيجة اختبار: اختر النتيجة، ثم اختر المُشغِّل الخاص بتلك النتيجة. يؤدي التأكيد إلى استدعاء `POST /v3/session/{session_id}/sandbox/arm/` (راجع [تهيئة (أو إعادة تهيئة) الجلسة قبل بدء المسار](#3-تجهيز-أو-إعادة-تجهيز-الجلسة-قبل-بدء-التدفق) أدناه)، ثم المتابعة في المسار مع تطبيق القيم السحرية الخاصة بذلك السيناريو مسبقاً.
* **شريط عينات المستندات.** يوجد صف واحد من عينات مستندات البيئة التجريبية (حتى 3) مباشرة أسفل مكوّن رفع/التقاط المستندات. اضغط على أحدها لاستخدامه بدلاً من الرفع الحقيقي.

تُخزن جلسات البيئة التجريبية الوسائط الملتقطة **الحقيقية** - حيث يتم رفع المستندات، وصورة سيلفي، وفيديو كشف الحيوية، وملفات إثبات العنوان، والاحتفاظ بها تماماً كما هو الحال في جلسة الإنتاج. أما البيانات *المستخرجة* (حقول التحقق من الهوية، درجات مطابقة الوجه، نتائج كشف الحيوية، وما شابه ذلك) ونتيجة الجلسة نفسها (مقبولة / قيد المراجعة / مرفوضة) فتتم محاكاتها بواسطة السيناريو أو القيمة السحرية - ولا يتم استخلاصها أبداً من الوسائط الملتقطة. تُميز Business Console أقسام البيانات المستخرجة في جلسة البيئة التجريبية بشارة **بيانات محاكاة**، حتى يتمكن المراجعون من التمييز بنظرة سريعة بين الأجزاء التي تمثل الالتقاط الحقيقي وتلك التي يقودها السيناريو.

## السيناريوهات

كل سيناريو عبارة عن حزمة مسماة من القيم السحرية. مرّر الـ slug الخاص به كـ `sandbox_scenario` عند إنشاء الجلسة (أو إلى endpoint الـ simulate) لإعادة إنتاج النتيجة.

| Slug | العنوان | الحالة الافتراضية | الوصف |
| - | - | - | - |
| `approve` | المسار السلس — الموافقة على جميع الميزات | مقبولة | سلوك البيئة التجريبية الافتراضي: تُرجع كل ميزة محاكاة نتيجتها النظيفة APPROVED. تنتهي حالة الجلسة كـ APPROVED. |
| `decline_aml_hit` | فحص AML — شخص معرض سياسياً | مرفوضة | تُرجع محاكاة AML تطابقاً واحداً وتُرفض الجلسة بناءً على ميزة AML. يستخدم هذا التطابق نفس [مخطط Hit](https://docs.didit.me/ar/core-technology/aml-screening/report-aml-screening.md#حقول-كل-نتيجة) المستخدم مع مزودي AML في بيئة الإنتاج — حيث تتم تعبئة كل من `url` و`match_score` و`risk_score` و`review_status` و`properties` و`pep_matches[]` و`score_breakdown` — ويتم تسجيل سجل تحذير من نوع POSSIBLE\_MATCH\_FOUND. |
| `decline_document_expired` | التحقق من الهوية — مستند منتهي الصلاحية | مرفوضة | تُرجع محاكاة التحقق من الهوية جواز سفر تاريخ انتهائه قد مضى. تُرفض الجلسة في التحقق من الهوية مع تسجيل سجل تحذير من نوع DOCUMENT\_EXPIRED. |
| `decline_minimum_age` | التحقق من الهوية — دون الحد الأدنى للسن وفق السياسة | مرفوضة | تُرجع محاكاة التحقق من الهوية تاريخ ميلاد يجعل عمر المستخدم حوالي 10 سنوات تقريباً. يُصدر فحص العمر في الإنتاج MINIMUM\_AGE\_NOT\_MET ويؤدي سير العمل إلى الرفض. |
| `decline_mrz_validation` | التحقق من الهوية — فشل المجموع الاختباري لـ MRZ | مرفوضة | تُرجع محاكاة التحقق من الهوية جواز سفر يحتوي على مجموع اختباري تالف لـ MRZ. تُصدر أداة التحقق من MRZ في الإنتاج MRZ\_VALIDATION\_FAILED وتُرفض الجلسة. |
| `decline_could_not_recognize_document` | التحقق من الهوية — مستند غير قابل للقراءة | مرفوضة | تُرجع محاكاة التحقق من الهوية استجابة فارغة. يُصدر الإنتاج COULD\_NOT\_RECOGNIZE\_DOCUMENT ويعرضها في SDK. |
| `decline_face_match_low_similarity` | مطابقة الوجه — درجة التشابه أقل من حد الرفض | مرفوضة | تُرجع محاكاة مطابقة الوجه درجة منخفضة. يُصدر الإنتاج LOW\_FACE\_MATCH\_SIMILARITY ويؤدي تعيين إجراء عقدة سير العمل إلى الرفض. |
| `decline_database_no_match` | التحقق من قواعد البيانات — لا يوجد تطابق عبر جميع الخدمات | مرفوضة | تُرجع كل خدمة من خدمات قواعد البيانات المحددة NO\_MATCH. يُصدر الإنتاج DATABASE\_VALIDATION\_NO\_MATCH ويؤدي سير العمل إلى الرفض. |
| `decline_phone_high_risk` | التحقق من رقم الهاتف — رقم اختبار محجوز عالي المخاطر | مرفوضة | تحظر محاكاة التحقق من رقم الهاتف عملية التحقق (نطاق اختبار محجوز). ينتهي التحقق من رقم الهاتف كـ BLOCKED ويُصدر HIGH\_RISK\_PHONE\_NUMBER. |
| `decline_email_breach` | التحقق من البريد الإلكتروني — رصد تطابق في قاعدة بيانات الاختراقات | مرفوضة | تُرجع محاكاة اختراق البريد الإلكتروني نتيجة اختراق واحدة للعنوان. يُصدر التحقق من البريد الإلكتروني BREACHED\_EMAIL\_DETECTED. |
| `decline_ip_blocklist` | تحليل عنوان IP — عنوان IP موجود في قائمة الحظر | مرفوضة | ترفض محاكاة تحليل عنوان IP الموقع باستخدام IP\_ADDRESS\_IN\_BLOCKLIST. تُرفض الجلسة في تحليل عنوان IP. |
| `decline_poa_address_mismatch` | إثبات العنوان — عدم تطابق العنوان مع العنوان المقدم | مرفوضة | ترفض محاكاة إثبات العنوان مع ADDRESS\_MISMATCH\_WITH\_PROVIDED. تُرفض الجلسة في إثبات العنوان. |
| `decline_liveness_attack` | كشف الحيوية — تم اكتشاف هجوم على الوجه | مرفوضة | تكتشف محاكاة كشف الحيوية السلبي إشارة هجوم على الوجه وتُصدر LIVENESS\_FACE\_ATTACK. تُرفض الجلسة في كشف الحيوية. |
| `decline_nfc_chip_not_verified` | التحقق عبر NFC — لم يتم التحقق من شريحة جواز السفر الإلكتروني | مرفوضة | تُرجع محاكاة جواز السفر الإلكتروني شريحة يفشل توقيع SOD/DG الخاص بها في فحص السلامة. يُصدر الإنتاج NFC\_CHIP\_NOT\_VERIFIED وتُرفض الجلسة في التحقق عبر NFC عندما يتم ضبط سير العمل لرفض الشرائح غير المتحقق منها. |
| `decline_nfc_trust_anchor_missing` | التحقق عبر NFC — مرساة الثقة الخاصة بجهة الإصدار غير متوفرة | مرفوضة | تُرجع محاكاة جواز السفر الإلكتروني شريحة موقّعة بواسطة DSC تكون جهة إصدارها CSCA غير موجودة في مخزن الثقة. يُصدر الإنتاج NFC\_TRUST\_ANCHOR\_MISSING وتُرفض الجلسة عندما يتم ضبط سير العمل لرفض الشرائح غير المتحقق منها. |
| `decline_document_ai_unreadable` | Document AI — مستند غير قابل للقراءة | مرفوضة | لا تُرجع محاكاة Document AI أي حقول قابلة للقراءة. يُصدر الإنتاج DOCUMENT\_AI\_UNREADABLE\_DOCUMENT ويستقر المستند على حالة الرفض بمجرد استنفاد رصيد محاولات إعادة المحاولة. |
| `review_aml_possible_match` | فحص AML — تطابق محتمل يحتاج إلى مراجعة | قيد المراجعة | تُرجع محاكاة AML نتيجة مطابقة ذات درجة ثقة أقل. تنتقل الجلسة إلى حالة قيد المراجعة مع سجل تحذير من نوع POSSIBLE\_MATCH\_FOUND ليقوم المحلل بحله. |
| `review_face_match_borderline` | مطابقة الوجه — درجة تشابه حدية | قيد المراجعة | تُرجع محاكاة مطابقة الوجه درجة تقع بين حدي المراجعة والرفض. تنتقل الجلسة إلى حالة قيد المراجعة في مطابقة الوجه. |
| `review_document_borderline_age` | التحقق من الهوية - قاصر يُرسل إلى المراجعة | قيد المراجعة | تُرجع محاكاة التحقق من الهوية تاريخ ميلاد دون الحد الأدنى للسن الذي تم ضبطه في سير العمل. تم تعيين minimum\_age\_action لسير العمل على REVIEW بدلاً من DECLINE، لذلك تنتقل الجلسة إلى حالة قيد المراجعة في التحقق من الهوية بدلاً من الرفض. |
| `review_poa_partial_match` | إثبات العنوان — تطابق جزئي للعنوان | قيد المراجعة | تُرجع محاكاة إثبات العنوان عنواناً يتطابق جزئياً فقط مع العنوان المقدم. تنتقل الجلسة إلى حالة قيد المراجعة في إثبات العنوان. |
| `review_database_partial_match` | التحقق من قواعد البيانات — تطابق جزئي | قيد المراجعة | تُرجع خدمات قواعد البيانات تطابقات جزئية في الاسم وتاريخ الميلاد. تنتقل الجلسة إلى حالة قيد المراجعة في التحقق من قواعد البيانات. |
| `decline_kyb_registry_mismatch` | التحقق من الشركات (KYB) - عدم تطابق بيانات سجل الشركات | مرفوضة | تُرجع محاكاة سجل الشركات شركة لا تتطابق بيانات تسجيلها مع التفاصيل المتوقعة. تُرفض جلسة التحقق من الشركة في فحص سجل الشركات. |
| `review_kyb_registry_partial` | التحقق من الشركات (KYB) - تطابق جزئي لبيانات سجل الشركات | قيد المراجعة | تُرجع محاكاة سجل الشركات شركة يتطابق اسمها جزئياً فقط. تنتقل جلسة التحقق من الشركة إلى حالة قيد المراجعة في فحص سجل الشركات. |

توجد سيناريوهات `review_*` لتتمكن من اختبار تجربة المستخدم للمراجعة اليدوية (قائمة انتظار المراجعة في لوحة التحكم، وأحداث webhook ذات الحالة `In Review`، وإجراءات القبول/الرفض الخاصة بالمراجِع) دون الحاجة إلى مدخلات تؤدي إلى الرفض المباشر. يضبط سيناريوها `kyb_*` أعلاه الحقل `expected_details.registration_number` بدلاً من `expected_details.first_name`: ينطبقان فقط على جلسات التحقق من الشركات (KYB).

## القيم السحرية

القيمة السحرية هي قيمة مدخلة محددة تجعل إحدى الميزات التي يتم محاكاتها تُصدر خطراً معيناً. عيّن حقل الإدخال إلى القيمة السحرية (مباشرةً، أو عبر سيناريو) لتشغيلها.

| الميزة | حقل الإدخال | القيمة السحرية | المخاطر | الوصف |
| - | - | - | - | - |
| AML | `user_email` | `sandbox+aml_hit@didit.test` | `POSSIBLE_MATCH_FOUND` | AML — شخص معرض سياسياً؛ يُرجع محاكي AML نتيجة تطابق واحدة، وتُرفض الجلسة بسبب فحص AML. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_EXPIRED` | `DOCUMENT_EXPIRED` | OCR — المستند منتهي الصلاحية؛ تُرفض الجلسة عند التحقق من الهوية. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MINIMUM_AGE_NOT_MET` | `MINIMUM_AGE_NOT_MET` | OCR — تاريخ الميلاد يجعل المستخدم دون الحد الأدنى للسن الذي تم تكوينه؛ تُرفض الجلسة. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MAXIMUM_AGE_EXCEEDED` | `MAXIMUM_AGE_EXCEEDED` | OCR — تاريخ الميلاد المستخرج يتجاوز سياسة الحد الأقصى للسن التي تم تكوينها. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NUMBER_FORMAT_MISMATCH` | `DOCUMENT_NUMBER_FORMAT_MISMATCH` | OCR — رقم المستند المستخرج لا يطابق التعبير النمطي (regex) للتنسيق المتوقع للمستند من سجل المستندات. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_PERSONAL_NUMBER_FORMAT_MISMATCH` | `PERSONAL_NUMBER_FORMAT_MISMATCH` | OCR — الرقم الشخصي المستخرج يفشل في فحص التنسيق الخاص بسجل المستندات. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` | `DOCUMENT_NOT_SUPPORTED_FOR_APPLICATION` | OCR — نوع المستند المستخرج يقع خارج سياسة `documents_allowed` الخاصة بالتطبيق. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED` | `FULL_NAME_MISMATCH_WITH_PROVIDED` | OCR — الاسم الموجود على المستند لا يطابق الاسم الذي ملأه العميل مسبقاً في `expected_details` بما يتجاوز حد تطابق الأسماء. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_GENDER_MISMATCH_WITH_PROVIDED` | `GENDER_MISMATCH_WITH_PROVIDED` | OCR — الجنس المستخرج لا يتطابق مع `expected_details.gender`. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED` | `DOB_MISMATCH_WITH_PROVIDED` | OCR — تاريخ الميلاد المستخرج لا يتطابق مع `expected_details.date_of_birth`. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COUNTRY_MISMATCH_WITH_PROVIDED` | `COUNTRY_MISMATCH_WITH_PROVIDED` | OCR — دولة الإصدار لا تتطابق مع `expected_details.country` (أو `id_country`). |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_NATIONALITY_MISMATCH_WITH_PROVIDED` | `NATIONALITY_MISMATCH_WITH_PROVIDED` | OCR — الجنسية المستخرجة لا تتطابق مع `expected_details.nationality`. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_IDENTIFICATION_NUMBER_MISMATCH_WITH_PROVIDED` | `IDENTIFICATION_NUMBER_MISMATCH_WITH_PROVIDED` | OCR — رقم المستند/الرقم الشخصي/الرقم الضريبي المستخرج لا يطابق `expected_details.identification_number`. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COULD_NOT_RECOGNIZE_DOCUMENT` | `COULD_NOT_RECOGNIZE_DOCUMENT` | مسار معالجة OCR يُرجع نتيجة فارغة / غير قابلة للتعرف؛ وترفع بيئة الإنتاج الخطأ COULD\_NOT\_RECOGNIZE\_DOCUMENT. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_NOT_DETECTED` | `MRZ_NOT_DETECTED` | OCR — يتوقع المستند منطقة MRZ ولكن مسار المعالجة تعذر عليه تحديد مكانها. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_VALIDATION_FAILED` | `MRZ_VALIDATION_FAILED` | OCR — تم العثور على منطقة MRZ ولكنها فشلت في التحقق من المجموع الاختباري (checksum) / التنسيق. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` | `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` | OCR — حقول الهوية في MRZ لا تتطابق مع الحقول المستخرجة من VIZ. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BARCODE_NOT_DETECTED` | `BARCODE_NOT_DETECTED` | OCR — يتوقع المستند رمز باركود ولكن لم يتم العثور على أي رمز. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BARCODE_VALIDATION_FAILED` | `BARCODE_VALIDATION_FAILED` | OCR — تم فك ترميز الباركود ولكنه فشل في التحقق المتبادل بين الحقول. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_QR_NOT_DETECTED` | `QR_NOT_DETECTED` | OCR — يتوقع المستند رمز QR ولكن لم يتم العثور على أي رمز. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_QR_VALIDATION_FAILED` | `QR_VALIDATION_FAILED` | OCR — تم فك ترميز رمز QR ولكنه فشل في التحقق المتبادل بين الحقول. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DATA_INCONSISTENT` | `DATA_INCONSISTENT` | OCR — عمليات التحقق من الاتساق الداخلي لحقول VIZ تُظهر عدم تطابق. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_SIDES_MISMATCH` | `DOCUMENT_SIDES_MISMATCH` | OCR — لا تتطابق قيمة document\_name للوجه الأمامي مع قيمتها للوجه الخلفي باعتبارهما المستند نفسه. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_NAME_NOT_DETECTED` | `NAME_NOT_DETECTED` | OCR — تعذر استخراج الاسم الأول واسم العائلة من المستند. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DATE_OF_BIRTH_NOT_DETECTED` | `DATE_OF_BIRTH_NOT_DETECTED` | OCR — فئة المستند تتوقع تاريخ ميلاد ولكن الاستخراج لم يُرجع أي تاريخ. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_EXPIRATION_DATE_NOT_DETECTED` | `EXPIRATION_DATE_NOT_DETECTED` | OCR — فئة المستند تتوقع تاريخ انتهاء ولكن الاستخراج لم يُرجع أي تاريخ. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_DOCUMENT_NUMBER_NOT_DETECTED` | `DOCUMENT_NUMBER_NOT_DETECTED` | OCR — تعذر استخراج رقم المستند أو الرقم الشخصي. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_COULD_NOT_DETECT_DOCUMENT_TYPE` | `COULD_NOT_DETECT_DOCUMENT_TYPE` | OCR — تعذر على المصنف تعيين الصورة الملتقطة إلى نوع مستند مدعوم. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_PORTRAIT_IMAGE_NOT_DETECTED` | `PORTRAIT_IMAGE_NOT_DETECTED` | OCR — تعذر على مسار المعالجة عزل منطقة الصورة الشخصية في المستند. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_UNPARSED_ADDRESS` | `UNPARSED_ADDRESS` | OCR — يحتوي المستند على حقل عنوان ولكن لم يُرجع الترميز الجغرافي / التحليل أي شيء قابل للاستخدام. |
| DATABASE\_VALIDATION | `expected_details.first_name` | `SANDBOX_DB_NO_MATCH` | `DATABASE_VALIDATION_NO_MATCH` | التحقق من قواعد البيانات — تعيد كل خدمة حكومية/سجل NO\_MATCH؛ تصبح الجلسة مرفوضة عند التحقق من قواعد البيانات. |
| FACEMATCH | `expected_details.first_name` | `SANDBOX_FACE_LOW_MATCH` | `LOW_FACE_MATCH_SIMILARITY` | مطابقة الوجه — درجة التشابه أقل من حد الرفض؛ تصبح الجلسة مرفوضة عند مطابقة الوجه. |
| PHONE | `phone_number` | `+15005550009` | `HIGH_RISK_PHONE_NUMBER` | الهاتف — رقم اختبار محجوز غير قابل للتسليم / عالي المخاطر؛ يعيد محاكي التحقق من رقم الهاتف حالة الفشل. |
| EMAIL | `user_email` | `sandbox+breach@didit.test` | `BREACHED_EMAIL_DETECTED` | البريد الإلكتروني — تعيد قاعدة بيانات الاختراقات تطابقاً لهذا العنوان. |
| LOCATION | `expected_details.first_name` | `SANDBOX_IP_BLOCKLIST` | `IP_ADDRESS_IN_BLOCKLIST` | تحليل عنوان IP — يظهر عنوان IP الخاص بالمتصل في قائمة الحظر الخاصة بالتطبيق؛ تصبح الجلسة مرفوضة عند تحليل عنوان IP. |
| PROOF\_OF\_ADDRESS | `expected_details.first_name` | `SANDBOX_POA_ADDRESS_MISMATCH` | `ADDRESS_MISMATCH_WITH_PROVIDED` | إثبات العنوان — العنوان الموجود في المستند المرفوع لا يتطابق مع العنوان الذي أدخله العميل مسبقاً في `expected_details`؛ تصبح الجلسة مرفوضة عند إثبات العنوان. |
| LIVENESS | `expected_details.first_name` | `SANDBOX_LIVENESS_ATTACK` | `LIVENESS_FACE_ATTACK` | كشف الحيوية — يكتشف محاكي كشف الحيوية السلبي إشارة هجوم وجه؛ تصبح الجلسة مرفوضة عند كشف الحيوية. |
| NFC | `expected_details.first_name` | `SANDBOX_NFC_CHIP_NOT_VERIFIED` | `NFC_CHIP_NOT_VERIFIED` | NFC — يعيد محاكي جواز السفر الإلكتروني شريحة تفشل سلامة توقيع SOD/DG الخاص بها؛ تصدر بيئة الإنتاج NFC\_CHIP\_NOT\_VERIFIED وتصبح الجلسة مرفوضة عندما يرفض سير العمل الشرائح غير المتحقق منها. |
| NFC | `expected_details.first_name` | `SANDBOX_NFC_TRUST_ANCHOR_MISSING` | `NFC_TRUST_ANCHOR_MISSING` | NFC — ترتبط شهادة DSC بشهادة CSCA غير موجودة في مخزن الثقة؛ تصدر بيئة الإنتاج NFC\_TRUST\_ANCHOR\_MISSING وتطبق الإجراء المحدد للشرائح غير المتحقق منها. |
| DOCUMENT\_AI | `expected_details.first_name` | `SANDBOX_DOCUMENT_AI_UNREADABLE` | `DOCUMENT_AI_UNREADABLE_DOCUMENT` | Document AI — لا يُرجع الاستخراج أي حقول قابلة للقراءة؛ تصدر بيئة الإنتاج DOCUMENT\_AI\_UNREADABLE\_DOCUMENT وتستقر حالة المستند لتصبح مرفوضة بمجرد استنفاد محاولات إعادة المحاولة المتاحة. |
| AML | `user_email` | `sandbox+aml_review@didit.test` | `POSSIBLE_MATCH_FOUND` | فحص AML — تطابق محتمل يحتاج إلى تسوية يدوية؛ تصبح الجلسة قيد المراجعة. |
| FACEMATCH | `expected_details.first_name` | `SANDBOX_FACE_BORDERLINE_MATCH` | `LOW_FACE_MATCH_SIMILARITY` | مطابقة الوجه — تشابه حدي بين حدي المراجعة والرفض؛ تصبح الجلسة قيد المراجعة. |
| ID\_VERIFICATION | `expected_details.first_name` | `SANDBOX_OCR_BORDERLINE_AGE` | `MINIMUM_AGE_NOT_MET` | OCR — تاريخ الميلاد أقل من الحد الأدنى للعمر ولكن سير العمل يراجع حالات عدم استيفاء الحد الأدنى للعمر بدلاً من رفضها؛ تصبح الجلسة قيد المراجعة. |
| DATABASE\_VALIDATION | `expected_details.first_name` | `SANDBOX_DB_PARTIAL_MATCH` | `DATABASE_VALIDATION_PARTIAL_MATCH` | التحقق من قواعد البيانات — تتطابق بيانات التعريف، لكن الاسم/تاريخ الميلاد يتطابقان جزئياً فقط؛ تصبح الجلسة قيد المراجعة. |
| PROOF\_OF\_ADDRESS | `expected_details.first_name` | `SANDBOX_POA_PARTIAL_MATCH` | `ADDRESS_MISMATCH_WITH_PROVIDED` | إثبات العنوان — العنوان الموجود في المستند المرفوع يتطابق جزئياً مع العنوان المقدم؛ تصبح الجلسة قيد المراجعة. |
| KYB\_REGISTRY | `expected_details.registration_number` | `SANDBOX-KYB-MISMATCH` | `KYB_REGISTRY_DATA_MISMATCH_WITH_EXPECTED` | KYB - بيانات الشركة في السجل لا تتطابق مع التفاصيل المتوقعة؛ تصبح الجلسة مرفوضة. |
| KYB\_REGISTRY | `expected_details.registration_number` | `SANDBOX-KYB-REVIEW` | `KYB_REGISTRY_DATA_PARTIAL_MATCH_WITH_EXPECTED` | KYB - بيانات الشركة في السجل تتطابق جزئياً؛ تصبح الجلسة قيد المراجعة. |

## البحث بدون مستندات ومحافظ الهوية

يمكن لتطبيقات البيئة التجريبية تفعيل كل محفظة هوية في دليل الدول، بما في ذلك المحافظ غير المتاحة في تطبيقات بيئة الإنتاج.
يحاكي سيناريو `approve` الافتراضي هوية تم التحقق منها دون تسجيل الدخول إلى محفظة خارجية.
يتم تخزين النتيجة في الجلسة وتتبع الخطوة التالية العادية في سير العمل.
لا تتحقق البيئة التجريبية من بيانات اعتماد المحفظة الحقيقية ولا تفرض رسوماً على المحاولات المحاكاة.

تظل طلبات البحث تتحقق من صحة الحقول المدخلة وتستخدم الحد المعين للمحاولات، والذي يكون افتراضياً محاولة واحدة.
استخدم السيناريوهات التالية لاختبار عمليات إعادة المحاولة وقواعد الرجوع:

| السيناريو | النتيجة المُحاكاة |
| - | - |
| `lookup_partial_match` | تطابق جزئي في السجل؛ يُحسب ضمن حد المحاولات. |
| `lookup_no_match` | يجيب السجل بعدم وجود تطابق؛ يُحسب ضمن حد المحاولات. |
| `lookup_provider_error` | لا يُرجع السجل أي إجابة؛ يُطلب من المستخدم المحاولة مرة أخرى، وبعد ثلاث محاولات دون إجابة، يتم تطبيق قاعدة الرجوع الخاصة بخطأ المزود. |
| `wallet_cancelled` | يلغي المستخدم تسجيل الدخول إلى المحفظة. |
| `wallet_timeout` | تنتهي صلاحية تسجيل الدخول إلى المحفظة. |
| `wallet_provider_error` | يتعذر على المحفظة إكمال تسجيل الدخول. |

تتبع حالات فشل المحفظة إعداد الدولة للرجوع إما إلى التقاط المستندات أو الرفض.
يتم تسجيل محاولات البحث المكتملة بشكل منفصل، لذا فإن السماح بمحاولتين ينتج نتيجتين قبل تطبيق قاعدة الرجوع.
يظل كل استخدام للبيئة التجريبية مجانياً.

## التحقق من الحساب في التحقق البنكي

توفر خطوة التحقق البنكي في البيئة التجريبية [كلتا الطريقتين](https://docs.didit.me/ar/core-technology/bank-verification/verification-methods.md) في كل دولة، بالترتيب الذي تحدده الخطوة، على خدمة محاكاة دون بنك ودون أي تكلفة.
وفقاً للترتيب الافتراضي، يبدأ الشخص بتسجيل الدخول إلى البنك ويختار **أدخل بيانات حسابك** لتشغيل [التحقق من الحساب](https://docs.didit.me/ar/core-technology/bank-verification/account-check.md)؛ عيّن `bank_method_order` إلى `["account_lookup", "open_banking"]` للبدء به.
تحدد آخر أربعة أحرف من رقم الحساب المكتوب الإجابة؛ راجع [اختبارها في البيئة التجريبية](https://docs.didit.me/ar/core-technology/bank-verification/account-check.md#اختباره-في-البيئة-التجريبية) للاطلاع على كل نهاية وحساب صالح لكل تنسيق.
تستجيب [واجهة برمجة تطبيقات التحقق من الحساب](https://docs.didit.me/ar/standalone-apis/bank-account-check.md) لمفتاح البيئة التجريبية بالاعتماد على النهايات نفسها.

## المستندات النموذجية

> [!WARNING]
>
> لا تقم مطلقاً برفع مستندات هوية حقيقية في البيئة التجريبية. استخدم المستندات النموذجية المدمجة بدلاً من ذلك.

يقدّم سير العمل المستضاف ثلاثة مستندات نموذجية، واحد لكل نوع مستند:

| الدولة | نوع المستند |
| - | - |
| إسبانيا | بطاقة هوية وطنية |
| الأرجنتين | جواز سفر |
| بولندا | رخصة قيادة |

اضغط على نموذج في الشريط لاستخدامه بدلاً من الالتقاط الحقيقي. تأتي البيانات المستخرجة ونتيجة الجلسة دائماً من السيناريو أو القيمة السحرية المحددة، لذلك يعمل أي نموذج مع أي سيناريو.

## الهوية النموذجية: اختبار `expected_details`

يتم اصطناع كل مستند في البيئة التجريبية من هوية **مُثبَّتة** واحدة.
تكون القيم المستخرجة متطابقة في كل جلسة ولا تُشتق أبداً من التاريخ الحالي، مما يتيح لك ملء `expected_details` بها مسبقاً والتحقق من مقارنة الحقول ومعالجة التحذيرات لديك بشكل شامل من البداية إلى النهاية.
مرّر القيم الموضحة أدناه وستنجح عمليات فحص المقارنة؛ ومرّر أي شيء آخر وسينطلق تحذير `*_MISMATCH_WITH_PROVIDED` المطابق عن قصد.

تشترك جميع المستندات النموذجية في التواريخ نفسها:

| الحقل | القيمة |
| - | - |
| `date_of_birth` | `1990-06-15` |
| تاريخ الإصدار | `2025-06-15` |
| تاريخ الانتهاء | `2035-06-15` |

تعتمد بقية بيانات الهوية على المستند الذي تستخدمه:

| `sandbox_sample` | المستند | `first_name` | `last_name` | `gender` | `nationality` | `id_country` | `identification_number` |
| - | - | - | - | - | - | - | - |
| *(افتراضي، لم يتم تحديد نموذج)* | جواز سفر إلكتروني برازيلي | `GUSTAVO` | `MATSUMOTO` | `M` | `BRA` | `BRA` | `YC531181` |
| `spain-id-card-2021` | بطاقة هوية وطنية إسبانية | `CARMEN` | `ESPAÑOLA ESPAÑOLA` | `F` | `ESP` | `ESP` | `CAA000000` |
| `argentina-passport-2009` | جواز سفر أرجنتيني | `MARIA VICTORIA` | `VILLAREAL` | `F` | `ARG` | `ARG` | `AAF794880` |
| `poland-driving-license-2019` | رخصة قيادة بولندية | `JAN` | `KOWALSKI` | غير موجود في هذا المستند | `POL` | `POL` | `SP005/89/5` |

```json theme={null}
{
  "workflow_id": "<your-workflow-uuid>",
  "expected_details": {
    "date_of_birth": "1990-06-15",
    "gender": "M",
    "nationality": "BRA",
    "identification_number": "YC531181"
  }
}
```

يُعد `first_name` و`last_name` استثناءً: حيث تعرض البيئة التجريبية الأسماء التي ترسلها في `expected_details` على المستند المصطنع، وبالتالي ينجح التحقق من تطابق الاسم مع أي اسم.
استخدم القيمة السحرية `SANDBOX_OCR_FULL_NAME_MISMATCH_WITH_PROVIDED` لتجربة عدم تطابق الاسم، و`SANDBOX_OCR_DOB_MISMATCH_WITH_PROVIDED` لعدم تطابق تاريخ الميلاد.

> [!NOTE]
>
> إذا كان سير العمل لديك يقيّد `documents_allowed` بدولة أو نوع مستند يستبعد جواز السفر الإلكتروني البرازيلي، فستقوم البيئة التجريبية باصطناع مستند من أول دولة مسموح بها بدلاً من ذلك، وبالتالي ستتبع `nationality` و`id_country` واسم المستند تلك الدولة. وتبقى التواريخ أعلاه كما هي.

### ما لا يتضمنه المستند المصطنع

المستند المصطنع هو قالب عام للدولة ونوع المستند المسموح بهما، لذا تظل الحقول التي لا يوفرها سوى مستند حقيقي صادر عن جهة حكومية فارغة. والحقل الذي يؤثر على التوجيه هو **المنطقة / الولاية الأمريكية** (`kyc.region`): فرخصة القيادة أو بطاقة الهوية الأمريكية في البيئة التجريبية لا تحتوي على ولاية، لذا فإن شرط الفرع مثل `Region equals IL` لا يمكن أن يتطابق أبداً في البيئة التجريبية، وعندما لا يتطابق أي فرع آخر لتلك العقدة أيضاً، يسلك التدفق الفرع الاحتياطي للعقدة (الفرع الذي لا يحتوي على شروط). هذا لا يعني مراجعةً أو فشلًا للفرع - فالشرط ببساطة لا يجد ما يقرأه. كما يفشل الحقل المفقود أيضاً مع `not equals` و`not in`؛ راجع [كيف تقرأ شروط الفرع بيانات الجلسة](https://docs.didit.me/ar/console/workflows.md#كيف-تقرأ-شروط-الفروع-بيانات-الجلسة) لمعرفة الفرق بين الحقل المفقود وسلسلة نصية فارغة.

لتجربة تدفق يعتمد على الولاية في البيئة التجريبية، وجّه القرار بناءً على قيمة تتحكم بها في الجلسة بدلاً من المستند:

* أرسل الولاية في `metadata` عند إنشاء الجلسة (على سبيل المثال `"metadata": {"credential_state": "IL"}`) وتفرّع بناءً على `metadata.credential_state`. يتم تقييم البيانات الوصفية في البيئة التجريبية تماماً كما في بيئة الإنتاج.
* احتفظ بشرط `kyc.region` المشتق من المستند لحركة المرور في بيئة الإنتاج إذا كنت بحاجة أيضاً إلى المستند لإثبات الولاية؛ ففي بيئة الإنتاج تُقرأ المنطقة من المستند الحقيقي.

كل شيء آخر يتعلق بالتوجيه مطابق لبيئة الإنتاج: حيث تعمل مخططات سير العمل وشروط الفروع وقيم `metadata` و`expected_details` وعقد الإجراءات وعقد الحالة بشكل فعلي تماماً. لا تجبر البيئة التجريبية أي جلسة على الدخول قيد المراجعة من تلقاء نفسها أبداً - تنتهي جلسة البيئة التجريبية بحالة قيد المراجعة فقط عندما يوجّهها سير العمل إلى هناك (سيناريو `review_*`، أو قيمة سحرية معينة مرتبطة بإجراء مراجعة، أو عقدة حالة في المخطط).

## رموز OTP والاشتراك في البريد الإلكتروني

* **رمز OTP للهاتف:** يقبل فحص الهاتف في البيئة التجريبية أي رمز ذي تنسيق صحيح (من 4 إلى 8 أرقام؛ بما في ذلك `123456`). بينما تُرجع المدخلات ذات التنسيق غير الصحيح الرمز `400`.
* **رمز OTP للبريد الإلكتروني:** يقبل فحص البريد الإلكتروني في البيئة التجريبية أي رمز ذي تنسيق صحيح (بما في ذلك `123456`). بينما تُرجع المدخلات ذات التنسيق غير الصحيح الرمز `400`.

بشكل افتراضي، **لا** ترسل جلسات البيئة التجريبية رسائل بريد إلكتروني (تنبيهات المراجعة، تغيير الحالة، رمز OTP، إعادة التقديم، رابط الجلسة الجديدة، إلخ). لإرسال بريد إلكتروني على أي حال، استخدم أحد أنماط الاشتراك التالية على عنوان المستلم:

| نمط الاشتراك | مثال |
| - | - |
| `<local>+sandbox@<domain>` | `alice+sandbox@example.com` |
| `*@didit.test` | `alice@didit.test` |

## توجيه النتائج: السيناريوهات، والقيم السحرية، والتجهيز، وendpoint المحاكاة

توجد خمس طرق للتحكم في نتائج البيئة التجريبية.

### 1. `sandbox_scenario` عند إنشاء الجلسة

عيّن المعرّف النصي (slug) للسيناريو عند إنشاء الجلسة (`POST /v3/session/`). يُوسّع تدفق الإنشاء القيم السحرية المجمّعة في السيناريو إلى حقول الإدخال الخاصة بالجلسة، بحيث يُصدر المزوّدون الوهميون النتيجة المرجوة من خلال مسار سير العمل الفعلي.

```json theme={null}
{
  "workflow_id": "<your-workflow-uuid>",
  "sandbox_scenario": "decline_document_expired"
}
```

### 2. إدخال القيم السحرية يدويًا

عيّن حقول الإدخال الفردية بنفسك (على سبيل المثال `expected_details.first_name = "SANDBOX_OCR_DOCUMENT_EXPIRED"`، أو `user_email = "sandbox+aml_hit@didit.test"`). راجع جدول القيم السحرية أعلاه للاطلاع على السجل الكامل.

### 3. تجهيز (أو إعادة تجهيز) الجلسة قبل بدء التدفق

عيّن أو استبدل السيناريو المجهّز في جلسة موجودة بالفعل، بشرط ألا تكون قد تجاوزت حالة `Not Started`. هذا هو الـ endpoint الذي يستدعيه [أداة اختيار السيناريو قبل التدفق](#البيئة-التجريبية-في-مسار-التحقق-المستضاف)، ويمكنك استدعاؤه بنفسك لإنشاء أداة اختيار مخصصة أو أداة اختبار:

```
POST /v3/session/{session_id}/sandbox/arm/
Session-Token: <session_token>
```

```json theme={null}
{
  "scenario": "decline_document_expired"
}
```

استجابة 200:

```json theme={null}
{
  "session_id": "<session_id>",
  "scenario": "decline_document_expired",
  "status": "Not Started"
}
```

* قم بالمصادقة باستخدام `Session-Token` الخاص بالجلسة نفسها (يُعاد كـ `session_token` من عملية إنشاء الجلسة)، وليس مفتاح API الخاص بتطبيقك: هذا الـ endpoint موجّه للعميل.
* يُرجع الرمز `400` لمعرّف السيناريو غير المعروف، والرمز `400` بمجرد انتقال الجلسة إلى ما بعد حالة `Not Started` (`"Scenario can only be armed before the verification starts."`).
* يُرجع الرمز `404` عندما ينتمي `Session-Token` إلى تطبيق في بيئة الإنتاج (غير تجريبي)، أو عندما لا يتطابق مع `session_id` الموجود في المسار.
* **تؤدي إعادة التجهيز إلى استبدال السيناريو السابق.** فهي تمسح فقط القيم السحرية التي كتبها السيناريو السابق، وتترك أي شيء أدخله المستخدم يدويًا بالفعل (البريد الإلكتروني، الاسم الأول، وما إلى ذلك) دون تغيير. على سبيل المثال: قم بتجهيز `decline_phone_high_risk`، ثم جهّز `approve` - سيعود رقم الهاتف إلى حالة عدم التعيين، ولكن البريد الإلكتروني الذي أدخله العميل سيبقى محتفظًا به بعد كلا الاستدعاءين.

### 4. endpoint المحاكاة

فرض حالة نهائية بعد وقوع الحدث:

* لوحة التحكم / مفتاح API (يتطلب امتياز `write:sessions`؛ يحتاج مفتاح API المقيّد بالنطاق إلى صلاحية وصول للكتابة على الجلسات): `POST /v3/session/{session_id}/simulate/`
* التدفق المستضاف (رأس `Session-Token`): `POST /v3/session/{session_id}/sandbox/simulate/`

يعمل كلاهما على جلسات البيئة التجريبية لـ KYC وKYB.
تُرجع الجلسة في بيئة الإنتاج (غير التجريبية) الرمز `404`، وكذلك يُرجع رأس `Session-Token` الذي لا يتطابق مع `session_id` في المسار.

كل حقل في نص الطلب اختياري، ولكن يلزم توفير واحد على الأقل من `new_status` أو `scenario` أو `risk`:

| الحقل | النوع | ما يفعله |
| - | - | - |
| `new_status` | string | `Approved` أو `Declined` أو `In Review` أو `Expired` أو `Abandoned`. عند حذفه، يُضبط افتراضيًا على الحالة الافتراضية لحالة المخاطر (`risk`، أو أول خطر تحمله القيم السحرية للسيناريو)، وإلا يُضبط على الحالة الافتراضية للسيناريو. |
| `scenario` | string، حتى 100 حرف | معرّف نصي (slug) للسيناريو. في حال عدم وجود `risk`، يُطبَّق أول خطر تحمله قيمه السحرية. |
| `risk` | string، حتى 128 حرفًا | حالة مخاطر. يُضاف التحذير الخاص بها إلى الجلسة. |
| `node_id` | string، حتى 128 حرفًا | عقدة سير العمل التي يُرفق بها التحذير. يُضبط افتراضيًا على العقدة الحالية للجلسة. |
| `comment` | string، حتى 500 حرف | ملاحظة تُضاف إلى إدخال النشاط الذي يسجله تغيير الحالة. |
| `send_webhooks` | boolean، القيمة الافتراضية `true` | ما إذا كان تغيير الحالة يرسل webhooks. |

يُرسل `send_webhooks: true` نفس الـ webhooks التي يرسلها أي تغيير فعلي للحالة تمامًا: `status.updated`، بالإضافة إلى أحداث `user.status.updated` و`user.data.updated` (أو `business.status.updated` و`business.data.updated` لجلسة شركة) الناتجة عن التغيير، إلى الوجهات المشتركة في هذه الأحداث.
مع `send_webhooks: false`، تتغير الحالة مع ذلك، ولكن لا يتم تسجيل أو إرسال أي webhook.
لا تُعيد آلية استرداد webhook الفائت إرسال ذلك القرار أبدًا، وتستمر لوحة التحكم في التحديث بشكل فوري ومباشر.
يُرسل تغيير الحالة التالي للجلسة webhooks كالمعتاد.

```json theme={null}
{
  "scenario": "decline_aml_hit",
  "send_webhooks": false
}
```

استجابة 200:

```json theme={null}
{
  "session_id": "<session_id>",
  "previous_status": "In Progress",
  "status": "Declined",
  "scenario": "decline_aml_hit",
  "risk": "POSSIBLE_MATCH_FOUND",
  "send_webhooks": false
}
```

* `status` هي الحالة التي ضبطتها المحاكاة، و`previous_status` هي الحالة السابقة للجلسة.
* يعكس `scenario` المعرّف النصي الخاص بك، ويمثّل `risk` حالة المخاطر المُطبّقة؛ وتكون قيمة كل منهما `null` في حال عدم وجود أي منها.
* يعكس `send_webhooks` القيمة التي تم تطبيقها.
* يُرجع الرمز `400` عند وجود سيناريو أو خطر غير معروف، أو عند تعذر اشتقاق `new_status`، أو لأي قيمة أخرى لـ `new_status`، أو عندما تكون الجلسة بالحالة المطلوبة بالفعل (`["The new status is the same as the current status."]`).

### 5. `sandbox_scenario` في واجهة برمجة تطبيقات AML المستقلة

لا يتضمن فحص AML في الخلفية أي مستخدم نهائي ولا جلسة لتجهيزها، لذا يُوضع المعرّف النصي في طلب الفحص نفسه (`POST /v3/aml/`):

```json theme={null}
{
  "full_name": "Ada Lovelace",
  "save_api_request": true,
  "sandbox_scenario": "decline_aml_hit"
}
```

* يُرجع `decline_aml_hit` تطابقًا واحدًا بهيئة بيئة الإنتاج ويحسم الفحص كـ `Declined`؛ بينما يحسم `review_aml_possible_match` الفحص كـ `In Review`. يترك السيناريو الذي لا يجهّز أي نتيجة لـ AML الفحص سليمًا ونظيفًا.
* مع `save_api_request: true` (القيمة الافتراضية)، يتم حفظ الفحص تمامًا كما يحدث مع مفتاح بيئة الإنتاج، بحيث يمكن استخدام `request_id` المُعاد للوصول إلى `GET /v3/session/{request_id}/decision/` و`GET /v3/session/{request_id}/generate-pdf/`.
* يُرجع الرمز `400` لمعرّف السيناريو غير المعروف، والرمز `400` عندما ينتمي مفتاح API إلى تطبيق في بيئة الإنتاج.

## أين يظهر `sandbox_scenario`

يُعاد عرض معرّف السيناريو المجهّز (`null` في حال عدم تجهيز أي سيناريو) عبر بعض الواجهات بينما يُستبعد عمدًا من واجهات أخرى:

| الواجهة | هل يظهر؟ |
| - | - |
| payload الخطوة الحالية (KYC وKYB) | نعم، كـ `sandbox_scenario` |
| `GET /v1/session/{id}/decision/` | نعم، كـ `sandbox_scenario` |
| `GET /v3/session/{id}/decision/` (راجع [استرداد الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md)) | نعم، في المستوى الأعلى كـ `sandbox_scenario` (null عند عدم التجهيز) |
| webhooks الجلسة (`status.updated`، و`data.updated`) | نعم، كـ `sandbox_scenario`، وتكون قيمته `null` في جلسات الإنتاج أو جلسات البيئة التجريبية غير المجهّزة |

إذا كان التكامل الخاص بك يحتاج إلى التفرع بناءً على السيناريو المجهّز من جانب الخادم، فاقرأه من غلاف الـ webhook أو من أي من الـ endpoints الخاصة بالقرار (`v1` أو `v3`).

## الاستخدام والفوترة

يتم تتبع الاستخدام في البيئة التجريبية، ولا يتم فرض أي رسوم عليه مطلقاً:

* تسجل كل مكالمة محاكاة حدث استخدام (`is_sandbox: true` بسعر `0.0000`) حتى يكون حجم استخدام البيئة التجريبية مرئياً لأغراض تصحيح الأخطاء، لكنه لا يُضاف أبداً إلى إجمالي استخدامك، ولا يُخصم من الرصيد، ولا يظهر مطلقاً في أي فاتورة.
* تستبعد واجهات الرصيد، وشحن الرصيد، واستخدام بيئة الإنتاج في Business Console استخدامَ البيئة التجريبية افتراضياً. تقبل endpoints الخاصة باستخدام شحن الرصيد المعامل `environment` (القيمة الافتراضية `live`، أو `sandbox`) حتى يمكن فحص حجم استخدام البيئة التجريبية بشكل منفصل - دائماً بتكلفة صفرية ودون استهلاك من المستوى المجاني.
* تتم فوترة التحقق من البريد الإلكتروني ورقم الهاتف لكل طلب بدلاً من نتيجة الجلسة، ولا تملك البيئة التجريبية وسيلة لمحاكاة ذلك بالكامل على مستوى طبقة webhook. لا تزال عمليات التحقق من البريد الإلكتروني/الهاتف في البيئة التجريبية تسجل حدث استخدام لكل طلب بسعر `0.0000`، تماماً مثل أي ميزة محاكاة أخرى: هذا اختلاف مقبول ومعروف عن سلوك الفوترة في بيئة الإنتاج، وليس خطأً برمجياً.
* يختلف شكل استجابة التحقق من قواعد البيانات في البيئة التجريبية عمداً عن الشكل المخصص لكل مزود في بيئة الإنتاج، نظراً لعدم وجود مزود حقيقي لمحاكاته. تعامل مع payload الخاصة بالتحقق من قواعد البيانات في البيئة التجريبية كبديل للنتيجة (الحالة ورمز التحذير)، وليس كمعاينة مطابقة تماماً لاستجابة المزود في بيئة الإنتاج.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.