Uygulamanız bugün kullanıcılardan pasaportlarının ya da kimlik kartlarının fotoğrafını istiyorsa, AB Dijital Kimlik Cüzdanlarının (EUDI Wallet) "2026 sonunda" geleceğini muhtemelen duymuşsunuzdur. Tarih gerçek ve kesin: 24 Aralık 2026. Ama bu sizin için değil, Üye Devletler için bir son tarih ve belge taramalarını kapatmıyor.
Bu yazı üç şey yapıyor. Tarihin nereden geldiğini hesabıyla gösteriyor. Bir cüzdanın gerçekte neyi teslim ettiğini, kurallardaki öznitelik tablolarından listeliyor. Ve kullanıcının cüzdanı varsa cüzdanı kabul eden, yoksa belge taramasına geri dönen bir tasarımın taslağını çiziyor. Yazıyı bir Pasaport ve kimlik kartı OCR API'si olan doc.cheap yazıyor; ürünle ilgili kısımları bunu akılda tutarak okuyun. doc.cheap belge görüntülerini okur; cüzdanları okumaz.
24 Aralık 2026 nereden geliyor
Yükümlülük, eIDAS değişikliği olan (AB) 2024/1183 sayılı Tüzük ile eklenen, (AB) 910/2014 sayılı Tüzük'ün 5a(1) maddesidir. Madde, her Üye Devletin "bu maddenin 23. fıkrasında ve 5c(6) maddesinde atıfta bulunulan uygulama işlemlerinin yürürlüğe girdiği tarihten itibaren 24 ay içinde en az bir Avrupa Dijital Kimlik Cüzdanı sağlayacağını" söyler.
Yani saat, eIDAS değişikliğinin kendisiyle başlamıyor. Komisyonun uygulama işlemleriyle başlıyor. 5a(23) maddesindeki işlemler, 28 Kasım 2024 tarihli dört Komisyon uygulama işlemidir; bunlardan biri cüzdanların bütünlüğü ve temel işlevleri hakkındaki (AB) 2024/2979 sayılı Uygulama Tüzüğü'dür. 4 Aralık 2024'te Resmî Gazete'de (OJ L, 2024/2979) yayımlandı. 15. maddesi, tüzüğün "Avrupa Birliği Resmî Gazetesi'nde yayımlandığı günü izleyen yirminci günde yürürlüğe gireceğini" söyler.
Hesap:
| Adım | Tarih |
|---|---|
| Resmî Gazete'de yayım | 4 Aralık 2024 |
| Yayımdan sonraki 1. gün | 5 Aralık 2024 |
| Yayımdan sonraki 20. gün: yürürlüğe giriş | 24 Aralık 2024 |
| Artı 24 ay (5a(1) maddesi): cüzdanların son tarihi | 24 Aralık 2026 |
| Artı 36 ay (5f(2) maddesi): bazı özel güvenen tarafların cüzdanları kabul etmesi gerekir | 24 Aralık 2027 |
"İzleyen yirminci gün" yayımdan sonraki günden itibaren sayılır; bu yüzden 4 Aralık artı 20 gün 23'üne değil, 24'üne denk gelir. Aynı işlemin sayımı tablodaki ikinci tarihi de belirler; ürün ekiplerinin çoğunun asıl ilgilendiği tarih odur (aşağıda daha fazlası var).
Bir cüzdan neyi teslim eder
Bir cüzdan pasaportun resmini göndermez. İmzalı veri sunar. Gerçek kişiye ait veri kümesi, (AB) 2024/2977 sayılı Uygulama Tüzüğü'nün Ekinde "kişi tanımlama verileri" (PID) olarak sabitlenmiştir. Ek, PID'nin iki formatta düzenlendiğini söyler: ISO/IEC 18013-5:2021 ve W3C "Verifiable Credentials Data Model 1.1".
İşte öznitelikler ve metnin her birine verdiği bulunma durumu (Ekin 1, 2 ve 5 numaralı tabloları, 4 Aralık 2024'te yayımlandığı haliyle). Son sütun, bir doc.cheap tarama yanıtındaki en yakın alandır; böylece iki dünyanın nerede örtüştüğünü ve nerede örtüşmediğini görebilirsiniz.
| PID özniteliği | Bulunma durumu | Belge taramasındaki en yakın alan |
|---|---|---|
family_name |
zorunlu | holder.surname |
given_name |
zorunlu | holder.given_names |
birth_date |
zorunlu | holder.birth_date (ISO 8601) |
birth_place |
zorunlu | belge basılı olarak içeriyorsa fields[] içinde bir birth_place girdisi |
nationality |
zorunlu (alpha-2, bir veya daha fazla) | holder.nationality (alpha-3, bir tane) |
resident_address, resident_country, resident_state, resident_city, resident_postal_code, resident_street, resident_house_number |
isteğe bağlı | pasaport veri sayfasında yok |
personal_administrative_number |
isteğe bağlı | aynı şey değil; fields[], belgede basılı bir personal_number içerebilir |
portrait |
isteğe bağlı | images.main_photo |
family_name_birth, given_name_birth |
isteğe bağlı | düzenlenmiş bir alan yok |
sex |
isteğe bağlı (kodlar 0, 1, 2, 3, 4, 5, 6, 9) | holder.sex (M, F, X) |
email_address, mobile_phone_number |
isteğe bağlı | belgede yok |
expiry_date (üst veri) |
zorunlu | document.expiry_date, ama PID'nin değil, belgenin |
issuing_authority (üst veri) |
zorunlu | basılıysa fields[] içinde bir authority girdisi |
issuing_country (üst veri) |
zorunlu (alpha-2) | document.issuing_state (alpha-3) |
document_number (üst veri) |
isteğe bağlı | aynı şey değil: PID'nin numarasını PID sağlayıcısı atar, document.number ise pasaportun numarasıdır |
issuing_jurisdiction, location_status (üst veri) |
isteğe bağlı | yok |
Eşleme kodunu yazarken bu tablodaki üç şey önemlidir.
- Ülke kodları farklıdır. PID, ISO 3166-1 alpha-2 (
DE) kullanır. Pasaportlar ve makinede okunabilir bölge (MRZ) alpha-3 (DEU) kullanır. Tek bir iç biçim tutun ve dönüşümü sınırda yapın. - "Zorunlu", "her zaman bilinir" anlamına gelmez. Tablo 1'in altında metin şunu ekler: "Bir öznitelik değeri kişi için bilinmiyorsa veya kişi tanımlama veri kümesinin bir parçası olarak başka bir şekilde düzenlenemiyorsa, Üye Devletler bunun yerine duruma uygun bir öznitelik değeri kullanır." Eksik anahtarlar değil, yer tutucu değerler bekleyin.
- Kişiyle ilgili yalnızca beş öznitelik zorunludur. Adres, portre, cinsiyet ve doğumdaki adlar isteğe bağlıdır. Akışınız bunlardan birine ihtiyaç duyuyorsa, cüzdan belirli bir kullanıcı için onu hiç taşımıyor olabilir.
Kim hâlâ bir belgeyle gelir
Son tarih, her Üye Devleti bir cüzdan sağlamakla yükümlü kılar. Kimseyi onu kullanmakla yükümlü kılmaz. 5a(15) maddesi açıktır: "Avrupa Dijital Kimlik Cüzdanlarının kullanımı gönüllüdür." Devamında: "Kamu ve özel hizmetlere mevcut diğer tanımlama ve kimlik doğrulama araçlarıyla erişmek mümkün olmaya devam eder."
Yani 24 Aralık 2026'dan sonra da şunları görmeye devam edeceksiniz:
- AB dışından gelen yolcular ve müşteriler. Gerekçe hükümleri cüzdanı "Birlik vatandaşlarının, Birlik'te ikamet edenlerin veya tüzel kişilerin hukuki kimliğine" bağlar. Başka bir ülkenin pasaportunu taşıyan bir ziyaretçinin sunacağı bir AB cüzdanı yoktur.
- Cüzdanı kurmamış olanlar, kuramayanlar ya da kurmak istemeyenler. Metin bu tercihi korur.
- Belgenin kendisine ihtiyaç duyan akışlar. Bazı süreçler kişi hakkında bir onay değil, belge görüntüsünü, belge numarasını ya da fiziksel belgenin makinede okunabilir bölgesini ister. Bir cüzdanın PID'si, PID sağlayıcısının atadığı kendi
document_numberdeğerini taşır; bu, pasaportun numarası değildir. - Belirli bir ülkenin cüzdanı yayına girmeden önceki dönem. 24 Aralık 2026 yasal son tarihtir. Her ulusal cüzdanın kullanıcılara gerçekte ne zaman ulaşacağı ayrı bir sorudur ve tek bir ülke için tek güvenilir yanıt o ülkenin kendi duyurusu ya da Komisyonun duyurusudur.
İkisini de kabul eden bir tasarım
Tüm bunlara dayanan yapı basittir: kullanıcının cüzdanı varsa cüzdan sunumu isteyin, yoksa belge taramasına geri dönün. Her iki yol da aynı iç kayıtta biter.
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 ----------------^
Birkaç kural iki yolu birbirinin yerine kullanılabilir kılar:
- İkisini de kendi alan adlarınızla tek bir kayda eşleyin. Eşleme olarak yukarıdaki tabloyu kullanın.
- Kaynağı saklayın. Bir kaydın cüzdandan mı yoksa taramadan mı geldiğini kaydedin. Farklı kanıtlar taşırlar ve bir denetçi hangisi olduğunu bilmek isteyecektir.
- Null değerleri dürüst kabul edin. Bir doc.cheap yanıtında her anahtar her zaman bulunur ve bilinmeyen bir değer
nullolur. Bir cüzdan bunun yerine bir yer tutucu gönderebilir. İkisini tek bir kurala göre normalleştirin. - Akışın gerektirdiği kadar az saklayın. Bir tarama, API tarafında hiçbir şey yazılmayacak şekilde çalıştırılabilir (aşağıda).
İşte düz fetch ile yedek çağrı. Herkese açık sandbox anahtarı sk_sandbox_public belgelerde basılıdır ve kayıt gerektirmez; istemci adresi başına hız sınırlıdır.
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(), // yeniden deneme ilk sonucu döndürür
},
body: JSON.stringify({
image: readFileSync(path).toString("base64"),
options: { retain_hours: 0, return_portrait: false }, // hiçbir şey saklanmaz
}),
});
if (!response.ok) throw new Error(`scan failed: HTTP ${response.status}`);
return response.json();
}
// Bir taramayı, bir cüzdan sunumunun dolduracağı kayıtla aynı kayda eşle.
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" veya "absent"
};
}
meta.status beş dizeden biridir: recognized, no_document_found, unreadable, unsupported_document veya rejected. Yalnızca ilki bir kaydı doldurmalıdır; diğerleri kullanıcıyı fotoğrafı yeniden çekmeye geri göndermelidir. Ücretli bir anahtarda bakiye yalnızca tarama ücretlendirilebilir olduğunda düşülür.
Bu türden bir çağrıyı 24 Eylül 2026'da saat 21:17 UTC'de, ürünün kendi test belgesi olan bir pasaportla sk_sandbox_public üzerinde çalıştırdık. Yanıt HTTP 200 ile döndü. Aşağıdaki her belge değeri maskelenmiştir; fields, images ve mrz.lines kısaltılmıştır:
{
"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": [] }
}
Oradaki billed: true, taramanın ücretlendirilebilir olduğu ve sandbox'ın ücretsiz kotasından düşüldüğü anlamına gelir; sandbox anahtarının kendisinden hiçbir zaman ücret alınmaz. O çalıştırmanın fields dizisi birth_place, authority ve personal_number girdilerini içeriyordu; yukarıdaki tablo bu PID öznitelikleri için tam da oraya işaret eder. Bir pasaport veri sayfası MRZ'sini TD3 düzeninde iki satır olarak taşır; TD1, TD2 ve TD3 formatları sayfası düzenleri yan yana gösterir.
authenticity.overall: "not_checked" değerine dikkat edin. Böyle bir tarama tanımadır: basılı olanı okur ve MRZ kontrol hanelerini doğrular. Sahtecilik tespiti değildir ve imzalı bir cüzdan sunumuyla aynı güvenceyi vermez. Süreciniz tarama yolunda daha yüksek bir güvence düzeyi gerektiriyorsa, bu güvence akışınızın başka bir yerinden gelmelidir. Yedek yol için bir sağlayıcı seçiyorsanız, pasaport OCR API karşılaştırmamız tanımadan fazlasını yapanlar dahil seçenekleri ortaya koyar.
Sırada neyi izlemeli
- 24 Aralık 2026 – cüzdanların son tarihi. 5a(1) maddesi, (AB) 2024/1183 sayılı Tüzük; yukarıda gösterildiği gibi uygulama işlemlerinin yürürlüğe girişinden itibaren sayılır.
- 24 Aralık 2027 – özel güvenen taraflar. 5f(2) maddesi, yasa veya sözleşme gereği çevrimiçi tanımlama için güçlü kullanıcı kimlik doğrulaması kullanmak zorunda olan özel güvenen tarafların "5a(23) maddesinde ve 5c(6) maddesinde atıfta bulunulan uygulama işlemlerinin yürürlüğe girdiği tarihten itibaren en geç 36 ay içinde ve yalnızca kullanıcının gönüllü talebi üzerine Avrupa Dijital Kimlik Cüzdanlarını da kabul edeceğini" söyler. Metin ulaşım, enerji, bankacılık, finansal hizmetler, sosyal güvenlik, sağlık, içme suyu, posta hizmetleri, dijital altyapı, eğitim ve telekomünikasyonu sayar; mikro işletmeleri ve küçük işletmeleri kapsam dışında bırakır.
- Çok büyük çevrimiçi platformlar. 5f(3) maddesi, bu platformların kullanıcı kimlik doğrulaması için cüzdanları kabul etmesini zorunlu kılar; yine yalnızca kullanıcının gönüllü talebi üzerine ve gereken asgari veri için.
- Uygulama işlemlerindeki değişiklikler. (AB) 2024/2979 sayılı Uygulama Tüzüğü'nün 4 numaralı gerekçe hükmü, Komisyonun onu gerektiğinde "gözden geçirmesi ve güncellemesi gerektiğini" söyler. Bir eşlemeyi dondurmadan önce 2024/2977'deki öznitelik tablolarını kontrol edin.
Pratik sonuç: kullanıcılarınızın ülkeleri cüzdanlarını yayına aldığında cüzdan yolunu kurun, belge yolunu koruyun ve ikisini ilk günden tek bir kayda eşleyin. Pasaport ve kimlik kartı OCR API'si belgeleri tarama tarafını eksiksiz anlatır.
Bu bir mühendislik özetidir, hukuki tavsiye değildir.