> ## 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ón de firmas: revalida PDF firmados

> Didit revalida los documentos de un paso de firma electrónica: integridad del archivo, firma PAdES, certificado, revocación y sello de tiempo.

Vuelve a comprobar los documentos firmados de un paso y guarda el resultado en el campo `validation` de cada firmante. Didit vuelve a leer cada PDF firmado y comprueba su SHA-256. En una firma avanzada (AES) también valida la firma PAdES, el certificado, los datos de revocación y el sello de tiempo. Una firma simple no tiene firma digital, así que solo se comprueba la integridad del archivo. No se vuelve a firmar nada. En la consola, esto corresponde al botón **Validate again** de la pestaña **Signature** de la sesión.

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

Envía `signature_id` para comprobar un solo firmante. Si no lo envías, Didit comprueba todos los firmantes del paso y responde `409` con `signature_not_signed` si alguno de ellos no ha firmado. Si un PDF firmado almacenado ya no coincide con su `sha256_signed`, la respuesta es `400` con `signature_document_changed`.

La respuesta es `{ "signatures": [...] }` con los firmantes comprobados. Consulta `validation.valid` para ver el resultado general y `validation.documents[]` para ver el de cada documento. Consulta [Volver a validar una firma](https://docs.didit.me/es/core-technology/electronic-signature/report-electronic-signature.md#validar-una-firma-de-nuevo) para ver todos los campos.

## Relacionado

* [Informe de firma electrónica](https://docs.didit.me/es/core-technology/electronic-signature/report-electronic-signature.md)
* [Descargar un documento firmado](https://docs.didit.me/es/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml es/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ón de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Volver a validar las firmas
      description: >-
        Vuelve a comprobar los documentos firmados de un paso de Firma
        electrónica. Didit vuelve a leer cada PDF firmado, comprueba su SHA-256
        y, en una firma avanzada (AES), valida la firma PAdES, el certificado,
        los datos de revocación y el sello de tiempo (una firma simple no tiene
        firma digital, así que solo se comprueba la integridad del archivo);
        después guarda el resultado en el `validation` de cada firmante y
        devuelve los elementos actualizados. No se vuelve a firmar nada. Envía
        `signature_id` para comprobar un solo firmante; sin él, se comprueban
        todos los firmantes del paso, y la llamada falla si alguno de ellos no
        ha firmado.


        Requiere `write:sessions`; tu clave de API sirve. En la consola es el
        botón **Validate again**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            La sesión de verificación de usuarios (KYC) o de verificación de
            empresas (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            El paso de Firma electrónica: `node_id` del elemento en
            `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` del elemento de un firmante en `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: Los firmantes comprobados, con su `validation` actualizado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Un PDF firmado almacenado ya no coincide con el SHA-256 registrado
            cuando se firmó.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Un archivo firmado ya no coincide con su hash
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Faltan las credenciales, o la credencial no puede leer esta sesión.
            Si falta la clave, se devuelve `403`; si la clave es incorrecta,
            está revocada o ha expirado, se devuelve `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            Ninguna firma coincide: la sesión, el paso o el firmante no existe o
            se eliminó.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: No existe esa firma en este paso
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            Un firmante del paso no ha firmado, por lo que no hay nada que
            validar.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Un firmante aún no ha firmado
                  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 resultado de un firmante para un paso de Firma electrónica. Consulta
        el [informe de Firma
        electrónica](/es/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Pásalo como `signature_id` para descargar la evidencia de este
            firmante o validar su firma.
        node_id:
          type: string
          description: El paso del flujo que lo generó.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            En qué punto del paso se encuentra el firmante. Solo `signed`
            significa que los documentos están firmados.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            El resultado del paso. Una advertencia lo establece mediante su
            regla; las reglas de estado personalizadas se aplican después.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (predeterminado) o `aes`. `qes` (firma electrónica
            cualificada, QES) es un complemento que aún no está disponible.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: '`pdf` para una firma simple, `pades` para la avanzada (AES).'
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` una vez firmada una firma avanzada (AES); en caso
            contrario, null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                El nombre del firmante. Está verificado (a partir de la
                verificación de identidad aprobada o de la sesión), salvo en el
                nivel Simple sin un nombre de sesión verificado, donde es el
                nombre que escribió el firmante y no está verificado.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: El cargo de la persona clave, tal como se declaró.
            roles:
              type: array
              items:
                type: string
              description: >-
                Los roles estructurados de la persona clave, tal como se
                declararon para la empresa.
            identity_session_id:
              type: string
              format: uuid
              description: La sesión de KYC que verificó al firmante.
        identity_used:
          type: object
          description: >-
            La identidad verificada en la que se basa la firma. Vacío para una
            firma Simple sin identidad 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 nombre con el que debía coincidir el firmante.
        certificate:
          type: object
          nullable: true
          description: >-
            El certificado con el que se firmaron los documentos. `null` hasta
            que se firman, y siempre `null` en una firma simple.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Número de serie, en 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` para una firma simple, que no tiene código.'
            destination:
              type: string
              nullable: true
              description: El contacto enmascarado al que se envió el código.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Códigos introducidos, incluido el correcto.
        timestamp:
          type: object
          nullable: true
          description: >-
            La marca de tiempo RFC 3161 de la firma, emitida por Didit. Es
            `null` hasta que se firma, y siempre `null` en una firma simple.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Siempre `false` para AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  El documento de la copia de este firmante. Úsalo para
                  descargar el archivo firmado.
              uuid:
                type: string
                format: uuid
                description: Igual que `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: Páginas del documento firmadas. En Word, del PDF convertido.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 del documento tal como se le mostró al firmante.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 del PDF firmado, una vez firmado.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: abierto pero no firmado. `not_reached`: nunca se
                  abrió.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Fecha y hora en que el firmante llegó al final de un documento
                  sin campos, cuando el paso lo exige.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Fecha y hora en que el firmante aceptó un documento sin
                  campos, o completó los campos de un documento con campos.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Ruta del PDF firmado, una vez firmado. Consulta [Descargar un
                  documento
                  firmado](/es/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` para un documento con campos, `read_and_agree` para
                  un documento sin campos.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, o `docx` para un documento de Word que Didit convirtió
                  a PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` para un PDF. Para un documento de Word, el archivo
                  original y la conversión.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: El nombre original de tu archivo de Word.
                  sha256:
                    type: string
                    description: SHA-256 de tu archivo de Word original.
                  size_bytes:
                    type: integer
                    description: Tamaño de tu archivo de Word original.
                  converter:
                    type: string
                    description: Versión del conversor que generó el PDF.
              fields:
                type: array
                description: >-
                  Campos del documento, con sus valores. Vacío para un documento
                  sin campos.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            La firma y las iniciales que adoptó el firmante para los campos de
            firma e iniciales. `null` hasta que el firmante adopte una.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: el nombre verificado con un estilo de escritura a mano.
                `drawn`: dibujada con el dedo o con el ratón (mouse).
            font:
              type: string
              nullable: true
              description: >-
                El estilo de escritura a mano de una firma escrita con teclado.
                `null` cuando se dibuja.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Fecha y hora en que el firmante aceptó, en la pantalla de revisión,
            firmar los documentos electrónicamente. Se establece cuando algún
            documento tiene campos.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Ruta del PDF de evidencia, una vez firmado. Consulta [Descargar la
            evidencia de la
            firma](/es/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Advertencias generadas para este firmante. Consulta [Advertencias de
            firma
            electrónica](/es/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 última comprobación criptográfica de los documentos firmados.
            `null` hasta que se firman los documentos. Si Didit no puede
            confirmar el resultado de la firma, el valor es `{"valid": null,
            "reason": "signature_provider_outcome_unknown", "checked_at": ...}`
            y `status` se mantiene en `signing`: considéralo como no firmado.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` cuando todos los documentos son válidos. `null` cuando no
                se pudo confirmar el resultado de la firma.
            reason:
              type: string
              description: >-
                Se establece cuando `valid` es `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` cuando la firma y el sello de tiempo son válidos y
                      de confianza.
                  integrity:
                    type: boolean
                    description: '`true` cuando el documento no ha cambiado desde la firma.'
                  trusted:
                    type: boolean
                    description: >-
                      `true` cuando la cadena del certificado de firma llega a
                      una raíz de confianza.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Comprobación en la Lista de Confianza de la UE. Para AES:
                      `{"status": "not_applicable", "reason":
                      "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      El certificado con el que se firmaron los documentos.
                      `null` hasta que se firman, y siempre `null` en una firma
                      simple.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Número de serie, en hexadecimal.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      La marca de tiempo RFC 3161 de la firma, emitida por
                      Didit. Es `null` hasta que se firma, y siempre `null` en
                      una firma simple.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Siempre `false` para 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: Fecha y hora en que el enlace de firma deja 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: La dirección IP del firmante cuando solicitó su código.
        place:
          type: string
          nullable: true
          description: 'No se recopila: siempre es `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Un campo de un documento firmado, con su valor en la copia de este
        firmante. Consulta
        [Campos](/es/core-technology/electronic-signature/report-electronic-signature#campos).
      properties:
        key:
          type: string
          description: La clave del campo, tal como se usa en `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 de 1. En un documento de Word, una página
            del PDF convertido.
        x:
          type: number
          description: Borde izquierdo, como fracción del ancho de la página.
        'y':
          type: number
          description: Borde superior, como fracción de la altura de la página.
        width:
          type: number
          description: Ancho, como fracción del ancho de la página.
        height:
          type: number
          description: Altura, como fracción de la altura de la página.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Una cadena para `text`, `email`, `full_name`, `date_signed` y
            `data`, un booleano para un `checkbox`, y `true` para una firma o
            unas iniciales aplicadas. `null` cuando está vacío.
        display_value:
          type: string
          nullable: true
          description: >-
            El valor tal como se estampa en la página: fechas en el
            `date_format` del campo, `Yes` o `No` para una casilla de
            verificación, `Signed` para una firma o unas iniciales.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Origen del valor: `signer` (escrito, marcado o aplicado por el
            firmante), `identity` (el documento de identidad verificado),
            `contact` (el correo electrónico o teléfono verificado), `company`
            (la empresa verificada), `session` (`vendor_data`), `metadata`,
            `api` (`sign.field_values`) o `signing_time` (la fecha de firma).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Solo firma e iniciales: la ruta de la imagen aplicada. Consulta
            [Descargar una imagen de
            firma](/es/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` cuando un campo prellenado no tenía valor en la
            sesión y `signature_field_data_missing_action` permitió que el
            firmante firmara de todos modos.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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