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

# تكامل KYC عبر API: الدليل الكامل من البداية إلى النهاية

> دليل تكامل Didit الكامل عبر REST API: احصل على بيانات الاعتماد، وأنشئ الجلسة، وشارك رابط التحقق، وتعامل مع webhooks، واسترجع قرارات KYC في دقائق.

يرشدك هذا الدليل خلال التدفق الكامل لدمج التحقق من الهوية عبر Didit باستخدام REST API: الحصول على بيانات الاعتماد، وإنشاء جلسة، وعرضها على المستخدم، واستلام النتائج.

***

## الخطوة 1: احصل على بيانات اعتمادك

لديك طريقتان للحصول على `api_key`:

### الخيار أ: التسجيل البرمجي (دون متصفح)

الأنسب لبيئات CI/CD ووكلاء الذكاء الاصطناعي. يُرجع الاستدعاءان إلى الواجهة البرمجية، وهما `POST /programmatic/register/` ثم `POST /programmatic/verify-email/`، مفتاح `api_key` ضمن الاستجابة مباشرة.

→ انظر [التسجيل البرمجي](https://docs.didit.me/ar/integration/programmatic-registration.md) للاطلاع على التدفق الكامل، وقواعد كلمة المرور، ومدة صلاحية JWT، وسياسة القفل.

### الخيار ب: من Didit Console

1. انتقل إلى [Didit Console](https://business.didit.me).
2. أنشئ مؤسستك أو اختر مؤسسة موجودة.
3. انتقل إلى **الإعدادات** ← **API وwebhook**.
4. انسخ:
   * **مفتاح API**: يُستخدم كرأس `x-api-key` في كل استدعاء تحقق.
   * **مفتاح webhook السري**: يُستخدم للتحقق من توقيعات HMAC الخاصة بـ webhook.

### متغيرات البيئة

```bash theme={null}
# Required
DIDIT_API_KEY=your_api_key_here
DIDIT_WEBHOOK_SECRET=your_webhook_secret_here

# Your workflow ID (from the Console)
DIDIT_WORKFLOW_ID=your_workflow_id_here
```

***

## الخطوة 2: أنشئ سير عمل

قبل إنشاء الجلسات، تحتاج إلى سير عمل للتحقق. يحدد سير العمل خطوات التحقق التي يمر بها المستخدمون.

### الإنشاء من وحدة التحكم

1. انتقل إلى [Didit Console](https://business.didit.me) ← **سير العمل**
2. انقر على **إنشاء سير العمل**
3. اختر قالباً أساسياً:

| القالب | الأنسب لـ |
| - | - |
| **KYC** | التحقق الكامل من الهوية باستخدام مستند هوية |
| **التحقق من العمر التكيفي** | التحقق من العمر مع خيار احتياطي اختياري باستخدام مستند هوية |
| **المصادقة البيومترية** | إعادة التحقق من المستخدمين العائدين |
| **التحقق من العنوان** | التحقق من إثبات العنوان |

4. أضف الميزات الاختيارية:

| الميزة | الوصف |
| - | - |
| التحقق عبر NFC | قراءة بيانات شريحة جواز السفر أو الهوية |
| كشف الحيوية | منع الانتحال عبر فيديو سيلفي |
| مطابقة الوجه | مطابقة صورة السيلفي مع صورة المستند |
| التحقق من رقم الهاتف | التحقق من رقم الهاتف عبر الرسائل النصية القصيرة |
| التحقق من البريد الإلكتروني | التحقق من عنوان البريد الإلكتروني |
| فحص AML | الفحص مقابل قوائم العقوبات وقوائم الأشخاص المعرضين سياسياً |
| التحقق من قواعد البيانات | التحقق بالرجوع إلى قواعد البيانات الحكومية |
| تحليل الجهاز وعنوان IP | اكتشاف شبكات VPN والوكلاء والموقع الجغرافي |

5. انسخ **مُعرّف سير العمل**

> [!NOTE]
>
> راجع [توثيق سير العمل](https://docs.didit.me/ar/console/workflows.md) للاطلاع على خيارات الإعداد التفصيلية.

***

## الخطوة 3: إنشاء جلسة تحقق

استدعِ الـ API لإنشاء جلسة لمستخدمك.

### الطلب

```bash theme={null}
curl -X POST https://verification.didit.me/v3/session/ \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "workflow_id": "your-workflow-id",
    "callback": "https://yourapp.com/verification-complete",
    "vendor_data": "user-123"
  }'
```

### معاملات الطلب

| المعامل | مطلوب | الوصف |
| - | - | - |
| `workflow_id` | نعم | معرّف UUID لسير العمل الخاص بك من Console. |
| `callback` | لا | رابط الاستدعاء الذي يُوجَّه إليه المستخدم بعد التحقق. يضيف Didit المعاملين `verificationSessionId` و`status` كمعاملات في سلسلة الاستعلام. يدعم مخططات مخصصة (مثل `myapp://`). يُستخدم رابط الاستدعاء المضبوط في سير العمل عند عدم توفير هذا الحقل. |
| `callback_method` | لا | الجهاز الذي يتعامل مع إعادة التوجيه: `initiator` أو `completer` أو `both`. القيمة الافتراضية: `initiator`. |
| `vendor_data` | لا | معرّف المستخدم الداخلي لديك، ويُعاد إرساله في webhooks لربط البيانات. |
| `metadata` | لا | كائن JSON اختياري يُخزَّن مع الجلسة ويُعاد إرساله في webhook. |
| `language` | لا | تلميح للغة الواجهة (ISO 639-1، مثل `en` أو `es`). تُكتشف لغة المتصفح تلقائياً عند عدم توفير هذا الحقل. |
| `contact_details` | لا | البريد الإلكتروني أو رقم الهاتف للمستخدم، لتعبئة البيانات مسبقاً وإرسال إشعارات البريد الإلكتروني. |
| `expected_details` | لا | تفاصيل المستخدم المتوقعة للتحقق المتقاطع مع البيانات الموثّقة. |
| `portrait_image` | مشروط | صورة الوجه بترميز Base64 (بحد أقصى 2MB؛ بصيغة JPEG أو PNG أو WebP أو TIFF). صورة مرجعية للوجه للمصادقة البيومترية أو لسير العمل الذي يبدأ بمطابقة الوجه. تصبح اختيارية عندما يكون لدى المستخدم الذي تحدده `vendor_data` وجه محفوظ مسبقاً (وجه من كشف حيوية معتمد، أو صورة من جواز السفر الإلكتروني، أو صورة من مستند الهوية، أو وجه من الملف الشخصي المسجّل): يعيد Didit استخدامه تلقائياً، ويُرجع `400` إذا لم يتوفر أي منها. |
| `sandbox_scenario` | لا | معرّف نصي لسيناريو خاص بالبيئة التجريبية فقط (مثل `approve` أو `decline_aml_hit`) يملأ الجلسة تلقائياً بمدخلات سحرية. |

### مثال كامل بجميع الخيارات

```bash theme={null}
curl -X POST https://verification.didit.me/v3/session/ \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
    "workflow_id": "11111111-2222-3333-4444-555555555555",
    "callback": "https://yourapp.com/verification-complete",
    "vendor_data": "user-123",
    "metadata": {
      "plan": "premium",
      "signup_source": "mobile-app"
    },
    "contact_details": {
      "email": "alex.sample@example.com",
      "email_lang": "en",
      "send_notification_emails": true,
      "phone": "+15550101000"
    },
    "expected_details": {
      "first_name": "John",
      "last_name": "Doe",
      "date_of_birth": "1990-01-01",
      "expected_document_types": ["P", "ID"]
    }
  }'
```

> [!NOTE]
>
> `expected_details.expected_document_types` يقصر خطوة التحقق من الهوية على أنواع مستندات محددة، إذ لا تعرض شاشة اختيار المستند سوى الأنواع المطلوبة. القيم المسموح بها: `P` (جواز السفر)، و`ID` (بطاقة الهوية الوطنية)، و`DL` (رخصة القيادة)، و`RP` (تصريح الإقامة)، و`HIC` (بطاقة التأمين الصحي)، و`TC` (البطاقة الضريبية)، و`SSC` (بطاقة الضمان الاجتماعي). القيم غير حساسة لحالة الأحرف، وتُحذف التكرارات، وتُرجع القيم غير المعروفة `400`. راجع [مرجع Create Session](https://docs.didit.me/ar/sessions-api/create-session.md) للاطلاع على المخطط الكامل.

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

`201 Created`:

```json theme={null}
{
  "session_id": "11111111-2222-3333-4444-555555555555",
  "session_number": 43762,
  "session_token": "3FaJ9wLqX2Mz",
  "url": "https://verify.didit.me/session/3FaJ9wLqX2Mz",
  "vendor_data": "user-123",
  "metadata": {
    "plan": "premium",
    "signup_source": "mobile-app"
  },
  "status": "Not Started",
  "workflow_id": "11111111-2222-3333-4444-555555555555",
  "workflow_version": 3,
  "callback": "https://yourapp.com/verification-complete"
}
```

### حقول الاستجابة الرئيسية

| الحقل | الوصف |
| - | - |
| `session_id` | معرّف UUID فريد لهذه الجلسة. استخدمه مع `GET /v3/session/{sessionId}/decision/` وwebhooks. |
| `session_number` | رقم تسلسلي قابل للقراءة يظهر في Console الخاص بـ Didit. |
| `session_token` | رمز مكوّن من 12 حرفاً، آمن لعناوين URL، يسمح للمستخدم النهائي بفتح التدفق المستضاف، ويُهيّئ حزم SDK الأصلية (يستخدم SDK الويب الحقل `url` بدلاً منه). تعامل معه كسرّ. |
| `url` | رابط التحقق المستضاف لتوجيه المستخدم إليه، أو لتضمينه في iframe. (اسم الحقل هو `url`، وليس `verification_url`.) عندما يتضمن الطلب `language`، يحتوي الرابط على مقطع مسار للغة، مثل `https://verify.didit.me/en/session/3FaJ9wLqX2Mz`. |
| `status` | الحالة الحالية، وتكون `"Not Started"` للجلسة المنشأة حديثاً. |
| `workflow_id` | معرّف ثابت لسير العمل الذي تعمل عليه الجلسة. |
| `workflow_version` | إصدار سير العمل المنشور الذي ثُبّتت عليه الجلسة عند إنشائها. |

> [!NOTE]
>
> **Idempotency.** عند توفير `vendor_data` ووجود جلسة غير مكتملة (`Not Started` أو `In Progress` أو `Resubmitted` أو `Awaiting User`) بالقيمة نفسها لـ `vendor_data` في أحدث إصدار منشور لسير العمل، تُعاد تلك الجلسة الموجودة (ما زال الرمز `201`) بدلاً من إنشاء نسخة مكررة، مع تحديث `callback` و`metadata` إلى القيم الجديدة، ويعكس `status` حالة الجلسة الموجودة.

> [!NOTE]
>
> **يُرجع غياب `x-api-key` الرمز `403`** مع الاستجابة `{"detail": "You do not have permission to perform this action."}`، وهي الاستجابة نفسها التي تُرجع عند استخدام مفتاح صالح لكن بلا إذن. يُرجع المفتاح الخاطئ أو الملغى أو المنتهي الرمز `401`. يُرجع الرصيد غير الكافي الرمز `400`. راجع [مرجع Create Session API](https://docs.didit.me/ar/sessions-api/create-session.md) للوثائق الكاملة.

***

## الخطوة 4: عرض التحقق على المستخدم

اختر طريقة عرض تدفق التحقق على مستخدمك:

### الخيار أ: حزمة SDK الأصلية (موصى بها للجوال)

استخدم `session_token` مع حزم SDK الأصلية للكاميرا وNFC والتكامل البيومتري.

→ [iOS SDK](https://docs.didit.me/ar/integration/native-sdks/ios-sdk.md) · [Android SDK](https://docs.didit.me/ar/integration/native-sdks/android-sdk.md) · [React Native](https://docs.didit.me/ar/integration/native-sdks/react-native-sdk.md) · [Flutter](https://docs.didit.me/ar/integration/native-sdks/flutter-sdk.md)

### الخيار ب: InContext iframe (موصى به للويب)

ضمّن التحقق في صفحتك باستخدام `url` الذي تُرجعه الخطوة 3.

```html theme={null}
<iframe
  src="{url}"
  style="width: 100%; height: 700px; border: none;"
  allow="camera; microphone; geolocation; clipboard-write; fullscreen; autoplay; encrypted-media; digital-credentials-get"
></iframe>
```

→ [InContext iframe](https://docs.didit.me/ar/integration/web-sdks/incontext-iframe.md)

### الخيار ج: إعادة التوجيه

وجّه المستخدم إلى رابط التحقق.

```javascript theme={null}
window.location.href = session.url;
```

→ [إعادة التوجيه إلى الويب](https://docs.didit.me/ar/integration/web-sdks/web-redirect.md)

### الخيار د: WebView في تطبيق الجوال

للتطبيقات المحمولة التي لا تملك SDK أصلية.

```jsx theme={null}
// React Native
<WebView source={{ uri: session.url }} />
```

→ [WebView في iOS/Android](https://docs.didit.me/ar/integration/web-sdks/webview-in-ios-android.md)

***

## الخطوة 5: استلام النتائج

### عبر webhook (موصى به)

تُخطِر webhook خادمك فورياً عند تغيّر حالة التحقق.

**الإعداد:**

1. أنشئ وجهة webhook في [لوحة التحكم](https://business.didit.me) (**API & Webhooks**) أو عبر [`POST /v3/webhook/destinations/`](https://docs.didit.me/ar/management-api/webhook/create-destination) مع `webhook_version: "v3"` ومصفوفة `subscribed_events` (مثلاً `["status.updated"]`)
2. احفظ `secret_shared_key` المُعاد عند الإنشاء، فهو سر HMAC لجميع متغيرات التوقيع
3. نفّذ endpoint webhook على خادمك

**مثال على حمولة webhook:**

داخل `decision`، تُسلَّم كل نتيجة خاصة بميزة في صورة **مصفوفة بصيغة الجمع** (`id_verifications[]`، و`nfc_verifications[]`، و`liveness_checks[]`، و`face_matches[]`، و…)، بمدخل واحد لكل عقدة في سير العمل. هذا هو عقد V3 ولا يُمسّ: لا تكتب شيفرتك أبداً على مفاتيح مفردة مثل `nfc` أو `id_verification` أو `liveness`.

```json theme={null}
{
  "event_id": "9c0c8b8a-1111-4222-9333-444444444444",
  "webhook_type": "status.updated",
  "timestamp": 1774970000,
  "created_at": 1774969994,
  "application_id": "11111111-2222-3333-4444-555555555555",
  "environment": "live",
  "session_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  "status": "Approved",
  "workflow_id": "22222222-3333-4444-5555-666666666666",
  "workflow_version": 4,
  "vendor_data": "user-123",
  "metadata": { "plan": "premium" },
  "decision": {
    "session_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
    "status": "Approved",
    "id_verifications": [
      { "node_id": "id_verification_1", "status": "Approved", "document_type": "Passport", "warnings": [] }
    ],
    "liveness_checks": [
      { "node_id": "liveness_1", "status": "Approved", "method": "PASSIVE", "score": 95.4, "warnings": [] }
    ],
    "face_matches": [
      { "node_id": "face_match_1", "status": "Approved", "score": 96.1, "warnings": [] }
    ],
    "reviews": []
  }
}
```

لا يكون كائن `decision` موجوداً إلا عندما تكون `status` هي `Approved` أو `Declined` أو `In Review` أو `Abandoned` (أما حدث `Resubmitted` فيحمل `resubmit_info` بدلاً منه). تعيد Didit استخدام `event_id` نفسه عبر المحاولات المتكررة ووجهات التوزيع المتعددة، فاجعل مفتاح idempotency الخاص بك قائماً عليه. راجع [نماذج البيانات](https://docs.didit.me/ar/reference/data-models.md) لمعرفة كل مصفوفة بصيغة الجمع وكل حقل.

**تحقق من التوقيع (X-Signature-V2، موصى به):**

`X-Signature-V2` هو HMAC-SHA256 على إعادة ترميز معيارية لجسم JSON: تُختصر الأعداد العشرية ذات القيم الصحيحة إلى أعداد صحيحة، وتُرتَّب المفاتيح بشكل متكرر، وتُستخدم فواصل مدمجة، ويُحافَظ على ترميز Unicode.

```javascript theme={null}
const crypto = require("crypto");

// Match Didit's float normalisation: whole-valued floats serialise as ints.
function shortenFloats(data) {
  if (Array.isArray(data)) return data.map(shortenFloats);
  if (data !== null && typeof data === "object") {
    return Object.fromEntries(
      Object.entries(data).map(([key, value]) => [key, shortenFloats(value)])
    );
  }
  return data;
}

// Sort object keys recursively before re-stringifying.
function sortKeys(obj) {
  if (Array.isArray(obj)) return obj.map(sortKeys);
  if (obj !== null && typeof obj === "object") {
    return Object.keys(obj).sort().reduce((acc, key) => {
      acc[key] = sortKeys(obj[key]);
      return acc;
    }, {});
  }
  return obj;
}

function verifyWebhook(rawBody, signatureV2, timestamp, secret) {
  // 1. Reject anything older than 5 minutes
  const now = Math.floor(Date.now() / 1000);
  if (Math.abs(now - parseInt(timestamp, 10)) > 300) return false;

  // 2. Recompute HMAC-SHA256 against the canonical JSON Didit signs
  const canonical = JSON.stringify(sortKeys(shortenFloats(JSON.parse(rawBody))));
  const expected = crypto.createHmac("sha256", secret).update(canonical, "utf8").digest("hex");

  // 3. Constant-time compare
  const a = Buffer.from(expected, "utf8");
  const b = Buffer.from(signatureV2, "utf8");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}
```

→ [التوثيق الكامل للـ webhooks](https://docs.didit.me/ar/integration/webhooks.md)، ويشمل التوقيع `X-Signature` القائم على البايتات الخام، والغلاف المهمَل `X-Signature-Simple` الذي يشمل الغلاف فقط، وكيفية الاختيار بينها. تعيد Didit محاولة التسليم الفاشل (`5xx` أو `404` أو انتهاء المهلة) حتى مرتين (بعد نحو دقيقة، ثم بعد نحو 4 دقائق)، وتنتهي المهلة بعد **5 ثوانٍ**، لذا أعِد `2xx` بسرعة.

### عبر API (اختياري)

استرجع حمولة القرار نفسها في أي وقت:

```bash theme={null}
curl https://verification.didit.me/v3/session/{session_id}/decision/ \
  -H "x-api-key: YOUR_API_KEY"
```

إن بنية الاستجابة (المصفوفات بصيغة الجمع) مطابقة لكائن `decision` داخل حمولة الـ webhook، ويمكن استدعاء نقطة النهاية في أي مرحلة من دورة حياة الجلسة. استخدم webhook للتحديثات الفورية، واقتصر على استدعاءات API لاستكمال البيانات والتدقيق وإعادة البناء. endpoint `/decision/` محدودة بـ 600 طلب GET في الدقيقة لكل مفتاح API (راجع [حد المعدل](https://docs.didit.me/ar/integration/rate-limiting.md)). دلالات الأخطاء: إذا كان `session_id` غير معروف تُعاد استجابة `404` مع `{"detail": "Not found."}`، وتظهر إخفاقات المصادقة كـ `403`، ولا يُعيد هذا endpoint أبداً `401`. روابط الوسائط في الاستجابة روابط موقّعة مسبقاً وقصيرة الأمد، فاستردّها فوراً ولا تحتفظ بها.

→ [مرجع API لاسترجاع الجلسة](https://docs.didit.me/ar/sessions-api/retrieve-session.md)

***

## أمثلة شيفرة كاملة

### Node.js / Express

```javascript theme={null}
const express = require("express");
const crypto = require("crypto");
const app = express();

// Create verification session
app.post("/api/verify", async (req, res) => {
  const { userId } = req.body;

  const response = await fetch("https://verification.didit.me/v3/session/", {
    method: "POST",
    headers: {
      "x-api-key": process.env.DIDIT_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      workflow_id: process.env.DIDIT_WORKFLOW_ID,
      callback: `${process.env.APP_URL}/verification-complete`,
      vendor_data: userId,
    }),
  });

  const session = await response.json();

  // Store session_id associated with user
  await db.users.update({
    where: { id: userId },
    data: { verificationSessionId: session.session_id },
  });

  res.json({
    verificationUrl: session.url,             // hosted verification URL
    sessionToken: session.session_token,      // for native/web SDKs
  });
});

// Handle webhook — uses verifyWebhook / shortenFloats / sortKeys from Step 5
app.post(
  "/api/webhook",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const signature = req.get("X-Signature-V2");
    const timestamp = req.get("X-Timestamp");

    if (
      !verifyWebhook(
        req.body.toString("utf8"),
        signature,
        timestamp,
        process.env.DIDIT_WEBHOOK_SECRET,
      )
    ) {
      return res.status(401).json({ error: "Invalid signature" });
    }

    const payload = JSON.parse(req.body);
    const { event_id, session_id, status, vendor_data } = payload;

    // Idempotency: the same event_id is reused on retries and fan-out.
    // Skip events you have already processed (e.g. a processed_events table).

    // Update user's verification status (status values are case-sensitive strings)
    if (status === "Approved") {
      db.users.update({
        where: { id: vendor_data },
        data: { isVerified: true, verifiedAt: new Date() },
      });
    }

    // Return 2xx quickly (Didit's delivery timeout is 5s); do heavy work asynchronously
    res.json({ received: true });
  },
);

app.listen(3000);
```

### Python / FastAPI

```python theme={null}
from fastapi import FastAPI, Request, HTTPException
import httpx
import hashlib
import hmac
import json
import os
import time

app = FastAPI()

@app.post("/api/verify")
async def create_verification(user_id: str):
    async with httpx.AsyncClient() as client:
        response = await client.post(
            "https://verification.didit.me/v3/session/",
            headers={
                "x-api-key": os.environ["DIDIT_API_KEY"],
                "Content-Type": "application/json"
            },
            json={
                "workflow_id": os.environ["DIDIT_WORKFLOW_ID"],
                "callback": f"{os.environ['APP_URL']}/verification-complete",
                "vendor_data": user_id
            }
        )

    session = response.json()
    return {
        "verification_url": session["url"],            # hosted verification URL
        "session_token": session["session_token"],     # for native/web SDKs
    }

def shorten_floats(data):
    """Match Didit: whole-valued floats serialise as ints."""
    if isinstance(data, dict):
        return {k: shorten_floats(v) for k, v in data.items()}
    if isinstance(data, list):
        return [shorten_floats(x) for x in data]
    if isinstance(data, float) and data.is_integer():
        return int(data)
    return data

@app.post("/api/webhook")
async def handle_webhook(request: Request):
    payload = await request.json()
    signature = request.headers.get("X-Signature-V2")
    timestamp = request.headers.get("X-Timestamp")

    # Verify timestamp freshness
    if not signature or not timestamp or abs(int(time.time()) - int(timestamp)) > 300:
        raise HTTPException(status_code=401, detail="Request too old")

    # Recompute Didit's V2 canonical JSON: shortened floats, sorted keys,
    # compact separators, Unicode preserved (ensure_ascii=False)
    canonical = json.dumps(
        shorten_floats(payload),
        sort_keys=True,
        separators=(",", ":"),
        ensure_ascii=False,
    )
    expected = hmac.new(
        os.environ["DIDIT_WEBHOOK_SECRET"].encode("utf-8"),
        canonical.encode("utf-8"),
        hashlib.sha256
    ).hexdigest()

    if not hmac.compare_digest(signature, expected):
        raise HTTPException(status_code=401, detail="Invalid signature")

    # Idempotency: dedupe on payload["event_id"] (reused on retries)

    if payload["status"] == "Approved":
        # Update user in database
        pass

    return {"received": True}
```

***

## حالات الجلسة

هذه هي القيم الـ 10 الممكنة لـ `status`، وهي سلاسل نصية دقيقة وحساسة لحالة الأحرف (لاحظ أن `Kyc Expired` تستخدم حرف `K` كبيراً واحداً):

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

راجع [حالات التحقق](https://docs.didit.me/ar/integration/verification-statuses.md) للاطلاع على دورة الحياة الكاملة والانتقالات ومخطط Mermaid.

***

## الخطوات التالية

1. **اختر طريقة التكامل**:
   * تطبيقات الجوال ← [SDKs الأصلية](https://docs.didit.me/ar/integration/native-sdks/overview.md)
   * تطبيقات الويب ← [SDKs الويب](https://docs.didit.me/ar/integration/web-sdks/overview.md)
2. **إعداد webhook**: [Webhooks](https://docs.didit.me/ar/integration/webhooks.md)
3. **تخطيط السعة**: [حد المعدل](https://docs.didit.me/ar/integration/rate-limiting.md)
4. **معالجة كل حالة**: [حالات التحقق](https://docs.didit.me/ar/integration/verification-statuses.md)
5. **تخصيص سير العمل**: [سير العمل](https://docs.didit.me/ar/console/workflows.md)
6. **تحقق من إمكانية الوصول إلى API**: [Healthcheck](https://docs.didit.me/ar/api-reference/healthcheck.md)

## هل تحتاج إلى مساعدة؟

* **الدعم**: [support@didit.me](mailto:support@didit.me)
* **التسجيل البرمجي**: [التسجيل البرمجي](https://docs.didit.me/ar/integration/programmatic-registration.md)


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