🚗 AutoHub API
Access structured vehicle data including specifications, trims, reviews, rankings, market listings, depreciation values, and real-time inventory across multiple sources. Unified automotive intelligence API with normalized data from KBB, Carmax, and trusted providers for car marketplaces, dealer tools, and automotive applications.
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": "investing",
"total": 30
},
"body": {
"users": [
{
"id": 988955288,
"id_str": "988955288",
"verified": false,
"is_dm_able": false,
"is_secret_dm_able": false,
"is_blocked": false,
"can_media_tag": false,
"name": "Investing.com",
"screen_name": "Investingcom",
"profile_image_url": "http://pbs.twimg.com/profile_images/1110172882368368640/pUSI1yPZ_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1110172882368368640/pUSI1yPZ_normal.png",
"location": "Global",
"is_protected": false,
"rounded_score": 109217,
"social_proof": 0,
"connecting_user_count": 0,
"connecting_user_ids": [],
"social_proofs_ordered": [],
"social_context": {
"following": false,
"followed_by": false
},
"tokens": [
{
"token": "investingcom"
},
{
"token": "@investingcom"
},
{
"token": "investing.com"
}
],
"inline": false
},
{ ... }
],
"topics": [
{
"topic": "investing quotes",
"rounded_score": 600,
"tokens": [
{
"token": "investing"
},
{
"token": "quotes"
}
],
"inline": false
},
{ ... }
],
"events": [],
"lists": [],
"oneclick": [],
"hashtags": []
}
}
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": [
{
"modelId": 2,
"name": "Acura"
},
{
"modelId": 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,
"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",
"query": "investing",
"product": "Top",
"next_cursor": "DAACCgACG6ZQgC9AJxAKAAMbplCALz_Y8AgABAAAAAILAAUAAADcRW1QQzZ3QUFBZlEvZ0dKTjB2R3AvQUFBQUJJYnBNR21PUmFnb0J1Z3pLdmFWbEE3RzZTMHFoMlh3TlFibTIza1BkZlIwaHVtUWZJSm03RTZHNTVXS2liV1VHVWJuZ0ZKRmhZeDh3ODhqMzZCbHJBQUc2SmlTc0NXWVpBYm9VZmVEaGZBZWdzZUhmc0oxRUFBRzVwR2xMZWE0RjRicE9yVUF0dFFjQnVpRDVvSzFyRUFHNkprVTduV1lIZ2JwZFFWb1pvaE1RdFdiek5MMWhBQUc2RHVTWkxYWURVPQgABgAAAAAIAAcAAAAADAAICgABCx4d-wnUQAAAAAA",
"count": 18
},
"body": [
{
"__typename": "Tweet",
"rest_id": "1990951529319219322",
"core": {
"user_results": {
"result": {
"__typename": "User",
"id": "VXNlcjo2MTU1ODI4MQ==",
"rest_id": "61558281",
"affiliates_highlighted_label": [],
"avatar": {
"image_url": "https://pbs.twimg.com/profile_images/1758167079843172352/I87PB0PH_normal.jpg"
},
"core": {
"created_at": "Thu Jul 30 18:20:35 +0000 2009",
"name": "Brian Feroldi",
"screen_name": "BrianFeroldi"
},
"dm_permissions": {
"can_dm": true
},
"follow_request_sent": false,
"has_graduated_access": true,
"is_blue_verified": true,
"legacy": {
"default_profile": true,
"default_profile_image": false,
"description": "🔎 I Teach Investors How To Analyze Businesses | Author & Financial Educator | 20+ Years Investing Experience | Free Investing eBook (Link) ⬇️",
"entities": {
"description": {
"urls": []
},
"url": {
"urls": [
{
"display_url": "longtermmindset.co/investing",
"expanded_url": "https://longtermmindset.co/investing",
"url": "https://t.co/6rRnW1rwH7",
"indices": [0, 23]
}
]
}
},
"fast_followers_count": 0,
"favourites_count": 30009,
"followers_count": 635641,
"friends_count": 507,
"has_custom_timelines": true,
"is_translator": false,
"listed_count": 12048,
"media_count": 7204,
"normal_followers_count": 635641,
"pinned_tweet_ids_str": [
"1817714336611144138"
],
"possibly_sensitive": false,
"profile_banner_url": "https://pbs.twimg.com/profile_banners/61558281/1744628915",
"profile_interstitial_type": "",
"statuses_count": 32974,
"translator_type": "none",
"url": "https://t.co/6rRnW1rwH7",
"want_retweets": false,
"withheld_in_countries": []
},
"location": {
"location": "Free Investing 📗 ➜"
},
"media_permissions": {
"can_media_tag": false
},
"parody_commentary_fan_label": "None",
"profile_image_shape": "Circle",
"professional": {
"rest_id": "1615842396897525767",
"professional_type": "Creator",
"category": []
},
"profile_bio": {
"description": "🔎 I Teach Investors How To Analyze Businesses | Author & Financial Educator | 20+ Years Investing Experience | Free Investing eBook (Link) ⬇️"
},
"privacy": {
"protected": false
},
"relationship_perspectives": {
"following": false
},
"tipjar_settings": {
"is_enabled": true,
"venmo_handle": "brian-feroldi"
},
"super_follow_eligible": true,
"verification": {
"verified": false
},
"profile_description_language": "en"
}
}
},
"unmention_data": [],
"edit_control": {
"edit_tweet_ids": [
"1990951529319219322"
],
"editable_until_msecs": "1763518409000",
"is_edit_eligible": false,
"edits_remaining": "5"
},
"is_translatable": false,
"views": {
"count": "63258",
"state": "EnabledWithCount"
},
"source": "\u003Ca href=\"https://hypefury.com\" rel=\"nofollow\"\u003EHypefury\u003C/a\u003E",
"award_eligible": false,
"granted_awards": [],
"grok_translated_post_with_availability": {
"is_available": false
},
"grok_analysis_button": true,
"legacy": {
"bookmark_count": 666,
"bookmarked": false,
"created_at": "Wed Nov 19 01:13:29 +0000 2025",
"conversation_id_str": "1990951529319219322",
"display_text_range": [0, 24],
"entities": {
"hashtags": [],
"media": [
{ ... }
],
"symbols": [],
"timestamps": [],
"urls": [],
"user_mentions": []
},
"extended_entities": {
"media": [
{ ... }
]
},
"favorite_count": 790,
"favorited": false,
"full_text": "The Best Investing Tools https://t.co/aBS6yTmggF",
"is_quote_status": false,
"lang": "en",
"possibly_sensitive": false,
"possibly_sensitive_editable": true,
"quote_count": 3,
"reply_count": 15,
"retweet_count": 173,
"retweeted": false,
"user_id_str": "61558281",
"id_str": "1990951529319219322"
}
},
{ ... }
]
}
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 = {
'vehicleId': '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' => [
'vehicleId' => '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 = {
"vehicleId": "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?vehicleId=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 = {
'vehicleId': '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' => [
'vehicleId' => '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 = {
"vehicleId": "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?vehicleId=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 = {
'vehicleId': '358404',
}
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' => [
'vehicleId' => '358404',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));const url = new URL(
"https://api.steadyapi.com/v1/vehicles/recalls"
);
const params = {
"vehicleId": "358404",
};
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?vehicleId=358404" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}"Example response (200, Success):
{
"meta": {
"version": "v1.0",
"status": 200,
"copywrite": "https://steadyapi.com",
"vehicle_id": "358404",
"total_recalls": 7
},
"body": {
"recalls": [
{
"type": "Recall",
"summary": "GENERAL MOTORS IS RECALLING CERTAIN MODEL YEAR 2011 CADILLAC ESCALADE EXT, CHEVROLET AVALANCHE, ...",
"component": "Suspension:rear:axle:spindle",
"consequence": "THE DRIVER MAY HEAR A BANGING NOISE COMING FROM THE AXLE. IF THE PIN SHIFTS OUT OF POSITION, ...",
"remedy": "DEALERS WILL INSTALL A NEW REAR AXLE CROSS PIN FREE OF CHARGE. THE SAFETY RECALL IS EXPECTED TO BEGIN DURING JANUARY 2011...",
"report_date": "",
"nhtsa_campaign_id": "",
"manufacturer_recall_no": "",
"potential_affected_units": "",
"manufacture_dates": ""
},
{ ... }
]
}
}
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
Search and autocomplete vehicle makes and models by year and make with fast, real-time results.
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.