🚗 AutoHub API
AutoHub vehicle API for specs, values, and cars for sale.
- Make, model, and trim lookup, plus VIN decode
- Details, reviews, rankings, depreciation, and recalls
- Car value
- Dealers and cars for sale
Data is normalized from KBB, CarMax, NHTSA, and other vehicle sources.
Year, make id, model id, and trim vehicle_id are the pricing chain.
Details, rankings, reviews, dealers, and for-sale take make and model names.
Vehicle Discovery & Lookup
Search and autocomplete vehicle makes and models by year and make with fast, real-time results.
GET /v1/autocomplete
requires authentication
Vehicle make & model autocomplete.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/autocomplete'
params = {
'search': 'Tundra',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/autocomplete';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'search' => 'Tundra',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/autocomplete"
);
const params = {
"search": "Tundra",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/autocomplete?search=Tundra" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"search": "tesla",
"total": 10
},
"body": [
{
"type": "model",
"make": "TESLA",
"model": "TESMODS",
"name": "Tesla Model S"
},
{
"type": "model",
"make": "TESLA",
"model": "TESMODX",
"name": "Tesla Model X"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/make
requires authentication
Search vehicle make by year.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/make'
params = {
'year': '2025',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/make';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2025',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/make"
);
const params = {
"year": "2025",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/make?year=2025" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2023",
"total": 69
},
"body": [
{
"makeId": 2,
"name": "Acura"
},
{
"makeId": 3,
"name": "Alfa Romeo"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/model
requires authentication
Search vehicle model by year, and model.
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/model'
params = {
'year': '2021',
'makeId': '9',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/model';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2021',
'makeId' => '9',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/model"
);
const params = {
"year": "2021",
"makeId": "9",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/model?year=2021&makeId=9" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2023",
"makeId": "9",
"total": 25
},
"body": [
{
"modelId": "61",
"name": "Blazer"
},
{
"modelId": "40281",
"name": "Bolt EUV"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/trims
requires authentication
Get vehicle trims by year, make ID, and model ID
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/trims'
params = {
'year': '2011',
'makeId': '9',
'modelId': '774',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/trims';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2011',
'makeId' => '9',
'modelId' => '774',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/trims"
);
const params = {
"year": "2011",
"makeId": "9",
"modelId": "774",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/trims?year=2011&makeId=9&modelId=774" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2011",
"makeId": "9",
"modelId": "774",
"total": 7
},
"body": [
{
"name": "LS Pickup 4D 5 3/4 ft",
"vehicle_id": "358402"
},
{
"name": "XFE Pickup 4D 5 3/4 ft",
"vehicle_id": "358405"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/vin
requires authentication
Search vehicle by VIN number
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/vin'
params = {
'vin': 'jm3kkbha5r1166850',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/vin';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'vin' => 'jm3kkbha5r1166850',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/vin"
);
const params = {
"vin": "jm3kkbha5r1166850",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/vin?vin=jm3kkbha5r1166850" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"vin": "JM3KKBHA5R1166850",
"has_results": true
},
"body": {
"using_cads": true,
"vehicle_id": 466424,
"year": "2024",
"make": "MAZDA",
"model": "CX-90",
"vehicle_option_ids": [
11519922,
11519914
],
"additional_option_ids": [
11519951,
11519989,
11519992
],
"trim_name": "Preferred Sport Utility 4D",
"body_style": "SUV",
"engine": "4-Cyl, e-SKYACTIV, Hybrid, 2.5 Liter",
"transmission": "Automatic, 8-Spd e-SKYACTIV-Drive w/Manual Mode",
"drivetrain": "AWD"
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Vehicle Details & Analytics
Retrieve detailed vehicle information including make, model, year, and comprehensive specifications such as performance, fuel economy, dimensions, and features.
GET /v1/details
requires authentication
Retrieve full vehicle details (name, model, trims, specs, features, etc.)
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/details'
params = {
'year': '2025',
'make': 'Chevrolet',
'model': 'Silverado EV',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/details';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2025',
'make' => 'Chevrolet',
'model' => 'Silverado EV',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/details"
);
const params = {
"year": "2025",
"make": "Chevrolet",
"model": "Silverado EV",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/details?year=2025&make=Chevrolet&model=Silverado+EV" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2023",
"make": "mazda",
"model": "cx-5",
"total_trims": 8
},
"body": [
{
"vehicleId": 462025,
"displayName": "2.5 S Sport Utility 4D",
"combinedMpg": "26 MPG",
"maxSeatingCapacity": 5,
"horsepower": "187 @ 6000 RPM",
"standardEngine": "4-Cyl, SKYACTIV-G, 2.5 Liter",
"zeroToSixty": 8.9,
"estimatedElectricRange": 0,
"modelName": "CX-5",
"modelMarketName": "CX-5",
"isEv": false,
"curbWeight": 3728,
"batteryCapacity": 0,
"topSpeed": 128,
"chargeTime": 0,
"torque": 186,
"towingCapacity": 2000,
"driveTrain": "AWD",
"trunkOrCargoCapacity": 30,
"evRange": null,
"epaCity": 24,
"epaHwy": 30,
"epaMpgeCity": 0,
"epaMpgeHwy": null,
"epaCombined": 26,
"epaMpgeCombined": 0,
"fppPrice": 20200,
"bodyStyle": "SUV"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/car-value
requires authentication
Retrieve vehicle value and pricing data including trade-in or private-party values
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/car-value'
params = {
'vehicle_id': '467716',
'mileage': '50000',
'zipcode': '45240',
'priceType': 'private-party',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/car-value';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'vehicle_id' => '467716',
'mileage' => '50000',
'zipcode' => '45240',
'priceType' => 'private-party',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/car-value"
);
const params = {
"vehicle_id": "467716",
"mileage": "50000",
"zipcode": "45240",
"priceType": "private-party",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/car-value?vehicle_id=467716&mileage=50000&zipcode=45240&priceType=private-party" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"vehicle_id": "467716",
"zipcode": "73101",
"price_type": "private-party",
"mileage": "5000",
"generated_at": "2026-06-16 02:15:59"
},
"body": {
"excellent": {
"value": 26880,
"low": 24380,
"high": 29380
},
"verygood": {
"value": 26280,
"low": 23780,
"high": 28780
},
"good": {
"value": 25680,
"low": 23280,
"high": 27980
},
"fair": {
"value": 23980,
"low": 21780,
"high": 26180
}
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/reviews
requires authentication
Retrieve consumer reviews for a specific vehicle
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/reviews'
params = {
'year': '2024',
'make': 'mazda',
'model': 'cx-5',
'page': '1',
'perPage': '6',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/reviews';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2024',
'make' => 'mazda',
'model' => 'cx-5',
'page' => '1',
'perPage' => '6',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/reviews"
);
const params = {
"year": "2024",
"make": "mazda",
"model": "cx-5",
"page": "1",
"perPage": "6",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/reviews?year=2024&make=mazda&model=cx-5&page=1&perPage=6" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2023",
"make": "mazda",
"model": "cx-5",
"total_reviews": 35,
"total_pages": 4,
"page": "2",
"per_page": "10",
"search_terms": [
"safe"
]
},
"body": [
{
"id": 203986087,
"nickname": "Bermo",
"nickname_display": "Bermo",
"location": null,
"anonymous": false,
"year": 2022,
"model": "CX-5",
"make": "MAZDA",
"vehicle_id": 0,
"title": "Mazda still builds real cars",
"review_text": "While they try to ram electric cars down our throats, it’s gratifying to know that there is still a company that builds a real car. This car is amazing and the tech is fantastic. I ordered the NAV chip from Amazon. Don’t. A simple usb cable allows you to project your phone on the 10.4” display.\nI got the select version which is just above the base. I got leather seats, AWD, blind spot monitoring and cross traffic warning, adaptive cruise control, lane keep assist, heated seats, dual climate controls up front and leather wrapped steered no wheel and shifter all standard. \nThe styling is excellent, the interior reminds me of an Acura or a Lexus, and the car is definitely a drivers car. It handles beautifully and I am one of those people that hate CVT transmissions, so I love that Mazda gives you a REAL 6 speed automatic with sport mode. I got the non-turbo version because with the turbo, I wouldn’t have the self discipline not to thrash it every chance I got…and would probably start accumulating tickets as a result. Besides, I plan on having this car for a long time and turbochargers generally shorten the engine lifespan. \nAbout the only mod I decided on was the all weather floor mats…not weather-tech, but the custom leather measured ones for about half the price.\nAlloy wheels come standard. The car even sends me text messages if I forget to lock the doors. Also I love the auto start feature that lets me warm my car up on cold mornings.\nAbout the only criticism I have for the car is that the space behind the rear seat is not generous, but that is by design, not accident. A longer vehicle wouldn’t handle as brilliantly as this one does. No, I never plan to take it off road but for Chicago winters, it performs flawlessly. I am getting about 26 mpg which I am happy with and the headlights are the brightest I have ever had. \nIf you want a vehicle to haul lots of stuff, the RAV4 or CRV would probably be a better fit. But if you want a real drivers car that makes very few compromises, has tons of standard features, safety tech like crazy, standard AWD and something you would be proud of every time you get to drive it, the CX-5 is the compact SUV for you as it was for me!",
"ratings": {
"overall": 5,
"value": 5,
"reliability": 5,
"performance": 4,
"styling": 5,
"comfort": 5,
"quality": 5
},
"recommend": true,
"submission_date": "3/13/2022",
"pros": "Drives like a sports car",
"cons": "Conservative space behind the back seat",
"feedback": {
"positive_count": 2,
"negative_count": 0,
"total_count": 2,
"positive_link": null,
"negative_link": null
},
"photos": [],
"staff_review": false,
"incentivized": false,
"ownership_status": "I own this car"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/rankings
requires authentication
Retrieve vehicle rankings across various categories
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/rankings'
params = {
'year': '2024',
'make': 'mazda',
'model': 'cx-5',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/rankings';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'year' => '2024',
'make' => 'mazda',
'model' => 'cx-5',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/rankings"
);
const params = {
"year": "2024",
"make": "mazda",
"model": "cx-5",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/rankings?year=2024&make=mazda&model=cx-5" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"year": "2023",
"make": "mazda",
"model": "cx-5"
},
"body": [
{
"details": {
"displayName": "Horsepower",
"columnHeader": "HP",
"omnitureName": "rankhp",
"value": "187"
},
"results": [
{
"position": 1,
"value": "564",
"manufacturer": "Fisker",
"model": "Ocean",
"year": 2024
},
{ ... }
]
},
{
"details": {
"displayName": "MPG Combined",
"columnHeader": "MPG",
"omnitureName": "rankmpg",
"value": "26"
},
"results": [
{
"position": 1,
"value": "44",
"manufacturer": "Dodge",
"model": "Hornet",
"year": 2024
},
{ ... }
]
},
{
"details": {
"displayName": "Consumer Ratings",
"columnHeader": "Rating",
"omnitureName": "rankconsrat",
"value": "4.4"
},
"results": [
{
"position": 1,
"value": "4.7",
"manufacturer": "Jeep",
"model": "Compass",
"year": 2024
},
{ ... }
]
}
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/depreciation
requires authentication
Retrieve vehicle depreciation data including historical and future values
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/depreciation'
params = {
'vehicle_id': '475635',
'mileage': '50000',
'zipcode': '73101',
'condition': 'verygood',
'annualMileage': '12000',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/depreciation';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'vehicle_id' => '475635',
'mileage' => '50000',
'zipcode' => '73101',
'condition' => 'verygood',
'annualMileage' => '12000',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/depreciation"
);
const params = {
"vehicle_id": "475635",
"mileage": "50000",
"zipcode": "73101",
"condition": "verygood",
"annualMileage": "12000",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/depreciation?vehicle_id=475635&mileage=50000&zipcode=73101&condition=verygood&annualMileage=12000" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"zipcode": "73101",
"condition": "verygood",
"mileage": 50000,
"annual_mileage": 12000,
"generated_at": "2026-06-16 02:30:47"
},
"body": {
"summary": {
"total_depreciation": 5810,
"depreciation_percentage": 23.52,
"total_years": 5
},
"depreciation_data": [
{
"year": 2024,
"mileage": 26000,
"trade_in_value": 24700,
"private_party_value": 27690,
"is_projected": false
},
{
"year": 2025,
"mileage": 38000,
"trade_in_value": 23250,
"private_party_value": 26250,
"is_projected": false
},
{
"year": 2026,
"mileage": 50000,
"trade_in_value": 21800,
"private_party_value": 24800,
"is_projected": false
},
{ ... }
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/recalls
requires authentication
Retrieve vehicle recall information including safety notices, components affected, and remedies
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/recalls'
params = {
'vehicle_id': '11794',
'year': '2017',
'make': 'infiniti',
'model': 'q70',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/recalls';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'vehicle_id' => '11794',
'year' => '2017',
'make' => 'infiniti',
'model' => 'q70',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/recalls"
);
const params = {
"vehicle_id": "11794",
"year": "2017",
"make": "infiniti",
"model": "q70",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/recalls?vehicle_id=11794&year=2017&make=infiniti&model=q70" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"vehicle_id": "11794",
"year": "2017",
"make": "INFINITI",
"model": "Q70",
"source": "nhtsa",
"total_recalls": 1
},
"body": {
"recalls": [
{
"type": "Recall",
"summary": "Nissan North America, Inc. (INFINITI) is recalling certain 2011-2013 M56, 2012-2013 M35 Hybrid, 2014-2018 Q50, Q70 Hybrid, 2014-2019 Q70, and 2015-2019 Q70L two-wheel drive vehicles. The driveshaft can fatigue and break.",
"component": "POWER TRAIN:DRIVELINE:DRIVESHAFT",
"consequence": "A broken driveshaft can result in a loss of drive power, or a vehicle roll away when the vehicle is in park without the parking brake applied.",
"remedy": "Dealers will replace the driveshaft, free of charge. Owner notification letters were mailed August 13, 2024.",
"report_date": "2024-06-21",
"nhtsa_campaign_id": "24V470000",
"manufacturer_recall_no": null,
"potential_affected_units": null,
"manufacture_dates": null
}
]
}
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Vehicle Commerce & Availability
Find dealers near a ZIP code for one make.
GET /v1/dealers
requires authentication
Search for car dealers by location and vehicle criteria
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/dealers'
params = {
'zipcode': '60601',
'make': 'Mazda',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/dealers';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'zipcode' => '60601',
'make' => 'Mazda',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/dealers"
);
const params = {
"zipcode": "60601",
"make": "Mazda",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/dealers?zipcode=60601&make=Mazda" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"zipcode": "60601",
"make": "mazda",
"total_dealers": 11
},
"body": [
{
"StorefrontWebURL": "https://www.mazdaofchicagoland.com",
"FranchisePhone": "224-307-8496",
"UsedCarFranchiseId": 0,
"ProfileId": 8001,
"MakeId": 30,
"FranchiseId": 7771155,
"Distance": 11,
"FranchiseZip": "60202",
"FranchiseState": "IL",
"FranchiseCity": "Evanston",
"FranchiseAddress1": "1015 Chicago Avenue",
"FranchiseName": "The Autobarn Mazda of Evanston",
"VendorDealerId": "63784869",
"FranchiseAndMake": "The Autobarn Mazda of Evanston",
"PartnerFranchiseId": "63784869",
"MakeName": "MAZDA",
"PrimaryPhoto": "https://assets.cai-media-management.com/dealership/373d900a-7d32-4695-a2bf-2913b7387491.jpg"
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET /v1/for-sale
requires authentication
Retrieve combined vehicle listings from Kelley Blue Book (KBB) and Carmax with normalized schema
Example request:
import requests
import json
url = 'https://api.steadyapi.com/v1/vehicles/for-sale'
params = {
'make': 'mazda',
'model': 'cx-5',
'year': '2024',
'zipcode': '73170',
'source': 'carmax',
'radius': '50',
'page': '1',
'per_page': '20',
'sort_by': 'price',
'sort_order': 'desc',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()$client = new \GuzzleHttp\Client();
$url = 'https://api.steadyapi.com/v1/vehicles/for-sale';
$response = $client->get(
$url,
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
],
'query' => [
'make' => 'mazda',
'model' => 'cx-5',
'year' => '2024',
'zipcode' => '73170',
'source' => 'carmax',
'radius' => '50',
'page' => '1',
'per_page' => '20',
'sort_by' => 'price',
'sort_order' => 'desc',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/for-sale"
);
const params = {
"make": "mazda",
"model": "cx-5",
"year": "2024",
"zipcode": "73170",
"source": "carmax",
"radius": "50",
"page": "1",
"per_page": "20",
"sort_by": "price",
"sort_order": "desc",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());curl --request GET \
--get "https://api.steadyapi.com/v1/vehicles/for-sale?make=mazda&model=cx-5&year=2024&zipcode=73170&source=carmax&radius=50&page=1&per_page=20&sort_by=price&sort_order=desc" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"make": "MAZDA",
"model": "CX-5",
"year": null,
"zipcode": "73170",
"search_radius": 50,
"total_listings": 558,
"total_pages": 28,
"source": "carmax",
"sorting": {
"by": "relevance",
"order": "asc"
},
"price_range": {
"min": 12998,
"max": 28998,
"avg": 21898
},
"year_range": {
"min": 2016,
"max": 2025
},
"mileage_range": {
"min": 14960,
"max": 116814,
"avg": 50235
}
},
"body": [
{
"id": 28135196,
"vin": "JM3KFACM7L0805890",
"year": 2020,
"make": "Mazda",
"model": "CX-5",
"trim": "Touring",
"price": 22998,
"mileage": 31522,
"exterior_color": "Blue",
"interior_color": "Black",
"transmission": "Automatic",
"drive_train": "Front Wheel Drive",
"engine": "2.5L",
"fuel_type": "Gas",
"mpg_city": 25,
"mpg_highway": 31,
"body_style": "4D Sport Utility",
"listing_type": "USED",
"days_on_market": null,
"is_new": false,
"is_certified": false,
"images": [
{
"url": "https://img2.carmax.com/assets/28135196/hero.jpg?width=400&height=300",
"width": 400,
"height": 300,
"alt": "2020 Mazda CX-5"
}
],
"dealer": {
"name": "Oklahoma City",
"phone": "",
"rating": 4.63157894736842,
"review_count": 38,
"location": {
"address": "",
"city": "Oklahoma City",
"state": "OK",
"zip": "",
"distance": 19.1
}
},
"price_details": {
"sale_price": 22998,
"msrp": null,
"price_indicator": null,
"price_valid_until": null
},
"features": [
"Alloy Wheels",
"Rear Defroster",
"Power Mirrors",
...
],
"vhr_preview": [],
"source_url": "https://www.carmax.com/car/28135196",
"stock_number": 28135196
},
{ ... }
]
}
Example response (401, Unauthenticated):
{
"message": "Unauthenticated."
}
Example response (404, Not Found):
{
"success": false,
"message": "Resource Not Found"
}
Example response (422, Error Validations):
{
"message": "The ticker field is required.",
"errors": {
"ticker": [
"The ticker field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.