Skip to content
Security2026-10-20Begin6 min read

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

SectionPositionsMeaning
WMI1–3World Manufacturer Identifier: first char gives the region, first three give the maker (e.g. 1FA = Ford, WBA = BMW, 5YJ = Tesla)
VDS4–8Vehicle Description Section: model, engine, body style (maker-defined)
Check digit9Computed from the other 16 positions — a digit, or X
VIS10–17Model 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

LetterValueLetterValueLetterValue
A=1J=1S=2
B=2K=2T=3
C=3L=3U=4
D=4M=4V=5
E=5N=5W=6
F=6P=7X=7
G=7R=9Y=8
H=8Z=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:

Pos1234567891011121314151617
Char1M8GDM9A?KP042788
Value14874491—27042788
Weight876543210098765432
Product8284835161218100185602410282416

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 charRegionFirst charRegion
1/4/5USAJJapan
2CanadaKKorea
3MexicoLChina
9Brazil/South AmericaRTaiwan
SUKWGermany
VFrance/SpainZItaly

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

  1. An I, O, or Q appears — the alphabet check fails before the checksum even runs; someone transcribed a 0/1/9 wrong.
  2. Spaces and hyphens — registrations and photocopies insert separators; normalize them away (the tool trims, uppercases, and strips whitespace before validating).
  3. 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.
  4. 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.