> ## 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: OCR и подлинность документов

> Верификация документов Didit: 220+ стран и 14,000+ типов документов. Проверка подлинности, OCR, MRZ, менее 2 с, оплата по факту, без контрактов.



## OpenAPI

````yaml ru/openapi-25.json POST /v3/id-verification/
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/id-verification/:
    post:
      tags:
        - Standalone APIs
      summary: Верификация личности (OCR документов + проверки на мошенничество)
      description: >-
        OCR документа, удостоверяющего личность, и проверка на мошенничество с
        документами за один вызов — возвращает извлечённые поля владельца,
        распознанную MRZ, `status` со значением `Approved`/`Declined`/`In
        Review` и список `warnings` с описанием каждой обнаруженной проблемы.
        Поддерживает 14,000+ типов документов из 220+ стран и территорий.


        **Как это работает.** Отправьте `front_image` документа (обязательно) и,
        для двусторонних документов, `back_image`. Загружайте необрезанные
        фотографии, на которых видны все четыре угла документа: сервис сам
        определяет границы, выравнивает и обрезает документ, поэтому
        предварительно обрезать его не нужно. Документ классифицируется
        автоматически (вам не нужно указывать страну или тип документа),
        визуальная зона считывается с помощью OCR, а MRZ и любые штрихкоды
        декодируются. Затем перекрёстные проверки валидируют даты, форматы
        номеров и контрольные цифры MRZ, а также сравнивают визуальную зону с
        MRZ. При `perform_document_liveness=true` изображения дополнительно
        проверяются на пересъёмку с экрана, печатные копии и манипуляции с
        фотографией владельца.


        **Логика принятия решений.** `status` имеет значение `Approved`, если ни
        одно предупреждение не приводит к отклонению. Риски мошенничества и
        критические ошибки всегда приводят к отклонению: `DOCUMENT_EXPIRED`,
        `SCREEN_CAPTURE_DETECTED`, `PRINTED_COPY_DETECTED`,
        `PORTRAIT_MANIPULATION_DETECTED`, `PUBLIC_DOCUMENT_IMAGE_DETECTED`, а
        также ошибки извлечения данных (`NAME_NOT_DETECTED`,
        `DATE_OF_BIRTH_NOT_DETECTED`, `DOCUMENT_NUMBER_NOT_DETECTED`).
        (`PORTRAIT_IMAGE_NOT_DETECTED`, `INVALID_DATE` и `MRZ_NOT_DETECTED`
        существуют в сессиях сценариев, но никогда не возвращаются этим
        отдельным endpoint. `COULD_NOT_DETECT_DOCUMENT_TYPE` возвращается здесь,
        если лицевая сторона изображения с высокой степенью уверенности не
        соответствует известному образцу официального документа, и приводит к
        отклонению запроса.) Три группы рисков можно настроить для каждого
        запроса с помощью `invalid_mrz_action`, `inconsistent_data_action` и
        `expiration_date_not_detected_action` (`DECLINE` или `NO_ACTION`). Все
        остальные предупреждения (например, `POSSIBLE_DUPLICATED_USER`) носят
        информационный характер и сами по себе никогда не приводят к отклонению.
        Если `perform_document_liveness=true` (по умолчанию) и проверка на
        подделку не возвращает пригодную для использования оценку — произошёл
        сбой у провайдера, получен ответ с кодом, отличным от 200, или HTTP 200
        со `status="ERR"` — вызов возвращает `200` со `status: "In Review"` и
        предупреждением `DOCUMENT_LIVENESS_NOT_COMPUTED` (`log_type: "warning"`)
        вместо `Approved`: непроведённая проверка не подтверждает подлинность
        документа. Такую эскалацию нельзя настроить, и она никогда не
        переопределяет статус `Declined`; при `perform_document_liveness=false`
        проверка пропускается, а статус определяется оставшимися
        предупреждениями, как и ранее. Документ, который вообще не удалось
        обработать, возвращает `400` с `{"error":
        "COULD_NOT_RECOGNIZE_DOCUMENT"}`; читаемый, но проблемный документ
        возвращает `200` со `status: "Declined"` — всегда проверяйте
        `id_verification.status` и `id_verification.warnings`, а не только
        HTTP-код.


        **Биллинг.** Каждый ответ `200` расходует один кредит API верификации
        личности (списывается из кредитов вашего тарифа или с баланса
        пополнения). Если баланс организации недостаточен для оплаты вызова,
        endpoint возвращает `403` с ошибкой нехватки кредитов до начала
        обработки изображений.


        **Сохранение сессии (`save_api_request`, по умолчанию `true`).** При
        значении `true` вызов сохраняется как сессия типа API: она отображается
        в Business Console, возвращаемый `request_id` является реальным
        идентификатором сессии, который можно передать в `GET
        /v3/session/{sessionId}/decision/`, обрезанные изображения документа и
        лица сохраняются и возвращаются в виде временных медиа-URL
        (`https://<media-host>/ocr/...`), а webhook `status.updated`
        отправляется на настроенные адреса назначения webhook. При значении
        `false` ничего не сохраняется, `request_id` представляет собой
        одноразовый UUID для корреляции, а
        `portrait_image`/`front_image`/`back_image` возвращаются прямо в ответе
        в виде строк JPEG в кодировке base64.


        **Песочница.** API-ключи песочницы пропускают всю обработку и биллинг:
        после валидации запроса (некорректные входные данные по-прежнему
        возвращают `400`) endpoint возвращает статический тестовый payload со
        статусом `Approved` (вымышленное удостоверение личности гражданина США
        «Sandbox User»), сессия не сохраняется, а кредиты не расходуются.


        **Аутентификация.** Передавайте API-ключ вашего приложения в заголовке
        `x-api-key`. При отсутствии или недействительности учетных данных
        возвращается `403` (`{"detail": "You do not have permission to perform
        this action."}`) — этот API никогда не возвращает `401`.


        **Лимит запросов.** Общий лимит на запись составляет 300 запросов в
        минуту на один API-ключ для всех POST/PATCH/DELETE endpoints; при его
        превышении возвращается `429`.
      operationId: post_v3id-verification
      parameters: []
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - front_image
              properties:
                front_image:
                  type: string
                  format: binary
                  description: >-
                    Лицевая сторона документа, удостоверяющего личность.
                    Допустимые расширения: `tiff`, `jpg`, `jpeg`, `png`, `webp`,
                    `pdf`. Максимальный размер загружаемого файла: **10 MB**
                    (файлы большего размера отклоняются с ошибкой `400`).
                    PDF-файлы преобразуются в изображение перед OCR; для
                    зашифрованных PDF требуется `front_image_password`.
                    Изображения автоматически сжимаются примерно до 0.5 MB, и
                    применяется ориентация EXIF. Загружайте полный необрезанный
                    снимок, на котором видны все четыре угла документа.
                front_image_password:
                  type: string
                  description: >-
                    Пароль для расшифровки `front_image`, если это зашифрованный
                    PDF-файл. Передача зашифрованного PDF без пароля (или с
                    неверным паролем) возвращает `400`.
                  writeOnly: true
                back_image:
                  type: string
                  format: binary
                  description: >-
                    Обратная сторона документа — отправляйте её всегда, когда
                    она есть у документа (многие ID-карты содержат MRZ или
                    штрихкод на обороте; если её опустить, поля MRZ и обратной
                    стороны в ответе останутся пустыми — этот endpoint не выдаёт
                    предупреждение об отсутствии MRZ). Те же ограничения по
                    формату и размеру, что и для `front_image`. Если поле
                    опущено, `back_image` и поля обратной стороны в ответе будут
                    `null`.
                back_image_password:
                  type: string
                  description: >-
                    Пароль для расшифровки `back_image`, если это зашифрованный
                    PDF-файл.
                  writeOnly: true
                perform_document_liveness:
                  type: boolean
                  default: true
                  description: >-
                    Проверяет оба изображения на мошенничество при предъявлении:
                    пересъёмку с экрана (`SCREEN_CAPTURE_DETECTED`), печатные
                    копии (`PRINTED_COPY_DETECTED`) и манипуляции с портретом
                    (`PORTRAIT_MANIPULATION_DETECTED`). Любое из них приводит к
                    автоматическому отклонению. Включено по умолчанию;
                    установите значение `false`, чтобы пропустить проверку на
                    мошенничество и сократить задержку. Если проверка включена,
                    но провайдер не возвращает пригодную для использования
                    оценку, возвращается статус `In Review` с предупреждением
                    `DOCUMENT_LIVENESS_NOT_COMPUTED` вместо `Approved`.
                  example: true
                minimum_age:
                  type: integer
                  nullable: true
                  default: null
                  minimum: 1
                  maximum: 120
                  description: >-
                    Принимается и валидируется (1–120), но **в настоящее время
                    не применяется** этим endpoint — по этому полю никогда не
                    создаётся предупреждение `MINIMUM_AGE_NOT_MET`. Применяйте
                    правила возраста на основе возвращаемых
                    `date_of_birth`/`age` или используйте сценарий сессии
                    верификации с возрастными ограничениями.
                expiration_date_not_detected_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, если не удаётся прочитать срок действия
                    (`EXPIRATION_DATE_NOT_DETECTED`). По умолчанию `NO_ACTION`,
                    так как во многих документах срок действия не указывается.
                    Примечание: *обнаруженный и истёкший* срок действия всегда
                    приводит к отклонению (`DOCUMENT_EXPIRED`) независимо от
                    этой опции.
                invalid_mrz_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Что делать, если извлеченная MRZ не проходит проверку
                    контрольных цифр (`MRZ_VALIDATION_FAILED`). Отсутствие MRZ
                    на этом endpoint не вызывает предупреждения. Актуально
                    только для документов, содержащих MRZ. Значение `REVIEW` не
                    поддерживается на этом endpoint и возвращает `400`.
                inconsistent_data_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Действие при внутренней несогласованности извлечённых
                    данных: `DATA_INCONSISTENT`,
                    `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` (визуальная зона
                    расходится с MRZ) или
                    `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS`.
                critical_field_occlusion_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: DECLINE
                  description: >-
                    Действие при физическом перекрытии важного печатного поля на
                    снимке (`CRITICAL_FIELD_OCCLUSION_DETECTED`) - номера
                    удостоверения личности, имени, даты рождения или срока
                    действия. По умолчанию отклоняет, как и при других рисках
                    целостности документа на этом endpoint: скрытие номеров, с
                    которыми сверяется отчёт, указывает на отредактированный
                    документ. Считанное значение скрытого поля в любом случае
                    удаляется из извлечённых данных, поэтому ему обычно
                    сопутствует предупреждение `*_NOT_DETECTED`. Значение
                    `REVIEW` не поддерживается на этом endpoint и возвращает
                    `400`.
                document_or_personal_number_format_mismatch_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, если номер не соответствует формату органа выдачи
                    для данного типа документа
                    (`DOCUMENT_NUMBER_FORMAT_MISMATCH`,
                    `PERSONAL_NUMBER_FORMAT_MISMATCH`). По умолчанию
                    `NO_ACTION`, что регистрирует предупреждение без изменения
                    статуса. `REVIEW` не поддерживается на этом endpoint и
                    возвращает `400`.
                preferred_characters:
                  type: string
                  enum:
                    - latin
                    - non_latin
                  default: latin
                  description: >-
                    Предпочтительная система письма для полей имени/адреса в
                    документах, содержащих текст как на латинице, так и не на
                    латинице (арабский, кириллица, CJK, …). `latin` возвращает
                    транслитерированные/латинские значения; `non_latin` отдаёт
                    предпочтение оригинальной системе письма.
                save_api_request:
                  type: boolean
                  default: true
                  description: >-
                    Если `true` (по умолчанию), сохраняет вызов как сессию типа
                    API — видимую в Business Console, доступную через `GET
                    /v3/session/{sessionId}/decision/` по возвращённому
                    `request_id`, анонсируемую через webhook `status.updated`, с
                    возвратом изображений документов в виде URL-адресов медиа.
                    Если `false`, ничего не сохраняется, `request_id` является
                    временным UUID, а изображения возвращаются встроенными в
                    виде строк base64 JPEG.
                  example: true
                vendor_data:
                  type: string
                  description: >-
                    Необязательная непрозрачная строка (ваш внутренний
                    идентификатор пользователя, email, UUID…), сохраняемая в
                    сессии и возвращаемая в ответе. Используйте её для
                    сопоставления вызовов API с вашими собственными записями и
                    для последующей фильтрации сессий.
                  example: user-123
                metadata:
                  type: object
                  additionalProperties: true
                  description: >-
                    Необязательный объект JSON, сохраняемый вместе с сессией
                    (когда `save_api_request=true`) и возвращаемый обратно в
                    ответе. В multipart-запросах отправляйте его как строковое
                    поле в формате JSON (например,
                    `metadata={"flow":"onboarding"}`) — он парсится в объект.
                  example:
                    flow: onboarding
            example:
              front_image: (binary JPEG/PNG/PDF of the document front)
              back_image: (binary JPEG/PNG/PDF of the document back)
              perform_document_liveness: true
              save_api_request: true
              vendor_data: user-123
              metadata:
                flow: onboarding
      responses:
        '200':
          description: >-
            Документ обработан. Значение `id_verification.status`: `Approved`,
            `Declined` или `In Review`; каждая обнаруженная проблема
            детализирована в `id_verification.warnings`. Статус `In Review`
            возвращается, когда запрошенная проверка живости документа не дала
            пригодного результата (`DOCUMENT_LIVENESS_NOT_COMPUTED`). Для
            проблемного документа по-прежнему возвращается `200` со статусом
            `status: "Declined"`: проверяйте тело ответа, а не только HTTP-код.
            Если `save_api_request=true`, `request_id` представляет собой
            сохранённый id сессии, а поля изображений являются временными URL
            медиафайлов; при `save_api_request=false` они передаются как
            встроенные base64-строки JPEG.
          content:
            application/json:
              examples:
                Approved:
                  summary: >-
                    Двусторонняя ID-карта успешно считана (сохранено —
                    изображения в виде URL-адресов медиа)
                  value:
                    request_id: 11d219ed-d59c-4b1d-8d65-9b933f12d5b8
                    id_verification:
                      status: Approved
                      document_type: Identity Card
                      document_subtype: ID_CARD_GENERIC
                      document_number: CBX164224
                      personal_number: 20446581H
                      portrait_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-portrait_image-8c2f.jpg?signature=...
                      front_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-front_image-4a1e.jpg?signature=...
                      back_image: >-
                        https://<media-host>/ocr/11d219ed-d59c-4b1d-8d65-9b933f12d5b8-back_image-77b0.jpg?signature=...
                      front_image_camera_front: null
                      back_image_camera_front: null
                      front_image_camera_front_face_match_score: null
                      back_image_camera_front_face_match_score: null
                      front_image_quality_score:
                        focus_score: 78
                        brightness_score: 83.2
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 40.7
                        overall_score: 70.2
                      back_image_quality_score:
                        focus_score: 100
                        brightness_score: 95.6
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 43
                        overall_score: 84.4
                      date_of_birth: '1980-01-13'
                      age: 46
                      expiration_date: '2032-03-31'
                      date_of_issue: '2022-03-31'
                      issuing_state: ESP
                      issuing_state_name: Spain
                      first_name: Julio Francisco
                      last_name: Fores Sena
                      full_name: Julio Francisco Fores Sena
                      gender: M
                      address: >-
                        Brda. Urb. El Cardonal 0052 52 Po3 B,Taco,San Cristobal
                        De La Laguna,Santa Cruz De Tenerife
                      formatted_address: >-
                        Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de
                        Tenerife, Spain
                      place_of_birth: Valencia, Valencia
                      marital_status: UNKNOWN
                      nationality: ESP
                      extra_fields:
                        first_surname: Fores
                        second_surname: Sena
                      mrz:
                        surname: FORES SENA
                        name: JULIO FRANCISCO
                        country: ESP
                        nationality: ESP
                        birth_date: '800113'
                        expiry_date: '320331'
                        sex: M
                        document_type: ID
                        document_number: CBX164224
                        optional_data: 20446581H
                        optional_data_2: ''
                        birth_date_hash: '9'
                        expiry_date_hash: '8'
                        document_number_hash: '3'
                        final_hash: '3'
                        personal_number: 20446581H
                        warnings: []
                        errors: []
                        mrz_type: TD1
                        mrz_string: |-
                          IDESPCBX164224320446581H<<<<<<
                          8001139M3203318ESP<<<<<<<<<<<3
                          FORES<SENA<<JULIO<FRANCISCO<<<
                        mrz_key: CBX164224380011393203318
                      parsed_address:
                        street_1: Avenida el Cardonal 52
                        street_2: b
                        city: La Laguna
                        region: Canarias
                        country: ES
                        postal_code: '38108'
                        address_type: Avenida
                        formatted_address: >-
                          Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz de
                          Tenerife, Spain
                        raw_results:
                          address_components:
                            - long_name: b
                              short_name: b
                              types:
                                - subpremise
                            - long_name: '52'
                              short_name: '52'
                              types:
                                - street_number
                            - long_name: Avenida el Cardonal
                              short_name: Av. el Cardonal
                              types:
                                - route
                            - long_name: La Laguna
                              short_name: La Laguna
                              types:
                                - locality
                                - political
                            - long_name: Spain
                              short_name: ES
                              types:
                                - country
                                - political
                            - long_name: '38108'
                              short_name: '38108'
                              types:
                                - postal_code
                          formatted_address: >-
                            Av. el Cardonal, 52, b, 38108 La Laguna, Santa Cruz
                            de Tenerife, Spain
                          geometry:
                            location:
                              lat: 28.4501161
                              lng: -16.3004407
                            location_type: ROOFTOP
                          types:
                            - street_address
                            - subpremise
                        document_location:
                          latitude: 28.4501161
                          longitude: -16.3004407
                        label: Spain Identity Card Address
                        is_verified: true
                        category: Residential
                      warnings: []
                      barcodes: []
                    vendor_data: user-123
                    metadata:
                      flow: onboarding
                    created_at: '2026-06-12T02:21:56.013573+00:00'
                Declined - expired document:
                  summary: >-
                    Загрузка только лицевой стороны просроченного удостоверения
                    личности
                  value:
                    request_id: f61681b8-9422-4378-ac3e-04c6a247fb45
                    id_verification:
                      status: Declined
                      document_type: Identity Card
                      document_subtype: ID_CARD_GENERIC
                      document_number: BNK123072
                      personal_number: 21771255F
                      portrait_image: >-
                        https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-portrait_image-1d9a.jpg?signature=...
                      front_image: >-
                        https://<media-host>/ocr/f61681b8-9422-4378-ac3e-04c6a247fb45-front_image-5c2b.jpg?signature=...
                      back_image: null
                      front_image_camera_front: null
                      back_image_camera_front: null
                      front_image_camera_front_face_match_score: null
                      back_image_camera_front_face_match_score: null
                      front_image_quality_score:
                        focus_score: 100
                        brightness_score: 95.7
                        brightness_issue: ok
                        is_document_fully_visible: true
                        resolution_score: 22.2
                        overall_score: 79.3
                      back_image_quality_score: null
                      date_of_birth: '1997-01-30'
                      age: 29
                      expiration_date: '2025-11-26'
                      date_of_issue: null
                      issuing_state: ESP
                      issuing_state_name: Spain
                      first_name: Lucia
                      last_name: Marin Castro
                      full_name: Lucia Marin Castro
                      gender: F
                      address: null
                      formatted_address: null
                      place_of_birth: null
                      marital_status: UNKNOWN
                      nationality: ESP
                      extra_fields:
                        first_surname: Marin
                        second_surname: Castro
                      mrz: {}
                      parsed_address: null
                      warnings:
                        - risk: DOCUMENT_EXPIRED
                          feature: ID_VERIFICATION
                          additional_data: null
                          log_type: error
                          short_description: Document expired
                          long_description: >-
                            The document's expiration date has passed, rendering
                            it no longer valid for use.
                      barcodes: []
                    vendor_data: user-123
                    metadata: null
                    created_at: '2026-06-12T02:25:48.117204+00:00'
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                    format: uuid
                    description: >-
                      Идентификатор сохраненной сессии при
                      `save_api_request=true` (доступен для использования с `GET
                      /v3/session/{sessionId}/decision/`); в противном случае
                      это временный корреляционный UUID.
                  id_verification:
                    type: object
                    properties:
                      status:
                        type: string
                        enum:
                          - Approved
                          - Declined
                          - In Review
                        description: >-
                          `Approved`, если ни одно предупреждение не приводит к
                          отклонению и запрошенная проверка живости документа
                          дала пригодный для использования результат; `In
                          Review`, если эта запрошенная проверка не дала
                          пригодного для использования результата
                          (`DOCUMENT_LIVENESS_NOT_COMPUTED`); `Declined`, если
                          предупреждение приводит к отклонению — список
                          `warnings` поясняет причину.
                      document_type:
                        type: string
                        nullable: true
                        description: >-
                          Отображаемое название обнаруженного типа документа:
                          `Identity Card`, `Passport`, `Driver's License`,
                          `Residence Permit`, `Health Insurance Card` или `Tax
                          Card`. `null`, если документ не удалось
                          классифицировать.
                        example: Identity Card
                      document_subtype:
                        type: string
                        nullable: true
                        description: >-
                          Более точный подтип, если доступен (например,
                          `ID_CARD_GENERIC`, `EPASSPORT`).
                        example: ID_CARD_GENERIC
                      document_number:
                        type: string
                        nullable: true
                        example: CBX164224
                      personal_number:
                        type: string
                        nullable: true
                        description: >-
                          Вторичный персональный/национальный номер,
                          напечатанный на некоторых документах.
                        example: 20446581H
                      portrait_image:
                        type: string
                        nullable: true
                        description: >-
                          Обрезанная фотография портрета из документа. Временный
                          URL-адрес медиафайла (`https://<media-host>/ocr/...`),
                          если `save_api_request=true` (по умолчанию);
                          встроенная строка JPEG в кодировке base64, если
                          `save_api_request=false`. `null`, если портрет не был
                          обнаружен.
                      front_image:
                        type: string
                        nullable: true
                        description: >-
                          Выровненная обрезанная область лицевой стороны
                          документа. URL медиафайла, если сохранено, иначе
                          встроенный JPEG в base64.
                      back_image:
                        type: string
                        nullable: true
                        description: >-
                          Выровненная обрезанная область оборотной стороны
                          документа. `null`, если `back_image` не загружался.
                      front_image_camera_front:
                        type: string
                        nullable: true
                        description: >-
                          Всегда `null` на этом endpoint (заполняется только в
                          сессиях верификации с захватом с камеры).
                      back_image_camera_front:
                        type: string
                        nullable: true
                        description: Всегда `null` на этом endpoint.
                      front_image_camera_front_face_match_score:
                        type: number
                        nullable: true
                        description: Всегда `null` на этом endpoint.
                      back_image_camera_front_face_match_score:
                        type: number
                        nullable: true
                        description: Всегда `null` на этом endpoint.
                      front_image_quality_score:
                        type: object
                        nullable: true
                        description: >-
                          Диагностика качества захвата для загруженного
                          изображения (`null`, если сторона не была
                          предоставлена или оценка не удалась). Все оценки
                          находятся в диапазоне 0–100.
                        properties:
                          focus_score:
                            type: number
                            format: float
                            description: >-
                              Чёткость обрезанного изображения документа (чем
                              выше значение, тем чётче).
                          brightness_score:
                            type: number
                            format: float
                            description: Качество экспозиции (чем выше, тем лучше).
                          brightness_issue:
                            type: string
                            nullable: true
                            description: >-
                              `ok`, если экспозиция в норме, иначе обнаруженная
                              проблема (например, слишком темно / слишком ярко).
                          is_document_fully_visible:
                            type: boolean
                            nullable: true
                            description: >-
                              Находятся ли все четыре угла документа внутри
                              рамки.
                          resolution_score:
                            type: number
                            format: float
                            description: Фактическое разрешение области документа.
                          overall_score:
                            type: number
                            format: float
                            description: Агрегированная оценка качества.
                      back_image_quality_score:
                        type: object
                        nullable: true
                        description: >-
                          Диагностика качества захвата для загруженного
                          изображения (`null`, если сторона не была
                          предоставлена или оценка не удалась). Все оценки
                          находятся в диапазоне 0–100.
                        properties:
                          focus_score:
                            type: number
                            format: float
                            description: >-
                              Чёткость обрезанного изображения документа (чем
                              выше значение, тем чётче).
                          brightness_score:
                            type: number
                            format: float
                            description: Качество экспозиции (чем выше, тем лучше).
                          brightness_issue:
                            type: string
                            nullable: true
                            description: >-
                              `ok`, если экспозиция в норме, иначе обнаруженная
                              проблема (например, слишком темно / слишком ярко).
                          is_document_fully_visible:
                            type: boolean
                            nullable: true
                            description: >-
                              Находятся ли все четыре угла документа внутри
                              рамки.
                          resolution_score:
                            type: number
                            format: float
                            description: Фактическое разрешение области документа.
                          overall_score:
                            type: number
                            format: float
                            description: Агрегированная оценка качества.
                      date_of_birth:
                        type: string
                        format: date
                        nullable: true
                        example: '1980-01-13'
                      age:
                        type: integer
                        nullable: true
                        description: >-
                          Возраст владельца в годах, рассчитанный на основе
                          `date_of_birth`.
                        example: 46
                      expiration_date:
                        type: string
                        format: date
                        nullable: true
                        example: '2032-03-31'
                      date_of_issue:
                        type: string
                        format: date
                        nullable: true
                        example: '2022-03-31'
                      issuing_state:
                        type: string
                        nullable: true
                        description: Страна выдачи (ISO 3166-1 alpha-3).
                        example: ESP
                      issuing_state_name:
                        type: string
                        nullable: true
                        example: Spain
                      first_name:
                        type: string
                        nullable: true
                        example: Julio Francisco
                      last_name:
                        type: string
                        nullable: true
                        example: Fores Sena
                      full_name:
                        type: string
                        nullable: true
                        example: Julio Francisco Fores Sena
                      gender:
                        type: string
                        nullable: true
                        description: >-
                          `M`, `F` или `null`, если не напечатано или не
                          обнаружено.
                        example: M
                      address:
                        type: string
                        nullable: true
                        description: Адрес в точности так, как напечатан на документе.
                      formatted_address:
                        type: string
                        nullable: true
                        description: Геокодированная нормализованная версия `address`.
                      place_of_birth:
                        type: string
                        nullable: true
                        example: Valencia, Valencia
                      marital_status:
                        type: string
                        nullable: true
                        description: >-
                          `UNKNOWN`, если в документе не указано семейное
                          положение.
                        example: UNKNOWN
                      nationality:
                        type: string
                        nullable: true
                        description: Гражданство владельца (ISO 3166-1 alpha-3).
                        example: ESP
                      extra_fields:
                        type: object
                        nullable: true
                        additionalProperties: true
                        description: >-
                          Специфичные для документа дополнительные поля, не
                          имеющие отдельного столбца (например,
                          `first_surname`/`second_surname` в испанских
                          удостоверениях личности, категории в водительских
                          удостоверениях).
                      mrz:
                        type: object
                        description: >-
                          Распознанная машиночитаемая зона. **Пустой объект**
                          (`{}`), если в документе нет MRZ или её не удалось
                          прочитать — в этом случае также проверьте список
                          `warnings`. Даты внутри MRZ используют исходный формат
                          `YYMMDD`.
                        properties:
                          surname:
                            type: string
                            example: FORES SENA
                          name:
                            type: string
                            example: JULIO FRANCISCO
                          country:
                            type: string
                            description: Страна выдачи (ISO 3166-1 alpha-3).
                            example: ESP
                          nationality:
                            type: string
                            description: Гражданство владельца (ISO 3166-1 alpha-3).
                            example: ESP
                          birth_date:
                            type: string
                            description: Необработанная дата рождения из MRZ (`YYMMDD`).
                            example: '800113'
                          expiry_date:
                            type: string
                            description: Необработанный срок действия из MRZ (`YYMMDD`).
                            example: '320331'
                          sex:
                            type: string
                            example: M
                          document_type:
                            type: string
                            description: Код типа документа по MRZ (например, `ID`, `P`).
                            example: ID
                          document_number:
                            type: string
                            example: CBX164224
                          optional_data:
                            type: string
                            nullable: true
                            example: 20446581H
                          optional_data_2:
                            type: string
                            nullable: true
                            example: ''
                          birth_date_hash:
                            type: string
                            description: Контрольная цифра MRZ для даты рождения.
                            example: '9'
                          expiry_date_hash:
                            type: string
                            description: Контрольная цифра MRZ для срока действия.
                            example: '8'
                          document_number_hash:
                            type: string
                            description: Контрольная цифра MRZ для номера документа.
                            example: '3'
                          final_hash:
                            type: string
                            description: Составная контрольная цифра MRZ.
                            example: '3'
                          personal_number:
                            type: string
                            nullable: true
                            example: 20446581H
                          warnings:
                            type: array
                            items:
                              type: string
                            description: Некритичные предупреждения парсинга MRZ.
                          errors:
                            type: array
                            items:
                              type: string
                            description: >-
                              Ошибки контрольной цифры/парсинга MRZ. Наличие
                              ошибок приводит к предупреждению
                              `MRZ_VALIDATION_FAILED`.
                          mrz_type:
                            type: string
                            description: >-
                              Формат MRZ: `TD1` (удостоверения личности, 3
                              строки), `TD2` или `TD3` (паспорта, 2 строки).
                            example: TD1
                          mrz_string:
                            type: string
                            description: >-
                              Необработанный текст MRZ в исходном виде, строки
                              разделены `\n`.
                          mrz_key:
                            type: string
                            description: >-
                              Составной ключ (номер документа + контрольные
                              цифры), используемый для перекрёстных проверок.
                      parsed_address:
                        type: object
                        nullable: true
                        description: >-
                          Структурированная геокодированная детализация
                          `address`. `null`, если документ не содержит адреса
                          или его не удалось распознать.
                        properties:
                          street_1:
                            type: string
                            nullable: true
                            example: Avenida el Cardonal 52
                          street_2:
                            type: string
                            nullable: true
                            example: b
                          city:
                            type: string
                            nullable: true
                            example: La Laguna
                          region:
                            type: string
                            nullable: true
                            example: Canarias
                          country:
                            type: string
                            nullable: true
                            description: Двухбуквенный код страны ISO 3166-1 alpha-2.
                            example: ES
                          postal_code:
                            type: string
                            nullable: true
                            example: '38108'
                          address_type:
                            type: string
                            nullable: true
                            example: Avenida
                          formatted_address:
                            type: string
                            nullable: true
                            description: Каноническая строка геокодированного адреса.
                            example: >-
                              Av. el Cardonal, 52, b, 38108 La Laguna, Santa
                              Cruz de Tenerife, Spain
                          raw_results:
                            type: object
                            additionalProperties: true
                            description: >-
                              Необработанный payload геокодирования
                              (`address_components`, `geometry.location`,
                              `place_id`, …) для продвинутых пользователей.
                          document_location:
                            type: object
                            nullable: true
                            properties:
                              latitude:
                                type: number
                              longitude:
                                type: number
                            description: Геокодированные координаты адреса из документа.
                          label:
                            type: string
                            nullable: true
                            description: Из какого поля документа был считан адрес.
                            example: Spain Identity Card Address
                          is_verified:
                            type: boolean
                            description: >-
                              Подтвердило ли геокодирование существование
                              адреса.
                          category:
                            type: string
                            nullable: true
                            description: >-
                              Категория адреса (например, `Residential`,
                              `Commercial`).
                            example: Residential
                      warnings:
                        type: array
                        description: >-
                          Пусто при чистом одобрении. Каждая запись описывает
                          один обнаруженный риск; записи с `log_type: "error"`
                          устанавливают для `status` значение `Declined`, а
                          `DOCUMENT_LIVENESS_NOT_COMPUTED` (`log_type:
                          "warning"`) устанавливает значение `In Review`.
                        items:
                          type: object
                          properties:
                            risk:
                              type: string
                              description: >-
                                Машиночитаемый код риска. Риски, всегда
                                приводящие к отклонению: `DOCUMENT_EXPIRED`,
                                `MINIMUM_AGE_NOT_MET`,
                                `PORTRAIT_IMAGE_NOT_DETECTED`,
                                `SCREEN_CAPTURE_DETECTED`,
                                `PRINTED_COPY_DETECTED`,
                                `PORTRAIT_MANIPULATION_DETECTED`,
                                `PUBLIC_DOCUMENT_IMAGE_DETECTED`,
                                `INVALID_DATE`, `COULD_NOT_RECOGNIZE_DOCUMENT`
                                (только для статуса 400, никогда не бывает
                                предупреждением),
                                `DOCUMENT_NUMBER_NOT_DETECTED`,
                                `COULD_NOT_DETECT_DOCUMENT_TYPE`,
                                `NAME_NOT_DETECTED`,
                                `DATE_OF_BIRTH_NOT_DETECTED`. Риски,
                                регулируемые параметрами запроса:
                                `MRZ_NOT_DETECTED` / `MRZ_VALIDATION_FAILED`
                                (`invalid_mrz_action`), `DATA_INCONSISTENT` /
                                `MRZ_AND_DATA_EXTRACTED_FROM_OCR_NOT_SAME` /
                                `DOCUMENT_NAME_DIFFERENT_FROM_OTHER_APPROVED_DOCUMENTS`
                                (`inconsistent_data_action`),
                                `EXPIRATION_DATE_NOT_DETECTED`
                                (`expiration_date_not_detected_action`). Другие
                                риски (например, `POSSIBLE_DUPLICATED_USER`)
                                являются информационными.
                                `DOCUMENT_LIVENESS_NOT_COMPUTED` возникает,
                                когда `perform_document_liveness=true`, но
                                проверка на подделку не вернула пригодной для
                                использования оценки; это устанавливает `status`
                                в значение `In Review` (на проверке).
                                `COULD_NOT_DETECT_DOCUMENT_TYPE` также
                                возвращается, если лицевая сторона документа не
                                совпадает с высокой степенью уверенности с
                                известным официальным дизайном документа,
                                например, при отредактированном или созданном на
                                компьютере документе, либо дизайне, который ещё
                                не поддерживается.
                              example: DOCUMENT_EXPIRED
                            feature:
                              type: string
                              enum:
                                - ID_VERIFICATION
                              description: >-
                                Функция, вызвавшая предупреждение. На этом
                                endpoint всегда `ID_VERIFICATION`.
                            additional_data:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                Дополнительный контекст для некоторых рисков
                                (например, `POSSIBLE_DUPLICATED_USER` включает
                                `duplicated_session_id`); `null` для
                                большинства.
                            log_type:
                              type: string
                              enum:
                                - error
                                - warning
                                - information
                              description: >-
                                Серьёзность. Предупреждения `error` переводят
                                `status` в `Declined`; `warning` (только
                                `DOCUMENT_LIVENESS_NOT_COMPUTED`, когда
                                запрошенная проверка на подделку не дала
                                применимой оценки) переводит `status` в `In
                                Review`; записи `information` носят
                                информационный характер и никогда не меняют
                                статус.
                            short_description:
                              type: string
                              description: >-
                                Краткая сводка риска в одну строку в понятном
                                человеку формате.
                            long_description:
                              type: string
                              description: Понятное объяснение риска.
                      barcodes:
                        type: array
                        description: >-
                          Штрихкоды, распознанные на документе (PDF417, QR и т.
                          д.). Пусто, если на документе нет штрихкодов или ни
                          один не удалось прочитать.
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              description: >-
                                Тип штрихкода (например, `PDF417`, `QR_CODE`,
                                `UNKNOWN`).
                            position:
                              type: object
                              nullable: true
                              additionalProperties: true
                              description: >-
                                Местоположение штрихкода на изображении, если
                                доступно.
                            data:
                              type: string
                              description: Декодированный payload.
                            data_raw:
                              type: string
                              description: >-
                                Необработанный (недекодированный) payload, если
                                отличается.
                            side:
                              type: string
                              nullable: true
                              description: '`front` или `back`.'
                  vendor_data:
                    type: string
                    nullable: true
                    description: Эхо-значение переданного вами `vendor_data` или `null`.
                  metadata:
                    type: object
                    nullable: true
                    additionalProperties: true
                    description: >-
                      Эхо-значение переданного вами объекта `metadata` или
                      `null`.
                  created_at:
                    type: string
                    format: date-time
                    description: Временная метка ISO 8601 (UTC) момента генерации ответа.
        '400':
          description: >-
            Ошибка валидации или обработки. Проблемы на уровне полей возвращают
            стандартную структуру DRF (один массив сообщений на каждое
            проблемное поле). Проблемы с зашифрованными PDF возвращают
            `{"detail": ...}`. Изображение документа, на котором вообще не
            удаётся распознать документ, возвращает `{"error":
            "COULD_NOT_RECOGNIZE_DOCUMENT"}`. Загрузка PDF может дополнительно
            завершиться ошибкой «Отправленный PDF-файл повреждён или
            недействителен.» или ошибкой отсутствия страниц.
          content:
            application/json:
              examples:
                Missing front image:
                  summary: '`front_image` не включено в данные формы'
                  value:
                    front_image:
                      - No file was submitted.
                Unsupported file extension:
                  summary: Расширение файла отличается от tiff/jpg/jpeg/png/webp/pdf
                  value:
                    front_image:
                      - >-
                        File extension “txt” is not allowed. Allowed extensions
                        are: tiff, jpg, jpeg, png, webp, pdf.
                File too large:
                  summary: Размер загружаемого файла превышает лимит в 10 МБ
                  value:
                    front_image:
                      - File size should not exceed 10 MB
                Invalid option value:
                  summary: Варианты принимают только DECLINE или NO_ACTION
                  value:
                    invalid_mrz_action:
                      - '"REVIEW" is not a valid choice.'
                Encrypted PDF:
                  summary: PDF загружен без обязательного пароля
                  value:
                    detail: >-
                      The PDF is encrypted. Please upload a decrypted PDF or a
                      photo instead.
                Wrong PDF password:
                  summary: >-
                    `front_image_password` / `back_image_password` не
                    расшифровывает PDF
                  value:
                    detail: >-
                      The PDF password is incorrect. Please provide the correct
                      password.
                Document not recognized:
                  summary: >-
                    На изображении не удалось обнаружить документ,
                    удостоверяющий личность
                  value:
                    error: COULD_NOT_RECOGNIZE_DOCUMENT
                PDF conversion failure:
                  summary: Не удалось преобразовать загруженный PDF-файл в изображение
                  value:
                    error: Failed to convert front image PDF.
        '403':
          description: >-
            В доступе отказано. Возвращается, если заголовок `x-api-key`
            отсутствует, а также если баланс вызывающей организации не покрывает
            вызов; неверный, отозванный или истекший ключ возвращает `401`.
            Отсутствующий ключ возвращает `403` с `{"detail": ...}`; неверный,
            отозванный или истекший ключ возвращает `401`. При нехватке кредитов
            возвращается `403` с `{"error": ...}` до начала любой обработки
            изображения.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Отсутствует заголовок `x-api-key`, либо ключ
                    недействителен/отозван
                  value:
                    detail: You do not have permission to perform this action.
                Not enough credits:
                  summary: Баланс организации недостаточен для совершения вызова
                  value:
                    error: >-
                      You don't have enough credits to perform this request.
                      Please top up at https://business.didit.me
        '429':
          description: >-
            Превышен лимит запросов. Endpoint'ы POST/PATCH/DELETE делят общий
            лимит в 300 запросов на запись в минуту на один API-ключ (для
            создания транзакций и отправки событий действует отдельный лимит в
            600). Ответ содержит заголовки `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` и `Retry-After`.
          content:
            application/json:
              examples:
                Write rate limit exceeded:
                  summary: Более 300 запросов на запись в текущую минуту
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '503':
          $ref: '#/components/responses/DocumentProcessingBusy'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl -X POST 'https://verification.didit.me/v3/id-verification/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -F 'front_image=@./id_front.jpg' \
              -F 'back_image=@./id_back.jpg' \
              -F 'perform_document_liveness=true' \
              -F 'save_api_request=true' \
              -F 'vendor_data=user-123'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.id_verification.verify(
                front_image=open("front_image.jpg", "rb"),
                back_image=open("back_image.jpg", "rb"),
                perform_document_liveness=True,
                save_api_request=True,
                vendor_data="user-123",
                metadata={"flow": "onboarding"},
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit, { fileFromPath } from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.idVerification.verify({
              front_image: await fileFromPath("front_image.jpg"),
              back_image: await fileFromPath("back_image.jpg"),
              perform_document_liveness: true,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "onboarding" },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{\n\tFrontImage:              didit.FileFromPath(\"front_image.jpg\"),\n\tBackImage:               didit.Some(didit.FileFromPath(\"back_image.jpg\")),\n\tPerformDocumentLiveness: didit.Bool(true),\n\tSaveAPIRequest:          didit.Bool(true),\n\tVendorData:              didit.String(\"user-123\"),\n\tMetadata:                didit.Some(map[string]any{\"flow\": \"onboarding\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.IdVerificationVerifyParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.idVerification().verify(IdVerificationVerifyParams.builder()
                    .frontImage(Path.of("front_image.jpg"))
                    .backImage(Path.of("back_image.jpg"))
                    .performDocumentLiveness(true)
                    .saveApiRequest(true)
                    .vendorData("user-123")
                    .metadata(Map.of("flow", "onboarding"))
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;
            use Didit\File;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->idVerification->verify([
                'front_image' => File::fromPath('front_image.jpg'),
                'back_image' => File::fromPath('back_image.jpg'),
                'perform_document_liveness' => true,
                'save_api_request' => true,
                'vendor_data' => 'user-123',
                'metadata' => ['flow' => 'onboarding'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.id_verification.verify(
              front_image: Pathname("front_image.jpg"),
              back_image: Pathname("back_image.jpg"),
              perform_document_liveness: true,
              save_api_request: true,
              vendor_data: "user-123",
              metadata: { flow: "onboarding" }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.IdVerification.VerifyAsync(new
            IdVerificationVerifyParams

            {
                FrontImage = FileUpload.FromPath("front_image.jpg"),
                BackImage = FileUpload.FromPath("back_image.jpg"),
                PerformDocumentLiveness = true,
                SaveApiRequest = true,
                VendorData = "user-123",
                Metadata = new Dictionary<string, object> { ["flow"] = "onboarding" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  responses:
    DocumentProcessingBusy:
      description: >-
        В данный момент обрабатывается слишком много документов, поэтому эта
        загрузка не была обработана: ничего не сохранено, и попытка не была
        использована. Отправьте тот же файл повторно через количество секунд,
        указанное в `Retry-After`. Выполняйте ветвление по `code`, а не по
        тексту сообщения.
      headers:
        Retry-After:
          description: >-
            Количество секунд ожидания перед повторной отправкой того же
            запроса.
          schema:
            type: integer
            example: 10
      content:
        application/json:
          schema:
            type: object
            required:
              - detail
              - code
            properties:
              detail:
                type: string
              code:
                type: string
                enum:
                  - document_processing_busy
          example:
            detail: We are busy processing documents. Please try again in a moment.
            code: document_processing_busy
  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.