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

# Impor dan Ekspor Pengguna: Operasi Massal CSV

> Impor Pengguna vendor Didit secara massal dari CSV dan ekspor seluruh tabel pengguna untuk alat kepatuhan. Tersedia di Business Console.



Prompt Impor / Ekspor Pengguna Massal
        Salin prompt ke papan klip



      
      

\<pre>

\````# Goal — bulk-load (or extract) Didit User entities programmatically

CSV import / export is a console-only UI feature. For programmatic bulk operations, loop `POST /v3/users/create/` for imports, optionally upload trusted profile faces with `POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`, and paginate `GET /v3/users/` for exports. There is no public CSV API endpoint.

\## Bulk import — loop the create endpoint

\```bash
\# users.json — array of records you want to seed into Didit
\# [{"vendor_data":"user-1","display_name":"Alice"}, ...]

jq -c '.[]' users.json | while read user; do
curl -X POST https://verification.didit.me/v3/users/create/ \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d "$user"
sleep 0.1   # respect rate limits — see /integration/rate-limiting
done
\```

Record shape (matches `POST /v3/users/create/`):

\```json
\{
"vendor_data": "user-42",          // required, unique per app
"display_name": "Jane Doe",        // optional
"metadata": {"tier": "premium"},   // free-form JSON
"tags": ["promo-2026"]             // optional array of strings
}
\```

\`create` is **not** idempotent — a duplicate `vendor_data` returns conflict. Branch on existence:

\```bash
\# Idempotent upsert pattern
if curl -s -o /dev/null -w "%{http_code}" \
 https://verification.didit.me/v3/users/$VD/ \
 -H "x-api-key: $DIDIT_API_KEY" | grep -q 200; then
curl -X PATCH https://verification.didit.me/v3/users/$VD/ \
-H "x-api-key: $DIDIT_API_KEY" -H "Content-Type: application/json" \
-d "$BODY"
else
curl -X POST https://verification.didit.me/v3/users/create/ \
-H "x-api-key: $DIDIT_API_KEY" -H "Content-Type: application/json" \
-d "$BODY"
fi
\```

\## Import faces from another provider

If each imported user has a trusted face image, upload it after the User exists:

\```bash
\# GET /v3/users/{vendor_data}/ or POST /v3/users/create/ first.
\# Use the returned didit_internal_id for the profile attachment endpoint.
curl -X POST https://verification.didit.me/v3/organization/$ORGANIZATION_ID/application/$APPLICATION_ID/vendor-users/by-id/$DIDIT_INTERNAL_ID/faces/upload/ \
-H "x-api-key: $DIDIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"image": "<base64-encoded-jpg-or-png>", "comment": "Imported from previous KYC provider"}'
\```

This stores the face on the User profile and enrolls it for duplicate detection and face search. It does not blocklist the face; use /management-api/lists/upload-face for blocklists.

\## Bulk export — paginate the list endpoint

\```bash
PAGE=1
while :; do
RESP=$(curl -sG https://verification.didit.me/v3/users/ \
-H "x-api-key: $DIDIT_API_KEY" \
\--data-urlencode "page=$PAGE" \
\--data-urlencode "page_size=100")
echo "$RESP" | jq -c '.results[]' >> users.ndjson
HAS_NEXT=$(echo "$RESP" | jq -r '.next // empty')
\[ -z "$HAS_NEXT" ] && break
PAGE=$((PAGE+1))
done
\```

Filter with the same query params as `GET /v3/users/` (`status`, `search`, date ranges, etc).

\## What survives on update vs what stays

\| Field | Behaviour |
\|---|---|
\| `display_name`, `metadata`, `tags` | Overwritten by PATCH |
\| `full_name`, `date_of_birth`, `portrait_image` | Read-only after a verified session (you can override via PATCH but it's logged as a manual override) |
\| Aggregate counters (`session_count`, `approved_count`, etc.) | Computed by Didit — never accept writes |
\| `features` map | Computed — never accept writes |

\## Failure modes

\- `409` on create — `vendor_data` exists; switch to PATCH.
\- `429` — rate limit; back off using `Retry-After`. Don't slam the API; insert 100ms+ between calls.
\- `400` — bad JSON or invalid country/status enum. Log the row and continue.
\- Partial failures: track `vendor_data` → status per row and retry only failures.

\## Console fallback

For one-off migrations bigger than 100K rows, the Business Console CSV import/export (Users → Import / Export) is fast and skips writing your own loop. The console runs the same validations and produces an error report.

\## Sources of truth

\- /management-api/users/create — POST /v3/users/create/ schema
\- /management-api/users/list — GET /v3/users/ pagination + filters
\- /entities/users/data-model — mutable vs read-only fields
\- /integration/rate-limiting — rate limits and Retry-After
\- /integration/integration-prompt — canonical end-to-end prompt````

\</pre>



      
      

Tempel ke

Business Console memungkinkan tim Anda mengelola entitas User secara massal tanpa menulis kode. Ada dua alur yang didukung: **impor CSV** (membuat atau memperbarui pengguna dalam skala besar) dan **ekspor CSV** (mengekstrak tabel pengguna untuk alat eksternal).> [!NOTE]
>
> Impor dan ekspor massal di sini hanya membuat atau memperbarui profil Pengguna. Alur ini tidak membuat ulang sesi KYC historis, peringatan dokumen, bukti liveness, atau keputusan penyedia. Untuk migrasi penuh dari Sumsub, MetaMap, Veriff, Onfido, Persona, atau penyedia lain, lihat [Impor Data dari Penyedia Lain](https://docs.didit.me/id/sessions-api/import-verifications.md).## Impor pengguna dari CSV### Kapan digunakan- **Migrasi hari pertama** dari vendor KYC lain: pindahkan daftar pengguna yang sudah ada.
- **Migrasi wajah dari penyedia**: lampirkan gambar wajah tepercaya ke profil Pengguna yang diimpor setelah baris dibuat.
- **Onboarding massal** dari daftar pelanggan mitra.
- **Pengisian ulang metadata**: perbarui tag, tingkat, atau identifier internal pada banyak pengguna sekaligus.### Kolom templatUnduh templat dari *Users → Import → Download template*. Kolomnya:| Kolom | Wajib | Deskripsi |
| - | - | - |
| `vendor_data` | Ya | Identifier Anda untuk pengguna. Harus unik per aplikasi. |
| `display_name` | Tidak | Nama yang mudah dibaca, ditampilkan di konsol. |
| `full_name` | Tidak | Nama legal. Akan ditimpa oleh data dari sesi yang terverifikasi. |
| `email` | Tidak | Email kontak yang diketahui. |
| `phone` | Tidak | Nomor telepon kontak yang diketahui (format E.164). |
| `country` | Tidak | Kode negara ISO 3166-1 alpha-3. |
| `status` | Tidak | `ACTIVE`, `FLAGGED`, atau `BLOCKED`. Defaultnya `ACTIVE`. |
| `tags` | Tidak | Tag dipisahkan koma. |
| `metadata_json` | Tidak | JSON yang sudah diubah menjadi string untuk metadata kustom. |### Menjalankan impor**1. Unggah CSV**Buka *Users → Import → Upload CSV* lalu pilih berkas Anda.**2. Tinjau pratinjau**Konsol memvalidasi setiap baris. Baris yang tidak valid disorot beserta alasan error (misalnya `vendor_data` duplikat, kode negara tidak valid).**3. Mulai impor**Didit memproses baris secara asinkron. Anda dapat menutup tab. Progresnya dilacak di *Users → Import history*.**4. Tinjau hasil**Setelah impor selesai, tampilan riwayat menampilkan jumlah baris yang dibuat, diperbarui, dan dilewati, serta laporan error yang dapat diunduh.### Pembaruan vs pembuatan- Jika `vendor_data` belum ada, User baru akan dibuat.
- Jika `vendor_data` sudah ada, baris tersebut memperbarui User yang ada (kolom profil dan metadata).
- Penghitung agregat dan kolom terverifikasi (`full_name`, `date_of_birth` dari sesi yang disetujui) **tidak pernah ditimpa** oleh impor.### Impor wajah setelah pembuatan penggunaImpor CSV membuat atau memperbarui baris User. CSV tidak menyertakan gambar wajah. Untuk memindahkan biometrik wajah dari penyedia lain, unggah setiap wajah setelah User target sudah ada:**1. Buat atau impor User**Gunakan impor CSV di konsol, atau panggil [`POST /v3/users/create/`](https://docs.didit.me/id/management-api/users/create) dalam sebuah perulangan.**2. Baca didit\_internal\_id**Ambil User dengan [`GET /v3/users/{vendor_data}/`](https://docs.didit.me/id/management-api/users/get). Respons menyertakan `didit_internal_id`.**3. Unggah wajah**Panggil [`POST /v3/organization/{organization_id}/application/{application_id}/vendor-users/by-id/{didit_internal_id}/faces/upload/`](https://docs.didit.me/id/management-api/users/upload-face) dengan gambar wajah base64 mentah.```bash theme={null}
curl -X POST https://verification.didit.me/v3/organization/$ORGANIZATION_ID/application/$APPLICATION_ID/vendor-users/by-id/$DIDIT_INTERNAL_ID/faces/upload/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "image": "<base64-encoded-jpg-or-png>",
    "comment": "Imported from previous KYC provider"
  }'
```Wajah harus berupa gambar yang valid, maksimal 2 MB setelah didekode, dan memuat wajah yang dapat dideteksi. Didit menyimpannya pada profil dan mengindeksnya untuk deteksi duplikasi dan pencarian wajah. Wajah tidak ditambahkan ke daftar blokir wajah kecuali Anda secara terpisah menggunakan endpoint [Unggah wajah ke daftar](https://docs.didit.me/id/management-api/lists/upload-face.md).## Ekspor pengguna ke CSV### Kapan digunakan- **Audit kepatuhan**: serahkan seluruh tabel pengguna kepada auditor.
- **Sinkronisasi gudang data**: ekspor berkala ke alat BI Anda.
- **Permintaan SAR / regulator**: ekstrak subset pengguna yang sudah difilter.### Menjalankan ekspor1. Buka *Users → Export*.
2. Terapkan filter (status, negara, rentang tanggal, pencarian).
3. Pilih kolom (defaultnya semua kolom; Anda dapat menghapus kolom yang tidak diperlukan).
4. Kirim. Didit membuat ekspor secara asinkron dan mengirim tautan unduhan bertanda tangan ke email operator yang meminta.> [!NOTE]
>
> Ekspor hanya menyertakan data yang boleh dibaca oleh peran Anda. COMPLIANCE\_OFFICER dan peran di atasnya dapat mengekspor seluruh tabel. Peran DEVELOPER dan READER memiliki ekspor yang terbatas.## Karakteristik performa| Operasi | Skala umum | Catatan |
| - | - | - |
| Impor | Hingga 100,000 baris | File yang lebih besar dipecah di sisi server; progres dipantau secara berkala oleh UI |
| Ekspor | Hingga 1,000,000 baris | Ekspor yang lebih besar dialirkan ke S3 dan dikirim melalui URL bertanda tangan |## Jejak auditSetiap impor dan ekspor dicatat di [log audit](https://docs.didit.me/id/console/audit-logs.md):- Operator yang memicunya.
- Jumlah baris (impor) / snapshot filter (ekspor).
- Stempel waktu dan status berhasil atau gagal.## Langkah selanjutnya> [card] [API pembuatan pengguna](https://docs.didit.me/id/management-api/users/create.md)
>
> Pembuatan pengguna secara terprogram untuk impor berbasis skrip.> [card] [Unggah wajah pengguna](https://docs.didit.me/id/management-api/users/upload-face.md)
>
> Lampirkan gambar wajah yang diimpor ke profil User.> [card] [Retensi data](https://docs.didit.me/id/console/data-retention.md)
>
> Berapa lama data yang diimpor disimpan.> [card] [Log audit](https://docs.didit.me/id/console/audit-logs.md)
>
> Tinjau riwayat impor dan ekspor.


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