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

> Didit가 인증 세션에 대해 보낸 모든 webhook을 URL, 엔드포인트 응답, 정확한 헤더 및 payload와 함께 조회합니다.



세션 webhook 전송 목록 API 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`List every webhook delivery Didit recorded for one verification session through the API.

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/webhooks/

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

Goal:
\- See which webhooks Didit sent for a session, to which URL, and what my endpoint answered. Use it to debug a missing or rejected webhook, or to reconcile my records with Didit's.

Behavior:
\- Works for user (KYC) and business (KYB) session IDs.
\- Returns a JSON array, newest first. It is not paginated. An empty array means no webhook was sent for the session yet.
\- Each entry is one delivery attempt to one destination. The first delivery, each automatic retry and each manual resend are separate entries with their own uuid; retries and resends keep the payload's event_id.
\- request_header and request_body are JSON-encoded strings. Parse them with a JSON parser to read the headers and the payload.
\- A scoped key without media: read receives media URLs inside request_body as null; without sessions: write it receives session links and tokens as null. A redacted body no longer matches the recorded signatures.

Example call:
curl -X GET "https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/webhooks/" \
-H "x-api-key: YOUR_API_KEY"

What to read from the response:
\- uuid: the delivery id. Use it as {webhook_uuid} to get or resend one delivery.
\- webhook_type: status.updated or data.updated for session deliveries.
\- status: the session status when the event was generated.
\- response_status: the HTTP status my endpoint returned. null while the delivery is queued; 504 means a timeout (5 seconds), 503 a connection failure, 400 a URL refused as unsafe.
\- request_url and created_at: where and when it was sent.

Failure modes:
\- 401: the API key has expired.
\- 403: missing key (a wrong, revoked or expired key gets 401) ({ "detail": "Authentication credentials were not provided or are invalid." }), 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 or was deleted ({ "detail": "Not found." }), or is outside a scoped key's workflow or status limits ({ "detail": "Session not found." }).
\- 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>



      
      

붙여넣을 곳

모든 시도가 기록되며, 여기에는 `5xx` 또는 `404` 응답 후 Didit이 수행하는 [자동 재시도](https://docs.didit.me/ko/integration/webhooks.md#재시도-정책)도 포함됩니다. 따라서 실패한 전송 뒤에 성공한 재시도가 이어지면 `request_body`에 같은 `event_id`를 가진 항목이 두 개 표시됩니다.개별 전송을 확인하려면 [세션 webhook 전송 조회](https://docs.didit.me/ko/management-api/sessions/get-webhook.md)를 사용하십시오. endpoint를 수정한 후 전송을 재전송하려면 [세션 webhook 전송 재전송](https://docs.didit.me/ko/management-api/sessions/resend-webhook.md)을 사용하십시오.


## OpenAPI

````yaml ko/openapi-25.json GET /v3/session/{sessionId}/webhooks/
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/session/{sessionId}/webhooks/:
    get:
      tags:
        - Sessions
      summary: 세션 webhook 전송 목록 조회
      description: >-
        하나의 사용자(KYC) 또는 기업(KYB) 인증 세션에 대해 Didit이 기록한 모든 webhook 전송 내역을 최신순으로 일반
        JSON 배열(페이지네이션 없음)로 조회합니다. 각 항목은 하나의 대상에 대한 한 번의 시도를 나타냅니다. 최초 전송, 각 자동
        [재시도](https://docs.didit.me/ko/integration/webhooks#재시도-정책) 및 각 재전송은 고유한
        `uuid`를 가진 별도의 항목이며, 재시도 및 재전송 시에도 payload의 `event_id`는 유지됩니다.
        `request_header`와 `request_body`는 JSON 텍스트이므로 서명과 payload를 읽으려면 이를
        파싱하십시오. 전송 기록은 약 30일 동안 보관되므로, 빈 배열은 해당 세션에 대해 아직 webhook이 전송되지 않았거나 모든
        전송 내역이 30일보다 오래되었음을 의미합니다. 스코프가 지정된 API 키에는 `sessions: read` 및
        `decisions: read` 권한이 필요합니다.
      operationId: get_v3_session_webhooks
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            사용자(KYC) 또는 기업(KYB) 인증 세션의 UUID(`POST /v3/session/`에서 반환된
            `session_id`)입니다. 서버는 두 세션 유형에 대해 이를 확인합니다.


            **유효한 UUID여야 합니다.** 라우트는 올바른 형식의 UUID만 일치시키므로, 잘못된 형식의 값은 애플리케이션 코드가
            실행되기 전에 URL 라우터에 의해 거부되어 아래에 표시된 JSON `{"detail": ...}` 응답 형식 대신
            `404` **HTML** 페이지가 반환됩니다.
          schema:
            type: string
            format: uuid
          example: 22222222-3333-4444-5555-666666666666
      responses:
        '200':
          description: 세션에 기록된 모든 전송 내역(최신순)입니다.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/SessionWebhookDelivery'
              examples:
                Failed delivery and its successful retry:
                  value:
                    - uuid: 66666666-7777-8888-9999-000000000002
                      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":
                        "9188851d160b5b3aacfc946e4dde1f061b7e568662518942c927ddaf507f533d",
                        "X-Signature-V2":
                        "381236af514d3fb538579365ac5a24f2464ce1b8224c6e770c60d8201c43ecc5",
                        "X-Signature-Simple":
                        "4740131dc38f29e78a8508371979be74967d5307464494bd3148a03b4d6c8716",
                        "X-Timestamp": "1792056139", "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":1792056139,"vendor_data":"user-123","webhook_type":"status.updated","workflow_id":"44444444-5555-6666-7777-888888888888","workflow_version":3}
                      created_at: '2026-10-15T09:22:19.104233Z'
                    - 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'
                No webhook sent yet:
                  value: []
        '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`가 없거나 유효하지 않거나 폐기된 키는 `Authentication
            credentials were not provided or are invalid.`를 수신합니다. 다른 애플리케이션의 키는
            `You do not have permission to perform this action.`을 수신합니다. 이
            endpoint에 필요한 접근 권한이 없는 범위 지정 키는 누락된 권한을 명시하는 메시지를 수신하며, IP 허용 목록
            외부에서 사용된 키는 `This API key can't be used from this IP address.`를
            수신합니다. 알 수 없는 `sessionId`는 자격 증명을 확인하기 전에 `404`를 반환합니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
              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: >-
            세션이 존재하지 않거나 삭제되었거나(자격 증명을 확인하기 전에 `Not found.` 반환), 범위가 지정된 키의 워크플로
            또는 상태 제한 범위를 벗어났습니다(`Session not found.`).
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
              examples:
                Unknown session:
                  value:
                    detail: Not found.
                Outside the key's limits:
                  value:
                    detail: Session not found.
        '429':
          description: >-
            속도 제한 초과: 이 API 키의 현재 1분 시간 창에서 600개를 초과하는 GET 요청이 발생했습니다. 재시도하기 전에
            `Retry-After`초 동안 대기하세요.
          headers:
            Retry-After:
              description: 재시도하기 전 대기할 시간(초)입니다.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: 1분 동안 허용되는 요청 수(600)입니다.
              schema:
                type: integer
                example: 600
            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-get
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
              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/webhooks/'
            \
              -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.list(
                "22222222-3333-4444-5555-666666666666",
            )
            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.list("22222222-3333-4444-5555-666666666666");

            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.List(ctx, \"22222222-3333-4444-5555-666666666666\")\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().list("22222222-3333-4444-5555-666666666666");

            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->list('22222222-3333-4444-5555-666666666666');

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


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            didit.sessions.webhooks.list("22222222-3333-4444-5555-666666666666").each
            do |item|
              puts item.to_h
            end
        - 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.ListAsync("22222222-3333-4444-5555-666666666666");

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SessionWebhookDelivery:
      type: object
      description: 인증 세션에 대해 기록된 webhook 전송 시도 1건으로, 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입니다. 이 전송을 조회하거나 재전송하려면 `{webhook_uuid}`로 사용하십시오.
        session_id:
          type: string
          format: uuid
          description: 전송이 속한 세션입니다(경로의 세션).
        request_url:
          type: string
          format: uri
          nullable: true
          description: 전송이 전송된 대상의 URL입니다.
        response_status:
          type: integer
          nullable: true
          description: >-
            endpoint가 반환한 HTTP 상태입니다. 전송이 대기열에 있고 아직 시도되지 않은 동안에는 `null`입니다.
            HTTP 응답을 받지 못한 경우 Didit은 자체 상태를 기록합니다. endpoint가 5초 이내에 응답하지 않은 경우
            `504`, 연결 실패의 경우 `503`, URL이 안전하지 않은 것으로 거부된 경우(예: 사설 또는 내부 주소)
            `400`, 기타 모든 요청 오류의 경우 `404`를 기록합니다. `400` 이상은 전송 실패로 간주됩니다.
        status:
          type: string
          nullable: true
          description: '이벤트가 생성되었을 때의 세션 상태입니다(예: `In Progress`, `Approved` 또는 `Declined`).'
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        request_header:
          type: string
          description: >-
            Didit이 전송한 요청 헤더(`Content-Type`, `X-Signature`, `X-Signature-V2`,
            `X-Signature-Simple`, `X-Timestamp`, `User-Agent`)의 JSON
            텍스트(문자열)입니다. JSON 파서로 파싱하십시오. 서명이 포함되어 있으며 서명용 비밀값은 절대 포함되지 않습니다.
        request_body:
          type: string
          description: >-
            Didit이 전송한 정확한 payload의 JSON 텍스트(문자열)로, `event_id` 및 `timestamp`를
            포함하여 키가 정렬되어 있습니다. JSON 파서로 파싱하십시오. [Payload
            구조](https://docs.didit.me/ko/integration/webhooks#payload-구조)를
            참고하십시오. `media: read` 권한이 없는 범위 지정 키의 경우 내부 미디어 URL이 `null`이 되며,
            `sessions: write` 권한이 없으면 세션 token과 호스팅 인증 링크가 `null`이 됩니다. 이러한 방식으로
            변경된 본문은 더 이상 해당 서명과 일치하지 않습니다. Didit은 귀하의 endpoint가 반환한 응답 본문을 기록하지
            않습니다.
        created_at:
          type: string
          format: date-time
          description: 전송이 생성된 시점입니다.
    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: >-
        Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본
        키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 none, read, write 범위로 권한을 제한할 수 있으며
        특정 워크플로나 승인된 세션, IP 주소 목록, 만료일 등으로 제한할 수도 있습니다. 401은 키가 잘못되었거나 폐기되었거나
        만료되었음을 의미합니다. 403은 키가 전송되지 않았거나, 키에 해당 리소스나 작업에 대한 접근 권한이 없거나, 요청이 허용된
        IP 목록 외부 주소에서 발생했음을 의미합니다. 세션 경로에서의 404는 해당 세션이 키의 허용 워크플로 또는 상태 범위를
        벗어났음을 의미합니다. 미디어 접근 권한이 없는 키는 이미지, 비디오, PDF URL을 null로 수신하며, 세션 write
        권한이 없는 키는 세션 링크와 token을 null로 수신합니다.
        https://docs.didit.me/console/api-keys 를 참고하십시오.

````

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