> ## 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 validação de assinaturas: reverificar PDFs

> Reverifique na Didit os documentos assinados: integridade do ficheiro, assinatura PAdES, certificado, revogação e carimbo temporal.

Verifica de novo os documentos assinados de um passo e guarda o resultado em `validation` de cada signatário. A Didit volta a ler cada PDF assinado e verifica o respetivo SHA-256. Nas assinaturas Avançadas (AES), valida também a assinatura PAdES, o certificado, os dados de revogação e o carimbo temporal. Uma assinatura Simples não tem assinatura digital, pelo que só se verifica a integridade do ficheiro. Não é feita nenhuma nova assinatura. Na consola, corresponde ao botão **Validar novamente** do separador **Assinatura** 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 único signatário. Sem este campo, a Didit verifica todos os signatários do passo e responde com `409` e `signature_not_signed` se algum deles ainda não tiver assinado. Um PDF assinado guardado que já não corresponde ao seu `sha256_signed` devolve `400` com `signature_document_changed`.

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

## Relacionados

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


## OpenAPI

````yaml pt/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: >-
        Volte a verificar os documentos assinados de um passo de Assinatura
        eletrónica. O Didit relê cada PDF assinado, verifica o respetivo SHA-256
        e, para uma assinatura avançada (AES), valida a assinatura PAdES, o
        certificado, os dados de revogação e o carimbo de data/hora (uma
        assinatura simples não possui assinatura digital, pelo que apenas a
        integridade do ficheiro é verificada), guardando em seguida o resultado
        na `validation` de cada signatário e devolvendo os itens atualizados.
        Nada é assinado novamente. Envie `signature_id` para verificar um
        signatário; sem este parâmetro, todos os signatários do passo são
        verificados e a chamada falha se algum deles não tiver assinado.


        Requer `write:sessions`; a sua chave de API funciona. Na consola,
        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 utilizadores (KYC) ou Verificação de
            empresas (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: >-
            O passo 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 a respetiva `validation` atualizada.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Um PDF assinado armazenado já não corresponde ao SHA-256 registado
            quando foi assinado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Um ficheiro assinado já não coincide com o respetivo hash
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Credenciais em falta, ou uma credencial que não consegue ler esta
            sessão. Uma chave em falta devolve `403`; uma chave incorreta,
            revogada ou expirada devolve `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, o passo ou o signatário
            não existe ou foi eliminado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: Não existe essa assinatura neste passo
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: >-
            Um signatário do passo ainda não assinou, pelo que 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 um passo de Assinatura eletrónica.
        Consulte o [relatório de Assinatura
        eletrónica](/pt/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Passe como `signature_id` para descarregar o comprovativo deste
            signatário ou validar a respetiva assinatura.
        node_id:
          type: string
          description: O passo do fluxo que o produziu.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            O ponto em que o signatário se encontra no passo. Apenas `signed`
            significa que os documentos estão assinados.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            O resultado do passo. Um aviso define-o através da sua regra; as
            regras de estado personalizadas aplicam-se depois.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (predefinição) ou `aes`. `qes` (Assinatura Eletrónica
            Qualificada, QES) é um suplemento que ainda não se encontra
            disponível.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: '`pdf` para uma assinatura Simple, `pades` para Advanced (AES).'
        profile:
          type: string
          nullable: true
          description: >-
            `PAdES-B-LT` assim que uma assinatura avançada (AES) for 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 de sessão verificado, onde corresponde ao nome que o
                signatário introduziu 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 Simples 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 tinha de corresponder.
        certificate:
          type: object
          nullable: true
          description: >-
            O certificado com o qual os documentos foram assinados. `null` até à
            assinatura e sempre `null` para uma assinatura 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` para uma assinatura Simple, que não tem código.'
            destination:
              type: string
              nullable: true
              description: O contacto mascarado para o qual o código foi enviado.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Códigos introduzidos, incluindo o correto.
        timestamp:
          type: object
          nullable: true
          description: >-
            O carimbo de data/hora RFC 3161 na assinatura, emitido pela Didit.
            `null` até ser assinado e sempre `null` para uma assinatura Simples.
          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. Utilize-o para
                  descarregar o ficheiro 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 assinado. Para Word, do PDF convertido.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: SHA-256 do documento tal como foi apresentado ao signatário.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 do PDF assinado, após a assinatura.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: aberto mas não assinado. `not_reached`: nunca
                  foi 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 o passo o exige.
              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
                  preencheu os campos de um documento com campos.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Caminho do PDF assinado, assim que estiver assinado. Consulte
                  [Transferir um documento
                  assinado](/pt/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 convertido para PDF
                  pela Didit.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` para um PDF. Para um documento Word, o ficheiro
                  original e a conversão.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: O nome original do seu ficheiro Word.
                  sha256:
                    type: string
                    description: SHA-256 do seu ficheiro Word original.
                  size_bytes:
                    type: integer
                    description: Tamanho do seu ficheiro Word original.
                  converter:
                    type: string
                    description: Versão do conversor que gerou o PDF.
              fields:
                type: array
                description: >-
                  Campos no documento, com os respetivos 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 iniciais. `null` até que o signatário adote uma.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: o nome verificado num estilo de caligrafia. `drawn`:
                desenhado com o dedo ou com o rato.
            font:
              type: string
              nullable: true
              description: >-
                O estilo caligráfico de uma assinatura digitada. `null` quando
                desenhada à mão.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Quando o signatário concordou, no ecrã de revisão, em assinar
            eletronicamente os documentos. Definido quando qualquer documento
            tiver campos.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Caminho do PDF de evidências, depois de assinado. Consulte
            [Descarregar as evidências da
            assinatura](/pt/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Avisos gerados para este signatário. Consulte os [Avisos de
            assinatura
            eletrónica](/pt/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 será `{"valid": null,
            "reason": "signature_provider_outcome_unknown", "checked_at": ...}`
            e o `status` permanecerá `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 o
                resultado da assinatura não pôde ser confirmado.
            reason:
              type: string
              description: >-
                Definido 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 data/hora são
                      ambos válidos e fidedignos.
                  integrity:
                    type: boolean
                    description: >-
                      `true` quando o documento não foi alterado desde a
                      assinatura.
                  trusted:
                    type: boolean
                    description: >-
                      `true` quando a cadeia do certificado de assinatura liga a
                      uma raiz fidedigna.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Verificação da Lista Confiável da UE. 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é à assinatura e sempre `null` para uma
                      assinatura 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: >-
                      O carimbo de data/hora RFC 3161 na assinatura, emitido
                      pela Didit. `null` até ser assinado e sempre `null` para
                      uma assinatura Simples.
                    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 a ligação 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 pediu o seu código.
        place:
          type: string
          nullable: true
          description: 'Não recolhido: sempre `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Um campo de um documento assinado, com o respetivo valor na cópia deste
        signatário. Consulte
        [Campos](/pt/core-technology/electronic-signature/report-electronic-signature#campos).
      properties:
        key:
          type: string
          description: A chave do campo, conforme utilizada 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 começar em 1. Para um documento Word, uma página
            do PDF convertido.
        x:
          type: number
          description: Margem esquerda, como fração da largura da página.
        'y':
          type: number
          description: Limite superior, como uma fração da altura da página.
        width:
          type: number
          description: Largura, como uma 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 cadeia de carateres para `text`, `email`, `full_name`,
            `date_signed` e `data`, um booleano para uma `checkbox`, e `true`
            para uma assinatura ou iniciais aplicadas. `null` quando vazio.
        display_value:
          type: string
          nullable: true
          description: >-
            O valor tal como estampado 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: >-
            De onde o valor proveio: `signer` (introduzido, assinalado ou
            aplicado pelo signatário), `identity` (a identificação verificada),
            `contact` (o e-mail ou telefone verificado), `company` (a empresa
            verificada), `session` (`vendor_data`), `metadata`, `api`
            (`sign.field_values`) ou `signing_time` (a data de assinatura).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Apenas assinatura e rubricas: o caminho da imagem aplicada. Consulte
            [Descarregar uma imagem de
            assinatura](/pt/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 qualquer
            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: >-
        A chave de API da sua aplicação, a partir de Programadores -> Chaves de
        API na Business Console. A chave principal tem acesso total. Uma chave
        nomeada pode ter o âmbito definido: nenhum, 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á
        incorreta, 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 o
        pedido veio de um endereço fora da sua lista de IP; 404 numa rota de
        sessão significa que a sessão está fora dos fluxos ou estados da chave.
        Uma chave sem acesso a multimédia recebe URLs de imagens, vídeos e PDFs
        como nulos, e uma chave sem permissão de escrita em sessões recebe
        ligações de sessão e tokens como nulos. Consulte
        https://docs.didit.me/console/api-keys.

````

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