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

# API التحقق من رقم الهاتف: فحص رمز SMS

> تحقق من رمز OTP للهاتف عبر POST /v3/phone/check/ مع كشف نوع الشبكة والأرقام الافتراضية والمؤقتة عبر Didit. تسعير حسب الاستخدام بلا حد أدنى شهري.

## التعامل مع انقطاع مزود الخدمة

إذا كان مزود خدمة الهاتف غير متاح مؤقتاً، تُرجع نقطة النهاية هذه الرمز `502` مع رمز ثابت مقروء آلياً:

```json theme={null}
{
  "detail": "The phone verification provider is temporarily unavailable.",
  "code": "phone_provider_unavailable"
}
```

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

## إضافة ذكاء الهاتف

اضبط `enable_enrichment` على `true` لتشغيل ذكاء الهاتف على الرقم أيضاً، فتحصل على درجة مخاطر، ونوع الخط، وما إذا كان الرقم قد نُقل مؤخراً إلى شركة اتصالات أخرى، إضافةً إلى مؤشر ثقة.
تُحتسب الإضافة بسعر \$0.05 لكل طلب وفق السعر المعلن، وتُضاف إلى سعر عملية التحقق نفسها.
يُرجع الطلب الرمز `403` إذا كان رصيدك لا يغطي تكلفتها.

تحدد أربعة حقول ما تفعله الإشارات. كل حقل إما `NO_ACTION` (وهي القيمة الافتراضية) أو `DECLINE`، ولا يسري أي منها إلا إذا كان `enable_enrichment` مساوياً لـ `true`.

| الحقل | يُرفض عندما |
| - | - |
| `phone_intelligence_score_action` | درجة المخاطر أعلى من الحد. |
| `phone_type_risk_action` | الرقم من نوع خط عالي المخاطر. |
| `recent_port_action` | الرقم نُقل إلى شركة اتصالات أخرى مؤخراً. |
| `low_phone_trust_action` | مؤشر الثقة أقل من الحد أو يساويه. |

مع `NO_ACTION`، تُعاد الإشارة في `phone.phone_intelligence`، فيمكنك تطبيق قاعدتك الخاصة.


## OpenAPI

````yaml ar/openapi-25.json POST /v3/phone/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/phone/check/:
    post:
      tags:
        - Standalone APIs
      summary: التحقق من رمز الهاتف
      description: >-
        تحقق من رمز OTP المُسلَّم عبر [`POST
        /v3/phone/send/`](/ar/standalone-apis/phone-send) واحصل على نتيجة التحقق
        النهائية بالإضافة إلى معلومات الهاتف: اسم شركة الاتصالات ونوع الخط،
        وعلامات الأرقام الافتراضية (VoIP) والقابلة للاستخدام لمرة واحدة،
        والاستخدام المكرر للرقم عبر جلساتك.


        **كيف يعثر الفحص على عملية التحقق.** يتم التطابق استناداً إلى تطبيقك
        بالإضافة إلى `phone_number` بتنسيق E.164 — ولا يُعدّ `request_id`
        مدخلاً. يتم فحص أحدث عملية تحقق معلقة تم إنشاؤها خلال آخر **5 دقائق**.
        إذا لم تكن هناك أي عملية (لم تُرسل مطلقاً، أو تم إنهاؤها بالفعل، أو أقدم
        من 5 دقائق)، يعيد الـ endpoint الرمز `200` مع `status: "Expired or Not
        Found"`.


        **حد المحاولات المسموح به.** تتيح كل عملية تحقق **3 محاولات لإدخال
        الرمز**. يؤدي إدخال أول رمزين خاطئين إلى إرجاع `status: "Failed"` مع عدد
        المحاولات المتبقية و`phone: null`؛ وتؤدي المحاولة الثالثة الخاطئة للرمز
        إلى إنهاء عملية التحقق كـ `Declined` مع تحذير
        `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` وإرجاع تقرير الهاتف كاملاً.


        **النتائج.** `Approved` — الرمز صحيح ولا توجد مخاطر موجبة للرفض.
        `Declined` — نهائية: كان الرمز صحيحاً ولكن طابقت مخاطر موجبة للرفض
        (إجراء `DECLINE` أدناه، أو رقم مدرج في قائمة الحظر أو عالي المخاطر)، أو
        تم استنفاد حد المحاولات. `Failed` — رمز خاطئ مع بقاء محاولات متاحة.
        `Expired or Not Found` — لا يوجد شيء لفحصه. في حالتي
        `Approved`/`Declined`، يتطابق `request_id` مع `request_id` الخاص
        بالإرسال (معرّف الجلسة) ويحتوي `phone` على التقرير الكامل (`carrier`،
        و`is_virtual`، و`is_disposable`، و`warnings`، و`lifecycle`، و`matches`)؛
        أما في حالتي `Failed` و`Expired or Not Found`، فيكون `request_id` عبارة
        عن معرّف UUID عشوائي يُستخدم لمرة واحدة.


        **إجراءات المخاطر.** تحدد المعاملات `duplicated_phone_number_action`
        و`disposable_number_action` و`voip_number_action` ما يحدث عند اكتشاف
        الخطر المقابل مع رمز صحيح: يغير `DECLINE` الحالة النهائية إلى
        `Declined`؛ بينما يسجل `NO_ACTION` (الافتراضي) الخطر في `phone.warnings`
        دون التأثير على الحالة.


        **الفوترة.** عمليات الفحص مجانية — وتتم فوترة التسليم من جانب الإرسال
        (راجع [أسعار التحقق من رقم
        الهاتف](/ar/getting-started/phone-verification-pricing)).


        **استمرارية الجلسة.** يؤدي الفحص المكتمل إلى تحديث الجلسة التي تم
        إنشاؤها عبر الإرسال (مرئية في Business Console، ويمكن الاستعلام عنها عبر
        `GET /v3/session/{sessionId}/decision/`) ويُطلق حدث webhook من نوع
        `status.updated`.


        **البيئة التجريبية.** تتخطى مفاتيح API الخاصة بالبيئة التجريبية كل
        عمليات المعالجة: أي رمز ذي تنسيق سليم (من 4 إلى 8 أرقام، بما في ذلك
        `123456`) يعيد payload ثابتاً بحالة `Approved` مع كائن `phone` مبسط
        ومسطح (`status`، و`phone_number`، و`country_code`، و`carrier_name`،
        و`line_type`، و`flags`)؛ بينما يظل الإدخال غير السليم يعيد الرمز `400`.
        لا يتم حفظ أي شيء.


        **المصادقة.** أرسل مفتاح API الخاص بتطبيقك في الرأس `x-api-key`. تؤدي
        بيانات الاعتماد المفقودة أو غير الصالحة إلى إرجاع `403` (`{"detail":
        "You do not have permission to perform this action."}`) — لا يعيد هذا
        الـ API الرمز `401` أبداً.


        **حدود المعدل.** ميزانية كتابة مشتركة تبلغ 300 طلب/دقيقة لكل مفتاح API،
        بالإضافة إلى الحد الأقصى لمكافحة إساءة الاستخدام لدى المزود الرئيسي
        البالغ 4 محاولات لكل رقم في الساعة؛ يؤدي تجاوز أي منهما إلى إرجاع `429`.


        **البصمة الاجتماعية.** اضبط `enable_social` على `true` لإضافة كتلة
        `phone_social`: المنصات عبر الإنترنت التي تم تسجيل هذا الرقم فيها، مع
        أعداد لكل فئة وأي تفاصيل ملف شخصي متاحة. وتعني القيمة
        `profiles_registered: 0` أنه تم فحص المنصات ولم يتم العثور على الرقم في
        أي منها - وهي إجابة صالحة خاضعة للفوترة. وتغيب هذه الكتلة إذا لم يُطلب
        الملحق الإضافي أو تعذر إكمال الفحص، ولا تتم فوترتها في هذه الحالة. تضيف
        الفوترة وحدة `phone_social` واحدة لكل طلب فوق السعر الخاص بهذا الـ
        endpoint.
      operationId: post_v3phone_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    رقم الهاتف نفسه المستخدم في استدعاء [`POST
                    /v3/phone/send/`](/ar/standalone-apis/phone-send) المطابق،
                    بتنسيق E.164. هذا ما يربط التحقق بعملية الإرسال.
                  example: '+14155552671'
                code:
                  type: string
                  minLength: 4
                  maxLength: 8
                  pattern: ^[0-9]{4,8}$
                  description: >-
                    رمز OTP الذي استلمه المستخدم النهائي. يجب أن يتكون من 4 إلى
                    8 أرقام — أي شيء آخر يُرجع `400` دون استهلاك أي محاولة.
                    الرمز المكتمل التنسيق ولكن الخاطئ يُرجع `200` مع `status:
                    "Failed"` ويستهلك إحدى المحاولات الثلاث.
                  example: '123456'
                duplicated_phone_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء المتخذ عند استخدام نفس الرقم مسبقاً من قبل مستخدم
                    مختلف (بيانات `vendor_data` مختلفة) لتطبيقك. يؤدي خيار
                    `DECLINE` إلى تحويل `status` النهائي إلى `Declined`؛ ويسجل
                    خيار `NO_ACTION` المخاطر في `phone.warnings` ويملأ
                    `phone.matches`.
                disposable_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء المتبع عندما يشير فحص شركة الاتصالات إلى أن الرقم
                    مؤقت أو للاستخدام الواحد (`phone.is_disposable`). يحول
                    `DECLINE` القيمة النهائية لـ `status` إلى `Declined`؛ ويسجل
                    `NO_ACTION` الخطر في `phone.warnings`.
                voip_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء المتبع عندما يبلغ فحص شركة الاتصالات عن نوع خط
                    افتراضي — `voip` أو `isp` أو `vpn` (`phone.is_virtual`).
                    يحول `DECLINE` القيمة النهائية لـ `status` إلى `Declined`؛
                    ويسجل `NO_ACTION` الخطر في `phone.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    عندما تكون `true`، يتم أيضاً تشغيل استخبارات الهاتف على
                    الرقم: درجة المخاطر، ونوع الخط، وما إذا كان قد تم نقله
                    مؤخراً، ومؤشر الثقة. تتم الفوترة كوحدة
                    `phone_intelligence_api` واحدة لكل طلب ($0.05 بسعر القائمة)
                    بالإضافة إلى سعر endpoint هذا نفسه. يُرجع الطلب `403` عندما
                    لا يكفي رصيدك لتغطية التكلفة.
                  example: false
                phone_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء عند تجاوز درجة مخاطر معلومات الهاتف للحد المعين.
                    القيمة `DECLINE` تحول الـ `status` النهائي إلى `Declined`؛
                    والقيمة `NO_ACTION` تسجل الإشارة دون رفض. يسري مفعوله فقط
                    عندما يكون `enable_enrichment` مضبوطاً على `true`.
                phone_type_risk_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء عندما يكون الرقم من نوع خط عالي المخاطر. القيمة
                    `DECLINE` تحول الـ `status` النهائي إلى `Declined`؛ والقيمة
                    `NO_ACTION` تسجل الإشارة دون رفض. يسري مفعوله فقط عندما يكون
                    `enable_enrichment` مضبوطاً على `true`.
                recent_port_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء عند نقل الرقم إلى مشغل شبكة آخر مؤخراً. القيمة
                    `DECLINE` تحول الـ `status` النهائي إلى `Declined`؛ والقيمة
                    `NO_ACTION` تسجل الإشارة دون رفض. يسري مفعوله فقط عندما يكون
                    `enable_enrichment` مضبوطاً على `true`.
                low_phone_trust_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء عندما يكون مؤشر الثقة لمعلومات الهاتف مساوياً للحد
                    المعين أو أقل منه. القيمة `DECLINE` تحول الـ `status`
                    النهائي إلى `Declined`؛ والقيمة `NO_ACTION` تسجل الإشارة دون
                    رفض. يسري مفعوله فقط عندما يكون `enable_enrichment` مضبوطاً
                    على `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    عند التعيين على true، يتم أيضاً البحث عن الأثر الرقمي
                    الاجتماعي للرقم - منصات المراسلة والمنصات الاجتماعية
                    والتجارة الإلكترونية والمهنية المسجل عليها. يُفوتر كوحدة
                    `phone_social` واحدة لكل طلب بالإضافة إلى سعر هذا الـ
                    endpoint نفسه.
                  example: true
                phone_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    الإجراء عندما يجد فحص الأثر الاجتماعي أن الرقم غير مسجل على
                    أي من المنصات التي يغطيها. يُقبل فقط NO_ACTION وDECLINE في
                    هذا الـ endpoint؛ يتوفر REVIEW في مفتاح تهيئة سير العمل الذي
                    يحمل نفس الاسم.
              required:
                - phone_number
                - code
            examples:
              Default:
                summary: تسجيل أي مخاطر ولكن دون الرفض التلقائي مطلقاً
                value:
                  phone_number: '+14155552671'
                  code: '123456'
              Strict risk policy:
                summary: الرفض التلقائي لخطوط VoIP والخطوط المؤقتة
                value:
                  phone_number: '+14155552671'
                  code: '123456'
                  voip_number_action: DECLINE
                  disposable_number_action: DECLINE
      responses:
        '200':
          description: >-
            اكتمل التحقق — تُرجع الرموز الخاطئة وعمليات التحقق المفقودة أيضاً
            الرمز `200`؛ تحقّق من `status`، وليس رمز HTTP. يتم ملء `phone` فقط
            في النتائج النهائية (`Approved`/`Declined`)، ويكون `null` عند
            `Failed`، وغير موجود عند `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    رمز صحيح — تقرير هاتف كامل يتضمن شركة الاتصالات، ودورة
                    الحياة، والتطابقات
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    phone:
                      status: Approved
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: PHONE_DELIVERY_DELIVERED
                          timestamp: '2026-06-12T01:23:43.118220+00:00'
                          details:
                            channel: whatsapp
                            status: delivered
                          fee: 0
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Failed (attempts remaining):
                  summary: >-
                    رمز خاطئ — يمكن للمستخدم إعادة المحاولة؛ request_id هنا هو
                    UUID يستخدم لمرة واحدة
                  value:
                    request_id: 11111111-2222-3333-4444-555555555555
                    status: Failed
                    message: 'The verification code is incorrect. Attempts remaining: 2'
                    phone: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (max attempts):
                  summary: الرمز الخاطئ الثالث — تم إنهاء التحقق كـ Declined
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Declined
                    message: >-
                      The verification code is incorrect. Maximum attempts
                      reached.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: null
                      warnings:
                        - feature: PHONE
                          risk: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          additional_data: null
                          log_type: error
                          short_description: Verification code attempts exceeded
                          long_description: >-
                            The system detected that the phone number has
                            exceeded the maximum number of verification code
                            attempts.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:01.118220+00:00'
                          details:
                            code_tried: '111111'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:21.512340+00:00'
                          details:
                            code_tried: '222222'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '333333'
                            status: Failed
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Declined (risk policy):
                  summary: >-
                    رمز صحيح، لكن الخط يعمل بتقنية VoIP
                    وvoip_number_action=DECLINE
                  value:
                    request_id: 7f1c9d2e-44a1-4b6e-9a3e-5b8e6f1c2d3a
                    status: Declined
                    message: The verification code is correct.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '5005550006'
                      full_number: '+15005550006'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: CLEC LLC
                        type: voip
                      is_disposable: false
                      is_virtual: true
                      verification_method: sms
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: PHONE
                          risk: VOIP_NUMBER_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: VoIP number detected
                          long_description: >-
                            The system detected that the phone number is a VoIP
                            number, which is not allowed.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: sms
                          fee: 0.0509
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VOIP_NUMBER_DETECTED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Expired or Not Found:
                  summary: لا توجد عملية تحقق معلقة لهذا الرقم خلال آخر 5 دقائق
                  value:
                    request_id: 69cc35c6-280a-47a6-ab8c-4f32abc02ed0
                    status: Expired or Not Found
                    message: No pending phone verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:47.311323+00:00'
        '400':
          description: >-
            خطأ في التحقق من الصحة — غلاف أخطاء الحقول الخاص بـ DRF: مصفوفة
            رسائل واحدة لكل حقل مخالف.
          content:
            application/json:
              examples:
                Invalid code format:
                  summary: '`code` ليس مكونًا من 4–8 أرقام'
                  value:
                    code:
                      - Invalid code format. Enter 4 to 8 numeric digits.
                Invalid phone number:
                  summary: '`phone_number` ليس بتنسيق E.164 صالح'
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Invalid action:
                  summary: تقبل إجراءات المخاطر NO_ACTION أو DECLINE فقط
                  value:
                    voip_number_action:
                      - '"REVIEW" is not a valid choice.'
        '403':
          description: >-
            تم رفض الإذن. يُرجع عند فقدان الرأس `x-api-key`؛ ويُرجع المفتاح
            الخاطئ أو الملغى أو منتهي الصلاحية `401`. عمليات الفحص مجانية، لذا
            لا يوجد فحص للرصيد هنا.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: لا يوجد رأس `x-api-key`، أو أن المفتاح غير صالح/ملغى
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            تم تجاوز حد المعدل. تشترك نقاط endpoint الخاصة بـ POST/PATCH/DELETE
            في ميزانية قدرها 300 طلب كتابة في الدقيقة لكل مفتاح API (إنشاء
            المعاملات واستيعاب الأحداث لهما ميزانية منفصلة تبلغ 600). بالإضافة
            إلى ذلك، يُطبق على مستوى المنبع حد أقصى لمكافحة إساءة الاستخدام يبلغ
            4 محاولات تحقق لكل رقم هاتف في الساعة. تتضمن الاستجابة رؤوس
            `X-RateLimit-Limit` و`X-RateLimit-Remaining` و`X-RateLimit-Reset`
            و`Retry-After`. ملاحظة: ترافق رؤوس `X-RateLimit-*`/`Retry-After` فقط
            استجابة 429 الخاصة بحد الكتابة البالغ 300/دقيقة؛ بينما لا تتضمن
            استجابة 429 للحد الأقصى لكل رقم أي رؤوس لحد المعدل.
          content:
            application/json:
              examples:
                Per-number cap:
                  summary: أكثر من 4 محاولات تحقق لنفس الرقم خلال الساعة الماضية
                  value:
                    detail: >-
                      Maximum verification attempts reached for this phone
                      number. Only 4 authentication attempts are allowed per
                      hour. Try again later or use a different number.
                Write rate limit exceeded:
                  summary: أكثر من 300 طلب كتابة في الدقيقة الحالية
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '500':
          description: >-
            فشل غير متوقع أثناء التحقق من الرمز في الخدمة upstream وليس بسبب
            انقطاع معروف لدى المزود. يمكن إعادة المحاولة بأمان؛ لا تُستهلك
            ميزانية المحاولات إلا من خلال عمليات الفحص المكتملة.
          content:
            application/json:
              examples:
                Provider error:
                  summary: تعذّر إكمال التحقق من الرمز
                  value:
                    detail: Error checking phone verification
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '502':
          description: >-
            مزود التحقق من رقم الهاتف غير متاح مؤقتاً - استجابة 5xx، أو انتهاء
            المهلة، أو فشل في الاتصال تعذر حله بعد محاولات إعادة المحاولة
            المدمجة. من الآمن إعادة المحاولة؛ لم تُستهلك ميزانية المحاولات.
          content:
            application/json:
              examples:
                Provider outage:
                  summary: لم يجب المزود على طلب الفحص
                  value:
                    detail: >-
                      Phone verification is temporarily unavailable. Please try
                      again shortly.
                    code: phone_provider_unavailable
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/phone/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "code": "123456",
                "voip_number_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.check_code(
                phone_number="+14155552671",
                code="123456",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.phone.checkCode({
              phone_number: "+14155552671",
              code: "123456",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tCode:        \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.PhoneCheckCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .code("123456")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->phone->checkCode([
                'phone_number' => '+14155552671',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.phone.check_code(
              phone_number: "+14155552671",
              code: "123456"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Phone.CheckCodeAsync(new
            PhoneCheckCodeParams

            {
                PhoneNumber = "+14155552671",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationCheckResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            عند `Approved`/`Declined`: معرّف الجلسة لعملية التحقق المتطابقة —
            مطابق لـ `request_id` المُرجع بواسطة `POST /v3/phone/send/`. عند
            `Failed` و`Expired or Not Found`: معرّف UUID عشوائي لمرة واحدة لا
            يمكن البحث عنه لاحقاً.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — رمز صحيح، دون وجود مخاطر تؤدي إلى الرفض. `Declined` —
            نهائية: تطابقت مخاطر تؤدي إلى الرفض أو استُنفد الحد المسموح به من
            المحاولات (3). `Failed` — رمز خاطئ، مع بقاء محاولات متبقية. `Expired
            or Not Found` — لا توجد عملية تحقق معلقة لهذا الرقم خلال آخر 5
            دقائق.
        message:
          type: string
          description: >-
            تفسير سهل القراءة للنتيجة، بما في ذلك عدد المحاولات المتبقية بعد
            إدخال رمز خاطئ.
        phone:
          type: object
          nullable: true
          description: >-
            تقرير الهاتف الكامل. يتواجد (غير فارغ non-null) فقط في النتائج
            النهائية (`Approved`/`Declined`)؛ ويكون `null` في حالة `Failed` وغير
            موجود في حالة `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                الحالة النهائية للتحقق من رقم الهاتف. تطابق `status` على المستوى
                الأعلى لعمليات الفحص المكتملة.
            phone_number_prefix:
              type: string
              description: رمز الاتصال بالدولة مسبوقاً بـ `+` (مثل `+1`).
              example: '+1'
            phone_number:
              type: string
              description: الرقم الوطني بدون رمز الاتصال الدولي للدولة.
              example: '4155552671'
            full_number:
              type: string
              description: الرقم الكامل بتنسيق E.164.
              example: '+14155552671'
            country_code:
              type: string
              nullable: true
              description: دولة الرقم وفق المعيار ISO 3166-1 alpha-2.
              example: US
            country_name:
              type: string
              description: اسم الدولة الكامل المشتق من `country_code`.
              example: United States
            carrier:
              type: object
              description: >-
                الشبكة الحالية التي تخدم الرقم، من البحث عن شركة الاتصالات الذي
                تم إجراؤه عند الإنهاء.
              properties:
                name:
                  type: string
                  description: >-
                    اسم شركة الاتصالات. سلسلة نصية فارغة إذا لم يتمكن البحث من
                    تحديدها.
                type:
                  type: string
                  description: >-
                    نوع الخط الوارد من البحث: `mobile`، أو `fixed_line`، أو
                    `voip`، أو `isp`، أو `vpn`، أو `toll_free`، أو
                    `premium_rate`، أو `pager`، أو `payphone`، أو `satellite`،
                    أو `service`، أو `shared_cost`، أو `short_codes_commercial`،
                    أو `calling_cards`، أو `local_rate`، أو `universal_access`،
                    أو `voice_mail`، أو `other`، أو `unknown`.
            is_disposable:
              type: boolean
              description: >-
                تكون `true` عندما ينتمي الرقم إلى خدمة أرقام مؤقتة أو مخصصة
                للاستخدام لمرة واحدة.
            is_virtual:
              type: boolean
              description: >-
                تكون `true` عندما يكون نوع الخط افتراضيًا (`voip` أو `isp` أو
                `vpn`).
            verification_method:
              type: string
              description: >-
                القناة التي سلّمت الرمز لمرة واحدة بالفعل بمجرد تأكيد التسليم
                (مثل `whatsapp`، `sms`)؛ وحتى ذلك الحين، تكون القناة المطلوبة.
            verification_attempts:
              type: integer
              description: >-
                عدد مرات إرسال رمز OTP لعملية التحقق هذه (1، أو 2 بعد إعادة
                المحاولة).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                وقت إدخال الرمز الصحيح. تكون القيمة `null` إذا لم تتم الموافقة
                على التحقق مطلقاً.
            warnings:
              type: array
              description: >-
                تحذيرات المخاطر المسجلة أثناء التحقق (مكرر، أو قابل للتخلص منه،
                أو VoIP، أو تجاوز المحاولات، أو قائمة الحظر، وما إلى ذلك).
                مصفوفة فارغة في حال عدم وجود أي منها.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: الميزة التي أطلقت التحذير. دائماً `PHONE` هنا.
                  risk:
                    type: string
                    description: رمز مخاطر مقروء آلياً.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      السياق الخاص بالمخاطر (على سبيل المثال، معرّف الجلسة
                      المكررة للمخاطر المكررة). يكون `null` عندما لا تتضمن
                      المخاطر أي بيانات إضافية.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      مستوى الخطورة. تؤدي مخاطر `error` إلى رفض عملية التحقق،
                      وتضع `warning` علامة عليها للمراجعة، ويتم تسجيل
                      `information` دون التأثير على الحالة.
                  short_description:
                    type: string
                    description: ملخص للمخاطر في سطر واحد مقروء للبشر.
                  long_description:
                    type: string
                    description: تفسير سهل القراءة للمخاطر.
            lifecycle:
              type: array
              description: >-
                سجل تدقيق زمني لعملية التحقق. يكون `type` الخاص بالحدث أحد القيم
                التالية: `PHONE_VERIFICATION_MESSAGE_SENT`، أو
                `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`، أو
                `PHONE_VERIFICATION_BLOCKED`، أو `PHONE_DELIVERY_DELIVERED`، أو
                `PHONE_DELIVERY_UNDELIVERABLE`، أو `VALID_CODE_ENTERED`، أو
                `INVALID_CODE_ENTERED`، أو `PHONE_VERIFICATION_APPROVED`، أو
                `PHONE_VERIFICATION_DECLINED`، أو
                `PHONE_VERIFICATION_IN_REVIEW`، أو `PHONE_VERIFICATION_EXPIRED`.
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: نوع الحدث.
                  timestamp:
                    type: string
                    format: date-time
                    description: وقت وقوع الحدث.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      الـ payload الخاص بالحدث. أحداث الإرسال: `{status, reason,
                      channel, actual_channel}` (يتم ملء `actual_channel` بمجرد
                      تأكيد التسليم). أحداث التسليم: `{channel, status}`. أحداث
                      إدخال الرمز: `{code_tried, status}`. أحداث الحالة
                      النهائية: `null`، أو `{reason}` عندما تكون مرفوضة أو قيد
                      المراجعة.
                  fee:
                    type: number
                    description: >-
                      المبلغ بالدولار الأمريكي المفوتر لهذا الحدث. لا يكون صفراً
                      إلا في أحداث الإرسال (سعر التسليم)؛ ويكون 0 لإدخالات الرمز
                      وتأكيدات التسليم وأحداث الحالة.
            matches:
              type: array
              description: >-
                جلسات أخرى لتطبيقك (KYC أو KYB أو API) حيث تم استخدام رقم الهاتف
                نفسه بواسطة مستخدم مختلف (`vendor_data` مختلفة). حتى 5 مدخلات،
                وتكون مطابقة قائمة الحظر لمدخل القائمة الاصطناعي أولاً عند
                وجودها (تحتفظ التطابقات المشتقة من الجلسة بترتيب الاستعلام).
                مصفوفة فارغة عند عدم وجود أي تطابقات.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      معرّف الجلسة لعملية التحقق الأخرى التي استخدمت رقم الهاتف
                      هذا.
                  session_number:
                    type: integer
                    description: رقم تسلسلي سهل القراءة لتلك الجلسة.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` لتلك الجلسة.'
                  verification_date:
                    type: string
                    description: وقت إنشاء تلك الجلسة (`YYYY-MM-DDTHH:MM:SSZ`).
                  phone_number:
                    type: string
                    description: رقم الهاتف المتطابق.
                  status:
                    type: string
                    description: >-
                      حالة تلك الجلسة (مثل `Approved`، `Declined`، `In
                      Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      ما إذا كان رقم الهاتف موجوداً في قائمة الحظر الخاصة
                      بتطبيقك.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      بالنسبة للجلسات من نوع API، واجهة API المستقلة التي
                      أنشأتها (مثل `PHONE_VERIFICATION`)؛ و `null` لجلسات التحقق
                      العادية.
                  source:
                    type: string
                    description: >-
                      مكان العثور على التطابق. عادةً ما يكون `session`؛ وإذا حدث
                      تطابق مع قائمة الحظر عبر إدخال في قائمة تابعة للمؤسسة،
                      يُضاف في البداية تطابق اصطناعي يحتوي على `source:
                      "list_entry"` وقيمة null لكل من
                      `session_id`/`session_number`.
            phone_social:
              $ref: '#/components/schemas/PhoneSocialFootprint'
            phone_intelligence:
              allOf:
                - $ref: '#/components/schemas/PhoneIntelligence'
              description: >-
                إشارات معلومات الهاتف. تتوفر فقط عندما تكون قيمة
                `enable_enrichment` هي `true` في الفحص.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` لجلسة التحقق المطابقة. وتكون `null` عند `Expired or
            Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` لجلسة التحقق المتطابقة. `null` عند `Expired or Not
            Found`.
        created_at:
          type: string
          format: date-time
          description: الطابع الزمني لاستجابة هذا الفحص.
    PhoneSocialFootprint:
      type: object
      nullable: true
      description: >-
        البصمة الاجتماعية لرقم الهاتف: المنصات الإلكترونية المسجل عليها. تظهر
        فقط عند تعيين `enable_social` واكتمال الفحص. قد يكون كل عدد null عندما
        لا يتم إرجاع أي بيانات له. تعني `profiles_registered: 0` أنه تم فحص
        المنصات ولم يتم العثور على رقم الهاتف في أي منها - وهي إجابة صالحة
        وخاضعة للفوترة وإشارة شائعة للهوية الاصطناعية.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: المنصات التي تم تأكيد تسجيل رقم الهاتف فيها.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: المنصات التي تم تقييمها للتسجيل.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: المنصات التي أرجعت اسماً مرتبطاً.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: المنصات التي أرجعت صورة للملف الشخصي.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: منصات التواصل التي تم اكتشاف وجود المستخدم فيها.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: فئات منصات مميزة مع تواجد تم اكتشافه.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: مؤشر النضج الرقمي المركب، من 0 إلى 10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: مؤشر ثراء الملف التعريفي، من 0 إلى 10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: مزيج المنصات المجانية مقابل المدفوعة، من 0 إلى 10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: التسجيلات على المنصات المجانية.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: التسجيلات على المنصات المدفوعة بالكامل.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: التسجيلات على المنصات المجانية جزئيًا.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            مدى اكتمال الملف التعريفي على WhatsApp. للهاتف فقط؛ وتكون القيمة
            فارغة (null) للبريد الإلكتروني.
          example: Partial
        registered_platforms:
          type: array
          description: المنصات التي تم تأكيد التسجيل فيها.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: المنصات التي تم فحصها وكانت النتيجة سلبية.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: عدد التسجيلات ونسبتها حسب فئة المنصة.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            تفاصيل الملف التعريفي لكل منصة، مفهرسة بحسب المنصة، عندما توفرها
            المنصة.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    PhoneIntelligence:
      type: object
      description: >-
        كتلة معلومات الهاتف المعيارية. تظهر فقط عند تشغيل الوظيفة الإضافية
        للمعلومات لعملية البحث هذه؛ وعند ظهورها يتم عرضها أيضاً تحت الاسم
        المستعار `enrichment` بنفس القيم.
      properties:
        score:
          type: number
          nullable: true
          description: درجة مخاطر معيارية من 0 إلى 100. تشير القيمة الأعلى إلى مخاطر أكبر.
        phone_type_risk:
          type: string
          nullable: true
          description: '`Low` أو `Medium` أو `High`، مشتقة من الدرجة.'
        phone_trust_index:
          type: number
          nullable: true
          description: >-
            معكوس الدرجة، للوحات التحكم التي تفضل أن تكون القيمة الأعلى هي
            الأفضل.
        network_stability_index:
          type: number
          nullable: true
          description: استقرار شبكة الخط.
        is_disposable:
          type: boolean
          nullable: true
          description: >-
            تكون `true` عندما يبدو الرقم مخصصاً للاستخدام لمرة واحدة أو
            افتراضياً.
        is_ported:
          type: boolean
          nullable: true
          description: تكون `true` عندما يكون الرقم قد غيّر مشغّل شبكة الجوال.
        is_recently_ported:
          type: boolean
          nullable: true
          description: تكون `true` عندما تكون عملية نقل الرقم قد تمت مؤخراً.
        carrier_type:
          type: string
          nullable: true
          description: تصنيف الخط الوارد من البحث (مثل `mobile`).
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  معرّف Didit الثابت للإشارة، على سبيل المثال `IR-5AC67A32`. غير
                  قابل للتفسير: قم بالتجميع والتصفية بناءً عليه، ولا تقم بتحليله
                  برمجياً.
              value:
                nullable: true
                description: >-
                  لعلامة المخاطر (على سبيل المثال `voip`، `leaked`،
                  `disposable`، `spam_trap`)، قيمتها: قيمة منطقية أو مستوى أو
                  تاريخ. Null لرمز سبب تم احتساب درجاته.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: >-
                  ما إذا كانت الإشارة قد رفعت مستوى المخاطر أو زادت من درجة
                  الثقة.
              message:
                type: string
                description: تفسير سهل القراءة للإشارة، باللغة الإنجليزية.
              impact_level:
                type: string
                nullable: true
                description: >-
                  مدى تأثير الإشارة في تغيير الدرجة، على سبيل المثال `low` أو
                  `medium` أو `high`.
          description: >-
            الإشارات التي تفسر الدرجة، لكل منها رمز Didit ثابت، واتجاه، ورسالة،
            ومستوى تأثير. يمكن أن تظهر رموز جديدة بمرور الوقت، لذا لا ترفض
            الرموز غير المعروفة.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: معرّف المنصة.
          example: whatsapp
        category:
          type: string
          description: >-
            فئة المنصة، مثل MESSAGING أو SOCIAL_MEDIA أو ECOMMERCE أو
            PROFESSIONAL أو EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: '`global` للمنصات العالمية، و`local` للمنصات الخاصة بمنطقة معينة.'
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: المنصات في هذه الفئة التي تم تأكيد التسجيل فيها.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: حصة المنصات المفحوصة في الفئة التي تحتوي على تسجيل، 0.0-1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: اسم الملف التعريفي، إذا وفرته المنصة.
        photo:
          type: string
          nullable: true
          description: رابط الصورة الشخصية للملف التعريفي، إذا وفرته المنصة.
        about:
          type: string
          nullable: true
          description: نص النبذة التعريفية للملف التعريفي، إذا وفرته المنصة.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: مستوى رؤية الملف التعريفي، إذا وفرته المنصة.
        business_account:
          type: boolean
          nullable: true
          description: ما إذا كان الملف الشخصي حساب شركة، عندما تكشفه المنصة.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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