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

> أرسل رمز لمرة واحدة عبر SMS بواسطة Didit عبر POST /v3/phone/send/. إعادة محاولة للأرقام المحظورة، صلاحية 5 دقائق، دفع حسب الاستخدام.

## إدراج اسم علامتك التجارية في الرسالة النصية

تحمل رموز SMS اسم مرسل الرسائل النصية الخاص بتطبيقك، والذي يُضبط في Business Console، دون أي تكلفة إضافية:

> 123456 هو رمز التحقق الخاص بك لدى **Acme Bank**

لإرسال رمز واحد باسم مختلف، مرّر `options.sms_sender_name` (من 1 إلى 30 حرفًا: أحرف وأرقام ومسافات والرموز ' & - ! فقط، ولا يجوز أن يتكون من أرقام فقط):

```json theme={null}
{
  "phone_number": "+14155552671",
  "options": {
    "preferred_channel": "sms",
    "sms_sender_name": "Acme Bank"
  }
}
```

أي اسم يخرج عن هذه القواعد يُرجع `400` ولا يُرسل أي رمز.
لا تحمل رموز WhatsApp علامة تجارية، لأنها تستخدم رسالة ثابتة. اربط رقم WhatsApp Business الخاص بك في Business Console لإرسالها باسم شركتك. انظر [إرسال رموز WhatsApp من رقمك الخاص](https://docs.didit.me/ar/core-technology/phone-verification/overview.md#إرسال-رموز-whatsapp-من-رقمك-الخاص).
انظر [رسائل التحقق المُعلَّمة بالعلامة التجارية](https://docs.didit.me/ar/core-technology/phone-verification/overview.md#رسائل-التحقق-التي-تحمل-علامتك-التجارية) لمعرفة الاسم الذي يحمله كل رمز، وحد الاستخدام اليومي للأسماء الجديدة.

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

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

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

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


## OpenAPI

````yaml ar/openapi-25.json POST /v3/phone/send/
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/send/:
    post:
      tags:
        - Standalone APIs
      summary: إرسال رمز عبر الهاتف
      description: >-
        أرسل رمزاً لمرة واحدة (OTP) إلى رقم هاتف عبر WhatsApp أو SMS أو أي قناة
        مدعومة أخرى، ثم تحقق منه باستخدام [`POST
        /v3/phone/check/`](/ar/standalone-apis/phone-check).


        **كيفية الربط بين الإرسال والتحقق.** تعتمد حالة التحقق على التطبيق الخاص
        بك بالإضافة إلى `phone_number` بصيغة E.164 — ولا يتطلب استدعاء التحقق
        `request_id`. ينشئ كل إرسال جديد عملية تحقق معلقة تظل صالحة لمدة **5
        دقائق**: استدعِ التحقق بنفس الرقم والرمز الذي استلمه المستخدم قبل إغلاق
        هذه النافذة الزمنية. يؤدي استدعاء الإرسال مرة أخرى لنفس الرقم أثناء وجود
        عملية تحقق معلقة إلى إعادة إرسال رمز لنفس عملية التحقق تلك (`status:
        "Retry"`، ونفس `request_id`). يتم إرفاق إعادة محاولة واحدة كحد أقصى بهذه
        الطريقة (إجمالي عمليتي إرسال)؛ وأي إرسال إضافي يبدأ عملية تحقق جديدة
        بـ`request_id` جديد. تُحسب نافذة الـ 5 دقائق من وقت الإرسال الأول ولا
        يتم تمديدها بواسطة عمليات إعادة المحاولة.


        **قنوات التسليم.** يحدد `options.preferred_channel` القناة (`whatsapp`
        افتراضياً؛ كما يتم دعم `sms` و`telegram` و`voice` و`rcs` و`viber`
        و`zalo`). عندما تكون القناة المفضلة غير متوفرة للدولة الوجهة أو للرقم،
        ينتقل التسليم تلقائياً إلى SMS — ويظل الإرسال يُبلغ عن حالة `Success`،
        بينما تظهر القناة الفعلية المستخدمة في استجابة التحقق
        (`phone.verification_method` وأحداث `lifecycle`).


        **الهوية البصرية.** تحمل رموز SMS اسم مرسل SMS الخاص بتطبيقك، والذي تم
        تعيينه في Business Console، دون أي تكلفة إضافية. مرر
        `options.sms_sender_name` لتوقيع رمز واحد باسم آخر، أو
        `options.use_white_label_customization: true` للاعتماد على اسم العلامة
        البيضاء العام الخاص بك في حال عدم تعيين اسم مرسل. تستخدم رموز WhatsApp
        رسالة ثابتة؛ اربط رقم WhatsApp Business الخاص بك في Business Console
        لإرسالها باسم شركتك ورقمها، لتتم الفوترة وفقاً لرسوم Didit فقط.


        **حالات الإرسال.** `Success` — تم إرسال OTP لعملية تحقق جديدة؛ `Retry` —
        أُعيد إرسال OTP لعملية التحقق المعلقة؛ `Blocked` — رفضت طبقة مكافحة
        الاحتيال الإرسال (راجع `reason`، مثل `repeated_attempts`، `suspicious`،
        `spam`). يؤدي الإرسال بحالة `Blocked` إلى إنهاء التحقق فوراً كـ
        `Declined` مع تحذير عالي المخاطر، وبالتالي فإن التحقق اللاحق يُرجع
        `Expired or Not Found`.


        **الفوترة.** يعتمد السعر على الدولة الوجهة والقناة التي تُسلّم الرسالة
        فعلياً — راجع [أسعار التحقق من رقم
        الهاتف](/ar/getting-started/phone-verification-pricing). الإرسال بحالة
        `Blocked` فقط هو المجاني دائماً: أي محاولة إرسال أخرى غير مفوترة يتم
        احتساب تكلفتها عند إنهاء التحقق أو انتهاء صلاحيته، حتى لو لم يتم تأكيد
        التسليم مطلقاً أو أبلغ مزود التسليم بتعذر تسليم الرسالة. عمليات التحقق
        مجانية دائماً. كإجراء لمكافحة إساءة الاستخدام، يتم تعطيل التحقق من رقم
        الهاتف حتى أول شحن للرصيد لمؤسستك (`403`).


        **استمرار الجلسة.** يتم حفظ كل عملية تحقق جديدة كجلسة من نوع API: يمثل
        `request_id` معرف جلسة حقيقياً يمكنك تمريره إلى `GET
        /v3/session/{sessionId}/decision/`، ويظهر التحقق في Business Console،
        وتنطلق أحداث webhook الخاصة بـ `status.updated` مع تقدم العملية.


        **البيئة التجريبية.** تتخطى مفاتيح API الخاصة بالبيئة التجريبية عمليتي
        التسليم والفوترة: بعد التحقق من صحة الطلب (المدخلات غير الصحيحة لا تزال
        تُرجع `400`)، يُرجع endpoint payload ثابتاً بالحالة `Success` مع
        `request_id` عشوائي؛ ولا يتم إرسال أي رسالة ولا يتم حفظ أي شيء. استخدم
        الرمز `123456` في التحقق ضمن البيئة التجريبية.


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


        **حدود المعدل.** ميزانية كتابة مشتركة تبلغ 300 طلب/دقيقة لكل مفتاح API
        عبر جميع endpoints الخاصة بـ POST/PATCH/DELETE، بالإضافة إلى حد أقصى
        لمكافحة إساءة الاستخدام يبلغ 4 محاولات إرسال لكل رقم هاتف في الساعة؛
        وتجاوز أي منهما يُرجع `429`.
      operationId: post_v3phone_send
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    رقم هاتف المستلم بتنسيق E.164 — يبدأ بعلامة `+` ورمز الدولة
                    (مثال: `+14155552671`). يتم التحقق من صحة الأرقام وتوحيد
                    تنسيقها إلى E.164؛ وتؤدي الأرقام غير القابلة للتحليل أو غير
                    الصالحة إلى إرجاع الرمز `400` مع خطأ في الحقل
                    `phone_number`.
                  example: '+14155552671'
                options:
                  type: object
                  description: خيارات تسليم رمز لمرة واحدة. جميع الحقول اختيارية.
                  properties:
                    code_size:
                      type: integer
                      minimum: 4
                      maximum: 8
                      default: 6
                      description: عدد الأرقام في رمز OTP.
                    locale:
                      type: string
                      maxLength: 5
                      pattern: ^[a-z]{2,3}(-[A-Z]{2,3})?$
                      description: >-
                        رمز BCP-47 اللغوي المستخدم لترجمة رسالة التحقق محليًا
                        (مثل `en-US`، و`fr`، و`es`). تُرجع التنسيقات غير الصالحة
                        `400`.
                      example: en-US
                    preferred_channel:
                      type: string
                      enum:
                        - whatsapp
                        - sms
                        - telegram
                        - voice
                        - rcs
                        - viber
                        - zalo
                      default: whatsapp
                      description: >-
                        قناة التسليم المفضلة. إذا كانت القناة غير متوفرة لدولة
                        الوجهة أو الرقم، تتراجع الرسالة تلقائياً إلى الرسائل
                        القصيرة (SMS) — مع استمرار الإبلاغ عن الإرسال كـ
                        `Success`.
                    use_white_label_customization:
                      type: boolean
                      default: false
                      description: >-
                        عندما تكون `true`، يتم الإرسال بالعلامة البيضاء: إذا لم
                        يكن لتطبيقك اسم مرسل لرسائل SMS، فستذكر رسالة SMS اسمك
                        العام للعلامة البيضاء بدلاً من ذلك ("123456 هو رمز
                        التحقق الخاص بك لـ Acme Bank"). عند تعيين اسم مرسل SMS
                        الخاص بك، يُستخدم مع هذه العلامة أو بدونها. ينطبق على
                        رسائل SMS، بما في ذلك الرجوع التلقائي إلى SMS من قناة
                        أخرى؛ تُرسل رموز WhatsApp برسالة ثابتة ولا تحمل علامة
                        تجارية. القيمة الافتراضية هي `false`.
                    sms_sender_name:
                      type: string
                      nullable: true
                      maxLength: 30
                      example: Acme Bank
                      description: >-
                        الاسم الذي تحمله الرسالة النصية القصيرة SMS لهذا الرمز
                        ("123456 هو رمز التحقق الخاص بك لـ Acme Bank")، بدلاً من
                        اسم مرسل الرسائل القصيرة لتطبيقك. مجاناً. من 1 إلى 30
                        حرفاً: حروف وأرقام ومسافات و' & - ! فقط، وليس أرقاماً
                        فقط، مع مسافات مفردة بين الكلمات؛ يؤدي إرسال أي قيمة
                        أخرى إلى إرجاع `400` وعدم إرسال الرمز. في حال إغفاله أو
                        تعيينه كـ `null` أو تركه فارغاً، يُستخدم اسم مرسل
                        الرسائل القصيرة لتطبيقك. يمكن لكل تطبيق البدء في استخدام
                        ما يصل إلى اسمين جديدين يومياً (UTC)؛ وبعد ذلك، يُرسل
                        الرمز باسم تطبيقك. ينطبق على رسائل SMS، بما في ذلك
                        الاحتياط إلى SMS من قناة أخرى؛ لا تحمل رموز WhatsApp أي
                        علامة تجارية.
                      pattern: ^$|^(?![\d ]+$)[\p{L}\p{N}'&!-]+( [\p{L}\p{N}'&!-]+)*$
                signals:
                  type: object
                  description: >-
                    إشارات اختيارية للجهاز والشبكة حول المستخدم النهائي، تُمرَّر
                    إلى طبقة مكافحة الاحتيال لتحسين اكتشاف حركة المرور المسيئة
                    أو الآلية. جميع الحقول اختيارية.
                  properties:
                    ip:
                      type: string
                      description: عنوان IP لجهاز المستخدم النهائي. IPv4 أو IPv6.
                      example: 192.0.2.1
                    device_id:
                      type: string
                      maxLength: 255
                      description: >-
                        المعرّف الفريد لجهاز المستخدم النهائي. نظام Android:
                        `ANDROID_ID`؛ نظام iOS: `identifierForVendor`.
                      example: 8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2
                    device_platform:
                      type: string
                      enum:
                        - android
                        - ios
                        - ipados
                        - tvos
                        - web
                      description: منصة جهاز المستخدم النهائي.
                    device_model:
                      type: string
                      maxLength: 255
                      description: طراز جهاز المستخدم النهائي.
                      example: iPhone17,2
                    os_version:
                      type: string
                      maxLength: 64
                      description: إصدار نظام التشغيل لجهاز المستخدم النهائي.
                      example: 18.0.1
                    app_version:
                      type: string
                      maxLength: 64
                      description: إصدار تطبيقك.
                      example: 1.2.34
                    user_agent:
                      type: string
                      maxLength: 512
                      description: وكيل المستخدم لمتصفح المستخدم النهائي أو تطبيقه.
                      example: >-
                        Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X)
                        AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3
                        Mobile/15E148 Safari/604.1
                vendor_data:
                  type: string
                  description: >-
                    معرّف اختياري يتحكم فيه المتصل (معرّف المستخدم الداخلي لديك،
                    أو بريد إلكتروني، أو UUID، وما إلى ذلك) يُحفظ في الجلسة
                    ويُعاد في استجابة الإرسال، واستجابة فحص التطابق، وwebhook،
                    وBusiness Console. استخدمه لربط `request_id` الخاص بـ Didit
                    بسجل المستخدم لديك.
                metadata:
                  type: object
                  nullable: true
                  description: >-
                    كائن JSON اختياري حرّ التنسيق يُحفظ في الجلسة ويُعاد في
                    استجابة الإرسال، واستجابة فحص المطابقة، وwebhooks، وBusiness
                    Console.
              required:
                - phone_number
            examples:
              WhatsApp (default):
                summary: >-
                  رمز OTP مكوّن من 6 أرقام عبر WhatsApp، مع الرجوع التلقائي إلى
                  SMS
                value:
                  phone_number: '+14155552671'
                  options:
                    preferred_channel: whatsapp
                    locale: en-US
                  vendor_data: user-1234
              SMS with custom code length:
                summary: فرض التسليم عبر SMS برمز مكون من 4 أرقام
                value:
                  phone_number: '+34699999999'
                  options:
                    preferred_channel: sms
                    code_size: 4
                    locale: es
              With fraud signals:
                summary: إعادة توجيه إشارات الجهاز لتعزيز فحص مكافحة الاحتيال
                value:
                  phone_number: '+14155552671'
                  signals:
                    ip: 192.0.2.1
                    device_id: 8F0B8FDD-C2CB-4387-B20A-56E9B2E5A0D2
                    device_platform: ios
                    device_model: iPhone17,2
                    os_version: 18.0.1
                    app_version: 1.2.34
                  vendor_data: user-1234
      responses:
        '200':
          description: >-
            تم تأكيد استلام الإرسال. تحقق من `status`: تشير `Success` و`Retry`
            إلى أن الرمز في طريقه للإرسال؛ بينما تعني `Blocked` أن طبقة مكافحة
            الاحتيال قد رفضت العملية وأنه قد تم إنهاء التحقق مسبقاً بحالة
            `Declined`. تمثل `request_id` معرف الجلسة المحفوظ (نفس المعرف عند
            استخدام `Retry`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneVerificationSendResponse'
              examples:
                Success:
                  summary: تم إرسال رمز لمرة واحدة لعملية تحقق جديدة
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Success
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Retry:
                  summary: >-
                    الإرسال الثاني للرقم نفسه خلال نافذة الـ 5 دقائق — نفس
                    request_id
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Retry
                    reason: null
                    vendor_data: user-1234
                    metadata: null
                Blocked:
                  summary: >-
                    رفض لمكافحة الاحتيال — تم إنهاء التحقق بحالة مرفوضة، ولم تتم
                    فوترة أي شيء
                  value:
                    request_id: 0d8af1f4-0c43-46d7-b75c-6e4e22c0a7b3
                    status: Blocked
                    reason: repeated_attempts
                    vendor_data: user-1234
                    metadata: null
        '400':
          description: >-
            خطأ في التحقق. تُرجع المدخلات المشوهة غلاف أخطاء الحقول الخاص بـ DRF
            (مصفوفة واحدة من الرسائل لكل حقل مخالف، متداخلة تحت `options`
            بالنسبة لأخطاء الخيارات). أما الرقم الذي يتم تحليله بنجاح ولكن يُرفض
            في وقت الإرسال (غير قابل للوصول، أو نوع خط غير مؤهل مثل الرمز
            القصير) فيُرجع غلاف `{"detail": ...}` بدلاً من ذلك.
          content:
            application/json:
              examples:
                Invalid phone number (field error):
                  summary: الرقم غير صالح بتنسيق E.164
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Missing phone number:
                  summary: '`phone_number` غير مدرج في نص الطلب'
                  value:
                    phone_number:
                      - This field is required.
                Invalid options:
                  summary: >-
                    قيمة `code_size` خارج النطاق، أو `locale` غير صالحة، أو
                    `preferred_channel` غير معروفة
                  value:
                    options:
                      code_size:
                        - Ensure this value is less than or equal to 8.
                      locale:
                        - Ensure this field has no more than 5 characters.
                      preferred_channel:
                        - '"carrier_pigeon" is not a valid choice.'
                Number rejected at send time:
                  summary: تنسيق E.164 صالح ولكن الرقم لا يمكنه تلقي OTP
                  value:
                    detail: Invalid phone number provided.
                Ineligible line type:
                  summary: >-
                    نوع الخط لا يمكنه استقبال رمز لمرة واحدة (OTP) (مثل الرموز
                    القصيرة)
                  value:
                    detail: Invalid phone line type provided.
        '403':
          description: >-
            تم رفض الإذن. يُرجع عند فقدان الرأس `x-api-key` (`{"detail": ...}`)؛
            ويُرجع المفتاح الخاطئ أو الملغى أو منتهي الصلاحية `401`. يُرجع أيضاً
            قبل أي إرسال عندما لا تكون المؤسسة قد قامت بشحن الرصيد من قبل (بوابة
            مكافحة سوء الاستخدام) أو عندما لا يغطي رصيدها سعر الإرسال إلى الوجهة
            (`{"error": ...}`).
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: لا يوجد رأس `x-api-key`، أو أن المفتاح غير صالح/ملغى
                  value:
                    detail: You do not have permission to perform this action.
                Top-up required:
                  summary: >-
                    يظل التحقق من رقم الهاتف معطلاً حتى أول عملية شحن رصيد
                    للمؤسسة
                  value:
                    detail: >-
                      To protect against abuse, phone verification is disabled
                      until your first top-up.
                Not enough credits:
                  summary: رصيد المؤسسة لا يمكنه تغطية سعر الإرسال
                  value:
                    error: You don't have enough credits to perform this request.
        '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: >-
            فشل غير متوقع أثناء إنشاء التحقق وليس بسبب انقطاع معروف لدى المزود.
            يمكن إعادة المحاولة بأمان.
          content:
            application/json:
              examples:
                Provider error:
                  summary: تعذر بدء تسليم رمز لمرة واحدة
                  value:
                    detail: Error creating 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/send/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "options": {
                  "code_size": 6,
                  "preferred_channel": "whatsapp",
                  "locale": "en-US"
                },
                "vendor_data": "user-1234"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.send_code(
                phone_number="+14155552671",
                options={
                    "locale": "en-US",
                    "preferred_channel": "whatsapp",
                },
                vendor_data="user-1234",
            )
            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.sendCode({
              phone_number: "+14155552671",
              options: {
                locale: "en-US",
                preferred_channel: "whatsapp",
              },
              vendor_data: "user-1234",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.SendCode(ctx, didit.PhoneSendCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tOptions: didit.Some(didit.PhoneSendCodeParamsOptions{\n\t\tLocale:           didit.String(\"en-US\"),\n\t\tPreferredChannel: didit.Some(didit.PhoneSendCodeParamsOptionsPreferredChannel(\"whatsapp\")),\n\t}),\n\tVendorData: didit.String(\"user-1234\"),\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.PhoneSendCodeParams;

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

            var result = client.phone().sendCode(PhoneSendCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .options(PhoneSendCodeParams.Options.builder()
                            .locale("en-US")
                            .preferredChannel(PhoneSendCodeParams.Options.PreferredChannel.of("whatsapp"))
                            .build())
                    .vendorData("user-1234")
                    .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->sendCode([
                'phone_number' => '+14155552671',
                'options' => [
                    'locale' => 'en-US',
                    'preferred_channel' => 'whatsapp',
                ],
                'vendor_data' => 'user-1234',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.phone.send_code(
              phone_number: "+14155552671",
              options: {
                locale: "en-US",
                preferred_channel: "whatsapp",
              },
              vendor_data: "user-1234"
            )
            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.SendCodeAsync(new
            PhoneSendCodeParams

            {
                PhoneNumber = "+14155552671",
                Options = new PhoneSendCodeParamsOptions
                {
                    Locale = "en-US",
                    PreferredChannel = new PhoneSendCodeParamsOptionsPreferredChannel("whatsapp"),
                },
                VendorData = "user-1234",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationSendResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            معرّف الجلسة لعملية التحقق. يُرجع إرسال `Retry` نفس قيمة
            `request_id` مثل الإرسال الأصلي. يظهر هذا المعرّف في Business
            Console، ويتم إرجاعه مرة أخرى بواسطة طلب `POST /v3/phone/check/`
            مكتمل، ويمكن تمريره إلى `GET /v3/session/{sessionId}/decision/`.
        status:
          type: string
          enum:
            - Success
            - Retry
            - Blocked
          description: >-
            `Success` — تم إرسال OTP لعملية تحقق جديدة. `Retry` — تمت إعادة
            إرسال OTP لعملية التحقق المعلقة التي تم إنشاؤها بواسطة إرسال سابق.
            `Blocked` — رفضت طبقة مكافحة الاحتيال الإرسال؛ يتم إنهاء عملية
            التحقق فورًا كـ `Declined` ولا تتم فوترة أي شيء.
        reason:
          type: string
          nullable: true
          description: >-
            سبب كون الإرسال `Blocked` (على سبيل المثال، `repeated_attempts`، أو
            `suspicious`، أو `spam`). ويكون `null` في حالتي `Success` و`Retry`.
        vendor_data:
          type: string
          nullable: true
          description: نسخة مطابقة من `vendor_data` المخزنة في الجلسة (من الإرسال الأول).
        metadata:
          type: object
          nullable: true
          description: نسخة مطابقة من `metadata` المخزنة في الجلسة (من الإرسال الأول).
  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.