Need to pull vehicle data from a VIN programmatically? The mcp.vin API takes a 17-character VIN and returns structured JSON — make, model, year, engine, transmission, plant of assembly — with a single GET request. No API key. No signup.
If you're building anything that touches vehicle data — a used car marketplace, a fleet management dashboard, an insurance quoting tool, a parts catalog — you need structured vehicle specs, and the VIN is the only reliable input you've got.
You could scrape the NHTSA website. That works until the markup changes and your parser breaks at 2 AM. A proper API gives you a stable JSON contract that won't shift under you.
Most VIN decoder APIs charge per request or require a monthly subscription. The mcp.vin API doesn't. It wraps the NHTSA's vPIC (Vehicle Product Information Catalog) database behind a clean REST endpoint and returns everything the NHTSA knows about that VIN.
All endpoints are free and require no authentication.
GET https://mcp.vin/api/vin/{VIN} — Returns make, model, year, engine, drivetrain, body, plant, and more.GET https://mcp.vin/api/vin/{VIN}/validate — Checksum validation, WMI decode, and year detection with no API calls.GET https://mcp.vin/api/vin/{VIN}/recalls — Open and completed safety recalls from NHTSA.GET https://mcp.vin/api/vin/{VIN}/complaints — Consumer complaints filed with NHTSA.GET https://mcp.vin/api/vin/{VIN}/safety — NHTSA 5-star crash test ratings.GET https://mcp.vin/api/vin/{VIN}/fuel — EPA fuel economy data (MPG city/highway/combined).POST https://mcp.vin/api/batch — Decode up to 50 VINs in a single request. Send a JSON array of VIN strings.Here's an actual response for VIN 5YJSA1DG9DFP14705 — a 2013 Tesla Model S:
{
"vin": "5YJSA1DG9DFP14705",
"make": "TESLA",
"model": "Model S",
"year": 2013,
"trim": "Base",
"body_class": "Sedan/Saloon",
"vehicle_type": "PASSENGER CAR",
"drive_type": "RWD/Rear-Wheel Drive",
"fuel_type": "Electric",
"engine_displacement_l": null,
"engine_cylinders": null,
"plant_city": "Fremont",
"plant_state": "CALIFORNIA",
"plant_country": "UNITED STATES (USA)",
"doors": 4,
"error_code": "0",
"error_text": "0 - VIN decoded clean"
}
Fields that don't apply — like engine_displacement_l for an electric vehicle — come back as null. The error_code field tells you if the decode was clean. Always check error_code before trusting the other fields.
error_code and error_text explaining what went wrong. Your code should always check error_code before using the data.
# Decode a 2003 Honda Accord
curl -s https://mcp.vin/api/vin/1HGCM82633A004352 | jq .
# Just grab make, model, and year
curl -s https://mcp.vin/api/vin/1HGCM82633A004352 | jq '{make, model, year}'
async function decodeVin(vin) {
const res = await fetch(`https://mcp.vin/api/vin/${vin}`);
const data = await res.json();
if (data.error_code !== "0") {
throw new Error(`VIN decode failed: ${data.error_text}`);
}
return data;
}
const vehicle = await decodeVin("5YJSA1DG9DFP14705");
console.log(`${vehicle.year} ${vehicle.make} ${vehicle.model}`);
// Output: "2013 TESLA Model S"
import requests
def decode_vin(vin: str) -> dict:
resp = requests.get(f"https://mcp.vin/api/vin/{vin}")
resp.raise_for_status()
data = resp.json()
if data["error_code"] != "0":
raise ValueError(f"VIN decode failed: {data['error_text']}")
return data
vehicle = decode_vin("1HGCM82633A004352")
print(f"{vehicle['year']} {vehicle['make']} {vehicle['model']}")
# Output: "2003 HONDA Accord"
import json, urllib.request
def decode_vin(vin: str) -> dict:
url = f"https://mcp.vin/api/vin/{vin}"
with urllib.request.urlopen(url) as resp:
return json.loads(resp.read())
vehicle = decode_vin("5YJSA1DG9DFP14705")
print(vehicle["make"], vehicle["model"], vehicle["year"])
mcp.vin implements the Model Context Protocol (MCP), which means AI assistants like Claude can connect to it and call VIN decode tools natively. The agent sends a VIN, receives structured JSON, and can reason about the vehicle data without any custom integration code.
Add to your project's .mcp.json:
{
"mcpServers": {
"vin-mcp": {
"command": "npx",
"args": ["-y", "vin-mcp"]
}
}
}
{
"mcpServers": {
"vin-mcp": {
"url": "https://mcp.vin/mcp"
}
}
}
Four tools are available: decode_vin (full decode), validate_vin (quick check), lookup_recalls (recall search), and batch_decode (up to 50 VINs).
| Feature | mcp.vin | Typical paid APIs |
|---|---|---|
| Price | Free | $0.01–$0.50 per request |
| API key required | No | Yes |
| Signup required | No | Yes |
| Data source | NHTSA vPIC + EPA | NHTSA + proprietary |
| Safety ratings | Yes (NHTSA) | Varies |
| Recalls | Yes | Varies |
| Vehicle photos | Yes | Rare |
| MCP support | Yes (stdio + HTTP) | No |
| Batch decode | Up to 50 | Varies |
| Open source | Yes | Rarely |
The main thing you won't get from mcp.vin is vehicle history data (accident reports, title changes, odometer records). That requires paid databases like Carfax or AutoCheck. For factory specs, recalls, safety ratings, and fuel economy, the free API covers everything you need.
Try the API now — no signup needed.
Decode a VIN