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

# Validazione firme API: ricontrolla i PDF firmati

> Ricontrolla i documenti firmati di un passaggio di Firma elettronica: integrità del file, firma PAdES, certificato, dati di revoca e marca temporale con Didit.

Ricontrolla i documenti firmati di un passaggio e salva il risultato in `validation` di ciascun firmatario. Didit rilegge ogni PDF firmato e ne verifica lo SHA-256. Per una firma Advanced (AES), verifica anche la firma PAdES, il certificato, i dati di revoca e la marca temporale. Una firma Simple non ha una firma digitale, quindi viene verificata solo l'integrità del file. Nulla viene firmato di nuovo. Nella console, corrisponde al pulsante **Convalida di nuovo** della scheda **Firma** della sessione.

```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}"}'
```

Invia `signature_id` per controllare un solo firmatario. Senza di esso, Didit controlla tutti i firmatari del passaggio e risponde con `409` e `signature_not_signed` se uno di loro non ha ancora firmato. Un PDF firmato memorizzato che non corrisponde più al suo `sha256_signed` restituisce `400` con `signature_document_changed`.

La risposta è `{ "signatures": [...] }` con i firmatari controllati. Leggi `validation.valid` per il risultato complessivo e `validation.documents[]` per ciascun documento. Consulta [Convalida di nuovo una firma](https://docs.didit.me/it/core-technology/electronic-signature/report-electronic-signature.md#convalida-nuovamente-una-firma) per tutti i campi.

## Correlati

* [Report sulla firma elettronica](https://docs.didit.me/it/core-technology/electronic-signature/report-electronic-signature.md)
* [Scarica un documento firmato](https://docs.didit.me/it/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml it/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 di verifica dell'identità. Autenticati con l'intestazione x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Valida nuovamente le firme
      description: >-
        Verifica di nuovo i documenti firmati di un passaggio di Firma
        elettronica. Didit rilegge ogni PDF firmato, ne verifica lo SHA-256 e,
        per una firma avanzata (AES), convalida la firma PAdES, il certificato,
        i dati di revoca e la marcatura temporale (una firma semplice non ha
        firma digitale, quindi viene verificata solo l'integrità del file),
        quindi salva il risultato nella `validation` di ciascun firmatario e
        restituisce gli elementi aggiornati. Nessun elemento viene firmato
        nuovamente. Invia `signature_id` per verificare un singolo firmatario;
        senza di esso, viene verificato ogni firmatario del passaggio e la
        chiamata fallisce se uno qualsiasi di essi non ha firmato.


        Richiede `write:sessions`; la tua chiave API funziona. Nella console
        corrisponde al pulsante **Validate again**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            La sessione di Verifica degli utenti (KYC) o Verifica aziendale
            (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            Il passaggio di Firma elettronica: `node_id` dell'elemento in
            `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` dell''elemento di un firmatario in `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: I firmatari verificati, con la rispettiva `validation` aggiornata.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Un PDF firmato archiviato non corrisponde più all'hash SHA-256
            registrato al momento della firma.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Un file firmato non corrisponde più al suo hash
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Credenziali mancanti o credenziale che non può leggere questa
            sessione. L'assenza della chiave restituisce `403`; una chiave
            errata, revocata o scaduta restituisce `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            Nessuna firma corrispondente: la sessione, il passaggio o il
            firmatario non esiste o è stato eliminato.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: Nessuna firma del genere in questo passaggio
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            Un firmatario del passaggio non ha ancora firmato, quindi non c'è
            nulla da convalidare.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Un firmatario non ha ancora firmato
                  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: >-
        Il risultato di un firmatario per un passaggio di Firma elettronica.
        Consulta il [report di Firma
        elettronica](/it/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Passalo come `signature_id` per scaricare le prove di questo
            firmatario o convalidare la sua firma.
        node_id:
          type: string
          description: Il passaggio del workflow che lo ha prodotto.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            A che punto si trova il firmatario nel passaggio. Solo `signed`
            indica che i documenti sono firmati.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            L'esito del passaggio. Un avviso lo imposta tramite la propria
            regola; le regole di stato personalizzate si applicano
            successivamente.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (predefinito) o `aes`. `qes` (Firma elettronica
            qualificata, QES) è un componente aggiuntivo non ancora disponibile.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: '`pdf` per una firma Simple, `pades` per Advanced (AES).'
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` una volta firmata una firma avanzata (AES), altrimenti
            null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                Il nome del firmatario. Verificato (dalla verifica dell'identità
                approvata o dalla sessione) tranne al livello Simple senza un
                nome di sessione verificato, dove corrisponde al nome digitato
                dal firmatario e non è verificato.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: La designazione della persona chiave, come dichiarata.
            roles:
              type: array
              items:
                type: string
              description: >-
                I ruoli strutturati della persona chiave, come dichiarati per
                l'azienda.
            identity_session_id:
              type: string
              format: uuid
              description: La sessione KYC che ha verificato il firmatario.
        identity_used:
          type: object
          description: >-
            L'identità verificata su cui si basa la firma. Vuoto per una firma
            Simple senza identità verificata.
          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: Il nome a cui il firmatario doveva corrispondere.
        certificate:
          type: object
          nullable: true
          description: >-
            Il certificato con cui sono stati firmati i documenti. `null` fino
            alla firma, e sempre `null` per una firma Simple.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Numero di serie, esadecimale.
            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` per una firma Simple, che non ha codice.'
            destination:
              type: string
              nullable: true
              description: Il contatto oscurato a cui è stato inviato il codice.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Codici inseriti, incluso quello corretto.
        timestamp:
          type: object
          nullable: true
          description: >-
            Il timestamp RFC 3161 nella firma, emesso da Didit. `null` fino alla
            firma, e sempre `null` per una firma Semplice.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Sempre `false` per AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  Il documento sulla copia di questo firmatario. Usalo per
                  scaricare il file firmato.
              uuid:
                type: string
                format: uuid
                description: Corrisponde a `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: Pagine firmate del documento. Per Word, del PDF convertito.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: >-
                  SHA-256 del documento così come è stato mostrato al
                  firmatario.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 del PDF firmato, una volta completata la firma.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: aperto ma non firmato. `not_reached`: mai
                  aperto.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quando il firmatario ha raggiunto la fine di un documento
                  senza campi, se il passaggio lo richiede.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quando il firmatario ha accettato un documento senza campi o
                  ha completato i campi di un documento provvisto di campi.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Percorso del PDF firmato, una volta firmato. Vedi [Scarica un
                  documento
                  firmato](/it/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` per un documento con campi, `read_and_agree` per un
                  documento senza.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, oppure `docx` per un documento Word convertito in PDF
                  da Didit.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` per un PDF. Per un documento Word, il file originale e
                  la conversione.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: Il nome originale del tuo file Word.
                  sha256:
                    type: string
                    description: SHA-256 del tuo file Word originale.
                  size_bytes:
                    type: integer
                    description: Dimensione del tuo file Word originale.
                  converter:
                    type: string
                    description: Versione del convertitore che ha generato il PDF.
              fields:
                type: array
                description: >-
                  Campi presenti sul documento, con i relativi valori. Vuoto per
                  un documento senza campi.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            La firma e le iniziali adottate dal firmatario per i campi di firma
            e iniziali. `null` finché il firmatario non ne adotta una.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: il nome verificato in stile calligrafico. `drawn`:
                disegnato con un dito o un mouse.
            font:
              type: string
              nullable: true
              description: >-
                Lo stile calligrafico di una firma digitata. `null` se tracciata
                a mano.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando il firmatario ha acconsentito, nella schermata di revisione,
            a firmare elettronicamente i documenti. Impostato quando qualsiasi
            documento contiene campi.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Percorso del PDF delle prove, una volta firmato. Consulta [Scaricare
            le prove della
            firma](/it/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Avvisi generati per questo firmatario. Vedi [Avvisi di Firma
            elettronica](/it/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: >-
            L'ultimo controllo crittografico dei documenti firmati. `null`
            finché i documenti non vengono firmati. Se Didit non riesce a
            confermare l'esito della firma, il valore è `{"valid": null,
            "reason": "signature_provider_outcome_unknown", "checked_at": ...}`
            e `status` rimane `signing`: consideralo come non firmato.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` quando ogni documento è valido. `null` quando non è stato
                possibile confermare l'esito della firma.
            reason:
              type: string
              description: >-
                Impostato quando `valid` è `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` quando la firma e il timestamp sono entrambi validi
                      e attendibili.
                  integrity:
                    type: boolean
                    description: >-
                      `true` quando il documento non è stato modificato dopo la
                      firma.
                  trusted:
                    type: boolean
                    description: >-
                      `true` quando il certificato di firma fa capo a una radice
                      attendibile.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Controllo della Trusted List dell'UE. Per AES: `{"status":
                      "not_applicable", "reason": "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      Il certificato con cui sono stati firmati i documenti.
                      `null` fino alla firma, e sempre `null` per una firma
                      Simple.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Numero di serie, esadecimale.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      Il timestamp RFC 3161 nella firma, emesso da Didit. `null`
                      fino alla firma, e sempre `null` per una firma Semplice.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Sempre `false` per 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: Quando il link di firma smette di funzionare.
        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'indirizzo IP del firmatario al momento della richiesta del codice.
        place:
          type: string
          nullable: true
          description: 'Non raccolto: sempre `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Un campo di un documento firmato, con il relativo valore sulla copia di
        questo firmatario. Vedi
        [Campi](/it/core-technology/electronic-signature/report-electronic-signature#campi).
      properties:
        key:
          type: string
          description: La chiave del campo, come utilizzata in `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: >-
            Numero di pagina, a partire da 1. Per un documento Word, una pagina
            del PDF convertito.
        x:
          type: number
          description: Bordo sinistro, espresso come frazione della larghezza della pagina.
        'y':
          type: number
          description: Bordo superiore, espresso come frazione dell'altezza della pagina.
        width:
          type: number
          description: Larghezza, come frazione della larghezza della pagina.
        height:
          type: number
          description: Altezza, come frazione dell'altezza della pagina.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Una stringa per `text`, `email`, `full_name`, `date_signed` e
            `data`, un booleano per `checkbox` e `true` per una firma o iniziali
            apposte. `null` se vuoto.
        display_value:
          type: string
          nullable: true
          description: >-
            Il valore così come impresso sulla pagina: date nel `date_format`
            del campo, `Yes` o `No` per una casella di controllo, `Signed` per
            una firma o iniziali.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Da dove proviene il valore: `signer` (digitato, selezionato o
            applicato dal firmatario), `identity` (l'identità verificata),
            `contact` (l'email o il telefono verificati), `company` (l'azienda
            verificata), `session` (`vendor_data`), `metadata`, `api`
            (`sign.field_values`) o `signing_time` (la data della firma).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Solo firma e iniziali: il percorso dell'immagine applicata. Consulta
            [Scarica un'immagine di
            firma](/it/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` quando un campo precompilato non aveva alcun valore
            nella sessione e `signature_field_data_missing_action` ha consentito
            comunque al firmatario di firmare.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La chiave API della tua applicazione, da Developers -> API keys nella
        Business Console. La chiave primaria ha accesso completo. Una chiave con
        nome può avere un ambito definito: nessuno, lettura o scrittura per
        risorsa, limitata ad alcuni workflow o a sessioni approvate, a un elenco
        di indirizzi IP e a una data di scadenza. 401 indica che la chiave è
        errata, revocata o scaduta; 403 indica che non è stata inviata alcuna
        chiave, che la chiave non ha accesso a questa risorsa o azione, oppure
        che la richiesta proviene da un indirizzo non incluso nel suo elenco IP;
        404 su una route di sessione indica che la sessione non rientra nei
        workflow o negli stati previsti dalla chiave. Una chiave senza accesso
        ai media riceve gli URL di immagini, video e PDF come null, e una chiave
        senza permessi di scrittura sulle sessioni riceve link e token di
        sessione come null. Consulta https://docs.didit.me/console/api-keys.

````

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