AAMVA driver license barcode
The 2D barcode on the back of every US driver license is a PDF417 symbol encoding the licensee's identity fields per the AAMVA Card Design Standard. Originally specified in 2000, currently at version 10 (2020). This is the reference for parser development, kiosk testing, and authorized-issuer workflows.
Barcode symbology: PDF417 (ISO/IEC 15438).
Prior versions: v8 (2013), v9 (2016), v10 (2020). Most states are on v8 or higher; v10 adoption varies by state.
What it is
An AAMVA barcode is a PDF417 symbol whose decoded payload begins with a fixed header, then one "subfile" per data domain. The core subfile is DL (driver license); commercial licenses add ZA..ZZ jurisdiction-specific subfiles.
Header structure:
@
ANSI <IIN><version><jurisdiction version><subfile count>DL<subfile offset><subfile length>The first four bytes are compliance indicator (@), data element separator (\x1e), record separator (\x0d), and the literal ANSI. Parsers that miss these bytes reject the code.
Element codes
Each data element is a 3-character code followed by its value, with a newline separator. The most common:
| Code | Meaning | Format |
|---|---|---|
DAA | Customer name (legacy, pre-v8) | LAST,FIRST,MIDDLE |
DAC | First name | Text |
DCS | Last name | Text |
DAD | Middle name | Text |
DBB | Date of birth | MMDDYYYY |
DBA | License expiration | MMDDYYYY |
DBD | License issue date | MMDDYYYY |
DBC | Sex (1=male, 2=female, 9=N/A) | 1 digit |
DAQ | License number | Alphanumeric |
DAG | Street address line 1 | Text |
DAI | City | Text |
DAJ | State (2-char) | Alpha |
DAK | ZIP code | 5 or 9 digits |
DAU | Height | e.g. 070 in |
DAW | Weight (pounds) | e.g. 180 |
DAY | Eye colour | 3 letters: BLU / BRO / GRN / GRY / HZL / BLK / MAR / PNK / DIC / UNK |
DAZ | Hair colour | 3 letters: BAL / BLK / BLN / BRO / GRY / RED / SDY / WHI / UNK |
DCA | Vehicle class | A / B / C / D / M / Others |
DCB | Restrictions | Alphanumeric |
DCD | Endorsements | Alphanumeric |
DCF | Document discriminator | Jurisdiction-specific |
DDE | Family name truncation | T / N / U |
Issuer Identification Number (IIN)
Every US state has a 6-digit IIN assigned by AAMVA. Examples:
| State | IIN | State | IIN |
|---|---|---|---|
| California | 636014 | New York | 636001 |
| Texas | 636015 | Florida | 636010 |
| Illinois | 636035 | Pennsylvania | 636025 |
| Ohio | 636023 | Georgia | 636055 |
| North Carolina | 636004 | Michigan | 636032 |
The full jurisdiction IIN table (50 states + DC + Canadian provinces + US territories) lives in the generator's jurisdiction dropdown — scroll through to find any issuer.
Version differences
| Version | Published | Key changes |
|---|---|---|
| v8 | 2013 | Added the compliance header (@\x1e\r). Baseline for modern parsers. |
| v9 | 2016 | Clarified DCF document-discriminator format. Added DDE/DDF/DDG truncation flags. |
| v10 | 2020 | Added document-image elements; relaxed height units. Most modern DMVs emit v10 headers. |
What real licenses have that a printed AAMVA barcode does NOT
This matters for anti-fraud workflows: a PDF417 that parses correctly is not the same as a genuine license. Physical licenses rely on:
- Holograms — state seal, laminate patterns, optically variable devices.
- UV/IR features — inks visible only under 365nm UV or IR illumination. Present on every modern license.
- Microprinting — 0.2mm text embedded in the card that resists reprographic copying.
- Tactile features — raised surfaces on the name and birth date, laser-engraved on polycarbonate cards.
- Cryptographic attestation (Mobile DL) — ISO/IEC 18013-5 mDL is the emerging digital-signature layer that proves the card was issued by the jurisdiction.
Age-verification kiosks that rely on PDF417 parsing alone are routinely spoofed. Production workflows must combine barcode parse + at least one physical feature check.
Canonical test vectors
Use obviously-synthetic data when generating test payloads. JOHN TEST, JANE SAMPLE, DOB in the future or pre-1900 — anything that cannot be mistaken for a real person.
| Case | Inputs | Expected header substring |
|---|---|---|
| California v10, synthetic | jurisdiction=CA | ANSI 636014100002DL |
| Texas v10, synthetic | jurisdiction=TX | ANSI 636015100002DL |
| New York v9, synthetic | jurisdiction=NY | ANSI 636001090002DL |
Common pitfalls
- Missing compliance header. Parsers that start reading from
ANSIand skip the@\x1e\rprefix will reject your payload because byte 0 is not@. - Wrong date format. AAMVA uses
MMDDYYYY, notYYYY-MM-DD. An expiration of 2030-03-01 encodes as03012030. - Height units. v10 accepts both inches (
070 in) and centimetres (178 cm). Older versions accept inches only. - Name truncation flags.
DDE/DDF/DDGmust beT(truncated),N(not truncated), orU(unknown). Any other value crashes some parsers. - Jurisdiction-specific element codes. States add
ZA-ZZprefixed codes (California hasZCA, Texas hasZTX, etc.). Unknown codes should be skipped by parsers, not rejected. - IIN mismatch. A California licence with IIN 636015 (Texas) parses successfully but fails any post-parse validity check. Real DMVs cross-check IIN against state embedded in the MRZ.
Scanner compatibility
| Reader | Support | Notes |
|---|---|---|
| iOS Camera (iOS 17+) | License-aware | Wallet app recognises AAMVA payloads and can offer to add as an ID card. |
| Android Camera | Not native | Treats as raw PDF417. License-aware parsing requires an ID-verification app. |
| Google Lens | Raw PDF417 only | Displays the decoded text without AAMVA parsing. |
| Commercial ID-verification SDK (IDEMIA, Jumio, Onfido) | Full parse | Industry-standard for age-verification kiosks and online KYC. |
| Industrial PDF417 scanner (Zebra, Honeywell) | Full parse | Most modern firmware includes AAMVA parsing out of the box. |
See also
- /drivers-license-aamva-barcode-generator/ — the generator with the compliance checklist.
- /standards/ — back to the standards index.
- AAMVA.org — Card Design Standard — authoritative spec.