> ## 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.

# Vista previa del email de decisión: aprobado y rechazado

> Didit te muestra el email de aprobado o rechazado que recibe la persona, con destinatario, remitente e idioma, antes de cambiar el estado de la sesión.



Prompt para previsualizar el correo de decisión
        Copiar el prompt al portapapeles



      
      

\<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>



      
      

Pegar en

La previsualización no cambia nada ni envía nada.
La respuesta muestra el correo exactamente como lo recibe la persona cuando cambias la sesión a `Approved` o `Declined` con `send_email: true`.
También te indica quién lo recibe, quién lo envía y si al confirmar se envía realmente.## Quién recibe el correoEl correo se envía a la dirección de correo electrónico de la propia persona: la que verificó en un paso de verificación de correo electrónico del flujo o, en su defecto, la indicada en `contact_details` al crear la sesión.
`recipient_source` indica cuál de las dos se aplica (`email_verification` o `contact_details`).
Cuando la sesión no tiene ninguna dirección de correo electrónico de la persona, `recipient`, `recipient_source` y `preview_token` son cadenas vacías y no se puede enviar ningún correo.El correo sale del dominio de remitente verificado de tu aplicación cuando se aplica tu [configuración de marca blanca](https://docs.didit.me/es/console/white-label.md) (`sender_kind: customer`) y, en caso contrario, del remitente de Didit (`sender_kind: didit`).## Si el correo se envía`will_be_sent` es `true` cuando al confirmar el cambio con `send_email: true` se envía el correo.
Cuando es `false`, `not_sent_reason` indica el motivo:| `not_sent_reason` | Qué significa |
| - | - |
| `status_unchanged` | La sesión ya tiene este estado, así que la actualización no cambia nada ni envía nada. |
| `notification_emails_disabled` | La sesión se creó sin `contact_details.send_notification_emails: true`, así que no se envía ningún correo de decisión a la dirección indicada en `contact_details`. |
| `no_recipient` | No se conoce ninguna dirección de la persona. |
| `sandbox` | La sesión es una sesión de sandbox y el destinatario no ha aceptado recibir correos en sandbox, así que el correo solo se simula. Consulta [aceptación para recibir correos](https://docs.didit.me/es/integration/sandbox-testing.md#códigos-otp-y-activación-de-correos-electrónicos). |## Confirmar la decisiónInvoca [Update Session Status](https://docs.didit.me/es/sessions-api/update-status.md) con estos campos:| Campo de Update Session Status | Valor |
| - | - |
| `new_status` | El mismo `new_status` que previsualizaste |
| `send_email` | `true` |
| `email_address` | `recipient` de la previsualización |
| `email_language` | `language` de la previsualización |
| `email_preview_token` | `preview_token` de la previsualización |El comprobante caduca a los 15 minutos.
Si el destinatario, el idioma, el estado de la sesión, el remitente o el correo cambiaron desde la previsualización, la actualización devuelve `409` antes de que cambie nada.
Vuelve a previsualizar y confirma con el nuevo comprobante.## Relacionado- [Update Session Status](https://docs.didit.me/es/sessions-api/update-status.md): aprueba o rechaza la sesión y envía el correo.
- [Preview Resubmission Email](https://docs.didit.me/es/sessions-api/preview-resubmission.md): previsualiza el correo para un reenvío.
- [Marca blanca](https://docs.didit.me/es/console/white-label.md): el remitente y la imagen de marca que usa el correo.


## OpenAPI

````yaml es/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 de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/decision-email-preview/:
    post:
      tags:
        - Sessions
      summary: Vista previa del correo electrónico de decisión de una sesión
      description: >-
        Genera el correo electrónico que recibe la persona cuando cambias una
        sesión a `Approved` o `Declined` con `send_email: true`, sin modificar
        la sesión ni enviar nada. La respuesta muestra el asunto y el HTML
        exactamente como se envían, el destinatario, el remitente, el idioma y
        si al confirmar el cambio se envía o no el correo (`will_be_sent`,
        `not_sent_reason`).


        El destinatario es la dirección de la propia persona: la que verificó en
        un paso de verificación de correo electrónico del flujo o, si no la hay,
        la indicada en `contact_details` al crear la sesión. El remitente es el
        dominio de remitente verificado de tu aplicación cuando se aplica marca
        blanca (`sender_kind: customer`) o, en caso contrario, el remitente de
        Didit (`sender_kind: didit`).


        Para enviar exactamente lo que has previsualizado, llama a [Actualizar
        el estado de la sesión](/es/sessions-api/update-status) con el mismo
        `new_status`, `send_email: true`, `email_address` con el valor de
        `recipient`, `email_language` con el valor de `language` y
        `email_preview_token` con el valor de `preview_token`. El comprobante
        expira a los 15 minutos. Si el destinatario, el idioma, el estado de la
        sesión, el remitente o el correo han cambiado desde la vista previa, la
        actualización devuelve `409` antes de que cambie nada; vuelve a generar
        la vista previa y confirma con el nuevo comprobante.


        Funciona con sesiones de Verificación de usuarios (KYC) y Verificación
        de empresas (KYB) en estado `Approved`, `Declined`, `In Review`, `Kyc
        Expired`, `Abandoned` o `Resubmitted`. La comprobación del estado se
        ejecuta antes de validar el cuerpo. Requiere el privilegio
        `write:sessions`; una clave de API con alcance limitado necesita acceso
        de escritura a las decisiones. Las respuestas usan `Cache-Control:
        no-store`: trátalas como contenido de verificación sensible.
      operationId: post_v3_session_decision_email_preview
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID de la sesión de verificación. Acepta ID de sesión tanto de
            usuario (KYC) como de empresa (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: La decisión cuyo correo electrónico quieres previsualizar.
                  example: Approved
                email_language:
                  type: string
                  default: en
                  description: >-
                    Idioma del correo electrónico, con el mismo valor
                    predeterminado que Update Session Status. Un idioma que no
                    se ofrece pasa a inglés; `language` en la respuesta indica
                    cuál se usa.
                  example: en
            examples:
              Approved:
                summary: Vista previa del correo electrónico de aprobación en inglés
                value:
                  new_status: Approved
              Declined in Spanish:
                summary: Vista previa del correo electrónico de rechazo en español
                value:
                  new_status: Declined
                  email_language: es
      responses:
        '200':
          description: >-
            Solo vista previa. La sesión no cambia y no se envía ningún correo
            electrónico.
          headers:
            Cache-Control:
              description: >-
                Siempre `no-store`: la vista previa contiene contenido de
                verificación y no debe almacenarse en caché.
              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: >-
                      La dirección a la que va el correo electrónico. Es una
                      cadena vacía cuando no se conoce ninguna dirección de la
                      persona: en ese caso no se puede enviar ningún correo y
                      `preview_token` también está vacío. Pásala como
                      `email_address` al confirmar.
                    example: person@example.com
                  recipient_source:
                    type: string
                    enum:
                      - email_verification
                      - contact_details
                      - ''
                    description: >-
                      De dónde procede `recipient`. `email_verification`: la
                      dirección que la persona verificó en un paso de
                      verificación de correo electrónico del flujo.
                      `contact_details`: la dirección indicada en
                      `contact_details` al crear la sesión. Una cadena vacía
                      cuando no hay dirección.
                    example: email_verification
                  sender:
                    type: string
                    description: >-
                      El encabezado `From` con el que se envía el correo
                      electrónico.
                    example: Example App <no-reply@mail.example.com>
                  sender_name:
                    type: string
                    description: La parte del nombre visible de `sender`.
                    example: Example App
                  sender_email:
                    type: string
                    format: email
                    description: La parte de dirección de `sender`.
                    example: no-reply@mail.example.com
                  sender_kind:
                    type: string
                    enum:
                      - customer
                      - didit
                    description: >-
                      `customer`: el correo electrónico se envía desde el
                      dominio de remitente verificado de tu aplicación (marca
                      blanca). `didit`: se envía desde el remitente propio de
                      Didit.
                    example: customer
                  subject:
                    type: string
                    description: La línea de asunto exactamente como se envía.
                    example: Your verification has been approved in Example App
                  html:
                    type: string
                    description: >-
                      El HTML del correo electrónico exactamente como se envía,
                      con su logotipo incrustado como data URL. Renderízalo en
                      un frame aislado (sandbox), nunca directamente en el DOM
                      de tu aplicación.
                    example: <!DOCTYPE html><html><body>...</body></html>
                  text:
                    type: string
                    description: >-
                      El texto del correo electrónico en texto plano, tal como
                      lo conserva el hilo de Mensajes de la persona, para una
                      vista previa compacta (el HTML sigue siendo el correo
                      electrónico que recibe la persona).
                    example: >-
                      Verification Approved


                      Your identity has been successfully verified with Acme
                      Pay. No further action is needed on your part.
                  language:
                    type: string
                    description: >-
                      El idioma en el que está escrito el correo. Inglés (`en`)
                      cuando el `email_language` que pediste no está disponible.
                    example: en
                  will_be_sent:
                    type: boolean
                    description: >-
                      Indica si confirmar el cambio con `send_email: true` envía
                      este correo electrónico. `false` cuando `not_sent_reason`
                      está definido.
                    example: true
                  not_sent_reason:
                    type: string
                    nullable: true
                    enum:
                      - status_unchanged
                      - notification_emails_disabled
                      - no_recipient
                      - sandbox
                      - null
                    description: >-
                      Por qué la confirmación no enviaría ningún correo
                      electrónico, o `null` cuando se enviará.
                      `status_unchanged`: la sesión ya tiene este estado, así
                      que la actualización no cambia nada y no envía nada.
                      `notification_emails_disabled`: la sesión se creó sin
                      `contact_details.send_notification_emails: true`, así que
                      no se envía ningún correo de decisión a la dirección
                      indicada en `contact_details`. `no_recipient`: no se
                      conoce ninguna dirección de la persona. `sandbox`: una
                      sesión de sandbox cuyo destinatario no ha aceptado la
                      entrega de correos en sandbox, así que el envío solo se
                      simula.
                    example: null
                  preview_token:
                    type: string
                    description: >-
                      Recibo firmado para este correo electrónico exacto, válido
                      durante 15 minutos. Pásalo como `email_preview_token` a
                      [Actualizar el estado de la
                      sesión](/es/sessions-api/update-status). Una cadena vacía
                      cuando no hay destinatario.
                    example: >-
                      eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
              examples:
                Will Be Sent:
                  summary: >-
                    El correo electrónico de Aprobado se envía a la dirección
                    verificada en el flujo
                  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: No se conoce ninguna dirección de la persona
                  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: >-
            La sesión no está en un estado que este endpoint acepte (`{"detail":
            ...}`), o el cuerpo no es válido (`{"<field>": ["<message>"]}`).
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: La sesión no está en un estado que este endpoint acepte
                  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 no es Approved ni Declined
                  value:
                    new_status:
                      - '"Resubmitted" is not a valid choice.'
                Missing new_status:
                  summary: Campo obligatorio omitido
                  value:
                    new_status:
                      - This field is required.
        '401':
          description: La clave de API con alcance limitado ha expirado.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: >-
                    Clave de API con alcance limitado con la fecha de caducidad
                    vencida
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Faltan las credenciales, quien llama no tiene el privilegio
            `write:sessions`, una clave de API con alcance limitado no tiene el
            acceso que necesita este endpoint, o el `session_id` pertenece a
            otra aplicación.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: x-api-key ausente o no válido
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: El autor de la llamada no tiene write:sessions
                  value:
                    detail: You do not have permission to perform this action.
                Scoped Key Without Access:
                  summary: Clave de API con alcance limitado sin este acceso
                  value:
                    detail: This API key has no write access to decisions.
        '404':
          description: No existe ninguna sesión KYC o KYB con este `session_id`.
          content:
            application/json:
              examples:
                Not Found:
                  summary: session_id desconocido
                  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: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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