Documentnummer Generator
Fictieve documentnummers in het formaat van het Nederlandse paspoort, de identiteitskaart en het rijbewijs. Optioneel met het MRZ-controlecijfer uit ICAO 9303, voor tests van onboarding, ID-controle en MRZ-parsers.
FictiefAlle gegenereerde gegevens zijn fictief en alleen bedoeld voor test- en ontwikkelomgevingen. Een willekeurig geldig nummer kan toevallig bestaan: gebruik het nooit als echt gegeven.
9 tekens, begint met N (nationaal paspoort). Nooit de letter O.
Zonder het cijfer 0, zoals in documenten vanaf 1 december 2019.
Alleen het documentnummer van 9 tekens.
Documentnummer controleren
Paspoort- of ID-kaartnummer (9 tekens), MRZ-veld met controlecijfer (10 tekens) of rijbewijsnummer (10 cijfers).
Hoe is een documentnummer opgebouwd?
Paspoorten en Nederlandse identiteitskaarten hebben een documentnummer van 9 tekens. Volgens de Rijksdienst voor Identiteitsgegevens (RvIG) geldt:
| Positie | Inhoud |
|---|---|
| 1–2 | Letters. De eerste letter geeft de documentsoort aan. |
| 3–8 | Letters of cijfers |
| 9 | Een cijfer |
De letter O komt nooit voor, om verwarring met de 0 te voorkomen. Sinds 1 december 2019 staat ook het cijfer 0 niet meer in nieuw uitgegeven paspoorten en identiteitskaarten. Oudere documenten met een 0 kunnen nog geldig zijn: een validator die de 0 weigert, keurt dus echte documenten af.
De eerste letter volgens de RvIG:
Nnationaal paspoortINederlandse identiteitskaartBzakenpaspoortAvreemdelingenpaspoortRvluchtelingenpaspoortDdiplomatiek paspoortSdienstpaspoort
Het MRZ-controlecijfer (ICAO 9303)
In de machineleesbare strook (MRZ) onderaan de houderpagina staat direct achter het documentnummer een controlecijfer. Dat volgt uit de internationale norm ICAO Doc 9303: cijfers tellen als hun waarde, letters als A=10 tot en met Z=35 en het opvulteken < als 0. Vermenigvuldig met de gewichten 7, 3, 1 (steeds herhaald), tel op en neem de rest na deling door 10.
Uitgewerkt voor het specimen-documentnummer SPECI2014:
| Teken | S | P | E | C | I | 2 | 0 | 1 | 4 |
|---|---|---|---|---|---|---|---|---|---|
| Waarde | 28 | 25 | 14 | 12 | 18 | 2 | 0 | 1 | 4 |
| Gewicht | 7 | 3 | 1 | 7 | 3 | 1 | 7 | 3 | 1 |
| Product | 196 | 75 | 14 | 84 | 54 | 2 | 0 | 3 | 4 |
Som: 196 + 75 + 14 + 84 + 54 + 2 + 0 + 3 + 4 = 432. De rest na deling door 10 is 2, dus in de MRZ staat SPECI20142. Hetzelfde rekenwerk geldt voor de geboortedatum en de vervaldatum in de MRZ.
Specimens en het rijbewijsnummer
De RvIG publiceert voorbeelddocumenten (specimens) op naam van Willeke Liselotte de Bruijn. Hun documentnummers zijn handig als vaste waarde in tests (klik om te kopiëren):
Het rijbewijsnummer staat in vak 5 van het rijbewijs en heeft 10 cijfers, zoals op de officiële voorbeelden (bijvoorbeeld 5094962111). Voor zover bekend is er geen controlecijfer-algoritme gepubliceerd; de generator maakt alleen het formaat. Op de achterkant van het rijbewijs staat linksboven het BSN, vóór de schuine streep; daarachter staat het rijbewijsnummer. Een fictief BSN maak je met de BSN Generator.
Wanneer heb je fictieve documentnummers nodig?
- Onboarding en KYC — formulieren waarin klanten een paspoort- of ID-kaartnummer invullen, inclusief foutmeldingen voor de letter O, een verkeerde lengte of een ontbrekend cijfer op positie 9.
- MRZ- en OCR-parsers — test het uitlezen van de machineleesbare strook, inclusief de controlecijfers, met nummers waarvan je de uitkomst kent.
- Validatie van oude en nieuwe documenten — genereer nummers met en zonder het cijfer 0 om te controleren dat je validator beide accepteert.
- Maskeren en logging — controleer dat documentnummers niet onversleuteld in logs, exports of foutmeldingen terechtkomen. Complete testpersonen maak je met de Dataset Generator.
Documentnummer en MRZ-cijfer in TypeScript
// Paspoort of ID-kaart: 2 letters, 6 letters of cijfers, 1 cijfer; nooit de letter O.
export function isValidDocumentnummer(value: string): boolean {
return /^[A-NP-Z]{2}[A-NP-Z0-9]{6}[0-9]$/.test(value.replace(/\s/g, '').toUpperCase());
}
// ICAO 9303: gewichten 7, 3, 1; cijfer = waarde, A=10 ... Z=35, '<' = 0.
export function mrzCheckDigit(value: string): number {
const weights = [7, 3, 1];
let sum = 0;
for (let i = 0; i < value.length; i++) {
const c = value[i];
const n = c === '<' ? 0 : /[0-9]/.test(c) ? Number(c) : c.charCodeAt(0) - 55;
sum += n * weights[i % 3];
}
return sum % 10;
}De reguliere expressie volgt de RvIG-regels en accepteert het cijfer 0, zodat ook documenten van vóór december 2019 geldig zijn.
Veelgestelde vragen
Is het laatste cijfer van het documentnummer een controlecijfer?
Voor zover bekend niet: de RvIG beschrijft positie 9 alleen als een cijfer en publiceert geen algoritme. Het controlecijfer dat je op een paspoort ziet, staat apart in de machineleesbare strook (MRZ), direct achter het documentnummer, en wordt berekend volgens ICAO 9303.
Waarom komen de letter O en het cijfer 0 niet voor?
De letter O wordt nooit gebruikt, om verwarring met het cijfer 0 te voorkomen. Sinds 1 december 2019 staat ook het cijfer 0 niet meer in nieuw uitgegeven paspoorten en identiteitskaarten. Oudere documenten kunnen wel een 0 bevatten, dus een validator moet de 0 blijven accepteren.
Hoe zie je aan het nummer of het een paspoort of een ID-kaart is?
Aan de eerste letter: N is een nationaal paspoort, I een Nederlandse identiteitskaart. Verder gebruikt de RvIG B (zakenpaspoort), A (vreemdelingenpaspoort), R (vluchtelingenpaspoort), D (diplomatiek paspoort) en S (dienstpaspoort).
Zijn de gegenereerde documentnummers echt?
Nee. Ze zijn fictief en willekeurig gegenereerd in het juiste formaat. Een willekeurig nummer kan toevallig op een bestaand document staan, dus gebruik ze alleen in testomgevingen en nooit om iemand te identificeren. Heb je een vast voorbeeld nodig, gebruik dan het nummer van een officieel specimen, zoals SPECI2014.
Heeft het rijbewijsnummer een controlecijfer?
Voor zover bekend is er geen algoritme gepubliceerd. Het rijbewijsnummer staat in vak 5 van het rijbewijs en heeft 10 cijfers. De generator maakt daarom alleen nummers van 10 cijfers, zonder controlecijfer.