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

# Persetujuan biometrik untuk BIPA, CUBI, dan Colorado

> Kelola persetujuan biometrik sebelum swafoto di Illinois, Texas, dan Colorado dengan Didit: pemicu, SDK native 4.10.0, dan kolom keputusan.

Illinois (BIPA), Texas (CUBI), dan Colorado mewajibkan pemberitahuan dan pernyataan persetujuan eksplisit sebelum suatu bisnis mengumpulkan geometri wajah, baik dari swafoto maupun dari foto pada dokumen identitas. Didit dapat menampilkan langkah persetujuan sebelum pengambilan wajah pertama kepada orang-orang yang dicakup oleh undang-undang tersebut, dan menyimpan jawabannya pada sesi sebagai bukti.

Halaman ini menjelaskan kapan langkah tersebut muncul, aplikasi mana saja yang dapat menampilkannya, dan bagaimana jawaban tersebut diteruskan ke keputusan serta webhook Anda.

> [!WARNING]
>
> Didit menampilkan langkah ini dan mencatat jawabannya. Anda memutuskan apakah alur pengguna Anda memenuhi undang-undang biometrik yang berlaku untuk bisnis Anda. Halaman ini bukan merupakan nasihat hukum: tinjau implementasi Anda bersama penasihat hukum Anda.

## Kapan langkah ini muncul

Sesi akan menampilkan langkah persetujuan ketika kedua kondisi berikut terpenuhi:

1. **Alur kerja mengambil gambar wajah.** Langkah Deteksi Liveness, Pencocokan Wajah, atau Estimasi Usia, swafoto kamera depan yang diambil pada langkah Verifikasi Identitas (kecuali Anda menonaktifkannya), atau perekaman video sesi penuh.
2. **Mode persetujuan aplikasi memintanya.** Dalam mode **Otomatis**, salah satu [pemicu](#apa-yang-memicu-langkah-ini-dalam-mode-otomatis) di bawah ini berlaku. Dalam mode **Selalu**, setiap sesi yang mengambil gambar wajah akan memintanya.

Langkah ini muncul sebelum pengambilan wajah pertama. Jika hanya dokumen identitas yang menunjukkan negara bagian yang dicakup, langkah ini muncul tepat setelah pengambilan gambar dokumen identitas dan sebelum swafoto, dan tidak ada geometri wajah yang dihitung dari gambar yang diambil saat pengambilan dokumen identitas sampai orang tersebut menyetujuinya.

Didit memeriksa persyaratan ini saat pengguna membuka alur dan memeriksanya kembali di setiap langkah hingga persyaratan tersebut berlaku. Begitu sebuah sesi memerlukan persetujuan, sesi tersebut akan terus memerlukannya.

### Mode persetujuan

Pilih mode ini di konsol, pada **Settings > Data and privacy > Biometric consent** aplikasi. Setiap perubahan dicatat dalam [log audit](https://docs.didit.me/id/console/audit-logs.md).

| Mode | Apa yang terjadi |
| - | - |
| **Otomatis** (bawaan, disarankan) | Menampilkan langkah ini hanya jika [pemicu](#apa-yang-memicu-langkah-ini-dalam-mode-otomatis) berlaku. Pengguna lainnya melihat pemberitahuan standar satu baris. |
| **Selalu** | Setiap orang yang wajahnya diambil akan melihat langkah ini, di mana pun mereka berada. Dalam keputusan, tercatat `trigger: "forced"`. |
| **Tidak pernah** | Didit tidak pernah menampilkan langkah ini. Jika hukum negara bagian mewajibkan persetujuan, Anda mengumpulkannya sendiri sebelum swafoto dan menyimpan catatannya. |

### Apa yang memicu langkah ini dalam mode Otomatis

Didit memeriksa aturan-aturan ini secara berurutan dan mencatat aturan pertama yang berlaku di `biometric_consent.trigger`:

| Pemicu | Kapan berlaku |
| - | - |
| `declared_state` | Anda menyatakan negara bagian yang dicakup saat membuat sesi: `user_state`, atau alamat AS di `expected_details`. |
| `ip_state` | IP pengguna berlokasi di Illinois, Texas, atau Colorado. |
| `ip_unknown` | Pengguna terlihat berada di AS (IP AS, dokumen AS, atau detail AS yang Anda kirimkan) tetapi negara bagian mereka tidak dapat dipastikan: IP berada di AS tanpa informasi negara bagian, atau tidak dapat dilokalisasi sementara detail Anda atau dokumen menempatkan pengguna di AS. |
| `document_issuer` | Dokumen identitas yang dibaca saat pengambilan dokumen identitas diterbitkan oleh negara bagian yang dicakup. |

**VPN, proksi, dan jaringan hosting tidak memicu permintaan secara otomatis.** Didit melacak IP pengguna seperti IP lainnya: IP di Illinois, Texas, atau Colorado akan memunculkan langkah ini, sedangkan IP di tempat lain tidak. Langkah ini hanya diminta jika ada bukti jelas mengenai negara bagian yang dicakup (IP, negara bagian penerbit identitas, atau negara bagian yang Anda nyatakan), atau saat pengguna berada di AS tanpa diketahui negara bagiannya (`ip_unknown`). Pengguna di negara bagian yang dicakup yang berada di balik VPN dengan node keluar di tempat lain, serta menggunakan tanda pengenal yang bukan diterbitkan oleh negara bagian yang dicakup, tidak akan dimintai persetujuan; gunakan mode **Selalu**, atau kirimkan `user_state`, jika Anda perlu mencakup kasus tersebut.

Dua nilai lainnya menjelaskan bagaimana persetujuan sesi diselesaikan, alih-alih mengapa persetujuan tersebut diminta:

| Pemicu | Arti |
| - | - |
| `forced` | Mode aplikasi adalah **Selalu**. |
| `customer_collected` | Anda mengirimkan persetujuan yang telah Anda kumpulkan sebelumnya saat membuat sesi (lihat di bawah). |

## Beri tahu Didit apa yang sudah Anda ketahui

[Create Session](https://docs.didit.me/id/sessions-api/create-session.md) menerima dua kolom opsional untuk hal ini:

| Kolom | Fungsinya |
| - | - |
| `user_state` | Lokasi tempat tinggal pengguna, jika Anda mengetahuinya: kode subdivisi ISO 3166-2 (`US-IL`, `ES-M`) atau kode maupun nama negara bagian AS (`IL`, `Illinois`). Negara bagian yang dicakup akan menampilkan langkah ini dengan `trigger: "declared_state"`. Nilai yang tidak dikenal mengembalikan respons `400`. |
| `biometric_consent` | Persetujuan yang telah Anda kumpulkan sebelumnya: `{ "given_at": "<ISO 8601>", "text_version": "<your version id>" }`. Alur tidak akan meminta persetujuan lagi, dan dalam keputusan, tercatat `status: "given"` dengan `trigger: "customer_collected"`. `given_at` tidak boleh berada di masa depan. |

```json theme={null}
{
  "workflow_id": "YOUR_WORKFLOW_ID",
  "vendor_data": "user-42",
  "user_state": "US-IL",
  "biometric_consent": {
    "given_at": "2026-10-13T09:12:00Z",
    "text_version": "consent-v3"
  }
}
```

## Aplikasi mana yang menampilkan langkah ini

Langkah ini memerlukan aplikasi yang dapat menampilkannya. Didit memutuskan hal ini pada setiap permintaan yang dibuat aplikasi:

| Tempat verifikasi pengguna | Menampilkan langkah ini |
| - | - |
| Alur verifikasi yang di-hosting: browser, [Web SDK](https://docs.didit.me/id/integration/web-sdks/overview.md), atau WebView | Ya |
| [Native SDK](https://docs.didit.me/id/integration/native-sdks/overview.md) 4.10.0 atau lebih baru (iOS, Android, serta rilis React Native atau Flutter yang memaketkan native 4.10.0 atau lebih baru) | Ya |
| Native SDK di bawah 4.10.0, atau yang tidak melaporkan versinya | Tidak |

### Native SDK di bawah 4.10.0

Native SDK yang dirilis sebelum 4.10.0 tidak mengenali langkah persetujuan, sehingga Didit tidak pernah memintanya. Verifikasi berjalan persis seperti sebelumnya: swafoto dan pengambilan wajah lainnya diterima serta diproses, dan sesi mencapai keputusannya seperti biasa.

Didit tidak pernah mencatat persetujuan yang tidak diberikan. Ketika sesi memerlukan persetujuan dan SDK versi lama mengambil wajah, keputusan menampilkan:

```json theme={null}
"biometric_consent": {
  "required": true,
  "trigger": "ip_state",
  "status": "pending",
  "given_at": null,
  "reason": "BIOMETRIC_CONSENT_UNSUPPORTED_SDK"
}
```

> [!WARNING]
>
> **Tingkatkan ke native SDK 4.10.0 atau lebih baru jika Anda memverifikasi orang di Illinois, Texas, atau Colorado dalam aplikasi native.** Hingga Anda melakukannya, sesi tersebut akan selesai tanpa persetujuan eksplisit, dan mengumpulkannya sebelum pengambilan swafoto adalah tanggung jawab Anda.

Jika pengguna melanjutkan sesi yang sama di alur yang di-hosting (pada perangkat lain, atau di WebView yang dibuka aplikasi untuk beberapa tipe liveness), alur yang di-hosting akan menampilkan langkah ini dan tidak mengambil wajah apa pun di sana hingga mereka menjawab. Persetujuan yang diberikan di sana tetap memiliki `reason: "BIOMETRIC_CONSENT_UNSUPPORTED_SDK"`, karena wajah sudah diambil tanpa persetujuan tersebut.

## Apa yang dilihat pengguna

Langkah ini memberi tahu pengguna apa yang dikumpulkan, alasannya, siapa yang memilikinya, dan berapa lama data tersebut disimpan, serta menautkan ke [Kebijakan data biometrik](https://didit.me/legal/biometric-data-policy). Langkah ini memiliki satu tombol: **Setuju dan lanjutkan**, yang tetap dinonaktifkan hingga pengguna mencentang kotak persetujuan.

Didit menyimpan jawaban tersebut sebagai bukti: kapan jawaban diberikan, versi dan hash dari teks yang ditampilkan, bahasa, langkah alur kerja, serta IP, lokasi, dan user agent dari permintaan tersebut. Setelah pengguna setuju, jawaban bersifat final.

## Ketika pengguna tidak setuju

Langkah ini tidak memiliki tombol tolak. Pengguna yang tidak ingin setuju akan keluar dari alur: tidak ada wajah yang diambil, dan sesi berakhir sebagai `Abandoned` seperti sesi lain yang tidak diselesaikan pengguna (lihat [Status verifikasi](https://docs.didit.me/id/integration/verification-statuses.md)). Tawarkan cara lain kepada mereka untuk melakukan verifikasi.

### Persetujuan yang ditolak di API

Keputusan menyimpan status `declined` dan alasan `BIOMETRIC_CONSENT_DECLINED` sebagai nilai API. Tidak ada layar Didit yang menawarkan opsi penolakan saat ini, sehingga alur yang di-hosting dan native SDK tidak mencatat penolakan tersebut. Sesi yang mencatat penolakan:

* Berakhir sebagai `Declined`, dan webhook `status.updated` terpicu seperti pada penolakan lainnya.
* Menampilkan `biometric_consent.status` sebagai `declined`, `reason` dan `decline_reason` sebagai `BIOMETRIC_CONSENT_DECLINED`, serta `declined_at` beserta waktunya.
* Tidak mengambil wajah setelah penolakan. Setiap gambar wajah dan templat wajah yang telah disimpan oleh sesi akan dihapus: swafoto, swafoto kamera depan saat pengambilan ID, pemotongan wajah dari potret dokumen, video liveness, dan video sesi lengkap. `face_data_deleted_at` mencatat waktu penghapusan tersebut. Keputusan tidak lagi mengembalikannya, dan penghapusan ini tidak dapat dibatalkan.
* Menyimpan gambar dokumen dan data yang dibaca dari dokumen tersebut: penolakan tidak memengaruhinya.

## Dalam keputusan dan webhook

Setiap keputusan Verifikasi Pengguna memuat objek `biometric_consent`, dalam [Ambil Sesi](https://docs.didit.me/id/sessions-api/retrieve-session.md) dan dalam `decision` dari [webhook sesi](https://docs.didit.me/id/integration/webhooks.md). Objek ini bernilai `null` jika sesi tidak pernah dievaluasi, misalnya alur kerja tanpa pengambilan wajah.

| `status` | Arti |
| - | - |
| `not_required` | Sesi tidak memerlukan persetujuan. |
| `pending` | Persetujuan diperlukan dan belum diberikan. Baca `reason` untuk membedakan antara SDK versi lama dan pengguna yang belum menjawab. |
| `given` | Pengguna menyetujuinya dalam alur, atau Anda mengirim `biometric_consent` saat pembuatan. |
| `declined` | Penolakan tercatat, dan sesi berakhir sebagai `Declined`. Tidak ada layar Didit yang menawarkan opsi penolakan saat ini (lihat [di atas](#persetujuan-yang-ditolak-di-api)). |

| `reason` | Arti |
| - | - |
| `BIOMETRIC_CONSENT_UNSUPPORTED_SDK` | Native SDK di bawah 4.10.0, atau yang tidak melaporkan versinya, mengambil wajah tanpa langkah ini. |
| `BIOMETRIC_CONSENT_DECLINED` | Penolakan tercatat. Tidak ada layar Didit yang menawarkan opsi penolakan saat ini. |
| `null` | Tidak ada yang perlu dijelaskan. Selalu `null` jika sesi tidak memerlukan persetujuan. |

Sesi tempat pengguna setuju dalam alur yang di-hosting:

```json theme={null}
"biometric_consent": {
  "required": true,
  "trigger": "declared_state",
  "status": "given",
  "given_at": "2026-10-13T18:31:07.412000Z",
  "declined_at": null,
  "text_version": "bio-consent-2026-10-12",
  "locale": "en",
  "policy_url": "https://didit.me/legal/biometric-data-policy",
  "step": "LIVENESS",
  "ip_address": "198.51.100.23",
  "ip_country_code": "ES",
  "detected_ip_address": "198.51.100.23",
  "detected_country_code": "ES",
  "jurisdictions": ["IL"],
  "retention_months": 36,
  "reason": null,
  "decline_reason": null,
  "face_data_deleted_at": null
}
```

Contoh ini disingkat. Setiap kolom, beserta tipenya, ada di [Model data](https://docs.didit.me/id/reference/data-models.md#persetujuan-biometrik).

## Terkait

* [Buat Sesi](https://docs.didit.me/id/sessions-api/create-session.md): `user_state` dan `biometric_consent`.
* [Ambil Sesi](https://docs.didit.me/id/sessions-api/retrieve-session.md): keputusan yang memuat `biometric_consent`.
* [Native SDK](https://docs.didit.me/id/integration/native-sdks/overview.md): versi dan langkah pembaruan.
* [Keamanan dan kepatuhan](https://docs.didit.me/id/getting-started/security-compliance.md): tanggung jawab Anda dalam alur verifikasi.


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