DEV Community

Vin Lookup
Vin Lookup

Posted on

VIN Position 11 Deep Dive: Plant Codes, Why They Are Manufacturer-Specific, and How to Use Them

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:

  1. The WMI (positions 1-3) to know the manufacturer.
  2. Often the model year (position 10), because makers reuse or reassign codes over time as plants open and close.
  3. The manufacturer's plant table, which is what NHTSA's vPIC database uses when it returns PlantCity, PlantState, PlantCountry and PlantCompanyName from 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),
  };
}
Enter fullscreen mode Exit fullscreen mode

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)