> ## 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 Webhook Sesi API

> Kirim ulang webhook sesi yang tercatat ke URL yang sama dengan tanda tangan baru, lalu dapatkan pengiriman baru dan respons endpoint Anda dari Didit.



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



      
      

\<pre>

\`Resend a webhook delivery of a Didit verification session through the API.

Endpoint:
POST https://verification.didit.me/v3/session/{session_id}/webhook/{webhook_uuid}/resend
(no trailing slash, no request body)

Authentication:
Send my Didit API key in the x-api-key header. A scoped key needs webhooks: write and decisions: read.

Goal:
\- Replay a webhook my endpoint missed or rejected, after I fixed the endpoint.

Behavior:
\- {webhook_uuid} is the uuid of an entry from GET /v3/session/{session_id}/webhooks/, and it must belong to the session in the path.
\- Didit sends the recorded payload again to the URL the delivery was first sent to. The payload keeps its event_id; Didit refreshes the timestamp field, the X-Timestamp header and the signatures, using the destination's current signing secret (the application-level secret for a delivery sent to the legacy webhook_url).
\- Synchronous: Didit waits up to 5 seconds for my endpoint, records the attempt as a new delivery and returns it. The original delivery is not changed.
\- The call returns 200 even when my endpoint answered with an error: read response_status in the returned delivery.
\- A failed resend is not retried automatically. Every call sends one more request to my endpoint, so my handler must be idempotent on event_id.

Example call:
curl -X POST "https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/webhook/9f8e7d6c-5b4a-4321-8fed-cba987654321/resend" \
-H "x-api-key: YOUR_API_KEY"

What to read from the response:
\- uuid: the new delivery id.
\- response_status: what my endpoint answered this time (504 timeout, 503 connection failure, 400 URL refused as unsafe).
\- request_header and request_body: the headers and body actually sent.

Failure modes:
\- 400 with code webhook_url_missing: the delivery has no recorded URL.
\- 400 with code webhook_resend_error: the recorded payload could not be re-signed or sent.
\- 401: the API key has expired.
\- 403: missing key (a wrong, revoked or expired key gets 401), a key of another application, a scoped key without the permissions above, or a request from outside the key's IP allowlist.
\- 404: the session does not exist, was deleted, or is outside a scoped key's limits, or the delivery does not belong to this session ({ "detail": "Webhook log not found" }).
\- 429: more than 300 writes per minute for this API key; honor Retry-After.

Side effects: sends one HTTP request to my webhook endpoint and adds one delivery to the session's webhook log.

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

\</pre>



      
      

Tempel ke

> [!NOTE]
>
> Pengiriman ulang dikirim ke URL yang tersimpan pada pengiriman, meskipun Anda sudah mengubah URL tujuan webhook sejak saat itu. Karena payload tetap menyimpan `event_id`-nya, penerima yang [melakukan deduplikasi berdasarkan `event_id`](https://docs.didit.me/id/integration/webhooks#amplop) akan memperlakukan pengiriman ulang sebagai event yang sudah dikenalnya.Temukan pengiriman yang ingin dikirim ulang dengan [Daftar pengiriman webhook sesi](https://docs.didit.me/id/management-api/sessions/list-webhooks.md).


## OpenAPI

````yaml id/openapi-25.json POST /v3/session/{sessionId}/webhook/{webhook_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/session/{sessionId}/webhook/{webhook_uuid}/resend:
    post:
      tags:
        - Sessions
      summary: Kirim ulang pengiriman webhook sesi
      description: >-
        Kirim kembali webhook sesi yang tercatat ke URL tujuannya semula, dengan
        payload dan `event_id` yang sama serta `timestamp`, header
        `X-Timestamp`, dan tanda tangan baru. Didit menandatanganinya dengan
        rahasia saat ini dari tujuan pengiriman tersebut (atau rahasia tingkat
        aplikasi untuk pengiriman ke URL webhook lama), menunggu hingga 5 detik
        untuk endpoint Anda, mencatat upaya tersebut sebagai pengiriman baru,
        dan mengembalikannya dengan `200` apa pun jawaban endpoint Anda: baca
        `response_status`. Pengiriman ulang tidak dicoba lagi secara otomatis,
        dan setiap panggilan mengirim kembali, jadi buat endpoint Anda idempoten
        pada `event_id`. Jalur tidak memiliki garis miring di akhir dan
        permintaan tidak memiliki body. Kunci API dengan pembatasan cakupan
        memerlukan `webhooks: write` dan `decisions: read`.
      operationId: post_v3_session_webhook_resend
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID sesi verifikasi, pengguna (KYC) atau bisnis (KYB): `session_id`
            yang dikembalikan oleh `POST /v3/session/`. Server mencari ID
            tersebut di kedua jenis sesi.


            **Harus berupa UUID yang valid.** Rute ini hanya cocok dengan UUID
            yang terbentuk dengan benar, sehingga nilai yang salah format akan
            ditolak oleh router URL sebelum kode aplikasi apa pun berjalan dan
            responsnya berupa halaman **HTML** `404`, bukan envelope JSON
            `{"detail": ...}` yang ditunjukkan di bawah.
          schema:
            type: string
            format: uuid
          example: 22222222-3333-4444-5555-666666666666
        - name: webhook_uuid
          in: path
          required: true
          description: >-
            UUID pengiriman yang akan dikirim ulang: `uuid` dari entri yang
            dikembalikan oleh `GET /v3/session/{sessionId}/webhooks/`.
            Pengiriman ini harus dimiliki oleh sesi di path tersebut.
          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. Pengiriman asli tidak
            berubah.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionWebhookDelivery'
              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
                    status: In Progress
                    webhook_type: status.updated
                    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}
                    created_at: '2026-10-16T14:05:42.330981Z'
        '400':
          description: >-
            Pengiriman tidak dapat dikirim ulang. Percabangan berdasarkan
            `code`: `webhook_url_missing` berarti pengiriman tidak memiliki URL
            yang tercatat dan tidak ada yang dikirim; `webhook_resend_error`
            berarti pengiriman yang disimpan tidak dapat ditandatangani ulang
            atau upaya tersebut tidak dapat diselesaikan. Setelah
            `webhook_resend_error`, `detail` dimulai dengan `Error processing
            webhook resend:` diikuti oleh teks diagnostik yang dapat berubah.
          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:
                No recorded URL:
                  value:
                    detail: >-
                      The webhook delivery does not have a request URL
                      configured
                    code: webhook_url_missing
                Resend failed:
                  value:
                    detail: >-
                      Error processing webhook resend: Invalid webhook data
                      format
                    code: webhook_resend_error
        '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. Tidak adanya `x-api-key`, atau kunci
            yang tidak valid atau dicabut, akan menghasilkan `Authentication
            credentials were not provided or are invalid.` Kunci dari aplikasi
            lain 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.`
            `sessionId` yang tidak dikenal akan mengembalikan `404` sebelum
            kredensial diperiksa.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Missing or invalid key:
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Key of another application:
                  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.
                Outside the IP allowlist:
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            Sesi tidak ada atau telah dihapus (`Not found.`, dikembalikan
            sebelum kredensial diperiksa), atau berada di luar batas alur kerja
            atau status dari kunci dengan cakupan terbatas (`Session not
            found.`). Pengiriman yang tidak ada, milik sesi lain, atau tidak
            lagi tersedia mengembalikan `Webhook log not found`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Unknown session:
                  value:
                    detail: Not found.
                Outside the key's limits:
                  value:
                    detail: Session not found.
                Delivery not in this session:
                  value:
                    detail: Webhook log 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/session/22222222-3333-4444-5555-666666666666/webhook/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.sessions.webhooks.resend(
                "22222222-3333-4444-5555-666666666666",
                "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.sessions.webhooks.resend(
              "22222222-3333-4444-5555-666666666666",
              "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.Sessions.Webhooks.Resend(ctx, \"22222222-3333-4444-5555-666666666666\", \"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.sessions().webhooks().resend("22222222-3333-4444-5555-666666666666",
            "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->sessions->webhooks->resend('22222222-3333-4444-5555-666666666666',
            '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.sessions.webhooks.resend(
              "22222222-3333-4444-5555-666666666666",
              "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.Sessions.Webhooks.ResendAsync("22222222-3333-4444-5555-666666666666",
            "66666666-7777-8888-9999-000000000001");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SessionWebhookDelivery:
      type: object
      description: >-
        Satu upaya pengiriman webhook yang dicatat untuk suatu sesi verifikasi,
        dengan header dan body permintaan yang persis dikirimkan oleh Didit.
      required:
        - uuid
        - session_id
        - request_url
        - response_status
        - status
        - webhook_type
        - request_header
        - request_body
        - created_at
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            ID pengiriman. Gunakan sebagai `{webhook_uuid}` untuk mengambil atau
            mengirim ulang pengiriman ini.
        session_id:
          type: string
          format: uuid
          description: Sesi tempat pengiriman tersebut berada (sesi dalam jalur).
        request_url:
          type: string
          format: uri
          nullable: true
          description: URL tujuan pengiriman.
        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.
        status:
          type: string
          nullable: true
          description: >-
            Status sesi saat event dibuat, misalnya `In Progress`, `Approved`,
            atau `Declined`.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        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.
        created_at:
          type: string
          format: date-time
          description: Waktu ketika pengiriman dibuat.
    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.