> ## 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 validació de signatures: reverifica PDF signats

> Didit revalida els PDF signats d'un pas de signatura electrònica: integritat, signatura PAdES, certificat, revocació i segell de temps.

Torna a comprovar els documents signats d'un pas i desa el resultat a `validation` de cada signatari. Didit torna a llegir cada PDF signat i en comprova el SHA-256. Per a una signatura avançada (AES), també valida la signatura PAdES, el certificat, les dades de revocació i el segell de temps. Una signatura simple no té signatura digital, de manera que només es comprova la integritat del fitxer. No es torna a signar res. A la consola, això correspon al botó **Torna a validar** de la pestanya **Signatura** de la sessió.

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

Envia `signature_id` per comprovar un sol signatari. Sense aquest camp, Didit comprova tots els signataris del pas i respon amb `409` i `signature_not_signed` si algun d'ells encara no ha signat. Un PDF signat desat que ja no coincideix amb el seu `sha256_signed` retorna `400` amb `signature_document_changed`.

La resposta és `{ "signatures": [...] }` amb els signataris comprovats. Llegeix `validation.valid` per al resultat global i `validation.documents[]` per a cada document. Consulta [Torna a validar una signatura](https://docs.didit.me/ca/core-technology/electronic-signature/report-electronic-signature.md#torna-a-validar-una-signatura) per a tots els camps.

## Relacionats

* [Informe de signatura electrònica](https://docs.didit.me/ca/core-technology/electronic-signature/report-electronic-signature.md)
* [Descarrega un document signat](https://docs.didit.me/ca/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml ca/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 verificació d'identitat. Autentica't amb la capçalera x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Torna a validar les signatures
      description: >-
        Torna a comprovar els documents signats d'un pas de Signatura
        electrònica. Didit torna a llegir cada PDF signat, en comprova el
        SHA-256 i, en el cas d'una signatura avançada (AES), valida la signatura
        PAdES, el certificat, les dades de revocació i la marca de temps (una
        signatura simple no té signatura digital, de manera que només es
        comprova la integritat del fitxer), després desa el resultat a la
        `validation` de cada signant i retorna els elements actualitzats. No es
        torna a signar res. Envia `signature_id` per comprovar un sol signant;
        sense aquest paràmetre, es comproven tots els signants del pas i la
        crida falla si algun d'ells encara no ha signat.


        Requereix `write:sessions`; la teva clau d'API funciona. A la consola és
        el botó **Validate again**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            La sessió de Verificació d'usuaris (KYC) o Verificació d'empreses
            (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            El pas de Signatura electrònica: `node_id` de l'element a
            `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''element d''un signatari a `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: Els signataris comprovats, amb la seva `validation` actualitzada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Un PDF signat emmagatzemat ja no coincideix amb el SHA-256 registrat
            quan es va signar.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Un fitxer signat ja no coincideix amb el seu hash
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Falten les credencials, o la credencial no pot llegir aquesta
            sessió. Si falta la clau, es retorna `403`; una clau incorrecta,
            revocada o caducada retorna `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            Cap signatura no coincideix: la sessió, el pas o el signatari no
            existeixen o s'han suprimit.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: No existeix aquesta signatura en aquest pas
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            Un signant del pas encara no ha signat, de manera que no hi ha res a
            validar.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Un signant encara no ha signat
                  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: >-
        El resultat d'un signant per a un pas de Signatura electrònica. Consulta
        l'[informe de Signatura
        electrònica](/ca/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Passa-ho com a `signature_id` per descarregar les evidències
            d'aquest signant o validar la seva signatura.
        node_id:
          type: string
          description: El pas del flux de treball que l'ha generat.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            En quin punt del pas es troba el signant. Només `signed` significa
            que els documents estan signats.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            El resultat del pas. Una advertència l'estableix mitjançant la seva
            regla; les regles d'estat personalitzades s'apliquen després.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (per defecte) o `aes`. `qes` (signatura electrònica
            qualificada, QES) és un complement que encara no està disponible.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: >-
            `pdf` per a una signatura simple, `pades` per a una signatura
            avançada (AES).
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` un cop s'ha signat una signatura avançada (AES);
            altrament, null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                El nom del signant. Verificat (a partir de la verificació
                d'identitat aprovada o de la sessió) excepte al nivell Simple
                sense un nom de sessió verificat, on és el nom que el signant ha
                introduït i no està verificat.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: El càrrec de la persona clau, tal com s'ha declarat.
            roles:
              type: array
              items:
                type: string
              description: >-
                Els rols estructurats de la persona clau, tal com s'han declarat
                per a l'empresa.
            identity_session_id:
              type: string
              format: uuid
              description: La sessió de KYC que ha verificat el signant.
        identity_used:
          type: object
          description: >-
            La identitat verificada en què es basa la signatura. Buit per a una
            signatura Simple sense identitat verificada.
          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: El nom amb què havia de coincidir el signant.
        certificate:
          type: object
          nullable: true
          description: >-
            El certificat amb què s'han signat els documents. `null` fins que es
            signen, i sempre `null` per a una signatura Simple.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Número de sèrie, hexadecimal.
            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 a una signatura simple, que no té codi.'
            destination:
              type: string
              nullable: true
              description: El contacte emmascarat al qual s'ha enviat el codi.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Codis introduïts, inclòs el correcte.
        timestamp:
          type: object
          nullable: true
          description: >-
            La marca de temps RFC 3161 a la signatura, emesa per Didit. `null`
            fins que se signa, i sempre `null` per a una signatura simple.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Sempre `false` per a AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  El document a la còpia d'aquest signant. Fes-lo servir per
                  descarregar el fitxer signat.
              uuid:
                type: string
                format: uuid
                description: Igual que `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: >-
                  Pàgines del document signades. En el cas de Word, del PDF
                  convertit.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 del document tal com s'ha mostrat al signant.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 del PDF signat, un cop signat.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: '`not_signed`: obert però no signat. `not_reached`: mai obert.'
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quan el signant va arribar al final d'un document sense camps,
                  quan el pas ho requereix.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quan el signant va acceptar un document sense camps, o va
                  completar els camps d'un document amb camps.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Ruta del PDF signat, un cop signat. Consulta [Descarregar un
                  document
                  signat](/ca/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` per a un document amb camps, `read_and_agree` per a
                  un document sense.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, o `docx` per a un document de Word que Didit ha
                  convertit a PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` per a un PDF. Per a un document de Word, el fitxer
                  original i la conversió.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: El nom original del teu fitxer Word.
                  sha256:
                    type: string
                    description: SHA-256 del teu fitxer de Word original.
                  size_bytes:
                    type: integer
                    description: Mida del teu fitxer de Word original.
                  converter:
                    type: string
                    description: Versió del convertidor que ha produït el PDF.
              fields:
                type: array
                description: >-
                  Camps del document, amb els seus valors. Buit per a un
                  document sense camps.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            La signatura i les inicials que el signant ha adoptat per als camps
            de signatura i d'inicials. `null` fins que el signant n'adopti una.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: el nom verificat en estil manuscrit. `drawn`: dibuixat
                amb un dit o amb el ratolí.
            font:
              type: string
              nullable: true
              description: >-
                L'estil cal·ligràfic d'una signatura mecanografiada. `null` quan
                és dibuixada.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quan el signant va acceptar, a la pantalla de revisió, signar els
            documents electrònicament. S'estableix quan algun document té camps.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Ruta del PDF de l'evidència, un cop signat. Consulta [Descarregar
            l'evidència de la
            signatura](/ca/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Advertències generades per a aquest signant. Consulta [Advertències
            de Signatura
            electrònica](/ca/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'última comprovació criptogràfica dels documents signats. `null`
            fins que se signin els documents. Si Didit no pot confirmar el
            resultat de la signatura, és `{"valid": null, "reason":
            "signature_provider_outcome_unknown", "checked_at": ...}` i `status`
            es manté en `signing`: tracta'l com a no signat.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` quan cada document és vàlid. `null` quan el resultat de
                la signatura no s'ha pogut confirmar.
            reason:
              type: string
              description: >-
                S'estableix quan `valid` és `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` quan tant la signatura com la marca de temps són
                      vàlides i de confiança.
                  integrity:
                    type: boolean
                    description: >-
                      `true` quan el document no s'ha modificat des de la
                      signatura.
                  trusted:
                    type: boolean
                    description: >-
                      `true` quan el certificat de signatura forma una cadena
                      fins a una arrel de confiança.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Comprovació a la llista de confiança de la UE (EU Trusted
                      List). Per a AES: `{"status": "not_applicable", "reason":
                      "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      El certificat amb què s'han signat els documents. `null`
                      fins que es signen, i sempre `null` per a una signatura
                      Simple.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Número de sèrie, hexadecimal.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      La marca de temps RFC 3161 a la signatura, emesa per
                      Didit. `null` fins que se signa, i sempre `null` per a una
                      signatura simple.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Sempre `false` per a 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: Quan l'enllaç de signatura deixa de funcionar.
        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'adreça IP del signant quan va demanar el seu codi.
        place:
          type: string
          nullable: true
          description: 'No recopilat: sempre `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Un camp d'un document signat, amb el seu valor a la còpia d'aquest
        signant. Consulta
        [Camps](/ca/core-technology/electronic-signature/report-electronic-signature#camps).
      properties:
        key:
          type: string
          description: La clau del camp, tal com s'utilitza a `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: >-
            Número de pàgina, a partir d'1. Per a un document de Word, una
            pàgina del PDF convertit.
        x:
          type: number
          description: Vora esquerra, com a fracció de l'amplada de la pàgina.
        'y':
          type: number
          description: Vora superior, com a fracció de l'alçada de la pàgina.
        width:
          type: number
          description: Amplada, com a fracció de l'amplada de la pàgina.
        height:
          type: number
          description: Alçada, com a fracció de l'alçada de la pàgina.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Una cadena per a `text`, `email`, `full_name`, `date_signed` i
            `data`, un booleà per a `checkbox`, i `true` per a una signatura o
            inicials aplicades. `null` quan està buit.
        display_value:
          type: string
          nullable: true
          description: >-
            El valor tal com s'ha estampat a la pàgina: dates en el
            `date_format` del camp, `Yes` o `No` per a una casella de selecció,
            `Signed` per a una signatura o inicials.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            D'on prové el valor: `signer` (escrit, marcat o aplicat pel
            signant), `identity` (el document d'identitat verificat), `contact`
            (el correu electrònic o telèfon verificat), `company` (l'empresa
            verificada), `session` (`vendor_data`), `metadata`, `api`
            (`sign.field_values`) o `signing_time` (la data de signatura).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Només signatura i inicials: la ruta de la imatge aplicada. Consulta
            [Descarregar una imatge de
            signatura](/ca/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` quan un camp emplenat prèviament no tenia cap valor a
            la sessió i `signature_field_data_missing_action` ha permès al
            signant signar de totes maneres.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clau d'API de la teva aplicació, des de Developers -> API keys a la
        Business Console. La clau primària té accés complet. Una clau amb nom
        pot tenir l'abast limitat: cap, lectura o escriptura per recurs,
        limitada a determinats fluxos de treball o a sessions aprovades, a una
        llista d'adreces IP i a una data de caducitat. 401 significa que la clau
        és incorrecta, revocada o caducada; 403 significa que no s'ha enviat cap
        clau, que la clau no té accés a aquest recurs o acció, o que la
        sol·licitud prové d'una adreça fora de la seva llista d'IP; 404 en una
        ruta de sessió significa que la sessió està fora dels fluxos de treball
        o estats de la clau. Una clau sense accés a fitxers multimèdia rep els
        URL d'imatge, vídeo i PDF com a null, i una clau sense permís
        d'escriptura de sessions rep els enllaços de sessió i els tokens com a
        null. Consulta https://docs.didit.me/console/api-keys.

````

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