MRTD
Overview
The parser supports all versions of Machine Readable Travel Documents (MRTD) specified by the International Civil Aviation Organization (ICAO).
The ICAO specifies four types of MRTDs:
TD1 (id cards)
TD2 (other official travel documents)
TD3/MRP (passports)
MRV (A & B) (visas)
In addition, the parser supports the following non-ICAO standards:
SwissDL (Swiss driving license)
TD2/FrenchID (French identity card)
Regex patterns
Use the following regex pattern to filter out MRTD codes:
Type |
Regex |
---|---|
TD1 Regex Pattern |
([A-Z0-9<]{30}\n?){3} |
TD2 Regex Pattern |
([A-Z0-9<]{36}\n?){2} |
TD2 French Regex Pattern |
Same as TD2 Regex Pattern |
TD3 Regex Pattern |
([A-Z0-9<]{44}\n?){2} |
MRV_A Regex Pattern |
Same as TD2 Regex Pattern |
MRV_B Regex Pattern |
Same as TD3 Regex Pattern |
Swiss Driving License Regex Pattern |
[A-Z0-9<]{9}\n([A-Z0-9<]{30}\n?){2} |
ICAO MRTDs
Example
Parsing the following code (without quotes, source: 2015 ICAO Doc 9303, Specifications for TD1 Sized MRTDs, https://www.icao.int)
"I<UTOD231458907<<<<<<<<<<<<<<<\n7408122F1204159UTO<<<<<<<<<<<6\nERIKSSON<<ANNA<MARIA<<<<<<<<<<"
will result in the following JSON output:
[
{
"name" : "documentType",
"parsed" : "td1",
"rawString" : ""
},
{
"name" : "documentCode",
"parsed" : "I",
"rawString" : "I<"
},
{
"name" : "issuingState",
"parsed" : "UTO",
"rawString" : "UTO"
},
{
"name" : "documentNumber",
"parsed" : "D23145890",
"rawString" : "D23145890"
},
{
"name" : "optional",
"parsed" : "",
"rawString" : "<<<<<<<<<<<<<<<"
},
{
"name" : "birthDate",
"parsed" : {
"day" : 12,
"month" : 8,
"year" : 74
},
"rawString" : "740812"
},
{
"name" : "sex",
"parsed" : "female",
"rawString" : "F"
},
{
"name" : "expiryDate",
"parsed" : {
"day" : 15,
"month" : 4,
"year" : 12
},
"rawString" : "120415"
},
{
"name" : "nationality",
"parsed" : "UTO",
"rawString" : "UTO"
},
{
"name" : "optional1",
"parsed" : "",
"rawString" : "<<<<<<<<<<<"
},
{
"name" : "name",
"parsed" : {
"primary" : [ "ERIKSSON" ],
"secondary" : [ "ANNA", "MARIA" ],
"truncated" : false
},
"rawString" : "ERIKSSON<<ANNA<MARIA<<<<<<<<<<"
},
{
"name" : "metadata",
"parsed" : {
"checksumValidation" : {
"birthDate" : true,
"compositeChecksum" : true,
"documentNumber" : true,
"expiryDate" : true
}
},
"rawString" : ""
}
]
Common fields
The four types of MRTDs specified by the ICAO share most of the fields encoded in the Machine Readable Zone (MRZ) of the travel document.
The following fields are exposed for all ICAO MRTDs:
Data Element ID |
Meaning |
Parsed Content |
---|---|---|
documentType |
Document Type |
One of the following values:
|
documentCode |
Document Type Code |
One of the following values:
|
documentNumber |
Document Number / Passport Number |
String with the following interpretation:
|
expiryDate |
Date of expiry |
Dictionary with these key/value pairs:
with YY, MM, DD as integers. Entries are omitted from the dictionary if they are not specified by the input. |
issuingState |
Issuing State |
Three-letter string specified in ICAO document 9303-3. |
name |
Name |
Dictionary with these key/value pairs:
|
birthDate |
Date of birth |
Dictionary with these key/value pairs:
with YY, MM, DD as integers. Entries are omitted from the dictionary if they are not specified by the input. |
sex |
Sex |
One of the following values:
|
nationality |
Nationality |
Three-letter string specified in ICAO document 9303-3. |
optional |
Optional Data |
For use of the issuing State or organization. |
Please refer to the following sections for deviations from the the above table.
TD3 fields
‘optional’: Usually employed to store the document holder’s personal number.
MRV fields
‘documentNumber’: At the discretion of the issuing State, either the passport number or the visa number shall be used in this field.
‘expiryDate’: In most cases this will be the date of expiry of the MRV and indicates the last day on which the visa can be used to seek entry. For some States this will be the date by or on which the holder should have left.
MRTD extensions
TD2/FrenchID fields
The French ID format is different then other ICAO formats in Common and does not contain all information described in the common fields section. For clarity, there is a complete example of TD2/FrenchID format.
Parsing the following code:
"IDFRABOITON<<<<<<<<<<<<<<<<<<<382020\n1203382018024PIERRE<<EMMANU8712068M5\n"
will result in the following JSON output:
[
{
"name" : "documentCode",
"parsed" : "ID",
"rawString" : "ID"
},
{
"name" : "issuingCountry",
"parsed" : "FRA",
"rawString" : "FRA"
},
{
"name" : "lastName",
"parsed" : {
"lastName" : "BOITON",
"truncated" : false
},
"rawString" : "BOITON<<<<<<<<<<<<<<<<<<<"
},
{
"name" : "officeOfIssuance",
"parsed" : 20,
"rawString" : "020"
},
{
"name" : "dateOfIssuance",
"parsed" : {
"month" : 3,
"year" : 12
},
"rawString" : "1203"
},
{
"name" : "departmentOfIssuance",
"parsed" : "382",
"rawString" : "382"
},
{
"name" : "managementCenterSign",
"parsed" : 1802,
"rawString" : "01802"
},
{
"name" : "firstNames",
"parsed" : {
"firstNames" : [ "PIERRE", "EMMANU" ],
"truncated" : true
},
"rawString" : "PIERRE<<EMMANU"
},
{
"name" : "birthDate",
"parsed" : {
"day" : 6,
"month" : 12,
"year" : 87
},
"rawString" : "871206"
},
{
"name" : "sex",
"parsed" : "male",
"rawString" : "M"
},
{
"name" : "documentType",
"parsed" : "td2/frenchID",
"rawString" : ""
},
{
"name" : "metadata",
"parsed" : {
"checksumValidation" : {
"birthDate" : true,
"compositeChecksum" : true,
"issuanceInformation" : true
}
},
"rawString" : ""
}
]
The following fields are exposed for TD2/FrenchID:
Data Element ID |
Meaning |
Parsed Content |
---|---|---|
documentType |
Document Type |
Always has string ‘td2/frenchID’. |
documentCode |
Document Type Code |
Always has string ‘ID’. |
issuingState |
Issuing State |
Always has string ‘FRA’. |
lastName |
Last name / Surname |
Dictionary with these key/value pairs:
|
officeOfIssuance |
Office of issuance |
Integer that encodes the office of issuance. |
documentNumber |
Document Number |
String that encodes the document number. |
dateOfIssuance |
Date of issuance |
Dictionary with these key/value pairs:
with YY, MM as integers. |
departmentOfIssuance |
Department Of issuance |
String that encodes the department of issuance. |
managementCenterSign |
Management Center Sign |
Integer assigned by the Management Center in chronological order in relation to the place of issue and the date of application. |
firstNames |
First name and given names |
Dictionary with these key/value pairs:
|
birthDate |
Date of birth |
Dictionary with these key/value pairs:
with YY, MM, DD as integers. Entries are omitted from the dictionary if they are not specified by the input. |
sex |
Sex |
One of the following values:
|
Swiss Driving License fields
The Swiss driving license format differs from the other MRTD formats. For example, no check digit is included in the data. For clarity, there is a complete example of this format.
Parsing the following code:
"AKU735D<<\nFACHE000231268003<<530727<<<<<\nAELLEN<<ROLAND<JOHN<<<<<<<<<<<\n"
will result in the following JSON output:
[
{
"name": "documentNumber",
"parsed": "AKU735",
"rawString": "AKU735"
},
{
"name": "languageCode",
"parsed": "D",
"rawString" : "D"
},
{
"name": "documentCode",
"parsed": "FA",
"rawString" : "FA"
},
{
"name": "issuingState",
"parsed": "CHE",
"rawString" : "CHE"
},
{
"name": "pinCode",
"parsed": "000231268",
"rawString" : "000231268"
},
{
"name": "versionNumber",
"parsed": "003",
"rawString" : "003"
},
{
"name": "birthDate",
"parsed": {
"year": 53,
"month": 7,
"day": 27
},
"rawString" : "530727"
},
{
"name": "name",
"parsed": {
"primary": [
"AELLEN"
],
"secondary": [
"ROLAND",
"JOHN"
]
},
"rawString" : "AELLEN<<ROLAND<JOHN<<<<<<<<<<<"
},
{
"name": "documentType",
"parsed": "swissDL",
"rawString": ""
},
{
"name" : "metadata",
"parsed" : {
"checksumValidation" : null
},
"rawString" : ""
}
]
The following fields are exposed for Swiss Driving License format:
Data Element ID |
Meaning |
Parsed Content |
---|---|---|
documentType |
Document Type |
Always has string ‘swissDL’. |
documentCode |
Document Type Code |
Always has string ‘FA’. |
languageCode |
Language Code |
‘D’/’F’/’I’/’R’. |
issuingState |
Issuing State |
‘CHE’/’LIE’. |
pinCode |
PIN Code |
9 digit number. |
numberVersion |
Number Version |
3 digit number. |
birthDate |
Date of birth |
Dictionary with these key/value pairs:
with YY, MM, DD as integers. Entries are omitted from the dictionary if they are not specified by the input. |
name |
Surnames and names |
Dictionary with these key/value pairs:
|
Parser Options
The parser can be configured by providing a JSON string containing key / value pairs. The following configuration options are available:
Key |
Value Type |
Description |
---|---|---|
relaxedChecksumValidation |
Boolean |
Enabling this option prevents the parser from failing for invalid checksums. Checksum verification results for the parsed fields are indicated using the ‘metadata’ field. |
allowFalsePositiveCompensation |
Boolean |
When enabled the parser compensates characters that were recognized incorrectly by the OCR. Should not be used together with relaxedChecksumValidation option. By default set to false. |
Metadata
The metadata field provides more information about the parsing of the input’s fields. The dictionary encoded in the JSON string of the ‘parsed’ field contains the following entries:
Key |
Value Type |
Description |
---|---|---|
checksumValidation |
Dictionary |
This dictionary contains a key / value entry for every check digit in the input document with the following properties:
|