> ## 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: одобрение и отклонение

> Изменяйте статус сессии Didit через PATCH /v3/session/{id}/update-status/: одобрение, отклонение или перевод на проверку. KYC и KYB. Оплата по факту.



Промпт обновления статуса сессии
        Скопировать промпт в буфер обмена



      
      

\<pre>

\`Manually approve, decline, or re-open a Didit verification session.

Endpoint:
PATCH https://verification.didit.me/v3/session/{session_id}/update-status/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: write:sessions.

Path parameter:
\- session_id (UUID) — KYC or KYB; Didit resolves it against both session types.

Request body:
\- new_status (string, required) — One of "Approved", "Declined", "Resubmitted". Any other value is rejected.
\- comment (string, optional) — Free-text note saved on the audit trail (visible in the Console review log).
\- nodes_to_resubmit (array, required when new_status="Resubmitted") — Which feature steps the user must redo. Each entry: { "node_id": "feature_poa_1", "feature": "POA" }. KYB-only nodes "KYB_REGISTRY" and "KYB_KEY_PEOPLE" cannot be resubmitted directly (the parent recomputes from child KYCs).
\- send_email (boolean, optional, default false): if true, email the person. "Approved" and "Declined" send their decision email; "Resubmitted" sends a fresh hosted link with the reasons.
\- email_address (string, required when send_email=true).
\- email_language (string, optional, default "en") — ISO 639-1.
\- email_preview_token (string, optional): the preview_token from Preview Decision Email ("Approved", "Declined") or Preview Resubmission Email ("Resubmitted"). Only valid with send_email=true; without it the request returns 400 { "email_preview_token": ["A preview receipt is only valid when the email is sent."] }. The update then sends exactly the previewed email, or returns 409 before changing anything if the email or the session changed since the preview.

Optional preview step (all three statuses):
1\. Preview the email. Neither call changes the session or sends anything.
\- Approved or Declined: POST https://verification.didit.me/v3/session/{session_id}/decision-email-preview/ with { "new_status": "Approved", "email_language": "en" } (see /sessions-api/preview-decision-email).
\- Resubmitted: POST https://verification.didit.me/v3/session/{session_id}/resubmission-preview/ with { "nodes_to_resubmit": [...], "email_language": "en" } (see /sessions-api/preview-resubmission). email_address is optional there; without it the email goes to the person's own address.
2\. Check subject, html, recipient, will_be_sent and not_sent_reason in the response.
3\. Confirm here with the same new_status (and the same nodes_to_resubmit for Resubmitted), send_email=true, email_address=<recipient>, email_language=<the language you previewed>, email_preview_token=<preview_token>.
The receipt expires after 15 minutes.

Allowed transitions:
Current status must be one of: Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted. Otherwise the API returns 400 { "detail": "Only sessions with status Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted can be updated. Current status: ..." }.
Setting "Approved" or "Declined" on a session that already has that status is a no-op: 200, nothing changes, and no webhook or email goes out. Setting "Resubmitted" on a session that is already Resubmitted returns 400 ["The new status is the same as the current status."].

curl example — approve after manual review:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"comment": "Cleared after compliance review."
}'

curl example: approve and send the email you previewed:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Approved",
"send_email": true,
"email_address": "<recipient from the preview>",
"email_language": "en",
"email_preview_token": "<preview_token from the preview>"
}'

curl example — request resubmission of the proof-of-address step:
curl -X PATCH https://verification.didit.me/v3/session/<SESSION_ID>/update-status/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"new_status": "Resubmitted",
"nodes_to_resubmit": [{ "node_id": "feature_poa_1", "feature": "POA" }],
"comment": "Please upload a clearer proof of address",
"send_email": true,
"email_address": "user@example.com"
}'

Response: { "session_id": "<uuid>" } only. Fetch the refreshed session with GET /v3/session/{session_id}/decision/.

Side effects:
\- Fires a status.updated webhook (plus user.status.updated or business.status.updated alias).
\- Writes an entry to the Console review trail with the actor and your comment.
\- "Approved" or "Declined" with send_email=true emails the decision to email_address. Preview Decision Email tells you beforehand whether it will be sent (for example, not to the contact_details address of a session created without contact_details.send_notification_emails=true).
\- "Resubmitted" sends the user back to the steps in nodes_to_resubmit, resets the session expiration window, and (if send_email=true) emails the user a fresh link. What those steps returned before stays readable: the decision endpoint returns it with include=resubmissions (see Retrieve Session).

Failure modes:
\- 400: invalid new_status (only "Approved", "Declined" and "Resubmitted" are accepted), current status not allowed, nothing to resubmit, send_email=true without email_address, or email_preview_token without send_email=true. Field errors look like { "<field>": ["..."] }.
\- 401: the scoped API key has expired.
\- 403: { "detail": "..." } when credentials are missing or invalid, the caller lacks write:sessions (a scoped API key needs decisions write), or the session belongs to another application.
\- 404: { "detail": "Not found." } when no session with this session_id exists.
\- 409: { "detail": "This email preview changed or expired. Preview the message again before confirming." } when email_preview_token no longer matches the email or the session, or is older than 15 minutes. Nothing changed and no email was sent: preview again.
\- 429 - { "detail": "..." } when a resubmit that only targets backend-only features (AML, DATABASE_VALIDATION, IP_ANALYSIS) repeats within 30 seconds of the previous resubmit. Those features re-run automatically with no user interaction, so an immediate repeat cannot change the outcome; honor the Retry-After header instead of retrying in a loop (e.g. from a webhook handler).

Idempotency:
Repeating "Approved" or "Declined" returns 200 and changes nothing. Repeating "Resubmitted" returns 400.

Next step:
After updating, call GET /v3/session/{session_id}/decision/ to fetch the refreshed payload — see /sessions-api/retrieve-session.

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Вставьте в

## Поддержка KYC и KYBЭтот эндпоинт работает одинаково для сессий **Проверка пользователей (KYC)** и **Верификация бизнеса (KYB)**. Didit сопоставляет `session_id` с сессиями обоих типов. Проверка переходов между статусами одинакова для обоих типов, потому что для них действует один и тот же набор статусов.Ответ содержит только `session_id`.
Если вашей последующей логике нужно разделять сессии по типу, считайте `session_kind` из [Получение сессии](https://docs.didit.me/ru/sessions-api/retrieve-session.md).## Допустимые переходыВы можете перевести сессию в статус `Approved`, `Declined` или `Resubmitted`.
Любое другое значение `new_status`, включая `In Review`, возвращает `400`.
Текущий статус сессии должен быть одним из следующих: `Approved`, `Declined`, `In Review`, `Kyc Expired`, `Abandoned` или `Resubmitted`. В противном случае API возвращает `400`.Установка статуса `Approved` или `Declined` для сессии, которая уже имеет этот статус, не выполняет никаких действий: API возвращает `200`, ничего не меняет, не вызывает webhook и не отправляет письмо.
Установка статуса `Resubmitted` для сессии, которая уже имеет статус `Resubmitted`, возвращает `400` (`The new status is the same as the current status.`).Повторная подача, в которой `nodes_to_resubmit` содержит только функции, работающие на бэкенде (`AML`, `DATABASE_VALIDATION`, `IP_ANALYSIS`), выполняется автоматически и возвращает сессию в статус с принятым решением без участия пользователя.
Повтор такой подачи в течение 30 секунд возвращает `429 Too Many Requests` с заголовком `Retry-After`, поскольку немедленный повтор не может дать другой результат.
Не запускайте повторную подачу автоматически из обработчика webhook каждый раз, когда получаете статус `In Review`. Сначала разберите результат или измените исходные данные.## Предварительный просмотр письмаЕсли указано `send_email: true`, для `Approved` и `Declined` человеку отправляется письмо с решением, а для `Resubmitted` отправляется новая ссылка с причинами.
Вы можете просмотреть это письмо до того, как что-либо изменить:1) Вызовите [Предварительный просмотр письма о решении](https://docs.didit.me/ru/sessions-api/preview-decision-email.md) для `Approved` или `Declined` либо [Предварительный просмотр письма о повторной подаче](https://docs.didit.me/ru/sessions-api/preview-resubmission.md) для `Resubmitted`.
2) Проверьте отрисованные `subject` и `html`, `recipient`, а также `will_be_sent` / `not_sent_reason`.
3) Вызовите этот эндпоинт с тем же `new_status` (а для повторной подачи также с тем же `nodes_to_resubmit`), `send_email: true`, значением `email_address`, равным `recipient`, значением `email_language`, которое вы предварительно просмотрели, и `email_preview_token`, равным `preview_token`.Ни один из предварительных просмотров не меняет сессию и ничего не отправляет.
Обновление отправляет именно то письмо, которое вы просмотрели.
Квитанция истекает через 15 минут.
Если получатель, язык, статус сессии, отправитель или письмо изменились после просмотра, обновление возвращает `409` до того, как что-либо изменится. Повторите предварительный просмотр и подтвердите действие с новой квитанцией.
Передача `email_preview_token` без `send_email: true` возвращает `400`.
Шаг предварительного просмотра необязателен: существующие интеграции могут продолжать вызывать этот эндпоинт без него.## Примеры> [tab] Одобрение сессии проверки пользователей (KYC)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/4c5c7f3a-.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "comment": "Cleared after manual review by compliance team"
>   }'
> ```> [tab] Отклонение сессии верификации бизнеса (KYB)
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/bs-01HJX1.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Declined",
>     "comment": "Sanctioned subsidiary detected in ownership chain"
>   }'
> ```> [tab] Запрос повторной подачи
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Resubmitted",
>     "nodes_to_resubmit": [
>       { "node_id": "feature_poa_1", "feature": "POA" }
>     ],
>     "comment": "Please upload a clearer proof of address",
>     "send_email": true,
>     "email_address": "user@example.com"
>   }'
> ```> [tab] Одобрение и отправка просмотренного письма
>
> ```bash theme={null}
> curl -X PATCH https://verification.didit.me/v3/session/.../update-status/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "new_status": "Approved",
>     "send_email": true,
>     "email_address": "user@example.com",
>     "email_language": "en",
>     "email_preview_token": "PREVIEW_TOKEN_FROM_THE_PREVIEW"
>   }'
> ```## РазрешениеТребуется привилегия `write:sessions`. Одна и та же привилегия действует для обоих типов сессий.## Связанные материалы- [Статусы верификации](https://docs.didit.me/ru/integration/verification-statuses.md): справочник по переходам между статусами.
- [Получение сессии](https://docs.didit.me/ru/sessions-api/retrieve-session.md): получите решение после обновления.
- [Обзор сессий](https://docs.didit.me/ru/sessions-api/overview.md): различение типов сессий.
- [Предварительный просмотр письма о решении](https://docs.didit.me/ru/sessions-api/preview-decision-email.md): просмотрите письмо об одобрении или отклонении до отправки.
- [Предварительный просмотр письма о повторной подаче](https://docs.didit.me/ru/sessions-api/preview-resubmission.md): просмотрите письмо о повторной подаче до отправки.


## OpenAPI

````yaml ru/openapi-25.json PATCH /v3/session/{sessionId}/update-status/
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}/update-status/:
    patch:
      tags:
        - Sessions
      summary: >-
        Одобрить, отклонить или запросить повторную отправку для сессии
        верификации
      description: >-
        Вручную переопределите итоговое решение по сессии верификации KYC или
        KYB. Установите для `new_status` значение `Approved` или `Declined`,
        чтобы зафиксировать ручное решение, либо `Resubmitted`, чтобы очистить
        определённые шаги верификации и позволить пользователю пройти их заново
        по тому же URL верификации. Этот endpoint принимает ID сессий как
        пользователей (KYC), так и компаний (KYB).


        Вызывайте его, когда сессия перешла в состояние, доступное для проверки:
        текущий статус должен быть `Approved`, `Declined`, `In Review`, `Kyc
        Expired`, `Abandoned` или `Resubmitted`. Сессии со статусами `Not
        Started`, `In Progress` или `Awaiting User`, а также завершённые со
        статусом `Expired`, возвращают ошибку `400`. Для вашего API-ключа
        требуется разрешение `write:sessions` (для API-ключа с ограниченной
        областью действия нужен доступ на запись к решениям). Проверка
        доступности состояния выполняется до валидации тела запроса, поэтому для
        сессии в неподходящем статусе возвращается ошибка `Wrong Current
        Status`, даже если payload также недействителен.


        Для `Resubmitted` передайте `nodes_to_resubmit`, чтобы выбрать, какие
        шаги сценария пользователь должен пройти заново, или опустите этот
        параметр, чтобы автоматически выбрать существующие попытки выполнения
        функций в статусе, доступном для повторной отправки (`Declined`, `In
        Review`, `Not Finished`, `Expired`). Функции, для которых ещё не
        предпринималась попытка, автоматически не выбираются: укажите их в
        `nodes_to_resubmit` явно, иначе запрос вернёт ошибку `400`, если ни одна
        зафиксированная попытка не требует повторной отправки. Предыдущие
        результаты выбранных шагов переносятся в историю повторной отправки
        (возвращается методом Get Decision с параметром
        `include=resubmissions`), порядок шагов перестраивается в соответствии с
        графом сценария, окно срока действия сессии перезапускается, а исходная
        ссылка на верификацию снова становится активной. Шаги, выполняемые
        исключительно на стороне бэкенда (`AML`, `DATABASE_VALIDATION`,
        `IP_ANALYSIS`) в начале списка, запускаются немедленно без участия
        пользователя; если все повторно отправленные шаги являются чисто
        бэкендовыми, сессия повторно финализируется в рамках того же запроса.
        Шаги `KYB_REGISTRY` и `KYB_KEY_PEOPLE` нельзя отправить на повторное
        прохождение напрямую: вместо этого отправьте повторно соответствующие
        дочерние сессии KYC, и родительская сессия компании пересчитается
        автоматически.


        Каждый вызов, изменяющий статус, отправляет
        [webhook](/ru/integration/webhooks) `status.updated` после фиксации
        изменения и добавляет запись об активности (с указанием автора действия
        и вашего `comment`) в список `reviews` сессии, который виден в [Get
        Decision](#get-/v3/session/-sessionId-/decision/) и в ленте активности в
        панели управления. Агрегированные данные профиля пользователя,
        привязанные к `vendor_data` сессии, также обновляются. Отклонение
        отключает постоянный AML-мониторинг для сессии; повторное одобрение
        снова включает его (из статусов `Resubmitted`, `Declined` или `Kyc
        Expired`), если в сценарии активирован мониторинг. Одобрение или
        отклонение дочерней сессии KYC, относящейся к проверке ключевых лиц KYB,
        приводит к пересчёту статуса родительской сессии компании. Установите
        `send_email: true` (вместе с `email_address`), чтобы уведомить
        пользователя: уведомление о статусе для `Approved`/`Declined` или
        электронное письмо о повторной отправке со ссылкой на верификацию и
        причинами по каждому шагу для `Resubmitted`. Чтобы предварительно
        проверить письмо, используйте предварительный просмотр с помощью
        [Preview Decision Email](/ru/sessions-api/preview-decision-email)
        (`Approved`, `Declined`) или [Preview Resubmission
        Email](/ru/sessions-api/preview-resubmission) (`Resubmitted`) и
        передайте полученный `preview_token` в качестве `email_preview_token`: в
        этом случае при обновлении будет отправлено именно просмотренное письмо
        либо вернётся ошибка `409` до внесения каких-либо изменений, если письмо
        или сессия изменились с момента предварительного просмотра или если
        квитанция старше 15 минут.


        Повторная установка статуса `Approved` или `Declined` для сессии, у
        которой уже установлен этот статус, ничего не меняет и возвращает ответ
        `200`: без отправки webhook, без добавления записи об активности и без
        отправки электронного письма. Повторная установка статуса `Resubmitted`
        возвращает ошибку `400` (`The new status is the same as the current
        status.`). Отсутствие или недействительность учетных данных, а также
        отсутствие необходимых разрешений возвращают `403`; истёкший API-ключ с
        ограниченной областью действия возвращает `401`.
      operationId: patch_v3_session_update_status
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID сессии верификации для обновления. Принимает ID сессий как
            пользователей (KYC), так и компаний (KYB) — сервис сопоставляет ID
            для обоих типов сессий.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - new_status
              properties:
                new_status:
                  type: string
                  description: >-
                    Целевой статус. `Approved` и `Declined` фиксируют
                    окончательное ручное решение (каждое из них также может
                    отменить другое). `Resubmitted` очищает выбранные шаги и
                    возвращает сессию пользователю. Любое другое значение
                    возвращает `400`.
                  enum:
                    - Approved
                    - Declined
                    - Resubmitted
                  example: Approved
                comment:
                  type: string
                  description: >-
                    Причина изменения в виде произвольного текста, сохраняемая в
                    журнале проверок сессии и возвращаемая в массиве `reviews`
                    ответа метода [Get
                    Decision](#get-/v3/session/-sessionId-/decision/). Например,
                    `Duplicated user`.
                  example: All checks passed manual review
                nodes_to_resubmit:
                  type: array
                  description: >-
                    Шаги сценария, которые пользователь должен повторить.
                    Обрабатываются только тогда, когда `new_status` имеет
                    значение `Resubmitted`. Для `Approved`/`Declined` записи всё
                    равно проходят валидацию по схеме (недопустимое значение
                    `feature` возвращает `400`), но корректные по схеме записи
                    семантически игнорируются. Если параметр опущен, сервер
                    автоматически выбирает существующие попытки OCR, Проверки
                    живости, Сравнения лиц, POA, Проверки телефона, Проверки
                    электронной почты, AML, Проверки по базам данных и Анкет со
                    статусом `Declined`, `In Review`, `Not Finished` или
                    `Expired` (попытки NFC, анализа IP, оценки возраста, поиска
                    по лицу и документов KYB никогда не выбираются
                    автоматически; попытки проверки лица, не относящиеся к
                    сравнению лиц, выбираются как `LIVENESS`) — функции, которые
                    пользователь ни разу не пытался выполнить (нет записанных
                    попыток), НЕ выбираются, поэтому сессия с нулём попыток
                    возвращает `400` ("No features found that need
                    resubmission"), даже если ничего не было одобрено; в этом
                    случае передайте `nodes_to_resubmit` явно. Шаги выполняются
                    в порядке графа сценария независимо от порядка, в котором вы
                    их передали. `KYB_REGISTRY`, `KYB_KEY_PEOPLE` и псевдоним
                    `KYB` отклоняются с кодом `400` — эти родительские проверки
                    пересчитываются из их дочерних KYC-сессий.
                  items:
                    type: object
                    required:
                      - node_id
                      - feature
                    properties:
                      node_id:
                        type: string
                        description: >-
                          Идентификатор узла в том виде, в каком он указан в
                          определении сценария сессии (например, `feature_ocr`,
                          `feature_liveness`).
                        example: feature_ocr
                      feature:
                        type: string
                        description: >-
                          Тип функции узла. Алиасы `ID_VERIFICATION`, `POA`,
                          `PHONE` и `EMAIL` нормализуются на стороне сервера в
                          `OCR`, `PROOF_OF_ADDRESS`, `PHONE_VERIFICATION` и
                          `EMAIL_VERIFICATION`. `KYB_REGISTRY`, `KYB_KEY_PEOPLE`
                          и `KYB` проходят валидацию схемы, но всегда
                          отклоняются с бизнес-ошибкой `400`, показанной в
                          примерах.
                        enum:
                          - OCR
                          - OCR_BACK
                          - NFC
                          - AML
                          - FACE
                          - LIVENESS
                          - FACE_MATCH
                          - IP_ANALYSIS
                          - AGE_ESTIMATION
                          - PROOF_OF_ADDRESS
                          - PHONE_VERIFICATION
                          - EMAIL_VERIFICATION
                          - FACE_SEARCH
                          - DATABASE_VALIDATION
                          - QUESTIONNAIRE
                          - DOCUMENT_AI
                          - KYB_DOCUMENTS
                          - ID_VERIFICATION
                          - POA
                          - PHONE
                          - EMAIL
                          - KYB_REGISTRY
                          - KYB_KEY_PEOPLE
                          - KYB
                          - GEOLOCATION
                        example: OCR
                send_email:
                  type: boolean
                  description: >-
                    Отправлять ли пользователю электронное письмо об изменении.
                    Требует `email_address`. При `Approved`/`Declined`
                    пользователь получает уведомление о статусе; при
                    `Resubmitted` письмо содержит ссылку на верификацию и
                    причины повторной отправки для каждого шага.
                  default: false
                  example: false
                email_address:
                  type: string
                  format: email
                  description: >-
                    Получатель уведомления по электронной почте. **Обязательно,
                    если `send_email` имеет значение `true`** — если опустить,
                    возвращается `400`.
                  example: user@example.com
                email_language:
                  type: string
                  description: >-
                    Язык для письма с уведомлением. На уровне схемы принимается
                    любая строка; для неподдерживаемых кодов без уведомления
                    используется английский (`en`).
                  default: en
                  example: en
                email_preview_token:
                  type: string
                  writeOnly: true
                  minLength: 1
                  maxLength: 512
                  description: >-
                    Необязательное подтверждение из запроса [Предпросмотр email
                    с решением](/ru/sessions-api/preview-decision-email) (для
                    `Approved` и `Declined`) или [Предпросмотр email для
                    повторной отправки](/ru/sessions-api/preview-resubmission)
                    (для `Resubmitted`): его `preview_token`. Действительно
                    только при `send_email: true`; без этого запрос возвращает
                    `400`. Получатель, язык, статус сессии, отправитель и email
                    (а для повторной отправки также выбранные шаги) должны
                    по-прежнему совпадать с предпросмотром, а срок действия
                    подтверждения истекает через 15 минут. В противном случае
                    запрос возвращает `409` до изменения сессии или отправки
                    email. Существующие интеграции могут опустить это поле.
            examples:
              Approve Session:
                summary: Одобрить сессию после ручной проверки
                value:
                  new_status: Approved
                  comment: All checks passed manual review
              Decline Session:
                summary: Отклонить сессию
                value:
                  new_status: Declined
                  comment: Suspected fraud
              Resubmit Specific Steps:
                summary: >-
                  Запросить повторную отправку выбранных шагов с отправкой
                  письма
                value:
                  new_status: Resubmitted
                  nodes_to_resubmit:
                    - node_id: feature_ocr
                      feature: OCR
                    - node_id: feature_liveness
                      feature: LIVENESS
                  send_email: true
                  email_address: user@example.com
                  email_language: en
              Resubmit Auto-select:
                summary: Запросить повторную отправку (автовыбор неодобренных шагов)
                value:
                  new_status: Resubmitted
              Approve With Previewed Email:
                summary: >-
                  Одобрить и отправить электронное письмо, полученное из
                  предварительного просмотра письма с решением
                value:
                  new_status: Approved
                  send_email: true
                  email_address: person@example.com
                  email_language: en
                  email_preview_token: >-
                    eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
      responses:
        '200':
          description: >-
            Статус обновлен. Ответ содержит только `session_id`; получите
            обновленную сессию через [Get
            Decision](#get-/v3/session/-sessionId-/decision/). Webhook
            `status.updated` срабатывает после фиксации изменения. Повторная
            отправка `Approved` или `Declined` возвращает то же тело ответа и
            ничего не меняет.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: UUID обновлённой сессии.
              examples:
                Updated:
                  summary: Возвращается одинаково для Approved, Declined и Resubmitted
                  value:
                    session_id: 3472fb7c-8f7c-4d1a-9cf4-cf3d74ce1a60
        '400':
          description: >-
            Ошибка валидации. Ошибки полей возвращаются в виде `{"<field>":
            ["<message>"]}` (в некоторых случаях отклонения по бизнес-правилам
            вместо этого используется строковое значение: `{"nodes_to_resubmit":
            "<message>"}`), ошибки перехода между состояниями возвращаются в
            виде `{"detail": "<message>"}`, а ошибка совпадения статуса в виде
            простого JSON-массива.
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: Сессия не находится в состоянии, доступном для обновления
                  value:
                    detail: >-
                      Only sessions with status Approved, Declined, In Review,
                      Kyc Expired, Abandoned, Resubmitted can be updated.
                      Current status: In Progress
                Invalid Status Value:
                  summary: >-
                    new_status является допустимым статусом сессии, но не одним
                    из Approved/Declined/Resubmitted
                  value:
                    new_status:
                      - >-
                        You can only update the status to 'Approved',
                        'Declined', or 'Resubmitted'.
                Missing new_status:
                  summary: Обязательное поле не указано
                  value:
                    new_status:
                      - This field is required.
                Same Status:
                  summary: >-
                    Повторная отправка запрошена для сессии, которая уже
                    находится в статусе Resubmitted
                  value:
                    - The new status is the same as the current status.
                Email Address Required:
                  summary: send_email имеет значение true без email_address
                  value:
                    email_address:
                      - Email address is required when send_email is true.
                Non-resubmittable Feature:
                  summary: Повторная отправка направлена на родительскую проверку KYB
                  value:
                    nodes_to_resubmit: >-
                      The following features cannot be resubmitted directly:
                      KYB_REGISTRY. Resubmit the relevant child KYC sessions
                      instead; the parent will recompute automatically.
                Nothing To Resubmit:
                  summary: Автовыбор не нашел неодобренных функций
                  value:
                    nodes_to_resubmit: >-
                      No features found that need resubmission. All features are
                      already approved.
                Invalid Feature Choice:
                  summary: Неизвестная функция в nodes_to_resubmit
                  value:
                    nodes_to_resubmit:
                      - feature:
                          - >-
                            "BOGUS" is not a valid choice. Valid choices are:
                            OCR, OCR_BACK, NFC, AML, FACE, LIVENESS, FACE_MATCH,
                            IP_ANALYSIS, AGE_ESTIMATION, PROOF_OF_ADDRESS,
                            PHONE_VERIFICATION, EMAIL_VERIFICATION, FACE_SEARCH,
                            DATABASE_VALIDATION, QUESTIONNAIRE, KYB_REGISTRY,
                            KYB_DOCUMENTS, KYB_KEY_PEOPLE, ID_VERIFICATION, POA,
                            PHONE, EMAIL, KYB
                Invalid Status Value (not a status at all):
                  summary: new_status не является допустимым значением StatusChoices
                  value:
                    new_status:
                      - '"Bogus" is not a valid choice.'
                Preview Receipt Without Email:
                  summary: 'email_preview_token отправлен без send_email: true'
                  value:
                    email_preview_token:
                      - A preview receipt is only valid when the email is sent.
        '401':
          description: Срок действия API-ключа с ограниченной областью действия истёк.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: >-
                    API-ключ с ограниченной областью действия с истёкшим сроком
                    действия
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Отсутствуют учетные данные, недостаточно разрешений или передан
            `session_id`, принадлежащий другому приложению.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: Отсутствует или недействителен x-api-key
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: У API-ключа отсутствует разрешение write:sessions
                  value:
                    detail: You do not have permission to perform this action.
        '404':
          description: >-
            Сессия KYC или KYB с таким `session_id` не существует (для удалённых
            сессий также возвращается `404`).
          content:
            application/json:
              examples:
                Not Found:
                  summary: Неизвестный session_id
                  value:
                    detail: Not found.
        '409':
          description: >-
            Предварительный просмотр письма изменился или истёк. Сформируйте
            новый предварительный просмотр перед подтверждением; изменения
            сессии или доставка писем не выполняются.
          content:
            application/json:
              examples:
                Preview Changed:
                  summary: Квитанция больше не совпадает или старше 15 минут
                  value:
                    detail: >-
                      This email preview changed or expired. Preview the message
                      again before confirming.
        '429':
          description: >-
            Повторная отправка, затрагивающая только бэкенд-функции (AML,
            DATABASE_VALIDATION, IP_ANALYSIS), была выполнена в течение
            30-секундного периода ожидания; немедленный повтор не может изменить
            результат. Подождите и повторите попытку через интервал, указанный в
            `Retry-After`.
          content:
            application/json:
              examples:
                Backend-only resubmit throttled:
                  value:
                    detail: >-
                      This session was already resubmitted for backend-only
                      features within the last 30 seconds; repeating it cannot
                      change the outcome. Wait before resubmitting again.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X PATCH \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/update-status/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "new_status": "Approved",
                "comment": "All checks passed manual review"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.update_status(
                "11111111-2222-3333-4444-555555555555",
                new_status="Approved",
                comment="All checks passed manual review",
            )
            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.updateStatus("11111111-2222-3333-4444-555555555555",
            {
              new_status: "Approved",
              comment: "All checks passed manual review",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.UpdateStatus(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsUpdateStatusParams{\n\tNewStatus: \"Approved\",\n\tComment:   didit.String(\"All checks passed manual review\"),\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.SessionsUpdateStatusParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().updateStatus("11111111-2222-3333-4444-555555555555",
            SessionsUpdateStatusParams.builder()
                    .newStatus(SessionsUpdateStatusParams.NewStatus.of("Approved"))
                    .comment("All checks passed manual review")
                    .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->updateStatus('11111111-2222-3333-4444-555555555555',
            [
                'new_status' => 'Approved',
                'comment' => 'All checks passed manual review',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.sessions.update_status(
              "11111111-2222-3333-4444-555555555555",
              new_status: "Approved",
              comment: "All checks passed manual review"
            )
            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.UpdateStatusAsync("11111111-2222-3333-4444-555555555555",
            new SessionsUpdateStatusParams

            {
                NewStatus = "Approved",
                Comment = "All checks passed manual review",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  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.