Se oggi la tua app chiede agli utenti la foto del passaporto o della carta d'identità, probabilmente hai sentito dire che i portafogli europei di identità digitale (EUDI Wallet) arrivano "alla fine del 2026". La data è reale, ed è precisa: 24 dicembre 2026. Ma è una scadenza per gli Stati membri, non per te, e non spegne le scansioni dei documenti.
Questo articolo fa tre cose. Mostra da dove viene la data, con il calcolo. Elenca cosa consegna davvero un portafoglio, partendo dalle tabelle degli attributi nelle norme. E abbozza un design che accetta un portafoglio quando l'utente ne ha uno e ripiega sulla scansione di un documento quando non ce l'ha. Lo scrive doc.cheap, un'API OCR per passaporti e documenti d'identità, quindi leggi le parti sul prodotto tenendolo a mente. doc.cheap legge le immagini dei documenti; non legge i portafogli.
Da dove viene il 24 dicembre 2026
L'obbligo è l'art. 5a(1) del Reg. (UE) n. 910/2014, inserito dal Regolamento (UE) 2024/1183, la modifica di eIDAS. Stabilisce che ciascuno Stato membro "fornisce almeno un portafoglio europeo di identità digitale entro 24 mesi dalla data di entrata in vigore degli atti di esecuzione di cui al paragrafo 23 del presente articolo e all'articolo 5c, paragrafo 6".
Quindi l'orologio non parte con la modifica di eIDAS in sé. Parte con gli atti di esecuzione della Commissione. Gli atti dell'art. 5a(23) sono quattro atti di esecuzione della Commissione datati 28 novembre 2024, tra cui il Regolamento di esecuzione (UE) 2024/2979 sull'integrità e sulle funzionalità di base dei portafogli. È stato pubblicato nella Gazzetta ufficiale (GU L, 2024/2979) il 4 dicembre 2024. Il suo art. 15 dice che "entra in vigore il ventesimo giorno successivo alla pubblicazione nella Gazzetta ufficiale dell'Unione europea".
Il calcolo:
| Passaggio | Data |
|---|---|
| Pubblicazione nella Gazzetta ufficiale | 4 dicembre 2024 |
| Giorno 1 dopo la pubblicazione | 5 dicembre 2024 |
| Giorno 20 dopo la pubblicazione: entrata in vigore | 24 dicembre 2024 |
| Più 24 mesi (art. 5a(1)): portafogli dovuti | 24 dicembre 2026 |
| Più 36 mesi (art. 5f(2)): alcune parti facenti affidamento private devono accettare i portafogli | 24 dicembre 2027 |
Il "ventesimo giorno successivo" si conta dal giorno dopo la pubblicazione, quindi 4 dicembre più 20 giorni arriva al 24, non al 23. Lo stesso conteggio dell'atto determina la seconda data della tabella, che è quella che interessa davvero alla maggior parte dei team di prodotto (ne parliamo più sotto).
Cosa consegna un portafoglio
Un portafoglio non invia l'immagine di un passaporto. Presenta dati firmati. L'insieme di dati per una persona fisica è fissato nell'allegato del Regolamento di esecuzione (UE) 2024/2977, i "dati di identificazione personale" (PID). L'allegato dice che i PID sono rilasciati in due formati: ISO/IEC 18013-5:2021 e il W3C "Verifiable Credentials Data Model 1.1".
Ecco gli attributi, con la presenza che il testo attribuisce a ciascuno (tabelle 1, 2 e 5 dell'allegato, come pubblicate il 4 dicembre 2024). L'ultima colonna è il campo più vicino in una risposta di scansione di doc.cheap, così vedi dove i due mondi coincidono e dove no.
| Attributo PID | Presenza | Campo più vicino in una scansione del documento |
|---|---|---|
family_name |
obbligatorio | holder.surname |
given_name |
obbligatorio | holder.given_names |
birth_date |
obbligatorio | holder.birth_date (ISO 8601) |
birth_place |
obbligatorio | una voce birth_place in fields[], quando il documento lo riporta |
nationality |
obbligatorio (alpha-2, uno o più) | holder.nationality (alpha-3, uno) |
resident_address, resident_country, resident_state, resident_city, resident_postal_code, resident_street, resident_house_number |
facoltativo | nessuno nella pagina dati del passaporto |
personal_administrative_number |
facoltativo | non è la stessa cosa; fields[] può contenere un personal_number stampato sul documento |
portrait |
facoltativo | images.main_photo |
family_name_birth, given_name_birth |
facoltativo | nessun campo curato |
sex |
facoltativo (codici 0, 1, 2, 3, 4, 5, 6, 9) | holder.sex (M, F, X) |
email_address, mobile_phone_number |
facoltativo | non presenti su un documento |
expiry_date (metadati) |
obbligatorio | document.expiry_date, ma del documento, non dei PID |
issuing_authority (metadati) |
obbligatorio | una voce authority in fields[], quando stampata |
issuing_country (metadati) |
obbligatorio (alpha-2) | document.issuing_state (alpha-3) |
document_number (metadati) |
facoltativo | non è la stessa cosa: il numero dei PID è assegnato dal fornitore di PID, document.number è quello del passaporto |
issuing_jurisdiction, location_status (metadati) |
facoltativo | nessuno |
Tre cose di questa tabella contano quando scrivi il codice di mappatura.
- I codici paese sono diversi. I PID usano ISO 3166-1 alpha-2 (
DE). I passaporti e la zona a lettura ottica (MRZ) usano alpha-3 (DEU). Tieni una sola forma interna e converti ai bordi. - "Obbligatorio" non significa "sempre noto". Sotto la tabella 1 il testo aggiunge: "Qualora il valore di un attributo non sia noto per la persona o non possa essere altrimenti rilasciato come parte dell'insieme di dati di identificazione personale, gli Stati membri utilizzano invece un valore di attributo adeguato alla situazione." Aspettati valori segnaposto, non chiavi mancanti.
- Solo cinque attributi sulla persona sono obbligatori. Indirizzo, ritratto, sesso e nomi alla nascita sono tutti facoltativi. Se il tuo flusso ne ha bisogno, per un dato utente il portafoglio potrebbe semplicemente non contenerli.
Chi arriva ancora con un documento
La scadenza obbliga ogni Stato membro a fornire un portafoglio. Non obbliga nessuno a usarlo. L'art. 5a(15) è netto: "L'uso dei portafogli europei di identità digitale è volontario." E prosegue: "Resta possibile accedere ai servizi pubblici e privati mediante altri mezzi di identificazione e autenticazione esistenti."
Quindi dopo il 24 dicembre 2026 vedrai ancora:
- Viaggiatori e clienti da fuori dell'UE. I considerando legano il portafoglio all'"identità giuridica dei cittadini dell'Unione, dei residenti nell'Unione o delle persone giuridiche". Un visitatore con un passaporto di un altro paese non ha un portafoglio UE da presentare.
- Persone che non ne hanno installato uno, o non possono, o preferiscono di no. Il testo tutela questa scelta.
- Flussi che hanno bisogno del documento stesso. Alcuni processi vogliono l'immagine del documento, il numero del documento o la zona a lettura ottica del documento fisico, non un'attestazione sulla persona. I PID di un portafoglio contengono un proprio
document_number, assegnato dal fornitore di PID, che non è il numero del passaporto. - Il periodo prima che il portafoglio di un certo paese sia attivo. Il 24 dicembre 2026 è la scadenza legale. Quando ogni portafoglio nazionale arrivi davvero agli utenti è un'altra questione, e l'unica risposta affidabile per un singolo paese è l'annuncio di quel paese o quello della Commissione.
Un design che accetta entrambi
La forma che regge a tutto questo è semplice: chiedi la presentazione di un portafoglio quando l'utente ne ha uno, e ripiega sulla scansione di un documento quando non ce l'ha. Entrambi i percorsi finiscono nello stesso record interno.
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 ----------------^
Alcune regole rendono i due percorsi intercambiabili:
- Mappa entrambi in un solo record con i tuoi nomi di campo. Usa la tabella qui sopra come mappatura.
- Conserva la provenienza. Registra se un record arriva da un portafoglio o da una scansione. Portano prove diverse, e chi fa la revisione vorrà sapere quale.
- Tratta i null come onesti. In una risposta di doc.cheap ogni chiave è sempre presente e un valore sconosciuto è
null. Un portafoglio può invece inviare un segnaposto. Normalizza entrambi in un'unica convenzione. - Conserva solo ciò che serve al flusso. Una scansione si può eseguire in modo che dal lato API non venga scritto nulla (vedi sotto).
Ecco la chiamata di ripiego con un semplice fetch. La chiave sandbox pubblica sk_sandbox_public è stampata nella documentazione e non richiede registrazione; ha un limite di frequenza per indirizzo del client.
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(), // un retry restituisce il primo risultato
},
body: JSON.stringify({
image: readFileSync(path).toString("base64"),
options: { retain_hours: 0, return_portrait: false }, // nulla viene conservato
}),
});
if (!response.ok) throw new Error(`scan failed: HTTP ${response.status}`);
return response.json();
}
// Mappa una scansione nello stesso record che riempirebbe una presentazione del portafoglio.
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" o "absent"
};
}
meta.status è una di cinque stringhe: recognized, no_document_found, unreadable, unsupported_document o rejected. Solo la prima dovrebbe riempire un record; le altre dovrebbero rimandare l'utente a rifare la foto. Con una chiave a pagamento il saldo viene addebitato solo quando la scansione è fatturabile.
Abbiamo eseguito una chiamata di questo tipo con sk_sandbox_public il 24 settembre 2026 alle 21:17 UTC, con il documento di test del prodotto stesso, un passaporto. La risposta è arrivata con HTTP 200. Ogni valore del documento qui sotto è mascherato, e fields, images e mrz.lines sono accorciati:
{
"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 significa che la scansione era fatturabile ed è stata conteggiata nella quota gratuita della sandbox; la chiave sandbox in sé non viene mai addebitata. L'array fields di quella esecuzione conteneva le voci birth_place, authority e personal_number, ed è lì che la tabella sopra rimanda per quegli attributi PID. La pagina dati di un passaporto riporta la MRZ su due righe nel layout TD3; la pagina sui formati TD1, TD2 e TD3 mostra i layout uno accanto all'altro.
Nota authenticity.overall: "not_checked". Una scansione come questa è riconoscimento: legge ciò che è stampato e verifica le cifre di controllo della MRZ. Non è rilevamento delle contraffazioni, e non offre la stessa garanzia di una presentazione firmata da un portafoglio. Se il tuo processo richiede un livello di garanzia più alto sul percorso di scansione, deve arrivare da un altro punto del tuo flusso. Se stai scegliendo un fornitore per il ripiego, il nostro confronto tra API OCR per passaporti mette in fila le opzioni, comprese quelle che fanno più del riconoscimento.
Cosa tenere d'occhio
- 24 dicembre 2026 – portafogli dovuti. Art. 5a(1), Regolamento (UE) 2024/1183, contato dall'entrata in vigore degli atti di esecuzione come mostrato sopra.
- 24 dicembre 2027 – parti facenti affidamento private. L'art. 5f(2) dice che le parti facenti affidamento private tenute a usare un'autenticazione forte dell'utente per l'identificazione online, per legge o per contratto, "accettano altresì, entro 36 mesi dalla data di entrata in vigore degli atti di esecuzione di cui all'articolo 5a, paragrafo 23, e all'articolo 5c, paragrafo 6, e solo su richiesta volontaria dell'utente, i portafogli europei di identità digitale". Il testo cita trasporti, energia, banche, servizi finanziari, sicurezza sociale, sanità, acqua potabile, servizi postali, infrastrutture digitali, istruzione e telecomunicazioni, ed esclude le microimprese e le piccole imprese.
- Piattaforme online di dimensioni molto grandi. L'art. 5f(3) le obbliga ad accettare i portafogli per l'autenticazione degli utenti, ancora una volta solo su richiesta volontaria dell'utente e per i dati minimi necessari.
- Modifiche agli atti di esecuzione. Il considerando 4 del Regolamento di esecuzione (UE) 2024/2979 dice che la Commissione "dovrebbe riesaminarlo e aggiornarlo" ove necessario. Controlla le tabelle degli attributi del 2024/2977 prima di congelare una mappatura.
In pratica: costruisci il percorso del portafoglio quando i paesi dei tuoi utenti rilasciano i loro portafogli, mantieni il percorso del documento e mappa entrambi in un solo record fin dal primo giorno. La documentazione dell'API OCR per passaporti e documenti d'identità copre per intero il lato della scansione.
Questo è un riepilogo tecnico, non una consulenza legale.