Il passaporto britannico è uno dei documenti che un flusso di onboarding nel Regno Unito vede più spesso. HM Passport Office, che si definisce "l'unico emittente dei passaporti del Regno Unito", è responsabile, con le sue parole, "del rilascio di oltre 6 milioni di passaporti ogni anno a cittadini britannici e ad altri soggetti di nazionalità britannica". Se il tuo prodotto verifica clienti nel Regno Unito, ne leggerai molti.

Questo articolo è per gli sviluppatori che devono estrarre i dati da un passaporto britannico e portarli nel proprio sistema. Spiega cosa c'è nella pagina dati, come è organizzata la zona a lettura ottica, quali modelli incontrerai nel 2026 e cosa restituisce una sola chiamata API. Ogni affermazione sul passaporto è citata da GOV.UK o dall'ICAO, con il link dove compare; gli originali sono in inglese e le traduzioni sono nostre.

Questo è il blog di doc.cheap, un'API OCR per passaporti e documenti d'identità. Leggi la parte sul prodotto tenendone conto.

La pagina dati in un'immagine

La guida sulle informazioni storiche dei passaporti di HM Passport Office descrive il libretto attuale. "Il 1° marzo 2020 il passaporto elettronico serie C del Regno Unito (passaporto elettronico blu) è entrato gradualmente in produzione." Secondo la stessa pagina, il passaporto:

  • "ha una pagina dei dati personali in policarbonato resistente all'usura all'inizio del libretto"
  • "ha le osservazioni stampate a pagina 3"
  • "mostra la foto del cliente 3 volte all'interno del libretto"
  • "ha il chip elettronico, incorporato nella pagina dei dati personali"

Per l'OCR questo significa una cosa sola: tutto ciò che serve sta in una pagina all'inizio. Fotografa quella pagina, piatta e intera, e avrai in un'immagine i campi stampati, il ritratto e la zona a lettura ottica. Il chip è dentro la stessa pagina, ma una foto non può leggere un chip; ciò che un'immagine ti dà è la pagina stampata.

La zona a lettura ottica

La MRZ è il blocco di lettere maiuscole, cifre e caratteri di riempimento < lungo il fondo della pagina dati. La stessa guida spiega da dove viene: "I dati personali del cliente vengono convertiti in caratteri leggibili dagli scanner di passaporti. I caratteri vengono aggiunti al passaporto in 2 righe di 44 caratteri ciascuna. Queste informazioni sono note come zona a lettura ottica."

Due righe di 44 caratteri sono il formato passaporto del Doc 9303 dell'ICAO. La pagina dell'ICAO sul Doc 9303 intitola la Parte 4 "Specifiche per i passaporti a lettura ottica (MRP) e altri MRTD di formato TD3", ed è per questo che il formato del passaporto si chiama TD3. Le Parti 5 e 6 trattano i formati più piccoli TD1 e TD2, quelli usati dalle carte d'identità.

Descrivendo i primi libretti britannici a lettura ottica, la guida elenca cosa contiene la zona: il nome del cliente, il numero del passaporto, le cifre di controllo, la cittadinanza, la data di nascita, il sesso, la data di scadenza del passaporto e un numero di identità personale. Le cifre di controllo sono calcolate su quei campi, quindi un carattere letto male di solito si tradisce con una cifra che non torna. Questo fa della MRZ l'unica parte della pagina che puoi ricontrollare da solo, senza fidarti di chi l'ha letta.

Due punti pratici per un parser:

  • Nessuna data di rilascio. La zona non la contiene. Se ti serve, deve venire dalla pagina stampata.
  • La cittadinanza non è sempre GBR. I codici paese della zona seguono il Doc 9303 dell'ICAO, non l'ISO, e le classi di cittadinanza britannica hanno codici propri. Il riferimento della risposta di doc.cheap ne elenca cinque oltre a GBR – GBD, GBN, GBO, GBP e GBS –, quindi un parser che accetta solo GBR rifiuterà alcuni passaporti britannici.

Quali modelli incontrerai

Più di un modello di passaporto britannico è valido nello stesso momento, quindi non costruire un controllo che si aspetta un solo aspetto.

  • Il libretto blu del 2020. Il passaporto elettronico serie C descritto sopra.
  • Il nuovo modello da dicembre 2025. GOV.UK ha annunciato che "I primi passaporti britannici con lo stemma di Sua Maestà Re Carlo III saranno rilasciati da dicembre nell'ambito di un design rinnovato", definendolo "il primo design interamente nuovo dal 2020".
  • Libretti più vecchi ancora validi. Lo stesso annuncio dice: "I passaporti rilasciati con lo stemma della Regina Elisabetta II restano validi fino alla data di scadenza."

Anche la validità ha una trappola. Prima di ottobre 2018 un rinnovo poteva riportare il tempo rimasto sul vecchio libretto: la guida fa l'esempio di un adulto che ha rinnovato con 7 mesi residui e ha ricevuto un passaporto "valido per 10 anni e 7 mesi". Da ottobre 2018 i rinnovi ottengono "non più di: 10 anni di validità (per gli adulti), 5 anni di validità (per i minori)". Quindi leggi la data di scadenza sul documento; non calcolarla dalla data di rilascio.

Leggerlo con una sola chiamata API

doc.cheap legge il passaporto da un'immagine: una POST /v1/scans con la foto codificata in base64 in un corpo JSON. La chiave pubblica di sandbox sk_sandbox_public funziona senza account. Usala con un'immagine di esempio, mai con un passaporto vero, perché le scansioni fatte con la chiave pubblica vengono conservate per un anno.

curl -X POST https://api.doc.cheap/v1/scans \
  -H "Authorization: Bearer sk_sandbox_public" \
  -H "Content-Type: application/json" \
  -d "{\"image\": \"$(base64 < document.jpg | tr -d '\n')\",
       \"options\": {\"expect_country\": \"GBR\", \"return_portrait\": false}}"

expect_country passa l'emittente come indizio quando lo conosci già, e return_portrait: false lascia il volto del titolare fuori dalla risposta. Le parti della risposta che contano per un passaporto britannico sono queste, con valori inventati:

{
  "document": {
    "kind": "passport",
    "issuing_state": "GBR",
    "issuing_state_detail": { "code": "GBR", "alpha3": "GBR", "alpha2": "GB", "category": "iso" },
    "number": "000000000",
    "issue_date": "2025-12-01",
    "expiry_date": "2035-12-01",
    "is_expired": false
  },
  "holder": {
    "surname": "SPECIMEN",
    "given_names": "ANGELA ZOE",
    "birth_date": "1990-01-01",
    "nationality": "GBR"
  },
  "mrz": { "status": "passed", "reason": null },
  "authenticity": { "overall": "not_checked", "checks": [] }
}

Cosa leggere:

  • mrz.status è passed, failed o absent. passed significa che ogni cifra di controllo è stata validata e che nulla nella zona contraddice la pagina stampata. Con failed, mrz.reason indica il campo, così sai se chiedere una nuova foto. mrz.text riporta la zona come un'unica stringa, se vuoi ricalcolare le cifre da solo; la guida al controllo della MRZ lo spiega passo per passo.
  • document.issue_date viene dalla pagina stampata, perché la zona non la contiene.
  • holder.nationality_detail conserva GBD e gli altri codici britannici così come sono scritti, con category impostato su british_nationality e alpha3 su GBR, così puoi raggruppare per Stato senza perdere la classe.

La pagina OCR del passaporto britannico riunisce gli stessi fatti in un unico posto, con i link a GOV.UK e all'ICAO.

Cosa l'OCR non ti dice

Leggere un passaporto e verificarlo sono lavori diversi. doc.cheap legge ciò che è stampato e controlla la MRZ con sé stessa e con la zona visiva. Non controlla se il documento è autentico: nello scenario di solo riconoscimento authenticity.overall è not_checked, e non legge il chip. Se il tuo flusso richiede un confronto del volto, una prova di vitalità o un controllo di autenticità, sono passaggi separati, con strumenti fatti apposta.

Provalo

La chiave pubblica di sandbox non richiede un account. Registrandoti ricevi 100 riconoscimenti gratuiti ogni mese sulla tua chiave, abbastanza per costruire e testare l'intero flusso. Se stai scegliendo un fornitore, il confronto tra API OCR per passaporti mette fianco a fianco i prezzi pubblicati, e la pagina OCR del passaporto britannico è il punto di partenza per i documenti britannici.

Una domanda per te: quale parte del passaporto britannico ha creato più problemi al tuo parser – i codici di cittadinanza, le vecchie norme sulla validità o altro? Raccontacelo nei commenti qui sotto.