VIN Structure Explained: WMI, VDS, and VIS

How the 17-character Vehicle Identification Number is organized into the WMI, VDS, check digit, and VIS, and what each section tells you.

The three sections

A modern VIN has 17 characters. Positions 1–3 are the World Manufacturer Identifier (WMI), positions 4–9 are the Vehicle Descriptor Section (VDS), and positions 10–17 are the Vehicle Identifier Section (VIS). The letters I, O, and Q are never used, to avoid confusion with 1 and 0.

Extracting It Automatically

When you read this data from photos, the VIN OCR API returns it as structured JSON, and you can apply the rules on this page as validation. Try it with the free scanner.

Where This Fits

  • World Manufacturer Identifier: The first character indicates the region or country of manufacture (for example 1, 4, or 5 for the United States, 2 for Canada, 3 for Mexico, J for Japan, K for Korea, W for Germany). Together with characters 2 and 3 it identifies the manufacturer and often the vehicle type.
  • Vehicle Descriptor Section: Positions 4–8 describe model, body, engine, and restraint details in a manufacturer-specific way. Position 9 is the check digit in North American VINs.
  • Vehicle Identifier Section: Position 10 encodes the model year, position 11 usually identifies the assembly plant, and positions 12–17 are the production sequence number.
Need more testing? Create a free account to get 200 free credits (equals 200 VIN scans).

Extract It with the API

Read the document from a photo and validate the returned fields.

Prerequisite: Python 3.9+, `pip install requests`, and a STRUCTOCR_API_KEY

PYTHON EXAMPLE
import base64
import os
import requests

with open("vin.jpg", "rb") as image_file:
    image = base64.b64encode(image_file.read()).decode("ascii")

response = requests.post(
    "https://api.structocr.com/v1/vin",
    headers={"x-api-key": os.environ["STRUCTOCR_API_KEY"]},
    json={"img": image},
    timeout=30,
)
response.raise_for_status()
data = response.json()["data"]
print("vin:", data.get("vin"))
print("confidence:", data.get("confidence"))
print("carrier_type:", data.get("carrier_type"))

Technical Specs

  • •Endpoint: POST https://api.structocr.com/v1/vin
  • •Authentication: x-api-key request header
  • •Inputs: JPG, PNG, or WebP as Base64 JSON; maximum 4.5MB
  • •Price: 1 credit per successful request; failed requests are not billed
  • •Free trial: 200 free credits on sign-up, no credit card required

Key Features

  • •World Manufacturer Identifier: The first character indicates the region or country of manufacture (for example 1, 4, or 5 for the United States, 2 for Canada, 3 for Mexico, J for Japan, K for Korea, W for Germany). Together with characters 2 and 3 it identifies the manufacturer and often the vehicle type.
  • •Vehicle Descriptor Section: Positions 4–8 describe model, body, engine, and restraint details in a manufacturer-specific way. Position 9 is the check digit in North American VINs.
  • •Vehicle Identifier Section: Position 10 encodes the model year, position 11 usually identifies the assembly plant, and positions 12–17 are the production sequence number.
  • •Validate after OCR: Apply these rules to API output before storing it.

Reference Summary

Key facts from this page in structured form, for quick lookup.

{
  "The three sections": "A modern VIN has 17 characters.",
  "World Manufacturer Identifier": "The first character indicates the region or country of manufacture (for example 1, 4, or 5 for the United States, 2 for Canada, 3 for Mexico, J for Japan, K for Korea, W for Germany).",
  "Vehicle Descriptor Section": "Positions 4–8 describe model, body, engine, and restraint details in a manufacturer-specific way.",
  "Vehicle Identifier Section": "Position 10 encodes the model year, position 11 usually identifies the assembly plant, and positions 12–17 are the production sequence number.."
}

Frequently Asked Questions

Is every VIN 17 characters?

Vehicles from model year 1981 onward use the standardized 17-character VIN. Older vehicles use manufacturer-specific serial numbers.

Can I decode make and model from the VIN?

Yes. After extracting the VIN, look up the WMI and VDS in a decoding service such as NHTSA’s free vPIC API.

You May Also Like

Related tutorials, platform guides, and comparisons

Tutorial

Java VIN OCR API

Tutorial: How to use the StructOCR Java Client to extract data from VINs. Upload an image for a free test! Includes code samples and JSON schema.

Java · VIN
Tutorial

Mazda VIN Location and VIN OCR API

Where to find the VIN on a Mazda, what its first characters mean, and how to read it from a photo with an API and decode the model year.

VIN
Tutorial

Accelerate Auto Insurance Claims with VIN OCR API

Speed up First Notice of Loss (FNOL) and AI damage estimates. Learn how to extract accurate VINs from blurry, user-generated accident photos instantly.

VIN
Tutorial

Go VIN OCR API

Upload an image for a free test! Tutorial: How to use the StructOCR Go Client to extract data from VIN (Vehicle Identification Number)s. Includes code samples and JSON schema.

Go · VIN
Tutorial

Trailer VIN Plate OCR API

Where the VIN is on a trailer, how to photograph it so it reads reliably, and how to extract it with a VIN OCR API.

VIN
Tutorial

Rivian VIN Location and VIN OCR API

Where to find the VIN on a Rivian, what its first characters mean, and how to read it from a photo with an API and decode the model year.

VIN
Tutorial

C# VIN OCR API

Upload an image for a free test! Tutorial: How to use the StructOCR C# Client to extract data from VIN (Vehicle Identification Number)s. Includes code samples and JSON schema.

C# · VIN
Tutorial

Volkswagen VIN Location and VIN OCR API

Where to find the VIN on a Volkswagen, what its first characters mean, and how to read it from a photo with an API and decode the model year.

VIN
Tutorial

Python VIN OCR API

Tutorial: How to use the StructOCR Python SDK to extract data from VIN (Vehicle Identification Number)s. Upload an image for a free test! Includes code samples and JSON schema.

Python · VIN
Tutorial

Virginia Driver License & ID Card PDF417 API

Decode the PDF417 barcode on Virginia driver licenses and state ID cards into AAMVA JSON, with document_kind to tell licenses from ID cards.

Driver License

Technical Comparisons & Integrations

Explore platform integrations and competitive analysis

From tutorial to production in 5 minutes.

You've seen the code. Now get your API key, grab your 200 free credits, and see it work with your own images. No credit card required.

Instant Access Cancel Anytime No Credit Card