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

# Validar assinaturas via API: reverifique PDFs assinados

> A API da Didit reverifica PDFs assinados na etapa de assinatura eletrônica: integridade, assinatura PAdES, certificado, revogação e carimbo do tempo.

Verifica novamente os documentos assinados de uma etapa e salva o resultado no `validation` de cada signatário. A Didit relê cada PDF assinado e verifica o SHA-256 dele. Para uma assinatura avançada (AES), também valida a assinatura PAdES, o certificado, os dados de revogação e o carimbo de tempo. Uma assinatura simples não tem assinatura digital, então apenas a integridade do arquivo é verificada. Nada é assinado novamente. No console, isso corresponde ao botão **Validate again** da aba **Signature** da sessão.

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

Envie `signature_id` para verificar um signatário. Sem ele, a Didit verifica todos os signatários da etapa e responde `409` com `signature_not_signed` se algum deles ainda não tiver assinado. Um PDF assinado armazenado que não corresponde mais ao seu `sha256_signed` retorna `400` com `signature_document_changed`.

A resposta é `{ "signatures": [...] }` com os signatários verificados. Leia `validation.valid` para o resultado geral e `validation.documents[]` para cada documento. Consulte [Validar uma assinatura novamente](https://docs.didit.me/pt-br/core-technology/electronic-signature/report-electronic-signature.md#validar-uma-assinatura-novamente) para ver todos os campos.

## Relacionados

* [Relatório de assinatura eletrônica](https://docs.didit.me/pt-br/core-technology/electronic-signature/report-electronic-signature.md)
* [Baixar um documento assinado](https://docs.didit.me/pt-br/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml pt-br/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 verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Validar assinaturas novamente
      description: >-
        Verifica novamente os documentos assinados de uma etapa de Assinatura
        eletrônica. A Didit relê cada PDF assinado, confere o SHA-256 e, no caso
        de uma assinatura Avançada (AES), valida a assinatura PAdES, o
        certificado, os dados de revogação e o carimbo de tempo (uma assinatura
        Simples não tem assinatura digital, então apenas a integridade do
        arquivo é verificada). Em seguida, salva o resultado no `validation` de
        cada signatário e retorna os itens atualizados. Nada é assinado
        novamente. Envie `signature_id` para verificar um único signatário; sem
        ele, todos os signatários da etapa são verificados, e a chamada falha se
        algum deles não tiver assinado.


        Requer `write:sessions`; sua chave de API funciona. No console,
        corresponde ao botão **Validate again**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            A sessão de Verificação de usuários (KYC) ou de Verificação de
            empresas (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            A etapa de Assinatura eletrônica: `node_id` do item em
            `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` do item de um signatário em `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: Os signatários verificados, com sua `validation` atualizada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Um PDF assinado armazenado não corresponde mais ao SHA-256
            registrado quando ele foi assinado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Um arquivo assinado não corresponde mais ao seu hash
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Credenciais ausentes, ou uma credencial que não pode ler esta
            sessão. Uma chave ausente retorna `403`; uma chave incorreta,
            revogada ou expirada 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: >-
            Nenhuma assinatura corresponde: a sessão, a etapa ou o signatário
            não existe ou foi excluído.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: Assinatura não encontrada nesta etapa
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: Um signatário da etapa não assinou, então não há nada para validar.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Um signatário ainda não assinou
                  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: >-
        O resultado de um signatário para uma etapa de Assinatura eletrônica.
        Consulte o [relatório de Assinatura
        eletrônica](/pt-br/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Passe-o como `signature_id` para baixar as evidências deste
            signatário ou validar a assinatura dele.
        node_id:
          type: string
          description: A etapa do fluxo que o produziu.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            Em que ponto da etapa o signatário está. Somente `signed` significa
            que os documentos estão assinados.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            O resultado da etapa. Um aviso o define por meio da sua regra;
            regras de status personalizadas são aplicadas depois.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (padrão) ou `aes`. `qes` (Assinatura Eletrônica
            Qualificada, QES) é um complemento que ainda não está disponível.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: >-
            `pdf` para uma assinatura Simples, `pades` para uma assinatura
            Avançada (AES).
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` depois que uma assinatura Avançada (AES) é assinada;
            caso contrário, null.
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                O nome do signatário. Verificado (a partir da verificação de
                identidade aprovada ou da sessão), exceto no nível Simple sem um
                nome verificado na sessão, caso em que é o nome que o signatário
                digitou e não é verificado.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: O cargo da pessoa-chave, conforme declarado.
            roles:
              type: array
              items:
                type: string
              description: >-
                As funções estruturadas da pessoa-chave, conforme declaradas
                para a empresa.
            identity_session_id:
              type: string
              format: uuid
              description: A sessão de KYC que verificou o signatário.
        identity_used:
          type: object
          description: >-
            A identidade verificada na qual a assinatura se baseia. Vazio para
            uma assinatura Simple sem identidade 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: O nome com o qual o signatário precisava corresponder.
        certificate:
          type: object
          nullable: true
          description: >-
            O certificado com o qual os documentos foram assinados. `null` até a
            assinatura, e sempre `null` para uma assinatura simples.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Número de série, em 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 uma assinatura Simples, que não tem código.'
            destination:
              type: string
              nullable: true
              description: O contato mascarado para o qual o código foi enviado.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Códigos inseridos, incluindo o correto.
        timestamp:
          type: object
          nullable: true
          description: >-
            O carimbo de tempo RFC 3161 da assinatura, emitido pela Didit. É
            `null` até a assinatura e sempre `null` para uma assinatura do tipo
            Simple.
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Sempre `false` para AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  O documento na cópia deste signatário. Use-o para baixar o
                  arquivo assinado.
              uuid:
                type: string
                format: uuid
                description: Igual a `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: Páginas do documento assinadas. Para Word, do PDF convertido.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 do documento tal como foi exibido ao signatário.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 do PDF assinado, depois de assinado.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: aberto, mas não assinado. `not_reached`: nunca
                  aberto.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quando o signatário chegou ao fim de um documento sem campos,
                  quando a etapa exige isso.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Quando o signatário concordou com um documento sem campos, ou
                  concluiu os campos de um documento com campos.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Caminho do PDF assinado, depois de assinado. Consulte [Baixar
                  um documento
                  assinado](/pt-br/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` para um documento com campos, `read_and_agree` para
                  um documento sem campos.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, ou `docx` para um documento Word que a Didit converteu
                  para PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` para um PDF. Para um documento Word, o arquivo original
                  e a conversão.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: O nome original do seu arquivo do Word.
                  sha256:
                    type: string
                    description: SHA-256 do seu arquivo Word original.
                  size_bytes:
                    type: integer
                    description: Tamanho do seu arquivo Word original.
                  converter:
                    type: string
                    description: Versão do conversor que gerou o PDF.
              fields:
                type: array
                description: >-
                  Campos do documento, com seus valores. Vazio para um documento
                  sem campos.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            A assinatura e as iniciais que o signatário adotou para os campos de
            assinatura e de iniciais. `null` até que o signatário adote uma.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: o nome verificado em um estilo de letra cursiva.
                `drawn`: desenhada com o dedo ou o mouse.
            font:
              type: string
              nullable: true
              description: >-
                O estilo de caligrafia de uma assinatura digitada. `null` quando
                desenhada.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando o signatário concordou, na tela de revisão, em assinar os
            documentos eletronicamente. Definido quando algum documento tem
            campos.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Caminho do PDF de evidências, depois de assinado. Consulte [Baixar
            as evidências da
            assinatura](/pt-br/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Avisos gerados para este signatário. Consulte [Avisos de assinatura
            eletrônica](/pt-br/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: >-
            A última verificação criptográfica dos documentos assinados. `null`
            até que os documentos sejam assinados. Se a Didit não conseguir
            confirmar o resultado da assinatura, o valor é `{"valid": null,
            "reason": "signature_provider_outcome_unknown", "checked_at": ...}`
            e `status` permanece `signing`: trate-o como não assinado.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true` quando todos os documentos são válidos. `null` quando não
                foi possível confirmar o resultado da assinatura.
            reason:
              type: string
              description: >-
                Preenchido 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 a assinatura e o carimbo de tempo são ambos
                      válidos e confiáveis.
                  integrity:
                    type: boolean
                    description: >-
                      `true` quando o documento não foi alterado desde a
                      assinatura.
                  trusted:
                    type: boolean
                    description: >-
                      `true` quando o certificado de assinatura se encadeia a
                      uma raiz confiável.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Verificação na EU Trusted List. Para AES: `{"status":
                      "not_applicable", "reason": "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      O certificado com o qual os documentos foram assinados.
                      `null` até a assinatura, e sempre `null` para uma
                      assinatura simples.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Número de série, em hexadecimal.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      O carimbo de tempo RFC 3161 da assinatura, emitido pela
                      Didit. É `null` até a assinatura e sempre `null` para uma
                      assinatura do tipo Simple.
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Sempre `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: Quando o link de assinatura 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: O endereço IP do signatário quando ele solicitou o código.
        place:
          type: string
          nullable: true
          description: 'Não coletado: sempre `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Um campo de um documento assinado, com o seu valor na cópia deste
        signatário. Consulte
        [Campos](/pt-br/core-technology/electronic-signature/report-electronic-signature#campos).
      properties:
        key:
          type: string
          description: A chave do campo, como usada em `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 da página, a partir de 1. Para um documento Word, uma página
            do PDF convertido.
        x:
          type: number
          description: Borda esquerda, como fração da largura da página.
        'y':
          type: number
          description: Borda superior, como fração da altura da página.
        width:
          type: number
          description: Largura, como fração da largura da página.
        height:
          type: number
          description: Altura, como fração da altura da página.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Uma string para `text`, `email`, `full_name`, `date_signed` e
            `data`, um booleano para um `checkbox` e `true` para uma assinatura
            ou rubrica aplicada. `null` quando vazio.
        display_value:
          type: string
          nullable: true
          description: >-
            O valor conforme carimbado na página: datas no `date_format` do
            campo, `Yes` ou `No` para uma caixa de seleção, `Signed` para uma
            assinatura ou rubrica.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Origem do valor: `signer` (digitado, marcado ou aplicado pelo
            signatário), `identity` (o documento de identidade verificado),
            `contact` (o e-mail ou telefone verificado), `company` (a empresa
            verificada), `session` (`vendor_data`), `metadata`, `api`
            (`sign.field_values`) ou `signing_time` (a data da assinatura).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Somente assinatura e rubrica: o caminho da imagem aplicada. Consulte
            [Baixar uma imagem de
            assinatura](/pt-br/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty` quando um campo pré-preenchido não tinha valor na
            sessão e `signature_field_data_missing_action` permitiu que o
            signatário assinasse mesmo assim.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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