> ## 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.

# نماذج البيانات

> مخططات JSON القياسية لكل كائنات تقارير Didit: NFC، الهوية، الحيوية، مطابقة الوجه، AML، IP، إثبات العنوان، الهاتف، البريد، KYB، المستندات.

## نظرة عامة

يتبع كل تقرير خاص بميزة شكل المُسلسِل V3 المعرَّف في `service-didit-verification`. يظهر الكائن نفسه في ثلاثة مواضع، لذلك فإن المخطط الموجود هنا هو المصدر المرجعي الوحيد لجميع هذه المواضع:

* `GET /v3/session/{sessionId}/decision/`: تُعاد كل ميزة في مصفوفة بصيغة الجمع (`id_verifications[]`، `nfc_verifications[]`، `liveness_checks[]`، `face_matches[]`، `poa_verifications[]`، `phone_verifications[]`، `email_verifications[]`، `aml_screenings[]`، `ip_analyses[]`، `database_validations[]`، `questionnaire_responses[]`، `signatures[]`، `bank_verifications[]` (راجع [طرق التحقق البنكي](https://docs.didit.me/ar/core-technology/bank-verification/verification-methods.md#قراءة-الطريقة-في-النتيجة))، والمكافئات الخاصة بـ KYB وهي `registry_checks[]` و`document_verifications[]` و`key_people_checks[]`).
* حمولات webhook (`status.updated` و`data.updated`): الشكل نفسه داخل الغلاف `decision`.
* واجهات برمجة التطبيقات المستقلة: تعيد الاستجابات ككائن واحد (البحث بالوجه وتقدير العمر والمصادقة البيومترية) وتستخدم مجموعة الحقول نفسها.

> [!NOTE]
>
> قدّم V3 سير العمل متعدد المثيلات: يحمل كل كائن ميزة الحقل `node_id` الذي يربط التقرير بعقدة الرسم البياني لسير العمل التي أنتجته. أما endpoints V2 (بصيغة المفرد، مثل `kyc` و`face` و`aml`)، فما زالت متوافقة مع الإصدارات السابقة، لكنها تعيد أول مثيل فقط.

## الحقول المشتركة

يعرض كل كائن تقرير الحقول التالية:

| الحقل | النوع | الوصف |
| - | - | - |
| `status` | نص | حالة دورة الحياة على مستوى الميزة، وهي إحدى القيم الواردة في [تعداد الحالة](#مرجع-قيم-الحالة). المصدر: `common/config/choices.py:FeatureStatusChoices` (الأسطر 343-348). يستخدم الحقل `status` على المستوى الأعلى للجلسة الأم تعداد الجلسة الأوسع `StatusChoices` (الأسطر 106-117). |
| `node_id` | نص \| null | معرّف عقدة الرسم البياني لسير العمل. يُملأ في سير العمل متعدد المثيلات في V3، ويكون `null` في الجلسات القديمة ذات الميزة الواحدة. |
| `warnings` | مصفوفة من [كائنات التحذير](#كائن-التحذير) | إشارات المخاطر المصفّاة حسب هذه الميزة و`node_id`. تُعاد بواسطة `Session.get_logs(...)` (`sessions/models/session.py:1611`). |

حقول الوسائط (`portrait_image` و`front_image` و`document_file` و…) روابط موقعة مسبقاً بنافذة صلاحية محدودة، لذا نزّلها فوراً بدلاً من تخزين الرابط. تُعرض الأمثلة بالصيغة `https://<media-host>/...`.

## كائن التحذير

يُعاد في كل مصفوفة `warnings[]`. المخطط من `logs/serializers/log.py:8-65` (`LogV3Serializer`).

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `feature` | نص (تعداد) | لا | الميزة التي أصدرت التحذير. القيم من `LogWarningChoices` (`common/config/choices.py:190-204`): `ID_VERIFICATION`، `NFC`، `LIVENESS`، `FACEMATCH`، `PROOF_OF_ADDRESS`، `PHONE`، `EMAIL`، `AML`، `LOCATION`، `DATABASE_VALIDATION`، `QUESTIONNAIRE`، `KYB_REGISTRY`، `KYB_DOCUMENTS`، `KYB_KEY_PEOPLE`. | `"ID_VERIFICATION"` |
| `risk` | نص | لا | رمز مخاطرة ثابت (مثل `DOCUMENT_EXPIRED` و`LOW_LIVENESS_SCORE`). القيم من `logs/choices.py:RiskChoices`. يُستخدم مفتاحاً للوصول إلى جداول الأوصاف. | `"DOCUMENT_EXPIRED"` |
| `additional_data` | كائن \| null | نعم | سياق خاص بالمخاطرة (مثل عتبات الدرجات والحقول المطابَقة). يختلف شكله باختلاف رمز المخاطرة. | `{ "score": 42.1, "threshold": 70 }` |
| `log_type` | نص (تعداد) | لا | إحدى القيم `error` أو `warning` أو `information`. من `LogTypeChoices` (`common/config/choices.py:207-210`). | `"error"` |
| `short_description` | نص | لا | تسمية مقروءة للمخاطرة. من `logs/choices.py:RISK_SHORT_DESCRIPTIONS`. | `"Document expired"` |
| `long_description` | نص | لا | شرح مقروء أطول، مناسب للعرض على المستخدم النهائي. من `logs/choices.py:RISK_LONG_DESCRIPTIONS`. | `"The document's expiration date has passed, rendering it no longer valid for use."` |
| `node_id` | نص \| null | نعم | عقدة الرسم البياني لسير العمل التي رُفع عليها التحذير. تكون `null` في سجلات V2 القديمة التي لا تحمل `node_id`. | `"first_id_verification"` |

```json theme={null}
{
  "feature": "ID_VERIFICATION",
  "risk": "DOCUMENT_EXPIRED",
  "additional_data": null,
  "log_type": "error",
  "short_description": "Document expired",
  "long_description": "The document's expiration date has passed, rendering it no longer valid for use.",
  "node_id": "first_id_verification"
}
```

## كائنات التقارير

تتناول بقية الأقسام كل كائن تقرير خاص بكل ميزة على حدة. نص عنوان H3 ثابت عمدًا حتى تتمكن الوثائق الأخرى من إنشاء روابط عميقة إليه مباشرةً.

### التحقق من الهوية

تُعاد لكل مستند KYC/الهوية يقدّمه المستخدم. يظهر كعنصر في `id_verifications[]` ضمن `GET /v3/session/{sessionId}/decision/` وداخل الحقل `kyc` في استجابات الإصدار V2. المصدر: `kyc/serializers/kyc.py:383-414` (`IDVerificationV3Serializer`، ويمتد من `IDVerificationV2Serializer` في `kyc/serializers/kyc.py:320-380`).

| الحقل | النوع | قابل للقيمة الفارغة | الوصف | المثال |
| - | - | - | - | - |
| `status` | نص | لا | راجع [تعداد الحالات](#مرجع-قيم-الحالة). | `"Approved"` |
| `document_type` | نص | نعم | فئة المستند بصيغة مقروءة (`Passport`، `Identity Card`، `Driver's License`، `Residence Permit`، `Health Insurance Card`، `Tax Card`، `Social Security Card`، `Work Permit`، `Visa`، `Public Service Card`، `Birth Certificate`، `Firearm License`، `Other`). المصدر: `DOC_TYPE_MAPPING` (`common/config/choices.py:1275-1289`). | `"Passport"` |
| `document_subtype` | نص | نعم | رمز النوع الفرعي للمستند من سجل مستندات Didit، ومُصفّى حسب ما تقبله إعدادات المستندات في سير العمل. تتضمن المستندات الخاصة بمنطقة معينة اسم المنطقة. قائمة الرموز الكاملة: [أنواع المستندات الفرعية](https://docs.didit.me/ar/core-technology/id-verification/document-subtypes-id-verification.md). | `"QUEENSLAND_DRIVER_LICENSE_GENERIC"` |
| `document_number` | نص | نعم | رقم المستند المستخرج عبر OCR. | `"AB1234567"` |
| `personal_number` | نص | نعم | المعرّف الشخصي أو الوطني المستخرج عبر OCR. | `"99999999R"` |
| `portrait_image` | نص (URL) | نعم | رابط موقَّع مسبقًا لقصاصة الوجه. | `"https://<media-host>/.../portrait.jpg?..."` |
| `front_image` | نص (URL) | نعم | رابط موقَّع مسبقًا للوجه الأمامي المنظّف للمستند. | `"https://<media-host>/.../front.jpg?..."` |
| `front_video` | نص (URL) | نعم | رابط موقَّع مسبقًا لفيديو التقاط الوجه الأمامي (عند توفره). | `"https://<media-host>/.../front.mp4?..."` |
| `back_image` | نص (URL) | نعم | رابط موقَّع مسبقًا للوجه الخلفي المنظّف للمستند. | `"https://<media-host>/.../back.jpg?..."` |
| `back_video` | نص (URL) | نعم | رابط موقَّع مسبقًا لفيديو التقاط الوجه الخلفي. | `null` |
| `full_front_image` | نص (URL) | نعم | التقاط الوجه الأمامي كاملًا دون قص (بالإطار الكامل). | `"https://<media-host>/.../full_front.jpg?..."` |
| `full_back_image` | نص (URL) | نعم | التقاط الوجه الخلفي كاملًا دون قص (بالإطار الكامل). | `null` |
| `front_image_camera_front` | نص (URL) | نعم | صورة من الكاميرا الأمامية التُقطت في الوقت نفسه مع الوجه الأمامي للمستند. | `null` |
| `back_image_camera_front` | نص (URL) | نعم | صورة من الكاميرا الأمامية التُقطت في الوقت نفسه مع الوجه الخلفي للمستند. | `null` |
| `front_image_camera_front_face_match_score` | عدد عشري (0-100) | نعم | درجة التطابق بين صورة الوجه على المستند ولقطة الكاميرا الأمامية. | `null` |
| `back_image_camera_front_face_match_score` | عدد عشري (0-100) | نعم | مثل الحقل أعلاه، ولكن للالتقاط الخلفي. | `null` |
| `document_selfie_face_matches` | مصفوفة | نعم | جلسات سابقة أو إدخالات من قائمة حظر الوجوه تطابق صورة السيلفي المُلتقطة أثناء التقاط المستند. الصيغة مطابقة لعناصر `liveness_checks[].matches`. القيمة `null` إذا لم يُجرَ البحث، والقيمة `[]` إذا لم يتطابق شيء. | `null` |
| `front_image_quality_score` | كائن | نعم | مقاييس جودة الصورة الأمامية: درجات من 0 إلى 100 (`focus_score`، `brightness_score`، `resolution_score`، `overall_score`)، إضافةً إلى `brightness_issue` (`ok`، `too_dark`، `too_bright`) و`is_document_fully_visible` (قيمة منطقية). | `{ "focus_score": 91.0, "overall_score": 88.5 }` |
| `back_image_quality_score` | كائن | نعم | البنية نفسها المستخدمة في `front_image_quality_score`. | `null` |
| `date_of_birth` | نص (YYYY-MM-DD) | نعم | تاريخ الميلاد المستخرج عبر OCR. | `"1990-05-12"` |
| `age` | عدد صحيح | نعم | العمر المحسوب بالسنوات وقت الاستخراج. | `35` |
| `expiration_date` | نص (YYYY-MM-DD) | نعم | تاريخ انتهاء صلاحية المستند. | `"2032-05-11"` |
| `date_of_issue` | نص (YYYY-MM-DD) | نعم | تاريخ إصدار المستند. | `"2022-05-11"` |
| `issuing_state` | نص (ISO 3166-1 alpha-3) | نعم | رمز الدولة المُصدِرة. | `"ESP"` |
| `issuing_state_name` | نص | نعم | اسم الدولة المُصدِرة مترجمًا إلى لغة العرض. | `"Spain"` |
| `first_name` | نص | نعم | الاسم أو الأسماء الأولى المستخرجة عبر OCR. | `"María"` |
| `last_name` | نص | نعم | اسم العائلة أو الأسماء العائلية المستخرجة عبر OCR. | `"García López"` |
| `full_name` | نص | نعم | الاسم الكامل بعد التوحيد (يوفره المزوّد). | `"María García López"` |
| `gender` | نص | نعم | القيمة `M` أو `F` أو قيمة أخرى يوفرها المزوّد. | `"F"` |
| `address` | نص | نعم | سطر العنوان الخام المستخرج عبر OCR. | `"Calle Mayor 1, 28001 Madrid"` |
| `formatted_address` | نص | نعم | العنوان بعد تحديد موقعه الجغرافي وتنسيقه (عند إمكانية تحليله). | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `parsed_address` | كائن | نعم | العنوان المنظّم بعد تحديد موقعه الجغرافي: `street_1`، `street_2`، `city`، `region`، `country`، `postal_code`، `address_type`، `formatted_address`، `document_location` (`{latitude, longitude}`)، `raw_results`، `is_best_match`. المصدر: `kyc/utils/address.py:147-197`. | `{ "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" }` |
| `place_of_birth` | نص | نعم | مكان الميلاد المستخرج عبر OCR. | `"Madrid"` |
| `marital_status` | نص | نعم | عند إمكانية استخراجها. | `null` |
| `nationality` | نص (ISO 3166-1 alpha-3) | نعم | الجنسية المستخرجة عبر OCR. | `"ESP"` |
| `extra_fields` | كائن | نعم | حقول خاصة بنوع المستند لا يغطيها المخطط الأساسي (مثل فئات رخصة القيادة). | `{ "DL Class": "B" }` |
| `mrz` | كائن | نعم | حقول MRZ المحللة عند وجودها (`document_number`، `birth_date`، `expiry_date`، `surname`، `given_names`، …). | `{ "document_number": "AB1234567", "surname": "GARCIA", "given_names": "MARIA" }` |
| `extra_files` | مصفوفة من النصوص (URL) | لا | روابط موقَّعة مسبقًا لأي ملفات إضافية مرفوعة. | `[]` |
| `matches` | مصفوفة من الكائنات | لا | تطابقات المستندات عبر الجلسات. كل عنصر: `{ session_id, session_number, vendor_data, verification_date, user_details: { name, document_type, document_number }, status, is_blocklisted, api_service, front_image_url }`. الحقل `front_image_url` رابط موقَّع مسبقًا. | `[]` |
| `verification_method` | string | لا | الطريقة التي أنتجت هذا الصف من [طريقة التحقق من الهوية](https://docs.didit.me/ar/core-technology/id-verification/verification-methods.md): `document` أو `id_lookup` أو `wallet`. تكون القيمة دائماً `document` للمستند المصوَّر، بما في ذلك كل جلسة أُنشئت قبل توفر الطرق الأخرى. | `"id_lookup"` |
| `assurance` | string | لا | مستوى الضمان المشتق من `verification_method`: `documentary` أو `data_match` أو `cryptographic`. | `"data_match"` |
| `wallet_provider` | string \| null | نعم | معرّف المحفظة في الكتالوج عندما تُنتج محفظة هذا الصف (`mitid`, `bankid_se`, `itsme`, ...). تكون `null` في غير ذلك. | `"mitid"` |
| `fallback_from` | object \| null | نعم | سبب إنهاء طريقة لا تعتمد على المستند لخطوة التحقق من الهوية: `{ method, reason, action }`. يُعيَّن عند فشل استعلام عن المصدر أو تسجيل دخول عبر محفظة: في الصف المرفوض عندما كان مفتاح الدولة مضبوطاً على `decline` (`action: "decline"`)، وفي التحقق من المستند الذي يكمل به المستخدم عندما كان `fallback_to_document` (`action: "fallback_to_document"`). تكون `null` عندما لا يُسجَّل أي فشل سابق لطريقة غير المستند. | `{ "method": "id_lookup", "reason": "no_match", "action": "decline" }` |
| `id_lookup` | object \| null | نعم | أدلة المصدر، وتظهر فقط عندما يكون `verification_method` هو `id_lookup`: `source` (المصدر الدقيق الذي جرى الاستعلام عنه، وهو سجل حكومي في معظم الدول، أو ملف مكتب ائتمان أو سجلات سكنية في بعض الدول)، و`checked_at`، و`attempts`، و`max_attempts`، و`outcome` (`match`, `partial_match`, `no_match`, `provider_error`, `format_rejected`)، و`comparison[]` (`{ field, label, provided, record, result }`؛ إذ إن `field` هو أحد القيم `identification_number` أو `full_name` أو `date_of_birth` أو `address`، و`result` هو `match` أو `partial` أو `no_match`؛ وقد تتضمن الإصدارات السابقة صفاً من نوع `provider` يحمل `error`)، و`source_errors[]` (في بيئة التجهيز الحالية: تشخيصات منفصلة للمصادر؛ تحقق من طرحها في الإنتاج)، و`registry_portrait` (رابط موقّع مسبقاً، فقط للمصادر التي تعيده)، و`face_match_score`. | انظر أدناه |
| `wallet_verification` | object \| null | نعم | أدلة الاعتماد، وتظهر فقط عندما يكون `verification_method` هو `wallet`: `provider` و`provider_name` و`issuing_authority` و`issuing_country` و`credential_type` و`level_of_assurance` (`low`, `substantial`, `high`) و`verified_at` و`signature_valid` و`attributes` (ما شاركته المحفظة) و`portrait` (رابط موقّع مسبقاً عندما تشارك المحفظة صورة) و`face_match_score`. | انظر أدناه |
| `document_liveness` | object \| null | نعم | درجات حيوية المستند لكل نوع احتيال (`portrait_replace`, `printed_copy`, `screen_replay`)، وتُعرض سواء أُطلق تحذير أم لا. لكل نوع: `score` (من 0 إلى 100، وكلما ارتفعت القيمة زاد احتمال أن يكون المستند أصلياً؛ والقيمة الأقل هي التي استند إليها القرار)، و`front`، و`back`، و`decline_threshold`، و`review_threshold`، و`bucket` (`approve`, `review`, `decline`, أو `null`). تُحفظ العتبات والتصنيف وقت التقييم، وتكون الثلاثة جميعها `null` عندما تتعذر أدلة التقييم التاريخية، مع بقاء الدرجات المخزنة ظاهرة. تكون `null` عندما لم يُجرَ الفحص. انظر [درجات حيوية المستند](https://docs.didit.me/ar/core-technology/id-verification/report-id-verification.md#درجات-حيوية-المستند). للإصدار V3 فقط. | `{ "portrait_replace": { "score": 96.46, "bucket": "approve" } }` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_id_verification"` |
| `warnings` | array | لا | انظر [كائن التحذير](#كائن-التحذير). | `[]` |
| `region` | string | نعم | المنطقة أو الولاية في دولة الإصدار، عندما يحدّدها المستند. | `"CA"` |
| `extracted_data` | object | نعم | لقطة من البيانات المستخرجة من المستند التي عُرضت على الشخص لمراجعتها، وتُحفظ بجانب القيم المؤكدة لتتمكن من مقارنتها. تكون `null` عندما لم يُطلب من الشخص المراجعة. | |
| `barcodes` | array of objects | لا | بيانات مقروءة من باركودات المستند، إدخال واحد لكل باركود يتضمن `type` و`position` و`data` و`data_raw` و`side`. تكون `[]` عندما لا توجد باركودات. | `[]` |

```json theme={null}
{
  "status": "Approved",
  "document_type": "Passport",
  "document_subtype": "PASSPORT_GENERIC",
  "document_number": "AB1234567",
  "personal_number": "99999999R",
  "portrait_image": "https://<media-host>/.../portrait.jpg?signature=...",
  "front_image": "https://<media-host>/.../front.jpg?signature=...",
  "front_video": null,
  "back_image": "https://<media-host>/.../back.jpg?signature=...",
  "back_video": null,
  "full_front_image": "https://<media-host>/.../full_front.jpg?signature=...",
  "full_back_image": null,
  "front_image_camera_front": null,
  "back_image_camera_front": null,
  "front_image_camera_front_face_match_score": null,
  "back_image_camera_front_face_match_score": null,
  "front_image_quality_score": {
    "focus_score": 91.0,
    "brightness_score": 88.0,
    "brightness_issue": "ok",
    "is_document_fully_visible": true,
    "resolution_score": 95.0,
    "overall_score": 88.5
  },
  "back_image_quality_score": null,
  "date_of_birth": "1990-05-12",
  "age": 35,
  "expiration_date": "2032-05-11",
  "date_of_issue": "2022-05-11",
  "issuing_state": "ESP",
  "issuing_state_name": "Spain",
  "first_name": "María",
  "last_name": "García López",
  "full_name": "María García López",
  "gender": "F",
  "address": "Calle Mayor 1, 28001 Madrid",
  "formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "parsed_address": { "street_1": "Calle Mayor 1", "street_2": null, "city": "Madrid", "region": "Madrid", "postal_code": "28001", "country": "ES", "address_type": "Calle" },
  "place_of_birth": "Madrid",
  "marital_status": null,
  "nationality": "ESP",
  "extra_fields": {},
  "mrz": {
    "document_number": "AB1234567",
    "surname": "GARCIA",
    "given_names": "MARIA",
    "birth_date": "900512",
    "expiry_date": "320511"
  },
  "extra_files": [],
  "matches": [],
  "node_id": "first_id_verification",
  "verification_method": "document",
  "assurance": "documentary",
  "wallet_provider": null,
  "fallback_from": null,
  "id_lookup": null,
  "wallet_verification": null,
  "document_liveness": {
    "portrait_replace": {
      "score": 96.46,
      "front": 96.46,
      "back": 98.2,
      "decline_threshold": 35,
      "review_threshold": 70,
      "bucket": "approve"
    },
    "printed_copy": {
      "score": 91.2,
      "front": 91.2,
      "back": 93.7,
      "decline_threshold": 35,
      "review_threshold": 77,
      "bucket": "approve"
    },
    "screen_replay": {
      "score": 99.9,
      "front": 99.9,
      "back": 99.5,
      "decline_threshold": 30,
      "review_threshold": 70,
      "bucket": "approve"
    }
  },
  "warnings": []
}
```

الكائن نفسه مع طريقة لا تعتمد على المستند. تتغير المفاتيح الخاصة بالطريقة فقط: كل ما تملؤه قراءة المستند يُعبَّأ بدلاً منه من سجل الجهة أو من سمات المحفظة، وتكون المفاتيح غير المنطبقة `null`.

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "ZAF",
  "first_name": "Thabo",
  "last_name": "Mokoena",
  "full_name": "Thabo Mokoena",
  "date_of_birth": "1991-06-15",
  "personal_number": "9106155043088",
  "node_id": "first_id_verification",
  "verification_method": "id_lookup",
  "assurance": "data_match",
  "wallet_provider": null,
  "fallback_from": null,
  "id_lookup": {
    "source": "Department of Home Affairs",
    "checked_at": "2026-09-04T09:12:44Z",
    "attempts": 1,
    "max_attempts": 2,
    "outcome": "match",
    "comparison": [
      { "field": "identification_number", "label": "ID number", "provided": "9106155043088", "record": "9106155043088", "result": "match" },
      { "field": "full_name", "label": "Full name", "provided": "Thabo Mokoena", "record": "Thabo Mokoena", "result": "match" },
      { "field": "date_of_birth", "label": "Date of birth", "provided": "1991-06-15", "record": "1991-06-15", "result": "match" }
    ],
    "registry_portrait": "https://<media-host>/.../registry_portrait.jpg?signature=...",
    "face_match_score": 96.4
  },
  "wallet_verification": null,
  "warnings": []
}
```

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "DNK",
  "first_name": "Freja",
  "last_name": "Nielsen",
  "full_name": "Freja Nielsen",
  "date_of_birth": "1988-03-02",
  "node_id": "first_id_verification",
  "verification_method": "wallet",
  "assurance": "cryptographic",
  "wallet_provider": "mitid",
  "fallback_from": null,
  "id_lookup": null,
  "wallet_verification": {
    "provider": "mitid",
    "provider_name": "MitID",
    "issuing_authority": "Danish Agency for Digital Government",
    "issuing_country": "DNK",
    "credential_type": "person_identification",
    "level_of_assurance": "substantial",
    "verified_at": "2026-09-04T09:12:44Z",
    "signature_valid": true,
    "attributes": {
      "full_name": "Freja Nielsen",
      "date_of_birth": "1988-03-02",
      "cpr_alias": "b0f1c2d3-e4f5-4678-9abc-def012345678"
    },
    "portrait": null,
    "face_match_score": null
  },
  "warnings": []
}
```

### التحقق عبر NFC

تُعاد لكل قراءة لشريحة في مستند هوية: شريحة ePassport وفق ICAO 9303 أو شريحة eID، أو قراءة بطاقة My Number Card اليابانية عبر JPKI (`chip_protocol: "jpki"`). تظهر كعنصر `nfc_verifications[]` في `GET /v3/session/{sessionId}/decision/` (واحد لكل سجل KYC رئيسي). المصدر: `kyc/serializers/epassport.py:121-139` (`NFCV3Serializer`، ويمتد `NFCV2Serializer` في `kyc/serializers/epassport.py:83-118`).

| الحقل | النوع | قابل للقيمة الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `status` | string | لا | انظر [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `portrait_image` | string (URL) | نعم | رابط موقّع مسبقاً إلى صورة الوجه المستخرجة من الشريحة. | `"https://<media-host>/.../nfc_portrait.jpg?..."` |
| `signature_image` | string (URL) | نعم | رابط موقّع مسبقاً إلى صورة التوقيع المستخرجة من الشريحة (عندما تكون مخزنة على الشريحة). | `null` |
| `chip_data` | object | نعم | البيانات الشخصية المُحلَّلة من مجموعات البيانات (Data Groups) الموجودة في الشريحة، مُسطَّحة (`kyc/utils/epassport.py:165-212`): `dgs` (مجموعات البيانات المقروءة)، و`surname`، و`name`، و`country`، و`nationality`، و`birth_date` (`YYYY-MM-DD`)، و`expiry_date` (`YYYY-MM-DD`)، و`sex` (`M`/`F`)، و`document_type` (رمز المستند في MRZ)، و`document_number`، و`optional_data`، وأرقام التحقق في MRZ (`birth_date_hash`, `expiry_date_hash`, `document_number_hash`, `optional_data_hash`, `final_hash`)، و`mrz_string`، و`mrz_type` (`TD1`/`TD2`/`TD3`)؛ إضافةً إلى `place_of_birth` و`address` (وكذلك `full_name` و`full_name_non_latin` للأسماء غير اللاتينية) عندما تحمل الشريحة DG11، وتغيب هذه المفاتيح في غير ذلك. تكون `null` عندما تُتخطّى خطوة NFC. | `{ "document_number": "AB1234567", "name": "MARIA" }` |
| `authenticity` | object | نعم | `{ sod_integrity, dg_integrity }`؛ وتكون `null` في قراءة JPKI. يتحقق `sod_integrity` من أن توقيع Document Security Object (SOD) يتسلسل إلى CSCA صالحة لدولة الإصدار، وأن DSC لم تُلغَ ولم تنتهِ صلاحيتها؛ ويتحقق `dg_integrity` من أن تجزئات كل Data Group تطابق SOD. وعندما تكون القيمتان `true` فهذا يعني أن الشريحة أصلية وغير معدَّلة. | `{ "sod_integrity": true, "dg_integrity": true }` |
| `certificate_summary` | object | نعم | ملخص شهادة موقّع المستند (`kyc/utils/epassport.py:338-348`): `issuer`، و`subject`، و`serial_number` (عدد صحيح)، و`not_valid_before`، و`not_valid_after` (`YYYY-MM-DD HH:MM:SS`)، إضافةً إلى كائن `validation` بالصيغة `{ csca_verified, dsc_revoked, dsc_expired, csca_expired }` (`kyc/views/epassport.py:86`). | `{ "issuer": "Common Name: CSCA SPAIN, Country: ES", "not_valid_after": "2031-02-18 10:21:11" }` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_nfc"` |
| `is_nfc_skipped` | boolean | لا | القيمة `true` عندما تُتخطّى خطوة NFC هذه صراحةً بدلًا من قراءتها، ويوضح `skip_reason` السبب. | `false` |
| `skip_reason` | string | نعم | سبب تخطي الخطوة، ويُضبط فقط عندما تكون `is_nfc_skipped` القيمة `true`. إحدى القيم `USER_SKIPPED` أو `DOCUMENT_WITHOUT_CHIP` أو `CHIP_CERTIFICATE_UNAVAILABLE` أو `DEVICE_WITHOUT_NFC` أو `INTEGRATION_WITHOUT_NFC_ACCESS` أو `MRZ_KEY_UNAVAILABLE` أو `JPKI_UNAVAILABLE`؛ راجع [أسباب التخطي](https://docs.didit.me/ar/core-technology/nfc-verification/warnings-nfc-verification.md#أسباب-التخطي). يتضمن payload القرار أيضًا الحقل `nfc_skip_reason` على مستوى الجلسة بالتصنيف نفسه، ويشمل خطوات NFC التي تم تجاوزها قبل إنشاء أي تقرير. | `null` |
| `chip_protocol` | string | لا | طريقة قراءة الشريحة: `icao` (شريحة ICAO 9303 لجواز السفر ePassport أو لبطاقة الهوية الإلكترونية eID) أو `jpki` (بطاقة My Number اليابانية). في حالة `jpki`، تكون القيم `portrait_image` و`signature_image` و`chip_data` و`authenticity` و`certificate_summary` مساوية لـ `null`. وتُضبط هذه القيمة أيضًا على الخطوات المتخطاة. | `"icao"` |
| `jpki` | object | نعم | ما أثبتته قراءة بطاقة My Number: `certificate_types` و`chain_valid` و`signature_valid` و`revocation_status` (`good` أو `revoked` أو `unchecked`) و`ca_generation` و`certificate_expires_at` و`certificates[]` و`attributes` (الاسم وتاريخ الميلاد والجنس والعنوان من شهادة التوقيع) و`attributes_match_ocr` و`mismatched_attributes`. لا تُعاد أبدًا الشهادات ولا أرقامها التسلسلية ولا التوقيعات. القيمة `null` لشرائح ICAO، وللخطوات المتخطاة، وعندما تنتهي الخطوة دون أي قراءة للبطاقة. راجع [حقول JPKI](https://docs.didit.me/ar/core-technology/nfc-verification/report-nfc-verification.md#حقول-jpki). | `null` |
| `warnings` | array | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "status": "Approved",
  "portrait_image": "https://<media-host>/.../nfc_portrait.jpg?signature=...",
  "signature_image": null,
  "chip_data": {
    "dgs": ["DG1", "DG2", "DG11"],
    "surname": "GARCIA LOPEZ",
    "name": "MARIA",
    "country": "ESP",
    "nationality": "ESP",
    "birth_date": "1990-05-12",
    "expiry_date": "2032-05-11",
    "sex": "F",
    "document_type": "P",
    "document_number": "AB1234567",
    "optional_data": "",
    "birth_date_hash": "4",
    "expiry_date_hash": "7",
    "document_number_hash": "3",
    "optional_data_hash": "",
    "final_hash": "8",
    "mrz_string": "P<ESPGARCIA<LOPEZ<<MARIA<<<<<<<<<<<<<<<<<<<<AB1234567ESP9005124F3205117<<<<<<<<<<<<<<08",
    "mrz_type": "TD3",
    "place_of_birth": "MADRID",
    "address": "CALLE MAYOR 1, MADRID"
  },
  "authenticity": { "sod_integrity": true, "dg_integrity": true },
  "certificate_summary": {
    "issuer": "Common Name: CSCA SPAIN, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
    "subject": "Common Name: DS n-eID SPAIN 2, Organizational Unit: PASSPORT, Organization: DIRECCION GENERAL DE LA POLICIA, Country: ES",
    "serial_number": 118120836164494130086420187336801405660,
    "not_valid_before": "2020-11-18 10:21:11",
    "not_valid_after": "2031-02-18 10:21:11",
    "validation": {
      "csca_verified": true,
      "dsc_revoked": false,
      "dsc_expired": false,
      "csca_expired": false
    }
  },
  "node_id": "first_nfc",
  "is_nfc_skipped": false,
  "skip_reason": null,
  "chip_protocol": "icao",
  "jpki": null,
  "warnings": []
}
```

### فحص الحيوية

تُعاد لكل جلسة فحص حيوية. تظهر كعنصر `liveness_checks[]` في `GET /v3/session/{sessionId}/decision/`. المصدر: `face/serializers/face.py:301-320` (`LivenessV3Serializer`، يمتد من `LivenessV2Serializer` في `face/serializers/face.py:216-298`).

| الحقل | النوع | يقبل null | الوصف | المثال |
| - | - | - | - | - |
| `status` | string | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `method` | string (enum) | نعم | `ACTIVE_3D` أو `FLASHING` أو `PASSIVE` (`LivenessMethodChoices`، `common/config/choices.py:514-517`). يُشغَّل الوضع السلبي عندما تكون جلسات سطح المكتب مسموحة والمستخدم على سطح المكتب. | `"PASSIVE"` |
| `score` | float (0-100) | نعم | درجة ثقة فحص الحيوية، مُقرَّبة إلى منزلتين عشريتين. | `92.41` |
| `reference_image` | string (URL) | نعم | عنوان URL موقَّع مسبقًا لاقتطاع الوجه المرجعي للمستخدم. | `"https://<media-host>/.../reference.jpg?..."` |
| `video_url` | string (URL) | نعم | عنوان URL موقَّع مسبقًا لفيديو فحص الحيوية (في الوضع النشط فقط). | `"https://<media-host>/.../liveness.webm?..."` |
| `age_estimation` | float | نعم | العمر المقدَّر (بالسنوات) للوجه الأكبر في الصورة المرجعية. | `34.2` |
| `matches` | array of objects | لا | مطابقات الوجه عبر الجلسات. كل عنصر: `{ session_id, session_number, similarity_percentage, vendor_data, vendor_user_id, biometric_template_id, verification_date, user_details: { full_name, document_type, document_number }, match_image_url, status, is_blocklisted, is_allowlisted, api_service, source }`. القيمة `source` هي `session` أو `imported` أو `list_entry` أو `retained_template`. تحمل المطابقة من نوع القالب المحفوظ الحقول `vendor_user_id` و`vendor_data` و`biometric_template_id`، أما حقول الجلسة والصورة وتفاصيل الهوية والحالة وخدمة API فقيمتها `null`. | `[]` |
| `face_quality` | float (0-100) | نعم | درجة جودة الوجه في فحص الحيوية السلبي (مُحوَّلة إلى نسبة مئوية). | `87.50` |
| `face_luminance` | float (0-100) | نعم | درجة سطوع الوجه في فحص الحيوية السلبي (مُحوَّلة من النطاق 0-255 إلى نسبة مئوية). | `54.12` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_liveness"` |
| `warnings` | array | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "status": "Approved",
  "method": "PASSIVE",
  "score": 92.41,
  "reference_image": "https://<media-host>/.../reference.jpg?signature=...",
  "video_url": null,
  "age_estimation": 34.2,
  "matches": [],
  "face_quality": 87.50,
  "face_luminance": 54.12,
  "node_id": "first_liveness",
  "warnings": []
}
```

### مطابقة الوجه

تُعاد لكل مقارنة مطابقة وجه (عادةً بين وجه المستخدم في فحص الحيوية وصورة المستند الشخصية). تظهر كعنصر `face_matches[]` في `GET /v3/session/{sessionId}/decision/`. المصدر: `face/serializers/face.py:367-389` (`FaceMatchV3Serializer`، يمتد من `FaceMatchV2Serializer` في `face/serializers/face.py:323-364`).

| الحقل | النوع | يقبل null | الوصف | المثال |
| - | - | - | - | - |
| `status` | string | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `score` | float (0-100) | نعم | درجة التشابه، مُقرَّبة إلى منزلتين عشريتين. عندما يعيد المزوّد `unmatched_faces[].Confidence` فقط، تُحوَّل إلى `100 - confidence`. | `97.83` |
| `source_image_session_id` | string (UUID) | نعم | الجلسة التي وفّرت الصورة الشخصية المحفوظة لتكون مصدر الصورة (المرجعية)، وتُضبط في التدفقات القائمة على الصورة الشخصية، مثل المصادقة البيومترية أو الصورة الشخصية المقدَّمة عند إنشاء الجلسة. تكون القيمة `null` عندما تكون الصورة المرجعية هي صورة المستند الشخصية من الجلسة نفسها. | `null` |
| `source_image` | string (URL) | نعم | عنوان URL موقَّع مسبقًا للصورة المصدر (المرجعية)، وهي عادةً صورة المستند الشخصية، أو الصورة الشخصية المحفوظة في تدفقات المصادقة البيومترية. | `"https://<media-host>/.../source.jpg?..."` |
| `target_image` | string (URL) | نعم | عنوان URL موقَّع مسبقًا للصورة الهدف (وجه الشخص الحي) الملتقطة أثناء فحص الحيوية. | `"https://<media-host>/.../target.jpg?..."` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_face_match"` |
| `warnings` | array | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |
| `face_coverage` | object | نعم | تحدد ما إذا كانت `eyes` (العينان) و`mouth` (الفم) و`face` (الوجه) مغطاة في الصورة الملتقطة. تحمل كل منطقة الحقول `covered` و`calibrated` و`visibility_score`، والقيمة `calibrated: false` تعني دليلًا ظليًا لا يفعّل أي تحذير. تُعيده `GET /v3/session/{sessionId}/decision/` فقط، ولا يظهر أبدًا في حمولات webhook. | `{ "eyes": { "covered": false, "calibrated": true, "visibility_score": 0.98 } }` |

```json theme={null}
{
  "status": "Approved",
  "score": 97.83,
  "source_image_session_id": null,
  "source_image": "https://<media-host>/.../source.jpg?signature=...",
  "target_image": "https://<media-host>/.../target.jpg?signature=...",
  "node_id": "first_face_match",
  "warnings": []
}
```

### البحث بالوجه

تُرجَع بواسطة واجهة برمجة تطبيقات البحث بالوجه المستقلة (`POST /v3/face-search/`). لا يظهر البحث بالوجه أبدًا كمصفوفة بصيغة الجمع في `/v3/session/{sessionId}/decision/`. عند حفظه باستخدام `save_api_request=true`، تظهر الجلسة هناك كعنصر `FACE_SEARCH` ضمن `features[]`، مع عنصر في `liveness_checks[]` يحمل `matches` المخزنة. المصادر: `apis/serializers/face_search.py:8-79` (`FaceSearchResponseSerializer` الذي يغلّف `FaceSearchDetailsSerializer`)؛ وتُبنى قواميس المطابقة في `face/utils/utils.py:869-884`.

الاستجابة ذات المستوى الأعلى:

| الحقل | النوع | قابل للفراغ | الوصف | مثال |
| - | - | - | - | - |
| `request_id` | string (UUID) | لا | معرّف الجلسة المحفوظة عند `save_api_request=true` (ويمكن استخدامه مع `GET /v3/session/{sessionId}/decision/`)؛ وإلا فهو معرّف ارتباط مؤقت بصيغة UUID. | `"4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f"` |
| `face_search` | object | لا | payload تفاصيل البحث، وتوضحها الحقول أدناه. | — |
| `vendor_data` | string | نعم | قيمة `vendor_data` المرسلة في الطلب كما هي. | `null` |
| `metadata` | object | نعم | قيمة `metadata` المرسلة في الطلب كما هي. | `null` |
| `created_at` | string (ISO 8601) | لا | الطابع الزمني للطلب من جهة الخادم. | `"2026-06-12T01:04:42.763237+00:00"` |

كائن `face_search`:

| الحقل | النوع | قابل للفراغ | الوصف | مثال |
| - | - | - | - | - |
| `status` | string | لا | تكون القيمة `Declined` فقط عند تفعيل تحذير `FACE_IN_BLOCKLIST` أو `POSSIBLE_FACE_IN_BLOCKLIST`، وتكون `Approved` في غير ذلك. المطابقات المكررة وحدها لا تؤدي إلى رفض الطلب أبدًا (`apis/views/face_search.py:242-248`). | `"Approved"` |
| `total_matches` | integer | لا | عدد المطابقات المُرجعة في `matches[]` (0–5). | `1` |
| `matches` | مصفوفة من [كائنات مطابقة البحث بالوجه](#كائن-مطابقة-البحث-بالوجه) | لا | حتى 5 مطابقات فوق حد التشابه الأدنى، مرتبة تنازليًا حسب درجة التشابه (تأتي الإدخالات الموجودة في قائمة الحظر أولًا مع `search_type=blocklisted_or_approved`). | `[…]` |
| `user_image` | object | لا | نتيجة الكشف عن الصورة المرسلة: `{ entities: [{ bbox, confidence }], best_angle }`، ويوجد كيان واحد لكل وجه مكتشف. | `{ "entities": [{ "bbox": [40, 40, 120, 120], "confidence": 0.73 }], "best_angle": 0 }` |
| `warnings` | مصفوفة من الكائنات | لا | شكل مختصر للتحذيرات في هذه الواجهة المستقلة، ولا يتضمن `node_id`. يحدد عقد المُسلسِل الحقول `{ risk, additional_data, log_type, short_description, long_description }` (`apis/serializers/face_search.py:49-54`)، أما payload الفعلية عند التشغيل فتتضمن أيضًا `feature`، وقيمته دائمًا `"LIVENESS"` (`apis/views/face_search.py:332-341`). | `[]` |

#### كائن مطابقة البحث بالوجه

| الحقل | النوع | قابل للفراغ | الوصف | مثال |
| - | - | - | - | - |
| `session_id` | string (UUID) | نعم | معرّف جلسة التحقق المطابقة. تكون `null` عندما يكون `source` بقيمة `imported` أو `list_entry` أو `retained_template`. | `"a3f2a6f1-…"` |
| `session_number` | integer | نعم | رقم الجلسة المطابقة بصيغة سهلة القراءة في لوحة التحكم؛ تكون `null` للمطابقات التي ليست جلسات. | `1024` |
| `similarity_percentage` | float (0-100) | لا | درجة التشابه بين الوجه المرسل والوجه المطابق. | `96.42` |
| `source` | string (enum) | لا | مصدر تسجيل الوجه المطابق: `session` (جلسة تحقق أو استدعاء مستقل محفوظ)، و`imported` (رفع مباشر لصورة الوجه في ملف تعريف المستخدم)، و`list_entry` (وجه مرتبط بقائمة)، و`retained_template` ([القالب البيومتري](https://docs.didit.me/ar/management-api/biometric-templates/overview.md) الخالي من الصور والمحفوظ بعد حذف الجلسة المصدر). | `"session"` |
| `vendor_data` | string | نعم | قيمة `vendor_data` الخاصة بالجلسة المطابقة، أو الخاصة بالمستخدم المرتبط في مطابقات `imported` و`retained_template`. | `"user-12345"` |
| `vendor_user_id` | string (UUID) | نعم | المستخدم المرتبط. تكون `null` لمطابقات `list_entry` وللجلسات التي لا يوجد لها مستخدم. | `"2f7c1a9e-…"` |
| `biometric_template_id` | string (UUID) | نعم | القالب المحفوظ الذي تمت مطابقته. يُضبط فقط لمطابقات `retained_template`، ويُستخدم مع `GET`/`DELETE /v3/biometric-templates/{id}/`. | `null` |
| `verification_date` | string (ISO 8601) | نعم | وقت التقاط الوجه المطابق، أو وقت الاحتفاظ بالقالب في حالة `retained_template`؛ وتكون `null` لمطابقات `list_entry`. | `"2024-11-04T09:14:02Z"` |
| `user_details` | object | نعم | `{ full_name, document_type, document_number }` من التحقق من المستند في الجلسة المطابقة. في مطابقات `imported` يُضبط `full_name` فقط. تكون `null` عندما لا توجد بيانات هوية، وتكون دائمًا `null` لمطابقات `retained_template`. | `{ "full_name": "María García López", "document_type": "Passport", "document_number": "AB1234567" }` |
| `match_image_url` | string (URL) | نعم | الوجه المرجعي للمستخدم المطابق: رابط موقّع مسبقًا عندما يكون `save_api_request=true`، ومسار التخزين الخام في غير ذلك. تكون دائمًا `null` لمطابقات `retained_template` لأنها لا تحتوي على صورة. | `"https://<media-host>/.../matched.jpg?..."` |
| `status` | string | نعم | حالة التحقق للجلسة المطابقة (انظر [تعداد الحالات](#مرجع-قيم-الحالة))؛ تكون `null` للمطابقات التي ليست جلسات. | `"Approved"` |
| `is_blocklisted` | boolean | لا | هل الوجه المطابق موجود في قائمة الحظر الخاصة بالوجوه لديك. تكون القيمة دائمًا `false` لمطابقات `retained_template`، ويُبلَّغ عن الوجه الموجود في قائمة الحظر بشكل منفصل كمطابقة `list_entry`. | `false` |
| `is_allowlisted` | boolean | لا | هل الوجه المطابق موجود في إحدى قوائم السماح لديك. | `false` |
| `api_service` | string (enum) | نعم | نوع الواجهة المستقلة للجلسة المطابقة بالأحرف الكبيرة (مثل `PASSIVE_LIVENESS` و`FACE_MATCH`)؛ تكون `null` لجلسات سير العمل ولمطابقات ليست جلسات. | `null` |

```json theme={null}
{
  "request_id": "4a1c2c4e-8b1b-4d6a-91b5-ee9a1f3a2c7f",
  "face_search": {
    "status": "Approved",
    "total_matches": 1,
    "matches": [
      {
        "session_id": "a3f2a6f1-1c1c-4eec-8b69-1c1c2f3a2c7f",
        "session_number": 1024,
        "similarity_percentage": 96.42,
        "source": "session",
        "vendor_data": "user-12345",
        "verification_date": "2024-11-04T09:14:02Z",
        "user_details": {
          "full_name": "María García López",
          "document_type": "Passport",
          "document_number": "AB1234567"
        },
        "match_image_url": "https://<media-host>/.../matched.jpg?signature=...",
        "status": "Approved",
        "is_blocklisted": false,
        "is_allowlisted": false,
        "api_service": null
      }
    ],
    "user_image": {
      "entities": [
        {
          "bbox": [40, 40, 120, 120],
          "confidence": 0.732973
        }
      ],
      "best_angle": 0
    },
    "warnings": []
  },
  "vendor_data": null,
  "metadata": null,
  "created_at": "2026-06-12T01:04:42.763237+00:00"
}
```

### فحص AML

يُرجَع لكل كيان يخضع للفحص. يظهر كعنصر `aml_screenings[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وجلسات KYB على حد سواء. المصدر: `aml/serializers/aml.py:63-85` (`AMLV3Serializer`، ويمتد من `AMLV2Serializer` في `aml/serializers/aml.py:28-60`).

| الحقل | النوع | قابل للفراغ | الوصف | مثال |
| - | - | - | - | - |
| `status` | string | لا | انظر [تعداد الحالات](#مرجع-قيم-الحالة). | `"Approved"` |
| `total_hits` | integer | لا | عدد نتائج الفحص (يكون حاضرًا دائمًا، والقيمة الافتراضية `0`). | `2` |
| `entity_type` | string (enum) | نعم | `person` أو `company` (`EntityTypeChoices`، `common/config/choices.py:675-677`). | `"person"` |
| `hits` | مصفوفة من الكائنات | لا | عنصر واحد لكل نتيجة. الحقول الرئيسية: `id` و`caption` و`match` (قيمة منطقية) و`target` (قيمة منطقية \| null، وتحدد ما إذا كان الكيان هو الهدف المباشر للإدراج في القائمة)، و`match_score` (درجة التطابق، وهي درجة الثقة في الهوية، ورقم عشري من 0 إلى 100) و`risk_score` (درجة مخاطر الكيان، ورقم عشري من 0 إلى 100) و`score` (القيمة المتقادمة، ورقم عشري من 0 إلى 1)، و`datasets[]` (مثل `PEP` و`PEP Level 1`-`4` و`Sanctions` و`Adverse Media` و`Warnings and Regulatory Enforcement` و`Fitness and Probity`)، و`properties` (الأسماء والأسماء المستعارة وتواريخ الميلاد، …)، و`features` و`url` و`first_seen` و`last_seen` و`rca_name` و`risk_view` و`score_breakdown` و`pep_matches` و`sanction_matches` و`warning_matches` و`adverse_media_matches` و`adverse_media_details` و`linked_entities` و`additional_information`، و`review_status` (`Unreviewed` و`Confirmed Match` و`False Positive` و`Inconclusive`، ويمكن تعديلها عبر endpoint تحديث حالة نتيجة AML، `AMLHitStatusChoices`). | `[…]` |
| `score` | عدد عشري (0-100) | نعم | درجة الفحص الإجمالية: أعلى `risk_score` بين النتائج غير المعلَّمة بـ `False Positive` (`aml/services/aml.py:832-842`)؛ وتكون `0` عندما تكون كل نتائج المطابقة إيجابيات كاذبة. تكون `null` حتى يتم حسابها. | `42.7` |
| `screened_data` | كائن | نعم | نسخة من البيانات المرسلة إلى الفحص: `full_name` و`nationality` و`date_of_birth` و`document_number`. | `{ "full_name": "María García López", "date_of_birth": "1990-05-12" }` |
| `is_ongoing_monitoring_enabled` | قيمة منطقية | لا | هل الكيان مشترك في إعادة الفحص ضمن المراقبة المستمرة. | `false` |
| `next_ongoing_monitoring_bill_date` | نص (YYYY-MM-DD) | نعم | يُحسب بالصيغة `last_aml_bill_date + 365 days` عندما تكون المراقبة المستمرة مفعّلة. وهو تاريخ **الفوترة**، وليس تاريخ فحص. | `null` |
| `last_ongoing_screening_at` | نص (ISO 8601) | نعم | الوقت الذي أكملت فيه المراقبة المستمرة آخر إعادة فحص لهذا السجل، سواء تغيّرت النتيجة أم لا. تكون `null` إذا لم تُعَد إعادة الفحص أبدًا، ولا تُملأ بأثر رجعي. | `"2026-09-12T04:03:11Z"` |
| `last_ongoing_screening_datasets_updated_at` | نص (ISO 8601) | نعم | أحدث تحديث لمجموعة بيانات AML أبلغ عنه المزوّد لذلك الفحص. تكون `null` عندما لا يُبلَّغ عن تاريخ لمجموعة البيانات، ولا تُقدَّر أبدًا. | `null` |
| `node_id` | نص \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_aml"` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "status": "In Review",
  "total_hits": 1,
  "entity_type": "person",
  "hits": [
    {
      "id": "Q7XW3-aml-hit-1",
      "caption": "Maria Garcia Lopez",
      "match": true,
      "target": true,
      "match_score": 86.4,
      "risk_score": 42.7,
      "datasets": ["PEP Level 2"],
      "properties": {
        "name": ["María García López", "M. García"],
        "alias": ["Maria Garcia"],
        "birthDate": ["1990-05-12"]
      },
      "url": "https://example.org/registry/entities/Q7XW3",
      "first_seen": "2023-11-02T00:00:00Z",
      "last_seen": "2026-05-01T00:00:00Z",
      "review_status": "Unreviewed"
    }
  ],
  "score": 42.7,
  "screened_data": {
    "full_name": "María García López",
    "date_of_birth": "1990-05-12",
    "nationality": "ES",
    "document_number": "AB1234567"
  },
  "is_ongoing_monitoring_enabled": false,
  "next_ongoing_monitoring_bill_date": null,
  "last_ongoing_screening_at": null,
  "last_ongoing_screening_datasets_updated_at": null,
  "node_id": "first_aml",
  "warnings": []
}
```

### تحليل عنوان IP

تُعاد لكل موقع شبكة يتم التقاطه. يظهر كـ `ip_analyses[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وKYB على حد سواء. المصدر: `kyc/serializers/location.py:196-243` (`IPAnalysisSerializerV3`).

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `status` | نص | لا | راجع [تعداد الحالات](#مرجع-قيم-الحالة). | `"Approved"` |
| `node_id` | نص \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_ip_analysis"` |
| `device_brand` | نص | نعم | علامة الجهاز التجارية المستخلصة من وكيل المستخدم. | `"Apple"` |
| `device_model` | نص | نعم | طراز الجهاز. | `"iPhone"` |
| `browser_family` | نص | نعم | عائلة المتصفح. | `"Mobile Safari"` |
| `os_family` | نص | نعم | عائلة نظام التشغيل. | `"iOS"` |
| `platform` | نص | نعم | المنصة العامة (`mobile`، `desktop`، `tablet`). | `"mobile"` |
| `device_fingerprint` | نص | نعم | تجزئة بصمة ثابتة لكل جهاز. | `"f2a3…"` |
| `ip_country` | نص | نعم | اسم الدولة المحدَّد من العنوان. | `"Spain"` |
| `ip_country_code` | نص (ISO 3166-1 alpha-2) | نعم | رمز الدولة المحدَّد من العنوان. | `"ES"` |
| `ip_state` | نص | نعم | المنطقة أو الولاية المحدَّدة من العنوان. | `"Comunidad de Madrid"` |
| `ip_city` | نص | نعم | المدينة المحدَّدة من العنوان. | `"Madrid"` |
| `latitude` | عدد عشري | نعم | خط العرض المستنتج من العنوان. | `40.4168` |
| `longitude` | عدد عشري | نعم | خط الطول المستنتج من العنوان. | `-3.7038` |
| `ip_address` | نص | نعم | العنوان الذي تم التقاطه. | `"203.0.113.42"` |
| `isp` | نص | نعم | اسم مزوّد خدمة الإنترنت. | `"Telefonica de Espana"` |
| `organization` | نص | نعم | اسم المؤسسة (غالبًا ما يكون مطابقًا لمزوّد خدمة الإنترنت). | `"Telefonica de Espana"` |
| `is_vpn_or_tor` | قيمة منطقية | نعم | تكون `true` عندما ينتمي العنوان إلى VPN أو وكيل أو عقدة خروج Tor. | `false` |
| `is_data_center` | قيمة منطقية | نعم | تكون `true` عندما ينتمي العنوان إلى ASN معروف لخدمات الاستضافة أو مراكز البيانات. | `false` |
| `time_zone` | نص | نعم | اسم المنطقة الزمنية وفق IANA. | `"Europe/Madrid"` |
| `time_zone_offset` | نص | نعم | الإزاحة عن UTC. | `"+02:00"` |
| `ip` | كائن | لا | `{ location, distance_from_id_document, distance_from_poa_document }`. و`location = { latitude, longitude }`. المسافات بالكيلومترات، وتكون `null` عندما يكون أحد الطرفين مفقودًا. | `{ "location": { "latitude": 40.4168, "longitude": -3.7038 }, "distance_from_id_document": 3.4, "distance_from_poa_document": 1.1 }` |
| `id_document` | كائن | لا | `{ location, distance_from_ip, distance_from_poa_document }`. موقع وثيقة الهوية مستنتج من `issuing_state` والعنوان المحلَّل. | `{ "location": { "latitude": 40.4165, "longitude": -3.7026 }, "distance_from_ip": 3.4, "distance_from_poa_document": 4.0 }` |
| `poa_document` | كائن | لا | `{ location, distance_from_ip, distance_from_id_document }`. تم ترميز عنوان إثبات العنوان جغرافيًا. | `{ "location": { "latitude": 40.4170, "longitude": -3.7040 }, "distance_from_ip": 1.1, "distance_from_id_document": 4.0 }` |
| `matches` | مصفوفة من الكائنات | لا | عمليات مطابقة عبر الجلسات للعنوان أو للجهاز. كل عنصر: `{ session_id, session_number, vendor_data, verification_date, match_type, match_source, matched_value, status, is_blocklisted, api_service, source, device_info, location_info, confidence, match_mode }`. تكون `match_type` إما `ip_address` أو `device_fingerprint`، وتكون `match_source` إما `ip_address` أو `persistent_id` أو `legacy_fp` أو `recovered_high` (المطابقات المستعادة تحمل أيضًا `recovery_similarity` و`tls_ja4_corroborated` و`recovery_gate_reason`). محدودة بخمس مطابقات للعنوان وخمس مطابقات للجهاز. | `[]` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |
| `browser_version`, `os_version` | نص | نعم | إصداران للمتصفح ونظام التشغيل من وكيل المستخدم. | `"17.4"` |
| `user_agent`, `accept_language` | نص | نعم | سلسلة وكيل المستخدم ورأس `Accept-Language` الذي أرسله المتصفح. | `"en-US,en;q=0.9"` |
| `session_identifier`, `session_age_ms` | نص، عدد صحيح | نعم | جلسة التصفح التي نُفّذت فيها الخطوة، وعمرها بالمللي ثانية. | `48210` |
| `coords_accuracy` | عدد عشري | نعم | نصف قطر الدقة، بالأمتار، للإحداثيات التي أبلغ عنها الجهاز. | `35.0` |
| `raw_device_data` | كائن | نعم | إشارات الجهاز الخام المجمّعة للخطوة. | `{}` |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_ip_analysis",
  "device_brand": "Apple",
  "device_model": "iPhone",
  "browser_family": "Mobile Safari",
  "os_family": "iOS",
  "platform": "mobile",
  "device_fingerprint": "f2a3c1de8b994a3f9e4cdf3a02b1a7c9",
  "ip_country": "Spain",
  "ip_country_code": "ES",
  "ip_state": "Comunidad de Madrid",
  "ip_city": "Madrid",
  "latitude": 40.4168,
  "longitude": -3.7038,
  "ip_address": "203.0.113.42",
  "isp": "Telefonica de Espana",
  "organization": "Telefonica de Espana",
  "is_vpn_or_tor": false,
  "is_data_center": false,
  "time_zone": "Europe/Madrid",
  "time_zone_offset": "+02:00",
  "ip": {
    "location": { "latitude": 40.4168, "longitude": -3.7038 },
    "distance_from_id_document": 3.4,
    "distance_from_poa_document": 1.1
  },
  "id_document": {
    "location": { "latitude": 40.4165, "longitude": -3.7026 },
    "distance_from_ip": 3.4,
    "distance_from_poa_document": 4.0
  },
  "poa_document": {
    "location": { "latitude": 40.4170, "longitude": -3.7040 },
    "distance_from_ip": 1.1,
    "distance_from_id_document": 4.0
  },
  "matches": [],
  "warnings": []
}
```

### التحقق من الموقع

تُعاد لكل خطوة [التحقق من الموقع](https://docs.didit.me/ar/core-technology/location-verification/overview.md). تظهر كـ `geolocation_checks[]` في `GET /v3/session/{sessionId}/decision/`: عنصر واحد لكل خطوة، وهو محاولتها المقبولة. يسرد `geolocation_attempts[]` كل محاولة لكل خطوة، من الأقدم إلى الأحدث. يكون كلاهما `null` لسير العمل الذي لا يتضمن هذه الخطوة. المصدر: `GeolocationDecisionSerializer`.

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `node_id` | نص | نعم | عقدة سير العمل التي أنتجت النتيجة. | `"geolocation_1"` |
| `status` | نص | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Declined"` |
| `outcome` | نص | نعم | ما حدث أثناء المحاولة: `verified`، `low_accuracy`، `accuracy_undetermined`، `stale`، `approximate`، `denied`، `restricted`، `unavailable`، `timeout`، `mock_detected`، `outside_geofence`، `in_blocked_area`، `anonymizer_detected`، `skipped`، `replay_rejected` أو `unsupported_client`. | `"outside_geofence"` |
| `permission` | نص | نعم | الإذن الذي منحه النظام: `granted_precise`، `granted_approximate`، `denied`، `restricted`، `unavailable`، `timeout`، `dismissed` أو `not_requested`. | `"granted_precise"` |
| `latitude`، `longitude` | عدد عشري | نعم | الموقع وفق WGS84. يكون `null` عند عدم وجود موقع. | `48.8566` |
| `accuracy_m` | عدد عشري | نعم | نصف قطر عدم اليقين بالأمتار. | `35.0` |
| `accuracy_confidence` | نص | نعم | `p95`، `p68` أو `unspecified`. | `"p95"` |
| `measured_at`، `age_seconds` | تاريخ ووقت، عدد صحيح | نعم | وقت التقاط الجهاز للموقع، والثواني التي انقضت حتى استلمه Didit. | `2` |
| `source`، `platform`، `sdk_version` | نص | نعم | مصدر الموقع، والعميل الذي أنتجه، وإصدار SDK الخاص به. | `"browser"` |
| `is_mock`، `produced_by_accessory` | منطقي | نعم | أدلة الانتحال التي تبلغ عنها المنصة. تعني `null` أن المنصة لا تبلغ عنها. | `null` |
| `integrity` | نص | لا | `attested`، `not_attested`، `failed`، `unsupported` (ويب) أو `not_determined`. | `"unsupported"` |
| `country_code`، `region_code`، `city` | نص | نعم | المكان الذي يشير إليه الموقع. | `"FR"` |
| `geofence`، `inside_geofence`، `geofence_basis`، `inside_areas`، `blocked_areas` | كائن، منطقي، نص، مصفوفات | نعم | نتيجة الدولة والمنطقة. | `{ "enabled": true, "result": "outside" }` |
| `position_source`، `anonymizers` | نص، كائن | نعم | مصدر الموقع الذي تأخذه الخطوة، وإشارات VPN والوكيل وTor والانتحال والمحاكيات. | `"device_and_ip"` |
| `ip_distance_km`، `ip_distance_uncertainty_km`، `ip_consistent`، `document_distance_km`، `travel_excused`، `consecutive_mismatches` | عدد، منطقي، عدد صحيح | نعم | المقارنات مع موقع عنوان IP والعنوان المسجل. | `12.4` |
| `attempts` | عدد صحيح | لا | رقم المحاولة ضمن الخطوة. | `3` |
| `consent` | كائن | نعم | `accepted_at` و`version` و`locale` للإشعار الذي قبله الشخص. | |
| `warnings` | مصفوفة من [كائنات التحذير](#كائن-التحذير) | لا | تحذيرات `LOCATION_*` الخاصة بالخطوة. لا يظهر هذا الحقل في `geolocation_attempts[]` التي تضيف `received_at` و`created_at`. | `[]` |

ترد كل الحقول والأمثلة في [تقرير التحقق من الموقع](https://docs.didit.me/ar/core-technology/location-verification/report-location-verification.md).

### إثبات العنوان

يُعاد لكل مستند عنوان مقدَّم. يظهر بوصفه `poa_verifications[]` في `GET /v3/session/{sessionId}/decision/`. المصدر: `poa/serializers/poa.py:212-227` (`POAV3Serializer`، يمتد من `POAV2Serializer` في `poa/serializers/poa.py:173-209`).

| الحقل | النوع | قابل لـ null | الوصف | المثال |
| - | - | - | - | - |
| `status` | نص | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `issuing_state` | نص (ISO 3166-1 alpha-3) | نعم | رمز دولة جهة إصدار المستند. | `"ESP"` |
| `document_type` | نص | لا | النوع العام من `PoaDocumentTypeChoices` (`common/config/choices.py:868-873`): `UTILITY_BILL`، `BANK_STATEMENT`، `GOVERNMENT_ISSUED_DOCUMENT`، `OTHER_POA_DOCUMENT`. يرجع إلى `UNKNOWN` ولا يكون أبداً `null`. | `"UTILITY_BILL"` |
| `document_subtype` | نص | لا | رمز النوع الفرعي من `PoaDocumentSubtypeChoices` (مثل `ELECTRICITY_BILL` و`WATER_BILL` و`ACCOUNT_STATEMENT`). يرجع إلى `UNKNOWN` ولا يكون أبداً `null`. | `"ELECTRICITY_BILL"` |
| `issuer` | نص | نعم | اسم الجهة المُصدِرة. | `"Iberdrola"` |
| `issue_date` | نص (YYYY-MM-DD) | نعم | تاريخ إصدار المستند. | `"2026-04-15"` |
| `expiration_date` | نص (YYYY-MM-DD) | نعم | تاريخ الانتهاء المطبوع على المستند، عند وجوده. | `null` |
| `poa_address` | نص | نعم | العنوان الخام المستخرج عبر OCR. | `"Calle Mayor 1, 28001 Madrid"` |
| `poa_formatted_address` | نص | نعم | العنوان المحدَّد جغرافياً والمنسَّق. | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `poa_parsed_address` | كائن | نعم | العنوان المهيكل (`street_1`، `street_2`، `city`، `region`، `postal_code`، `country` (alpha-2)، `address_type`، `document_location`، …). | `{ "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001" }` |
| `document_file` | نص (URL) | نعم | عنوان URL موقَّع مسبقاً للمستند المرفوع. | `"https://<media-host>/.../poa.pdf?..."` |
| `document_language` | نص | نعم | لغة المستند المكتشفة (ISO 639-1). | `"es"` |
| `document_metadata` | كائن | نعم | بيانات وصفية مصفّاة: `file_size`، `content_type`، `creation_date`، `modified_date`، `creator`، `producer`، `software`، `encryption`، `is_signed`، `is_tampered`، `signature_info`، `exif_original_date`، `exif_digitized_date`، `processed_by_known_editor`، `has_different_creation_mod_date`، `overlay_manipulation`. | `{ "file_size": 184221, "content_type": "application/pdf", "is_tampered": false }` |
| `extra_fields` | كائن | لا | حقول الحساب البنكي (`bank_account_number`، `bank_iban`، `bank_sort_code`، `bank_routing_number`، `bank_swift_bic`، `bank_branch_name`، `bank_branch_address`)، و`document_phone_number`، و`additional_names`، بالإضافة إلى أي مفاتيح مخصصة محفوظة في السجل. | `{ "bank_iban": null, "additional_names": [] }` |
| `name_on_document` | نص | نعم | الاسم كما يظهر في إثبات العنوان. | `"María García López"` |
| `expected_details_address` | نص | نعم | العنوان الذي كتبه العميل أثناء التسجيل حرفياً. | `"Calle Mayor 1, Madrid"` |
| `expected_details_formatted_address` | نص | نعم | العنوان المتوقع المحدَّد جغرافياً. | `"Calle Mayor 1, 28001 Madrid, Spain"` |
| `expected_details_parsed_address` | كائن | نعم | العنوان المتوقع المهيكل. | `{ "city": "Madrid", "postal_code": "28001" }` |
| `name_match_score_expected_details` | عدد عشري (0-100) | نعم | مطابقة تقريبية بين `name_on_document` والاسم المُدخل عند إنشاء الجلسة. | `94.0` |
| `name_match_score_id_verification` | عدد عشري (0-100) | نعم | مطابقة تقريبية بين `name_on_document` و`full_name` للهوية المتحقق منها. | `100.0` |
| `extra_files` | مصفوفة من النصوص (URL) | لا | روابط موقّعة مسبقاً للملفات الإضافية المرفوعة. | `[]` |
| `detected_codes` | مصفوفة من الكائنات | لا | رموز QR والباركود المكتشفة في كل صفحة من صفحات المستند التي عولجت: `type`، و`page_number` (يبدأ من 1)، و`position` (مضلع)، و`x`/`y`/`width`/`height` (الإطار المحيط)، و`page_width`/`page_height`، و`raw_payload` (base64)، و`parsed_payload` (القيمة بعد فك الترميز، وتكون `null` عندما يُعثر على الرمز ولكن يتعذر فك ترميزه). تكون المصفوفة فارغة عندما لا يعثر الاكتشاف على شيء. | `[{ "type": "QR_CODE", "page_number": 1, "parsed_payload": "https://issuer.example/inv/9981" }]` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_poa"` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "status": "Approved",
  "issuing_state": "ESP",
  "document_type": "UTILITY_BILL",
  "document_subtype": "ELECTRICITY_BILL",
  "issuer": "Iberdrola",
  "issue_date": "2026-04-15",
  "expiration_date": null,
  "poa_address": "Calle Mayor 1, 28001 Madrid",
  "poa_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "poa_parsed_address": { "street_1": "Calle Mayor 1", "city": "Madrid", "postal_code": "28001", "country": "ES" },
  "document_file": "https://<media-host>/.../poa.pdf?signature=...",
  "document_language": "es",
  "document_metadata": {
    "file_size": 184221,
    "content_type": "application/pdf",
    "creation_date": "2026-04-15T08:11:32Z",
    "modified_date": "2026-04-15T08:11:32Z",
    "creator": "Iberdrola Billing",
    "producer": "Adobe PDF Library 15.0",
    "software": null,
    "encryption": null,
    "is_signed": true,
    "is_tampered": false,
    "signature_info": { "signer_name": "Iberdrola Clientes", "date": "2026-04-15T08:11:32Z" },
    "exif_original_date": null,
    "exif_digitized_date": null,
    "processed_by_known_editor": false,
    "has_different_creation_mod_date": false,
    "overlay_manipulation": null
  },
  "extra_fields": {
    "bank_account_number": null,
    "bank_iban": null,
    "bank_sort_code": null,
    "bank_routing_number": null,
    "bank_swift_bic": null,
    "bank_branch_name": null,
    "bank_branch_address": null,
    "document_phone_number": null,
    "additional_names": []
  },
  "name_on_document": "María García López",
  "expected_details_address": "Calle Mayor 1, Madrid",
  "expected_details_formatted_address": "Calle Mayor 1, 28001 Madrid, Spain",
  "expected_details_parsed_address": { "city": "Madrid", "postal_code": "28001", "country": "ES" },
  "name_match_score_expected_details": 94.0,
  "name_match_score_id_verification": 100.0,
  "extra_files": [],
  "detected_codes": [
    {
      "type": "QR_CODE",
      "page_number": 1,
      "position": [[820, 1120], [1002, 1120], [1002, 1302], [820, 1302]],
      "x": 820,
      "y": 1120,
      "width": 182,
      "height": 182,
      "page_width": 1190,
      "page_height": 1684,
      "raw_payload": "aHR0cHM6Ly9pYmVyZHJvbGEuZXMvZmFjdHVyYS85OTgx",
      "parsed_payload": "https://iberdrola.es/factura/9981"
    },
    {
      "type": "CODE_128",
      "page_number": 1,
      "position": [[112, 1480], [560, 1480], [560, 1540], [112, 1540]],
      "x": 112,
      "y": 1480,
      "width": 448,
      "height": 60,
      "page_width": 1190,
      "page_height": 1684,
      "raw_payload": "MDA5OTgxMDAwNDI=",
      "parsed_payload": "0099810042"
    }
  ],
  "node_id": "first_poa",
  "warnings": []
}
```

### التحقق من رقم الهاتف

يُعاد لكل محاولة تحقق من رقم الهاتف. يظهر كـ `phone_verifications[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وKYB على حد سواء. المصدر: `phone/serializers/phone.py:251-266` (`PhoneV3Serializer`، ويمتد من `PhoneV2Serializer` في `phone/serializers/phone.py:103-248`).

| الحقل | النوع | يقبل قيمة فارغة | الوصف | المثال |
| - | - | - | - | - |
| `status` | string | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `phone_number_prefix` | string | لا | بادئة الدولة وفق E.164 (مع `+`). | `"+34"` |
| `phone_number` | string | لا | رقم المشترك دون البادئة. | `"612345678"` |
| `full_number` | string | لا | الرقم الكامل وفق E.164 (`phone_number_prefix + phone_number`). | `"+34612345678"` |
| `country_code` | string (ISO 3166-1 alpha-2) | نعم | دولة الرقم. | `"ES"` |
| `country_name` | string | نعم | اسم الدولة المترجَم إلى اللغة المحلية. | `"Spain"` |
| `carrier` | object | لا | `{ name, type }` حيث تكون `type` قيمة من `LineTypeChoices` (`common/config/choices.py:648-667`): `mobile`، و`fixed_line`، و`voip`، و`isp`، و`vpn`، و`toll_free`، و`premium_rate`، و`satellite`، و`pager`، و`payphone`، و`voice_mail`، و`unknown`، وفئات خطوط أخرى. | `{ "name": "Movistar", "type": "mobile" }` |
| `is_disposable` | boolean | لا | تكون `true` عندما يصنّف المشغّل الرقم على أنه مؤقت أو قابل للتخلّص منه. | `false` |
| `is_virtual` | boolean | لا | تكون `true` عندما تكون `carrier.type` إحدى القيم `voip` أو `isp` أو `vpn`. | `false` |
| `verification_method` | string | لا | القناة المستخدمة لتسليم رمز OTP (`whatsapp`، و`sms`، …). تُقرأ من `actual_channel` لآخر محاولة إرسال (وإن لم تتوفر فمن `channel` المطلوب، ثم `sms`). | `"whatsapp"` |
| `verification_attempts` | integer | لا | إجمالي محاولات إرسال رمز OTP (الإرسال الأولي مع إعادات الإرسال). | `1` |
| `verified_at` | string (ISO 8601) | نعم | الطابع الزمني لإدخال رمز OTP بنجاح. | `"2026-05-17T10:14:02Z"` |
| `lifecycle` | مصفوفة من الكائنات | لا | أحداث مرتبة زمنياً: محاولات الإرسال، وإشعارات التسليم، وفحوصات الرموز، وحدث الحالة النهائية. كل حدث هو `{ type, timestamp, details, fee }`. تأتي أنواع الأحداث من `PhoneEventChoices`. | `[…]` |
| `matches` | مصفوفة من الكائنات | لا | تطابقات أرقام الهاتف عبر الجلسات. كل عنصر: `{ session_id, session_number, vendor_data, verification_date, phone_number, status, is_blocklisted, api_service, source }`. تكون قيمة `source` إما `session` أو `list_entry`. | `[]` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_phone"` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |
| `phone_intelligence` | object | نعم | إشارات ذكاء الهاتف. تظهر فقط عندما تُشغَّل إضافة الذكاء على الرقم. | |
| `phone_social` | object | نعم | البصمة الاجتماعية للرقم. تظهر فقط عندما تُشغَّل إضافة البصمة الاجتماعية. | |

```json theme={null}
{
  "status": "Approved",
  "phone_number_prefix": "+34",
  "phone_number": "612345678",
  "full_number": "+34612345678",
  "country_code": "ES",
  "country_name": "Spain",
  "carrier": { "name": "Movistar", "type": "mobile" },
  "is_disposable": false,
  "is_virtual": false,
  "verification_method": "whatsapp",
  "verification_attempts": 1,
  "verified_at": "2026-05-17T10:14:02Z",
  "lifecycle": [
    {
      "type": "PHONE_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2026-05-17T10:13:51Z",
      "details": { "status": "Success", "reason": null, "channel": "whatsapp", "actual_channel": "whatsapp" },
      "fee": 0.02
    },
    {
      "type": "PHONE_DELIVERY_DELIVERED",
      "timestamp": "2026-05-17T10:13:52Z",
      "details": { "channel": "whatsapp", "status": "delivered" },
      "fee": 0
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2026-05-17T10:14:02Z",
      "details": { "code_tried": "482917", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "PHONE_VERIFICATION_APPROVED",
      "timestamp": "2026-05-17T10:14:02Z",
      "details": null,
      "fee": 0
    }
  ],
  "matches": [],
  "node_id": "first_phone",
  "warnings": []
}
```

### التحقق من البريد الإلكتروني

يُعاد لكل محاولة تحقق من البريد الإلكتروني. يظهر كـ `email_verifications[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وKYB على حد سواء. المصدر: `email_verification/serializers/email.py:149-164` (`EmailV3Serializer`، ويمتد من `EmailV2Serializer` في `email_verification/serializers/email.py:38-146`).

| الحقل | النوع | يقبل قيمة فارغة | الوصف | المثال |
| - | - | - | - | - |
| `status` | string | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `email` | string | لا | عنوان البريد الإلكتروني المُقدَّم. | `"maria.garcia@example.com"` |
| `is_breached` | boolean | لا | تكون `true` عندما يظهر البريد الإلكتروني في تسريب بيانات معروف. | `false` |
| `breaches` | مصفوفة من الكائنات | لا | تفاصيل كل تسريب عندما تكون `is_breached` قيمتها `true`: `{ name, domain, logo_path, breach_date, description, is_verified, data_classes, breach_emails_count }`. | `[]` |
| `is_disposable` | boolean | لا | تكون `true` عندما ينتمي البريد الإلكتروني إلى مزوّد بريد مؤقت. | `false` |
| `is_undeliverable` | boolean | لا | تكون `true` عندما يُظهر فحص التسليم عبر SMTP أن صندوق الوارد لا يقبل الرسائل. | `false` |
| `verification_attempts` | integer | لا | إجمالي محاولات فحص رمز OTP. | `1` |
| `verified_at` | string (ISO 8601) | نعم | الطابع الزمني لإدخال رمز OTP بنجاح. | `"2026-05-17T10:15:22Z"` |
| `lifecycle` | مصفوفة من الكائنات | لا | أحداث مرتبة زمنياً: محاولات الإرسال، وفحوصات الرموز، وحدث الحالة النهائية. كل حدث هو `{ type, timestamp, details, fee }`. تأتي أنواع الأحداث من `EmailEventChoices`. | `[…]` |
| `matches` | مصفوفة من الكائنات | لا | تطابقات البريد الإلكتروني عبر الجلسات. كل عنصر: `{ session_id, session_number, vendor_data, verification_date, email, status, is_blocklisted, api_service, source }`. تكون قيمة `source` إما `session` أو `list_entry`. | `[]` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_email"` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |
| `email_intelligence` | object | نعم | إشارات ذكاء البريد الإلكتروني. تظهر فقط عندما تُشغَّل إضافة الذكاء على العنوان. | |
| `email_social` | object | نعم | البصمة الاجتماعية للعنوان. تظهر فقط عندما تُشغَّل إضافة البصمة الاجتماعية. | |

```json theme={null}
{
  "status": "Approved",
  "email": "maria.garcia@example.com",
  "is_breached": false,
  "breaches": [],
  "is_disposable": false,
  "is_undeliverable": false,
  "verification_attempts": 1,
  "verified_at": "2026-05-17T10:15:22Z",
  "lifecycle": [
    {
      "type": "EMAIL_VERIFICATION_MESSAGE_SENT",
      "timestamp": "2026-05-17T10:15:11Z",
      "details": { "status": "Success", "reason": null },
      "fee": 0.02
    },
    {
      "type": "VALID_CODE_ENTERED",
      "timestamp": "2026-05-17T10:15:22Z",
      "details": { "code_tried": "739204", "status": "Approved" },
      "fee": 0
    },
    {
      "type": "EMAIL_VERIFICATION_APPROVED",
      "timestamp": "2026-05-17T10:15:22Z",
      "details": null,
      "fee": 0
    }
  ],
  "matches": [],
  "node_id": "first_email",
  "warnings": []
}
```

### التحقق من قواعد البيانات

يُعاد لكل عملية بحث في قاعدة البيانات تُجرى على البيانات التي قدّمها المستخدم. يظهر كـ `database_validations[]` في `GET /v3/session/{sessionId}/decision/`. المصدر: `database_validation/serializers/database_validation.py:21-142` (`DatabaseValidationV3Serializer`، ويمتد من `DatabaseValidationV2Serializer`).

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `issuing_state` | string (ISO 3166-1 alpha-3) | نعم | الدولة التي تم الاستعلام عن سجلها. | `"ESP"` |
| `validation_type` | string (enum) | لا | كيفية تأكيد النتيجة: `one_by_one` (نتيجة خدمة واحدة)، أو `two_by_two` (خدمتان مختلفتان أو أكثر طابقتا رقم الهوية مطابقة كاملة وبشكل مستقل)، أو `not_enabled` (تم تخطي المدقّق أو لم يستجب أي مزوّد. ولا تزال `no_match` النهائية تُعيد `one_by_one`). لا تكون أبداً `null`. المصدر: `DatabaseValidationChoices` (`common/config/choices.py:1097-1100`). | `"one_by_one"` |
| `screened_data` | object | لا | البيانات المُرسلة إلى السجل. تُنشأ لحقول الملفات (`selfie`، `cnh_qr_code_image`، `document_image`) روابط موقّعة مسبقاً عند القراءة. | `{ "document_number": "99999999R", "date_of_birth": "1990-05-12" }` |
| `validations` | array of objects | لا | إدخال واحد لكل خدمة في الكتالوج أنتجت تطابقاً. يمكن أن يتضمن كل إدخال `service_id` و`service_name` و`validation` (كائن حكم المزوّد) و`outcome_code` و`outcome_detail` و`source_data` (الملف الشخصي للمواطن بعد التنظيف: `full_name` و`gender` و`date_of_birth` و`photo` (رابط موقّع مسبقاً) و`signature` (رابط موقّع مسبقاً)، …). | `[…]` |
| `errors` | array of objects | نعم | أخطاء لكل خدمة عند فشل استعلام، ويُحذف المفتاح بالكامل عندما يكون فارغاً. كل إدخال هو كائن الخطأ الخاص بالخدمة المصدر، مضافاً إليه `service_id` الخاص بالخدمة التي أبلغت عن الخطأ. | `[]` |
| `match_type` | string (enum) | نعم | حكم التطابق الإجمالي عبر الخدمات المستعلَم عنها: `full_match` أو `partial_match` أو `no_match` (`DatabaseValidationMatchTypeChoices`، `common/config/choices.py:1103-1106`). تكون `null` حتى يتم التقييم. | `"full_match"` |
| `status` | string | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_db_validation"` |
| `warnings` | array | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "issuing_state": "ESP",
  "validation_type": "one_by_one",
  "screened_data": {
    "document_number": "99999999R",
    "date_of_birth": "1990-05-12",
    "first_name": "María",
    "last_name": "García López"
  },
  "validations": [
    {
      "service_id": "esp_dni",
      "service_name": "Spain - DNI/NIE verification",
      "validation": { "is_valid": true, "match_score": 100 },
      "outcome_code": "MATCH",
      "outcome_detail": "All identifiers match the registry record.",
      "source_data": {
        "full_name": "María García López",
        "gender": "F",
        "date_of_birth": "1990-05-12",
        "photo": "https://<media-host>/.../registry_photo.jpg?signature=...",
        "signature": null
      }
    }
  ],
  "match_type": "full_match",
  "status": "Approved",
  "node_id": "first_db_validation",
  "warnings": []
}
```

### استجابة الاستبيان

تُعاد لكل إرسال استبيان. تظهر كـ `questionnaire_responses[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وKYB على حد سواء. المصدر: `questionnaires/serializers/questionnaire.py:591-597` (`QuestionnaireResponseV3Serializer`، ويمتد من `QuestionnaireResponseSerializer` في `questionnaires/serializers/questionnaire.py:520-588`).

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `questionnaire_id` | string (UUID) | لا | معرّف إصدار الاستبيان الذي تمت الإجابة عنه. | `"6a0f1c2c-…"` |
| `title` | string | لا | اسم الاستبيان، كما هو مضبوط في Console. | `"Customer risk profile"` |
| `description` | string | نعم | وصف الاستبيان. | `"Short risk-profile questions."` |
| `languages` | array of strings | لا | رموز اللغات التي نُشر بها الاستبيان. | `["en", "es"]` |
| `default_language` | string | لا | رمز اللغة الاحتياطية. | `"en"` |
| `is_active` | boolean | لا | ما إذا كان إصدار الاستبيان هذا هو الإصدار النشط. | `true` |
| `is_simple_questionnaire` | boolean | لا | `true` عندما لا يحتوي الاستبيان على تفرّع (قائمة مسطحة). | `true` |
| `questionnaire_group_id` | string (UUID) | لا | معرّف مشترك بين إصدارات الاستبيان نفسه. | `"a7c2c2c2-…"` |
| `version` | integer | لا | رقم إصدار القالب النشط. | `3` |
| `status` | string | لا | واحدة من `Approved` أو `In Review` أو `Not Finished` (تُحوَّل حالة الرفض على مستوى الاستبيان إلى `In Review`). | `"Approved"` |
| `published_at` | string (ISO 8601) | نعم | وقت نشر القالب. | `"2026-01-12T11:00:00Z"` |
| `sections` | array of objects | لا | الأقسام مرتبةً بعد تطبيق اجتياز المخطط وتصفية الظهور. كل قسم هو `{ title, description, items[] }` (يأتي العنوان والوصف من `SECTION_HEADER` الافتتاحي، وهما مترجمان مسبقاً). كل عنصر هو عنصر نموذج (`uuid` و`value` (معرّف العقدة) و`element_type` و`is_required` و`title` و`description` و`placeholder` و`choices` و`max_files` و`required_if` و`repeatable_config`)، بالإضافة إلى حقل `answer`، وهو `null` عند عدم الإجابة، ويُحذف في عناصر التخطيط `HEADING` و`PARAGRAPH` و`SEPARATOR`. تحتوي إجابات الملفات على `{ files: [<presigned URL>, …] }`. | `[…]` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_questionnaire"` |

```json theme={null}
{
  "questionnaire_id": "6a0f1c2c-3b7d-4d2c-9eb6-fdc6c7c92ef9",
  "title": "Customer risk profile",
  "description": "Short risk-profile questions.",
  "languages": ["en", "es"],
  "default_language": "en",
  "is_active": true,
  "is_simple_questionnaire": true,
  "questionnaire_group_id": "a7c2c2c2-1111-4d2c-9eb6-fdc6c7c92ef9",
  "version": 3,
  "status": "Approved",
  "published_at": "2026-01-12T11:00:00Z",
  "sections": [
    {
      "title": "Source of funds",
      "description": null,
      "items": [
        {
          "uuid": "4f1d5e2c-aaaa-4d2c-9eb6-fdc6c7c92ef9",
          "value": "q_source_of_funds",
          "element_type": "SINGLE_CHOICE",
          "is_required": true,
          "title": "What is your main source of funds?",
          "description": null,
          "placeholder": null,
          "choices": [
            { "label": "Salary", "value": "salary" },
            { "label": "Business income", "value": "business" },
            { "label": "Investments", "value": "investments" }
          ],
          "max_files": 1,
          "required_if": null,
          "repeatable_config": null,
          "answer": { "value": "salary" }
        }
      ]
    }
  ],
  "node_id": "first_questionnaire"
}
```

### التوقيع الإلكتروني

تُعاد لكل موقّع في خطوة [التوقيع الإلكتروني](https://docs.didit.me/ar/core-technology/electronic-signature/overview.md). تظهر كـ `signatures[]` في `GET /v3/session/{sessionId}/decision/` لجلسات KYC وKYB على حد سواء، وذلك فقط عندما يتضمن سير العمل هذه الخطوة. على عكس كائنات التقارير الأخرى، فإن `status` فيها هو مرحلة التوقيع، ونتيجته موجودة في `verdict`، وعناصر `warnings[]` فيها هي `{ code, node_id }` وليست [كائنات التحذير](#كائن-التحذير).

| الحقل | النوع | يقبل null | الوصف | مثال |
| - | - | - | - | - |
| `id` | string (UUID) | لا | معرّف توقيع الموقّع. استخدمه كـ `signature_id` في مسارات الأدلة والتحقق. | `"0e6c2a8e-…"` |
| `node_id` | string | لا | معرّف عقدة سير العمل. | `"feature_signature"` |
| `status` | string | لا | مرحلة التوقيع: `intro` أو `review` أو `code` أو `signing` أو `signed` أو `declined`. الحالة `signed` وحدها تعني أن المستندات موقّعة. | `"signed"` |
| `verdict` | string | لا | `Not Finished` أو `Approved` أو `In Review` أو `Declined`. | `"Approved"` |
| `level` | string | لا | `simple` (الافتراضي) أو `aes`. `qes` إضافة غير متاحة بعد. | `"aes"` |
| `format` | string | لا | `pdf` للتوقيع البسيط، و`pades` للتوقيع المتقدم (AES). | `"pades"` |
| `profile` | string | نعم | `PAdES-B-LT` بعد إتمام توقيع متقدم (AES)، وإلا فهو null. | `"PAdES-B-LT"` |
| `signer` | object | لا | `{ name, capacity, company, role, roles, identity_session_id }`. تكون `capacity` القيمة `self` (KYC) أو `company` (KYB). | `{ "name": "Jane Doe", "capacity": "self", … }` |
| `identity_used` | object | لا | `{ session_id, kyc_id, verified, expected_name }`: الهوية الموثّقة التي يعتمد عليها التوقيع. تكون فارغة للتوقيع البسيط الذي لا توجد فيه هوية موثّقة. | `{ "verified": true, … }` |
| `certificate` | object | نعم | `{ issuer, issued_to, serial, valid_from, valid_until }`. تكون `null` حتى يتم التوقيع، وتكون `null` دائماً للتوقيع البسيط. | `{ "serial": "5A3F9C21", … }` |
| `confirmation` | object | لا | `{ channel, destination, confirmed_at, attempts }`. يكون `destination` مُقنَّعًا، ويحسب `attempts` الرموز التي أُدخلت، بما فيها الرمز الصحيح. لا يتضمن التوقيع البسيط رمزًا، لذلك تكون قيمتا `channel` و`destination` هما `null`. | `{ "channel": "email", … }` |
| `timestamp` | object | نعم | `{ time, qualified, valid }`. تكون قيمة `qualified` دائمًا `false` بالنسبة إلى AES. تكون القيمة `null` إلى أن يُوقَّع المستند، وتكون دائمًا `null` في حالة التوقيع البسيط. | `{ "qualified": false, … }` |
| `documents` | array of objects | لا | `{ id, uuid, title, file_name, pages, size_bytes, sha256_original, sha256_signed, status, opened_at, read_at, read_to_end, consented_at, consent, signed_file, mode, source_format, conversion, fields }`. تكون قيمة `status` إما `signed` أو `declined` أو `not_signed` أو `not_reached`. تكون قيمة `mode` إما `fields` أو `read_and_agree`. تكون قيمة `source_format` إما `pdf` أو `docx`، ويصف `conversion` ملف Word الأصلي، أو يكون `null` في حالة ملف PDF. | `[…]` |
| `documents[].fields` | array of objects | لا | `{ key, type, role, label, page, x, y, width, height, required, value, display_value, value_source, filled_at, image_url, value_unavailable_reason }` لكل حقل في المستند. تكون قيمة `value` نصًا، أو قيمة منطقية لمربع الاختيار، أو `true` للتوقيع أو الأحرف الأولى المطبّقة. تكون فارغة في المستند الذي لا يحتوي على حقول. | `[…]` |
| `adopted_signature` | object | نعم | `{ method, font, adopted_at }`: التوقيع والأحرف الأولى التي اعتمدها الموقِّع. تكون قيمة `method` إما `typed` أو `drawn`، ويمثل `font` نمط الكتابة اليدوية للتوقيع المكتوب. تكون القيمة `null` إلى أن يُعتمَد التوقيع. | `{ "method": "drawn", … }` |
| `electronic_signature_consent_at` | string (ISO 8601) | نعم | الوقت الذي وافق فيه الموقِّع على توقيع المستندات إلكترونيًا. يُضبط عندما يحتوي أي مستند على حقول. | `"2026-11-03T10:41:40Z"` |
| `evidence_file` | string | نعم | مسار ملف PDF الخاص بالأدلة، بعد التوقيع. | `"/v3/session/…/evidence/?signature_id=…"` |
| `warnings` | array of objects | لا | `{ code, node_id }`، وتكون قيمة `code` واحدة من: `SIGNATURE_DECLINED`، و`SIGNATURE_OTP_FAILED`، و`SIGNATURE_NAME_MISMATCH`، و`SIGNATURE_IDENTITY_NOT_VERIFIED`، و`SIGNATURE_DOCUMENT_CHANGED`. | `[]` |
| `validation` | object | نعم | `{ valid, checked_at, documents[] }`: آخر فحص تشفيري للمستندات الموقّعة. تكون القيمة `null` إلى أن يُوقَّع المستند. تكون `{ valid: null, reason: "signature_provider_outcome_unknown", checked_at }` عندما يتعذر تأكيد نتيجة التوقيع. | `{ "valid": true, … }` |
| `declined_at` | string (ISO 8601) | نعم | الوقت الذي رفض فيه الموقِّع التوقيع. | `null` |
| `declined_action` | string | لا | القيمة `signature_declined_action` الخاصة بالخطوة. | `"REVIEW"` |
| `signed_at` | string (ISO 8601) | نعم | الوقت الذي وُقّعت فيه المستندات. | `"2026-11-03T10:42:24Z"` |
| `expires_at` | string (ISO 8601) | لا | الوقت الذي يتوقف فيه رابط التوقيع عن العمل. | `"2026-11-10T10:30:00Z"` |
| `email_sent_at` | string (ISO 8601) | نعم | الوقت الذي أُرسلت فيه نسخة موقّعة إلى بريد الموقِّع الإلكتروني. | `"2026-11-03T10:42:30Z"` |
| `email_unavailable_reason` | string | نعم | سبب عدم إرسال نسخة بالبريد الإلكتروني، عند طلبها. | `null` |
| `ip_address` | string | نعم | عنوان IP الخاص بالموقِّع عندما طلب رمز التحقق الخاص به. | `"203.0.113.10"` |
| `place` | string | نعم | لا يتم جمعه: تكون القيمة دائمًا `null`. | `null` |
| `place_unavailable_reason` | string | نعم | `not_collected`. | `"not_collected"` |

يتضمن [تقرير التوقيع الإلكتروني](https://docs.didit.me/ar/core-technology/electronic-signature/report-electronic-signature.md) مثالًا كاملًا وكل الحقول المتداخلة.

### تقدير العمر

تُرجَع من واجهة برمجة التطبيقات المستقلة لتقدير العمر (`POST /v3/age-estimation/`). تتضمن الاستجابة جزءًا من بنية [`Liveness check`](#فحص-الحيوية) ضمن الغلاف `age_estimation`، وهو يشمل `status` و`method` و`score` و`age_estimation` و`warnings`، إضافةً إلى كتلة `user_image` الخاصة باكتشاف الوجه والمتاحة في الواجهة المستقلة فقط. ولا تتضمن **أيًا** من `reference_image` أو `video_url` أو `matches` أو `face_quality` أو `face_luminance`. أما في جلسات سير العمل فلا توجد مصفوفة منفصلة، إذ يظهر العمر المقدَّر على أنه `liveness_checks[].age_estimation` في `GET /v3/session/{sessionId}/decision/`. المصدر: `apis/serializers/age_estimation.py:50-55` (`AgeEstimationResponseSerializer`)، ويُجمَّع الغلاف في `apis/views/age_estimation.py:138-174`.

| الحقل | النوع | قابل للقيمة الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `request_id` | string (UUID) | لا | معرّف الجلسة المحفوظ عندما تكون `save_api_request=true` (وهي القيمة الافتراضية)، وإلا فهو UUID مؤقت للربط. | `"3b1f1e2c-…"` |
| `age_estimation` | object | لا | غلاف النتيجة: `status` (`Approved` / `Declined`)، و`method` (دائمًا `PASSIVE`)، و`score` (الحيوية من 0 إلى 100، وقد تكون null)، و`age_estimation` (العمر المتوقع بالسنوات للوجه الأكبر، وقد يكون null)، و`user_image` (`entities[]` مع `age` و`bbox` بالصيغة `[x_min, y_min, x_max, y_max]` و`confidence` و`gender` لكل وجه، إضافةً إلى `best_angle`)، و`warnings[]`. | `{ … }` |
| `vendor_data` | string | نعم | قيمة `vendor_data` المُعادة كما وردت في الطلب. | `null` |
| `metadata` | object | نعم | قيمة `metadata` المُعادة كما وردت في الطلب. | `null` |
| `created_at` | string (ISO 8601) | لا | الطابع الزمني للطلب من جهة الخادم. | `"2026-05-17T10:22:13.512941+00:00"` |

```json theme={null}
{
  "request_id": "3b1f1e2c-7777-4d2c-9eb6-fdc6c7c92ef9",
  "age_estimation": {
    "status": "Approved",
    "method": "PASSIVE",
    "score": 94.10,
    "age_estimation": 28.7,
    "user_image": {
      "entities": [
        { "age": 28.7, "bbox": [40, 40, 100, 100], "confidence": 0.72, "gender": "male" }
      ],
      "best_angle": 0
    },
    "warnings": []
  },
  "vendor_data": null,
  "metadata": null,
  "created_at": "2026-05-17T10:22:13.512941+00:00"
}
```

### المصادقة البيومترية

تعمل المصادقة البيومترية بمسار كشف الحيوية + مطابقة الوجه نفسه المستخدم في KYC القياسي، لكنها مُعدّة لمقارنة الوجه الملتقط بصورة المرجع الموجودة للمستخدم، بدلًا من صورة الوجه من المستند التي تُستخرج حديثًا بتقنية OCR. لا يوجد مُسلسِل مخصص لها، إذ يُرجع `GET /v3/session/{sessionId}/decision/` كائنات [Liveness check](#فحص-الحيوية) و[Face match](#مطابقة-الوجه) القياسية ضمن `liveness_checks[]` و`face_matches[]`. ويُضبط سير عمل الجلسة بالقيمة `workflow_type = "biometric_authentication"` (`WorkflowTypeChoices`، `common/config/choices.py:636`).

| الحقل | النوع | قابل للقيمة الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `liveness_checks` | array of [Liveness check](#فحص-الحيوية) | لا | نتيجة الحيوية لمحاولة المصادقة. | `[ { "status": "Approved", … } ]` |
| `face_matches` | array of [Face match](#مطابقة-الوجه) | لا | نتيجة المطابقة مقابل المرجع المسجَّل. تُضبط `source_image_session_id` على `session_id` الخاص بالجلسة نفسها: يُسجَّل وجه المرجع (وهو `portrait_image` المُرسلة، أو الوجه المخزَّن الذي يُعاد استخدامه عبر `vendor_data` عند عدم توفير `portrait_image`) ضمن جلسة المصادقة نفسها (`face/views/face.py:656-659`). | `[ { "status": "Approved", "source_image_session_id": "…", … } ]` |
| `status` | string | لا | الحالة العامة للجلسة على المستوى الأعلى (راجع [تعداد الحالات](#مرجع-قيم-الحالة)). | `"Approved"` |

```json theme={null}
{
  "session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
  "status": "Approved",
  "liveness_checks": [
    {
      "status": "Approved",
      "method": "PASSIVE",
      "score": 95.10,
      "reference_image": "https://<media-host>/.../reference.jpg?signature=...",
      "video_url": null,
      "age_estimation": null,
      "matches": [],
      "face_quality": 91.20,
      "face_luminance": 53.10,
      "node_id": "biometric_auth_liveness",
      "warnings": []
    }
  ],
  "face_matches": [
    {
      "status": "Approved",
      "score": 98.42,
      "source_image_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
      "source_image": "https://<media-host>/.../source.jpg?signature=...",
      "target_image": "https://<media-host>/.../target.jpg?signature=...",
      "node_id": "biometric_auth_face_match",
      "warnings": []
    }
  ]
}
```

### سجل KYB

يُرجَع لكل شركة مؤكَّدة من السجل في سير عمل KYB. يظهر كعنصر `registry_checks[]` في `GET /v3/session/{sessionId}/decision/` لجلسات الشركات. المصدر: `kyb/serializers/kyb.py:939-964` (`RegistryCheckV3Serializer`).

| الحقل | النوع | قابل للقيم الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `status` | string | لا | راجع [تعداد الحالات](#مرجع-قيم-الحالة). | `"Approved"` |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل (الإصدار V3). | `"first_registry"` |
| `data_resolved` | boolean | لا | `true` عندما يكتمل جلب بيانات السجل (أو عندما تكون قيمة `is_from_registry` هي `false`، أي أن البيانات أُدخلت يدوياً). | `true` |
| `company` | object | لا | الحمولة الكاملة للشركة، راجع [كائن الشركة](#كائن-الشركة) أدناه. | `{ … }` |
| `ownership_structure` | object | نعم | جدول الملكية الذي أثبته السجل: `shareholders[]` و`beneficial_owners[]`، ولكل مالك هويته في السجل ونسبة حصته و`shareholding` القياسية. | `{ "shareholders": [...], "beneficial_owners": [] }` |
| `warnings` | array | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

#### كائن الشركة

من `kyb/serializers/kyb.py:220-321` (`KYBCompanyResponseSerializer`).

| الحقل | النوع | قابل للقيم الفارغة | الوصف |
| - | - | - | - |
| `uuid` | string (UUID) | لا | معرّف الشركة الداخلي. |
| `node_id` | string \| null | نعم | معرّف عقدة سير العمل. |
| `status` | string | لا | حالة الميزة (`FeatureStatusChoices`). |
| `registry_status` | string | نعم | حالة الشركة في السجل (`active`، `dissolved`، …). |
| `data_resolved` | boolean | لا | التعريف نفسه المستخدم في الكائن الأب. |
| `company_name` | string | نعم | الاسم المسجّل للشركة. |
| `registration_number` | string | نعم | معرّف السجل. |
| `country_code` | string (ISO 3166-1 alpha-2) | نعم | الدولة التي تأسست فيها الشركة. |
| `region` | string | نعم | التقسيم الإداري وفق ISO 3166-2 عند الانطباق (مثلاً `US-CA`). |
| `company_type` | string | نعم | الشكل القانوني (`LLC`، `SL`، …). |
| `incorporation_date` | string (YYYY-MM-DD) | نعم | تاريخ التأسيس. |
| `registered_address` | string | نعم | العنوان القانوني المسجّل. |
| `tax_number` | string | نعم | الرقم الضريبي أو رقم ضريبة القيمة المضافة. |
| `risk_level` | string | نعم | تصنيف المخاطر الذي يوفره المزوّد. |
| `verification_status` | string | نعم | قيمة تعداد حالة التحقق الداخلية. |
| `is_from_registry` | boolean | لا | `true` عندما تأتي البيانات من السجل، في مقابل الإدخال اليدوي. |
| `fetch_status` | string | نعم | `pending`، `resolved`، `failed`. |
| `alternative_names` | string | نعم | أسماء تجارية بديلة مفصولة بفواصل. |
| `nature_of_business` | string | نعم | وصف نصي حر لنشاط الشركة. |
| `registered_capital` | string | نعم | رأس المال المسجّل كنص مقروء. |
| `registered_capital_amount` | string (decimal) | نعم | قيمة رأس المال المسجّل بعد تحليلها. |
| `registered_capital_currency` | string (ISO 4217) | نعم | رمز العملة. |
| `website` | string (URL) | نعم | الموقع الإلكتروني للشركة. |
| `email` | string | نعم | البريد الإلكتروني العام للتواصل. |
| `phone` | string | نعم | رقم الهاتف العام للتواصل. |
| `legal_entity_identifier` | string | نعم | معرّف الكيان القانوني (LEI) عند توفره. |
| `location_of_registration` | string | نعم | مكتب السجل أو المنطقة. |
| `vat_number` | string | نعم | رقم ضريبة القيمة المضافة المقدَّم للشركة. |
| `vat_validation_status` | string | لا | نتيجة التحقق من رقم ضريبة القيمة المضافة، أو من `tax_number` عند عدم وجوده: `valid`، `invalid`، `format_valid`، `invalid_format`، `could_not_validate`، أو `not_applicable`. راجع [التحقق من ضريبة القيمة المضافة والمعرّف الضريبي](https://docs.didit.me/ar/business-verification/company-data.md#التحقق-من-ضريبة-القيمة-المضافة-والرقم-الضريبي). |
| `vat_validated_number` | string | نعم | الرقم الذي جرى التحقق منه كما هو معروف للمصدر. |
| `vat_validation_source` | string | نعم | الجهة التي حدّدت الحالة: `eu_vies`، `pl_vat_white_list`، `no_brreg`، `ch_uid_register`، `br_receita_federal`، `co_rues`، `cr_hacienda`، `ec_sri`، `py_dnit`، أو `format_rules`. |
| `vat_validated_name` | string | نعم | الاسم المسجّل لدى المصدر (فارغ عندما لا يكشف عنه). |
| `vat_validated_address` | string | نعم | العنوان المسجّل لدى المصدر (فارغ عندما لا يُكشف). |
| `vat_checked_at` | string (ISO 8601) | نعم | الطابع الزمني للفحص؛ `null` عندما لا يُجرى أي فحص. |
| `financial_summary` | object | نعم | لقطة لأبرز المؤشرات المالية الأخيرة عند توفيرها من السجل. |
| `officers` | array of objects | لا | قائمة المسؤولين الآمنة لنموذج B2C: `{ uuid, name, designation, role, nationality, is_active, kyc_status, kyc_session_url }`. |
| `beneficial_owners` | array of objects | لا | قائمة المستفيدين الحقيقيين (UBO) الآمنة لنموذج B2C: `{ uuid, name, first_name, last_name, entity_type, roles, ownership_min_shares, ownership_max_shares, is_active, kyc_status, kyc_session_url, effective_ownership_percent }`. |
| `addresses` | array of objects | نعم | تفاصيل كل عنوان من السجل. |
| `industries` | array of objects | نعم | تصنيفات بنمط SIC/NAICS. |
| `accounts` | array of objects | نعم | بيانات وصفية عن الحسابات المودَعة. |
| `registry_data` | object | نعم | التفاصيل المُطبَّعة للسجل من Didit (نتيجة الملكية، والتصحيحات المُدخلة في وحدة التحكم، وحقائق السجل التي لا يوجد لها حقل خاص). ليس عقداً ثابتاً. |
| `user_provided_data` | object | نعم | لقطة للحقول التي عدّلها المستخدم. |
| `confirmed_by_user_at` | string (ISO 8601) | نعم | الطابع الزمني لتأكيد المستخدم للبيانات المستخرجة. |
| `last_console_edit_at` | string (ISO 8601) | نعم | الطابع الزمني لآخر تعديل في وحدة التحكم. |
| `is_editable` | boolean | لا | `true` طالما يستطيع المستخدم النهائي تعديل البيانات المأخوذة من السجل. |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_registry",
  "data_resolved": true,
  "company": {
    "uuid": "b1f1e2c2-9999-4d2c-9eb6-fdc6c7c92ef9",
    "node_id": "first_registry",
    "status": "Approved",
    "registry_status": "active",
    "data_resolved": true,
    "company_name": "Sante Clinics SL",
    "registration_number": "B12345678",
    "country_code": "ES",
    "region": null,
    "company_type": "SL",
    "incorporation_date": "2018-03-22",
    "registered_address": "Calle Mayor 1, 28001 Madrid, Spain",
    "tax_number": "B12345678",
    "risk_level": "low",
    "verification_status": "verified",
    "is_from_registry": true,
    "fetch_status": "resolved",
    "alternative_names": "Sante Clinics",
    "nature_of_business": "Medical clinic operations",
    "registered_capital": "EUR 50,000",
    "registered_capital_amount": "50000.00",
    "registered_capital_currency": "EUR",
    "website": "https://santeclinics.com",
    "email": "info@santeclinics.com",
    "phone": "+34911223344",
    "legal_entity_identifier": null,
    "location_of_registration": "Registro Mercantil de Madrid",
    "vat_number": "ESB12345678",
    "vat_validation_status": "valid",
    "vat_validated_name": "SANTE CLINICS SL",
    "vat_validated_address": "CALLE MAYOR 1, 28001 MADRID",
    "vat_checked_at": "2026-05-17T10:11:05Z",
    "financial_summary": null,
    "officers": [
      {
        "uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "designation": "Administrador único",
        "role": "Director",
        "nationality": "ESP",
        "is_active": true,
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…"
      }
    ],
    "beneficial_owners": [
      {
        "uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "first_name": "María",
        "last_name": "García López",
        "entity_type": "person",
        "roles": ["UBO"],
        "ownership_min_shares": "75.00",
        "ownership_max_shares": "75.00",
        "is_active": true,
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "effective_ownership_percent": 75.0
      }
    ],
    "addresses": [],
    "industries": [],
    "accounts": [],
    "registry_data": {},
    "user_provided_data": {},
    "confirmed_by_user_at": "2026-05-17T10:11:02Z",
    "last_console_edit_at": null,
    "is_editable": false
  },
  "ownership_structure": null,
  "warnings": []
}
```

### مستند KYB

يُرجَع لكل عقدة تجمع مستندات دعم KYB. يظهر كعنصر `document_verifications[]` في `GET /v3/session/{sessionId}/decision/` لجلسات الشركات، بعنصر واحد لكل `node_id`، ويسرد `items[]` كل مستند مرفوع. المصدر: `kyb/serializers/kyb.py:1053-1068` (`DocumentVerificationV3Serializer`)، وكل عنصر يتبع `kyb/serializers/kyb.py:811-851` (`KYBDocumentResponseSerializer`).

| الحقل | النوع | قابل للقيم الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `status` | سلسلة نصية | لا | الحالة الإجمالية لمستندات هذه العقدة: لا تكون `Approved` إلا عندما تكون كل مستندات خط المعالجة مقبولة؛ وتكون `Declined` إذا كان أي مستند مرفوضاً؛ وتكون `In Review` في غير ذلك؛ وتكون `Not Finished` طالما كانت المستندات معلّقة. راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `node_id` | سلسلة نصية \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_kyb_documents"` |
| `items` | مصفوفة من [كائنات عناصر مستندات KYB](#كائن-عنصر-مستند-kyb) | لا | إدخال واحد لكل مستند مرفوع أو مطلوب. | `[…]` |
| `groups` | كائن | لا | أعداد لكل مجموعة مستندات: `{ <group_name>: { total, approved, pending, declined, in_review, other, missing } }`. | `{ "incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 } }` |
| `required_groups` | مصفوفة من السلاسل النصية | لا | مجموعات المستندات التي يتطلبها إعداد سير العمل. | `["incorporation_certificate", "shareholder_register"]` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

#### كائن عنصر مستند KYB

| الحقل | النوع | قابل للقيمة الفارغة | الوصف |
| - | - | - | - |
| `uuid` | سلسلة نصية (UUID) | لا | معرّف داخلي للمستند. |
| `document_type` | سلسلة نصية | نعم | مجموعة عامة (`incorporation_certificate`، `shareholder_register`، …). |
| `document_subtype` | سلسلة نصية | نعم | نوع فرعي خاص بالمزوّد. |
| `document_group` | سلسلة نصية | نعم | نسخة مطابقة لـ `document_type` (اسم بديل يُحتفظ به للوضوح). |
| `file_url` | سلسلة نصية (URL) | نعم | عنوان URL موقّع مسبقاً للملف المنقّح. |
| `original_filename` | سلسلة نصية | نعم | اسم الملف كما رُفع. |
| `file_size` | عدد صحيح | نعم | حجم الملف بالبايت. |
| `status` | سلسلة نصية | لا | حالة كل مستند (`FeatureStatusChoices`). |
| `created_at` | سلسلة نصية (ISO 8601) | لا | الطابع الزمني للرفع. |
| `cross_check_result` | كائن | نعم | نتيجة التحقق المتقاطع مقارنةً بالسجل أو بالمستندات الأخرى. |
| `document_metadata` | كائن | نعم | البنية نفسها المفلترة للبيانات الوصفية كما في `document_metadata` الخاصة بإثبات العنوان. |
| `description` | سلسلة نصية | نعم | وصف يقدمه المراجِع أو النظام. |
| `is_requested` | قيمة منطقية | لا | `true` عندما يتوقع سير العمل هذا المستند. |
| `ocr_data` | كائن | نعم | الحقول المستخرجة بتقنية OCR عند توفرها. |
| `is_console_upload` | قيمة منطقية | لا | `true` عندما يكون المستند قد رفعه مراجِع من وحدة التحكم (ويُستثنى من الحكم الإجمالي). |
| `is_confirmed` | قيمة منطقية | لا | `true` عندما يكون المراجِع قد أكّد المستند صراحةً. |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_kyb_documents",
  "items": [
    {
      "uuid": "e1f1e2c2-cccc-4d2c-9eb6-fdc6c7c92ef9",
      "document_type": "incorporation_certificate",
      "document_subtype": "registro_mercantil_extract",
      "document_group": "incorporation_certificate",
      "file_url": "https://<media-host>/.../incorporation.pdf?signature=...",
      "original_filename": "incorporation_certificate.pdf",
      "file_size": 256412,
      "status": "Approved",
      "created_at": "2026-05-17T10:08:00Z",
      "cross_check_result": { "matches_registry_name": true, "matches_registration_number": true },
      "document_metadata": {
        "file_size": 256412,
        "content_type": "application/pdf",
        "is_signed": true,
        "is_tampered": false
      },
      "description": null,
      "is_requested": true,
      "ocr_data": { "company_name": "Sante Clinics SL", "registration_number": "B12345678" },
      "is_console_upload": false,
      "is_confirmed": true
    }
  ],
  "groups": {
    "incorporation_certificate": { "total": 1, "approved": 1, "pending": 0, "declined": 0, "in_review": 0, "other": 0, "missing": 0 }
  },
  "required_groups": ["incorporation_certificate", "shareholder_register"],
  "warnings": []
}
```

### شخص رئيسي في KYB

يُعاد لكل عقدة من عقد الأشخاص الرئيسيين في سير عمل KYB. يظهر كـ `key_people_checks[]` في `GET /v3/session/{sessionId}/decision/` لجلسات الشركات. المصدر: `kyb/serializers/kyb.py:967-1050` (`KeyPeopleCheckV3Serializer`).

| الحقل | النوع | قابل للقيمة الفارغة | الوصف | مثال |
| - | - | - | - | - |
| `status` | سلسلة نصية | لا | راجع [تعداد الحالة](#مرجع-قيم-الحالة). | `"Approved"` |
| `node_id` | سلسلة نصية \| null | نعم | معرّف عقدة سير العمل (V3). | `"first_key_people"` |
| `registry` | كائن | لا | `{ officers[], beneficial_owners[] }` مستخرجة من السجل. يتبع المسؤولون `KYBPersonResponseSerializer` (`kyb/serializers/kyb.py:533-645`)؛ ويتبع المستفيدون الحقيقيون `KYBBeneficialOwnerResponseSerializer` (`kyb/serializers/kyb.py:648-788`، الذي يضيف `date_of_birth`، `country_of_birth`، `email`، `company_name`، `registration_number`، `entity_type`، `roles`، `ownership_min_shares`، `ownership_max_shares`، `child_beneficial_owners`، `effective_ownership_percent`). ويتضمن كلاهما إثراء AML وKYC لكل طرف (`aml_status`، `kyc_status`، `kyc_session_url`، `kyc_session_id`، `verification_workflow_type`، `verification_workflow_id`، `verification_workflow_label`، `verification_workflow_features`، `didit_internal_id`، `kyc_document_type`، `kyc_nationality`، `kyc_liveness_passed`، `kyc_verified_at`، `kyc_aml_categories`، `kyc_notification_sent_at`). | `{ "officers": [...], "beneficial_owners": [...] }` |
| `submitted` | كائن | لا | `{ parties[] }` - الإدخالات التي أكّدتها الشركة أو قدّمتها عبر تدفق الأشخاص الرئيسيين (صفوف `BusinessParty` التي تحمل `source=USER`). يتبع كل طرف `BusinessPartySubmissionResponseSerializer` (`kyb/serializers/party.py:146-194`): `uuid`، `entity_type`، `source`، `name`، `first_name`، `last_name`، `company_name`، `registration_number`، `email`، `nationality`، `phone_number`، `date_of_birth`، `position`، `custom_fields`، `is_active`، `is_skipped`، `requires_verification`، `roles[]` (`{ role, ownership_percent, voting_percent }`)، `kyc_session_id`، `kyc_session_status`، `kyc_session_url`، `kyc_session_deleted`، `kyb_sub_session_id`، `kyb_sub_session_status`، `kyb_sub_session_url`، `kyb_sub_session_deleted`، `verification_workflow_type`، `verification_workflow_id`، `verification_workflow_label`، `verification_workflow_features`، `didit_internal_id`. تعني `kyc_session_deleted` / `kyb_sub_session_deleted` أن الجلسة الفرعية قد حُذفت: تبقى حالتها مجمّدة عند قيمتها الأخيرة، ويعود `*_session_url` المقابل بقيمة `null` لأن الرابط لم يعد يُحلّ، ولا يعود الطرف يمنع الجلسة الأم (ويتحول الفحص إلى `In Review` بدلاً من ذلك). أزِل هذه العلامة باستخدام [`PATCH /v3/session/{id}/kyb/parties/{party_uuid}/`](https://docs.didit.me/ar/sessions-api/update-data#تخطي-طرف-من-الأشخاص-الرئيسيين). | `{ "parties": [...] }` |
| `ubo_kyc_summary` | كائن | نعم | أعداد عبر المستفيدين الحقيقيين النشطين المرتبطين بـ KYC: `{ total, approved, flagged, pending }`. تكون القيمة `null` عندما لا يكون لأي مستفيد حقيقي نشط KYC مرتبط. | `{ "total": 2, "approved": 2, "flagged": 0, "pending": 0 }` |
| `warnings` | مصفوفة | لا | راجع [كائن التحذير](#كائن-التحذير). | `[]` |

```json theme={null}
{
  "status": "Approved",
  "node_id": "first_key_people",
  "registry": {
    "officers": [
      {
        "uuid": "c1f1e2c2-aaaa-4d2c-9eb6-fdc6c7c92ef9",
        "name": "María García López",
        "designation": "Administrador único",
        "role": "Director",
        "nationality": "ESP",
        "appointment_date": "2018-03-22",
        "termination_date": null,
        "is_active": true,
        "address": "Calle Mayor 1, 28001 Madrid",
        "aml_status": "Approved",
        "kyc_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
        "verification_workflow_type": "kyc",
        "verification_workflow_id": "11111111-1111-1111-1111-111111111111",
        "verification_workflow_label": "KYB officer KYC",
        "verification_workflow_features": [
          { "feature": "ID_VERIFICATION", "status": "Approved" },
          { "feature": "LIVENESS", "status": "Approved" },
          { "feature": "FACE_MATCH", "status": "Approved" }
        ],
        "didit_internal_id": "user-12345",
        "kyc_document_type": "Passport",
        "kyc_nationality": "ESP",
        "kyc_liveness_passed": true,
        "kyc_verified_at": "2026-05-17T10:10:11Z",
        "kyc_aml_categories": [],
        "kyc_notification_sent_at": "2026-05-15T08:00:00Z"
      }
    ],
    "beneficial_owners": []
  },
  "submitted": {
    "parties": [
      {
        "uuid": "d1f1e2c2-bbbb-4d2c-9eb6-fdc6c7c92ef9",
        "entity_type": "person",
        "source": "USER",
        "name": "María García López",
        "first_name": "María",
        "last_name": "García López",
        "company_name": null,
        "registration_number": null,
        "email": "maria.garcia@example.com",
        "nationality": "ESP",
        "phone_number": null,
        "date_of_birth": "1990-05-12",
        "position": "Administrador único",
        "custom_fields": {},
        "is_active": true,
        "is_skipped": false,
        "requires_verification": true,
        "roles": [
          { "role": "UBO", "ownership_percent": 75.0, "voting_percent": null }
        ],
        "kyc_session_id": "9b1f1e2c-8888-4d2c-9eb6-fdc6c7c92ef9",
        "kyc_session_status": "Approved",
        "kyc_session_url": "https://verify.didit.me/s/…",
        "kyb_sub_session_id": null,
        "kyb_sub_session_status": null,
        "kyb_sub_session_url": null,
        "verification_workflow_type": "kyc",
        "verification_workflow_id": "11111111-1111-1111-1111-111111111111",
        "verification_workflow_label": "KYB officer KYC",
        "verification_workflow_features": [
          { "feature": "ID_VERIFICATION", "status": "Approved" },
          { "feature": "LIVENESS", "status": "Approved" }
        ],
        "didit_internal_id": "user-12345"
      }
    ]
  },
  "ubo_kyc_summary": { "total": 1, "approved": 1, "flagged": 0, "pending": 0 },
  "warnings": []
}
```

## الحقول على مستوى القرار

تقع هذه المفاتيح بجوار مصفوفات الميزات في `GET /v3/session/{sessionId}/decision/` وداخل حقل `decision` في webhook.

| الحقل | النوع | قابل لأن يكون null | الوصف |
| - | - | - | - |
| `status_override` | كائن | نعم | `{ overridden_at, automatic_status }` بعد أن يحدّد المراجِع قيمة `status` يدوياً؛ وتكون القيمة `null` عندما تكون الحالة هي الحالة التلقائية. |
| `decision_trace` | كائن | لا | طريقة الوصول إلى الحالة: `status`، و`decided_by` (`manual` أو `automatic` أو `investigator`)، و`decided_at`، و`automatic_status`، و`terminal_node_id`، و`actor`، و`warning_counts` و`status_warnings`. |
| `linked_records` | كائن | نعم | ملخصات `same_face` و`earlier_verifications` و`networks`؛ وتكون القيمة `null` عندما لا يوجد ما يُعرض. |
| `biometric_retention` | كائن | لا | `{ jurisdictions, deletes_at }`. يمثل `deletes_at` التاريخ الذي تُحذف فيه البيانات البيومترية الحية للجلسة، وتكون القيمة `null` عندما لا يوجد تاريخ منطبق بعد. |
| `database_validation_not_performed_reason` | كائن | نعم | `{ code, message }` يوضح سبب عدم إنتاج التحقق من قواعد البيانات المُكوَّن أي نتيجة. |
| `assignee`، `waiting_since`، `sla_due_at` | كائن، تاريخ ووقت | نعم | مراجِع Console الذي يتولى الجلسة، وعدّاد مراجعتها؛ ويكون العدّاد `null` إلا إذا كانت الجلسة في حالة `In Review`. |
| `shared_from_session`، `shared_from_session_number` | UUID، عدد صحيح | نعم | الجلسة المصدر للجلسة المستوردة. |
| `sandbox_scenario` | نص | نعم | السيناريو الذي أُنشئت به جلسة البيئة التجريبية. |
| `fraud_check` | كائن | نعم | نتيجة واجهة Fraud Check API؛ وتكون القيمة `null` لكل جلسة أخرى. |
| `full_session_video`، `full_session_video_recorded_at` | URL، تاريخ ووقت | نعم | تسجيل فيديو الجلسة الكامل ووقت تسجيله. يُعاد هذان الحقلان فقط إذا كانت مؤسستك تسجّل فيديو الجلسة الكامل. |

راجع [استرجاع الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md#الحالة-وتتبّع-القرار-وحقول-المراجعة) لمعرفة كيفية قراءتها.

## الموافقة البيومترية

يحمل كل قرار تحقق من المستخدمين وكل webhook للجلسة كائن `biometric_consent` واحدًا (وليس مصفوفة): ما إذا كانت الجلسة تتطلب موافقة بيومترية صريحة، والسبب، وأدلة الإجابة. يكون `null` عندما لم تُقيَّم الجلسة قط، مثل سير عمل بلا التقاط للوجه. المصدر: `BiometricConsentDecisionSerializer` (`sessions/serializers/biometric_consent.py`). تُشرح الخطوة ومتى تظهر وما تعنيه كل حالة في [الموافقة البيومترية](https://docs.didit.me/ar/getting-started/biometric-consent.md).

الحقول التي لا توجد لها قيمة مسجلة تكون `null`، وليس نصًا فارغًا أبدًا.

| الحقل | النوع | الوصف |
| - | - | - |
| `required` | boolean | ما إذا كان يجب على الجلسة جمع موافقة بيومترية صريحة. لا تعود أبدًا إلى `false`. |
| `trigger` | string (تعداد) \| null | سبب اشتراط الموافقة، أو كيفية تلبيتها: `declared_state`، `ip_state`، `ip_unknown`، `document_issuer`، `forced` (وضع التطبيق «دائمًا»)، `customer_collected` (أرسلتَ `biometric_consent` عند إنشاء الجلسة). تكون `null` ما دامت الموافقة غير مطلوبة. |
| `status` | string (تعداد) | `not_required`، و`pending` (مطلوبة ولم تُمنح)، و`given`، و`declined` (سُجّل رفض؛ لا تعرض أي شاشة من Didit خيار الرفض حاليًا). |
| `given_at` | string (ISO 8601) \| null | وقت منح الموافقة. بالنسبة إلى `customer_collected`، هو القيمة `given_at` التي أرسلتها. |
| `declined_at` | string (ISO 8601) \| null | وقت تسجيل الرفض. |
| `text_version` | string \| null | معرّف إصدار نص الموافقة الذي أجاب عنه الشخص، أو الذي أرسلته. |
| `text_hash` | string \| null | قيمة SHA-256 (بالنظام السادس عشر) للنص الدقيق المعروض، باللغة التي عُرض بها. |
| `locale` | string \| null | اللغة التي عُرض بها النص. |
| `policy_url` | string \| null | سياسة البيانات البيومترية التي ربطتها الخطوة. |
| `step` | string \| null | خطوة سير العمل التي كانت عليها الجلسة عندما أجاب الشخص (مثلًا `LIVENESS`). |
| `node_id` | string \| null | عقدة مخطط سير العمل التي كانت عليها الجلسة عندما أجاب الشخص. |
| `ip_address` | string \| null | عنوان IP الذي صدرت منه الإجابة. |
| `ip_country_code` | string \| null | رمز الدولة وفق ISO 3166-1 alpha-2 لعنوان IP الذي صدرت منه الإجابة. |
| `ip_state` | string \| null | رمز التقسيم الإداري وفق ISO 3166-2 لعنوان IP الذي صدرت منه الإجابة (مثلًا `US-IL`). |
| `ip_city` | string \| null | مدينة عنوان IP الذي صدرت منه الإجابة. |
| `user_agent` | string \| null | وكيل المستخدم لطلب الإجابة. |
| `detected_ip_address` | string \| null | عنوان IP للشخص الذي قُيّم الشرط انطلاقًا منه آخر مرة. قد يختلف عن `ip_address` إذا أجاب الشخص من جهاز آخر. |
| `detected_country_code` | string \| null | رمز الدولة وفق ISO 3166-1 alpha-2 لعنوان IP المكتشف. |
| `detected_state` | string \| null | رمز التقسيم الإداري وفق ISO 3166-2 لعنوان IP المكتشف. |
| `detected_city` | string \| null | مدينة عنوان IP المكتشف. |
| `declared_state` | string \| null | رمز التقسيم الإداري وفق ISO 3166-2 الذي صرّحتَ به: `user_state`، أو ولاية عنوان أمريكي في `expected_details`. |
| `document_state` | string \| null | رمز التقسيم الإداري وفق ISO 3166-2 الذي أصدر وثيقة الهوية، ويُقرأ عند التقاط الهوية. |
| `jurisdictions` | array of string | الولايات الأمريكية (رموز USPS، مثلًا `IL`) التي ينطبق قانونها البيومتري على الشخص. تُعاد `US` عندما تضع الأدلة الشخص في الولايات المتحدة دون معرفة الولاية. تكون فارغة عندما لا ينطبق أي منها. |
| `retention_months` | integer \| null | أقصر حد للاحتفاظ بالبيانات البيومترية، بالأشهر، من بين عناصر `jurisdictions`. تكون `null` عندما لا ينطبق أي منها. |
| `reason` | string (تعداد) \| null | `BIOMETRIC_CONSENT_UNSUPPORTED_SDK`: كانت الموافقة مطلوبة، وقام SDK أصلي أقل من 4.10.0، أو SDK لم يُبلغ عن إصداره، بالتقاط وجه دون الخطوة؛ تبقى `status` بقيمة `pending`، أو تصبح `given` إذا وافق الشخص لاحقًا في صفحة التحقق المستضافة. `BIOMETRIC_CONSENT_DECLINED`: سُجّل رفض (ويحل محل سبب SDK). تكون `null` في غير ذلك، وتكون دائمًا `null` عندما لم تكن الجلسة تتطلب الموافقة. |
| `decline_reason` | string \| null | تكون `BIOMETRIC_CONSENT_DECLINED` عندما أنهى رفضٌ مسجَّل الجلسة، وإلا فتكون `null`. |
| `face_data_deleted_at` | string (ISO 8601) \| null | وقت حذف صور الوجه ومقاطع الفيديو وقوالب الوجه الخاصة بالجلسة نتيجة الرفض. تكون `null` ما لم يُسجَّل رفض. |

جلسة في إلينوي عالجها SDK أصلي بإصدار أقل من 4.10.0، والتقط السيلفي دون الخطوة:

```json theme={null}
{
  "required": true,
  "trigger": "ip_state",
  "status": "pending",
  "given_at": null,
  "declined_at": null,
  "text_version": null,
  "text_hash": null,
  "locale": null,
  "policy_url": null,
  "step": null,
  "node_id": null,
  "ip_address": null,
  "ip_country_code": null,
  "ip_state": null,
  "ip_city": null,
  "user_agent": null,
  "detected_ip_address": "203.0.113.42",
  "detected_country_code": "US",
  "detected_state": "US-IL",
  "detected_city": "Chicago",
  "declared_state": null,
  "document_state": null,
  "jurisdictions": ["IL"],
  "retention_months": 36,
  "reason": "BIOMETRIC_CONSENT_UNSUPPORTED_SDK",
  "decline_reason": null,
  "face_data_deleted_at": null
}
```

شخص يستخدم VPN يتصل عبر خادم خارج الولايات المتحدة، ووافق في الصفحة المستضافة للتحقق:

```json theme={null}
{
  "required": true,
  "trigger": "declared_state",
  "status": "given",
  "given_at": "2026-10-13T18:31:07.412000Z",
  "declined_at": null,
  "text_version": "bio-consent-2026-10-12",
  "text_hash": "9b2f0c5e4d8a7f61c3e2b4a5d6f7081923a4b5c6d7e8f90a1b2c3d4e5f6a7b8c",
  "locale": "en",
  "policy_url": "https://didit.me/legal/biometric-data-policy",
  "step": "LIVENESS",
  "node_id": "feature_liveness_1",
  "ip_address": "198.51.100.23",
  "ip_country_code": "ES",
  "ip_state": "ES-M",
  "ip_city": "Madrid",
  "user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1",
  "detected_ip_address": "198.51.100.23",
  "detected_country_code": "ES",
  "detected_state": "ES-M",
  "detected_city": "Madrid",
  "declared_state": null,
  "document_state": null,
  "jurisdictions": ["IL"],
  "retention_months": 36,
  "reason": null,
  "decline_reason": null,
  "face_data_deleted_at": null
}
```

## مرجع قيم الحالة

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

### حالات مستوى الميزة

تُستخدم في حقل `status` لكل كائن تقرير. المصدر: `common/config/choices.py:343-348` (`FeatureStatusChoices`).

| القيمة | المعنى |
| - | - |
| `Not Finished` | تم توفير الميزة لكن المستخدم لم يُكملها بعد. |
| `Approved` | اجتازت الميزة جميع الفحوصات. |
| `Declined` | أخفقت الميزة في فحص حاسم واحد على الأقل (راجع `warnings[]` مع `log_type: "error"`). |
| `In Review` | أطلقت الميزة إشارات فشل ناعم وهي بانتظار المراجعة اليدوية (راجع `warnings[]` مع `log_type: "warning"`). |
| `Resub Requested` | طلب مراجِع من المستخدم إعادة تقديم هذه الميزة. |

يمكن أن تظهر حالة `Expired` أيضًا في التحقق من رقم الهاتف والبريد الإلكتروني والهوية عندما تنتهي مهلة خطوتها (`PhoneStatusChoices` في `common/config/choices.py:377-382`، و`EmailStatusChoices` في `common/config/choices.py:434-439`).

### حالات مستوى الجلسة

تُستخدم في حقل `status` ذي المستوى الأعلى للجلسة الأم. المصدر: `common/config/choices.py:106-117` (`StatusChoices`).

| القيمة | المعنى |
| - | - |
| `Not Started` | أُنشئت الجلسة لكن المستخدم لم يبدأها بعد. |
| `In Progress` | بدأ المستخدم المسار، والنتيجة لم تُحسم بعد. |
| `Approved` | اجتازت الجلسة جميع الفحوصات. |
| `Declined` | أخفقت الجلسة في فحص حاسم واحد على الأقل. |
| `In Review` | الجلسة بانتظار المراجعة اليدوية. |
| `Expired` | انتهت صلاحية الجلسة قبل اكتمالها. |
| `Abandoned` | غادر المستخدم المسار دون إكماله. |
| `Kyc Expired` | انقضت فترة صلاحية KYC (وتُستخدم في مسارات إعادة التحقق). |
| `Resubmitted` | أعاد المستخدم التقديم بعد رفض سابق، وحلّت محلّها جلسة أحدث. |
| `Awaiting User` | ينتظر النظام إجراءً من جهة المستخدم (مثل إدخال رمز OTP). |

> [!TIP]
>
> القيم النهائية للجلسة هي `Approved` و`Declined` و`In Review` و`Expired` و`Kyc Expired` و`Abandoned`. يمكن أن تصل الجلسة إلى قرارها الإجمالي بينما تبقى ميزة فردية في حالة `In Review`.


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