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

# Obtenir une livraison de webhook (API)

> Consultez une livraison webhook de Didit : en-têtes de signature, payload JSON exact et code de statut renvoyé par votre endpoint.



Obtenir l'invite de l'API de livraison de destination de webhook
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans

Pour vérifier votre code de signature avec une livraison réelle, recalculez `X-Signature-V2` à partir de `request_body` avec le `secret_shared_key` de la destination, comme décrit dans [Vérification de signature](https://docs.didit.me/fr/integration/webhooks.md#vérification-de-la-signature). Utilisez une clé avec accès complet pour cela : un corps dont les valeurs sont masquées ne correspond plus à ses signatures.Pour renvoyer la livraison, appelez [Renvoyer une livraison de destination de webhook](https://docs.didit.me/fr/management-api/webhook/resend-delivery.md).


## OpenAPI

````yaml fr/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 de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/webhook/destinations/{destination_uuid}/deliveries/{delivery_uuid}/:
    get:
      tags:
        - Webhook
      summary: Obtenir la livraison de la destination de webhook
      description: >-
        Récupérer une tentative de livraison vers une destination de webhook
        avec les en-têtes de requête exacts et le corps JSON envoyés par Didit,
        le statut HTTP renvoyé par votre endpoint et le temps de réponse.
        `request_header` et `request_body` sont du texte JSON : analysez-les
        pour lire les en-têtes de signature et le payload, par exemple pour
        vérifier votre [vérification de
        signature](https://docs.didit.me/fr/integration/webhooks#vérification-de-la-signature)
        par rapport au `secret_shared_key` de la destination. Une livraison ne
        contient jamais le secret de signature, et Didit n'enregistre pas le
        corps de réponse de votre endpoint. Une clé API avec restriction de
        portée nécessite `webhooks: read` et `decisions: read` ; une clé limitée
        à certains workflows ou aux sessions approuvées ne peut pas utiliser cet
        endpoint.
      operationId: get_webhook_destination_delivery
      parameters:
        - name: destination_uuid
          in: path
          required: true
          description: UUID de la destination à laquelle la livraison a été envoyée.
          schema:
            type: string
            format: uuid
          example: 11111111-2222-3333-4444-555555555555
        - name: delivery_uuid
          in: path
          required: true
          description: >-
            UUID de la livraison : le `uuid` d'une entrée renvoyée par `GET
            /v3/webhook/destinations/{destination_uuid}/deliveries/`.
          schema:
            type: string
            format: uuid
          example: 66666666-7777-8888-9999-000000000001
      responses:
        '200':
          description: La livraison, avec ses en-têtes et son corps de requête.
          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: >-
            La clé API a expiré : elle a été créée avec une date d'expiration
            qui est dépassée. Une clé incorrecte ou révoquée reçoit également un
            code `401` ; une clé manquante reçoit un code `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            La requête n'est pas autorisée. Un en-tête `x-api-key` manquant,
            invalide ou révoqué renvoie `You do not have permission to perform
            this action.` Une clé avec restriction de portée sans l'accès requis
            par cet endpoint renvoie un message indiquant l'accès manquant, et
            une clé utilisée en dehors de sa liste d'autorisation d'adresses IP
            renvoie `This API key can't be used from this IP address.` Une clé
            limitée à certains workflows ou à des sessions approuvées renvoie
            `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: Message d'erreur lisible par l'humain.
              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: >-
            La destination n'existe pas pour l'application ou a été supprimée,
            ou la livraison n'existe pas, appartient à une autre destination, ou
            n'est plus disponible.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Destination not found:
                  value:
                    detail: Webhook destination not found.
                Delivery not found:
                  value:
                    detail: Webhook delivery not found.
        '429':
          description: >-
            Limite de débit dépassée : plus de 600 requêtes GET dans la fenêtre
            actuelle d'une minute pour cette clé API. Attendez `Retry-After`
            secondes avant de réessayer.
          headers:
            Retry-After:
              description: Secondes à attendre avant de réessayer.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: Requêtes autorisées dans la fenêtre d'une minute (600).
              schema:
                type: integer
                example: 600
            X-RateLimit-Remaining:
              description: Requêtes restantes dans la fenêtre actuelle.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Temps Unix (en secondes) auquel la fenêtre actuelle se
                réinitialise.
              schema:
                type: integer
                example: 1792056120
            X-RateLimit-Scope:
              description: Nom du budget qui a été dépassé.
              schema:
                type: string
                example: generic-get
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              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: >-
        Une tentative de livraison vers une destination de webhook, avec
        exactement les en-têtes et le corps de requête envoyés par 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 de livraison, pour les appels de consultation détaillée et de
            renvoi.
        session_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            Session de vérification d'utilisateur concernée par l'événement.
            `null` pour les événements de session d'entreprise, ainsi que pour
            les événements utilisateur, entreprise, de transaction, de Travel
            Rule et de workflow.
        request_url:
          type: string
          format: uri
          nullable: true
          description: "URL à laquelle la livraison a été envoyée\_: l'URL de la destination au moment où l'événement a été généré."
        response_status:
          type: integer
          nullable: true
          description: >-
            Code d'état HTTP renvoyé par votre endpoint. `null` tant que la
            livraison est en file d'attente et n'a pas encore été tentée.
            Lorsqu'aucune réponse HTTP n'a été reçue, Didit enregistre son
            propre statut : `504` lorsque votre endpoint n'a pas répondu dans un
            délai de 5 secondes, `503` en cas d'échec de connexion, `400`
            lorsque l'URL a été rejetée car non sécurisée (par exemple une
            adresse privée ou interne), et `404` pour toute autre erreur de
            requête. Un code supérieur ou égal à `400` est considéré comme une
            livraison échouée.
        response_time_ms:
          type: integer
          nullable: true
          minimum: 0
          description: >-
            Durée de la tentative, en millisecondes. `null` tant que la
            livraison est dans la file d'attente.
        status:
          type: string
          nullable: true
          description: >-
            Statut signalé par l'événement lors de sa génération : le statut de
            la session pour les événements de session (par exemple `Approved` ou
            `In Review`), le statut de la personne ou de l'entreprise pour les
            événements utilisateur et entreprise, et le statut de la transaction
            pour les événements de transaction. `null` pour les événements ne
            comportant aucun statut.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
          description: Date et heure de création de la livraison.
        request_header:
          type: string
          description: >-
            Texte JSON (une chaîne de caractères) des en-têtes de requête
            envoyés par Didit : `Content-Type`, `X-Signature`, `X-Signature-V2`,
            `X-Signature-Simple`, `X-Timestamp` et `User-Agent`. Analysez-le
            avec un parseur JSON. Il contient les signatures, jamais le secret
            de signature.
        request_body:
          type: string
          description: >-
            Texte JSON (une chaîne de caractères) du payload exact envoyé par
            Didit, clés triées, comprenant `event_id` et `timestamp`.
            Analysez-le avec un parseur JSON ; voir [Format du
            payload](https://docs.didit.me/fr/integration/webhooks#structure-du-payload).
            Pour une clé restreinte sans `media: read`, les URL de médias qu'il
            contient sont `null` ; sans `sessions: write`, les tokens de session
            et les liens de vérification hébergés sont `null`. Un corps modifié
            de cette manière ne correspond plus à ses signatures. Didit
            n'enregistre pas le corps de réponse renvoyé par votre endpoint.
    WebhookEvent:
      type: string
      description: >-
        Nom d'événement webhook pris en charge. Utilisez ces chaînes exactes
        dans `subscribed_events` ; les valeurs non prises en charge sont
        rejetées.
      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: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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