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

# 웹훅 전송 재전송 API

> 과거 웹훅 전송을 새로 서명하여 엔드포인트에 다시 보내고, 엔드포인트가 반환한 HTTP 상태와 함께 새 시도 결과를 받아보세요. Didit에서 제공합니다.



웹훅 대상 전송 재전송 API 프롬프트
        프롬프트를 클립보드에 복사



      
      

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



      
      

붙여넣을 곳

> [!WARNING]
>
> 각 호출은 웹훅을 다시 전송합니다. 대량으로 재전송하기 전에 `event_id`를 기준으로 엔드포인트가 멱등성을 갖도록 만드세요. 그리고 `response_status`가 `null`이거나 `400` 이상인 전송 건만 재전송하세요.재전송은 원래 전송이 사용한 URL로 보내집니다. 웹훅 대상을 새 URL로 옮겼다면, 이전 전송 건은 여전히 이전 URL을 가리킵니다. 재전송할 전송 건은 [웹훅 대상 전송 목록 조회](https://docs.didit.me/ko/management-api/webhook/list-deliveries.md)로 찾고, 서명 검증은 [웹훅 가이드](https://docs.didit.me/ko/integration/webhooks.md)를 참고하세요.


## OpenAPI

````yaml ko/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입니다. 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: webhook 대상 전송 재전송
      description: >-
        endpoint가 다운된 후 등 이전 전송을 다시 보냅니다. Didit은 저장된 payload를 가져와 새로운
        `timestamp`를 설정하고, 대상의 현재 `secret_shared_key`(`X-Signature`,
        `X-Signature-V2`, `X-Signature-Simple` 및 `X-Timestamp`)로 다시 서명한 후, 대상의
        URL이 이후 변경되었거나 대상이 비활성화되었더라도 해당 전송의 `request_url`로 POST 요청을 전송합니다.
        `event_id` 및 payload의 나머지 부분은 변경되지 않으므로 `event_id`를 기준으로 중복을 제거하십시오. 이
        호출은 귀하의 endpoint 응답을 최대 5초 동안 대기하며, endpoint의 응답 결과와 관계없이 새 전송과 함께
        `200`을 반환합니다(`response_status` 참조). 재전송은 자동으로 재시도되지 않으며, 호출할 때마다 다시 전송되어
        새로운 전송이 생성됩니다. 또한 요청 본문은 없습니다. 범위가 지정된 API 키에는 `webhooks: write` 및
        `decisions: read` 권한이 필요합니다. 일부 워크플로나 승인된 세션으로 제한된 키는 이 endpoint를 사용할 수
        없습니다.
      operationId: resend_webhook_destination_delivery
      parameters:
        - name: destination_uuid
          in: path
          required: true
          description: 전송이 전달된 webhook 대상의 UUID입니다.
          schema:
            type: string
            format: uuid
          example: 11111111-2222-3333-4444-555555555555
        - name: delivery_uuid
          in: path
          required: true
          description: >-
            다시 전송할 전송의 UUID입니다(`GET
            /v3/webhook/destinations/{destination_uuid}/deliveries/`에서 반환된 항목의
            `uuid`).
          schema:
            type: string
            format: uuid
          example: 66666666-7777-8888-9999-000000000001
      responses:
        '200':
          description: >-
            이미 시도된 새 전송입니다. `response_status`는 이번에 endpoint가 응답한 내용(`504` 시간 초과,
            `503` 연결 실패)입니다. 원래 전송은 변경되지 않습니다.
          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: 저장된 전송 내역에 다시 서명할 수 없습니다. 아무것도 전송되지 않습니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
                  code:
                    type: string
                    description: 기계 판독 가능한 고정 오류 코드입니다. `detail`이 아닌 이 값을 기준으로 분기 처리하십시오.
              examples:
                Unsignable delivery:
                  value:
                    detail: Invalid webhook data format
                    code: invalid_webhook_payload
        '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`가 누락되었거나 유효하지 않거나 폐기된 경우 `You do not have
            permission to perform this action.`을 수신합니다. 이 endpoint에 필요한 접근 권한이
            없는 범위 지정 키는 누락된 권한을 명시하는 메시지를 수신하며, IP 허용 목록 외부에서 사용된 키는 `This API
            key can't be used from this IP address.`를 수신합니다. 일부 워크플로나 승인된 세션으로
            제한된 키는 `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: 사람이 읽기 쉬운 오류 메시지입니다.
              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: >-
            애플리케이션에 해당 대상이 존재하지 않거나 삭제되었거나, 전송이 존재하지 않거나 다른 대상에 속해 있거나 더 이상 사용할
            수 없습니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
              examples:
                Destination not found:
                  value:
                    detail: Webhook destination not found.
                Delivery not found:
                  value:
                    detail: Webhook delivery not found.
        '429':
          description: >-
            속도 제한 초과: 이 API 키의 현재 1분 시간 창에서 300개를 초과하는 쓰기 요청(POST, PATCH, PUT,
            DELETE)이 발생했습니다. 재시도하기 전에 `Retry-After`초 동안 대기하세요.
          headers:
            Retry-After:
              description: 재시도하기 전 대기할 시간(초)입니다.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: 1분 동안 허용되는 요청 수(300)입니다.
              schema:
                type: integer
                example: 300
            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-write
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 사람이 읽기 쉬운 오류 메시지입니다.
              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: webhook 대상으로의 전송 시도 1회이며, 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입니다.
        session_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            해당 이벤트의 대상인 사용자 인증 세션입니다. 기업 세션, 사용자, 기업, 거래, Travel Rule 및 워크플로
            이벤트의 경우 `null`입니다.
        request_url:
          type: string
          format: uri
          nullable: true
          description: '전송이 전송된 대상의 URL: 이벤트가 생성되었을 때 대상의 URL입니다.'
        response_status:
          type: integer
          nullable: true
          description: >-
            endpoint가 반환한 HTTP 상태입니다. 전송이 대기열에 있고 아직 시도되지 않은 동안에는 `null`입니다.
            HTTP 응답을 받지 못한 경우 Didit은 자체 상태를 기록합니다. endpoint가 5초 이내에 응답하지 않은 경우
            `504`, 연결 실패의 경우 `503`, URL이 안전하지 않은 것으로 거부된 경우(예: 사설 또는 내부 주소)
            `400`, 기타 모든 요청 오류의 경우 `404`를 기록합니다. `400` 이상은 전송 실패로 간주됩니다.
        response_time_ms:
          type: integer
          nullable: true
          minimum: 0
          description: 시도에 걸린 시간(밀리초 단위)입니다. 전송이 대기열에 있는 동안에는 `null`입니다.
        status:
          type: string
          nullable: true
          description: >-
            이벤트 생성 시 보고된 상태: 세션 이벤트의 경우 세션 상태(예: `Approved` 또는 `In Review`), 사용자
            및 기업 이벤트의 경우 개인 또는 회사의 상태, 거래 이벤트의 경우 거래 상태입니다. 상태가 없는 이벤트의 경우
            `null`입니다.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
          description: 전송이 생성된 시점입니다.
        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가 반환한 응답 본문을 기록하지
            않습니다.
    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.