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

# Kirim Ulang Pengiriman Webhook API

> Kirim ulang pengiriman webhook lama ke endpoint Anda dengan tanda tangan baru. Didit mengembalikan percobaan baru dan status HTTP-nya.



Prompt API Kirim Ulang Pengiriman Tujuan Webhook
        Salin prompt ke papan klip



      
      

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



      
      

Tempel ke

> [!WARNING]
>
> Setiap pemanggilan akan mengirim ulang webhook. Buat endpoint Anda idempoten berdasarkan `event_id` sebelum mengirim ulang secara massal, dan kirim ulang hanya pengiriman yang `response_status`-nya `null` atau `400` ke atas.Pengiriman ulang dikirim ke URL yang digunakan oleh pengiriman asli. Jika Anda memindahkan tujuan ke URL baru, pengiriman lama tetap mengarah ke URL lama. Temukan pengiriman yang akan dikirim ulang dengan [Daftar Pengiriman Tujuan Webhook](https://docs.didit.me/id/management-api/webhook/list-deliveries.md), dan lihat [panduan webhook](https://docs.didit.me/id/integration/webhooks.md) untuk verifikasi tanda tangan.


## OpenAPI

````yaml id/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 Verifikasi Identitas. Lakukan autentikasi dengan header 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: Kirim ulang pengiriman ke tujuan webhook
      description: >-
        Kirim ulang pengiriman sebelumnya, misalnya setelah endpoint Anda sempat
        tidak aktif. Didit mengambil payload yang tersimpan, menetapkan
        `timestamp` baru, menandatanganinya kembali dengan `secret_shared_key`
        tujuan saat ini (`X-Signature`, `X-Signature-V2`, `X-Signature-Simple`,
        dan `X-Timestamp`), dan mengirimkannya ke `request_url` pengiriman,
        bahkan jika URL tujuan telah berubah sejak saat itu atau tujuan
        dinonaktifkan. `event_id` dan bagian payload lainnya tidak berubah, jadi
        lakukan deduplikasi pada `event_id`. Pemanggilan menunggu hingga 5 detik
        untuk endpoint Anda dan mengembalikan pengiriman baru dengan `200` apa
        pun jawaban endpoint Anda: baca `response_status`. Pengiriman ulang
        tidak dicoba lagi secara otomatis, setiap pemanggilan mengirim ulang dan
        membuat pengiriman baru, dan permintaan tidak memiliki isi. Kunci API
        dengan cakupan memerlukan `webhooks: write` dan `decisions: read`; kunci
        yang terbatas pada beberapa alur kerja atau sesi yang disetujui tidak
        dapat menggunakan endpoint ini.
      operationId: resend_webhook_destination_delivery
      parameters:
        - name: destination_uuid
          in: path
          required: true
          description: UUID tujuan yang menjadi tujuan pengiriman tersebut.
          schema:
            type: string
            format: uuid
          example: 11111111-2222-3333-4444-555555555555
        - name: delivery_uuid
          in: path
          required: true
          description: >-
            UUID pengiriman yang akan dikirim ulang: `uuid` dari entri yang
            dikembalikan oleh `GET
            /v3/webhook/destinations/{destination_uuid}/deliveries/`.
          schema:
            type: string
            format: uuid
          example: 66666666-7777-8888-9999-000000000001
      responses:
        '200':
          description: >-
            Pengiriman baru, yang sudah dicoba. `response_status` adalah respons
            yang diberikan endpoint Anda kali ini (`504` batas waktu habis,
            `503` kegagalan koneksi). Pengiriman asli tidak berubah.
          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: >-
            Pengiriman yang tersimpan tidak dapat ditandatangani lagi. Tidak ada
            yang dikirim.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
                  code:
                    type: string
                    description: >-
                      Kode error stabil yang dapat dibaca mesin. Buat
                      percabangan logika berdasarkan ini, bukan pada `detail`.
              examples:
                Unsignable delivery:
                  value:
                    detail: Invalid webhook data format
                    code: invalid_webhook_payload
        '401':
          description: >-
            Kunci API telah kedaluwarsa: kunci ini dibuat dengan tanggal
            kedaluwarsa yang telah lewat. Kunci yang salah atau dicabut juga
            menghasilkan `401`; kunci yang tidak ada menghasilkan `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Permintaan tidak diizinkan. `x-api-key` yang hilang, tidak valid,
            atau dicabut akan menghasilkan `You do not have permission to
            perform this action.` Kunci dengan cakupan terbatas tanpa akses yang
            dibutuhkan endpoint ini akan menghasilkan pesan yang menyebutkan
            akses yang hilang, dan kunci yang digunakan dari luar daftar izin
            IP-nya akan menghasilkan `This API key can't be used from this IP
            address.` Kunci yang dibatasi untuk beberapa alur kerja tertentu
            atau sesi yang disetujui akan menghasilkan `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: Pesan kesalahan yang mudah dibaca manusia.
              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: >-
            Tujuan tidak ada untuk aplikasi ini atau telah dihapus, atau
            pengiriman tidak ada, milik tujuan lain, atau tidak lagi tersedia.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Destination not found:
                  value:
                    detail: Webhook destination not found.
                Delivery not found:
                  value:
                    detail: Webhook delivery not found.
        '429':
          description: >-
            Batas laju terlampaui: lebih dari 300 permintaan tulis (POST, PATCH,
            PUT, DELETE) dalam jendela satu menit saat ini untuk kunci API ini.
            Tunggu `Retry-After` detik sebelum mencoba lagi.
          headers:
            Retry-After:
              description: Detik untuk menunggu sebelum mencoba lagi.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: Permintaan yang diizinkan dalam jendela satu menit (300).
              schema:
                type: integer
                example: 300
            X-RateLimit-Remaining:
              description: Permintaan tersisa dalam jendela saat ini.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Waktu Unix (detik) saat jendela saat ini direset.
              schema:
                type: integer
                example: 1792056120
            X-RateLimit-Scope:
              description: Nama anggaran yang terlampaui.
              schema:
                type: string
                example: generic-write
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              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: >-
        Satu upaya pengiriman ke tujuan webhook, dengan header dan body
        permintaan persis seperti yang dikirimkan 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: >-
            ID pengiriman, untuk panggilan guna melihat detail dan mengirim
            ulang.
        session_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            Sesi verifikasi pengguna yang terkait dengan event tersebut. `null`
            untuk event sesi bisnis, pengguna, bisnis, transaksi, Travel Rule,
            dan alur kerja.
        request_url:
          type: string
          format: uri
          nullable: true
          description: 'URL tujuan pengiriman: URL tujuan saat event dibuat.'
        response_status:
          type: integer
          nullable: true
          description: >-
            Status HTTP yang dikembalikan endpoint Anda. `null` saat pengiriman
            berada dalam antrean dan belum dicoba. Ketika tidak ada jawaban HTTP
            yang diterima, Didit mencatat statusnya sendiri: `504` ketika
            endpoint Anda tidak menjawab dalam 5 detik, `503` untuk kegagalan
            koneksi, `400` ketika URL ditolak karena tidak aman (misalnya alamat
            privat atau internal), dan `404` untuk kesalahan permintaan lainnya.
            `400` ke atas dihitung sebagai pengiriman gagal.
        response_time_ms:
          type: integer
          nullable: true
          minimum: 0
          description: >-
            Waktu yang dibutuhkan percobaan, dalam milidetik. `null` saat
            pengiriman sedang dalam antrean.
        status:
          type: string
          nullable: true
          description: >-
            Status yang dilaporkan event saat dibuat: status sesi untuk event
            sesi (misalnya `Approved` atau `In Review`), status individu atau
            perusahaan untuk event pengguna dan bisnis, serta status transaksi
            untuk event transaksi. `null` untuk event yang tidak membawa status.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
          description: Waktu ketika pengiriman dibuat.
        request_header:
          type: string
          description: >-
            Teks JSON (string) dari header permintaan yang dikirim Didit:
            `Content-Type`, `X-Signature`, `X-Signature-V2`,
            `X-Signature-Simple`, `X-Timestamp`, dan `User-Agent`. Parse teks
            ini dengan parser JSON. Teks ini memuat tanda tangan, tidak pernah
            rahasia penandatanganan.
        request_body:
          type: string
          description: >-
            Teks JSON (string) dari payload persis yang dikirim Didit, kunci
            diurutkan, termasuk `event_id` dan `timestamp`. Parse teks ini
            dengan parser JSON; lihat [Bentuk
            payload](https://docs.didit.me/id/integration/webhooks#struktur-payload).
            Untuk kunci dengan cakupan tanpa `media: read`, URL media di
            dalamnya bernilai `null`; tanpa `sessions: write`, token sesi dan
            tautan verifikasi yang di-hosting bernilai `null`. Body yang diubah
            dengan cara tersebut tidak lagi cocok dengan tanda tangannya. Didit
            tidak merekam body respons yang dikembalikan endpoint Anda.
    WebhookEvent:
      type: string
      description: >-
        Nama event webhook yang didukung. Gunakan string persis ini di
        `subscribed_events`; nilai yang tidak didukung akan ditolak.
      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: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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