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

# إنشاء التحقق الإضافي (Step-Up) | Didit Authentication API

> يطبّق POST /step-up/ من Didit قواعد التحقق الإضافي الخاصة بك قبل أي إجراء حساس. يعيد required false، أو رابط تحقق موجّه للشخص.

> [!WARNING]
>
> المصادقة ميزة جديدة. تُقدَّم نقاط النهاية هذه من خلال جهة الإصدار الخاصة بتطبيقك، مثل `https://<name>.auth.didit.me`، ولا تستخدم مفتاح API الخاص بـ Didit أبدًا.

معاملا الاستعلام `step_up` و`status` في `return_to` يشيران فقط إلى أن على تطبيقك الاستعلام عن الحالة. قبل اتخاذ أي إجراء، اقرأ خطوة المصادقة الإضافية باستخدام [الحصول على خطوة المصادقة الإضافية](https://docs.didit.me/ar/authentication/api-reference/retrieve-step-up.md)، ولا تُكمل إلا عندما تكون قيمة `status` هي `approved`.


## OpenAPI

````yaml ar/openapi-authentication.json POST /step-up/
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    تُعد هذه endpoints المخصصة للخادم لـ Didit Authentication، وهو منتج تسجيل
    الدخول للمستخدمين النهائيين لتطبيقك. ميزة Authentication **جديدة** وتصل إلى
    الإنتاج في إصدار 2026-11-01.


    ## عنوان URL الأساسي


    كل تطبيق هو جهة إصدار OpenID Connect خاصة به، ويتم تقديم كل endpoint أدناه
    في المسار الجذري لجهة الإصدار تلك:


    - `https://<name>.auth.didit.me` لتطبيق في بيئة الإنتاج، أو
    `https://<name>.sandbox.auth.didit.me` لتطبيق في البيئة التجريبية.

    - نطاقك المخصص، بمجرد تفعيله. سيحل بعد ذلك محل المضيف الافتراضي كجهة إصدار:
    تذكره tokens الجديدة في `iss`، وتشير إليه آلية discovery ويتغير المفتاح
    القابل للنشر. تفشل access tokens الصادرة تحت المضيف الافتراضي في `/session/`
    و `/step-up/` و `/monitoring-token/` حتى يتم تجديدها.


    بيئة الإنتاج والبيئة التجريبية هما تطبيقان منفصلان، وبالتالي فهما جهتا إصدار
    منفصلتان بمفاتيح منفصلة. المفتاح القابل للنشر هو `pk_live_` (للإنتاج) أو
    `pk_test_` (للبيئة التجريبية) متبوعاً بترميز base64url غير المبطن لجهة
    الإصدار، دون شرطة مائلة لاحقة: قم بفك ترميزه للعثور على جهة الإصدار. إنه
    معرّف عام، وليس بيانات اعتماد.


    يتم أيضاً تقديم نفس endpoints بتنسيق JSON ضمن
    `https://apx.didit.me/auth/v2/authentication/{application_id}/`. تذكر tokens
    دائماً جهة الإصدار المذكورة أعلاه، أياً كان العنوان الذي أصدرها.


    ## بيانات الاعتماد


    لا تقبل هذه الـ endpoints مطلقاً مفتاح API الخاص بك من Didit أو token لوحة
    التحكم.


    - لا تتطلب Discovery و JWKS و `POST /token/` أي بيانات اعتماد. العملاء
    عامون: لا يوجد سر للعميل (client secret)، ورمز التفويض مرتبط بمتحقق PKCE
    الخاص به (`S256`). يمثل `client_id` معرّف التطبيق الخاص بك.

    - تتطلب `/session/` و `/step-up/` و `/monitoring-token/` الـ access token
    الخاص بالشخص: `Authorization: Bearer <access_token>`. يُحتسب كل استدعاء ناجح
    كنشاط في الجلسة، مما يعيد تشغيل مهلة الخمول للجلسة.


    ## نصوص الطلبات


    يقبل كل endpoint يتلقى نص طلب كلاً من تنسيقات JSON والترميز كنموذج
    (form-encoded) ومتعدد الأجزاء (multipart). يسرد هذا المستند تنسيق JSON،
    بالإضافة إلى form-encoded للطلب `POST /token/` كما يرسله عملاء OAuth. يحصل
    الحقل الذي لا يقبله الـ endpoint على `400 {"<field>": "unknown_field"}`.


    ## Tokens


    - **Access token**: رمز JWT بتشفير ES256 مع الرأس `typ: at+jwt`، صالح لمدة 5
    دقائق على الأكثر ولا يتجاوز أبداً مدة جلسته. المطالبات: `AccessTokenClaims`.

    - **ID token**: رمز JWT بتشفير ES256 مع الرأس `typ: JWT`. المطالبات:
    `IDTokenClaims`. ولا يُقبل أبداً كـ access token.

    - **Refresh token**: سلسلة عشوائية يتم تدويرها مع كل استخدام. يؤدي إرسال
    refresh token مستخدم بالفعل مرة أخرى إلى إبطال الجلسة.


    تحقق من الـ token باستخدام المفاتيح من `GET /.well-known/jwks.json`: يجب أن
    تكون الخوارزمية `ES256`، ويجب أن يطابق `typ` نوع الـ token، ويجب أن يساوي
    `iss` جهة الإصدار التي قمت بتكوينها و `aud` معرّف تطبيقك. لا يكتشف التحقق
    دون اتصال بالإنترنت الجلسة الملغاة إلا بعد انتهاء صلاحية access token الخاص
    بها؛ بينما يمثل `GET /session/` التحقق الفوري.


    ## الأخطاء


    | نص الاستجابة | الحالة |

    | --- | --- |

    | `{"error": "<code>"}` | أخطاء من `POST /token/`، جميعها بالحالة `400`، في
    بنية نص الاستجابة المحددة في [RFC 6749 section
    5.2](https://www.rfc-editor.org/rfc/rfc6749#section-5.2): `invalid_grant` و
    `invalid_client` و `mfa_required` الخاصة بـ Didit. أخطاء الخدمة:
    `temporarily_unavailable` و `monitoring_unavailable` و
    `monitoring_disabled`. |

    | `{"<field>": ["<message>"]}` أو `{"<field>": "<code>"}` | فشل التحقق من
    صحة أحد حقول الطلب. يشير `non_field_errors` إلى قاعدة تنطبق على عدة حقول،
    ويشير `unknown_field` إلى حقل لا يقبله الـ endpoint. |

    | `{"detail": "<message>"}` | `401` (`invalid_token`) و `403`
    (`origin_not_allowed`) و `404` (تطبيق أو خطوة تصعيد غير معروفة) و `429` (حد
    المعدل). وأيضاً `400` لنص طلب يتعذر تحليله (`JSON parse error - ...`) و
    `405` لطريقة لا يدعمها الـ endpoint و `415` لنوع محتوى `Content-Type` غير
    مدعوم. |


    يحمل الرمز `401` أيضاً الرأس `WWW-Authenticate: Bearer`، ويحمل الرمز `429`
    الرأس `Retry-After` بالثواني.


    هناك حالتا رفض لا تُرجعان بتنسيق JSON. يتم رفض العنوان الذي لا يمثل جهة
    إصدار قبل وصوله إلى هذه الـ endpoints، على سبيل المثال استجابة `404` فارغة
    لاسم `*.auth.didit.me` غير مستخدم. ويتلقى معرّف `step_up_id` الذي لا يطابق
    تنسيق UUID صفحة `404`.


    ## حدود المعدل


    يجب أن يمر الطلب عبر طبقتين.


    **حدود الـ endpoint**، وتُحتسب لكل عنوان IP للعميل، ولكل تطبيق، ولكل
    endpoint:


    - Discovery و JWKS: 1,200 طلب في الدقيقة و 12,000 في الساعة.

    - جميع endpoints الأخرى: 30 طلباً في الدقيقة و 300 في الساعة. يشترك الطلبان
    `GET` و `DELETE /session/` في عداد واحد.


    عند تجاوز الحد: `429 {"detail": "Too many requests from this IP address.
    Please wait before trying again. Expected available in 60 seconds."}`، أو
    `3600 seconds` للحد الساعي.


    **الحماية من البوتات**، على كل طلب `POST` و `DELETE`. وتكون مستودعاتها
    مشتركة بين جميع طلبات `POST` و `DELETE` الخاصة بالتطبيق، بما في ذلك خطوات
    تسجيل الدخول المستضافة، وتتم إعادة ملئها باستمرار:


    - 60 طلباً في الدقيقة لكل عنوان IP للعميل.

    - 30 طلباً في الدقيقة لكل جهاز، للطلبات التي تحدد جهازها، كما تفعل حزم SDK
    للمتصفح والأجهزة الأصلية.

    - 3,000 طلب في الدقيقة للتطبيق بالكامل، عبر جميع عناوين IP. وتسحب عمليات
    تجديد الـ token (`POST /token/` مع `grant_type=refresh_token`) من مستودع خاص
    بها بدلاً من ذلك: 6,000 في الدقيقة للتطبيق بالكامل.


    عند تجاوز سعة المستودع: `429 {"detail": "rate_limited Expected available in
    N seconds."}` (`1 second.` عندما تكون N تساوي 1). يشمل مستودع عنوان IP
    الواحد عدة endpoints، لذا فإن عنواناً واحداً يجمع بين استدعاءات token و
    step-up وتسجيل الخروج يمكنه استنزافه قبل الوصول إلى أي حد خاص بالـ endpoint.
    يحتسب مستودع التطبيق كل عميل للتطبيق، بما في ذلك المتصفحات.


    تجيب كلتا الطبقتين قبل تشغيل الـ endpoint، لذا فإن الطلب الذي تلقى `429` لم
    يتم تنفيذه: أعد المحاولة بعد انقضاء `Retry-After`، بما في ذلك طلبات التجديد.


    ## طلبات المتصفح


    يجب أن يأتي الطلب الذي يحمل الرأس `Origin` من أحد مصادر التطبيق نفسه أو
    مصادره المسموح بها، وإلا سيتلقى `403 origin_not_allowed`. لا ترسل الطلبات
    بين الخوادم الرأس `Origin`.


    ## ما لا يغطيه هذا المستند


    تخدم هذه المسارات الصفحات المستضافة، وحزم SDK للمتصفح والأجهزة الأصلية،
    ووكلاء الذكاء الاصطناعي. وهي ليست جزءاً من عقد الخادم، ولا تستدعيها حزم SDK
    للخادم:


    - خطوات تسجيل الدخول: `POST /authorize/` و `POST /password/` و `/email/*` و
    `/phone/*` و `/password-reset/*` و `/passkeys/*` و `/mfa/*` و `/social/*` و
    `/protection/complete/`.

    - الصفحات المستضافة وعمليات الاستدعاء: `/sign-in` و `/magic` و `/invite` و
    `/reset` و `/verify/` و `/sso/*` و `/wallet/callback/` و `/logo/` وملفات ربط
    التطبيقات الأصلية تحت `/.well-known/`.

    - وصول الوكلاء: `/agents/*` و `/grants/`، بما في ذلك `GET /agents/session/`،
    وهو الفحص المباشر لـ access token الخاص بوكيل الذكاء الاصطناعي. وصول الوكلاء
    ليس جزءاً من هذا الإصدار من العقد.

    - واجهة API لإدارة لوحة التحكم الخاصة بـ Authentication، والتي تتطلب جلسات
    لوحة التحكم.


    لا يتم تسليم أحداث Authentication كـ webhooks حتى الآن، لذا لا يحدد هذا
    المستند أي webhook.
servers:
  - url: https://{issuer}
    description: 'الجهة المصدرة لتطبيقك: مصدر تسجيل الدخول الخاص به.'
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          مضيف الجهة المصدرة: `<name>.auth.didit.me` (بيئة الإنتاج)، أو
          `<name>.sandbox.auth.didit.me` (البيئة التجريبية)، أو نطاقك المخصص
          النشط.
security: []
tags:
  - name: Issuer
    description: مفاتيح الاكتشاف والتوقيع، للتحقق من token.
  - name: Tokens
    description: منح رمز التفويض ومنح التحديث.
  - name: Sessions
    description: التحقق من الجلسة التابعة لـ token وصول وإنهاؤها.
  - name: Step-ups
    description: التحقق قبل إجراء حساس.
  - name: Monitoring
    description: بيانات اعتماد الجهاز لأحداث مراقبة المعاملات.
paths:
  /step-up/:
    post:
      tags:
        - Step-ups
      summary: أنشئ خطوة تحقق إضافية
      description: >-
        يستعلم عما إذا كان يجب على الشخص التحقق قبل اتخاذ إجراء حساس، باستخدام
        قواعد خطوة التحقق الإضافية التي حددتها للتطبيق.


        - `200 {"required": false}`: لا تنطبق أي قاعدة، يمكنك المتابعة.

        - `201`: أرسل الشخص إلى `verification_url`. سيعود إلى `return_to` مع
        `step_up=<id>&status=approved`، لكن هذا الاستعلام لا يثبت شيئاً: اقرأ
        خطوة التحقق الإضافية عبر `GET /step-up/{step_up_id}/` وتصرف فقط بناءً
        على `approved`.


        لا تسمح خطوة التحقق الإضافية بالمرور أبداً عند التعطل: عندما يكون التحقق
        غير متاح، يظل الإجراء محظوراً.
      operationId: authentication_create_step_up
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StepUpRequest'
            examples:
              Payout:
                summary: قبل صرف الأموال
                value:
                  action: payout
                  amount: '900.00'
                  currency: USD
                  return_to: https://app.example.com/payouts/confirm
              Bank:
                summary: قبل تغيير الحساب البنكي
                value:
                  action: bank
                  return_to: https://app.example.com/settings/bank
      responses:
        '200':
          description: لا تنطبق أي قاعدة.
          headers:
            Cache-Control:
              description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
              schema:
                type: string
                example: no-store
            Pragma:
              description: دائماً `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StepUpNotRequired'
              examples:
                NotRequired:
                  summary: تابع
                  value:
                    required: false
        '201':
          description: يجب على الشخص التحقق أولاً.
          headers:
            Cache-Control:
              description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
              schema:
                type: string
                example: no-store
            Pragma:
              description: دائماً `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StepUpRequired'
              examples:
                Required:
                  summary: صورة سيلفي قبل صرف الأموال
                  value:
                    id: 94efc2c3-ca84-42fe-900b-6fb61669a7a1
                    rule: payout
                    method: selfie
                    status: pending
                    level: null
                    amount: '900.00'
                    currency: USD
                    created_at: '2026-10-17T10:41:14.894632Z'
                    completed_at: null
                    expires_at: '2026-10-17T11:11:14.894581Z'
                    required: true
                    verification_url: >-
                      https://your-app.auth.didit.me/verify/?verification=1nSX7HJCXAP9XPA9AeJfQxIuPk2GkG0dGSOzCA2Zpww
                    expires_in: 1800
        '400':
          description: >-
            حقل مفقود أو غير صالح. تعني `return_to: invalid_redirect_uri` أن
            هناك قاعدة تنطبق وأن `return_to` ليس أحد عناوين URI لإعادة التوجيه
            الخاصة بالتطبيق.
          headers:
            Cache-Control:
              description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
              schema:
                type: string
                example: no-store
            Pragma:
              description: دائماً `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FieldErrors'
              examples:
                MissingAmount:
                  summary: عملية دفع بدون مبلغ
                  value:
                    amount:
                      - required
                InvalidReturnTo:
                  summary: ‏return_to غير مسجل
                  value:
                    return_to: invalid_redirect_uri
                UnknownAction:
                  summary: إجراء غير مدعوم
                  value:
                    action:
                      - '"withdraw" is not a valid choice.'
        '401':
          $ref: '#/components/responses/InvalidToken'
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - AccessToken: []
components:
  schemas:
    StepUpRequest:
      type: object
      description: الإجراء الحساس الذي يوشك الشخص على اتخاذه.
      required:
        - action
        - return_to
      additionalProperties: false
      properties:
        action:
          type: string
          enum:
            - payout
            - bank
            - contact
          description: >-
            `payout` (سحب أو تحويل)، أو `bank` (إضافة حساب بنكي أو تغييره)، أو
            `contact` (تغيير البريد الإلكتروني أو رقم الهاتف). تنطبق قاعدة
            الجهاز الجديد أيضاً على عمليات الدفع.
        amount:
          type: string
          pattern: ^[0-9]{1,16}(\.[0-9]{1,2})?$
          description: >-
            مطلوب لـ `payout`: المبلغ، حتى منزلتين عشريتين. يُقبل أيضًا رقم
            بصيغة JSON.
          example: '900.00'
        currency:
          type: string
          pattern: ^[A-Z]{3}$
          description: >-
            رمز ISO 4217 الخاص بـ `amount`. القيمة الافتراضية هي عملة قاعدة صرف
            الدفعات؛ ويُتحقَّق دائمًا من الدفعة المصروفة بعملة أخرى.
          example: USD
        return_to:
          type: string
          maxLength: 2048
          description: >-
            المكان الذي يعود إليه الشخص بعد التحقق، مع إضافة
            `step_up=<id>&status=approved`. عند انطباق قاعدة معينة، يجب أن يكون
            أحد عناوين URI لإعادة التوجيه الخاصة بالتطبيق؛ وفي حال عدم انطباق أي
            قاعدة، لا يتم التحقق منه.
          example: https://app.example.com/payouts/confirm
    StepUpNotRequired:
      type: object
      description: 'لا تنطبق أي قاعدة: تابع تنفيذ الإجراء.'
      required:
        - required
      properties:
        required:
          type: boolean
          enum:
            - false
    StepUpRequired:
      description: إجراء تصعيدي جديد. أرسل الشخص إلى `verification_url`.
      allOf:
        - $ref: '#/components/schemas/StepUp'
        - type: object
          required:
            - required
            - verification_url
            - expires_in
          properties:
            required:
              type: boolean
              enum:
                - true
            verification_url:
              type: string
              format: uri
              description: >-
                الصفحة المستضافة حيث يتحقق الشخص؛ افتحها في متصفح الشخص. تظل
                صالحة حتى تتم الموافقة على التحقق الإضافي (step-up) أو تنتهي
                صلاحيته، وبذلك يمكن للشخص الذي تم رفضه إعادة المحاولة من خلالها.
              example: >-
                https://your-app.auth.didit.me/verify/?verification=1nSX7HJCXAP9XPA9AeJfQxIuPk2GkG0dGSOzCA2Zpww
            expires_in:
              type: integer
              description: 'عدد الثواني التي تظل فيها خطوة التصعيد مفتوحة: 1800.'
              example: 1800
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        أخطاء التحقق حسب الحقل. تكون القيمة عبارة عن قائمة من الرسائل، أو رمز
        واحد (`unknown_field`، `invalid_redirect_uri`). يحتوي `non_field_errors`
        على القواعد المطبقة عبر حقول متعددة.
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    StepUp:
      type: object
      description: عملية تحقق يتعين على الشخص اجتيازها قبل اتخاذ الإجراء.
      required:
        - id
        - rule
        - method
        - status
        - level
        - amount
        - currency
        - created_at
        - completed_at
        - expires_at
      properties:
        id:
          type: string
          format: uuid
          example: 94efc2c3-ca84-42fe-900b-6fb61669a7a1
        rule:
          type: string
          enum:
            - payout
            - device
            - bank
            - contact
          description: >-
            القاعدة التي طلبت ذلك. عند انطباق عدة قواعد، يتم اختيار القاعدة ذات
            الطريقة الأقوى.
          example: payout
        method:
          type: string
          enum:
            - liveness
            - selfie
            - full_id
          description: >-
            ما يقوم به الشخص: `liveness`، أو `selfie` (كشف الحيوية مع مطابقته
            للوجه الذي بحوزة Didit بالفعل)، أو `full_id` (المستند وصورة سيلفي).
            عندما لا تحتفظ Didit بأي وجه للشخص بعد، يتحول `selfie` إلى `full_id`
            بمجرد فتحه لـ `verification_url`.
          example: selfie
        status:
          type: string
          enum:
            - pending
            - review
            - approved
            - declined
            - expired
            - superseded
          description: >-
            اتخذ إجراءً فقط عند `approved`. ينتظر `review` مراجعة فريقك. لا يعد
            `declined` نهائياً طالما أن `verification_url` يعمل: يمكن للشخص
            المحاولة مرة أخرى، وتعود خطوة التحقق الإضافي إلى `pending`. يعني
            `superseded` أن فحصاً آخر قد تولى عملية التحقق الخاصة بها، أو أن
            النتيجة لم تكن لخطوة التحقق الإضافي هذه: أنشئ خطوة جديدة.
          example: pending
        level:
          type: string
          nullable: true
          enum:
            - liveness
            - liveness_face_match
            - full_id
            - null
          description: المستوى الذي بلغه التحقق بمجرد قبوله.
          example: null
        amount:
          type: string
          nullable: true
          description: مبلغ الدفع، بمنزلتين عشريتين.
          example: '900.00'
        currency:
          type: string
          nullable: true
          example: USD
        created_at:
          type: string
          format: date-time
          example: '2026-10-17T10:41:14.894632Z'
        completed_at:
          type: string
          format: date-time
          nullable: true
          example: null
        expires_at:
          type: string
          format: date-time
          description: >-
            30 دقيقة بعد الإنشاء. تؤدي قراءة خطوة التوثيق الإضافي (step-up)
            أولاً إلى جمع أي نتيجة وصل إليها التحقق، لذا يمكن أن تظل قراءته
            `approved` أو `review` أو `declined` بعد هذا الوقت؛ وتلك التي لا
            تزال `pending` تُقرأ `expired`.
          example: '2026-10-17T11:11:14.894581Z'
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    OAuthError:
      title: OAuth error
      type: object
      description: خطأ OAuth (القسم 5.2 من RFC 6749) أو خطأ في الخدمة.
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
  responses:
    InvalidToken:
      description: >-
        إن access token مفقود، أو غير صالح، أو منتهي الصلاحية، أو موقّع من جهة
        إصدار أو مفتاح آخر، أو هو ID token، أو agent token، أو تم استبداله عبر
        تحديث؛ أو تم إلغاء جلسته، أو انتهت مهلة خمولها، أو تجاوزت فترة صلاحيتها،
        أو لم تعد تستوفي سياسة MFA الخاصة بك، أو تم حظر الشخص أو لم يعد بريده
        الإلكتروني متحققاً منه. وجّه الشخص لإعادة تسجيل الدخول مرة أخرى.
      headers:
        WWW-Authenticate:
          description: '`Bearer`.'
          schema:
            type: string
            example: Bearer
        Cache-Control:
          description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: دائماً `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            InvalidToken:
              summary: تم رفض token الوصول
              value:
                detail: invalid_token
    OriginNotAllowed:
      description: >-
        تضمن الطلب رأس `Origin` ليس خاصاً بالتطبيق ولا يندرج ضمن أصول التطبيق
        المسموح بها. لا ترسل طلبات الخادم أي `Origin`.
      headers:
        Cache-Control:
          description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: دائماً `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: الأصل غير مسموح به
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        العنوان يتبع تطبيقاً، ولكن المصادقة غير مفعّلة له؛ وعلى العنوان
        `apx.didit.me`، يكون معرّف التطبيق غير معروف. يتم رفض العنوان الذي لا
        يتبع أي تطبيق قبل أن يصل إلى endpoint، وتلك الاستجابة لا تكون بتنسيق
        JSON.
      headers:
        Cache-Control:
          description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: دائماً `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: تطبيق غير معروف
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        طلبات كثيرة جداً من عنوان IP هذا لهذا الـ endpoint، أو في حالة `POST` أو
        `DELETE`، فإن وعاء الحماية من البوتات فارغ. لم يتم تشغيل أي شيء: انتظر
        عدد الثواني المحدد في `Retry-After`، ثم أعد المحاولة.
      headers:
        Retry-After:
          description: عدد الثواني الواجب انتظارها قبل إعادة المحاولة.
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: دائماً `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: حد الـ endpoint
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: حد الحماية من البوت (POST وDELETE)
              value:
                detail: rate_limited Expected available in 2 seconds.
    TemporarilyUnavailable:
      description: >-
        خدمة يعتمد عليها الطلب غير متوفرة لفترة وجيزة. أعد المحاولة مع التراجع
        التدريجي.
      headers:
        Cache-Control:
          description: 'دائماً `no-store`: لا تقم بتخزين هذه الاستجابة مؤقتاً أبداً.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: دائماً `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OAuthError'
          examples:
            TemporarilyUnavailable:
              summary: إعادة المحاولة لاحقاً
              value:
                error: temporarily_unavailable
  securitySchemes:
    AccessToken:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        token الوصول الخاص بالشخص من `POST /token/`: عبارة عن ES256 JWT برأس
        `typ: at+jwt`، صالح لمدة 5 دقائق كحد أقصى. ليس مفتاح API الخاص بك في
        Didit.

````

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