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

# إعادة إرسال تسليم webhook عبر API

> أعد إرسال تسليم webhook سابق إلى نقطة الاستقبال الخاصة بك بتوقيع جديد في Didit، واحصل على المحاولة الجديدة مع رمز حالة HTTP الذي أعادته نقطة الاستقبال.



موجّه واجهة برمجة التطبيقات لإعادة إرسال تسليم وجهة webhook
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Resend a past Didit webhook delivery to my endpoint through the Management API.

Endpoint:
POST https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/

Authentication:
Use the x-api-key header with my Didit API key. A scoped API key needs webhooks: write and decisions: read. A key limited to some workflows or to approved sessions cannot use this endpoint.

Goal:
\- Recover webhooks my endpoint missed (for example during an outage) by sending them again once the endpoint is fixed.

Path parameters:
\- destination_uuid: the destination uuid from GET /v3/webhook/destinations/.
\- delivery_uuid: the uuid of the delivery to resend, from GET /v3/webhook/destinations/{destination_uuid}/deliveries/.

Behavior:
\- No request body.
\- Didit takes the stored payload, sets a fresh timestamp, signs it again with the destination's current secret_shared_key (X-Signature, X-Signature-V2, X-Signature-Simple and X-Timestamp) and POSTs it to the URL the original delivery went to (request_url), even if the destination URL changed since or the destination is disabled.
\- event_id and the rest of the payload are unchanged, so deduplicate on event_id in my endpoint.
\- The call waits for my endpoint (up to 5 seconds) and returns 200 with the new delivery whatever my endpoint answered. Check response_status in the response: 2xx means accepted, 504 a timeout, 503 a connection failure.
\- One attempt only: a resend is not retried automatically. Every call sends again and creates a new delivery with its own uuid; the original delivery is unchanged.
\- The response is redacted like GET delivery for scoped keys (media URLs, session tokens and hosted links as null); my endpoint still receives the full payload.

Example call:
curl -X POST "https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/" \
-H "x-api-key: YOUR_API_KEY"

Failure modes:
\- 400: { "detail": "Invalid webhook data format", "code": "invalid_webhook_payload" } when the stored delivery cannot be signed again. Nothing is sent.
\- 401: { "detail": "This API key has expired." }
\- 403: { "detail": "You do not have permission to perform this action." }, { "detail": "This API key has no write access to webhooks." }, { "detail": "This API key has no read access to decisions." }, or the limited-key message.
\- 404: { "detail": "Webhook destination not found." } or { "detail": "Webhook delivery not found." }
\- 429: more than 300 write requests per minute with this key; wait for Retry-After.

Side effects:
\- My endpoint receives the webhook again, and a new delivery appears in the destination's deliveries and analytics.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

الصق في

> [!WARNING]
>
> كل استدعاء يُعيد إرسال الـ webhook مرة أخرى. اجعل endpoint الخاص بك idempotent بناءً على `event_id` قبل إعادة الإرسال بالجملة، ولا تُعد إرسال إلا التسليمات التي تكون قيمة `response_status` فيها `null` أو `400` أو أعلى.تُرسَل إعادة الإرسال إلى الرابط نفسه الذي استخدمه التسليم الأصلي. إذا نقلت الوجهة إلى رابط جديد، فستظل التسليمات القديمة تشير إلى الرابط القديم. اعثر على التسليمات التي تريد إعادة إرسالها باستخدام [قائمة تسليمات وجهة webhook](https://docs.didit.me/ar/management-api/webhook/list-deliveries.md)، وراجع [دليل webhook](https://docs.didit.me/ar/integration/webhooks.md) للتحقق من التوقيع.


## OpenAPI

````yaml ar/openapi-25.json POST /v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/
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/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/resend/:
    post:
      tags:
        - Webhook
      summary: إعادة إرسال تسليم وجهة webhook
      description: >-
        أعد إرسال عملية تسليم سابقة، على سبيل المثال بعد تعطل الـ endpoint الخاص
        بك. يأخذ Didit الـ payload المخزن، ويعيّن `timestamp` جديداً، ويوقع عليه
        مجدداً باستخدام `secret_shared_key` الحالي للوجهة (`X-Signature`
        و`X-Signature-V2` و`X-Signature-Simple` و`X-Timestamp`) ويرسله عبر POST
        إلى `request_url` الخاص بعملية التسليم، حتى لو تغير عنوان URL الخاص
        بالوجهة منذ ذلك الحين أو تم تعطيل الوجهة. يبقى `event_id` وبقية الـ
        payload دون تغيير، لذا يمكنك إزالة التكرار بناءً على `event_id`. ينتظر
        الاستدعاء ما يصل إلى 5 ثوانٍ للـ endpoint الخاص بك ويُرجع التسليم الجديد
        برمز `200` أياً كان رد الـ endpoint الخاص بك: اقرأ `response_status`. لا
        تتم إعادة محاولة إعادة الإرسال تلقائياً، فكل استدعاء يرسل من جديد ويُنشئ
        عملية تسليم جديدة، والطلب ليس له جسم. يحتاج مفتاح API المحدود الصلاحيات
        إلى إذن `webhooks: write` و`decisions: read`؛ ولا يمكن لمفتاح يقتصر على
        بعض مهام سير العمل أو على الجلسات المقبولة استخدام هذا الـ endpoint.
      operationId: resend_webhook_destination_delivery
      parameters:
        - name: destination_uuid
          in: path
          required: true
          description: معرّف UUID للوجهة التي تم إرسال عملية التسليم إليها.
          schema:
            type: string
            format: uuid
          example: 11111111-2222-3333-4444-555555555555
        - name: delivery_uuid
          in: path
          required: true
          description: >-
            معرّف UUID لعملية التسليم المراد إعادة إرسالها: وهو الـ `uuid` لمدخل
            تم إرجاعه بواسطة `GET
            /v3/webhook/destinations/{destination_uuid}/deliveries/`.
          schema:
            type: string
            format: uuid
          example: 66666666-7777-8888-9999-000000000001
      responses:
        '200':
          description: >-
            التسليم الجديد، الذي جرت محاولته بالفعل. تمثل `response_status` ما
            أجاب به endpoint الخاص بك هذه المرة (`504` انتهاء المهلة، `503` فشل
            الاتصال). يظل التسليم الأصلي دون تغيير.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDestinationDeliveryDetail'
              examples:
                Accepted on resend:
                  value:
                    uuid: 66666666-7777-8888-9999-000000000004
                    session_id: 22222222-3333-4444-5555-666666666666
                    request_url: https://yourapp.com/webhooks/didit
                    response_status: 200
                    response_time_ms: 151
                    status: In Progress
                    webhook_type: status.updated
                    created_at: '2026-10-16T14:05:42.330981Z'
                    request_header: >-
                      {"Content-Type": "application/json", "X-Signature":
                      "b8eb1e376517ee0cad8ba98ff7f8fd35fc72eca231000963a96a335f82328835",
                      "X-Signature-V2":
                      "9efd2ce9ed1303e1d05273ef9608a59363ed9789a05253db4748b3e8e50cb109",
                      "X-Signature-Simple":
                      "bf3a9dc04b2c20ab539203b0cd5cca2a10f630bf62d8feb6d68d82af80f64774",
                      "X-Timestamp": "1792159542", "User-Agent":
                      "DiditWebhook/2.0 +https://didit.me"}
                    request_body: >-
                      {"application_id":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee","created_at":1792056057,"environment":"live","event_id":"33333333-4444-5555-6666-777777777777","sandbox_scenario":null,"session_id":"22222222-3333-4444-5555-666666666666","status":"In
                      Progress","timestamp":1792159542,"vendor_data":"user-123","webhook_type":"status.updated","workflow_id":"44444444-5555-6666-7777-888888888888","workflow_version":3}
        '400':
          description: تعذر توقيع التسليم المخزن مرة أخرى. لم يتم إرسال أي شيء.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: رسالة خطأ سهلة القراءة.
                  code:
                    type: string
                    description: >-
                      رمز خطأ ثابت قابل للقراءة آلياً. اعتمد في تفريع منطقك
                      البرمجي على هذا الرمز، وليس على `detail`.
              examples:
                Unsignable delivery:
                  value:
                    detail: Invalid webhook data format
                    code: invalid_webhook_payload
        '401':
          description: >-
            انتهت صلاحية مفتاح API: تم إنشاؤه مع تاريخ انتهاء قد مضى. يتلقى
            المفتاح الخاطئ أو الملغى أيضاً `401`؛ ويتلقى المفتاح المفقود `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: رسالة خطأ سهلة القراءة.
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            الطلب غير مسموح به. عند فقدان `x-api-key` أو عدم صلاحيته أو إلغائه،
            تتلقى `You do not have permission to perform this action.`. يحصل
            المفتاح ذو النطاق المحدود الذي يفتقر إلى الوصول الذي يتطلبه هذا
            endpoint على رسالة تذكر نوع الوصول المفقود، والمفتاح المستخدم من
            خارج قائمة العناوين المسموح بها الخاصة به يتلقى `This API key can't
            be used from this IP address.`. المفتاح المقتصر على بعض مسارات سير
            العمل أو على الجلسات المقبولة يتلقى `This API key only reaches
            sessions inside its workflow or status limits, so it can't use this
            endpoint.`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: رسالة خطأ سهلة القراءة.
              examples:
                Missing or invalid key:
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without webhooks write:
                  value:
                    detail: This API key has no write access to webhooks.
                Scoped key without decisions read:
                  value:
                    detail: This API key has no read access to decisions.
                Key limited to workflows or approved sessions:
                  value:
                    detail: >-
                      This API key only reaches sessions inside its workflow or
                      status limits, so it can't use this endpoint.
                Outside the IP allowlist:
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            الوجهة غير موجودة للتطبيق أو تم حذفها، أو التسليم غير موجود أو يتبع
            لوجهة أخرى أو لم يعد متاحًا.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: رسالة خطأ سهلة القراءة.
              examples:
                Destination not found:
                  value:
                    detail: Webhook destination not found.
                Delivery not found:
                  value:
                    detail: Webhook delivery not found.
        '429':
          description: >-
            تم تجاوز حد المعدل: أكثر من 300 طلب كتابة (POST، PATCH، PUT، DELETE)
            في نافذة الدقيقة الواحدة الحالية لمفتاح API هذا. انتظر لعدد الثواني
            المحدد في `Retry-After` قبل إعادة المحاولة.
          headers:
            Retry-After:
              description: عدد الثواني الواجب انتظارها قبل إعادة المحاولة.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: الطلبات المسموح بها خلال نافذة الدقيقة الواحدة (300).
              schema:
                type: integer
                example: 300
            X-RateLimit-Remaining:
              description: الطلبات المتبقية في النافذة الحالية.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: توقيت Unix (بالثواني) عند إعادة تعيين النافذة الحالية.
              schema:
                type: integer
                example: 1792056120
            X-RateLimit-Scope:
              description: اسم الميزانية التي تم تجاوزها.
              schema:
                type: string
                example: generic-write
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: رسالة خطأ سهلة القراءة.
              examples:
                Throttled:
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/resend/'
            \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.webhooks.destinations.resend_delivery(
                "11111111-2222-3333-4444-555555555555",
                "66666666-7777-8888-9999-000000000001",
            )
            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.webhooks.destinations.resendDelivery(
              "11111111-2222-3333-4444-555555555555",
              "66666666-7777-8888-9999-000000000001",
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.Destinations.ResendDelivery(ctx, \"11111111-2222-3333-4444-555555555555\", \"66666666-7777-8888-9999-000000000001\")\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.webhooks().destinations().resendDelivery("11111111-2222-3333-4444-555555555555",
            "66666666-7777-8888-9999-000000000001");

            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->webhooks->destinations->resendDelivery('11111111-2222-3333-4444-555555555555',
            '66666666-7777-8888-9999-000000000001');

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.webhooks.destinations.resend_delivery(
              "11111111-2222-3333-4444-555555555555",
              "66666666-7777-8888-9999-000000000001"
            )
            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.Webhooks.Destinations.ResendDeliveryAsync("11111111-2222-3333-4444-555555555555",
            "66666666-7777-8888-9999-000000000001");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    WebhookDestinationDeliveryDetail:
      type: object
      description: >-
        محاولة تسليم واحدة إلى وجهة webhook، مع رؤوس وجسم الطلب الفعليين اللذين
        أرسلتهما Didit تماماً.
      required:
        - uuid
        - session_id
        - request_url
        - response_status
        - response_time_ms
        - status
        - webhook_type
        - created_at
        - request_header
        - request_body
      properties:
        uuid:
          type: string
          format: uuid
          description: معرّف التسليم، لطلبات التفاصيل وإعادة الإرسال.
        session_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            جلسة التحقق من المستخدمين التي يتعلق بها الحدث. `null` لأحداث جلسة
            الشركة، والمستخدم، والشركة، والمعاملة، وTravel Rule، وسير العمل.
        request_url:
          type: string
          format: uri
          nullable: true
          description: >-
            رابط URL الذي أُرسل إليه التسليم: رابط URL الخاص بالوجهة عند إنشاء
            الحدث.
        response_status:
          type: integer
          nullable: true
          description: >-
            حالة HTTP التي أرجعها الـ endpoint الخاص بك. `null` طالما أن التسليم
            في قائمة الانتظار ولم تتم محاولته بعد. عندما لا يتم تلقي أي استجابة
            HTTP، تسجل Didit حالة خاصة بها: `504` عندما لم يُجب الـ endpoint
            الخاص بك في غضون 5 ثوانٍ، و`503` لفشل الاتصال، و`400` عندما تم رفض
            عنوان URL لعدم أمانه (على سبيل المثال عنوان خاص أو داخلي)، و`404`
            لأي خطأ آخر في الطلب. يُعتبر الرمز `400` أو أعلى تسليمًا فاشلاً.
        response_time_ms:
          type: integer
          nullable: true
          minimum: 0
          description: >-
            الوقت الذي استغرقته المحاولة بالمللي ثانية. يكون `null` عندما يكون
            التسليم في قائمة الانتظار.
        status:
          type: string
          nullable: true
          description: >-
            الحالة التي أبلغ عنها الحدث عند إنشائه: حالة الجلسة لأحداث الجلسة
            (على سبيل المثال `Approved` أو `In Review`)، وحالة الشخص أو الشركة
            لأحداث المستخدم والشركة، وحالة المعاملة لأحداث المعاملات. وتكون
            `null` للأحداث التي لا تحمل أي حالة.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
          description: وقت إنشاء التسليم.
        request_header:
          type: string
          description: >-
            نص JSON (سلسلة نصية) لرؤوس الطلب التي أرسلتها Didit: وهي
            `Content-Type` و`X-Signature` و`X-Signature-V2`
            و`X-Signature-Simple` و`X-Timestamp` و`User-Agent`. قم بتحليله
            باستخدام محلل JSON. يحتوي على التوقيعات، ولا يحتوي أبداً على سر
            التوقيع.
        request_body:
          type: string
          description: >-
            نص JSON (سلسلة نصية) للـ payload الدقيق الذي أرسلته Didit، مع فرز
            المفاتيح، بما في ذلك `event_id` و`timestamp`. قم بتحليله باستخدام
            محلل JSON؛ راجع [شكل الـ
            Payload](https://docs.didit.me/ar/integration/webhooks#بنية-الحمولة).
            بالنسبة لمفتاح محدد النطاق بدون `media: read`، تكون عناوين URL
            للوسائط بداخله `null`؛ وبدون `sessions: write`، تكون رموز الجلسات
            وروابط التحقق المستضافة `null`. محتوى الطلب الذي تم تغييره بهذه
            الطريقة لا يعود مطابقاً لتوقيعاته. لا تسجل Didit محتوى الاستجابة
            الذي أرجعه الـ endpoint الخاص بك.
    WebhookEvent:
      type: string
      description: >-
        اسم حدث webhook المدعوم. استخدم هذه النصوص بدقة في `subscribed_events`؛
        حيث يتم رفض القيم غير المدعومة.
      enum:
        - status.updated
        - data.updated
        - user.status.updated
        - user.data.updated
        - business.status.updated
        - business.data.updated
        - activity.created
        - transaction.created
        - transaction.status.updated
        - travel_rule.status.updated
        - workflow.compliance_changed
        - transaction_rule_suggestions.created
        - auth.signup
        - auth.login
        - auth.login_failed
        - auth.password_reset_requested
        - auth.password_reset_completed
        - auth.mfa_changed
        - auth.new_device
        - auth.account_locked
        - investigator.report.ready
        - investigator.decision.automated
        - investigator.decision.overridden
        - investigator.decision.contested
        - investigator.question.raised
        - investigator.automation.paused
        - investigator.rfi.answered
        - investigator.rfi.overdue
        - investigator.drift.detected
        - investigator.sla.breached
        - investigator.qa.failed
        - investigator.external.report.ready
  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.