Global VIN Decode API

Decode any global VIN to access comprehensive vehicle data and specifications

Try it

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/3GCUDHEL3NG668790

Parameters

PropTypeDefault
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

PropTypeDefault
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)

PropTypeDefault
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.

reasonmeansretry
class_not_covereda motorcycle, trailer, bus, low-speed, incomplete or off-road vehicle, or a truck of GVWR class 6 to 8no
market_not_covereda 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?