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

# Récupérer la livraison webhook d'une session : API Didit

> Récupérez une livraison webhook de session Didit : URL, réponse HTTP de votre endpoint, en-têtes de signature et corps JSON exact envoyé.



Prompt de l'API pour obtenir la livraison du webhook de session
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans

Le payload contenu dans `request_body` est celui décrit dans [Webhooks](https://docs.didit.me/fr/integration/webhooks.md#structure-du-payload), et les en-têtes sont ceux présentés dans [vérification de signature](https://docs.didit.me/fr/integration/webhooks.md#vérification-de-la-signature). Pour renvoyer la livraison, utilisez [Renvoyer la livraison du webhook de session](https://docs.didit.me/fr/management-api/sessions/resend-webhook.md).


## OpenAPI

````yaml fr/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 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/session/{sessionId}/webhook/{webhook_uuid}:
    get:
      tags:
        - Sessions
      summary: Obtenir la livraison du webhook de session
      description: "Récupérer une livraison de webhook d'une session de vérification\_: l'URL vers laquelle elle a été envoyée, le statut HTTP renvoyé par votre endpoint, ainsi que les en-têtes et le corps JSON exacts envoyés par Didit. `request_header` et `request_body` sont du texte JSON\_; pour vérifier votre [vérification de signature](https://docs.didit.me/fr/integration/webhooks#vérification-de-la-signature), recalculez `X-Signature-V2` à partir du corps analysé avec le secret de la destination à laquelle elle a été envoyée (ou le secret au niveau de l'application pour une livraison vers l'URL de webhook héritée). Le chemin ne comporte pas de barre oblique finale\_: avec une, il renvoie `404`. Une clé API avec restriction de portée nécessite `sessions: read` et `decisions: read`."
      operationId: get_v3_session_webhook
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la session de vérification, utilisateur (KYC) ou entreprise
            (KYB) : le `session_id` renvoyé par `POST /v3/session/`. Le serveur
            le résout pour les deux types de session.


            **Doit être un UUID valide.** La route ne correspond qu'aux UUID
            bien formés ; une valeur malformée est donc rejetée par le routeur
            d'URL avant l'exécution de tout code d'application et la réponse est
            une page **HTML** `404` plutôt que l'enveloppe JSON `{"detail":
            ...}` illustrée ci-dessous.
          schema:
            type: string
            format: uuid
          example: 22222222-3333-4444-5555-666666666666
        - name: webhook_uuid
          in: path
          required: true
          description: >-
            UUID de la livraison : le `uuid` d'une entrée renvoyée par `GET
            /v3/session/{sessionId}/webhooks/`. Il doit appartenir à la session
            présente dans le chemin.
          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/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: >-
            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. L'absence de `x-api-key`, ou une clé
            invalide ou révoquée, renvoie `Authentication credentials were not
            provided or are invalid.` Une clé appartenant à une autre
            application 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.` Un
            `sessionId` inconnu renvoie `404` avant la vérification des
            identifiants.
          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: >-
                      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: >-
            La session n'existe pas ou a été supprimée (`Not found.`, renvoyé
            avant la vérification des identifiants), ou elle se trouve en dehors
            des limites de workflow ou de statut d'une clé restreinte (`Session
            not found.`). Une livraison qui n'existe pas, appartient à une autre
            session ou n'est plus disponible renvoie `No WebhookLog matches the
            given query.`
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              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: >-
            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/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: >-
        Une tentative de livraison de webhook enregistrée pour une session de
        vérification, avec les en-têtes et le corps exacts de la requête envoyée
        par 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 de livraison. Utilisez-le comme `{webhook_uuid}` pour obtenir ou
            renvoyer cette livraison.
        session_id:
          type: string
          format: uuid
          description: >-
            La session à laquelle appartient la livraison (la session indiquée
            dans le chemin).
        request_url:
          type: string
          format: uri
          nullable: true
          description: URL à laquelle la livraison a été envoyée.
        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.
        status:
          type: string
          nullable: true
          description: >-
            Statut de la session lors de la génération de l'événement, par
            exemple `In Progress`, `Approved` ou `Declined`.
        webhook_type:
          $ref: '#/components/schemas/WebhookEvent'
        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.
        created_at:
          type: string
          format: date-time
          description: Date et heure de création de la livraison.
    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.