API · sold on RapidAPI · BASIC $0 / month
VIN Decoder API
Three lookups behind one RapidAPI key: decode a VIN into 22 fields, check it against our salvage records, or turn a US plate into a VIN. Two headers in, JSON out.
Spec plate
VINFREECHECK · V2.0- Host
- vindecoder.p.rapidapi.com
- Auth
- X-RapidAPI-Key
X-RapidAPI-Host - Format
- JSON over HTTPS
- Lookups
- VIN decode · salvage · US plate
- VIN input
- 17 charactersNorth American check digit, position 9
- Plans
- BASIC $0 · PRO $69 · ULTRA $99per month, billed by RapidAPI
Sold through RapidAPI
Endpoints
Base URL https://vindecoder.p.rapidapi.com. Build on /v2.0/decode_vin; the older decode paths are still served for existing integrations.
| Endpoint | Input | Returns |
|---|---|---|
GET/v2.0/decode_vinVIN decode · current | vin · 17 characters | Year, make, model, trim, engine, style, country of manufacture, steering, ABS, tank size, height, length, width, seating, city and highway mpg, fuel type, transmission, drive type, features list. 22 fields. |
GET/v1.1/decode_vinGET /decode_vinOlder versions · still served | vin | Subsets of the v2.0 fields. |
GET/salvage_checkSalvage check | vin | Whether the VIN is in our salvage records, plus title, mileage, primary and secondary damage, and loss type. |
POST/api/v4/decode_plateUS plate lookup | plate, state · 2-letter | The VIN for that plate. |
Parameters and headers
| Name | Where | Used by | Rules |
|---|---|---|---|
vin | Query string | decode_vin, salvage_check | Required. A 17-character VIN; case doesn't matter. Decoding also needs a valid North American check digit (position 9) and no I, O or Q. |
plate | Form body | decode_plate | Required. The plate as issued, at least 3 characters. |
state | Form body | decode_plate | Required. Two-letter code of the issuing state, e.g. TX. |
X-RapidAPI-Key | Header | Every request | Your key from RapidAPI. Keep it on your server. |
X-RapidAPI-Host | Header | Every request | vindecoder.p.rapidapi.com |
Quickstart
Nothing to sign up for on this site. Keys, plans and billing all live on RapidAPI.
- Subscribe
Open the VinFreeCheck listing on RapidAPI and pick a plan. BASIC is $0 a month.
- Copy your key
RapidAPI puts your
X-RapidAPI-Keyin the listing's code snippets. - Call the API
Send the key and
X-RapidAPI-Host: vindecoder.p.rapidapi.comwith every request, from your server.
curl -G "https://vindecoder.p.rapidapi.com/v2.0/decode_vin" \ --data "vin=1VWBT7A33GC006401" \ -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \ -H "X-RapidAPI-Host: vindecoder.p.rapidapi.com"
const url = new URL("https://vindecoder.p.rapidapi.com/v2.0/decode_vin"); url.searchParams.set("vin", "1VWBT7A33GC006401"); const res = await fetch(url, { headers: { "X-RapidAPI-Key": process.env.RAPIDAPI_KEY, "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, }); const data = await res.json(); if (data.success) { const { year, make, model } = data.specification; console.log(year, make, model); // 2016 Volkswagen Passat SE }
import os, requests r = requests.get( "https://vindecoder.p.rapidapi.com/v2.0/decode_vin", params={"vin": "1VWBT7A33GC006401"}, headers={ "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, timeout=10, ) data = r.json() if data["success"]: spec = data["specification"] print(spec["year"], spec["make"], spec["model"]) # 2016 Volkswagen Passat SE
curl -G "https://vindecoder.p.rapidapi.com/salvage_check" \ --data "vin=JHMES96655S007133" \ -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \ -H "X-RapidAPI-Host: vindecoder.p.rapidapi.com"
const url = new URL("https://vindecoder.p.rapidapi.com/salvage_check"); url.searchParams.set("vin", "JHMES96655S007133"); const res = await fetch(url, { headers: { "X-RapidAPI-Key": process.env.RAPIDAPI_KEY, "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, }); const data = await res.json(); if (data.success) console.log(data.info);
import os, requests r = requests.get( "https://vindecoder.p.rapidapi.com/salvage_check", params={"vin": "JHMES96655S007133"}, headers={ "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, timeout=10, ) data = r.json() if data["success"]: print(data["info"]["loss_type"])
curl -X POST "https://vindecoder.p.rapidapi.com/api/v4/decode_plate" \ --data-urlencode "plate=<plate>" \ --data "state=TX" \ -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \ -H "X-RapidAPI-Host: vindecoder.p.rapidapi.com"
const res = await fetch("https://vindecoder.p.rapidapi.com/api/v4/decode_plate", { method: "POST", headers: { "X-RapidAPI-Key": process.env.RAPIDAPI_KEY, "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, body: new URLSearchParams({ plate: "<plate>", state: "TX" }), }); const data = await res.json(); if (data.success) console.log(data.data.vin);
import os, requests r = requests.post( "https://vindecoder.p.rapidapi.com/api/v4/decode_plate", data={"plate": "<plate>", "state": "TX"}, headers={ "X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": "vindecoder.p.rapidapi.com", }, timeout=10, ) vin = r.json()["data"]["vin"]
Real responses
Captured from the API and pretty-printed. The plate response is shown with placeholders.
{
"success": true,
"vin": "1VWBT7A33GC006401",
"specification": {
"vin": "1VWBT7A33GC006401",
"year": "2016",
"make": "Volkswagen",
"model": "Passat SE",
"trim_level": "SE PZEV",
"engine": "1.8L I4 DI",
"style": "Sedan 4D",
"made_in": "United States",
"steering_type": "R&P",
"anti_brake_system": "4-Wheel ABS",
"tank_size": null,
"overall_height": "58.50 inches",
"overall_length": "191.90 inches",
"overall_width": "72.20 inches",
"standard_seating": "5",
"optional_seating": null,
"highway_mileage": "38 miles/gallon",
"city_mileage": "25 miles/gallon",
"fuel_type": "Gasoline",
"transmission": "Automatic",
"drive_type": "FWD",
"features": [
"Heated Seats",
"Keyless Entry",
"Leatherette Seats",
"Rear-View Camera",
"Sun/Moonroof",
"Handsfree/Bluetooth Integration",
"MP3",
"Satellite Radio",
"High Performance Tires",
"Partial Zero Emissions Vehicle"
]
}
}{
"success": true,
"vin": "2FMGK5BC9CBD21837",
"specification": {
"vin": "2FMGK5BC9CBD21837",
"year": "2012",
"make": "Ford",
"model": "Flex SE",
"trim_level": "SE",
"engine": "3.5L V6 24V / SFI",
"style": "SUV 4D",
"made_in": "Canada",
"steering_type": "Rack & Pinion",
"anti_brake_system": "4-Wheel ABS",
"tank_size": "18.60 gallons",
"overall_height": "68.00 inches",
"overall_length": "201.80 inches",
"overall_width": "75.90 inches",
"standard_seating": "7",
"optional_seating": null,
"highway_mileage": "24 miles/gallon",
"city_mileage": "17 miles/gallon",
"fuel_type": "Regular Unleaded",
"transmission": "Automatic",
"drive_type": "Front-Wheel Drive"
}
}{
"success": true,
"is_salvage": true,
"info": {
"images": [],
"vehicle_title": "WA-VEHICLE CERT OF OWNERSHIP-TITL",
"mileage": "123483 ACTUAL",
"primary_damage": "FRONT END",
"secondary_damage": "-",
"loss_type": "COLLISION"
}
}{
"status": 200,
"success": true,
"data": {
"plate": "<plate>",
"state": "TX",
"vin": "<17-char VIN>"
}
}22 fields per decode
Every value is a string, a list, or null when the decoder has nothing for that field. Sample values from the 2016 Passat above.
| Field | Sample value |
|---|---|
| vin | 1VWBT7A33GC006401 |
| year | 2016 |
| make | Volkswagen |
| model | Passat SE |
| trim_level | SE PZEV |
| engine | 1.8L I4 DI |
| style | Sedan 4D |
| made_in | United States |
| steering_type | R&P |
| anti_brake_system | 4-Wheel ABS |
| tank_size | null |
| Field | Sample value |
|---|---|
| overall_height | 58.50 inches |
| overall_length | 191.90 inches |
| overall_width | 72.20 inches |
| standard_seating | 5 |
| optional_seating | null |
| highway_mileage | 38 miles/gallon |
| city_mileage | 25 miles/gallon |
| fuel_type | Gasoline |
| transmission | Automatic |
| drive_type | FWD |
| features | 10 items, e.g. Heated Seats |
| salvage_check | Meaning |
|---|---|
| is_salvage | true when the VIN is in our salvage records |
| info.vehicle_title | Title on record |
| info.mileage | Odometer reading on record |
| info.primary_damage | Main damage |
| info.secondary_damage | Other damage, or - |
| info.loss_type | Cause of the loss, e.g. COLLISION |
| info.images | List of images (may be empty) |
| decode_plate | Meaning |
|---|---|
| status | HTTP status, repeated |
| success | true when a VIN was found |
| data.plate | The plate you sent |
| data.state | Two-letter state |
| data.vin | The 17-character VIN; decode it with decode_vin |
Errors and not found
A lookup that finds nothing is not an error: decode and salvage answer 200 with "success": false, so check that flag before reading the body.
| Status | When | Body |
|---|---|---|
200 | Decode: the VIN fails the North American rules, or there is no data for it. Salvage: the VIN isn't in our records. | {"success":false} |
404 | Plate lookup found no VIN for that plate and state. | plate_not_found |
422 | A required parameter is missing or too short: vin under 15 characters, plate under 3, or state not a two-letter US code. | {"message":"The given data was invalid.","errors":{…}} |
401 403 429 | Answered by RapidAPI before the request reaches us: a missing or wrong key, no subscription to this API, or a plan quota or rate limit reached. | RapidAPI's message |
# decode_vin, salvage_check (HTTP 200) {"success":false} # decode_plate (HTTP 404) { "status": 404, "success": false, "error": { "code": "plate_not_found", "message": null } }
{
"message": "The given data was invalid.",
"errors": {
"vin": [
"The vin must be at least 15 characters."
]
}
}Plans and quotas
Every plan includes all three lookups. BASIC counts per month; PRO and ULTRA count decodes and salvage checks per day. Plate lookups past the allowance cost $0.10 each. Subscribe, upgrade or cancel on RapidAPI. How billing works →
Plan capacity
As listed on RapidAPI| Plan | BASIC$0 / MO | PRO$69 / MO | ULTRA$99 / MO |
|---|---|---|---|
| VIN decodes | 50 / month | 3,000 / day | 20,000 / day |
| Salvage checks | 10 / month | 1,000 / day | 10,000 / day |
| US plate lookups | 10 / monththen $0.10 each | 50 / monththen $0.10 each | 100 / monththen $0.10 each |
| Start free | Choose PRO | Choose ULTRA |
Questions
Q01How do I get an API key?
Subscribe to a plan on the VinFreeCheck listing on RapidAPI; BASIC is $0 a month. RapidAPI issues your X-RapidAPI-Key. Send it with X-RapidAPI-Host: vindecoder.p.rapidapi.com on every request. We don't issue keys ourselves.
Q02Which decode endpoint should I use?
/v2.0/decode_vin. It has the most fields, including the features list. /v1.1/decode_vin and /decode_vin still work and return subsets.
Q03What happens when I hit my quota?
US plate lookups beyond your plan's monthly allowance cost $0.10 each. RapidAPI tracks usage on every endpoint; for higher limits, move to PRO or ULTRA there.
Q04Does it decode VINs from outside North America?
The decoder validates the North American check digit (position 9), so it is built for 17-character VINs on vehicles sold in the US and Canada.
Q05What does "not found" look like?
Decode and salvage return {"success":false}. Plate lookups return a 404 with "code": "plate_not_found".
Q06Can I call the API from a web page?
Call it from your server. A request from the browser would expose your RapidAPI key to anyone who opens the page.
Q07How do I change or cancel my plan?
On RapidAPI, where you subscribed. There is no VinFreeCheck account to manage.
Q08Is the free VIN check on this site the same decoder?
Yes. The free check answers from VINs we have already decoded and is rate-limited; the API decodes live.
Start on BASIC. $0 a month.
Subscribe on RapidAPI, copy your key, make the call. Upgrade to PRO or ULTRA there when you need more.