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

# Pratinjau Email Keputusan API: Disetujui dan Ditolak

> Lihat email Disetujui atau Ditolak yang diterima pengguna, lengkap dengan penerima, pengirim, dan bahasanya, sebelum Anda mengubah status sesi di Didit.



Prompt Pratinjau Email Keputusan
        Salin prompt ke papan klip



      
      

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



      
      

Tempel ke

Pratinjau tidak mengubah apa pun dan tidak mengirim apa pun.
Respons menampilkan email persis seperti yang diterima orang tersebut saat Anda mengatur sesi ke `Approved` atau `Declined` dengan `send_email: true`.
Respons juga memberi tahu Anda siapa yang menerimanya, dari siapa email tersebut berasal, dan apakah konfirmasi benar-benar mengirimkannya.## Siapa yang menerima emailEmail dikirim ke alamat milik orang tersebut sendiri: alamat yang ia verifikasi pada langkah Verifikasi Email dalam alur, atau jika tidak ada, alamat yang diberikan di `contact_details` saat sesi dibuat.
`recipient_source` menunjukkan alamat mana yang berlaku (`email_verification` atau `contact_details`).
Jika sesi tidak memiliki alamat untuk orang tersebut, `recipient`, `recipient_source` dan `preview_token` berisi string kosong, dan email tidak dapat dikirim.Email dikirim dari domain pengirim aplikasi Anda yang terverifikasi jika [konfigurasi White Label](https://docs.didit.me/id/console/white-label.md) Anda berlaku (`sender_kind: customer`), jika tidak, email dikirim dari pengirim Didit (`sender_kind: didit`).## Apakah email dikirim`will_be_sent` bernilai `true` jika konfirmasi perubahan dengan `send_email: true` mengirim email.
Jika bernilai `false`, `not_sent_reason` menjelaskan alasannya:| `not_sent_reason` | Artinya |
| - | - |
| `status_unchanged` | Sesi sudah memiliki status ini, sehingga pembaruan tidak mengubah apa pun dan tidak mengirim apa pun. |
| `notification_emails_disabled` | Sesi dibuat tanpa `contact_details.send_notification_emails: true`, sehingga tidak ada email keputusan yang dikirim ke alamat di `contact_details`. |
| `no_recipient` | Tidak ada alamat yang diketahui untuk orang tersebut. |
| `sandbox` | Sesi adalah sesi sandbox dan penerima belum memilih untuk menerima pengiriman email sandbox, sehingga email hanya disimulasikan. Lihat [opt-in email](https://docs.didit.me/id/integration/sandbox-testing.md#kode-otp-dan-opt-in-email). |## Konfirmasi keputusanPanggil [Update Session Status](https://docs.didit.me/id/sessions-api/update-status.md) dengan kolom berikut:| Kolom Update Session Status | Nilai |
| - | - |
| `new_status` | `new_status` yang sama dengan yang Anda pratinjau |
| `send_email` | `true` |
| `email_address` | `recipient` dari pratinjau |
| `email_language` | `language` dari pratinjau |
| `email_preview_token` | `preview_token` dari pratinjau |Tanda terima berlaku selama 15 menit.
Jika penerima, bahasa, status sesi, pengirim, atau email berubah sejak pratinjau, pembaruan mengembalikan `409` sebelum ada yang berubah.
Lakukan pratinjau lagi dan konfirmasi dengan tanda terima yang baru.## Terkait- [Update Session Status](https://docs.didit.me/id/sessions-api/update-status.md): menyetujui atau menolak sesi dan mengirim email.
- [Preview Resubmission Email](https://docs.didit.me/id/sessions-api/preview-resubmission.md): pratinjau email untuk pengajuan ulang sebagai gantinya.
- [White Label](https://docs.didit.me/id/console/white-label.md): pengirim dan branding yang digunakan email.


## OpenAPI

````yaml id/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 Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/decision-email-preview/:
    post:
      tags:
        - Sessions
      summary: Pratinjau email keputusan sesi
      description: >-
        Render email yang diterima seseorang saat Anda menetapkan sesi ke
        `Approved` atau `Declined` dengan `send_email: true`, tanpa mengubah
        sesi atau mengirimkan apa pun. Respons menampilkan subjek dan HTML
        persis seperti yang dikirimkan, penerima, pengirim, bahasa, dan apakah
        mengonfirmasi perubahan akan mengirimkan email sama sekali
        (`will_be_sent`, `not_sent_reason`).


        Penerima adalah alamat orang itu sendiri: alamat yang mereka verifikasi
        dalam langkah verifikasi email pada alur, atau alamat yang diberikan di
        `contact_details` saat sesi dibuat. Pengirim adalah domain pengirim
        terverifikasi aplikasi Anda jika White Label berlaku (`sender_kind:
        customer`), jika tidak, pengirim Didit (`sender_kind: didit`).


        Untuk mengirimkan persis apa yang Anda pratinjau, panggil [Update
        Session Status](/id/sessions-api/update-status) dengan `new_status` yang
        sama, `send_email: true`, `email_address` disetel ke `recipient`,
        `email_language` disetel ke `language`, dan `email_preview_token`
        disetel ke `preview_token`. Tanda terima kedaluwarsa setelah 15 menit.
        Jika penerima, bahasa, status sesi, pengirim, atau email berubah sejak
        pratinjau, pembaruan akan mengembalikan `409` sebelum ada yang berubah;
        lakukan pratinjau lagi dan konfirmasikan dengan tanda terima baru.


        Berfungsi untuk sesi Verifikasi Pengguna (KYC) dan Verifikasi Bisnis
        (KYB) dalam status `Approved`, `Declined`, `In Review`, `Kyc Expired`,
        `Abandoned`, atau `Resubmitted`. Pemeriksaan status berjalan sebelum
        validasi isi. Memerlukan hak istimewa `write:sessions`; kunci API dengan
        cakupan memerlukan akses tulis ke keputusan. Respons menggunakan
        `Cache-Control: no-store`: perlakukan sebagai konten verifikasi
        sensitif.
      operationId: post_v3_session_decision_email_preview
      parameters:
        - in: path
          name: sessionId
          required: true
          description: >-
            UUID sesi verifikasi. Menerima ID sesi pengguna (KYC) dan bisnis
            (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: Keputusan yang email-nya ingin Anda pratinjau.
                  example: Approved
                email_language:
                  type: string
                  default: en
                  description: >-
                    Bahasa email, default yang sama dengan Perbarui Status Sesi.
                    Bahasa yang tidak ditawarkan beralih ke bahasa Inggris;
                    `language` dalam respons menunjukkan bahasa mana yang
                    digunakan.
                  example: en
            examples:
              Approved:
                summary: Pratinjau email Disetujui dalam bahasa Inggris
                value:
                  new_status: Approved
              Declined in Spanish:
                summary: Pratinjau email Ditolak dalam bahasa Spanyol
                value:
                  new_status: Declined
                  email_language: es
      responses:
        '200':
          description: >-
            Hanya pratinjau. Sesi tidak berubah dan tidak ada email yang
            dikirim.
          headers:
            Cache-Control:
              description: >-
                Selalu `no-store`: pratinjau memuat konten verifikasi dan tidak
                boleh disimpan dalam cache.
              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: >-
                      Alamat tujuan pengiriman email. String kosong jika tidak
                      ada alamat yang diketahui untuk orang tersebut: maka tidak
                      ada email yang dapat dikirim dan `preview_token` juga
                      kosong. Teruskan sebagai `email_address` saat Anda
                      mengonfirmasi.
                    example: person@example.com
                  recipient_source:
                    type: string
                    enum:
                      - email_verification
                      - contact_details
                      - ''
                    description: >-
                      Dari mana asal `recipient`. `email_verification`: alamat
                      yang diverifikasi orang tersebut dalam langkah verifikasi
                      email pada alur. `contact_details`: alamat yang diberikan
                      dalam `contact_details` saat sesi dibuat. Berupa string
                      kosong jika tidak ada alamat.
                    example: email_verification
                  sender:
                    type: string
                    description: Header `From` yang digunakan untuk mengirim email.
                    example: Example App <no-reply@mail.example.com>
                  sender_name:
                    type: string
                    description: Bagian nama tampilan dari `sender`.
                    example: Example App
                  sender_email:
                    type: string
                    format: email
                    description: Bagian alamat dari `sender`.
                    example: no-reply@mail.example.com
                  sender_kind:
                    type: string
                    enum:
                      - customer
                      - didit
                    description: >-
                      `customer`: email dikirim dari domain pengirim
                      terverifikasi aplikasi Anda (White Label). `didit`: email
                      dikirim dari pengirim Didit sendiri.
                    example: customer
                  subject:
                    type: string
                    description: Baris subjek persis seperti yang dikirimkan.
                    example: Your verification has been approved in Example App
                  html:
                    type: string
                    description: >-
                      HTML email persis seperti yang dikirim, dengan logonya
                      disematkan sebagai URL data. Render dalam frame sandbox,
                      jangan pernah langsung di DOM aplikasi Anda.
                    example: <!DOCTYPE html><html><body>...</body></html>
                  text:
                    type: string
                    description: >-
                      Kata-kata email sebagai teks biasa, sebagaimana disimpan
                      dalam utas Pesan orang tersebut, untuk pratinjau ringkas
                      (HTML tetap berupa email yang diterima orang tersebut).
                    example: >-
                      Verification Approved


                      Your identity has been successfully verified with Acme
                      Pay. No further action is needed on your part.
                  language:
                    type: string
                    description: >-
                      Bahasa penulisan email. Bahasa Inggris (`en`) saat
                      `email_language` yang Anda minta tidak tersedia.
                    example: en
                  will_be_sent:
                    type: boolean
                    description: >-
                      Menentukan apakah mengonfirmasi perubahan dengan
                      `send_email: true` mengirimkan email ini. `false` jika
                      `not_sent_reason` diatur.
                    example: true
                  not_sent_reason:
                    type: string
                    nullable: true
                    enum:
                      - status_unchanged
                      - notification_emails_disabled
                      - no_recipient
                      - sandbox
                      - null
                    description: >-
                      Alasan mengapa konfirmasi tidak akan mengirim email, atau
                      `null` jika akan dikirim. `status_unchanged`: sesi sudah
                      memiliki status ini, sehingga pembaruan tidak mengubah apa
                      pun dan tidak mengirim apa pun.
                      `notification_emails_disabled`: sesi dibuat tanpa
                      `contact_details.send_notification_emails: true`, sehingga
                      tidak ada email keputusan yang dikirim ke alamat yang
                      diberikan di `contact_details`. `no_recipient`: tidak ada
                      alamat yang diketahui untuk pengguna tersebut. `sandbox`:
                      sesi sandbox yang penerimanya belum menyetujui pengiriman
                      email sandbox, sehingga pengiriman hanya disimulasikan.
                    example: null
                  preview_token:
                    type: string
                    description: >-
                      Tanda terima yang ditandatangani untuk email persis ini,
                      valid selama 15 menit. Teruskan sebagai
                      `email_preview_token` ke [Perbarui Status
                      Sesi](/id/sessions-api/update-status). String kosong jika
                      tidak ada penerima.
                    example: >-
                      eyJkaWdlc3QiOiI0ZjJhIn0:1uExAm:Pl3x4mpleS1gnatureValue000000000000000
              examples:
                Will Be Sent:
                  summary: >-
                    Email Disetujui dikirim ke alamat yang diverifikasi dalam
                    alur
                  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: Tidak ada alamat yang diketahui untuk orang tersebut
                  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: >-
            Sesi tidak berada dalam status yang diterima endpoint ini
            (`{"detail": ...}`), atau isi permintaan tidak valid (`{"<field>":
            ["<message>"]}`).
          content:
            application/json:
              examples:
                Wrong Current Status:
                  summary: >-
                    Sesi tidak berada dalam status yang diterima oleh endpoint
                    ini
                  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 bukan Approved atau Declined
                  value:
                    new_status:
                      - '"Resubmitted" is not a valid choice.'
                Missing new_status:
                  summary: Kolom wajib tidak disertakan
                  value:
                    new_status:
                      - This field is required.
        '401':
          description: Kunci API dengan cakupan terbatas telah kedaluwarsa.
          content:
            application/json:
              examples:
                Expired API Key:
                  summary: Kunci API ber-scope melewati tanggal kedaluwarsanya
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Kredensial tidak ada, pemanggil tanpa hak istimewa `write:sessions`,
            kunci API dengan pembatasan cakupan tanpa akses yang dibutuhkan
            endpoint ini, atau `session_id` milik aplikasi lain.
          content:
            application/json:
              examples:
                Invalid Credentials:
                  summary: x-api-key tidak ada atau tidak valid
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Missing Privilege:
                  summary: Pemanggil tidak memiliki izin write:sessions
                  value:
                    detail: You do not have permission to perform this action.
                Scoped Key Without Access:
                  summary: Kunci API ber-scope tanpa akses ini
                  value:
                    detail: This API key has no write access to decisions.
        '404':
          description: Tidak ada sesi KYC atau KYB dengan `session_id` ini.
          content:
            application/json:
              examples:
                Not Found:
                  summary: session_id tidak dikenal
                  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: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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