
Mencocokkan selfie dengan foto KTP dalam satu panggilan
Di aplikasi fintech atau e-wallet, pendaftar baru biasanya mengunggah foto KTP lalu mengambil selfie, dan kamu perlu memastikan selfie itu memang wajah orang yang sama dengan foto di KTP-nya. API face match KTP dari api.co.id menjawabnya dalam satu api call ke POST /face-match/verify. Kamu tinggal mengirim dua gambar sebagai multipart/form-data, foto KTP di image1 dan selfie di image2, lalu sistem akan mengembalikan data.match (true/false) dan data.confidence (skor 0.0 sampai 1.0). Dengan biaya Rp400 untuk setiap verifikasi yang berhasil, kamu sudah bisa mencocokkan wajah pendaftar, dan kamu cukup punya API key plus saldo tanpa harus lolos KYC Standard seperti endpoint verifikasi Dukcapil.
Beda face match, liveness detection, dan OCR KTP
Face matching menjawab satu pertanyaan: apakah dua wajah ini orang yang sama. Ini berbeda dari liveness detection yang memastikan ada orang hidup di depan kamera saat berfoto, dan berbeda juga dari OCR KTP yang membaca teks di foto KTP lalu mengembalikan data yang tertulis. Jadi kalau yang kamu butuhkan hanya mencocokkan selfie dengan foto KTP, face match inilah jawabannya. untuk memastikan orangnya hidup, itu pekerjaan liveness detection yang berdiri sendiri. Karena face match cuma membandingkan dua wajah, kamu juga bisa memakainya untuk mencocokkan dua selfie, tidak terbatas pada pasangan KTP dan selfie.
Prasyarat: API key dan saldo, tanpa KYC Standard
Yang kamu butuhkan sebelum panggilan pertama cuma dua hal: API key dan saldo. untuk menggunakan api ini kamu tidak perlu lolos KYC Standard terlebih dulu seperti saat memakai verifikasi KTP ke Dukcapil. Langkahnya singkat:
- Daftar atau masuk di
dashboard.api.co.id - Mengaktifkan produk Face Matching, lalu membuat API key di halaman credentials
- Melakukan top up saldo lewat menu “Top Up Balance”, minimum Rp50.000
Saldo masuk sebagai points dengan 1 point setara Rp1, dan modelnya bayar sesuai pemakaian (pay as you go) tanpa kuota gratis. API key inilah yang kamu pasang di header x-api-co-id pada setiap panggilan, jadi simpan nilainya di tempat yang aman.
Menyiapkan dua gambar: foto KTP dan selfie
Kedua gambar kamu ambil dari form onboarding di aplikasimu, yaitu foto KTP yang user unggah dan selfie yang ia ambil saat itu. Keduanya berasal dari unggahan user, tidak dari API lain, jadi tidak ada panggilan yang perlu kamu jalankan lebih dulu. Inti request ada di dua field file berikut:
| Field | Isi | Wajib | Catatan |
|---|---|---|---|
image1 |
foto KTP | wajib | JPG, JPEG, atau PNG, maksimal 5 MB |
image2 |
selfie | wajib | JPG, JPEG, atau PNG, maksimal 5 MB |
Pastikan wajah terlihat jelas di kedua foto sebelum kamu kirim, karena API menolak gambar yang tidak memuat wajah sebelum verifikasi berjalan.
Memanggil API face match KTP lewat POST /face-match/verify
Begitu kedua gambar siap, kamu tinggal mengirimnya ke host production use.api.co.id. Kirim dengan metode POST ke /face-match/verify, pasang header x-api-co-id berisi API key, dan kirim body sebagai multipart/form-data karena ada file di dalamnya. Contoh di bawah memakai foto milik seorang pendaftar bernama panggilan Dewi.
curl -X POST https://use.api.co.id/face-match/verify \
-H "x-api-co-id: YOUR_API_KEY" \
-F "image1=@ktp-dewi.jpg" \
-F "image2=@selfie-dewi.jpg"
Ganti YOUR_API_KEY dengan key dari dashboard, dan arahkan kedua path file ke gambar yang benar di servermu. Kalau request-nya benar, kamu dapat balasan sukses yang strukturnya kita bahas di bagian berikut.
Diagram alur request sampai keputusan
Alurnya berjalan satu arah: user mengunggah foto KTP dan selfie, backend-mu memanggil POST /face-match/verify, API membalas dengan match dan confidence, lalu aplikasimu memakai hasil itu untuk memilih antara meloloskan pendaftar atau mengirimnya ke review manual.

Membaca match dan confidence
Respons sukses punya tiga bagian, yaitu is_success, message, dan data. Untuk foto Dewi yang cocok, balasannya seperti ini:
{ "is_success": true, "message": "Success", "data": { "match": true, "confidence": 0.95 } }
Kalau selfie yang kamu kirim ternyata wajah orang lain, strukturnya sama tetapi hasilnya berbeda:
{ "is_success": true, "message": "Success", "data": { "match": false, "confidence": 0.35 } }
Keputusan lolos atau tidak kamu ambil dari data.match, sedangkan data.confidence kamu pakai sebagai skor pendukung, misalnya untuk menandai kasus yang skornya di tengah supaya masuk review. Respons publik hanya mengembalikan match dan confidence, jadi perlakukan match sebagai keputusan utama.
Error yang mungkin akan ditemui
Sebelum verifikasi berjalan, API bisa menolak request kalau ada yang kurang. Berikut status dan pesan persis yang akan kamu terima:
| Status | Kapan muncul | Pesan |
|---|---|---|
| 401 | header API key tidak dikirim | API key required in x-api-co-id header |
| 400 | image1 tidak ada |
image1 is required. Please upload an image file using 'image1' field in multipart/form-data |
| 400 | image2 tidak ada |
image2 is required. Please upload an image file using 'image2' field in multipart/form-data |
| 400 | tipe file salah | Invalid image1 file type. Only JPG, JPEG, and PNG image files are allowed |
| 400 | file melebihi 5 MB | image1 file size exceeds maximum limit of 5 MB |
| 400 | wajah tidak terdeteksi | Failed to verify faces. Please ensure both images are valid and contain faces. |
| 402 | saldo kurang | Insufficient points balance. Please top up to continue. |
Hanya panggilan yang berhasil yang memotong saldo Rp400. Panggilan yang berakhir di salah satu error di atas tidak kami potong, jadi request yang filenya hilang atau terlalu besar tidak ikut memakan biaya.
Contoh lengkap: dari unggahan sampai keputusan
Kita coba satukan semuanya dengan foto Dewi tadi. Aplikasi pinjaman menerima unggahan ktp-dewi.jpg dan selfie-dewi.jpg, lalu backend memanggil endpoint dengan nilai yang sama seperti contoh cURL di atas. Versi PHP di bawah mengirim kedua file itu dan langsung membaca keputusannya.
<?php
$ch = curl_init('https://use.api.co.id/face-match/verify');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['x-api-co-id: YOUR_API_KEY']);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'image1' => new CURLFile('ktp-dewi.jpg'),
'image2' => new CURLFile('selfie-dewi.jpg'),
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($response['data']['match'] ?? false) === true) {
// wajah cocok, naikkan status dan lanjut ke pencairan
naikkanStatus('wajah terverifikasi', $response['data']['confidence']);
} else {
// match=false, teruskan ke tim risk untuk review manual
teruskanKeReview($response['data']['confidence'] ?? null);
}
Untuk Dewi, match bernilai true dengan confidence 0.95, sehingga statusnya naik ke “wajah terverifikasi” dan alur lanjut ke pencairan. Kalau kamu mengganti selfie-nya dengan wajah orang lain, hasilnya match false dengan confidence 0.35, dan cabang satunya membawanya ke review manual.
Kasus nyata: onboarding aplikasi pinjaman
Fintech lending wajib memastikan pendaftar memakai KTP miliknya sendiri sebelum pencairan. Saat onboarding, user mengisi data, mengunggah foto KTP, lalu mengambil selfie. Backend memanggil POST /face-match/verify dengan foto KTP di image1 dan selfie di image2. Kalau match bernilai true dengan confidence tinggi, akun lanjut ke tahap pencairan; kalau match bernilai false, sistem meminta selfie ulang atau meneruskannya ke tim risk. Hasil tiap verifikasi kamu simpan bersama timestamp untuk audit, karena alasan kepatuhan KYC di Indonesia menuntut jejak yang bisa kamu telusuri.
Harga dan batas
Satu verifikasi yang berhasil memotong saldo Rp400, dan modelnya pay as you go tanpa kuota gratis. Panggilan yang gagal, misalnya karena file hilang, tipe salah, atau wajah tidak terdeteksi, tidak kami potong. Batas tiap gambar 5 MB dengan format JPG, JPEG, atau PNG, jadi kompres foto beresolusi besar di sisi aplikasi sebelum kamu kirim supaya tidak tertolak oleh batas ukuran.
Data biometrik dan regulasi
Foto wajah termasuk data biometrik, dan di Indonesia data seperti ini masuk kategori data pribadi yang bersifat spesifik menurut UU No. 27 Tahun 2022 tentang Pelindungan Data Pribadi. Karena itu simpan hasil verifikasi seperlunya, batasi akses ke foto yang kamu kirim, dan pastikan user tahu untuk apa kamu memakai selfie dan foto KTP-nya.
Langkah berikutnya: baca data KTP dan cek ke Dukcapil
Setelah wajah cocok, biasanya ada dua hal yang bisa kamu otomatisasi di sekitarnya. Kamu bisa membaca data KTP otomatis dari foto dengan OCR KTP, sehingga data yang tertulis di KTP terisi dari gambar tanpa kamu ketik manual. Kamu juga bisa mengecek NIK ke Dukcapil dengan ID Verification saat butuh validasi terhadap catatan resmi. Keduanya tidak wajib kamu panggil lebih dulu. face match berdiri sendiri. Kalau kamu menyusun proses identitas yang lebih besar, endpoint ini menempati satu titik dalam alur eKYC, dan rangkaian verifikasi yang lebih lengkap ada di solusi eKYC.
| Produk | Endpoint | Kapan dipakai |
|---|---|---|
| OCR KTP | POST /ocr/ktp-extract |
membaca data KTP otomatis dari foto |
| ID Verification | POST /id-verification/verify |
mencocokkan NIK ke catatan Dukcapil |






