Jika aplikasi Anda saat ini meminta pengguna mengunggah foto paspor atau kartu identitas mereka, Anda mungkin sudah mendengar bahwa European Digital Identity Wallet (dompet identitas digital Eropa, EUDI Wallet) akan hadir "pada akhir 2026". Tanggal itu nyata, dan tepat: 24 Desember 2026. Tetapi itu tenggat bagi negara-negara anggota, bukan bagi Anda, dan tenggat itu tidak mematikan pemindaian dokumen.

Tulisan ini melakukan tiga hal. Tulisan ini menunjukkan dari mana tanggal itu berasal, lengkap dengan hitungannya. Tulisan ini mendaftar apa yang sebenarnya diserahkan sebuah dompet, berdasarkan tabel atribut dalam aturannya. Dan tulisan ini membuat sketsa desain yang menerima dompet jika pengguna memilikinya dan beralih ke pemindaian dokumen jika tidak. Tulisan ini dibuat oleh doc.cheap, sebuah API OCR Paspor dan Kartu Identitas, jadi baca bagian yang menyangkut produk dengan mengingat hal itu. doc.cheap membaca gambar dokumen; doc.cheap tidak membaca dompet.

Dari mana 24 Desember 2026 berasal

Kewajiban itu ada di Pasal 5a(1) Reg. (UE) No 910/2014, yang disisipkan oleh Reg. (UE) 2024/1183, yaitu perubahan eIDAS. Pasal itu menyatakan bahwa setiap negara anggota "wajib menyediakan sedikitnya satu European Digital Identity Wallet dalam waktu 24 bulan sejak tanggal mulai berlakunya tindakan pelaksana sebagaimana dimaksud dalam ayat 23 Pasal ini dan dalam Pasal 5c(6)".

Jadi hitungan waktunya tidak dimulai dari perubahan eIDAS itu sendiri. Hitungan dimulai dari tindakan pelaksana (implementing acts) Komisi Eropa. Tindakan menurut Pasal 5a(23) adalah empat tindakan pelaksana Komisi tertanggal 28 November 2024, di antaranya Reg. Pelaksana (UE) 2024/2979 tentang integritas dan fungsi inti dompet. Peraturan itu diterbitkan dalam Official Journal (OJ L, 2024/2979) pada 4 Desember 2024. Pasal 15-nya menyatakan bahwa peraturan itu "mulai berlaku pada hari kedua puluh setelah hari penerbitannya dalam Official Journal of the European Union".

Hitungannya:

Langkah Tanggal
Diterbitkan dalam Official Journal 4 Desember 2024
Hari ke-1 setelah penerbitan 5 Desember 2024
Hari ke-20 setelah penerbitan: mulai berlaku 24 Desember 2024
Ditambah 24 bulan (Pasal 5a(1)): tenggat dompet 24 Desember 2026
Ditambah 36 bulan (Pasal 5f(2)): sebagian pihak pengandal swasta wajib menerima dompet 24 Desember 2027

Frasa "hari kedua puluh setelah" dihitung mulai hari sesudah penerbitan, jadi 4 Desember ditambah 20 hari jatuh pada tanggal 24, bukan 23. Tanggal mulai berlaku yang sama juga menentukan tanggal kedua dalam tabel, yang justru paling diperhatikan oleh kebanyakan tim produk (dibahas di bawah).

Apa yang diserahkan sebuah dompet

Dompet tidak mengirim foto paspor. Dompet menyajikan data yang ditandatangani. Kumpulan data untuk orang perseorangan ditetapkan dalam Lampiran Reg. Pelaksana (UE) 2024/2977, yaitu "person identification data" (data identifikasi pribadi, PID). Lampiran itu menyatakan bahwa PID diterbitkan dalam dua format: ISO/IEC 18013-5:2021 dan "Verifiable Credentials Data Model 1.1" dari W3C.

Berikut atributnya, beserta sifat yang diberikan teks untuk masing-masing (Tabel 1, 2 dan 5 dalam Lampiran, sebagaimana diterbitkan pada 4 Desember 2024). Kolom terakhir adalah field terdekat dalam respons pindaian doc.cheap, sehingga Anda bisa melihat di mana kedua dunia itu cocok dan di mana tidak.

Atribut PID Sifat Field terdekat dalam pindaian dokumen
family_name wajib holder.surname
given_name wajib holder.given_names
birth_date wajib holder.birth_date (ISO 8601)
birth_place wajib entri birth_place di fields[], jika dokumen mencetaknya
nationality wajib (alpha-2, satu atau lebih) holder.nationality (alpha-3, satu)
resident_address, resident_country, resident_state, resident_city, resident_postal_code, resident_street, resident_house_number opsional tidak ada di halaman data paspor
personal_administrative_number opsional bukan hal yang sama; fields[] bisa memuat personal_number yang dicetak dokumen
portrait opsional images.main_photo
family_name_birth, given_name_birth opsional tidak ada field yang dikurasi
sex opsional (kode 0, 1, 2, 3, 4, 5, 6, 9) holder.sex (M, F, X)
email_address, mobile_phone_number opsional tidak ada di dokumen
expiry_date (metadata) wajib document.expiry_date, tetapi milik dokumen, bukan milik PID
issuing_authority (metadata) wajib entri authority di fields[], jika tercetak
issuing_country (metadata) wajib (alpha-2) document.issuing_state (alpha-3)
document_number (metadata) opsional bukan hal yang sama: nomor PID ditetapkan oleh penyedia PID, document.number adalah nomor paspor
issuing_jurisdiction, location_status (metadata) opsional tidak ada

Tiga hal dari tabel itu penting saat Anda menulis kode pemetaannya.

  • Kode negaranya berbeda. PID memakai ISO 3166-1 alpha-2 (DE). Paspor dan zona baca mesin (MRZ) memakai alpha-3 (DEU). Simpan satu bentuk internal dan konversikan di tepi sistem.
  • "Wajib" tidak berarti "selalu diketahui". Di bawah Tabel 1 teks itu menambahkan: "Jika nilai suatu atribut tidak diketahui untuk orang tersebut atau tidak dapat diterbitkan sebagai bagian dari kumpulan data identifikasi pribadi, negara anggota wajib menggunakan nilai atribut yang sesuai dengan situasinya sebagai gantinya." Harapkan nilai pengganti, bukan key yang hilang.
  • Hanya lima atribut tentang orangnya yang wajib. Alamat, foto wajah, jenis kelamin dan nama saat lahir semuanya opsional. Jika alur Anda membutuhkan salah satunya, dompet bisa saja tidak memuatnya untuk pengguna tertentu.

Siapa yang tetap datang dengan dokumen

Tenggat itu mewajibkan setiap negara anggota untuk menyediakan dompet. Tenggat itu tidak mewajibkan siapa pun untuk memakainya. Pasal 5a(15) menyatakannya dengan lugas: "Penggunaan European Digital Identity Wallet bersifat sukarela." Lalu berlanjut: "Akses ke layanan publik dan swasta dengan sarana identifikasi dan autentikasi lain yang sudah ada harus tetap dimungkinkan."

Jadi setelah 24 Desember 2026 Anda tetap akan melihat:

  • Pelancong dan pelanggan dari luar UE. Konsiderans mengaitkan dompet dengan "identitas hukum warga negara Uni, penduduk di Uni, atau badan hukum". Pengunjung dengan paspor dari tempat lain tidak punya dompet UE untuk disajikan.
  • Orang yang belum memasangnya, atau tidak bisa, atau memilih tidak. Teks itu melindungi pilihan tersebut.
  • Alur yang membutuhkan dokumen itu sendiri. Sebagian proses menginginkan gambar dokumen, nomor dokumen, atau zona baca mesin dari dokumen fisiknya, bukan atestasi tentang orangnya. PID dari dompet membawa document_number sendiri, yang ditetapkan oleh penyedia PID, dan itu bukan nomor paspor.
  • Masa sebelum dompet suatu negara benar-benar aktif. 24 Desember 2026 adalah tenggat hukum. Kapan tiap dompet nasional benar-benar sampai ke pengguna adalah pertanyaan lain, dan satu-satunya jawaban yang dapat diandalkan untuk suatu negara adalah pengumuman negara itu sendiri atau pengumuman Komisi Eropa.

Desain yang menerima keduanya

Bentuk yang bertahan menghadapi semua ini sederhana: minta penyajian dompet jika pengguna memilikinya, dan beralih ke pemindaian dokumen jika tidak. Kedua jalur berakhir di catatan internal yang sama.

user starts verification
        |
        v
  offers a wallet? --yes--> wallet presentation --> verify signature --> map PID
        |                                                               |
        no                                                              v
        |                                                      internal identity
        v                                                          record
  document photo --> POST /v1/scans --> map scan fields ----------------^

Beberapa kaidah membuat kedua jalur itu bisa saling menggantikan:

  1. Petakan keduanya ke satu catatan dengan nama field Anda sendiri. Gunakan tabel di atas sebagai pemetaannya.
  2. Simpan sumbernya. Catat apakah suatu catatan berasal dari dompet atau dari pindaian. Keduanya membawa bukti yang berbeda, dan peninjau akan ingin tahu yang mana.
  3. Anggap null itu jujur. Dalam respons doc.cheap setiap key selalu ada dan nilai yang tidak diketahui adalah null. Dompet bisa mengirim nilai pengganti sebagai gantinya. Normalkan keduanya ke satu konvensi.
  4. Simpan sesedikit yang dibutuhkan alur. Pindaian bisa dijalankan sedemikian rupa sehingga tidak ada yang dicatat di sisi API (lihat di bawah).

Berikut panggilan cadangannya dengan fetch biasa. Kunci sandbox publik sk_sandbox_public tercetak di dokumentasi dan tidak memerlukan pendaftaran; jumlah request-nya dibatasi per alamat klien.

import { readFileSync } from "node:fs";
import { randomUUID } from "node:crypto";

async function scanDocument(path, apiKey = "sk_sandbox_public") {
  const response = await fetch("https://api.doc.cheap/v1/scans", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "Content-Type": "application/json",
      "Idempotency-Key": randomUUID(), // percobaan ulang mengembalikan hasil pertama
    },
    body: JSON.stringify({
      image: readFileSync(path).toString("base64"),
      options: { retain_hours: 0, return_portrait: false }, // tidak ada yang disimpan
    }),
  });
  if (!response.ok) throw new Error(`scan failed: HTTP ${response.status}`);
  return response.json();
}

// Petakan pindaian ke catatan yang sama dengan yang akan diisi oleh penyajian dompet.
function fromScan(scan) {
  if (scan.meta.status !== "recognized") return null;
  const field = (name) => scan.fields.find((f) => f.id === `${name}@0`)?.value ?? null;
  return {
    source: "document_scan",
    family_name: scan.holder?.surname ?? null,
    given_name: scan.holder?.given_names ?? null,
    birth_date: scan.holder?.birth_date ?? null,
    birth_place: field("birth_place"),
    nationality_alpha3: scan.holder?.nationality ?? null,
    issuing_country_alpha3: scan.document?.issuing_state ?? null,
    document_number: scan.document?.number ?? null,
    mrz_status: scan.mrz.status, // "passed", "failed" atau "absent"
  };
}

meta.status adalah salah satu dari lima string: recognized, no_document_found, unreadable, unsupported_document atau rejected. Hanya yang pertama yang seharusnya mengisi catatan; sisanya seharusnya mengembalikan pengguna untuk memotret ulang. Pada kunci berbayar, saldo hanya dipotong jika pindaiannya dapat ditagih.

Kami menjalankan satu panggilan seperti ini ke sk_sandbox_public pada 24 September 2026 pukul 21:17 UTC, dengan dokumen uji milik produk sendiri, sebuah paspor. Respons kembali dengan HTTP 200. Setiap nilai dokumen di bawah ini disamarkan, dan fields, images serta mrz.lines dipangkas:

{
  "meta": {
    "schema_version": "1.0",
    "id": "<SCAN_ID>",
    "status": "recognized",
    "billed": true,
    "confidence": "medium",
    "timing": { "upload_ms": 255, "processing_ms": 409, "total_ms": 678 },
    "created_at": "<RUN_TIMESTAMP>",
    "reference": null
  },
  "document": {
    "kind": "passport", "country": "<ISO3>", "country_name": "<COUNTRY>",
    "issuing_state": "<ISO3>", "number": "<DOCUMENT_NUMBER>", "series": null,
    "issue_date": "<DATE>", "expiry_date": "<DATE>", "is_expired": false, "days_remaining": "<N>"
  },
  "holder": {
    "given_names": "<GIVEN_NAMES>", "surname": "<SURNAME>", "full_name": "<FULL_NAME>",
    "birth_date": "<DATE>", "sex": "<SEX>", "nationality": "<ISO3>"
  },
  "mrz": { "status": "passed", "reason": null, "lines": ["<LINE_1>", "<LINE_2>"], "text": "<MRZ>" },
  "quality": { "overall": "pass" },
  "authenticity": { "overall": "not_checked", "checks": [] }
}

billed: true di sana berarti pindaian itu dapat ditagih dan dihitung terhadap jatah gratis sandbox; kunci sandbox itu sendiri tidak pernah ditagih. Array fields dari panggilan itu memuat entri birth_place, authority dan personal_number, yang merupakan tempat yang ditunjuk tabel di atas untuk atribut PID tersebut. Halaman data paspor memuat MRZ dalam dua baris dengan tata letak TD3; halaman format TD1, TD2 dan TD3 menampilkan tata letaknya berdampingan.

Perhatikan authenticity.overall: "not_checked". Pindaian seperti ini adalah pengenalan: pindaian membaca apa yang tercetak dan memeriksa check digit MRZ. Ini bukan deteksi pemalsuan, dan jaminannya tidak sama dengan penyajian dompet yang ditandatangani. Jika proses Anda membutuhkan tingkat jaminan yang lebih kuat pada jalur pindaian, jaminan itu harus datang dari bagian lain dalam alur Anda. Jika Anda sedang memilih penyedia untuk jalur cadangan, perbandingan API OCR paspor kami memaparkan pilihannya, termasuk yang melakukan lebih dari sekadar pengenalan.

Yang perlu dipantau selanjutnya

  • 24 Desember 2026 – tenggat dompet. Pasal 5a(1) Reg. (UE) 2024/1183, dihitung sejak mulai berlakunya tindakan pelaksana seperti ditunjukkan di atas.
  • 24 Desember 2027 – pihak pengandal swasta. Pasal 5f(2) menyatakan bahwa pihak pengandal (relying party) swasta yang wajib memakai autentikasi pengguna yang kuat untuk identifikasi daring, berdasarkan hukum atau kontrak, "wajib, paling lambat 36 bulan sejak tanggal mulai berlakunya tindakan pelaksana sebagaimana dimaksud dalam Pasal 5a(23) dan Pasal 5c(6) dan hanya atas permintaan sukarela pengguna, juga menerima European Digital Identity Wallet". Teks itu menyebut transportasi, energi, perbankan, layanan keuangan, jaminan sosial, kesehatan, air minum, layanan pos, infrastruktur digital, pendidikan dan telekomunikasi, serta mengecualikan usaha mikro dan usaha kecil.
  • Platform daring yang sangat besar. Pasal 5f(3) mewajibkan platform ini menerima dompet untuk autentikasi pengguna, lagi-lagi hanya atas permintaan sukarela pengguna dan untuk data minimum yang diperlukan.
  • Perubahan pada tindakan pelaksana. Konsiderans 4 dari Reg. Pelaksana (UE) 2024/2979 menyatakan bahwa Komisi "sebaiknya meninjau dan memperbaruinya" bila perlu. Periksa tabel atribut dalam 2024/2977 sebelum Anda membekukan pemetaan.

Kesimpulan praktisnya: bangun jalur dompet ketika negara-negara pengguna Anda meluncurkan dompet mereka, pertahankan jalur dokumen, dan petakan keduanya ke satu catatan sejak hari pertama. Dokumentasi API OCR Paspor dan Kartu Identitas membahas sisi pindaian secara lengkap.

Ini adalah ringkasan teknis, bukan nasihat hukum.