> ## 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 Hapus Sesi Massal: Pembersihan Sesi KYC

> Hapus banyak sesi KYC sekaligus lewat Didit. Hingga 20 sesi menghasilkan hasil per sesi; pilihan lebih besar dijalankan sebagai job penghapusan.



Prompt Hapus Sesi Massal
        Salin prompt ke papan klip



      
      

\<pre>

\`Goal: Delete a list of User Verification (KYC) sessions, or every session, for the calling application, and control what happens to each session's face biometric data. KYC only — KYB sessions are not covered here; use DELETE /v3/session/{sessionId}/delete/ for a single KYB or KYC session.

Endpoint: POST https://verification.didit.me/v3/sessions/delete/
Auth header: x-api-key: YOUR_API_KEY
Content-Type: application/json

Request body — provide EXACTLY ONE selector:
\- session_numbers: string[] — UI-visible decimal session numbers ("#1234" style), NOT UUIDs. Each entry must be digits only (regex ^[0-9]+$). minItems: 1.
\- delete_all: true — delete every remaining KYC session for the application. When delete_all is true, session_numbers is ignored.

Narrowing delete_all (optional, only together with delete_all: true):
\- filter_<name> - any filter of GET /v3/sessions/ (see /sessions-api/list-sessions) prefixed with filter_, with the same values: filter_status, filter_workflow_id, filter_date_from, filter_date_to, filter_vendor_data, filter_country, filter_document_type, filter_warning, filter_search and the others. Filters that take several values in GET /v3/sessions/ (status, workflow_id, country, region, document_type, document_name, session_type, warning, organization_name) accept a comma-separated string or an array. The others take one value: an array is joined into one comma-separated value, so several dates, UUIDs or api_service values are refused with 400, and several texts are not matched as alternatives. An empty value is ignored and does not narrow the selection.
\- An unknown filter_* key returns 400 { "filter_<name>": "Unknown filter." } and a value that cannot be read returns 400 keyed by that filter_* key (for example { "filter_date_from": ["Enter a valid date."] }). Nothing is deleted in either case.
\- A deletion job applies the same filters.

Optional retention and instruction fields (same semantics as the single-session endpoint, applied to every matched session):
\- retain_face_embeddings (boolean | null) — true keeps an image-free biometric template anchored to each session's User; false deletes the embedding with the session; omit/null follows the application's face_retention_policy.
\- face_retention_days (integer 1-3650) — required when retaining unless the application sets face_retention_days.
\- face_retention_deadline (ISO 8601 datetime, future) — optional hard expiry.
\- deletion_instruction ("operational_session_delete" default | "privacy_erasure") — privacy_erasure purges every retained template for each session's User and never retains a new one. Cannot be combined with retain_face_embeddings: true (400).
\- instruction_id (string, max 255) — your durable reference for this instruction; recorded on the audit trail and on every retained template.

curl:
curl -X POST 'https://verification.didit.me/v3/sessions/delete/' \
-H "x-api-key: YOUR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"session_numbers": ["1001", "1002", "1003"]}'

Response: the number of matching sessions decides, whether they are selected by session_numbers or with delete_all.

Up to 20 matching sessions: they are deleted in the request. Response 200 (this endpoint no longer returns 204):
\{
"results": [
\{"session_id": "<uuid>", "session_number": 1001, "face_retention_outcome": "deleted", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0},
\{"session_id": "<uuid>", "session_number": 1002, "face_retention_outcome": "retained_with_user", "biometric_template_uuid": "<uuid>", "biometric_template_expires_at": "<ISO 8601 datetime>", "deleted_child_verifications": 0},
\{"session_id": "<uuid>", "session_number": 1003, "face_retention_outcome": "failed_retryable", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0}
]
}
face_retention_outcome per session:
\- deleted: session and face embedding deleted (default).
\- retained_with_user: session deleted; an image-free biometric template stays anchored to the User until biometric_template_expires_at (manage it via /v3/biometric-templates/).
\- none: the session had no face embedding.
\- ineligible_no_vendor_user: retention requested but the session has no linked User; session and embedding deleted.
\- failed_retryable: the group this session was deleted with could not be deleted (a storage service, a biometric store or a monitoring provider was unavailable). That session is NOT deleted and is still in place; re-run the request for it. Other groups in the same request are unaffected.
deleted_child_verifications is always 0 here: this endpoint deletes KYC sessions only.

More than 20 matching sessions: they are deleted in the background. Response 202 with a deletion job:
\{"job_id": "<uuid>", "status": "PENDING", "total": 250, "processed": 0, "outcomes": {"deleted": 0, "none": 0, "retained_with_user": 0, "ineligible_no_vendor_user": 0, "failed_retryable": 0, "already_deleted": 0}, "deleted_child_verifications": 0, "error": null, "created_at": "<datetime>", "completed_at": null}
Poll GET /v3/sessions/delete/{job_id}/ every few seconds until status is COMPLETED or FAILED. The job reports counts per outcome, never which sessions it deleted. A delete_all job deletes only the sessions created before the request. A FAILED job explains why in error; the sessions it had not reached are still in place, so repeat the request to delete them.

Side effects:
\- Each matched session is deleted along with everything it produced, including every verification attempt: its decision, its extracted data, its KYC / Face / AML / Location / POA / Phone / Email records, its reviews and activity log, and all of its stored files.
\- The sessions stop appearing in GET /v3/sessions/ and GET /v3/session/{sessionId}/decision/, and media URLs issued before the call stop resolving.
\- Webhook deliveries still queued for the deleted sessions, and their retries, are dropped. Webhooks already delivered are not affected.
\- Share tokens issued for the sessions are NOT revoked, but there is nothing left for them to import: an import with one returns 400 {"share_token": ["Original session does not exist."]}.
\- Blocklist entries created from the sessions are NOT removed.
\- Credits already consumed by the verifications are NOT refunded.
\- The parent User entities are NOT deleted; use POST /v3/users/delete/ for those (that also purges their retained templates).
\- NO deletion webhook is emitted.
\- Sessions are deleted in groups; a failure in one group does not roll back the others. Numbers that no longer match a live session are skipped and do not appear in results.

Idempotency: re-running with the same session_numbers deletes nothing more (numbers that no longer match a session are skipped). Deletion is permanent and cannot be undone.

Failure modes:
\- 400: validation, nothing deleted:
\{ "session_numbers": ["This field is required unless delete_all is true."] }
\{ "session_numbers": ["All session_numbers must be numeric."] }
\{ "retain_face_embeddings": ["Privacy erasure cannot retain biometric templates."] }
\{ "detail": "A finite biometric-template retention duration is required." }
\{ "filter_reviewer": "Unknown filter." }
\{ "filter_date_from": ["Enter a valid date."] }
\- 409: at least one selected session is part of a finalized regulatory report. Nothing is deleted. The body has code: in_filed_report and reports[] with uuid, report_number, report_type and case_uuid. Delete the reports, then repeat the request.
\- 403: API key invalid or application not allowed. { "detail": "You do not have permission to perform this action." }

Migration note: until this release the endpoint returned 204 with an empty body; it now returns 200 with results[], or 202 with a deletion job when more than 20 sessions match. Existing applications stay on delete_with_session until you explicitly change the policy.

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

\</pre>



      
      

Tempel ke

## PerilakuSetiap sesi yang cocok dihapus dengan cara yang sama persis seperti [Hapus Sesi](https://docs.didit.me/id/sessions-api/delete-session.md): sesi itu sendiri, setiap percobaan verifikasi yang dimilikinya, keputusan dan data yang diekstrak, catatan fitur, dan semua file tersimpannya dihapus. Sesi tersebut juga hilang dari setiap endpoint baca, dan URL media yang sudah diterbitkan sebelumnya berhenti dapat diakses. Pengiriman webhook yang masih antre untuk sesi yang dihapus, beserta percobaan ulangnya, dibatalkan. Webhook yang sudah terkirim tidak terpengaruh. Penghapusan bersifat permanen dan tidak dapat dibatalkan.Jika salah satu sesi yang dipilih menjadi bagian dari laporan regulasi yang sudah final, seluruh permintaan mengembalikan `409` dan tidak ada yang dihapus. Respons menggunakan `code: in_filed_report` dan menyebutkan setiap laporan. Hapus setiap laporan dengan [Hapus Laporan](https://docs.didit.me/id/management-api/regulatory-reports/delete.md), lalu ulangi permintaan. Menghapus laporan tidak menghapus sesi. Sesi tetap ada sampai Anda mengulangi permintaan ini.Jumlah sesi yang cocok menentukan cara permintaan dijawab, baik Anda memilih sesi dengan `session_numbers` maupun dengan `delete_all`:| Sesi yang cocok | Respons |
| - | - |
| Hingga 20 | `200 OK` setelah sesi-sesi tersebut dihapus, dengan satu hasil per sesi yang cocok di `results`. |
| Lebih dari 20 | `202 Accepted` dengan pekerjaan penghapusan. Sesi dihapus di latar belakang. Lakukan polling ke [Dapatkan Pekerjaan Penghapusan Sesi](https://docs.didit.me/id/management-api/sessions/get-deletion-job.md) hingga pekerjaan selesai. |Hasil hanya mengonfirmasi bahwa sesi telah dihapus, kecuali jika `face_retention_outcome`-nya adalah `failed_retryable`. Sesi tersebut **tidak** dihapus dan masih ada. Perlakukan hasil itu sebagai kegagalan yang perlu dicoba ulang, bukan sebagai konfirmasi penghapusan.
Nomor yang tidak cocok dengan sesi KYC aktif di aplikasi Anda dilewati dan tidak muncul di `results`.## Mempersempit `delete_all` dengan filterDengan `delete_all: true`, Anda dapat mempersempit pilihan menggunakan filter dari [Daftar Sesi](https://docs.didit.me/id/sessions-api/list-sessions.md), masing-masing diawali dengan `filter_`.
Filter tersebut menerima nilai yang sama seperti parameter query.
Filter yang menerima beberapa nilai (`status`, `workflow_id`, `country`, `region`, `document_type`, `document_name`, `session_type`, `warning`, `organization_name`) menerima string yang dipisahkan koma atau array:```json theme={null}
{
  "delete_all": true,
  "filter_status": ["Declined"],
  "filter_workflow_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "filter_date_from": "2026-09-01",
  "filter_date_to": "2026-09-30"
}
```- Filter hanya berlaku bersama `delete_all`. Dengan `session_numbers`, filter hanya diperiksa dan tidak mengubah pilihan.
- Setiap filter lain hanya menerima satu nilai.
  Array digabungkan menjadi satu nilai yang dipisahkan koma. Akibatnya, beberapa tanggal, UUID, atau nilai `api_service` menghasilkan `400`. Beberapa teks `vendor_data`, `search`, atau `screened_full_name` juga tidak dicocokkan sebagai alternatif.
- Filter dengan nilai kosong diabaikan, sehingga tidak mempersempit pilihan.
- Kunci `filter_*` yang tidak dikenal mengembalikan `400` `{"filter_reviewer": "Unknown filter."}`. Nilai yang tidak dapat dibaca mengembalikan `400` dengan kunci `filter_*` tersebut, misalnya `{"filter_date_from": ["Enter a valid date."]}`.
  Dalam kedua kasus itu tidak ada yang dihapus, sehingga filter yang salah ketik tidak pernah memperluas penghapusan ke semua sesi.
- Pekerjaan penghapusan menerapkan filter yang sama. Seperti setiap `delete_all`, pekerjaan ini hanya mencakup sesi yang dibuat sebelum permintaan.## Kolom retensi dan instruksiEndpoint ini menerima kolom opsional yang sama dengan endpoint satu sesi, dan menerapkannya ke setiap sesi yang cocok:| Kolom | Tipe | Deskripsi |
| - | - | - |
| `retain_face_embeddings` | boolean atau null | Menggantikan `face_retention_policy` aplikasi untuk permintaan ini. |
| `face_retention_days` | integer (1-3650) | Durasi retensi terbatas untuk templat yang dipertahankan. Wajib diisi saat retensi, kecuali aplikasi sudah mengatur `face_retention_days`. |
| `face_retention_deadline` | datetime (ISO 8601) | Batas kedaluwarsa tetap opsional. Harus berada di masa depan. |
| `deletion_instruction` | `operational_session_delete` (default) atau `privacy_erasure` | `privacy_erasure` menghapus setiap templat yang dipertahankan untuk setiap Pengguna sebelum menghapus sesi, dan tidak dapat dikombinasikan dengan `retain_face_embeddings: true`. |
| `instruction_id` | string (maksimal 255) | Referensi tetap Anda untuk instruksi ini. Dicatat di jejak audit dan pada setiap templat yang dipertahankan. |Lihat [Hapus Sesi](https://docs.didit.me/id/sessions-api/delete-session.md#data-biometrik-wajah-hapus-atau-pertahankan) untuk mengetahui apa saja yang dimuat dan tidak dimuat dalam templat yang dipertahankan, cara `expires_at` dihitung, dan apa yang dilakukan instruksi penghapusan privasi.## Hasil per sesiUntuk hingga 20 sesi yang cocok, `200 OK` mengembalikan satu hasil per sesi:```json theme={null}
{
  "results": [
    { "session_id": "4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02", "session_number": 1001, "face_retention_outcome": "deleted", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 },
    { "session_id": "b8e1d2c3-4f5a-4b6c-8d7e-9f0a1b2c3d4e", "session_number": 1002, "face_retention_outcome": "retained_with_user", "biometric_template_uuid": "9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b", "biometric_template_expires_at": "2027-10-09T10:15:00Z", "deleted_child_verifications": 0 },
    { "session_id": "7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c", "session_number": 1003, "face_retention_outcome": "ineligible_no_vendor_user", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 },
    { "session_id": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f", "session_number": 1004, "face_retention_outcome": "failed_retryable", "biometric_template_uuid": null, "biometric_template_expires_at": null, "deleted_child_verifications": 0 }
  ]
}
```Setiap hasil memuat kolom yang sama dengan respons [Hapus Sesi](https://docs.didit.me/id/sessions-api/delete-session.md#respons). `biometric_template_expires_at` adalah waktu templat yang dipertahankan dihapus, dan `deleted_child_verifications` selalu `0` di sini karena endpoint ini hanya menghapus sesi KYC.| `face_retention_outcome` | Arti |
| - | - |
| `deleted` | Sesi dan embedding wajahnya dihapus. Perilaku default. |
| `retained_with_user` | Sesi dihapus. Satu templat biometrik tanpa gambar tetap terhubung ke Pengguna. Id-nya adalah `biometric_template_uuid`. |
| `none` | Sesi tidak memiliki embedding wajah untuk dihapus atau dipertahankan. |
| `ineligible_no_vendor_user` | Retensi diminta, tetapi sesi tidak terhubung ke Pengguna, sehingga templat tidak dapat ditautkan ke Pengguna. Sesi dan embedding-nya dihapus. |
| `failed_retryable` | Kelompok tempat sesi ini dihapus tidak dapat dihapus, karena layanan penyimpanan, penyimpanan biometrik, atau penyedia pemantauan tidak tersedia. Sesi ini **tidak** dihapus dan masih ada. Jalankan ulang permintaan untuk sesi ini. Percobaan ulang akan menghasilkan satu templat yang sama. |Sesi dihapus per kelompok. Jika sebuah kelompok tidak dapat dihapus, setiap sesi di dalamnya dilaporkan sebagai `failed_retryable`. Kelompok lain tidak terpengaruh dan tetap terhapus.## Pemilihan dalam jumlah besar dijalankan sebagai jobJika lebih dari 20 sesi cocok, respons berupa `202 Accepted` dengan job penghapusan, bukan `results`:```json theme={null}
{
  "job_id": "5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b",
  "status": "PENDING",
  "total": 250,
  "processed": 0,
  "outcomes": { "deleted": 0, "none": 0, "retained_with_user": 0, "ineligible_no_vendor_user": 0, "failed_retryable": 0, "already_deleted": 0 },
  "deleted_child_verifications": 0,
  "error": null,
  "created_at": "2026-10-09T10:15:00Z",
  "completed_at": null
}
```Lakukan polling ke [Dapatkan Job Penghapusan Sesi](https://docs.didit.me/id/management-api/sessions/get-deletion-job.md) setiap beberapa detik hingga `status` menjadi `COMPLETED` atau `FAILED`.- Job hanya melaporkan jumlah sesi per hasil, dan tidak pernah melaporkan sesi mana yang dihapus.
- Job `delete_all` hanya menghapus sesi yang dibuat sebelum permintaan Anda. Sesi yang dimulai selama job berjalan tidak dihapus.
- Kolom retensi dan instruksi dari permintaan Anda berlaku untuk setiap sesi yang dihapus oleh job.
- Jika suatu kelompok belum dapat dihapus, job akan mencoba lagi secara otomatis.
- Job yang `FAILED` menjelaskan penyebabnya di `error`. Sesi yang belum dijangkau job masih ada: ulangi permintaan untuk menghapusnya.## Contoh> [tab] Hapus berdasarkan jumlah
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"session_numbers": ["1001", "1002", "1003"]}'
> ```> [tab] Hapus dan pertahankan templat
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "session_numbers": ["1001", "1002"],
>     "retain_face_embeddings": true,
>     "face_retention_days": 365,
>     "instruction_id": "post-approval-cleanup-2026-08"
>   }'
> ```> [tab] Penghapusan data demi privasi
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{
>     "session_numbers": ["1001"],
>     "deletion_instruction": "privacy_erasure",
>     "instruction_id": "dsar-2026-0142"
>   }'
> ```> [tab] Hapus semua dan lakukan polling job
>
> ```bash theme={null}
> curl -X POST https://verification.didit.me/v3/sessions/delete/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -H "Content-Type: application/json" \
>   -d '{"delete_all": true}'
>
> # More than 20 sessions matched: the response is 202 with a job_id.
> curl https://verification.didit.me/v3/sessions/delete/JOB_ID/ \
>   -H "x-api-key: YOUR_API_KEY"
> ```## Migrasi dari respons 204Hingga rilis ini, endpoint mengembalikan `204 No Content`. Sekarang endpoint mengembalikan `200 OK` dengan `results[]`, atau `202 Accepted` dengan job penghapusan untuk lebih dari 20 sesi yang cocok. Perbarui klien yang mengharapkan `204`. Perilaku penghapusan default tidak berubah: aplikasi yang ada tetap menggunakan `delete_with_session` sampai Anda secara eksplisit mengubah kebijakan.## Terkait- [Hapus Sesi](https://docs.didit.me/id/sessions-api/delete-session.md)
- [Dapatkan Job Penghapusan Sesi](https://docs.didit.me/id/management-api/sessions/get-deletion-job.md)
- [Templat biometrik](https://docs.didit.me/id/management-api/biometric-templates/overview.md)
- [Retensi data](https://docs.didit.me/id/console/data-retention.md)


## OpenAPI

````yaml id/openapi-25.json POST /v3/sessions/delete/
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/sessions/delete/:
    post:
      tags:
        - Sessions
      summary: Hapus sesi KYC secara massal berdasarkan session_number
      description: >-
        Hapus secara massal sesi Verifikasi Pengguna (KYC) berdasarkan
        `session_number` numeriknya, atau setiap sesi KYC di aplikasi Anda
        dengan `delete_all: true`.


        `session_number` adalah penghitung inkremental yang mudah dipahami
        manusia yang ditampilkan di daftar sesi Console dan dikembalikan sebagai
        `session_number` oleh endpoint pembuatan sesi dan keputusan; ini
        **bukan** UUID `session_id`. Untuk menghapus sesi berdasarkan UUID, atau
        untuk menghapus sesi Verifikasi Bisnis (KYB), yang tidak pernah disentuh
        oleh endpoint ini, gunakan `DELETE /v3/session/{sessionId}/delete/`
        sebagai gantinya.


        **Hingga 20 sesi dihapus dalam permintaan, lebih dari itu dijalankan
        sebagai job.** Jumlah sesi yang cocok menentukan hal ini, baik yang
        dipilih melalui `session_numbers` maupun dengan `delete_all`:

        - Hingga 20 sesi yang cocok: sesi dihapus sebelum respons dikirim, yang
        berupa `200` dengan satu entri per sesi di `results[]`.

        - Lebih dari 20: responsnya adalah `202` dengan job penghapusan, dan
        sesi dihapus di latar belakang. Lakukan polling pada `GET
        /v3/sessions/delete/{job_id}/` hingga `status` bernilai `COMPLETED` atau
        `FAILED`. Job melaporkan jumlah per hasil, tidak pernah mencantumkan
        sesi mana saja yang dihapusnya. Job `delete_all` hanya menghapus sesi
        yang dibuat sebelum permintaan; sesi yang dimulai saat job berjalan
        tidak akan dihapus.


        Setiap sesi yang dihapus mendapatkan perlakuan yang persis sama seperti
        endpoint penghapusan sesi tunggal: sesi, setiap upaya verifikasi di
        dalamnya, keputusan dan data yang diekstrak, rekaman fitur terkait
        (verifikasi identitas, wajah, liveness, pencocokan wajah, dan
        seterusnya) serta seluruh file tersimpannya akan dihapus, sesi
        menghilang dari setiap endpoint baca, dan URL media yang diterbitkan
        sebelumnya tidak dapat diakses lagi. Pengiriman webhook yang masih
        berada dalam antrean untuk sesi yang dihapus, beserta percobaan
        ulangnya, akan dibatalkan; webhook yang telah terkirim tidak
        terpengaruh. Entri daftar blokir **tidak** dihapus, kredit yang telah
        terpakai **tidak** dikembalikan dananya, dan entitas Pengguna induk
        **tidak** dihapus (gunakan `POST /v3/users/delete/` untuk entitas
        tersebut); tidak ada webhook yang dipicu untuk penghapusan ini.
        Penghapusan bersifat permanen dan tidak dapat dibatalkan.


        **Semantik pemilihan:**

        - Dengan `delete_all: true`, Anda dapat mempersempit pemilihan
        menggunakan filter dari `GET /v3/sessions/`, masing-masing diawali
        dengan `filter_` (misalnya `filter_status`, `filter_workflow_id`,
        `filter_date_from`). Filter yang menerima beberapa nilai di List
        Sessions (`status`, `workflow_id`, `country`, `region`, `document_type`,
        `document_name`, `session_type`, `warning`, `organization_name`)
        menerima string yang dipisahkan koma atau array; filter lainnya hanya
        menerima satu nilai. Nilai kosong akan diabaikan. Filter hanya berlaku
        bersamaan dengan `delete_all`, dan job penghapusan menerapkan filter
        yang sama.

        - Kunci `filter_*` yang tidak dikenal, atau nilai filter yang tidak
        dapat dibaca, akan menolak seluruh permintaan dengan `400` sebelum apa
        pun dihapus, sehingga filter yang salah ketik tidak akan pernah
        memperluas penghapusan ke setiap sesi.

        - Entri dalam `session_numbers` yang tidak cocok dengan sesi KYC aktif
        di aplikasi Anda (nomor yang tidak dikenal, sesi yang sudah dihapus,
        atau sesi milik aplikasi lain) akan **dilewati tanpa pemberitahuan**:
        entri tersebut tidak muncul di `results` dan tidak dihitung dalam
        `total` milik job.

        - Kegagalan validasi (entri non-numerik, daftar kosong, tidak
        menyertakan `session_numbers` maupun `delete_all`, atau retensi templat
        yang tidak dapat dipenuhi aplikasi) akan menolak **seluruh permintaan**
        dengan `400` dan tidak menghapus apa pun.

        - Sesi dihapus dalam beberapa kelompok. Jika suatu kelompok tidak dapat
        dihapus (misalnya karena layanan penyimpanan tidak tersedia), setiap
        sesi dalam kelompok tersebut dilaporkan sebagai `face_retention_outcome:
        failed_retryable` dan tetap ada; kelompok lainnya tidak terpengaruh.
        Ulangi permintaan untuk sesi-sesi tersebut. Job akan mencoba lagi
        kelompok tersebut secara otomatis.

        - Tidak ada batasan terdokumentasi untuk panjang daftar; batas laju
        penulisan bersama (di bawah) merupakan batas praktisnya.


        **Data biometrik wajah:** kolom opsional `retain_face_embeddings`,
        `face_retention_days`, `face_retention_deadline`,
        `deletion_instruction`, dan `instruction_id` memiliki arti yang sama
        seperti pada `DELETE /v3/session/{sessionId}/delete/` dan berlaku untuk
        setiap sesi yang cocok. Setiap hasil melaporkan `face_retention_outcome`
        masing-masing.


        **Respons:** `200 OK` dengan `results[]` untuk hingga 20 sesi yang
        cocok, atau `202 Accepted` dengan job penghapusan jika lebih banyak.
        Setiap hasil mengonfirmasi penghapusan kecuali `face_retention_outcome:
        failed_retryable`, yang melaporkan sesi yang TIDAK dihapus dan harus
        dicoba lagi. Versi sebelumnya dari endpoint ini mengembalikan `204 No
        Content`; perbarui klien yang memeriksa `204`.


        **Idempotensi:** mengulangi permintaan yang sama tidak akan menghapus
        apa pun lagi: nomor yang tidak lagi cocok dengan suatu sesi akan
        dilewati.


        **`delete_all: true` (destruktif):** menghapus **setiap** sesi KYC yang
        tersisa di aplikasi; `session_numbers` diabaikan jika parameter ini
        diatur. Tidak ada langkah konfirmasi dan tidak dapat dibatalkan.


        **Autentikasi:** kunci API di header `x-api-key`. Kredensial yang hilang
        atau tidak valid akan mengembalikan `403` (`{"detail": "You do not have
        permission to perform this action."}`); API ini tidak pernah
        mengembalikan `401`.


        **Batas laju:** kuota penulisan bersama sebesar 300 permintaan/menit per
        kunci API di seluruh endpoint POST/PATCH/DELETE; jika melebihi batas ini
        akan mengembalikan `429`.


        Endpoint ini hanya menerima kunci API. Token Bearer pengguna Business
        Console ditolak dengan `403` (berbeda dengan penghapusan sesi tunggal
        yang menerima keduanya).


        **Laporan regulasi yang diajukan:** jika data yang dipilih berada dalam
        laporan regulasi yang telah difinalisasi, seluruh permintaan akan
        ditolak dengan `409` dan tidak ada yang dihapus. Isi respons menggunakan
        `code: in_filed_report` dan menyebutkan setiap laporan dengan `uuid`,
        `report_number`, `report_type`, dan `case_uuid`. Hapus laporan tersebut,
        lalu ulangi permintaan.
      operationId: batch_delete_sessions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                session_numbers:
                  type: array
                  description: >-
                    Nilai numerik `session_number` dari sesi KYC yang akan
                    dihapus, sebagai string khusus digit (angka JSON juga
                    diterima dan dikonversi). Wajib diisi kecuali `delete_all`
                    bernilai `true`; daftar kosong mengembalikan `400`. Setiap
                    entri non-digit menolak seluruh permintaan dengan `400`
                    (kecuali `delete_all` bernilai `true`, di mana validasi
                    dilewati dan entri diabaikan). Nomor yang tidak cocok dengan
                    sesi aktif di aplikasi Anda akan dilewati tanpa peringatan.
                  items:
                    type: string
                    pattern: ^[0-9]+$
                    example: '1001'
                  minItems: 1
                  example:
                    - '1001'
                    - '1002'
                    - '1003'
                delete_all:
                  type: boolean
                  description: >-
                    Jika `true`, setiap sesi KYC yang tersisa di aplikasi
                    pemanggil akan dihapus dan `session_numbers` diabaikan,
                    kecuali Anda mempersempit pilihan dengan kunci `filter_*`.
                    Lebih dari 20 sesi yang cocok akan dijalankan sebagai tugas
                    penghapusan (`202`) yang hanya mencakup sesi yang dibuat
                    sebelum permintaan. Default ke `false`. Tidak dapat
                    dibatalkan; tidak ada langkah konfirmasi.
                  default: false
                  example: false
                retain_face_embeddings:
                  type: boolean
                  nullable: true
                  description: >-
                    Timpa `face_retention_policy` aplikasi untuk penghapusan
                    ini. `true` mempertahankan satu templat biometrik wajah
                    bebas gambar yang ditautkan ke Pengguna sesi setelah sesi
                    dihapus; `false` menghapus embedding wajah bersama sesi;
                    abaikan atau gunakan `null` untuk mengikuti kebijakan
                    aplikasi. Diabaikan untuk sesi KYB dan untuk sesi tanpa
                    embedding wajah.
                  example: true
                face_retention_days:
                  type: integer
                  minimum: 1
                  maximum: 3650
                  description: >-
                    Durasi retensi terbatas, dalam hari, untuk templat yang
                    disimpan. Wajib diisi saat templat disimpan kecuali aplikasi
                    sudah menyetel `face_retention_days`. `expires_at` templat
                    adalah yang paling awal di antara durasi ini, jendela
                    retensi data umum aplikasi, dan `face_retention_deadline`.
                  example: 365
                face_retention_deadline:
                  type: string
                  format: date-time
                  description: >-
                    Kedaluwarsa mutlak opsional untuk templat yang disimpan.
                    Harus berada di masa mendatang.
                  example: '2027-08-28T00:00:00Z'
                deletion_instruction:
                  type: string
                  enum:
                    - operational_session_delete
                    - privacy_erasure
                  default: operational_session_delete
                  description: >-
                    Kelas instruksi yang Anda berikan.
                    `operational_session_delete` menghapus sesi dan
                    mempertahankan templat hanya jika kebijakan atau
                    `retain_face_embeddings` menentukannya. `privacy_erasure`
                    menghapus permanen setiap templat biometrik tersimpan yang
                    terkait dengan Pengguna sesi tersebut sebelum menghapus
                    sesi, tidak dapat ditimpa oleh kebijakan aplikasi, dan tidak
                    dapat digabungkan dengan `retain_face_embeddings: true`
                    (`400`).
                  example: operational_session_delete
                instruction_id:
                  type: string
                  maxLength: 255
                  description: >-
                    Referensi permanen Anda untuk instruksi penghapusan ini
                    (misalnya id tiket penghapusan). Dicatat pada jejak audit
                    dan pada setiap templat yang dipertahankan. Dihasilkan oleh
                    Didit jika ditiadakan.
                  example: dsar-2026-0142
                filter_status:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `status` dari [Daftar Sesi](/id/sessions-api/list-sessions),
                    dengan nilai yang sama. String yang dipisahkan koma atau
                    sebuah array. Diabaikan tanpa `delete_all`. Nilai kosong
                    diabaikan dan tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_vendor_data:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `vendor_data` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu teks yang dipisahkan koma, sehingga beberapa nilai
                    tidak dicocokkan sebagai alternatif. Diabaikan tanpa
                    `delete_all`. Nilai kosong diabaikan dan tidak mempersempit
                    pilihan.
                  type: string
                filter_search:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `search` dari [Daftar Sesi](/id/sessions-api/list-sessions),
                    dengan nilai yang sama. Satu nilai, bukan daftar: array
                    digabungkan menjadi satu teks yang dipisahkan koma, sehingga
                    beberapa nilai tidak dicocokkan sebagai alternatif.
                    Diabaikan tanpa `delete_all`. Nilai kosong diabaikan dan
                    tidak mempersempit pilihan.
                  type: string
                filter_workflow_id:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `workflow_id` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau sebuah array.
                    Diabaikan tanpa `delete_all`. Nilai kosong diabaikan dan
                    tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_date_from:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `date_from` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu nilai yang dipisahkan koma, sehingga beberapa nilai
                    ditolak dengan `400`. Diabaikan tanpa `delete_all`. Nilai
                    kosong diabaikan dan tidak mempersempit pilihan.
                  type: string
                  format: date
                filter_date_to:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `date_to` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu nilai yang dipisahkan koma, sehingga beberapa nilai
                    ditolak dengan `400`. Diabaikan tanpa `delete_all`. Nilai
                    kosong diabaikan dan tidak mempersempit pilihan.
                  type: string
                  format: date
                filter_country:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `country` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau array. Diabaikan
                    tanpa `delete_all`. Nilai kosong diabaikan dan tidak
                    mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_type:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `document_type` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau array. Diabaikan
                    tanpa `delete_all`. Nilai kosong diabaikan dan tidak
                    mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_document_name:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `document_name` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau array. Diabaikan
                    tanpa `delete_all`. Nilai kosong diabaikan dan tidak
                    mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_region:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `region` dari [Daftar Sesi](/id/sessions-api/list-sessions),
                    dengan nilai yang sama. String yang dipisahkan koma atau
                    sebuah array. Diabaikan tanpa `delete_all`. Nilai kosong
                    diabaikan dan tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_didit_internal_id:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `didit_internal_id` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu nilai yang dipisahkan koma, sehingga beberapa nilai
                    ditolak dengan `400`. Diabaikan tanpa `delete_all`. Nilai
                    kosong diabaikan dan tidak mempersempit pilihan.
                  type: string
                  format: uuid
                filter_session_type:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `session_type` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau sebuah array.
                    Diabaikan tanpa `delete_all`. Nilai kosong diabaikan dan
                    tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_api_service:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `api_service` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu nilai yang dipisahkan koma, sehingga beberapa nilai
                    ditolak dengan `400`. Diabaikan tanpa `delete_all`. Nilai
                    kosong diabaikan dan tidak mempersempit pilihan.
                  type: string
                filter_screened_full_name:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `screened_full_name` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu teks yang dipisahkan koma, sehingga beberapa nilai
                    tidak dicocokkan sebagai alternatif. Diabaikan tanpa
                    `delete_all`. Nilai kosong diabaikan dan tidak mempersempit
                    pilihan.
                  type: string
                filter_warning:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `warning` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau sebuah array.
                    Diabaikan tanpa `delete_all`. Nilai kosong diabaikan dan
                    tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                filter_status_initialized_as_in_review:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `status_initialized_as_in_review` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Diabaikan tanpa `delete_all`. Nilai kosong diabaikan
                    dan tidak mempersempit pilihan.
                  type: boolean
                filter_is_kyc_to_be_reviewed:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `is_kyc_to_be_reviewed` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Diabaikan tanpa `delete_all`. Nilai kosong diabaikan
                    dan tidak mempersempit pilihan.
                  type: boolean
                filter_euuid:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `euuid` dari [List
                    Sessions](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. Satu nilai, bukan daftar: array digabungkan menjadi
                    satu nilai yang dipisahkan koma, sehingga beberapa nilai
                    ditolak dengan `400`. Diabaikan tanpa `delete_all`. Nilai
                    kosong diabaikan dan tidak mempersempit pilihan.
                  type: string
                  format: uuid
                filter_organization_name:
                  description: >-
                    Mempersempit `delete_all` ke sesi yang cocok dengan filter
                    `organization_name` dari [Daftar
                    Sesi](/id/sessions-api/list-sessions), dengan nilai yang
                    sama. String yang dipisahkan koma atau sebuah array. Dengan
                    kunci API, ini hanya dapat mencocokkan nama organisasi Anda
                    sendiri, sehingga ini memilih semua sesi Anda atau tidak
                    sama sekali. Diabaikan tanpa `delete_all`. Nilai kosong
                    diabaikan dan tidak mempersempit pilihan.
                  oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
            examples:
              Specific sessions:
                summary: Hapus sesi tertentu berdasarkan nomor
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                    - '1003'
              All sessions:
                summary: Hapus setiap sesi KYC di aplikasi
                value:
                  delete_all: true
              Delete and retain templates:
                summary: >-
                  Hapus sesi tetapi simpan templat biometrik tanpa gambar selama
                  365 hari
                value:
                  session_numbers:
                    - '1001'
                    - '1002'
                  retain_face_embeddings: true
                  face_retention_days: 365
                  instruction_id: post-approval-cleanup-2026-08
              Privacy erasure:
                summary: >-
                  Hapus sesi dan bersihkan setiap templat yang disimpan untuk
                  Penggunanya
                value:
                  session_numbers:
                    - '1001'
                  deletion_instruction: privacy_erasure
                  instruction_id: dsar-2026-0142
              Filtered delete_all:
                summary: >-
                  Hapus setiap sesi Ditolak dari satu alur kerja yang dibuat
                  pada September 2026
                value:
                  delete_all: true
                  filter_status:
                    - Declined
                  filter_workflow_id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
                  filter_date_from: '2026-09-01'
                  filter_date_to: '2026-09-30'
      responses:
        '200':
          description: >-
            Hingga 20 sesi yang cocok ditemukan dan diproses dalam permintaan.
            Satu hasil per sesi yang cocok; nomor yang tidak cocok dengan apa
            pun (tidak dikenal atau sudah dihapus) dilewati dan tidak muncul.
            Hasil mengonfirmasi penghapusan kecuali jika
            `face_retention_outcome` adalah `failed_retryable`: sesi tersebut
            TIDAK dihapus dan harus dicoba lagi.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        session_id:
                          type: string
                          format: uuid
                          description: Sesi yang dihapus.
                        session_number:
                          type: integer
                          nullable: true
                          description: Nomor sesi yang dihapus.
                        face_retention_outcome:
                          type: string
                          enum:
                            - retained_with_user
                            - deleted
                            - none
                            - ineligible_no_vendor_user
                            - failed_retryable
                          description: >-
                            Hal yang terjadi pada data biometrik wajah sesi.
                            `deleted`: embedding wajah dihapus bersama sesi
                            (default). `retained_with_user`: sesi dihapus dan
                            satu templat biometrik tanpa gambar tetap terhubung
                            ke Pengguna; lihat `biometric_template_uuid`.
                            `none`: sesi tidak memiliki embedding wajah
                            (misalnya sesi KYC khusus dokumen tanpa swafoto
                            dengan Deteksi Liveness; sesi KYB tidak pernah
                            dipilih oleh endpoint ini).
                            `ineligible_no_vendor_user`: retensi diminta tetapi
                            sesi tidak memiliki Pengguna yang ditautkan,
                            sehingga embedding dihapus bersama sesi.
                            `failed_retryable` (khusus endpoint batch): grup
                            tempat sesi ini dihapus tidak dapat dihapus (layanan
                            penyimpanan, penyimpanan biometrik, atau penyedia
                            pemantauan tidak tersedia); sesi ini masih ada,
                            ulangi permintaan untuk sesi tersebut.
                        biometric_template_uuid:
                          type: string
                          format: uuid
                          nullable: true
                          description: >-
                            Id templat biometrik yang disimpan saat
                            `face_retention_outcome` adalah
                            `retained_with_user`; jika tidak, bernilai `null`.
                            Kelola melalui
                            `/v3/biometric-templates/{template_uuid}/`.
                        biometric_template_expires_at:
                          type: string
                          format: date-time
                          nullable: true
                          description: >-
                            Waktu templat biometrik yang disimpan dihapus, saat
                            `face_retention_outcome` adalah
                            `retained_with_user`; `null` jika tidak ada templat
                            yang disimpan.
                        deleted_child_verifications:
                          type: integer
                          description: >-
                            Selalu `0` pada endpoint ini, yang hanya menghapus
                            sesi KYC. Menghapus sesi Verifikasi Bisnis (KYB)
                            dengan `DELETE /v3/session/{sessionId}/delete/`
                            melaporkan verifikasi yang dibuatnya yang ikut
                            terhapus bersamanya.
              examples:
                Mixed outcomes:
                  value:
                    results:
                      - session_id: 4c5c7f3a-3b1d-4b7e-9c39-2b4f7e6a1d02
                        session_number: 1001
                        face_retention_outcome: deleted
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
                      - session_id: b8e1d2c3-4f5a-4b6c-8d7e-9f0a1b2c3d4e
                        session_number: 1002
                        face_retention_outcome: retained_with_user
                        biometric_template_uuid: 9d2f4b6e-1c3a-4e8f-b7d5-0a1c2e3f4a5b
                        biometric_template_expires_at: '2027-10-09T10:15:00Z'
                        deleted_child_verifications: 0
                      - session_id: 7a1e9c2d-5f4b-4c3a-8e2d-1b0a9f8e7d6c
                        session_number: 1003
                        face_retention_outcome: ineligible_no_vendor_user
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
                      - session_id: c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f
                        session_number: 1004
                        face_retention_outcome: failed_retryable
                        biometric_template_uuid: null
                        biometric_template_expires_at: null
                        deleted_child_verifications: 0
        '202':
          description: >-
            Lebih dari 20 sesi cocok. Sesi-sesi tersebut dihapus di latar
            belakang; lakukan polling pada `GET /v3/sessions/delete/{job_id}/`
            hingga `status` bernilai `COMPLETED` atau `FAILED`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionDeletionJob'
              examples:
                Job accepted:
                  value:
                    job_id: 5b8f2c1e-7d3a-4f6b-9e2c-1a0d8f7e6c5b
                    status: PENDING
                    total: 250
                    processed: 0
                    outcomes:
                      deleted: 0
                      none: 0
                      retained_with_user: 0
                      ineligible_no_vendor_user: 0
                      failed_retryable: 0
                      already_deleted: 0
                    deleted_child_verifications: 0
                    error: null
                    created_at: '2026-10-09T10:15:00Z'
                    completed_at: null
        '400':
          description: >-
            Kesalahan validasi — tidak ada yang dihapus. Nilai kesalahan adalah
            array string pesan dengan kunci berdasarkan nama kolom.
          content:
            application/json:
              schema:
                type: object
                properties:
                  session_numbers:
                    type: array
                    items:
                      type: string
                additionalProperties:
                  description: >-
                    Kunci lain: kunci `filter_*` yang bukan merupakan filter
                    Daftar Sesi (`"Unknown filter."`), atau kunci `filter_*`
                    yang nilainya tidak dapat dibaca (dikelompokkan berdasarkan
                    kunci `filter_*` tersebut, dengan larik pesan).
              examples:
                Missing selector:
                  summary: Baik session_numbers maupun delete_all tidak diberikan
                  value:
                    session_numbers:
                      - This field is required unless delete_all is true.
                Empty list:
                  summary: session_numbers adalah larik kosong
                  value:
                    session_numbers:
                      - This list may not be empty.
                Non-numeric entry:
                  summary: session_numbers berisi string non-digit
                  value:
                    session_numbers:
                      - All session_numbers must be numeric.
                Privacy erasure cannot retain:
                  summary: >-
                    deletion_instruction bernilai privacy_erasure yang
                    digabungkan dengan retain_face_embeddings bernilai true
                  value:
                    retain_face_embeddings:
                      - Privacy erasure cannot retain biometric templates.
                No finite retention duration:
                  summary: >-
                    Retensi diminta tanpa face_retention_days pada permintaan
                    atau aplikasi
                  value:
                    detail: >-
                      A finite biometric-template retention duration is
                      required.
                Unknown filter:
                  summary: Kunci filter_* yang tidak dimiliki oleh List Sessions
                  value:
                    filter_reviewer: Unknown filter.
                Unreadable filter value:
                  summary: Nilai filter yang tidak dapat dibaca
                  value:
                    filter_date_from:
                      - Enter a valid date.
        '403':
          description: >-
            Kunci API tidak ada. Kunci yang tidak ada mengembalikan `403`; kunci
            yang salah, dicabut, atau kedaluwarsa mengembalikan `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Missing or invalid API key:
                  summary: Tidak ada header x-api-key, atau kunci tidak valid
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            Sesi yang dipilih adalah bagian dari laporan regulasi yang telah
            difinalisasi. Tidak ada yang dihapus.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InFiledReportError'
        '429':
          description: >-
            Batas laju penulisan bersama terlampaui (300 permintaan
            POST/PATCH/DELETE per menit per kunci API). Periksa header respons
            `Retry-After` dan `X-RateLimit-*` sebelum mencoba lagi.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Rate limited:
                  summary: Anggaran penulisan habis
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST \
              https://verification.didit.me/v3/sessions/delete/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "session_numbers": ["1001", "1002", "1003"]
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.sessions.batch_delete(
                session_numbers=["1001", "1002", "1003"],
            )
            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.batchDelete({
              session_numbers: ["1001", "1002", "1003"],
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Sessions.BatchDelete(ctx, didit.SessionsBatchDeleteParams{\n\tSessionNumbers: didit.Some([]string{\"1001\", \"1002\", \"1003\"}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.List;

            import me.didit.Didit;

            import me.didit.types.SessionsBatchDeleteParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.sessions().batchDelete(SessionsBatchDeleteParams.builder()
                    .sessionNumbers(List.of("1001", "1002", "1003"))
                    .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->batchDelete([
                'session_numbers' => ['1001', '1002', '1003'],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            result = didit.sessions.batch_delete(session_numbers: ["1001",
            "1002", "1003"])

            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.BatchDeleteAsync(new
            SessionsBatchDeleteParams

            {
                SessionNumbers = new string[] { "1001", "1002", "1003" },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    SessionDeletionJob:
      type: object
      description: >-
        Penghapusan sesi massal yang berjalan di latar belakang: progres dan
        jumlah per hasil, tidak pernah menampilkan sesi mana saja yang
        dihapusnya.
      properties:
        job_id:
          type: string
          format: uuid
          description: Lakukan polling `GET /v3/sessions/delete/{job_id}/` dengan id ini.
        status:
          type: string
          enum:
            - PENDING
            - PROCESSING
            - COMPLETED
            - FAILED
          description: >-
            `PENDING`: diterima, belum dimulai. `PROCESSING`: sedang menghapus;
            `processed` dan `outcomes` sedang diperbarui. `COMPLETED`: setiap
            sesi yang dipilih telah ditangani. `FAILED`: pekerjaan berhenti
            lebih awal; lihat `error`.
        total:
          type: integer
          description: Sesi yang dipilih saat penghapusan diminta.
        processed:
          type: integer
          description: Sesi yang telah selesai diproses oleh pekerjaan sejauh ini.
        outcomes:
          type: object
          description: >-
            Berapa banyak sesi yang berakhir di setiap hasil. Setiap kunci
            selalu ada.
          properties:
            deleted:
              type: integer
              description: Sesi yang dihapus bersama dengan embedding wajahnya.
            none:
              type: integer
              description: Sesi yang dihapus yang tidak memiliki embedding wajah.
            retained_with_user:
              type: integer
              description: >-
                Sesi yang dihapus sementara satu templat biometrik bebas gambar
                dipertahankan untuk Pengguna mereka, sesuai permintaan atau
                kebijakan aplikasi.
            ineligible_no_vendor_user:
              type: integer
              description: >-
                Sesi yang dihapus, bersama dengan embedding wajahnya, karena
                retensi diminta tetapi mereka tidak memiliki Pengguna yang
                ditautkan.
            failed_retryable:
              type: integer
              description: >-
                Sesi yang dilaporkan belum dihapus. Pekerjaan mencoba lagi grup
                yang tidak dapat dihapusnya sendiri alih-alih menghitungnya di
                sini.
            already_deleted:
              type: integer
              description: >-
                Sesi terpilih yang sudah dihapus, misalnya oleh permintaan lain,
                ketika tugas mencapainya.
        deleted_child_verifications:
          type: integer
          description: >-
            Verifikasi yang dibuat oleh verifikasi bisnis yang dihapus, yang
            dihapus bersamanya. Selalu `0` untuk pekerjaan yang dimulai oleh
            `POST /v3/sessions/delete/`, yang hanya menghapus sesi KYC.
        error:
          type: string
          nullable: true
          description: >-
            `null` kecuali jika `status` bernilai `FAILED`; kemudian alasan
            mengapa penghapusan berhenti. Sesi yang belum tercapai oleh tugas
            masih tetap ada: ulangi permintaan untuk menghapusnya.
        created_at:
          type: string
          format: date-time
          description: Waktu ketika penghapusan diminta.
        completed_at:
          type: string
          format: date-time
          nullable: true
          description: Waktu pekerjaan selesai; `null` selama pekerjaan berjalan.
    InFiledReportError:
      type: object
      description: >-
        Penghapusan ditolak karena data yang dipilih berada dalam laporan
        regulasi yang telah diselesaikan. Tidak ada yang dihapus. Hapus laporan
        tersebut, lalu ulangi permintaan.
      required:
        - detail
        - code
      properties:
        detail:
          type: string
        code:
          type: string
          enum:
            - in_filed_report
          description: >-
            Kode kesalahan stabil untuk penghapusan yang diblokir oleh laporan
            regulasi yang telah difinalisasi.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: >-
            Laporan yang memblokir penghapusan orang, perusahaan, kasus, atau
            sesi.
        transactions:
          type: array
          items:
            $ref: '#/components/schemas/FiledReportTransaction'
          description: >-
            Transaksi yang memblokir penghapusan transaksi, masing-masing
            beserta laporan yang mencantumkannya.
    FiledRegulatoryReport:
      type: object
      description: Laporan regulasi yang sudah final mencegah penghapusan yang diminta.
      required:
        - uuid
        - report_number
        - report_type
        - case_uuid
      properties:
        uuid:
          type: string
          format: uuid
          description: UUID laporan.
        report_number:
          type: string
          description: Nomor laporan yang ditampilkan di Console (misalnya, SAR-0001).
        report_type:
          type: string
          enum:
            - SAR
            - STR
            - CTR
            - TTR
            - UTR
            - IFT
            - CBR
            - TFR
          description: Jenis laporan regulasi.
        case_uuid:
          type: string
          format: uuid
          description: Kasus tempat laporan ini bernaung.
    FiledReportTransaction:
      type: object
      description: >-
        Transaksi yang tidak dapat dihapus karena tercantum dalam laporan
        regulasi yang telah difinalisasi.
      required:
        - uuid
        - transaction_id
        - reports
      properties:
        uuid:
          type: string
          format: uuid
          description: UUID transaksi Didit.
        transaction_id:
          type: string
          description: Pengidentifikasi transaksi yang diberikan saat transaksi dibuat.
        reports:
          type: array
          items:
            $ref: '#/components/schemas/FiledRegulatoryReport'
          description: Laporan yang telah difinalisasi dan mencantumkan transaksi ini.
  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.