> ## 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 de validation des signatures : revérifier PDF signés

> Revérifiez avec Didit les documents signés : intégrité du fichier, signature PAdES, certificat, révocation et horodatage.

Vérifie à nouveau les documents signés d'une étape et enregistre le résultat dans `validation` de chaque signataire. Didit relit chaque PDF signé et vérifie son SHA-256. Pour une signature avancée (AES), il valide aussi la signature PAdES, le certificat, les données de révocation et l'horodatage. Une signature simple ne comporte aucune signature numérique : seule l'intégrité du fichier est vérifiée. Rien n'est signé à nouveau. Dans la console, cette action correspond au bouton **Valider à nouveau** de l'onglet **Signature** de la session.

```bash theme={null}
curl -X POST 'https://verification.didit.me/v3/session/{session_id}/signatures/{node_id}/validate/' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"signature_id": "{signature_id}"}'
```

Envoyez `signature_id` pour vérifier un seul signataire. Sans ce champ, Didit vérifie tous les signataires de l'étape et répond `409` avec `signature_not_signed` si l'un d'entre eux n'a pas encore signé. Un PDF signé conservé qui ne correspond plus à son `sha256_signed` renvoie `400` avec `signature_document_changed`.

La réponse est `{ "signatures": [...] }` avec les signataires vérifiés. Consultez `validation.valid` pour le résultat global et `validation.documents[]` pour chaque document. Voir [Valider à nouveau une signature](https://docs.didit.me/fr/core-technology/electronic-signature/report-electronic-signature.md#valider-à-nouveau-une-signature) pour chaque champ.

## Liens connexes

* [Rapport de signature électronique](https://docs.didit.me/fr/core-technology/electronic-signature/report-electronic-signature.md)
* [Télécharger un document signé](https://docs.didit.me/fr/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml fr/openapi-25.json POST /v3/session/{sessionId}/signatures/{nodeId}/validate/
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}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Valider à nouveau les signatures
      description: >-
        Vérifier à nouveau les documents signés d'une étape de Signature
        électronique. Didit relit chaque PDF signé, vérifie son SHA-256 et, pour
        une signature avancée (AES), valide la signature PAdES, le certificat,
        les données de révocation et l'horodatage (une signature simple ne
        possède pas de signature numérique, seule l'intégrité du fichier est
        donc vérifiée), puis enregistre le résultat dans le champ `validation`
        de chaque signataire et renvoie les éléments mis à jour. Aucun document
        n'est signé à nouveau. Envoyez `signature_id` pour vérifier un seul
        signataire ; sans cela, chaque signataire de l'étape est vérifié, et
        l'appel échoue si l'un d'entre eux n'a pas signé.


        Nécessite `write:sessions` ; votre clé API fonctionne. Dans la console,
        il s'agit du bouton **Valider à nouveau**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            La session de vérification des utilisateurs (KYC) ou de vérification
            d'entreprise (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            L'étape de signature électronique : `node_id` de l'élément dans
            `signatures[]`.
          schema:
            type: string
            example: feature_signature
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                signature_id:
                  type: string
                  format: uuid
                  description: '`id` de l''élément d''un signataire dans `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: Les signataires vérifiés, avec leur `validation` mise à jour.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Un PDF signé stocké ne correspond plus au SHA-256 enregistré lors de
            sa signature.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Un fichier signé ne correspond plus à son hachage
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Identifiants manquants, ou identifiant ne pouvant pas lire cette
            session. Une clé manquante renvoie `403` ; une clé erronée, révoquée
            ou expirée renvoie `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            Aucune signature ne correspond : la session, l'étape ou le
            signataire n'existe pas ou a été supprimé.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: Aucune signature de ce type dans cette étape
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            Un signataire de l'étape n'a pas signé, il n'y a donc rien à
            valider.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Un signataire n'a pas encore signé
                  value:
                    code: signature_not_signed
                    detail: signature_not_signed
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.signatures.validate(
                "11111111-2222-3333-4444-555555555555",
                "feature_signature",
                signature_id="0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10",
            )
            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.signatures.validate(
              "11111111-2222-3333-4444-555555555555",
              "feature_signature",
              {
                signature_id: "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10",
              },
            );
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.Signatures.Validate(ctx, \"11111111-2222-3333-4444-555555555555\", \"feature_signature\", didit.SessionsSignaturesValidateParams{\n\tSignatureID: didit.String(\"0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10\"),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.SessionsSignaturesValidateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().signatures().validate("11111111-2222-3333-4444-555555555555",
            "feature_signature", SessionsSignaturesValidateParams.builder()
                    .signatureId("0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10")
                    .build());
            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->signatures->validate('11111111-2222-3333-4444-555555555555',
            'feature_signature', [
                'signature_id' => '0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10',
            ]);

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

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.sessions.signatures.validate(
              "11111111-2222-3333-4444-555555555555",
              "feature_signature",
              signature_id: "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10"
            )
            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.Signatures.ValidateAsync("11111111-2222-3333-4444-555555555555",
            "feature_signature", new SessionsSignaturesValidateParams

            {
                SignatureId = "0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SignatureResult:
      type: object
      description: >-
        Le résultat d'un signataire pour une étape de Signature électronique.
        Consultez le [rapport de Signature
        électronique](/fr/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Transmettez-le comme `signature_id` pour télécharger les preuves de
            ce signataire ou valider sa signature.
        node_id:
          type: string
          description: L'étape de workflow qui l'a produit.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            Statut du signataire dans l'étape. Seul `signed` signifie que les
            documents sont signés.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            Le résultat de l'étape. Un avertissement le définit via sa règle ;
            les règles de statut personnalisées s'appliquent ensuite.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (par défaut) ou `aes`. `qes` (signature électronique
            qualifiée, SEQ) est un module complémentaire qui n'est pas encore
            disponible.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: >-
            `pdf` pour une signature Simple, `pades` pour une signature Avancée
            (AES).
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` une fois qu'une signature avancée (AES) est apposée,
            sinon null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                Le nom du signataire. Vérifié (à partir de la vérification
                d'identité approuvée ou de la session), sauf au niveau Simple
                sans nom de session vérifié, où il s'agit du nom saisi par le
                signataire et il n'est pas vérifié.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: La désignation de la personne clé, telle que déclarée.
            roles:
              type: array
              items:
                type: string
              description: >-
                Les rôles structurés de la personne clé, tels que déclarés pour
                l'entreprise.
            identity_session_id:
              type: string
              format: uuid
              description: La session KYC qui a vérifié le signataire.
        identity_used:
          type: object
          description: >-
            L'identité vérifiée sur laquelle repose la signature. Vide pour une
            signature simple sans identité vérifiée.
          properties:
            session_id:
              type: string
              format: uuid
            kyc_id:
              type: string
              format: uuid
              nullable: true
            verified:
              type: boolean
            expected_name:
              type: string
              nullable: true
              description: Le nom auquel le signataire devait correspondre.
        certificate:
          type: object
          nullable: true
          description: >-
            Le certificat avec lequel les documents ont été signés. `null`
            jusqu'à la signature, et toujours `null` pour une signature Simple.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Numéro de série, hexadécimal.
            valid_from:
              type: string
              format: date-time
            valid_until:
              type: string
              format: date-time
        confirmation:
          type: object
          properties:
            channel:
              type: string
              nullable: true
              enum:
                - email
                - sms
              description: '`null` pour une signature Simple, qui ne comporte aucun code.'
            destination:
              type: string
              nullable: true
              description: Le contact masqué auquel le code a été envoyé.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Codes saisis, dont le bon.
        timestamp:
          type: object
          nullable: true
          description: >-
            L'horodatage RFC 3161 dans la signature, émis par Didit. `null`
            jusqu'à la signature, et toujours `null` pour une signature simple.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Toujours `false` pour l'AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  Le document présent sur la copie de ce signataire. Utilisez-le
                  pour télécharger le fichier signé.
              uuid:
                type: string
                format: uuid
                description: Identique à `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: Pages du document signé. Pour Word, du PDF converti.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 du document tel qu'il a été présenté au signataire.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 du PDF signé, une fois signé.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed` : ouvert mais non signé. `not_reached` : jamais
                  ouvert.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Moment où le signataire a atteint la fin d'un document sans
                  champs, lorsque l'étape l'exige.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Moment où le signataire a accepté un document sans champs, ou
                  a complété les champs d'un document comportant des champs.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Chemin du PDF signé, une fois signé. Voir [Télécharger un
                  document
                  signé](/fr/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` pour un document avec des champs, `read_and_agree`
                  pour un document sans champs.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, ou `docx` pour un document Word que Didit a converti en
                  PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` pour un PDF. Pour un document Word, le fichier
                  d'origine et la conversion.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: Le nom d'origine de votre fichier Word.
                  sha256:
                    type: string
                    description: SHA-256 de votre fichier Word d'origine.
                  size_bytes:
                    type: integer
                    description: Taille de votre fichier Word d'origine.
                  converter:
                    type: string
                    description: Version du convertisseur qui a produit le PDF.
              fields:
                type: array
                description: >-
                  Champs sur le document, avec leurs valeurs. Vide pour un
                  document sans champs.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            La signature et les initiales adoptées par le signataire pour les
            champs de signature et d'initiales. Vaut `null` tant que le
            signataire n'en a pas adopté.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed` : le nom vérifié dans un style manuscrit. `drawn` :
                dessiné avec un doigt ou une souris.
            font:
              type: string
              nullable: true
              description: >-
                Le style d'écriture manuscrite d'une signature tapée. `null`
                lorsqu'elle est dessinée.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Moment où le signataire a accepté, sur l'écran d'examen, de signer
            électroniquement les documents. Défini lorsqu'un document comporte
            des champs.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Chemin d'accès au PDF de preuve, une fois signé. Voir [Télécharger
            les preuves de
            signature](/fr/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Avertissements générés pour ce signataire. Voir [Avertissements de
            la signature
            électronique](/fr/core-technology/electronic-signature/warnings-electronic-signature).
          items:
            type: object
            properties:
              code:
                type: string
                enum:
                  - SIGNATURE_DECLINED
                  - SIGNATURE_OTP_FAILED
                  - SIGNATURE_NAME_MISMATCH
                  - SIGNATURE_IDENTITY_NOT_VERIFIED
                  - SIGNATURE_DOCUMENT_CHANGED
                  - SIGNATURE_FIELD_DATA_MISSING
              node_id:
                type: string
        validation:
          type: object
          nullable: true
          description: >-
            La dernière vérification cryptographique des documents signés.
            `null` jusqu'à ce que les documents soient signés. Si Didit ne peut
            pas confirmer l'issue de la signature, la valeur est `{"valid":
            null, "reason": "signature_provider_outcome_unknown", "checked_at":
            ...}` et `status` reste à `signing` : traitez-le comme non signé.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` lorsque chaque document est valide. `null` lorsque le
                résultat de la signature n'a pas pu être confirmé.
            reason:
              type: string
              description: >-
                Défini lorsque `valid` est `null` :
                `signature_provider_outcome_unknown`.
            checked_at:
              type: string
              format: date-time
            documents:
              type: array
              items:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  checked_at:
                    type: string
                    format: date-time
                  valid:
                    type: boolean
                    description: >-
                      `true` lorsque la signature et l'horodatage sont tous deux
                      valides et de confiance.
                  integrity:
                    type: boolean
                    description: >-
                      `true` lorsque le document n'a pas été modifié depuis sa
                      signature.
                  trusted:
                    type: boolean
                    description: >-
                      `true` lorsque le certificat de signature remonte à une
                      racine de confiance.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Vérification de la liste de confiance de l'UE. Pour AES :
                      `{"status": "not_applicable", "reason":
                      "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      Le certificat avec lequel les documents ont été signés.
                      `null` jusqu'à la signature, et toujours `null` pour une
                      signature Simple.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Numéro de série, hexadécimal.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      L'horodatage RFC 3161 dans la signature, émis par Didit.
                      `null` jusqu'à la signature, et toujours `null` pour une
                      signature simple.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Toujours `false` pour l'AES.
                      valid:
                        type: boolean
        declined_at:
          type: string
          format: date-time
          nullable: true
        declined_action:
          type: string
          enum:
            - DECLINE
            - REVIEW
            - NO_ACTION
        signed_at:
          type: string
          format: date-time
          nullable: true
        expires_at:
          type: string
          format: date-time
          description: Moment où le lien de signature cesse de fonctionner.
        email_sent_at:
          type: string
          format: date-time
          nullable: true
        email_unavailable_reason:
          type: string
          nullable: true
        ip_address:
          type: string
          nullable: true
          description: L'adresse IP du signataire au moment où il a demandé son code.
        place:
          type: string
          nullable: true
          description: 'Non collecté : toujours `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Un champ d'un document signé, avec sa valeur sur la copie de ce
        signataire. Voir
        [Champs](/fr/core-technology/electronic-signature/report-electronic-signature#champs).
      properties:
        key:
          type: string
          description: La clé du champ, telle qu'utilisée dans `sign.field_values`.
        type:
          type: string
          enum:
            - signature
            - initials
            - full_name
            - date_signed
            - text
            - checkbox
            - email
            - data
        role:
          type: string
          enum:
            - verified_person
            - legal_representative
            - key_people
        label:
          type: string
        page:
          type: integer
          description: >-
            Numéro de page, à partir de 1. Pour un document Word, page du PDF
            converti.
        x:
          type: number
          description: Bord gauche, sous forme de fraction de la largeur de la page.
        'y':
          type: number
          description: Bord supérieur, sous forme de fraction de la hauteur de la page.
        width:
          type: number
          description: Largeur, exprimée en fraction de la largeur de la page.
        height:
          type: number
          description: Hauteur, sous forme de fraction de la hauteur de la page.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Une chaîne pour `text`, `email`, `full_name`, `date_signed` et
            `data`, un booléen pour une `checkbox`, et `true` pour une signature
            ou des initiales appliquées. `null` si vide.
        display_value:
          type: string
          nullable: true
          description: >-
            La valeur telle qu'apposée sur la page : dates dans le `date_format`
            du champ, `Yes` ou `No` pour une case à cocher, `Signed` pour une
            signature ou des initiales.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Provenance de la valeur : `signer` (saisie, cochée ou appliquée par
            le signataire), `identity` (la pièce d'identité vérifiée), `contact`
            (l'e-mail ou le téléphone vérifié), `company` (l'entreprise
            vérifiée), `session` (`vendor_data`), `metadata`, `api`
            (`sign.field_values`) ou `signing_time` (la date de signature).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Signature et initiales uniquement : chemin de l'image appliquée.
            Voir [Télécharger une image de
            signature](/fr/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` lorsqu'un champ prérempli n'avait aucune valeur dans
            la session et que `signature_field_data_missing_action` a tout de
            même autorisé le signataire à signer.
  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.