> ## 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 проверки электронной подписи: повторная проверка PDF

> Didit повторно проверяет подписанные документы шага электронной подписи: целостность файла, PAdES-подпись, сертификат, отзыв и метку времени.

Повторно проверяет подписанные документы шага и сохраняет результат в `validation` каждого подписанта. Didit заново читает каждый подписанный PDF и проверяет его SHA-256. Для подписи Advanced (AES) также проверяются подпись PAdES, сертификат, данные об отзыве и метка времени. У простой подписи нет цифровой подписи, поэтому проверяется только целостность файла. Документы не подписываются повторно. В консоли это кнопка **Проверить снова** на вкладке **Подпись** сессии.

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

Передайте `signature_id`, чтобы проверить одного подписанта. Без него Didit проверяет всех подписантов шага и возвращает `409` с `signature_not_signed`, если кто-то из них ещё не подписал. Если сохранённый подписанный PDF больше не совпадает со своим `sha256_signed`, возвращается `400` с `signature_document_changed`.

Ответ имеет вид `{ "signatures": [...] }` с проверенными подписантами. Общий результат смотрите в `validation.valid`, а каждый документ в `validation.documents[]`. Все поля описаны в разделе [Повторная проверка подписи](https://docs.didit.me/ru/core-technology/electronic-signature/report-electronic-signature.md#проверить-подпись-снова).

## Связанные материалы

* [Отчёт по электронной подписи](https://docs.didit.me/ru/core-technology/electronic-signature/report-electronic-signature.md)
* [Загрузка подписанного документа](https://docs.didit.me/ru/sessions-api/electronic-signature/download-signed-document.md)


## OpenAPI

````yaml ru/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 верификации личности. Аутентификация выполняется с помощью заголовка
    x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/signatures/{nodeId}/validate/:
    post:
      tags:
        - Sessions
      summary: Повторно проверить подписи
      description: >-
        Повторно проверить подписанные документы шага Электронная подпись. Didit
        повторно считывает каждый подписанный PDF-файл, проверяет его SHA-256 и
        для усиленной (AES) подписи валидирует подпись PAdES, сертификат, данные
        об отзыве и метку времени (простая подпись не содержит цифровой подписи,
        поэтому проверяется только целостность файла), затем сохраняет результат
        в поле `validation` каждого подписанта и возвращает обновлённые
        элементы. Повторное подписание не выполняется. Передайте `signature_id`,
        чтобы проверить одного подписанта; без него проверяется каждый подписант
        шага, и вызов завершается ошибкой, если кто-либо из них ещё не подписал
        документ.


        Требуется разрешение `write:sessions`; ваш API-ключ подходит. В консоли
        это кнопка **Проверить ещё раз**.
      operationId: post_v3_session_signature_validate
      parameters:
        - name: sessionId
          in: path
          required: true
          description: Сессия проверки пользователей (KYC) или верификации бизнеса (KYB).
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: nodeId
          in: path
          required: true
          description: 'Шаг «Электронная подпись»: `node_id` элемента в `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` элемента подписанта в `signatures[]`.'
            example:
              signature_id: 0e6c2a8e-6c2f-4b8e-9a51-3f2f6a7d9b10
      responses:
        '200':
          description: Проверенные подписанты с обновлённым полем `validation`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  signatures:
                    type: array
                    items:
                      $ref: '#/components/schemas/SignatureResult'
        '400':
          description: >-
            Сохранённый подписанный PDF больше не совпадает со значением
            SHA-256, зафиксированным при подписании.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Document changed:
                  summary: Подписанный файл больше не совпадает со своим хешем
                  value:
                    code: signature_document_changed
                    detail: signature_document_changed
        '403':
          description: >-
            Отсутствуют учетные данные или используются учетные данные, не
            позволяющие прочитать эту сессию. При отсутствии ключа возвращается
            `403`; при неверном, отозванном или истекшем ключе возвращается
            `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: You do not have permission to perform this action.
        '404':
          description: >-
            Подходящая подпись не найдена: сессия, шаг или подписант не
            существуют или были удалены.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Unknown signer:
                  summary: Такая подпись отсутствует в этом шаге
                  value:
                    code: signature_not_found
                    detail: signature_not_found
        '409':
          description: Подписант шага ещё не подписал документ, поэтому проверять нечего.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
              examples:
                Not signed:
                  summary: Подписант ещё не подписал документ
                  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: >-
        Результат одного подписанта для одного шага электронной подписи. См.
        [отчёт об электронной
        подписи](/ru/core-technology/electronic-signature/report-electronic-signature).
      properties:
        id:
          type: string
          format: uuid
          description: >-
            Передайте это значение как `signature_id`, чтобы скачать
            подтверждающие материалы этого подписанта или проверить его подпись.
        node_id:
          type: string
          description: Шаг сценария, сформировавший его.
        status:
          type: string
          enum:
            - intro
            - review
            - code
            - signing
            - signed
            - declined
          description: >-
            Каков статус подписанта на этом шаге. Только значение `signed`
            означает, что документы подписаны.
        verdict:
          type: string
          enum:
            - Not Finished
            - Approved
            - In Review
            - Declined
          description: >-
            Результат шага. Предупреждение задаёт его через своё правило;
            пользовательские правила статуса применяются после.
        level:
          type: string
          enum:
            - simple
            - aes
            - qes
          description: >-
            `simple` (по умолчанию) или `aes`. `qes` (квалифицированная
            электронная подпись, QES) является надстройкой, которая пока
            недоступна.
        format:
          type: string
          enum:
            - pdf
            - pades
          description: '`pdf` для простой подписи (Simple), `pades` для усиленной (AES).'
        profile:
          type: string
          nullable: true
          description: '`PAdES-B-LT` после подписания усиленной подписью (AES), иначе null.'
        signer:
          type: object
          properties:
            name:
              type: string
              nullable: true
              description: >-
                Имя подписанта. Верифицировано (на основе одобренной верификации
                личности или сессии), за исключением уровня Simple без
                верифицированного имени сессии, где используется имя, введённое
                подписантом вручную, и оно не проверяется.
            capacity:
              type: string
              enum:
                - self
                - company
            company:
              type: string
              nullable: true
            role:
              type: string
              nullable: true
              description: Должность ключевого лица, как заявлено.
            roles:
              type: array
              items:
                type: string
              description: Структурированные роли ключевого лица, заявленные для компании.
            identity_session_id:
              type: string
              format: uuid
              description: KYC-сессия, верифицировавшая подписанта.
        identity_used:
          type: object
          description: >-
            Подтверждённая личность, на которую опирается подпись. Пусто для
            простой подписи без подтверждённой личности.
          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: Имя, которому должен был соответствовать подписант.
        certificate:
          type: object
          nullable: true
          description: >-
            Сертификат, которым были подписаны документы. `null` до подписания и
            всегда `null` для простой подписи.
          properties:
            issuer:
              type: string
            issued_to:
              type: string
            serial:
              type: string
              description: Серийный номер, шестнадцатеричный.
            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` для простой подписи (Simple signature), у которой нет
                кода.
            destination:
              type: string
              nullable: true
              description: Маскированный контакт, на который был отправлен код.
            confirmed_at:
              type: string
              format: date-time
              nullable: true
            attempts:
              type: integer
              description: Введённые коды, включая правильный.
        timestamp:
          type: object
          nullable: true
          description: >-
            Метка времени RFC 3161 в подписи, выпущенная Didit. Имеет значение
            `null` до подписания и всегда `null` для простой подписи (Simple).
          properties:
            time:
              type: string
              format: date-time
            qualified:
              type: boolean
              description: Всегда `false` для AES.
            valid:
              type: boolean
        documents:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
                description: >-
                  Документ в экземпляре этого подписанта. Используйте его для
                  скачивания подписанного файла.
              uuid:
                type: string
                format: uuid
                description: То же, что и `id`.
              title:
                type: string
              file_name:
                type: string
              pages:
                type: integer
                description: >-
                  Подписанные страницы документа. Для Word это страницы
                  сконвертированного PDF.
              size_bytes:
                type: integer
              sha256_original:
                type: string
                description: >-
                  SHA-256 документа в том виде, в котором он был показан
                  подписывающей стороне.
              sha256_signed:
                type: string
                nullable: true
                description: SHA-256 подписанного PDF после подписания.
              status:
                type: string
                enum:
                  - signed
                  - declined
                  - not_signed
                  - not_reached
                description: >-
                  `not_signed`: открыт, но не подписан. `not_reached`: ни разу
                  не открывался.
              opened_at:
                type: string
                format: date-time
                nullable: true
              read_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Время, когда подписант дошёл до конца документа без полей,
                  если этого требует шаг.
              read_to_end:
                type: boolean
              consented_at:
                type: string
                format: date-time
                nullable: true
                description: >-
                  Время, когда подписант выразил согласие с документом без полей
                  или заполнил поля документа с полями.
              consent:
                type: boolean
              signed_file:
                type: string
                nullable: true
                description: >-
                  Путь к подписанному PDF после подписания. См. [Скачать
                  подписанный
                  документ](/ru/sessions-api/electronic-signature/download-signed-document).
              mode:
                type: string
                enum:
                  - fields
                  - read_and_agree
                description: >-
                  `fields` для документа с полями, `read_and_agree` для
                  документа без них.
              source_format:
                type: string
                enum:
                  - pdf
                  - docx
                description: >-
                  `pdf`, или `docx` для документа Word, который Didit
                  конвертировал в PDF.
              conversion:
                type: object
                nullable: true
                description: >-
                  `null` для PDF. Для документа Word: исходный файл и
                  конвертация.
                properties:
                  from:
                    type: string
                    enum:
                      - docx
                  file_name:
                    type: string
                    description: Исходное имя файла Word.
                  sha256:
                    type: string
                    description: SHA-256 вашего исходного файла Word.
                  size_bytes:
                    type: integer
                    description: Размер вашего исходного файла Word.
                  converter:
                    type: string
                    description: Версия конвертера, создавшего PDF.
              fields:
                type: array
                description: Поля документа с их значениями. Пусто для документа без полей.
                items:
                  $ref: '#/components/schemas/SignatureFieldResult'
        adopted_signature:
          type: object
          nullable: true
          description: >-
            Подпись и инициалы, выбранные подписантом для полей подписи и
            инициалов. `null`, пока подписант их не примет.
          properties:
            method:
              type: string
              enum:
                - typed
                - drawn
              description: >-
                `typed`: верифицированное имя в рукописном стиле. `drawn`:
                нарисовано пальцем или мышью.
            font:
              type: string
              nullable: true
              description: >-
                Стиль рукописного шрифта для введенной подписи. `null`, если
                нарисована.
            adopted_at:
              type: string
              format: date-time
        electronic_signature_consent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Время, когда подписант на экране проверки согласился подписать
            документы в электронном виде. Устанавливается, если какой-либо
            документ содержит поля.
        evidence_file:
          type: string
          nullable: true
          description: >-
            Путь к PDF-файлу с подтверждающими материалами после подписания. См.
            [Скачивание подтверждающих материалов
            подписи](/ru/sessions-api/electronic-signature/download-evidence).
        warnings:
          type: array
          description: >-
            Предупреждения, сформированные для этого подписанта. См.
            [Предупреждения электронной
            подписи](/ru/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: >-
            Последняя криптографическая проверка подписанных документов. `null`
            до момента подписания документов. Если Didit не может подтвердить
            результат подписания, возвращается `{"valid": null, "reason":
            "signature_provider_outcome_unknown", "checked_at": ...}`, а
            `status` остаётся `signing`: считайте документ неподписанным.
          properties:
            valid:
              type: boolean
              nullable: true
              description: >-
                `true`, когда каждый документ действителен. `null`, когда
                результат подписания не удалось подтвердить.
            reason:
              type: string
              description: >-
                Задаётся, когда `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`, если и подпись, и метка времени действительны и
                      доверены.
                  integrity:
                    type: boolean
                    description: '`true`, если документ не изменялся с момента подписания.'
                  trusted:
                    type: boolean
                    description: >-
                      `true`, если сертификат подписи восходит к доверенному
                      корневому сертификату.
                  revoked:
                    type: boolean
                  trusted_list:
                    type: object
                    description: >-
                      Проверка по доверенному списку ЕС (EU Trusted List). Для
                      AES: `{"status": "not_applicable", "reason":
                      "aes_not_qualified"}`.
                    properties:
                      status:
                        type: string
                      reason:
                        type: string
                  certificate:
                    type: object
                    nullable: true
                    description: >-
                      Сертификат, которым были подписаны документы. `null` до
                      подписания и всегда `null` для простой подписи.
                    properties:
                      issuer:
                        type: string
                      issued_to:
                        type: string
                      serial:
                        type: string
                        description: Серийный номер, шестнадцатеричный.
                      valid_from:
                        type: string
                        format: date-time
                      valid_until:
                        type: string
                        format: date-time
                  timestamp:
                    type: object
                    nullable: true
                    description: >-
                      Метка времени RFC 3161 в подписи, выпущенная Didit. Имеет
                      значение `null` до подписания и всегда `null` для простой
                      подписи (Simple).
                    properties:
                      time:
                        type: string
                        format: date-time
                      qualified:
                        type: boolean
                        description: Всегда `false` для 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: Время, когда ссылка для подписания перестает работать.
        email_sent_at:
          type: string
          format: date-time
          nullable: true
        email_unavailable_reason:
          type: string
          nullable: true
        ip_address:
          type: string
          nullable: true
          description: IP-адрес подписанта на момент запроса кода.
        place:
          type: string
          nullable: true
          description: 'Не собирается: всегда `null`.'
        place_unavailable_reason:
          type: string
          nullable: true
          enum:
            - not_collected
    SignatureFieldResult:
      type: object
      description: >-
        Поле подписанного документа с его значением в экземпляре этого
        подписанта. См.
        [Поля](/ru/core-technology/electronic-signature/report-electronic-signature#поля).
      properties:
        key:
          type: string
          description: Ключ поля, используемый в `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: >-
            Номер страницы, начиная с 1. Для документа Word это страница
            сконвертированного PDF.
        x:
          type: number
          description: Левый край, в виде доли ширины страницы.
        'y':
          type: number
          description: Верхний край в виде доли от высоты страницы.
        width:
          type: number
          description: Ширина в виде доли от ширины страницы.
        height:
          type: number
          description: Высота в виде доли от высоты страницы.
        required:
          type: boolean
        value:
          nullable: true
          description: >-
            Строка для `text`, `email`, `full_name`, `date_signed` и `data`,
            булево значение для `checkbox`, и `true` для проставленной подписи
            или инициалов. `null`, если поле пустое.
        display_value:
          type: string
          nullable: true
          description: >-
            Значение в том виде, в каком оно проставлено на странице: даты в
            формате поля `date_format`, `Yes` или `No` для чекбокса, `Signed`
            для подписи или инициалов.
        value_source:
          type: string
          nullable: true
          enum:
            - signer
            - identity
            - contact
            - company
            - session
            - metadata
            - api
            - signing_time
            - null
          description: >-
            Источник значения: `signer` (введено, отмечено или применено
            подписантом), `identity` (верифицированное удостоверение личности),
            `contact` (верифицированный email или телефон), `company`
            (верифицированная компания), `session` (`vendor_data`), `metadata`,
            `api` (`sign.field_values`) или `signing_time` (дата подписания).
        filled_at:
          type: string
          format: date-time
          nullable: true
        image_url:
          type: string
          nullable: true
          description: >-
            Только для подписи и инициалов: путь к применённому изображению. См.
            [Скачивание изображения
            подписи](/ru/sessions-api/electronic-signature/download-field-image).
        value_unavailable_reason:
          type: string
          nullable: true
          enum:
            - source_empty
            - null
          description: >-
            `source_empty`, когда предзаполненное поле не имело значения в
            сессии, а `signature_field_data_missing_action` разрешил подписанту
            всё равно поставить подпись.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

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