VIN Check Digit Explained: How to Calculate and Validate Position 9
A Vehicle Identification Number is 17 characters stamped on the windshield corner, the door jamb plaque, and your registration. Before you pay a database to look one up, you can verify it yourself in two minutes with paper and math: position 9 is a check digit, a self-contained anti-forgery mechanism built into ISO 3779. Paste any VIN into the online VIN validator for an instant full parse (format, checksum, region, manufacturer, model year); this post walks through exactly what happens under the hood.
The 17-character structure
| Section | Positions | Meaning |
|---|---|---|
| WMI | 1–3 | World Manufacturer Identifier: first char gives the region, first three give the maker (e.g. 1FA = Ford, WBA = BMW, 5YJ = Tesla) |
| VDS | 4–8 | Vehicle Description Section: model, engine, body style (maker-defined) |
| Check digit | 9 | Computed from the other 16 positions — a digit, or X |
| VIS | 10–17 | Model year (pos 10), plant code (pos 11), serial number (pos 12–17) |
Hard rule on the alphabet: VINs use only ABCDEFGHJKLMNPRSTUVWXYZ0123456789 — no I, O, or Q, deliberately excluded because they are indistinguishable from 1, 0, and 9. Transcribing an O where a 0 belongs is the single most common reason validation fails.
Computing the check digit by hand
Step 1: transliterate letters to numbers
| Letter | Value | Letter | Value | Letter | Value |
|---|---|---|---|---|---|
| A=1 | J=1 | S=2 | |||
| B=2 | K=2 | T=3 | |||
| C=3 | L=3 | U=4 | |||
| D=4 | M=4 | V=5 | |||
| E=5 | N=5 | W=6 | |||
| F=6 | P=7 | X=7 | |||
| G=7 | R=9 | Y=8 | |||
| H=8 | Z=9 |
Note the values are not alphabetical positions — R is 9, not 18.
Step 2: multiply by position weights
Each of the 17 positions has a fixed weight; position 9's own weight is 0, so the check digit never feeds its own computation:
weights = 8 7 6 5 4 3 2 10 0 9 8 7 6 5 4 3 2
Step 3: sum, then mod 11
Sum all 17 products, take the remainder mod 11. Remainder 10 is written as X; anything else is the check digit itself.
Worked example
Take 1M8GDM9A?KP042788, with position 9 unknown:
| Pos | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Char | 1 | M | 8 | G | D | M | 9 | A | ? | K | P | 0 | 4 | 2 | 7 | 8 | 8 |
| Value | 1 | 4 | 8 | 7 | 4 | 4 | 9 | 1 | — | 2 | 7 | 0 | 4 | 2 | 7 | 8 | 8 |
| Weight | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 10 | 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
| Product | 8 | 28 | 48 | 35 | 16 | 12 | 18 | 10 | 0 | 18 | 56 | 0 | 24 | 10 | 28 | 24 | 16 |
Sum: 8+28+48+35+16+12+18+10+0+18+56+0+24+10+28+24+16 = 351
351 mod 11 = 10 → the check digit is X, giving the well-known valid example 1M8GDM9AXKP042788. If math-by-hand is not your idea of fun, the VIN validator does the checksum plus region/maker/year decoding in one paste.
Position 10: the 30-year model-year cycle
From 2010 onward the year code cycles through ABCDEFGHJKLMNPRSTVWXY123456789 (again skipping I/O/Q): A=2010, K=2019, L=2020, M=2021, N=2022, P=2023, R=2024, S=2025… The cycle is 30 years long, so an A could also be a 1980 vehicle. The validator labels decoded years as "30-year cycle, possibly +30" rather than pretending to a precision the format does not have.
Region codes from the first character
| First char | Region | First char | Region |
|---|---|---|---|
| 1/4/5 | USA | J | Japan |
| 2 | Canada | K | Korea |
| 3 | Mexico | L | China |
| 9 | Brazil/South America | R | Taiwan |
| S | UK | W | Germany |
| V | France/Spain | Z | Italy |
If the first character's region disagrees with the badge on the trunk, that is a red flag no checksum can fix.
The four common validation failures
- An I, O, or Q appears — the alphabet check fails before the checksum even runs; someone transcribed a 0/1/9 wrong.
- Spaces and hyphens — registrations and photocopies insert separators; normalize them away (the tool trims, uppercases, and strips whitespace before validating).
- Position 9 was mistranscribed — the other 16 characters are fine, only the check digit is wrong; mathematically guaranteed to fail, which is the entire point of the mechanism.
- European-market vehicles don't use a check digit — position 9 as a check digit is a North American requirement (US FMVSS 115). European and some other markets may fill the VIS without following the checksum rule. A European-market VIN failing checksum does not mean it's fake — verify through the manufacturer's official channel.
Implementer's note
Three decisions from building the validator: first, the WMI table is illustrative, not authoritative — the full WMI database (assigned by SAE) is not freely published, so the tool ships a high-frequency prefix set (LSV, LFV, WBA, JHM, 5YJ, …) and shows nothing rather than inventing a manufacturer when a prefix misses. Second, two-character WMIs are a real trap: some makers (Toyota passenger cars, JT) hold a two-char WMI where position 3 is a model code; the implementation falls back to a JT_-style keyed match — skip that layer and every such manufacturer fails recognition. Third, the companion test data generator emits VINs built on real public WMI prefixes with correct checksums but randomized VDS/serial segments: they pass format validation while never accidentally matching a real vehicle — that's a red line for test data.
FAQ
Can a VIN contain the letters I, O, or Q?
No. ISO 3779 excludes all three to prevent confusion with 1, 0, and 9. Any string containing them is not a valid VIN, full stop.
Does a failed check digit always mean a fake VIN?
No. The check digit is mandatory for North American market vehicles; European-market VINs may encode position 9 differently. A checksum failure on a W/V/Z/S-headed VIN warrants checking the coding rule before crying fraud.
Is the VIN the same as the engine number?
No. The VIN identifies the vehicle as a whole; the engine number identifies the engine assembly. Registrations, recalls, and insurance claims key on the VIN.
Where do I go from a valid VIN?
Decode what you can offline (region, maker, year — the validator does this), then use the manufacturer's official lookup for model/trim details. For Chinese-market documents, the China plate format rules post covers the companion identifier on the other end of the car.
This algorithm walkthrough comes from building the validator at ToolVault — the worked example pastes straight into the VIN validator for verification.
Field note
The year decoder originally returned a single year (K → 2019) until an internal review flagged it: pretending precision the 30-year cycle doesn't have is worse than admitting ambiguity. The worked example 1M8GDM9AXKP042788 doubles as a unit-test fixture, so any regression in the weight or transliteration tables surfaces in CI immediately.
Related Tools
Related Articles
Test Data Compliance Boundary: Why Copying Real User Data Into Test Environments Is Already Illegal
Using real user data in test environments violates purpose limitation under PIPL and GDPR: testing is a brand-new processing purpose. The four legal alternatives (anonymization/synthetic/public test ranges/hand-made), how format-valid-but-random works (national checksum standards), and the red-line list. With checksum algorithm tables for CN IDs, phones, and credit codes.
PIPL PIA Self-Check: The Five Triggering Scenarios, Three Assessment Elements, and a Working Framework
China's Personal Information Protection Law (Articles 55-56) requires a prior Personal Information Protection Impact Assessment (PIA) for five categories of processing. This post covers the triggers, the statutory three-element report structure, the three-year retention requirement, and a data-map → risk-matrix → controls framework. With the MLPS/miping/PIA three-pillar relationship.
MLPS 2.0 (China's Cybersecurity Multi-Level Protection Scheme) Self-Check: GB/T 22239, Layer by Layer
A practical self-check framework before China's MLPS level-protection evaluation (dengbao ceping): the filing workflow, high-frequency items across the five technical and five management layers, level-2 vs. level-3 differences, how MLPS relates to the cryptographic assessment (miping), and a remediation order ranked by points-per-effort.