Global VIN Decode API
Decode any global VIN to access comprehensive vehicle data and specifications
The VIN Decode API provides comprehensive vehicle information from any valid 17-character Vehicle Identification Number (VIN) worldwide. Supports vehicles from North America, Europe, Asia, and other global markets.
A VIN whose maker is not in our tables is asked of the public decoders. When they name less than the year, make and model, and a fact about the vehicle says why, /vin answers 207 Multi-Status with what they said, never a guessed make or model. See partial answers.
Endpoint
GET https://api.auto.dev/vin/{vin}View in Browser
https://api.auto.dev/vin/3GCUDHEL3NG668790Parameters
| Prop | Type | Default |
|---|---|---|
vin | string | - |
ambiguity? | boolean | - |
Example Request
curl -X GET "https://api.auto.dev/vin/3GCUDHEL3NG668790" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Example Response
{
"vin": "3GCUDHEL3NG668790",
"vinValid": true,
"wmi": "3GC",
"origin": "Mexico",
"squishVin": "3GCUDHELNG",
"checkDigit": "3",
"checksum": true,
"type": "Active",
"make": "Chevrolet",
"model": "Silverado 1500",
"trim": "ZR2",
"style": "4x4 4dr Crew Cab 5.8 ft. SB",
"body": "Truck",
"engine": "5.3L V8 OHV 16V FFV",
"drive": "4WD",
"transmission": "Automatic",
"vehicle": {
"vin": "3GCUDHEL3NG668790",
"year": 2022,
"make": "Chevrolet",
"model": "Silverado 1500",
"manufacturer": "General Motors de Mexico"
},
"ambiguous": false,
"yearAmbiguous": false
}Response Structure
| Prop | Type | Default |
|---|---|---|
vin? | string | - |
vinValid? | boolean | - |
wmi? | string | - |
origin? | string | - |
squishVin? | string | - |
checkDigit? | string | - |
checksum? | boolean | - |
type? | string | - |
make? | string | - |
model? | string | - |
trim? | string | null | - |
style? | string | null | - |
body? | string | - |
engine? | string | - |
drive? | string | - |
transmission? | string | - |
vehicle.vin? | string | - |
vehicle.year? | number | - |
vehicle.make? | string | - |
vehicle.model? | string | - |
vehicle.manufacturer? | string | - |
ambiguous? | boolean | - |
trims? | string[] | - |
styles? | object[] | - |
yearAmbiguous? | boolean | - |
yearEncoded? | boolean | - |
Photo Availability
Photo coverage is not included in the decode response. To check whether retail, wholesale, or historical photos are available for a VIN, call the dedicated /photos/coverage/{vin} endpoint (part of the Photos API) — it returns hasRetailPhotos, hasWholesalePhotos, hasHistoricalPhotos, and retailPhotoCount.
Use Cases
- Vehicle Identification: Validate VIN format and verify vehicle authenticity for purchase decisions
- Insurance Applications: Get essential vehicle details for policy creation and risk assessment
- Fleet Management: Track and catalog vehicle information across large fleets and inventory systems
Ambiguous VINs
Changed 2026-10-20: an ambiguous VIN no longer gets a guessed trim or style. Add ?ambiguity=true to allow a single
best-guess pick while you move to trims and styles.
A VIN does not always say which trim a vehicle is. Positions 4–8 and 10–11 often match several styles that differ only in
what the maker does not encode, such as a trim level, a battery pack or a package. When that happens, ambiguous is
true and the answer does not guess: style is null, and trim is the trim our trim sources agree on for the VIN, or
the one every vehicle we have verified with that VIN pattern carries, or null. A battery pack, motor or package is not a
trim: a 2023 Rivian R1S is "Adventure" whichever pack it has (a 2026 R1 carries its pack in the VIN, so its trim names
it). trims and styles list the possibilities, most likely first. Where only one catalog separates them, as with
Rivian's packs, styles lists that catalog's variants.
confidence estimates each style's share from current listings for the model and year.
{
"vin": "7G2CEHED3TA100196",
"year": 2026,
"make": "Tesla",
"model": "Cybertruck",
"ambiguous": true,
"trim": null,
"style": null,
"body": "Crew Cab Pickup",
"drive": "all wheel drive",
"trims": ["Dual Motor", "Premium", "Base"],
"styles": [
{ "name": "Dual Motor Crew Cab Pickup", "trim": "Dual Motor", "confidence": 0.5 },
{ "name": "Premium Crew Cab Pickup", "trim": "Premium", "confidence": 0.5 },
{ "name": "Base Crew Cab Pickup", "trim": "Base", "confidence": 0 }
]
}To settle the trim for a specific vehicle, use its build data (OEM Build Data) or the window sticker where they are available.
Partial Answers (207)
A VIN whose maker our tables do not know is asked of the public decoders: vPIC, NHTSA's decoder, and for a VIN built outside North America the EU decoder as well. Year, make and model from them is a normal 200. Less than that is a 207 Multi-Status when a fact about the vehicle says why there is no more: its class (class_not_covered) or its market (market_not_covered). Anything else, or nothing named, is the 404.
A utility trailer from a small maker: the manufacturer and the vehicle type, no make or model, and a year the VIN leaves open.
{
"vin": "1T9P61527VP394134",
"vinValid": true,
"vehicle": {
"vin": "1T9P61527VP394134",
"year": 2027,
"manufacturer": "The Metal Shop",
"type": "Utility Trailers"
},
"yearAmbiguous": true,
"years": [2027, 1997],
"reason": "class_not_covered",
"retryable": false
}A 207 passes the ok check of most HTTP clients, and the decode fields of a 200 (make, model, wmi, squishVin, body, engine, ...) are absent. Branch on the status before reading them:
const res = await fetch(`https://api.auto.dev/vin/${vin}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' },
})
const data = await res.json()
if (res.status === 207) {
// data.vehicle is what a decoder said: manufacturer, type, year; make and model only when named.
// data.reason says why there is no more. It will not change: data.retryable is false.
} else if (res.ok) {
console.log(data.make, data.model, data.vehicle.year)
}Response Structure (207)
| Prop | Type | Default |
|---|---|---|
vin? | string | - |
vinValid? | boolean | - |
vehicle.vin? | string | - |
vehicle.year? | number | - |
vehicle.make? | string | - |
vehicle.model? | string | - |
vehicle.manufacturer? | string | - |
vehicle.type? | string | - |
yearAmbiguous? | boolean | - |
years? | number[] | - |
reason? | string | - |
retryable? | boolean | - |
Reason Codes
A 207 carries one of two reasons, each a fact about the vehicle, never about our tables. A vehicle the decoders name only in part, with neither fact, is a 404.
reason | means | retry |
|---|---|---|
class_not_covered | a motorcycle, trailer, bus, low-speed, incomplete or off-road vehicle, or a truck of GVWR class 6 to 8 | no |
market_not_covered | a VIN built outside North America (first character not 1 to 5) | no |
The same codes ride the /specs and /build partial answers. See error responses.
Billing
A 207 is not a billed call and counts toward no quota.
Error Responses
Invalid VIN
{
"status": 400,
"error": "VIN must be exactly 17 characters containing only letters and numbers (excluding I, O, Q)",
"code": "INVALID_VIN_FORMAT",
"path": "/vin/123Invalid",
"requestId": "a1b2c3d4e5f6g7h8"
}VIN Not Found
A 404 means no decoder could name the vehicle, or what one named says nothing about why there is no more. A vehicle named only in part, with a class or market reason, is a 207.
{
"status": 404,
"error": "No vehicle data found for the provided VIN",
"code": "VIN_NOT_FOUND",
"path": "/vin/3GCUDHEL3NG668790",
"requestId": "b2c3d4e5f6g7h8i9"
}Interactive API Reference
Ready to test this endpoint? Use our interactive API playground to make live requests and see real responses.
Try VIN Decode API
Test this endpoint with your API key and explore live responses
Plan Availability
- Free: ✅ Available
- Growth: ✅ Available
- Scale: ✅ Available
See pricing for plan details and signup.
Was this API reference helpful?