KTP OCR
Ekstrak NIK, nama, dan alamat dari foto KTP.
Base URL
https://use.api.co.id
Kirim foto KTP ke POST /ocr/ktp-extract sebagai multipart/form-data (field file) dengan header x-api-co-id. Response berisi NIK, nama, tempat/tanggal lahir, alamat, RT/RW, kelurahan, kecamatan, kota, provinsi, agama, status perkawinan, pekerjaan, kewarganegaraan, dan masa berlaku. Field hasil OCR selalu dikembalikan lengkap.
Format file & batas
| Ketentuan | Nilai |
|---|---|
| Format | JPG, JPEG, PNG |
| Ukuran maksimal | 5 MB per file (file dan selfie) |
| Isi gambar | Foto KTP Indonesia |
OCR saja
curl -X POST "https://use.api.co.id/ocr/ktp-extract" \
-H "x-api-co-id: YOUR_API_KEY" \
-F "file=@/absolute/path/to/ktp.jpg"
{
"is_success": true,
"message": "Success",
"data": {
"nik": "3201012345678901",
"nama": "JOHN DOE",
"tempat_lahir": "JAKARTA",
"tanggal_lahir": "01-01-1990",
"jenis_kelamin": "LAKI-LAKI",
"alamat": "JL. MERDEKA NO. 123",
"rt": "001",
"rw": "002",
"kelurahan": "GAMBIR",
"kecamatan": "GAMBIR",
"kota": "JAKARTA PUSAT",
"provinsi": "DKI JAKARTA",
"berlaku_hingga": "SEUMUR HIDUP"
}
}
OCR + KTP Check
Set verify_result ke "true" untuk memverifikasi hasil OCR melalui KTP Check (ID Verification). Karena request memakai multipart/form-data, kirim value ini sebagai string form-data "true". Field selfie opsional.
curl -X POST "https://use.api.co.id/ocr/ktp-extract" \
-H "x-api-co-id: YOUR_API_KEY" \
-F "file=@/absolute/path/to/ktp.jpg" \
-F "verify_result=true" \
-F "selfie=@/absolute/path/to/selfie.jpg"
API.CO.ID memakai hasil OCR sebagai input KTP Check:
nik,name, dandate_of_birthdiambil dari hasil OCR;identitymemakai file KTP yang sama;selfiememakai file selfie customer jika dikirim;reference_number, email akun, dan nomor telepon dari KYC approved disiapkan server-side.
Jika selfie dikirim, API.CO.ID meneruskannya ke provider dan response verifikasi dipakai apa adanya. Jika tidak dikirim, API.CO.ID memakai fallback selfie internal untuk menjaga kompatibilitas request lama.
Customer harus punya akses id-verification dan eKYC approved. Jika syarat KTP Check belum terpenuhi, OCR tetap mengembalikan field hasil OCR lengkap dan billing verifikasi ditandai not_charged. Detail verifikasi ada di verification_result, detail billing di billing.
{
"is_success": true,
"message": "Success",
"data": {
"nik": "3201012345678901",
"nama": "JOHN DOE",
"tempat_lahir": "JAKARTA",
"tanggal_lahir": "01-01-1990",
"jenis_kelamin": "LAKI-LAKI",
"alamat": "JL. MERDEKA NO. 123",
"rt": "001",
"rw": "002",
"kelurahan": "GAMBIR",
"kecamatan": "GAMBIR",
"kota": "JAKARTA PUSAT",
"provinsi": "DKI JAKARTA",
"berlaku_hingga": "SEUMUR HIDUP",
"verification_result": {
"result_verified": true,
"result_verified_message": "verified",
"verification_reference_number": "KTP20260725103000"
},
"billing": {
"charged_products": [
{"product_code": "ktp-ocr", "status": "charged"},
{"product_code": "id-verification", "status": "charged"}
]
}
}
}
Jika verifikasi tidak diproses (contoh: KYC belum approved), field OCR tetap lengkap dan bagian verifikasi menjadi:
{
"verification_result": {
"result_verified": false,
"result_verified_message": "ID verification was not processed because KYC for id-verification is kyc_required.",
"verification_reference_number": "KTP20260725103000"
},
"billing": {
"charged_products": [
{"product_code": "ktp-ocr", "status": "charged"},
{"product_code": "id-verification", "status": "not_charged", "reason": "kyc_not_approved"}
]
}
}
Billing
- OCR KTP dan KTP Check adalah dua produk billing yang berbeda.
- OCR KTP dipotong setelah OCR sukses.
id-verificationhanya dipotong jika KTP Check diproses provider.- Jika KTP Check gagal karena KYC, saldo, validasi hasil OCR, atau provider error,
id-verificationtidak dipotong.
Error umum
| HTTP | Kondisi |
|---|---|
| 400Bad Request | File hilang, tipe file tidak didukung, ukuran file terlalu besar, selfie tidak valid, atau verify_result bukan boolean |
| 401Unauthorized | API key hilang atau salah |
| 402Payment Required | Saldo OCR KTP tidak cukup |
| 429Too Many Requests | Rate limit/quota terlampaui |
| 500Server Error | OCR pipeline/provider internal gagal |
Extract KTP from Image
Extract structured KTP data from an uploaded image file. Maximum file size: 5 MB. Supported formats: JPG, JPEG, PNG. Returns complete KTP data with all extracted fields. Optionally set verify_result=true to verify the OCR result. When selfie is provided, API.CO.ID forwards the customer selfie to the ID Verification provider and does not override the provider business result. When selfie is omitted, API.CO.ID uses an internal fallback selfie for backward compatibility. API.CO.ID injects the provider reference number, account email, and approved KYC phone number server-side.
| Nama | Tipe | Keterangan |
|---|---|---|
fileWajib | file | KTP image file. Maximum size: 5 MB. Supported formats: JPG, JPEG, PNG |
verify_resultOpsional | string | Set to "true" to verify extracted KTP data through ID Verification. Send as multipart form-data string. Nilai: truefalseContoh: true |
selfieOpsional | file | Optional selfie image for KTP Check when verify_result=true. Maximum size: 5 MB. Supported formats: JPG, JPEG, PNG |
| Nama | Tipe | Keterangan |
|---|---|---|
is_successOpsional | boolean | Contoh: true |
messageOpsional | string | Contoh: Success |
dataOpsional | object | |
data.nikOpsional | string | NIK (16-digit ID number) Contoh: 3201012345678901 |
data.namaOpsional | string | Full name Contoh: JOHN DOE |
data.tempat_lahirOpsional | string | Birth place Contoh: JAKARTA |
data.tanggal_lahirOpsional | string | Birth date (DD-MM-YYYY) Contoh: 01-01-1990 |
data.jenis_kelaminOpsional | string | Gender (LAKI-LAKI/PEREMPUAN) Contoh: LAKI-LAKI |
data.golongan_darahOpsional | string | Blood type Contoh: O |
data.alamatOpsional | string | Address Contoh: JL. MERDEKA NO. 123 |
data.rtOpsional | string | RT (neighborhood unit) Contoh: 001 |
data.rwOpsional | string | RW (community unit) Contoh: 002 |
data.kelurahanOpsional | string | Village/Kelurahan Contoh: GAMBIR |
data.kecamatanOpsional | string | Subdistrict/Kecamatan Contoh: GAMBIR |
data.kotaOpsional | string | City Contoh: JAKARTA PUSAT |
data.provinsiOpsional | string | Province Contoh: DKI JAKARTA |
data.agamaOpsional | string | Religion Contoh: ISLAM |
data.status_perkawinanOpsional | string | Marital status Contoh: BELUM KAWIN |
data.pekerjaanOpsional | string | Occupation Contoh: KARYAWAN SWASTA |
data.kewarganegaraanOpsional | string | Nationality Contoh: WNI |
data.berlaku_hinggaOpsional | string | Valid until Contoh: SEUMUR HIDUP |
data.verification_resultOpsional | object | Only present when verify_result=true. Contains verification result, message, and generated reference number. |
data.verification_result.result_verifiedOpsional | boolean | Contoh: true |
data.verification_result.result_verified_messageOpsional | string | Contoh: verified |
data.verification_result.verification_reference_numberOpsional | string | Contoh: KTP20260725103000 |
curl -X POST "https://use.api.co.id/ocr/ktp-extract" \ -H "x-api-co-id: $API_CO_ID_KEY" \ -F "[email protected]" \ -F "verify_result=true" \ -F "[email protected]"{ "is_success": true, "message": "Success", "data": { "nik": "3201012345678901", "nama": "JOHN DOE", "tempat_lahir": "JAKARTA", "tanggal_lahir": "01-01-1990", "jenis_kelamin": "LAKI-LAKI", "golongan_darah": "O", "alamat": "JL. MERDEKA NO. 123", "rt": "001", "rw": "002", "kelurahan": "GAMBIR", "kecamatan": "GAMBIR", "kota": "JAKARTA PUSAT", "provinsi": "DKI JAKARTA", "agama": "ISLAM", "status_perkawinan": "BELUM KAWIN", "pekerjaan": "KARYAWAN SWASTA", "kewarganegaraan": "WNI", "berlaku_hingga": "SEUMUR HIDUP" }}