API OCR KTP: Ekstrak Data e-KTP dan Validasi NIK Otomatis

Oleh , Tim Engineering APIPedia · Terbit · Diperbarui · 8 menit baca

API OCR KTP membaca foto e-KTP dan mengembalikan NIK, nama, alamat, dan field lain sebagai JSON lewat satu endpoint POST /ocr/ktp.

API OCR KTP APIPedia: ekstrak data e-KTP, baca SIM, dan validasi struktur NIK lewat /ocr/ktp, /ocr/sim, dan /nik/parse

API OCR KTP adalah layanan yang membaca foto e-KTP lalu mengembalikan field-nya dalam bentuk JSON terstruktur: NIK, nama, tempat dan tanggal lahir, alamat, RT/RW, agama, pekerjaan, hingga masa berlaku. Di APIPedia, Anda cukup mengirim gambar base64 ke endpoint POST /ocr/ktp dan menerima hasilnya dalam satu respons.

Artikel ini membahas cara kerja OCR KTP di APIPedia, contoh request dengan curl dan JavaScript, cara memvalidasi NIK lewat /nik/parse/{nik}, membaca SIM lewat /ocr/sim, dan hal yang wajib Anda perhatikan soal pelindungan data pribadi.

Apa itu OCR KTP dan kapan developer membutuhkannya?

OCR (optical character recognition) mengubah teks di dalam gambar menjadi teks yang bisa diproses program. OCR KTP menambahkan satu langkah lagi: teks mentah itu diuraikan menjadi field yang sesuai dengan tata letak e-KTP.

Kebutuhan ini muncul di banyak alur: pendaftaran pengguna, pengisian formulir otomatis, onboarding mitra, sampai pencatatan data pelanggan di aplikasi internal. Tanpa OCR, pengguna harus mengetik ulang NIK 16 digit dan alamat lengkap, yang rawan salah ketik.

Bagaimana OCR KTP APIPedia bekerja?

Endpoint /ocr/ktp menjalankan mesin OCR Tesseract dengan bahasa Indonesia dan Inggris (ind+eng) di server. Teks hasil OCR kemudian diuraikan lewat pencocokan pola untuk mengisi tiap field. Field yang tidak terbaca bernilai null, bukan ditebak.

Respons selalu menyertakan raw_text, yaitu teks mentah hasil OCR, supaya Anda bisa memeriksa ulang hasilnya. Kalau NIK berhasil terbaca, field nik_parsed berisi hasil penguraian struktur NIK: wilayah penerbitan, jenis kelamin, tanggal lahir, dan nomor urut. Akurasi tetap bergantung pada kualitas foto, jadi verifikasi manual tetap diperlukan.

Bagaimana cara memakai API OCR KTP Indonesia?

Semua endpoint APIPedia memakai satu Bearer token. Ikuti langkah berikut untuk panggilan pertama Anda:

  1. Daftar atau masuk di console.apipedia.id. Paket Free gratis selamanya dengan kuota 500 request per hari dan rate limit 10 request per detik.
  2. Buka menu Token API, lalu buat kunci baru. Kunci berawalan apk_.
  3. Siapkan foto KTP dalam format PNG, JPEG, atau WebP, maksimal 8 MB.
  4. Ubah gambar menjadi base64. Data URL seperti data:image/jpeg;base64,... juga diterima.
  5. Kirim POST ke https://api.apipedia.id/v1/ocr/ktp dengan body JSON berisi image_base64.
  6. Baca field dari objek data, lalu tampilkan ke pengguna untuk dikonfirmasi.

Contoh request dengan curl

IMG=$(base64 -w 0 ktp.jpg)

curl -X POST https://api.apipedia.id/v1/ocr/ktp \
  -H "Authorization: Bearer apk_xxx" \
  -H "Content-Type: application/json" \
  -d "{\"image_base64\": \"$IMG\"}"

Di macOS, ganti base64 -w 0 ktp.jpg dengan base64 -i ktp.jpg. Untuk foto yang besar, simpan body ke berkas lalu kirim dengan -d @body.json agar tidak terkena batas panjang argumen shell.

Contoh request dengan JavaScript (fetch)

// Di browser: ambil berkas dari <input type="file">
async function bacaKtp(file) {
  const dataUrl = await new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsDataURL(file);
  });

  const res = await fetch("https://api.apipedia.id/v1/ocr/ktp", {
    method: "POST",
    headers: {
      "Authorization": "Bearer apk_xxx",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ image_base64: dataUrl }),
  });

  const json = await res.json();
  if (!json.is_success) throw new Error(json.message);
  return json.data;
}

Penting: jangan menaruh kunci apk_ di kode yang berjalan di browser pengguna. Contoh di atas cocok untuk prototipe. Di produksi, teruskan gambar ke backend Anda, lalu backend yang memanggil APIPedia dengan kunci yang tersimpan di variabel lingkungan.

Field apa saja yang dikembalikan endpoint /ocr/ktp?

Setiap respons APIPedia memakai amplop { is_success, message, data }. Berikut isi objek data untuk /ocr/ktp:

FieldKeteranganContoh
nikNIK 16 digit3273012501990001
namaNama lengkapBUDI SANTOSO
tempat_lahirTempat lahirBANDUNG
tanggal_lahirTanggal lahir (DD-MM-YYYY)25-01-1999
jenis_kelaminJenis kelaminLAKI-LAKI
alamat, rt_rwAlamat dan RT/RWJL. SETIABUDI NO. 123, 005/012
kel_desa, kecamatanKelurahan/desa dan kecamatanGEGERKALONG, SUKASARI
agama, status_perkawinanAgama dan status perkawinanISLAM, BELUM KAWIN
pekerjaan, kewarganegaraanPekerjaan dan kewarganegaraanKARYAWAN SWASTA, WNI
berlaku_hinggaMasa berlakuSEUMUR HIDUP
nik_parsedHasil penguraian struktur NIK, atau nullobjek
confidenceSkor keyakinan OCR88.2
langBahasa OCRind+eng
raw_textTeks mentah hasil OCRPROVINSI JAWA BARAT ...
catatanCatatan akurasiteks

Menangani error

Status 400 berarti gambar bermasalah: image_base64 kosong, bukan base64, lebih dari 8 MB, atau bukan PNG/JPEG/WebP. Status 502 berarti mesin OCR gagal memproses gambar. Pada keduanya, is_success bernilai false dan message menjelaskan alasannya, jadi Anda bisa menampilkannya langsung atau meminta pengguna memotret ulang.

Bagaimana cara memvalidasi NIK dengan /nik/parse/{nik}?

Endpoint GET /nik/parse/{nik} memeriksa struktur NIK sesuai PP 37/2007, lalu menguraikannya menjadi wilayah penerbitan (provinsi, kabupaten/kota, kecamatan), jenis kelamin, tanggal lahir, dan nomor urut. Untuk perempuan, digit tanggal ditambah 40, dan endpoint ini menanganinya otomatis.

NIK yang tidak valid dijawab 400 beserta alasan pertamanya: panjang bukan 16 digit, bukan angka, kode wilayah tidak terdaftar, atau digit tanggal tidak valid. Bila dua digit tahun bisa berarti 19xx atau 20xx, respons berisi abad_ambigu: true dan tahun alternatifnya ada di tanggal_lahir_alternatif.

curl https://api.apipedia.id/v1/nik/parse/3273010101900001 \
  -H "Authorization: Bearer apk_xxx"
const res = await fetch(
  "https://api.apipedia.id/v1/nik/parse/3273010101900001",
  { headers: { "Authorization": "Bearer apk_xxx" } }
);
const { is_success, message, data } = await res.json();
if (is_success) {
  console.log(data.wilayah.kabupaten, data.jenis_kelamin, data.tanggal_lahir);
} else {
  console.warn("NIK tidak valid:", message);
}

Batasan validasi NIK yang perlu dipahami

Pemeriksaan ini bersifat struktural, bukan verifikasi identitas ke Dukcapil. NIK tidak memiliki checksum, sehingga struktur yang benar bukan bukti bahwa NIK itu terdaftar atau milik orang yang mengirimnya. Kode wilayah menunjukkan tempat tinggal saat NIK diterbitkan, bukan tempat lahir dan bukan domisili terkini. Gunakan hasilnya untuk menangkap salah ketik dan data yang jelas tidak masuk akal, misalnya tanggal lahir di NIK berbeda dari tanggal lahir yang tercetak di KTP. Cocokkan juga nama kecamatan dari NIK dengan data wilayah resmi; panduannya ada di artikel API data wilayah dan kode pos Indonesia. Untuk proses yang menuntut kepastian identitas, seperti pembukaan rekening, Anda tetap memerlukan jalur verifikasi resmi sesuai regulasi industri Anda.

Bisakah API yang sama membaca SIM?

Bisa. Endpoint POST /ocr/sim memakai body yang sama (image_base64) dan mengembalikan nomor_sim, nama, alamat, golongan, dan berlaku_hingga, ditambah confidence, lang, raw_text, dan catatan. Seperti pada KTP, field yang tidak terbaca bernilai null.

curl -X POST https://api.apipedia.id/v1/ocr/sim \
  -H "Authorization: Bearer apk_xxx" \
  -H "Content-Type: application/json" \
  -d @body-sim.json

Field berlaku_hingga berguna untuk aplikasi logistik atau rental kendaraan yang perlu menolak SIM kedaluwarsa sebelum pengemudi aktif.

Bagaimana menjaga privasi dan keamanan data KTP?

Foto KTP dan NIK termasuk data pribadi. Undang-Undang Pelindungan Data Pribadi (UU PDP, UU No. 27 Tahun 2022) mewajibkan pengendali data memproses data pribadi secara terbatas, spesifik, sah, dan transparan. Artinya, tanggung jawab atas data pengguna ada di aplikasi Anda, bukan hanya di penyedia API.

Praktik yang sebaiknya Anda terapkan

  • Minta persetujuan yang jelas. Sebelum pengguna mengunggah KTP, jelaskan tujuan pemrosesan, data apa yang diambil, dan berapa lama disimpan. Catat persetujuannya.
  • Simpan seperlunya. Kalau Anda hanya butuh nama dan NIK, jangan menyimpan agama, status perkawinan, atau pekerjaan. Hapus foto KTP setelah data dikonfirmasi bila tidak ada kewajiban menyimpannya.
  • Jangan mencatat raw_text dan base64 ke log. Log aplikasi sering dibaca banyak orang dan disimpan lama.
  • Panggil API dari backend. Kunci apk_ tetap rahasia, dan Anda bisa mengontrol data yang masuk dan keluar.
  • Enkripsi saat disimpan dan dikirim. Gunakan HTTPS, enkripsi kolom sensitif, dan batasi akses database berdasarkan peran.
  • Beri pengguna kendali. Sediakan cara untuk melihat, memperbaiki, dan menghapus data mereka.

Ini gambaran umum, bukan nasihat hukum. Untuk produk yang memproses data identitas dalam skala besar, libatkan tim legal atau konsultan kepatuhan.

Bagaimana agar hasil OCR KTP lebih akurat?

Kualitas foto adalah faktor terbesar. Minta pengguna memotret KTP di permukaan datar dengan cahaya merata, tanpa pantulan lampu kilat di atas lapisan laminasi, dan pastikan seluruh kartu masuk bingkai.

Pakai confidence sebagai sinyal awal. Bila skornya rendah atau field penting bernilai null, tampilkan formulir yang sudah terisi sebagian dan minta pengguna melengkapi. Bandingkan juga tanggal_lahir hasil OCR dengan nik_parsed.tanggalLahir; bila berbeda, kemungkinan ada digit yang salah baca.

Ingat batas paket Free: 10 request per detik dan 500 request per hari. Untuk unggahan massal, antrekan permintaan di backend agar tidak menabrak rate limit.

Pertanyaan yang sering diajukan

Apakah API OCR KTP APIPedia gratis?

Ya. Paket Free gratis selamanya dengan kuota 500 request per hari dan rate limit 10 request per detik. Semua paket membuka seluruh API, termasuk /ocr/ktp, /ocr/sim, dan /nik/parse/{nik}.

Format gambar apa yang didukung?

PNG, JPEG, dan WebP dalam bentuk base64 atau data URL, maksimal 8 MB. PDF belum didukung.

Apakah /nik/parse memastikan NIK terdaftar di Dukcapil?

Tidak. Endpoint ini hanya memeriksa struktur NIK dan menguraikan isinya. Struktur yang benar bukan bukti identitas terdaftar.

Kenapa ada field yang bernilai null?

Field yang tidak terbaca sengaja dibiarkan null agar tidak ada data tebakan. Periksa raw_text, perbaiki kualitas foto, atau minta pengguna mengisi field tersebut secara manual.

Bisakah OCR KTP dipanggil dari asisten AI?

Bisa. APIPedia menyediakan server MCP sehingga asisten seperti Claude bisa memanggil endpoint secara langsung. Panduannya ada di artikel cara menghubungkan APIPedia ke Claude lewat MCP. Tetap terapkan prinsip privasi yang sama untuk data KTP.


Siap mencoba? Buat akun dan kunci API gratis di console.apipedia.id, lalu kirim foto KTP contoh ke /ocr/ktp. Formulir pendaftaran Anda bisa terisi otomatis tanpa pengguna mengetik ulang NIK.

Topik:

Tentang penulis

Tim APIPedia — Tim Engineering APIPedia

Tim engineering di balik APIPedia yang membangun dan memelihara API data Indonesia - ongkir, OCR KTP, data wilayah, BMKG, hingga server MCP - dan menulis panduan integrasinya dari pengalaman langsung.