> ## 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 об одобрении или отклонении, которое получает человек: получатель, отправитель и язык, до смены статуса сессии.



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



      
      

\<pre>

\`Preview the Approved or Declined email a Didit session sends the person, then confirm the decision so exactly that email goes out.

Endpoint:
POST https://verification.didit.me/v3/session/{session_id}/decision-email-preview/

Authentication:
x-api-key (client API key) or a user-auth token. Privilege: write:sessions. A scoped API key needs write access to decisions.

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

Request body:
\- new_status (string, required): "Approved" or "Declined".
\- email_language (string, optional, default "en"): language of the email. A language that is not offered falls back to English.

The session's current status must be one of: Approved, Declined, In Review, Kyc Expired, Abandoned, Resubmitted.

Previewing changes nothing and sends nothing.

Response (200, Cache-Control: no-store):
\- recipient: the person's own address (the one they verified in the flow, else the one in contact_details). Empty string when none is known.
\- recipient_source: "email_verification", "contact_details", or "" when there is no address.
\- sender, sender_name, sender_email: the From header and its parts.
\- sender_kind: "customer" (your verified sender domain) or "didit" (Didit's sender).
\- subject, html: the email exactly as sent. Render html in a sandboxed frame.
\- language: the language actually used.
\- will_be_sent (boolean) and not_sent_reason: null, "status_unchanged", "notification_emails_disabled", "no_recipient" or "sandbox".
\- preview_token: receipt for this exact email, valid 15 minutes. Empty when there is no recipient.

Confirm with PATCH https://verification.didit.me/v3/session/{session_id}/update-status/:
\{
"new_status": "<same new_status>",
"send_email": true,
"email_address": "<recipient>",
"email_language": "<language>",
"email_preview_token": "<preview_token>"
}
If the recipient, language, session status, sender or email changed since the preview, or the receipt is older than 15 minutes, update-status returns 409 { "detail": "This email preview changed or expired. Preview the message again before confirming." } and changes nothing. Preview again and confirm with the new receipt.

curl example:
curl -X POST https://verification.didit.me/v3/session/<SESSION_ID>/decision-email-preview/ \
-H "x-api-key: <API_KEY>" \
-H "Content-Type: application/json" \
-d '{ "new_status": "Approved", "email_language": "en" }'

Failure modes:
\- 400: the session is not in an accepted status ({ "detail": "Only sessions with status ... can be updated. Current status: ..." }), or new_status is missing or invalid.
\- 401: the scoped API key has expired.
\- 403: missing credentials (a wrong, revoked or expired key gets 401), the caller lacks write:sessions, a scoped key lacks decisions write, or the session belongs to another application ({ "detail": "You do not have permission to perform this action." }).
\- 404: { "detail": "Not found." } when no session with this session_id exists.

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

\</pre>



      
      

Вставьте в

Предпросмотр ничего не меняет и ничего не отправляет.
Ответ показывает письмо так, как его получит человек, когда вы устанавливаете для сессии статус `Approved` или `Declined` с `send_email: true`.
Он также сообщает, кто получит письмо, от кого оно придёт и отправится ли оно при подтверждении.## Кто получает письмоПисьмо отправляется на собственный адрес человека: тот, который он верифицировал на шаге проверки электронной почты в сценарии, а если такой адрес отсутствует, то адрес из `contact_details`, указанный при создании сессии.
`recipient_source` показывает, какой из них применяется (`email_verification` или `contact_details`).
Если у сессии нет адреса для этого человека, поля `recipient`, `recipient_source` и `preview_token` содержат пустые строки, и письмо отправить нельзя.Письмо отправляется с проверенного домена отправителя вашего приложения, если применяется ваша [конфигурация White label](https://docs.didit.me/ru/console/white-label.md) (`sender_kind: customer`). В остальных случаях оно отправляется от имени Didit (`sender_kind: didit`).## Отправляется ли письмо`will_be_sent` равно `true`, если при подтверждении изменения с `send_email: true` письмо действительно отправляется.
Если оно равно `false`, `not_sent_reason` объясняет причину:| `not_sent_reason` | Что это значит |
| - | - |
| `status_unchanged` | У сессии уже есть этот статус, поэтому обновление ничего не меняет и ничего не отправляет. |
| `notification_emails_disabled` | Сессия создана без `contact_details.send_notification_emails: true`, поэтому письмо с решением на адрес из `contact_details` не отправляется. |
| `no_recipient` | Адрес этого человека неизвестен. |
| `sandbox` | Это сессия песочницы, и получатель не дал согласие на доставку писем в песочнице, поэтому письмо только имитируется. См. [согласие на получение писем](https://docs.didit.me/ru/integration/sandbox-testing.md#códigos-otp-y-suscripción-al-envío-de-correos). |## Подтвердите решениеВызовите [Update Session Status](https://docs.didit.me/ru/sessions-api/update-status.md) с этими полями:| Поле Update Session Status | Значение |
| - | - |
| `new_status` | Тот же `new_status`, который вы просмотрели в предпросмотре |
| `send_email` | `true` |
| `email_address` | `recipient` из предпросмотра |
| `email_language` | `language` из предпросмотра |
| `email_preview_token` | `preview_token` из предпросмотра |Квитанция предпросмотра истекает через 15 минут.
Если с момента предпросмотра изменились получатель, язык, статус сессии, отправитель или письмо, обновление возвращает `409` до того, как что-либо изменится.
Выполните предпросмотр снова и подтвердите решение с новой квитанцией.## Связанные материалы- [Update Session Status](https://docs.didit.me/ru/sessions-api/update-status.md): одобрить или отклонить сессию и отправить письмо.
- [Preview Resubmission Email](https://docs.didit.me/ru/sessions-api/preview-resubmission.md): вместо этого просмотреть письмо о повторной подаче документов.
- [White label](https://docs.didit.me/ru/console/white-label.md): отправитель и брендинг, которые использует письмо.


## OpenAPI

````yaml ru/openapi-25.json POST /v3/session/{sessionId}/decision-email-preview/
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}/decision-email-preview/:
    post:
      tags:
        - Sessions
      summary: Предварительный просмотр письма с решением по сессии
      description: >-
        Сформировать email, который пользователь получит при установке для
        сессии статуса `Approved` или `Declined` с параметром `send_email:
        true`, без изменения сессии и без фактической отправки. Ответ содержит
        тему и HTML в точности в том виде, в каком они отправляются, получателя,
        отправителя, язык, а также флаг, будет ли email отправлен вообще при
        подтверждении изменения (`will_be_sent`, `not_sent_reason`).


        Получателем является собственный адрес пользователя: тот, который он
        подтвердил на шаге проверки электронной почты в сценарии, либо адрес,
        указанный в `contact_details` при создании сессии. Отправителем
        выступает подтверждённый домен отправителя вашего приложения, если
        применяется White label (`sender_kind: customer`), иначе отправитель
        Didit (`sender_kind: didit`).


        Чтобы отправить именно то, что было в предпросмотре, вызовите [Update
        Session Status](/ru/sessions-api/update-status) с тем же `new_status`,
        `send_email: true`, `email_address`, установленным в `recipient`,
        `email_language`, установленным в `language`, и `email_preview_token`,
        установленным в `preview_token`. Срок действия квитанции истекает через
        15 минут. Если получатель, язык, статус сессии, отправитель или email
        изменились с момента предпросмотра, обновление вернёт ошибку `409` до
        внесения каких-либо изменений; выполните предпросмотр заново и
        подтвердите действие с новой квитанцией.


        Работает для сессий Проверки пользователей (KYC) и Верификации бизнеса
        (KYB) в статусах `Approved`, `Declined`, `In Review`, `Kyc Expired`,
        `Abandoned` или `Resubmitted`. Проверка статуса выполняется до валидации
        тела запроса. Требуется разрешение `write:sessions`; API-ключу с
        ограниченной областью действия требуется доступ на запись к решениям.
        Ответы используют заголовок `Cache-Control: no-store`: относитесь к ним
        как к конфиденциальным данным верификации.
      operationId: post_v3_session_decision_email_preview
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID сессии верификации. Принимает ID сессий как пользователей
            (KYC), так и компаний (KYB).
          schema:
            type: string
            format: uuid
            example: 3fa85f64-5717-4562-b3fc-2c963f66afa6
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - new_status
              properties:
                new_status:
                  type: string
                  enum:
                    - Approved
                    - Declined
                  description: >-
                    Решение, электронное письмо по которому вы хотите
                    предварительно просмотреть.
                  example: Approved
                email_language:
                  type: string
                  default: en
                  description: >-
                    Язык письма, то же значение по умолчанию, что и у Update
                    Session Status. Если язык недоступен, используется
                    английский; поле `language` в ответе указывает, какой именно
                    был применён.
                  example: en
            examples:
              Approved:
                summary: Предварительный просмотр письма «Одобрено» на английском языке
                value:
                  new_status: Approved
              Declined in Spanish:
                summary: Предварительный просмотр письма «Отклонено» на испанском языке
                value:
                  new_status: Declined
                  email_language: es
      responses:
        '200':
          description: >-
            Только предварительный просмотр. Сессия остаётся без изменений,
            письмо не отправляется.
          headers:
            Cache-Control:
              description: >-
                Всегда `no-store`: предпросмотр содержит данные верификации и не
                должен кэшироваться.
              schema:
                type: string
                example: no-store
          content:
            application/json:
              schema:
                type: object
                required:
                  - recipient
                  - recipient_source
                  - sender
                  - sender_name
                  - sender_email
                  - sender_kind
                  - subject
                  - html
                  - text
                  - language
                  - will_be_sent
                  - not_sent_reason
                  - preview_token
                properties:
                  recipient:
                    type: string
                    description: >-
                      Адрес, на который отправляется электронное письмо. Пустая
                      строка, если адрес человека неизвестен: в этом случае
                      письмо отправить нельзя, и `preview_token` также пуст.
                      Передайте его как `email_address` при подтверждении.
                    example: person@example.com
                  recipient_source:
                    type: string
                    enum:
                      - email_verification
                      - contact_details
                      - ''
                    description: >-
                      Источник значения `recipient`. `email_verification`:
                      адрес, подтвержденный пользователем на шаге проверки
                      электронной почты сценария. `contact_details`: адрес,
                      указанный в `contact_details` при создании сессии. Пустая
                      строка, если адрес отсутствует.
                    example: email_verification
                  sender:
                    type: string
                    description: >-
                      Заголовок `From`, с которым отправляется электронное
                      письмо.
                    example: Example App <no-reply@mail.example.com>
                  sender_name:
                    type: string
                    description: Отображаемая часть имени в `sender`.
                    example: Example App
                  sender_email:
                    type: string
                    format: email
                    description: Часть адреса `sender`.
                    example: no-reply@mail.example.com
                  sender_kind:
                    type: string
                    enum:
                      - customer
                      - didit
                    description: >-
                      `customer`: письмо отправляется с подтверждённого домена
                      отправителя вашего приложения (White label). `didit`:
                      отправляется с собственного отправителя Didit.
                    example: customer
                  subject:
                    type: string
                    description: Тема письма в точности так, как она отправляется.
                    example: Your verification has been approved in Example App
                  html:
                    type: string
                    description: >-
                      HTML письма точно в том виде, в котором оно отправляется,
                      со встроенным логотипом в формате data URL. Отображайте
                      его в изолированном фрейме (sandbox), ни в коем случае не
                      напрямую в DOM вашего приложения.
                    example: <!DOCTYPE html><html><body>...</body></html>
                  text:
                    type: string
                    description: >-
                      Текст письма в виде обычного текста, как он хранится в
                      цепочке сообщений пользователя, для компактного
                      предварительного просмотра (в качестве получаемого письма
                      остаётся HTML).
                    example: >-
                      Verification Approved


                      Your identity has been successfully verified with Acme
                      Pay. No further action is needed on your part.
                  language:
                    type: string
                    description: >-
                      Язык, на котором составлено письмо. Английский (`en`),
                      если запрошенный `email_language` недоступен.
                    example: en
                  will_be_sent:
                    type: boolean
                    description: >-
                      Отправляет ли подтверждение изменения с помощью
                      `send_email: true` это электронное письмо. Значение
                      `false`, если задан `not_sent_reason`.
                    example: true
                  not_sent_reason:
                    type: string
                    nullable: true
                    enum:
                      - status_unchanged
                      - notification_emails_disabled
                      - no_recipient
                      - sandbox
                      - null
                    description: >-
                      Причина, по которой подтверждение не приведёт к отправке
                      электронного письма, или `null`, если оно будет
                      отправлено. `status_unchanged`: у сессии уже установлен
                      этот статус, поэтому обновление ничего не меняет и ничего
                      не отправляет. `notification_emails_disabled`: сессия была
                      создана без `contact_details.send_notification_emails:
                      true`, поэтому электронное письмо с решением не
                      отправляется на адрес, указанный в `contact_details`.
                      `no_recipient`: адрес этого человека неизвестен.
                      `sandbox`: сессия в песочнице, получатель которой не дал
                      согласие на доставку электронных писем в песочнице,
                      поэтому отправка только имитируется.
                    example: null
                  preview_token:
                    type: string
                    description: >-
                      Подписанная квитанция для этого конкретного письма,
                      действующая в течение 15 минут. Передайте ее как
                      `email_preview_token` в [Обновить статус
                      сессии](/ru/sessions-api/update-status). Пустая строка,
                      если получатель отсутствует.
                    example: >-
                      eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
              examples:
                Will Be Sent:
                  summary: >-
                    Письмо об одобрении отправляется на адрес, подтверждённый в
                    сценарии
                  value:
                    recipient: person@example.com
                    recipient_source: email_verification
                    sender: Example App <no-reply@mail.example.com>
                    sender_name: Example App
                    sender_email: no-reply@mail.example.com
                    sender_kind: customer
                    subject: Your verification has been approved in Example App
                    html: <!DOCTYPE html><html><body>...</body></html>
                    language: en
                    will_be_sent: true
                    not_sent_reason: null
                    preview_token: >-
                      eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
                No Recipient:
                  summary: Адрес для этого лица неизвестен
                  value:
                    recipient: ''
                    recipient_source: ''
                    sender: Example App <no-reply@mail.example.com>
                    sender_name: Example App
                    sender_email: no-reply@mail.example.com
                    sender_kind: customer
                    subject: Your verification has been declined in Example App
                    html: <!DOCTYPE html><html><body>...</body></html>
                    language: en
                    will_be_sent: false
                    not_sent_reason: no_recipient
                    preview_token: ''
        '400':
          description: >-
            Сессия не находится в статусе, который принимает этот endpoint
            (`{"detail": ...}`), либо тело запроса недействительно (`{"<field>":
            ["<message>"]}`).
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: Сессия не находится в статусе, допустимом для этого endpoint
                  value:
                    detail: >-
                      Only sessions with status Approved, Declined, In Review,
                      Kyc Expired, Abandoned, Resubmitted can be updated.
                      Current status: In Progress
                Invalid new_status:
                  summary: new_status не равен Approved или Declined
                  value:
                    new_status:
                      - '"Resubmitted" is not a valid choice.'
                Missing new_status:
                  summary: Обязательное поле не указано
                  value:
                    new_status:
                      - This field is required.
        '401':
          description: Срок действия API-ключа с ограниченной областью действия истёк.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: >-
                    API-ключ с ограниченной областью действия с истёкшим сроком
                    действия
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Отсутствуют учетные данные, у вызывающей стороны нет привилегии
            `write:sessions`, у API-ключа с ограниченной областью видимости нет
            необходимого для этого endpoint доступа, либо передан `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: У вызывающей стороны отсутствует разрешение write:sessions
                  value:
                    detail: You do not have permission to perform this action.
                Scoped Key Without Access:
                  summary: >-
                    API-ключ с ограниченной областью действия без данного
                    доступа
                  value:
                    detail: This API key has no write access to decisions.
        '404':
          description: Сессия KYC или KYB с таким `session_id` не существует.
          content:
            application/json:
              examples:
                Not Found:
                  summary: Неизвестный session_id
                  value:
                    detail: Not found.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST \
              https://verification.didit.me/v3/session/3fa85f64-5717-4562-b3fc-2c963f66afa6/decision-email-preview/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"new_status": "Approved", "email_language": "en"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.preview_decision_email(
                "3fa85f64-5717-4562-b3fc-2c963f66afa6",
                new_status="Approved",
            )
            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.previewDecisionEmail("3fa85f64-5717-4562-b3fc-2c963f66afa6",
            {
              new_status: "Approved",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.PreviewDecisionEmail(ctx, \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", didit.SessionsPreviewDecisionEmailParams{\n\tNewStatus: \"Approved\",\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.SessionsPreviewDecisionEmailParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().previewDecisionEmail("3fa85f64-5717-4562-b3fc-2c963f66afa6",
            SessionsPreviewDecisionEmailParams.builder()
                    .newStatus(SessionsPreviewDecisionEmailParams.NewStatus.of("Approved"))
                    .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->previewDecisionEmail('3fa85f64-5717-4562-b3fc-2c963f66afa6',
            [
                'new_status' => 'Approved',
            ]);

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

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

            result = didit.sessions.preview_decision_email(
              "3fa85f64-5717-4562-b3fc-2c963f66afa6",
              new_status: "Approved"
            )
            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.PreviewDecisionEmailAsync("3fa85f64-5717-4562-b3fc-2c963f66afa6",
            new SessionsPreviewDecisionEmailParams

            {
                NewStatus = "Approved",
            });

            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.