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

# Detail Pengiriman Webhook via API Didit

> Baca satu percobaan pengiriman webhook beserta header tanda tangan dan payload JSON yang dikirim Didit, serta kode status dari endpoint Anda.



Prompt API untuk Mendapatkan Pengiriman Tujuan Webhook
        Salin prompt ke papan klip



      
      

\<pre>

\`Read one delivery attempt made to a Didit webhook destination through the Management API.

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

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

Goal:
\- See exactly what Didit sent to my endpoint, to debug signature verification or payload handling.

Path parameters:
\- destination_uuid: the destination uuid from GET /v3/webhook/destinations/.
\- delivery_uuid: the uuid of an entry from GET /v3/webhook/destinations/{destination_uuid}/deliveries/.

Behavior:
\- Returns the delivery fields of the list (uuid, session_id, request_url, response_status, response_time_ms, status, webhook_type, created_at) plus request_header and request_body.
\- request_header and request_body are JSON text (strings). Parse them: request_header holds Content-Type, X-Signature, X-Signature-V2, X-Signature-Simple, X-Timestamp and User-Agent; request_body holds the event payload, including event_id.
\- A scoped key without media: read receives media URLs inside request_body as null; without sessions: write it receives session tokens and hosted verification links as null. A body changed that way is re-encoded and no longer matches the signatures.

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

Failure modes:
\- 401: { "detail": "This API key has expired." }
\- 403: { "detail": "You do not have permission to perform this action." }, { "detail": "This API key has no read 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." } (the delivery does not belong to this destination).
\- 429: more than 600 GET requests per minute with this key; wait for Retry-After.

Side effects: none. This is a pure read.

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

\</pre>



      
      

Tempel ke

Untuk memeriksa kode tanda tangan Anda terhadap pengiriman yang sebenarnya, hitung ulang `X-Signature-V2` dari `request_body` dengan `secret_shared_key` tujuan, seperti dijelaskan di [Verifikasi tanda tangan](https://docs.didit.me/id/integration/webhooks.md#verifikasi-tanda-tangan). Gunakan kunci dengan akses penuh untuk ini: payload dengan nilai yang disensor tidak lagi cocok dengan tanda tangannya.Untuk mengirim ulang pengiriman, memanggil [Kirim Ulang Pengiriman Tujuan Webhook](https://docs.didit.me/id/management-api/webhook/resend-delivery.md).


## OpenAPI

````yaml id/openapi-25.json GET /v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/
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}/:
    get:
      tags:
        - Webhook
      summary: Dapatkan pengiriman tujuan webhook
      description: >-
        Ambil satu percobaan pengiriman ke tujuan webhook dengan header
        permintaan dan isi JSON yang persis dikirimkan Didit, status HTTP yang
        dikembalikan endpoint Anda, serta waktu respons. `request_header` dan
        `request_body` berupa teks JSON: parsing keduanya untuk membaca header
        tanda tangan dan payload, misalnya untuk memeriksa [verifikasi tanda
        tangan](https://docs.didit.me/id/integration/webhooks#verifikasi-tanda-tangan)
        Anda terhadap `secret_shared_key` milik tujuan. Pengiriman tidak pernah
        berisi rahasia penandatanganan, dan Didit tidak mencatat isi respons
        endpoint Anda. Kunci API dengan pembatasan cakupan memerlukan `webhooks:
        read` dan `decisions: read`; kunci yang terbatas pada alur kerja
        tertentu atau sesi yang disetujui tidak dapat menggunakan endpoint ini.
      operationId: get_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: `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, beserta header dan body permintaannya.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDestinationDeliveryDetail'
              examples:
                Connection failure:
                  value:
                    uuid: 66666666-7777-8888-9999-000000000001
                    session_id: 22222222-3333-4444-5555-666666666666
                    request_url: https://yourapp.com/webhooks/didit
                    response_status: 503
                    response_time_ms: 412
                    status: In Progress
                    webhook_type: status.updated
                    created_at: '2026-10-15T09:21:18.412345Z'
                    request_header: >-
                      {"Content-Type": "application/json", "X-Signature":
                      "a5e02a03404e1337a0198e6be15d34abbd053c658a0e51e5d0e78554213ef29b",
                      "X-Signature-V2":
                      "927e7cb770c94ce745939bff73f04aa200015f3bc64795ba46c2aaf78a6cedc5",
                      "X-Signature-Simple":
                      "e37b0d4c716c72bb5ae7127b9cc455d28ab4686e9e22312b4ec2327409a73302",
                      "X-Timestamp": "1792056078", "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":1792056078,"vendor_data":"user-123","webhook_type":"status.updated","workflow_id":"44444444-5555-6666-7777-888888888888","workflow_version":3}
        '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 read:
                  value:
                    detail: This API key has no read 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 600 permintaan GET 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 (600).
              schema:
                type: integer
                example: 600
            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-get
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Pesan kesalahan yang mudah dibaca manusia.
              examples:
                Throttled:
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X GET
            'https://verification.didit.me/v3/webhook/destinations/11111111-2222-3333-4444-555555555555/deliveries/66666666-7777-8888-9999-000000000001/'
            \
              -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.retrieve_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.retrieveDelivery(
              "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.RetrieveDelivery(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().retrieveDelivery("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->retrieveDelivery('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.retrieve_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.RetrieveDeliveryAsync("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.