Documentation
API reference.
Decode VINs, pull official US safety data and look up plates. JSON over HTTPS, one API key, and an MCP server for AI agents.
Overview
Every endpoint lives under https://vehicles-api.com/api/v1, accepts JSON (POST) or a query string (GET) and answers with the same envelope:
{
"status": "success",
"source": "nhtsa",
"data": { … }
}{
"status": "error",
"error": {
"code": "invalid_vin",
"message": "VIN must be 17 characters…"
}
}coverage_us_only on /vin/recalls, /vin/complaints and /vin/safety-ratings (not billed), while /vin/report still returns 200 with the decoded specs and an empty safety block marked coverage: "us_only". No VIN? GET /recalls?make=&model=&year= lists the US-market campaigns for that model.Authentication
Send your API key in the X-API-Key header on every request. Authorization: Bearer <key> works too, and the legacy ?api_key= query parameter is still accepted for backwards compatibility.
X-API-Key: YOUR_API_KEYCreate, rename and revoke keys from the dashboard. Keep keys server-side — never ship them in browser or mobile code.
Errors
Errors use standard HTTP status codes plus a stable machine-readable error.code. Only 2xx responses count toward your quota — an error is never billed.
| HTTP | error.code | Meaning | Counts toward quota |
|---|---|---|---|
| 401 | invalid_api_key | Missing, invalid, revoked or expired API key. | No |
| 403 | no_active_plan | The account has no active trial or subscription. | No |
| 404 | not_found | No record for that input (e.g. unknown Dutch plate). | No |
| 422 | invalid_vin · invalid_plate · invalid_vehicle | Malformed or missing input — VINs are 17 characters without I, O or Q; /v1/recalls needs make, model and year. | No |
| 422 | coverage_us_only | Valid VIN, but NHTSA has no US-market match for it, so recalls, complaints and NCAP ratings don't apply. Returned by the three /v1/vin safety GETs; /v1/vin/report still answers 200. | No |
| 429 | rate_limit_exceeded · quota_exceeded | Per-minute rate limit or monthly quota reached. Back off and retry. | No |
| 502 | upstream_unavailable | The government data source is temporarily down. Retry with backoff. | No |
Rate limits & quotas
Each plan has a monthly request quota and a per-minute rate limit. Responses include X-RateLimit-Limit and X-RateLimit-Remaining; a 429 carries Retry-After. During the 7-day free trial the quota is 50 requests.
| Plan | Requests / month | Requests / minute | Price |
|---|---|---|---|
| Starter | 50,000 | 100 | $49/mo |
| Pro | 250,000 | 500 | $199/mo |
Decode
Year, make, model, trim, engine, transmission and assembly plant for any 17-character VIN.
Parameters — JSON body
| Name | Type | Description |
|---|---|---|
vinrequired |
string | 17 characters · letters I, O and Q are never used Example: 1HGCM82633A004352 |
curl -X POST https://vehicles-api.com/api/v1/vin/decode \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vin":"1HGCM82633A004352"}'
{
"status": "success",
"source": "nhtsa",
"data": {
"vin": "1HGCM82633A004352",
"valid": true,
"year": 2003,
"make": "HONDA",
"model": "Accord",
"trim": "EX-V6",
"body": "Coupe",
"doors": 2,
"vehicle_type": "PASSENGER CAR",
"engine": {
"cylinders": 6,
"displacement_l": 3,
"configuration": "V-Shaped",
"model": "J30A4",
"hp": 240,
"fuel": "Gasoline"
},
"drive": null,
"transmission": {
"style": "Automatic",
"speeds": 5
},
"plant": {
"country": "UNITED STATES (USA)",
"city": "MARYSVILLE",
"state": "OHIO"
},
"manufacturer": "AMERICAN HONDA MOTOR CO., INC."
}
}
Full report
Specs, open recalls, complaint count and crash ratings in a single call.
Parameters — JSON body
| Name | Type | Description |
|---|---|---|
vinrequired |
string | 17 characters · letters I, O and Q are never used Example: 1HGCM82633A004352 |
curl -X POST https://vehicles-api.com/api/v1/vin/report \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vin":"1HGCM82633A004352"}'
{
"status": "success",
"source": "nhtsa",
"data": {
"vin": "1HGCM82633A004352",
"valid": true,
"year": 2003,
"make": "HONDA",
"model": "Accord",
"trim": "EX-V6",
"body": "Coupe",
"doors": 2,
"vehicle_type": "PASSENGER CAR",
"engine": {
"cylinders": 6,
"displacement_l": 3,
"fuel": "Gasoline"
},
"plant": {
"country": "UNITED STATES (USA)",
"city": "MARYSVILLE",
"state": "OHIO"
},
"manufacturer": "AMERICAN HONDA MOTOR CO., INC.",
"coverage": "us",
"recalls_count": 24,
"recalls": [
{
"campaign": "19V182000",
"component": "AIR BAGS:FRONTAL:DRIVER SIDE:INFLATOR MODULE",
"received": "2019-03-06",
"summary": "Replacement driver air bag inflator may explode.",
"consequence": "Sharp metal fragments may strike occupants.",
"remedy": "Dealers will replace the inflator, free of charge."
}
],
"complaints_count": 2013,
"safety_ratings": {
"match": "partial",
"vehicle_description": "2003 Honda Accord 2-DR.",
"overall": null,
"front": {
"driver": 5,
"passenger": 5
},
"side": {
"driver": 5,
"passenger": 5
},
"rollover": 4
}
}
}
Validate
Format and ISO 3779 check-digit validation, computed locally (no upstream call).
Parameters — JSON body
| Name | Type | Description |
|---|---|---|
vinrequired |
string | 17 characters · the 9th character is the check digit Example: 1HGCM82633A004352 |
curl -X POST https://vehicles-api.com/api/v1/vin/validate \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"vin":"1HGCM82633A004352"}'
{
"status": "success",
"source": "local",
"data": {
"vin": "1HGCM82633A004352",
"valid": true,
"check_digit": "3"
}
}
Recalls
Official NHTSA recall campaigns for the decoded year / make / model.
Parameters — query string
| Name | Type | Description |
|---|---|---|
vinrequired |
string | Matched by make + model + year: any vehicle sold in the US, wherever it was built Example: 1HGCM82633A004352 |
curl "https://vehicles-api.com/api/v1/vin/recalls?vin=1HGCM82633A004352" \
-H "X-API-Key: YOUR_API_KEY"
{
"status": "success",
"source": "nhtsa",
"data": {
"vin": "1HGCM82633A004352",
"year": 2003,
"make": "HONDA",
"model": "Accord",
"coverage": "us",
"count": 24,
"recalls": [
{
"campaign": "19V182000",
"component": "AIR BAGS:FRONTAL:DRIVER SIDE:INFLATOR MODULE",
"received": "2019-03-06",
"summary": "Replacement driver air bag inflator may explode.",
"consequence": "Sharp metal fragments may strike occupants.",
"remedy": "Dealers will replace the inflator, free of charge."
}
]
}
}
Recalls by model
US-market NHTSA recall campaigns for a make, model and year — no VIN needed. Zero campaigns is a 200 with an empty list.
Parameters — query string
| Name | Type | Description |
|---|---|---|
makerequired |
string | Brand as sold in the US, case-insensitive Example: BMW |
modelrequired |
string | US-market model name, as NHTSA lists it Example: 320i |
yearrequired |
string | 4-digit model year Example: 2002 |
curl "https://vehicles-api.com/api/v1/recalls?make=BMW&model=320i&year=2002" \
-H "X-API-Key: YOUR_API_KEY"
{
"status": "success",
"source": "nhtsa",
"data": {
"year": 2002,
"make": "BMW",
"model": "320i",
"coverage": "us",
"count": 1,
"recalls": [
{
"campaign": "20V018000",
"component": "AIR BAGS:FRONTAL:PASSENGER SIDE:INFLATOR MODULE",
"received": "2020-01-15",
"summary": "BMW is recalling certain 2000-2006 3 Series vehicles equipped with Takata PSAN passenger frontal air bag inflators.",
"consequence": "An inflator explosion may result in sharp metal fragments striking the driver or other occupants.",
"remedy": "Dealers will replace the passenger front air bag, free of charge."
}
]
}
}
Complaints
Owner complaints filed with NHTSA ODI — the 50 most recent, plus the true total.
Parameters — query string
| Name | Type | Description |
|---|---|---|
vinrequired |
string | Matched by make + model + year: any vehicle sold in the US, wherever it was built Example: 1HGCM82633A004352 |
curl "https://vehicles-api.com/api/v1/vin/complaints?vin=1HGCM82633A004352" \
-H "X-API-Key: YOUR_API_KEY"
{
"status": "success",
"source": "nhtsa",
"data": {
"vin": "1HGCM82633A004352",
"year": 2003,
"make": "HONDA",
"model": "Accord",
"coverage": "us",
"count": 2013,
"complaints": [
{
"odi_number": "11459899",
"date": "2022-03-15",
"crash": false,
"fire": false,
"injured": 0,
"deaths": 0,
"components": [
"AIR BAGS"
],
"summary": "Driver airbag warning light illuminated."
}
]
}
}
Safety ratings
NHTSA NCAP crash-test stars: frontal, side and rollover.
Parameters — query string
| Name | Type | Description |
|---|---|---|
vinrequired |
string | Matched by make + model + year: any vehicle sold in the US, wherever it was built Example: 1HGCM82633A004352 |
curl "https://vehicles-api.com/api/v1/vin/safety-ratings?vin=1HGCM82633A004352" \
-H "X-API-Key: YOUR_API_KEY"
{
"status": "success",
"source": "nhtsa",
"data": {
"vin": "1HGCM82633A004352",
"coverage": "us",
"match": "partial",
"vehicle_description": "2003 Honda Accord 2-DR.",
"overall": null,
"front": {
"overall": null,
"driver": 5,
"passenger": 5
},
"side": {
"overall": null,
"driver": 5,
"passenger": 5
},
"rollover": 4,
"nhtsa_vehicle_id": 4736
}
}
Netherlands
Dutch RDW registration record for a kenteken (plate). RDW data never includes the VIN.
Parameters — JSON body
| Name | Type | Description |
|---|---|---|
platerequired |
string | With or without dashes — K-875-HJ works too Example: K875HJ |
curl -X POST https://vehicles-api.com/api/v1/plate/nl \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plate":"K875HJ"}'
{
"status": "success",
"source": "plate_nl",
"data": {
"plate": "K875HJ",
"vin": null,
"year": 2021,
"make": "TOYOTA",
"model": "AYGO",
"body": "hatchback",
"color": "GRIJS",
"doors": 4,
"seats": 4,
"vehicle_type": "Personenauto",
"engine": {
"cylinders": 3,
"displacement_cc": 998,
"fuel": "Benzine"
},
"mass_kg": 815,
"apk_expires": "2027-01-04",
"first_registration": "2021-01-04",
"open_recall": false
}
}
United States
Plate + state → VIN → specs, via a plate-to-VIN vendor. Returns upstream_unavailable until a vendor key is configured.
Parameters — JSON body
| Name | Type | Description |
|---|---|---|
platerequired |
string | No spaces Example: 7ABC123 |
staterequired |
string | USPS 2-letter code Example: CA |
curl -X POST https://vehicles-api.com/api/v1/plate/us \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"plate":"7ABC123","state":"CA"}'
{
"status": "success",
"source": "plate_us",
"data": {
"plate": "7ABC123",
"state": "CA",
"vin": "1HGCM82633A004352",
"year": 2003,
"make": "HONDA",
"model": "Accord",
"trim": "EX-V6",
"body": "Coupe",
"vehicle_type": "PASSENGER CAR"
}
}
US states
The US states (USPS codes) covered by plate lookups. Static reference data.
curl "https://vehicles-api.com/api/v1/plate/us/states" \
-H "X-API-Key: YOUR_API_KEY"
{
"status": "success",
"source": "plate_us",
"data": {
"states": [
{
"code": "AL",
"name": "Alabama"
},
{
"code": "AK",
"name": "Alaska"
},
{
"code": "…",
"name": "51 entries in total"
}
]
}
}
MCP server
Connect Claude, Cursor, ChatGPT or any Model Context Protocol client to https://vehicles-api.com/mcp (Streamable HTTP). Authenticate with your API key as a Bearer token. initialize and tools/list are free; each tools/call counts as one API request.
Tools: decode_vin, vehicle_report, validate_vin, vin_recalls, vehicle_recalls, vin_complaints, vin_safety_ratings, lookup_dutch_plate, plate_us, list_us_plate_states .
Agent credentials
Autonomous agents can obtain a sandbox key without a signup form, using OAuth 2.0 client credentials:
POST https://vehicles-api.com/oauth/registerwithclient_nameandcontact_email→client_id+client_secretPOST https://vehicles-api.com/oauth/tokenwithgrant_type=client_credentials→access_token- Use the token as
Authorization: Bearer …on the REST API or the MCP server
Machine-readable discovery: auth.md · oauth-protected-resource · api-catalog · MCP server card · agent skills · llms.txt