Langsung ke konten utama
POST
cURL
Gunakan endpoint ini untuk membuat alur kerja melalui API tanpa perlu membangun node graf alur kerja sendiri. Kirim array features sesuai urutan pengguna harus menyelesaikan pemeriksaan tersebut. Didit mengubahnya menjadi alur kerja berbasis node secara internal dan menambahkan langkah status akhir secara otomatis. Endpoint POST /v3/workflows/ ini hanya membuat alur kerja sederhana dan linear, yaitu daftar features yang datar. Untuk percabangan, perutean kondisional, Document AI, serta node keputusan dan penolakan, gunakan format graf yang dijelaskan di bawah. Format ini digunakan oleh pembangun visual di konsol dan alat alur kerja Didit MCP. Lihat Konfigurasi Fitur Alur Kerja untuk setiap kolom config yang diterima oleh setiap fitur.

Alur kerja KYC dasar

Alur kerja kuesioner

Pertama, buat kuesioner dengan POST /v3/questionnaires/. Kemudian gunakan questionnaire_id yang dikembalikan sebagai questionnaire_uuid.
Urutan fitur itu penting. Misalnya, tempatkan OCR sebelum FACE_MATCH, NFC, DATABASE_VALIDATION, atau pemeriksaan AML pengguna yang bergantung pada data dokumen.

Referensi konfigurasi fitur

Setiap item features[] memiliki bentuk berikut:
Objek config yang tepat bergantung pada fiturnya. Tinjau daftar kolom lengkap, nilai default, pengaturan wajib, rentang nilai, dan contoh di Konfigurasi Fitur Alur Kerja. Untuk OCR, hilangkan config.documents_allowed, kirim null, atau kirim {} untuk mengizinkan semua jenis dokumen yang didukung. Sertakan kolom ini hanya jika Anda ingin membatasi alur kerja ke negara atau jenis dokumen tertentu. Untuk QUESTIONNAIRE, config.questionnaire_uuid wajib diisi.

Pengaturan alur kerja opsional

Anda dapat menyertakan kolom tingkat atas mana pun berikut saat membuat alur kerja untuk mengontrol perilaku sesi. Semua kolom ini bersifat opsional dan akan menggunakan nilai default alur kerja jika dihilangkan.

Percabangan & alur kerja berbasis node (graf)

Daftar features yang linear tidak dapat menyatakan “jika X maka Y”. Untuk percabangan bersyarat (menolak berdasarkan status, mengarahkan berdasarkan kolom yang diekstrak, menahan langkah berdasarkan kecocokan), langkah permintaan Document AI, atau node akhir penolakan/keputusan, alur kerja Didit menggunakan graf node, yaitu struktur yang sama dengan yang dihasilkan pembangun visual di konsol.
Cara paling sederhana membuat alur kerja berbasis graf adalah melalui Didit MCP: minta agen dengan bahasa biasa (“setelah Verifikasi Identitas, jika profesi ≈ ‘Software Engineer’, tambahkan langkah bukti dana”), dan agen akan membangun, memvalidasi, serta menyimpan graf untuk Anda. Struktur di bawah ini adalah yang dihasilkan oleh alat-alat tersebut (dan konsol).

Bentuk graf

Graf berbentuk { start_node, nodes }. nodes adalah peta dari id node ke node. Sisi bersifat implisit: setiap node menunjuk ke depan melalui next (tanpa syarat) dan/atau branches[].goto (bersyarat). start_node harus berupa node fitur. Cabang dievaluasi secara berurutan, kecocokan pertama berlaku; rules: [] yang kosong adalah “else” penangkap semua (letakkan di urutan terakhir). session_status: "Determine" memutuskan secara otomatis dari gabungan hasil fitur.
Setiap node cabang wajib memiliki cabang else yang eksplisit: cabang dengan rules: [] yang menangani sesi yang tidak cocok dengan kondisi mana pun. Jangan mengandalkan next pada node cabang sebagai cadangan. next yang berdiri sendiri ditampilkan sebagai edge yang ambigu di pembangun dan mudah terlewat. Saat Anda mengirim node cabang dengan next tetapi tanpa cabang else, API akan mengubah next tersebut menjadi cabang else eksplisit untuk Anda (sehingga { …, "branches": [<conditions>], "next": "liveness" } disimpan sebagai branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). Buat else sendiri agar eksplisit. Konversi tersebut hanyalah jaring pengaman, bukan pengganti.

Aturan cabang & operator

Setiap aturan membandingkan kolom dengan nilai menggunakan operator:
  • Kolom menyebutkan hasil fitur (kyc.status, aml.status, document_ai.status, face_match.score, …) atau nilai yang diekstrak (kyc.full_name, kyc.age, kyc.nationality, kyc.extra_fields.profession, kolom Document AI document_ai.<key>, expected_details.*). Cabang hanya boleh membaca kolom yang fiturnya telah dijalankan pada setiap jalur yang menuju ke cabang tersebut.
  • Operator: equals, not_equals, greater_than(_or_equals), less_than(_or_equals), contains, not_contains, in, not_in, is_empty, is_not_empty, regex, dan fuzzy_match (hanya untuk kolom string; memerlukan score 0–100, yaitu ambang kemiripan, misalnya profesi ≥ 80% mirip dengan “Software Engineer”).

Cabang berdasarkan alasan NFC tidak dijalankan

Setelah node NFC, gunakan nfc.skip_reason dengan equals atau in untuk mengarahkan sesi berdasarkan alasan pembacaan chip tidak dilakukan. Kolom ini memiliki tujuh nilai tetap berikut:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
Lihat Alasan NFC dilewati untuk arti setiap nilai. Saat NFC berhasil, nfc.skip_reason bernilai null, sehingga aturan equals maupun in untuk alasan dilewati tidak akan cocok. Kolom ini juga memiliki nilai untuk node NFC yang dilewati oleh gerbang. Ini mencakup kasus ketika tidak ada laporan atau peringatan NFC, dan kasus ketika allow_nfc_skip bernilai false tetapi gerbang dokumen atau perangkat mencegah NFC dijalankan. Dengan demikian, Anda dapat mengarahkan sesi-sesi ini tanpa bergantung pada entri nfc_verifications[].
Sesi yang disimpan sebelum kapabilitas NFC menjadi tiga status dapat memiliki has_device_nfc_support: false. Sesi web lama karena itu dapat ditentukan sebagai DEVICE_WITHOUT_NFC, bukan INTEGRATION_WITHOUT_NFC_ACCESS.
Graf ini menggunakan equals untuk NFC yang dilewati pengguna, in untuk NFC yang dilewati akibat gerbang atau kapabilitas, dan else eksplisit untuk NFC yang berhasil. Cabang berada setelah node NFC, dan setiap tujuan menunjuk ke depan ke node akhir:
Untuk menyatakan “NFC tidak dilakukan karena alasan apa pun yang diketahui”, gunakan in dengan ketujuh nilai. Pertahankan cabang else eksplisit untuk NFC yang berhasil (nfc.skip_reason: null) serta nilai baru di masa depan yang belum dikenali oleh graf Anda.

Document AI (misalnya bukti dana)

Node fitur DOCUMENT_AI meminta satu atau beberapa dokumen dan mengekstrak kolom bernama:
Setiap kolom yang dikonfigurasi menjadi nilai yang dapat dicabangkan document_ai.<key>, dan hasil langkah ini adalah document_ai.status. Atur "is_full_name": true pada kolom yang memuat nama lengkap pemegang dokumen. Nilai yang diekstrak dibandingkan dengan nama lengkap identitas yang terverifikasi (nama dari OCR/verifikasi ID, atau detail yang diharapkan dari sesi), dan document_ai_name_mismatch_action menentukan apa yang terjadi jika ada ketidakcocokan di bawah document_ai_name_match_score_threshold. Penanda ini opsional: sebuah dokumen boleh tidak menandai kolom apa pun, dan paling banyak satu kolom per dokumen boleh mengaturnya. Lihat Konfigurasi fitur alur kerja → Document AI untuk setiap kolom konfigurasi Document AI.

Endpoint & siklus hidup draf

Pengeditan graf dilakukan per aplikasi dan menggunakan endpoint konsol/manajemen (Bearer pengguna + read:workflows/write:workflows). Graf hanya dapat diedit pada versi draf, sehingga siklus hidupnya adalah buat draf → atur graf → publikasikan:

Peringatan validasi

Endpoint validate mengembalikan { "is_valid": true, "graph": …, "warnings": [] }. Peringatan bersifat anjuran: graf tetap valid, dapat disimpan, dan dapat dipublikasikan meskipun ada peringatan. Setiap entri memuat node cabang dan jalur yang dimaksud, sehingga pembuat alur dapat menunjuk ke kondisi yang tepat:
Graf yang tidak valid mengembalikan 400 dengan daftar errors dan daftar warnings sebisanya. Hanya errors yang menghalangi penyimpanan.

Contoh: arahkan Software Engineers ke bukti dana

Setelah verifikasi identitas: jika hasilnya ditolak, tolak sesi; jika profesi pemegang ≈ “Software Engineer” (kemiripan minimal 80%), minta dokumen bukti dana; lalu buat keputusan akhir.
Node akhir menggunakan session_status: "Determine", yang memutuskan secara otomatis (disetujui / ditolak / dalam peninjauan) berdasarkan fitur yang benar-benar dijalankan pada sesi. Dengan begitu, jalur bukti dana maupun jalur else terselesaikan dengan benar, tanpa cabang mana pun yang membaca document_ai.status (kolom yang tidak ada pada jalur yang tidak menjalankan Document AI). Perlu diingat: cabang hanya boleh membaca kolom yang fiturnya dijalankan pada setiap jalur yang menuju cabang tersebut. Kirim sebagai { "graph": <above> } ke endpoint …/workflow-graph/ (validasi dulu). Untuk membangun alur baru dari awal, gunakan didit_workflow_set_graph pada MCP. Untuk mengubah alur yang sudah ada, gunakan didit_workflow_edit_graph (operasi kecil yang mempertahankan node dan allow-list yang sudah ada). Lihat Didit MCP.

Otorisasi

x-api-key
string
header
wajib

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.

Body

application/json

Buat alur kerja linier sederhana. API mengonversi daftar fitur ini menjadi graf alur kerja berbasis node secara internal. Daftar kolom yang diizinkan secara KETAT: kunci apa pun yang tidak tercantum di sini (termasuk workflow_type) akan ditolak dengan 400.

features
object[]
wajib

Fitur verifikasi dalam urutan eksekusi. API menautkan setiap item ke item berikutnya dan menambahkan satu node status akhir secara otomatis.

Minimum array length: 1
workflow_label
string
default:ID Verification

Nama tampilan untuk alur kerja (maksimal 50 karakter). Secara default bernilai "ID Verification" jika ditiadakan — selalu atur agar alur kerja tetap dapat dibedakan.

Maximum string length: 50
Contoh:

"Standard KYC"

is_default
boolean

Atur alur kerja ini sebagai default untuk sesi baru.

status
enum<string>

Kosongkan kolom ini untuk membuat alur kerja yang dipublikasikan dan siap digunakan untuk sesi. Gunakan draft hanya jika Anda ingin menyimpan tanpa mempublikasikannya.

Opsi yang tersedia:
draft,
published
is_white_label_enabled
boolean
default:false

Aktifkan kustomisasi White Label untuk sesi yang dibuat dengan alur kerja ini.

is_desktop_allowed
boolean
default:false

Izinkan alur verifikasi berjalan di browser desktop.

max_retry_attempts
integer
default:3

Upaya coba lagi maksimum yang diizinkan setelah verifikasi yang ditolak. 0 memblokir pengguna setelah penolakan pertama.

Rentang yang diperlukan: 0 <= x <= 10
retry_window_days
integer | null
default:7

Jendela bergulir dalam hitungan hari yang digunakan untuk menghitung percobaan ulang. null memberlakukan batas sepanjang masa.

Rentang yang diperlukan: 1 <= x <= 365
face_liveness_max_attempts
integer
default:3

Pengiriman deteksi liveness maksimum per sesi. Default 3: satu upaya awal ditambah dua percobaan ulang. Nilai ini juga disalin ke dalam node alur kerja deteksi liveness dan estimasi usia yang dibuat kecuali ditimpa oleh konfigurasi tingkat fitur.

Rentang yang diperlukan: 1 <= x <= 3
face_match_max_attempts
integer
default:3

Pengiriman pencocokan wajah maksimum per sesi. Default 3: satu upaya awal ditambah dua percobaan ulang. Nilai ini juga disalin ke dalam node alur kerja pencocokan wajah yang dibuat kecuali ditimpa oleh konfigurasi tingkat fitur.

Rentang yang diperlukan: 1 <= x <= 3
session_expiration_time
integer
default:604800

Detik sebelum sesi yang belum selesai kedaluwarsa. Minimum 1 jam (3600), maksimum 4 minggu (2419200).

Rentang yang diperlukan: 3600 <= x <= 2419200

Respons

Alur kerja dibuat. Badan respons adalah konfigurasi LENGKAP alur kerja — serialisasi mentah VerificationSettings yang sama seperti yang dikembalikan oleh GET /v3/workflows/{settings_uuid}/ (~190 kolom: setiap pengalih fitur, ambang batas, tindakan, dan workflow_graph yang dihasilkan), bukan item daftar ringkas. Simpan uuid (juga ditampilkan sebagai workflow_id) agar Anda dapat mereferensikannya dari panggilan pembuatan sesi berikutnya. Catatan: features berupa string yang digabungkan dengan " + " dan harga berupa angka JSON.

Kolom di bawah ini memiliki tipe; objek ini juga memuat setiap kolom lain dari konfigurasi alur kerja (pengalih fitur, ambang batas, tindakan peringatan, dokumen yang diizinkan, callback) sebagai properti tambahan. Kolom yang tidak berlaku untuk workflow_type bernilai null.

uuid
string<uuid>

Pengidentifikasi per versi (settings_uuid). Setiap versi alur kerja memiliki pengidentifikasi tersendiri.

workflow_id
string<uuid>

Pengidentifikasi stabil yang digunakan bersama oleh setiap versi alur kerja. Sesi yang dibuat dengannya menggunakan versi terbaru yang dipublikasikan.

workflow_label
string

Nama tampilan alur kerja.

workflow_type
enum<string> | null

Templat alur kerja. null untuk alur kerja graf yang dibuat tanpa templat.

Opsi yang tersedia:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

Apakah ini merupakan alur kerja default aplikasi.

is_archived
boolean

Alur kerja yang diarsipkan tidak dapat memulai sesi baru.

version
integer

Nomor versi dalam alur kerja.

status
enum<string>

Versi draf dapat diedit; versi yang dipublikasikan bersifat tidak dapat diubah dan digunakan untuk sesi baru.

Opsi yang tersedia:
draft,
published
published_at
string<date-time> | null

Kapan versi ini dipublikasikan. null untuk draf.

is_simple_workflow
boolean

true saat alur kerja tidak memiliki workflow_graph khusus.

is_editable
boolean

true hanya untuk versi draft.

workflow_url
string<uri>

URL publik yang memulai sesi dengan alur kerja ini.

workflow_graph
object | null

Struktur graf alur kerja (node dan edge). null untuk alur kerja sederhana.

features
string

Fitur yang diaktifkan digabungkan dengan " + ", misalnya "OCR + LIVENESS".

total_price
number | null

Harga per sesi; untuk alur kerja graf, merupakan jalur termahal.

min_price
number | null

Harga jalur termurah melalui alur kerja.

max_price
number | null

Harga jalur termahal melalui alur kerja.

special_add_on_prices
object | null

Harga add-on khusus organisasi, atau null jika tidak ada yang diatur.

max_retry_attempts
integer

Jumlah coba lagi yang diizinkan setelah verifikasi ditolak.

retry_window_days
integer | null

Jumlah hari selama percobaan ulang diizinkan.

session_expiration_time
integer

Detik sebelum sesi yang belum selesai kedaluwarsa.

questionnaire
object | null

Kuesioner yang dilampirkan pada alur kerja, atau null.

kyb_role_settings
object[]

Pengaturan verifikasi per peran untuk pihak kunci KYB.

created_at
string<date-time>
updated_at
string<date-time>
signature_availability
object

Tingkat Tanda Tangan Elektronik mana yang dapat digunakan untuk menandatangani saat ini. Periksa ini sebelum Anda menyetel signature_level. Dikembalikan pada alur kerja kyc, kyb, dan graf.

is_bank_verification_enabled
boolean

Menentukan apakah alur kerja KYC atau KYB sederhana menjalankan verifikasi Bank. Verifikasi ini berjalan setelah langkah kontak (dan verifikasi Lokasi) dan sebelum validasi database, AML, serta analisis IP. Verifikasi Bank belum tersedia secara umum: mengaktifkannya ditolak di mana pun fitur ini belum diaktifkan.

bank_verification_config
object

Pengaturan verifikasi bank dari alur kerja sederhana, dengan kunci yang sama seperti yang diterima node BANK_VERIFICATION (misalnya bank_countries dan bank_method_order). Kunci yang tidak dikenal akan dibuang. Setiap kunci bersifat opsional dan kunci yang tidak ada akan menggunakan nilai default-nya, sehingga {} berarti semua nilai default. Lihat Pengaturan verifikasi bank.

Contoh:
is_geolocation_enabled
boolean

Menentukan apakah alur kerja KYC sederhana menjalankan verifikasi Lokasi. Verifikasi ini berjalan setelah langkah kontak dan sebelum verifikasi Bank serta validasi database. Alur kerja Bisnis (KYB) tidak dapat menjalankannya.

geolocation_config
object

Pengaturan verifikasi lokasi dari alur kerja sederhana, dengan kunci yang sama seperti yang diterima node GEOLOCATION (misalnya is_geolocation_geofencing_enabled dan geolocation_max_attempts). Kunci yang tidak dikenal akan diabaikan. Setiap kunci bersifat opsional dan kunci yang tidak ada akan menggunakan nilai default-nya, sehingga {} berarti semua nilai default.

Contoh:
Terakhir diubah pada 7 November 2026