Position 11 of a 17-character VIN identifies the assembly plant. It's one of the most useful characters for spotting mismatches and understanding recalls, and also one of the most misunderstood, because unlike the model year code it has no universal table. This post explains how it works and how to use it correctly in code and when buying a car.
What the standard says
Under NHTSA's VIN rule (49 CFR Part 565), position 11 must identify the plant of manufacture, and each manufacturer defines its own plant codes and submits them to NHTSA. ISO 3779 leaves position 11 to the manufacturer too.
So the same character means different plants for different makers. A K at position 11 means one factory for one brand and a completely different factory for another. Any "universal plant code chart" you find online is wrong unless it's scoped to a manufacturer.
Reading it correctly
To interpret position 11 you need:
- The WMI (positions 1-3) to know the manufacturer.
- Often the model year (position 10), because makers reuse or reassign codes over time as plants open and close.
- The manufacturer's plant table, which is what NHTSA's vPIC database uses when it returns
PlantCity,PlantState,PlantCountryandPlantCompanyNamefrom a decode.
Plant country vs WMI country
The first VIN character gives the region the WMI was assigned for, often matching the plant country but not always. Position 11 combined with the manufacturer's data gives the actual factory. When they disagree with what a listing says ("German-built!"), trust the decode over the ad.
Why buyers should care
- Recalls. Some recalls are limited to vehicles from one plant and build-date window. Position 11 is part of how manufacturers identify affected VINs, which is why NHTSA's recall lookup asks for the full VIN.
- Mismatches. If the decoded plant country conflicts with the door jamb label ("Made in ...") or the build documents, ask why.
- Production sequence. Positions 12-17 are the serial number, and many makers number per plant, so the plant code plus serial together identify a unique car.
In code
type PlantInfo = { city?: string; state?: string; country?: string; company?: string };
async function getPlant(vin: string): Promise<PlantInfo> {
const res = await fetch(
`https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/${vin}?format=json`
);
const r = (await res.json()).Results[0];
const clean = (s: string) => (s && s.trim() ? s.trim() : undefined);
return {
city: clean(r.PlantCity),
state: clean(r.PlantState),
country: clean(r.PlantCountry),
company: clean(r.PlantCompanyName),
};
}
Tips:
- Treat empty strings as "unknown", not "none".
- Don't build your own position-11 lookup table unless you scope it by WMI and model year and keep it updated; let vPIC do it.
- Display plant country separately from make, so users don't confuse brand nationality with build location.
Summary
Position 11 is the plant code, but it only has meaning in the context of a specific manufacturer (and sometimes model year). Read it through a full-VIN decode, use it to sanity-check listings and understand plant-specific recalls, and don't trust generic charts.
Disclosure: I build VIN Lookup, a free VIN decoder based on NHTSA data.
Top comments (0)