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

# Renvoyer un webhook de session (API Didit)

> Renvoyez un webhook de session enregistré à la même URL avec de nouvelles signatures, et obtenez la réponse de votre endpoint, avec Didit.



Prompt de l'API de renvoi d'une livraison de webhook de session
        Copier le prompt dans le presse-papiers



      
      

\<pre>

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

Endpoint:
POST https://verification.didit.me/v3/session/{session_id}/webhook/{webhook_uuid}/resend
(no trailing slash, no request body)

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

Goal:
\- Replay a webhook my endpoint missed or rejected, after I fixed the endpoint.

Behavior:
\- {webhook_uuid} is the uuid of an entry from GET /v3/session/{session_id}/webhooks/, and it must belong to the session in the path.
\- Didit sends the recorded payload again to the URL the delivery was first sent to. The payload keeps its event_id; Didit refreshes the timestamp field, the X-Timestamp header and the signatures, using the destination's current signing secret (the application-level secret for a delivery sent to the legacy webhook_url).
\- Synchronous: Didit waits up to 5 seconds for my endpoint, records the attempt as a new delivery and returns it. The original delivery is not changed.
\- The call returns 200 even when my endpoint answered with an error: read response_status in the returned delivery.
\- A failed resend is not retried automatically. Every call sends one more request to my endpoint, so my handler must be idempotent on event_id.

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

What to read from the response:
\- uuid: the new delivery id.
\- response_status: what my endpoint answered this time (504 timeout, 503 connection failure, 400 URL refused as unsafe).
\- request_header and request_body: the headers and body actually sent.

Failure modes:
\- 400 with code webhook_url_missing: the delivery has no recorded URL.
\- 400 with code webhook_resend_error: the recorded payload could not be re-signed or sent.
\- 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": "Webhook log not found" }).
\- 429: more than 300 writes per minute for this API key; honor Retry-After.

Side effects: sends one HTTP request to my webhook endpoint and adds one delivery to the session's webhook log.

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

\</pre>



      
      

Coller dans

> [!NOTE]
>
> Le renvoi est envoyé à l'URL enregistrée sur la livraison, même si vous avez modifié l'URL de la destination depuis. Comme le payload conserve son `event_id`, un récepteur qui [effectue une déduplication basée sur `event_id`](https://docs.didit.me/fr/integration/webhooks#envelope) traite le renvoi comme l'événement qu'il connaît déjà.Retrouvez la livraison à renvoyer avec [Lister les livraisons de webhook de session](https://docs.didit.me/fr/management-api/sessions/list-webhooks.md).


## OpenAPI

````yaml fr/openapi-25.json POST /v3/session/{sessionId}/webhook/{webhook_uuid}/resend
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}/resend:
    post:
      tags:
        - Sessions
      summary: Renvoyer la livraison du webhook de session
      description: >-
        Renvoyez un webhook de session enregistré vers l'URL à laquelle il a été
        envoyé initialement, avec le même payload et le même `event_id`, ainsi
        qu'un `timestamp`, un en-tête `X-Timestamp` et des signatures
        actualisés. Didit le signe avec le secret actuel de la destination à
        laquelle appartient la livraison (ou le secret au niveau de
        l'application pour une livraison vers l'URL de webhook historique),
        attend jusqu'à 5 secondes la réponse de votre endpoint, enregistre la
        tentative en tant que nouvelle livraison et la renvoie avec un code
        `200`, quelle que soit la réponse de votre endpoint : consultez
        `response_status`. Un renvoi n'est pas réessayé automatiquement, et
        chaque appel effectue un nouvel envoi ; rendez donc votre endpoint
        idempotent sur l'`event_id`. Le chemin ne comporte pas de barre oblique
        finale et la requête n'a pas de corps. Une clé API restreinte nécessite
        `webhooks: write` et `decisions: read`.
      operationId: post_v3_session_webhook_resend
      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 à renvoyer : 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 nouvelle livraison, déjà tentée. `response_status` est la réponse
            de votre endpoint cette fois-ci. La livraison d'origine reste
            inchangée.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionWebhookDelivery'
              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
                    status: In Progress
                    webhook_type: status.updated
                    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}
                    created_at: '2026-10-16T14:05:42.330981Z'
        '400':
          description: >-
            La livraison n'a pas pu être renvoyée. Basez-vous sur `code` :
            `webhook_url_missing` signifie que la livraison n'a pas d'URL
            enregistrée et rien n'est envoyé ; `webhook_resend_error` signifie
            que la livraison stockée n'a pas pu être signée à nouveau ou que la
            tentative n'a pas pu être effectuée. Après `webhook_resend_error`,
            `detail` commence par `Error processing webhook resend:` suivi d'un
            texte de diagnostic susceptible de changer.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
                  code:
                    type: string
                    description: >-
                      Code d'erreur stable lisible par machine. Effectuez vos
                      branchements sur cette valeur, pas sur `detail`.
              examples:
                No recorded URL:
                  value:
                    detail: >-
                      The webhook delivery does not have a request URL
                      configured
                    code: webhook_url_missing
                Resend failed:
                  value:
                    detail: >-
                      Error processing webhook resend: Invalid webhook data
                      format
                    code: webhook_resend_error
        '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 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.
                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 `Webhook log not found`.
          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: Webhook log not found
        '429':
          description: >-
            Limite de débit dépassée : plus de 300 requêtes d'écriture (POST,
            PATCH, PUT, DELETE) 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 (300).
              schema:
                type: integer
                example: 300
            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-write
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              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/session/22222222-3333-4444-5555-666666666666/webhook/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.sessions.webhooks.resend(
                "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.resend(
              "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.Resend(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().resend("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->resend('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.resend(
              "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.ResendAsync("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.