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

# Status Verifikasi Didit: Siklus Hidup Sesi & Kode

> Status sesi Didit dijelaskan: Disetujui, Ditolak, Dalam Peninjauan, Kedaluwarsa, Ditinggalkan, KYC Kedaluwarsa. Keputusan, coba lagi, dan webhook.

Setiap sesi verifikasi melewati serangkaian status. Memahami status-status ini membantu Anda memantau kemajuan pengguna, mengotomatiskan keputusan kepatuhan, dan mengoptimalkan konversi.

Enum ini adalah satu-satunya sumber kebenaran untuk string yang dikembalikan oleh `GET /v3/session/<id>/decision/` dan setiap webhook Didit.

***

## Semua Nilai Status

> [!NOTE]
>
> Setiap status adalah **string persis** yang dikembalikan oleh API dan webhook Didit. Selalu gunakan pencocokan string yang ketat (misalnya `=== "In Review"`) dalam kode Anda, karena nilai-nilai ini peka terhadap huruf besar-kecil dan mengandung spasi. Nilai `Kyc Expired` juga menggunakan huruf kapital `K` tunggal (bukan `KYC`).

| Status | Nilai String | Deskripsi |
| - | - | - |
| Belum Dimulai | `"Not Started"` | Sesi dibuat, pengguna belum membuka tautan |
| Sedang Berlangsung | `"In Progress"` | Pengguna sedang menyelesaikan verifikasi |
| Disetujui | `"Approved"` | Semua pemeriksaan lolos, identitas terverifikasi |
| Ditolak | `"Declined"` | Satu atau lebih pemeriksaan gagal |
| Dalam Peninjauan | `"In Review"` | Ditandai untuk peninjauan manual kepatuhan |
| Menunggu Pengguna | `"Awaiting User"` | Menunggu satu atau lebih pihak menyelesaikan verifikasi mereka (KYB) |
| Diajukan Ulang | `"Resubmitted"` | Pengguna diminta mengulangi langkah tertentu |
| Kedaluwarsa | `"Expired"` | Sesi kedaluwarsa sebelum pengguna membuka tautan |
| Ditinggalkan | `"Abandoned"` | Pengguna memulai tetapi tidak menyelesaikan tepat waktu |
| KYC Kedaluwarsa | `"Kyc Expired"` | Sesi yang sebelumnya disetujui, dengan dokumen terverifikasi yang telah melewati tanggal kedaluwarsanya |

***

## Status Sesi

> [accordion] Belum Dimulai: "Not Started"
>
> **Nilai API:** `"Not Started"`
>
> Sesi telah dibuat melalui API, tetapi pengguna **belum membuka tautan verifikasi**.
>
> * **Yang perlu dilakukan:** Tunggu hingga pengguna memulai, atau kirim pengingat jika waktu berlalu terlalu lama.
> * **Beralih ke:** `"In Progress"`, `"Expired"`

> [accordion] Sedang Berlangsung: "In Progress"
>
> **Nilai API:** `"In Progress"`
>
> Pengguna telah membuka tautan dan **sedang menyelesaikan langkah verifikasi** secara aktif (pengambilan dokumen, liveness, dan lainnya).
>
> * **Yang perlu dilakukan:** Tidak ada tindakan yang diperlukan, pengguna sedang menjalani alur.
> * **Beralih ke:** `"Approved"`, `"Declined"`, `"In Review"`, `"Abandoned"`

> [accordion] Disetujui: "Approved"
>
> **Nilai API:** `"Approved"`
>
> Semua pemeriksaan verifikasi **lulus**. Identitas pengguna telah diverifikasi.
>
> * **Yang perlu dilakukan:** Berikan akses kepada pengguna, perbarui profilnya, dan simpan data keputusan.
> * **Webhook menyertakan:** Objek `decision` lengkap dengan semua hasil fitur.
> * **Beralih ke:** `"Kyc Expired"` (secara default saat tanggal kedaluwarsa dokumen yang diverifikasi terlewati, kecuali **Expiration mode** untuk negara dan jenis dokumen tersebut diatur ke **Allow expired**). Peninjau atau endpoint update-status juga dapat mengatur status ini ke `"Declined"` atau `"Resubmitted"`.

> [accordion] Ditolak: "Declined"
>
> **Nilai API:** `"Declined"`
>
> Satu atau lebih pemeriksaan verifikasi **gagal**. Pengguna tidak lolos verifikasi.
>
> * **Yang perlu dilakukan:** Beri tahu pengguna. Jika masalahnya dapat diperbaiki, Anda dapat meminta pengajuan ulang.
> * **Webhook menyertakan:** Objek `decision` lengkap dengan peringatan yang menjelaskan kegagalan tersebut.
> * **Beralih ke:** `"Resubmitted"` (jika peninjau memintanya). Peninjau atau endpoint update-status juga dapat mengatur status ini ke `"Approved"`.

> [accordion] Dalam Peninjauan: "In Review"
>
> **Nilai API:** `"In Review"`
>
> Pemeriksaan otomatis menandai **peringatan yang memerlukan peninjauan manusia**. Peninjau kepatuhan harus membuat keputusan akhir.
>
> * **Yang perlu dilakukan:** Peninjau sebaiknya membuka sesi di Console dan menyetujui, menolak, atau meminta pengajuan ulang.
> * **Webhook menyertakan:** Objek `decision` lengkap dengan peringatan.
> * **Beralih ke:** `"Approved"`, `"Declined"`, `"Resubmitted"`

> [accordion] Menunggu Pengguna: "Awaiting User"
>
> **Nilai API:** `"Awaiting User"`
>
> Digunakan dalam **sesi KYB (verifikasi bisnis)** saat langkah Pihak Kunci telah mengirimkan daftar pihak dan membuat sesi KYC / KYB turunan. Sesi induk menunggu hingga **semua pihak yang diperlukan menyelesaikan verifikasi individual mereka**.
>
> * **Yang perlu dilakukan:** Pantau status sesi KYC turunan. Setelah semua pihak yang diperlukan selesai (disetujui, ditolak, atau kedaluwarsa), sesi induk secara otomatis mengagregasi ulang ke status akhirnya.
> * **Webhook menyertakan:** Daftar pihak saat ini beserta status sesi turunannya.
> * **Beralih ke:** `"Approved"`, `"Declined"`, `"In Review"` (setelah semua sesi turunan berstatus terminal)
> * **Beralih dari:** `"In Progress"` (setelah langkah Pihak Kunci dikirim)
> * **Catatan:** Jika sesi KYC turunan diajukan ulang, sesi induk kembali ke `"Awaiting User"` hingga sesi yang diajukan ulang tersebut selesai. Pemeriksaan Registri KYB yang berstatus `"Declined"` lebih diutamakan daripada `"Awaiting User"`.

> [accordion] Diajukan Ulang: "Resubmitted"
>
> **Nilai API:** `"Resubmitted"`
>
> Peninjau telah meminta pengguna **mengulangi langkah verifikasi tertentu** (misalnya, mengambil ulang foto dokumen yang buram).
>
> * **Yang perlu dilakukan:** Tunggu hingga pengguna menyelesaikan langkah yang diajukan ulang. Sistem akan mengevaluasi ulang secara otomatis.
> * **Webhook menyertakan:** Objek `resubmit_info` dengan daftar fitur yang harus diulang beserta alasannya.
> * **Beralih ke:** `"Approved"`, `"Declined"`, `"In Review"`, atau `"Abandoned"` jika jendela sesi berakhir sebelum pengguna mengulangi langkahnya.

> [accordion] Kedaluwarsa: "Expired"
>
> **Nilai API:** `"Expired"`
>
> Sesi melewati batas waktu sebelum pengguna membuka tautan verifikasi.
>
> * **Yang perlu dilakukan:** Buat sesi baru dan kirim tautan baru kepada pengguna.
> * **Status terminal:** tidak ada transisi lebih lanjut.

> [accordion] Ditinggalkan: "Abandoned"
>
> **Nilai API:** `"Abandoned"`
>
> Pengguna **memulai tetapi tidak menyelesaikan** verifikasi dalam batas waktu yang diizinkan.
>
> * **Yang perlu dilakukan:** Kirim pengingat atau buat sesi baru.
> * **Tidak ada transisi otomatis.** Peninjau, atau `PATCH /v3/session/{sessionId}/update-status/`, tetap dapat mengatur status ini ke `"Approved"`, `"Declined"`, atau `"Resubmitted"`.

> [accordion] KYC Kedaluwarsa: "Kyc Expired"
>
> **Nilai API:** `"Kyc Expired"`
>
> Dokumen yang diverifikasi selama sesi telah **melewati tanggal kedaluwarsanya sendiri**. Pemicunya adalah tanggal tersebut, bukan jangka waktu yang dihitung dari persetujuan, dan tidak ada peringatan yang dikirim sebelumnya.
>
> * **Yang perlu dilakukan:** Minta pengguna untuk memverifikasi ulang dengan sesi baru. `status.updated` mengirimkan transisi ini, dan hasil verifikasi identitas memuat peringatan `DOCUMENT_EXPIRED`.
> * **Dikendalikan oleh:** **Expiration mode** untuk negara dan jenis dokumen tersebut di *ID verification → Additional settings by country & document type*. **Reject expired** (default) memantau dokumen, sedangkan **Allow expired** berarti sesi tidak pernah berpindah ke status ini.
> * **Tidak ada transisi otomatis.** Peninjau, atau `PATCH /v3/session/{sessionId}/update-status/`, tetap dapat mengatur status ini ke `"Approved"`, `"Declined"`, atau `"Resubmitted"`.

***

## Transisi Status

| Dari | Ke | Pemicu |
| - | - | - |
| `"Not Started"` | `"In Progress"` | Pengguna membuka tautan verifikasi |
| `"Not Started"` | `"Expired"` | TTL sesi habis sebelum pengguna membuka tautan |
| `"In Progress"` | `"Approved"` | Semua pemeriksaan otomatis lolos |
| `"In Progress"` | `"Declined"` | Satu atau lebih pemeriksaan gagal |
| `"In Progress"` | `"In Review"` | Pemeriksaan menandai peringatan yang memerlukan peninjauan manual |
| `"In Progress"` | `"Awaiting User"` | Langkah Pihak Kunci KYB dikirim; induk menunggu pihak KYC anak |
| `"In Progress"` | `"Abandoned"` | Pengguna tidak menyelesaikan dalam jangka waktu yang ditentukan |
| `"Awaiting User"` | `"Approved"` | Semua pihak KYB yang diwajibkan selesai dan pemeriksaan gabungan lolos |
| `"Awaiting User"` | `"Declined"` | Pihak yang diwajibkan ditolak atau pemeriksaan registri KYB gagal |
| `"Awaiting User"` | `"In Review"` | Hasil KYB gabungan memerlukan peninjauan manual |
| `"In Review"` | `"Approved"` | Peninjau menyetujui secara manual |
| `"In Review"` | `"Declined"` | Peninjau menolak secara manual |
| `"In Review"` | `"Resubmitted"` | Peninjau meminta langkah tertentu diulang |
| `"Declined"` | `"Resubmitted"` | Peninjau meminta langkah tertentu diulang |
| `"Approved"` | `"Resubmitted"` | Peninjau meminta langkah tertentu diulang |
| `"Approved"` | `"Declined"` | Peninjau atau API menetapkan keputusan lain |
| `"Declined"` | `"Approved"` | Peninjau atau API menetapkan keputusan lain |
| `"Abandoned"`, `"Kyc Expired"` | `"Approved"`, `"Declined"`, `"Resubmitted"` | Peninjau atau API memutuskan sesi yang berakhir tanpa keputusan |
| `"Resubmitted"` | `"Abandoned"` | Jendela sesi berakhir sebelum orang tersebut mengulang langkah |
| `"Resubmitted"` | `"Approved"` | Langkah yang diajukan ulang lolos semua pemeriksaan |
| `"Resubmitted"` | `"Declined"` | Langkah yang diajukan ulang gagal |
| `"Resubmitted"` | `"In Review"` | Langkah yang diajukan ulang menandai peringatan baru |
| `"Resubmitted"` (anak KYB) | `"Awaiting User"` (induk KYB) | Induk kembali ke status menunggu sampai anak selesai |
| `"Approved"` | `"Kyc Expired"` | Tanggal kedaluwarsa dokumen terverifikasi terlewat (mode Kedaluwarsa adalah **Reject expired**) |

### Diagram siklus hidup

```mermaid theme={null}
flowchart LR
    NS["Not Started"] --> IP["In Progress"]
    NS --> EX["Expired"]
    IP --> AP["Approved"]
    IP --> DC["Declined"]
    IP --> IR["In Review"]
    IP --> AU["Awaiting User<br/>(KYB only)"]
    IP --> AB["Abandoned"]
    AU --> AP
    AU --> DC
    AU --> IR
    IR --> AP
    IR --> DC
    IR --> RS["Resubmitted"]
    DC --> RS
    AP --> RS
    AP <--> DC
    AB --> AP
    AB --> DC
    AB --> RS
    KE --> AP
    KE --> DC
    KE --> RS
    RS --> AB
    RS --> AP
    RS --> DC
    RS --> IR
    AP --> KE["Kyc Expired"]
```

***

## Terminal dan Non-Terminal

| Kategori | Status | Arti |
| - | - | - |
| **Diputuskan** | `"Approved"`, `"Declined"`, `"Kyc Expired"` | Pemeriksaan menghasilkan keputusan dan tidak ada yang mengubahnya dengan sendirinya, kecuali `"Approved"` → `"Kyc Expired"` ketika tanggal kedaluwarsa dokumen terverifikasi terlewat. Peninjau atau endpoint pembaruan status tetap dapat mengubah keputusan. |
| **Non-Terminal** | `"Not Started"`, `"In Progress"`, `"Resubmitted"`, `"Awaiting User"` | Masih aktif: menunggu tindakan pengguna, sesi anak, atau pemrosesan. |
| **Dapat ditindaklanjuti** | `"In Review"` | Memerlukan intervensi manual dari tim Anda. |
| **Tidak aktif** | `"Expired"`, `"Abandoned"` | Berakhir tanpa keputusan verifikasi. `"Expired"` tidak pernah berubah; peninjau masih dapat memutuskan sesi `"Abandoned"`. |

***

## Menangani Status dalam Kode Anda

Gunakan webhook atau [Retrieve Session API](https://docs.didit.me/id/sessions-api/retrieve-session.md) untuk merespons perubahan status.

> [!WARNING]
>
> Status adalah **string yang persis, peka huruf besar/kecil, dan mengandung spasi**. Misalnya, `"In Review"` (bukan `"in_review"` atau `"IN_REVIEW"`). Selalu gunakan kesamaan ketat (`===`) saat mencocokkan.

```javascript theme={null}
// All ten possible status string values (StatusChoices, source of truth):
// "Not Started"  | "In Progress" | "Approved"     | "Declined" |
// "In Review"    | "Resubmitted" | "Awaiting User"|
// "Expired"      | "Abandoned"   | "Kyc Expired"

async function handleWebhook(webhook) {
  const { status, vendor_data: vendorData } = webhook;

  switch (status) {
    case "Not Started":
      // Session created but user hasn't opened the link yet
      break;

    case "In Progress":
      // User is actively completing verification steps
      break;

    case "Approved":
      // All checks passed — grant access
      await db.users.update(vendorData, {
        verified: true,
        verifiedAt: new Date(),
        decision: webhook.decision,
      });
      break;

    case "Declined":
      // Verification failed — notify user
      await db.users.update(vendorData, {
        verificationStatus: "declined",
        declineReasons: webhook.decision?.warnings,
      });
      break;

    case "In Review":
      // Needs manual review by compliance team
      await db.users.update(vendorData, {
        verificationStatus: "pending_review",
      });
      break;

    case "Awaiting User":
      // KYB parent waiting for all child KYC parties to finish
      await db.users.update(vendorData, {
        verificationStatus: "awaiting_kyb_parties",
      });
      break;

    case "Resubmitted":
      // User will redo specific steps
      await db.users.update(vendorData, {
        verificationStatus: "resubmission_pending",
        resubmitInfo: webhook.resubmit_info,
      });
      break;

    case "Abandoned":
      // User started but didn't finish — send reminder
      await sendReminderEmail(vendorData);
      break;

    case "Expired":
    case "Kyc Expired":
      // Session expired — create a new one
      await createNewSession(vendorData);
      break;
  }
}
```

***

## Pengajuan Ulang

Status **Resubmitted** memungkinkan tim kepatuhan Anda memberi pengguna kesempatan kedua tanpa membuat sesi baru.

**1. Peninjau memulai pengajuan ulang**

Dari Console, buka sesi `In Review` atau `Declined` lalu klik **Minta Pengajuan Ulang**. Pilih langkah mana yang perlu diulang.

**2. Data sebelumnya diarsipkan**

Sistem mereset fitur yang dipilih dan menandai data sebelumnya sebagai `previous_attempt`, sehingga jejak audit lengkap tetap tersimpan.

**3. Pengguna diberi tahu**

Jika email tersedia, pengguna menerima email yang telah dilokalkan dengan tautan langsung untuk melanjutkan.

**4. Pengguna mengulang langkah tertentu**

Pengguna hanya mengulang langkah yang ditandai, bukan seluruh verifikasi.

**5. Sistem mengevaluasi ulang**

Setelah selesai, sesi otomatis beralih ke `"Approved"`, `"Declined"`, atau `"In Review"`.

### Payload Webhook Pengajuan Ulang

```json theme={null}
{
  "session_id": "uuid-of-the-session",
  "status": "Resubmitted",
  "resubmit_info": {
    "nodes_to_resubmit": [
      { "node_id": "feature_ocr", "feature": "OCR" },
      { "node_id": "feature_liveness", "feature": "LIVENESS" }
    ],
    "reasons": {
      "feature_ocr": "DOCUMENT_EXPIRED",
      "feature_liveness": "LOW_LIVENESS_SCORE"
    }
  }
}
```

`reasons` memetakan setiap `node_id` yang diajukan ulang ke kode peringatan dari log paling relevan pada langkah tersebut (kode yang sama dengan yang dilaporkan oleh [keputusan](https://docs.didit.me/id/reference/data-models.md)), sehingga Anda dapat memetakannya ke teks Anda sendiri. Kode ini juga yang dilokalkan untuk pengguna oleh layar pengajuan ulang pada alur yang di-hosting dan oleh email pengajuan ulang, kecuali untuk peringatan yang dapat mengungkap sinyal skrining atau penipuan (duplikat, AML, daftar blokir, pemeriksaan lintas organisasi, integritas lokasi, dan sejenisnya). Untuk peringatan tersebut, pengguna hanya melihat alasan umum, dan `resubmit_info.reasons` di webhook Anda selalu berisi kode yang sebenarnya. Langkah tanpa peringatan yang tercatat tidak memiliki entri.

### Fitur Mana yang Dapat Diajukan Ulang?

Fitur apa pun dengan status yang belum disetujui: **Declined**, **In Review**, **Not Finished**, **Not Started**, atau **Expired**.

> [!TIP]
>
> Anda dapat meminta pengajuan ulang berkali-kali pada sesi yang sama. Setiap siklus mengarsipkan data percobaan sebelumnya, sehingga Anda memiliki visibilitas penuh atas riwayat verifikasi pengguna.

***

## Praktik Terbaik

> [card] Pantau Dalam Peninjauan
>
> Atur alert (email atau Slack) di Didit Console Anda agar Anda diberi tahu saat sesi memerlukan peninjauan manual.

> [card] Utamakan Pengajuan Ulang
>
> Jika masalahnya dapat diperbaiki (foto buram, sisi dokumen yang salah), minta pengajuan ulang alih-alih menolak. Cara ini meningkatkan tingkat konversi.

> [card] Pantau Drop-off
>
> Tingkat sesi yang Ditinggalkan atau Kedaluwarsa yang tinggi dapat menandakan hambatan UX. Pertimbangkan untuk menyesuaikan TTL sesi atau meningkatkan panduan bagi pengguna.

> [card] Penanganan Idempoten
>
> Webhook dapat dikirim ulang. Gunakan `session_id` sebagai kunci unik untuk memastikan Anda memproses setiap perubahan status hanya sekali.

> [!WARNING]
>
> Selalu verifikasi tanda tangan webhook sebelum memproses payload. Didit menyediakan tiga metode: `X-Signature`, `X-Signature-V2` (direkomendasikan), dan `X-Signature-Simple` yang sudah usang, yang hanya mengautentikasi amplop dan tidak pernah mengautentikasi isi `decision`. Lihat [Webhooks](https://docs.didit.me/id/integration/webhooks.md#verifikasi-tanda-tangan) untuk detailnya.


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