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

# Ambil Pengiriman Webhook Sesi API Didit

> Ambil satu pengiriman webhook sesi: URL, respons HTTP dari endpoint Anda, serta header tanda tangan dan body JSON persis yang dikirim Didit.



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



      
      

\<pre>

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

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/webhook/{webhook_uuid}
(no trailing slash)

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

Goal:
\- Read exactly what Didit sent to my webhook endpoint for one delivery and what my endpoint answered, to debug a rejected or missing event.

Behavior:
\- {webhook_uuid} is the uuid of an entry from GET /v3/session/{session_id}/webhooks/. It must belong to the session in the path; a delivery of another session returns 404.
\- request_header and request_body are JSON-encoded strings. Parse them with a JSON parser.
\- To check my signature code, recompute X-Signature-V2 from the parsed request_body with my destination's secret (the application-level secret for a delivery sent to the legacy webhook_url) and compare it with the header. A scoped key without media: read or sessions: write receives a redacted body, which no longer matches the signatures.

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

What to read from the response:
\- response_status: the HTTP status my endpoint returned (null while queued, 504 timeout, 503 connection failure, 400 URL refused as unsafe).
\- request_url: where it was sent.
\- request_header: the X-Signature, X-Signature-V2, X-Signature-Simple and X-Timestamp values sent.
\- request_body: the webhook payload (event_id, webhook_type, session_id, status, decision when present).
\- status, webhook_type, created_at.

Failure modes:
\- 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": "No WebhookLog matches the given query." }).
\- 429: more than 600 reads per minute for this API key; honor Retry-After.

Side effects: none. This is a pure read.

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

\</pre>



      
      

Tempel ke

Payload di dalam `request_body` adalah yang dijelaskan dalam [Webhooks](https://docs.didit.me/id/integration/webhooks.md#struktur-payload), dan header-nya adalah yang dibahas dalam [verifikasi tanda tangan](https://docs.didit.me/id/integration/webhooks.md#verifikasi-tanda-tangan). Untuk mengirim ulang pengiriman, gunakan [Kirim ulang pengiriman webhook sesi](https://docs.didit.me/id/management-api/sessions/resend-webhook.md).


## OpenAPI

````yaml id/openapi-25.json GET /v3/session/{sessionId}/webhook/{webhook_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/session/{sessionId}/webhook/{webhook_uuid}:
    get:
      tags:
        - Sessions
      summary: Dapatkan pengiriman webhook sesi
      description: >-
        Ambil satu pengiriman webhook dari sesi verifikasi: URL tujuannya,
        status HTTP yang dikembalikan endpoint Anda, serta header dan isi JSON
        persis yang dikirimkan Didit. `request_header` dan `request_body` berupa
        teks JSON; untuk memeriksa [verifikasi tanda
        tangan](https://docs.didit.me/id/integration/webhooks#verifikasi-tanda-tangan)
        Anda, hitung ulang `X-Signature-V2` dari isi yang telah di-parsing
        menggunakan rahasia milik tujuan pengiriman (atau rahasia tingkat
        aplikasi untuk pengiriman ke URL webhook lama). Jalur tidak memiliki
        garis miring di akhir: jika ada, endpoint mengembalikan `404`. Kunci API
        dengan pembatasan cakupan memerlukan `sessions: read` dan `decisions:
        read`.
      operationId: get_v3_session_webhook
      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: `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, beserta header dan body permintaannya.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionWebhookDelivery'
              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
                    status: In Progress
                    webhook_type: status.updated
                    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}
                    created_at: '2026-10-15T09:21:18.412345Z'
        '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 sessions read:
                  value:
                    detail: This API key has no read access to sessions.
                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 `No WebhookLog matches the given query.`
          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: No WebhookLog matches the given query.
        '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/session/22222222-3333-4444-5555-666666666666/webhook/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.sessions.webhooks.retrieve(
                "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.retrieve(
              "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.Retrieve(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().retrieve("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->retrieve('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.retrieve(
              "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.RetrieveAsync("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.