MENU navbar-image

🚗 AutoHub API

AutoHub vehicle API for specs, values, 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."
        ]
    }
}
 

Request      

GET v1/vehicles/autocomplete

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
search required string

Search term. Example: Tundra

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."
        ]
    }
}
 

Request      

GET v1/vehicles/make

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Vehicle year. Example: 2025

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."
        ]
    }
}
 

Request      

GET v1/vehicles/model

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Vehicle year. Example: 2021

makeId required string

Make id from /make. Example: 9

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."
        ]
    }
}
 

Request      

GET v1/vehicles/trims

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Year of the vehicle Example: 2011

makeId required string

Make id from /make. Example: 9

modelId required string

Model id from /model. Example: 774

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."
        ]
    }
}
 

Request      

GET v1/vehicles/vin

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
vin required string

Vehicle Identification Number Example: jm3kkbha5r1166850

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."
        ]
    }
}
 

Request      

GET v1/vehicles/details

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Example: 2025

make required string

Example: Chevrolet

model required string

Example: Silverado EV

bodystyle optional string

optional

zipcode optional string

optional

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."
        ]
    }
}
 

Request      

GET v1/vehicles/car-value

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
vehicle_id required string

Trim id from /trims. Example: 467716

mileage required string

Example: 50000

zipcode optional string

optional Example: 45240

priceType optional string

optional Options:

  • trade-in: Returns single trade-in value with high/low range (default)
  • private-party: Returns values for all condition levels (Excellent, Very Good, Good, Fair) Example: private-party

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."
        ]
    }
}
 

Request      

GET v1/vehicles/reviews

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Example: 2024

make required string

Example: mazda

model required string

Example: cx-5

page optional integer

optional Page number for pagination Example: 1

perPage optional integer

optional Items per page Example: 6

bodystyle optional string

optional

vehicle_id optional string

optional Trim id from /trims.

trim optional string

optional Trim name

sort optional string

optional Sort by (e.g., "recent", "helpful")

filter optional string

optional Filter reviews

keyword optional string

optional Search keyword in reviews

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."
        ]
    }
}
 

Request      

GET v1/vehicles/rankings

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
year required string

Example: 2024

make required string

Example: mazda

model required string

Example: cx-5

bodystyle optional string

optional

zipcode optional string

optional

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."
        ]
    }
}
 

Request      

GET v1/vehicles/depreciation

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
vehicle_id required string

Trim id from /trims. Example: 475635

mileage required integer

Example: 50000

zipcode optional string

optional Example: 73101

condition optional string

optional Options: excellent, verygood, good, fair, poor. Example: verygood

annualMileage optional integer

optional Example: 12000

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."
        ]
    }
}
 

Request      

GET v1/vehicles/recalls

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
vehicle_id optional string

optional Trim id from /trims, or an NHTSA safety-rating vehicle id. Example: 11794

year optional string

optional Model year. Required with make and model when no id or VIN is sent. Example: 2017

make optional string

optional Example: infiniti

model optional string

optional Example: q70

vin optional string

optional 17-character VIN. Decoded through NHTSA vPIC, then matched to recalls.

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."
        ]
    }
}
 

Request      

GET v1/vehicles/dealers

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
zipcode required string

Zip code for search location Example: 60601

make required string

Vehicle make Example: Mazda

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."
        ]
    }
}
 

Request      

GET v1/vehicles/for-sale

Headers

Authorization Bearer {YOUR_AUTH_KEY}

Query Parameters

Parameter Type Description
make required string

Example: mazda

model required string

Example: cx-5

year optional string

optional Example: 2024

zipcode optional string

optional Example: 73170

source optional string

optional Options: carmax or kbb (default: kbb) Example: carmax

radius optional integer

optional Search radius in miles (default: 50) Example: 50

min_price optional integer

optional Minimum price

max_price optional integer

optional Maximum price

min_mileage optional integer

optional Minimum mileage

max_mileage optional integer

optional Maximum mileage

page optional integer

optional Page number (default: 1) Example: 1

per_page optional integer

optional Items per page (default: 20, max: 50) Example: 20

sort_by optional string

optional Sorting fields: relevance, price, mileage, year, distance, date_listed (default: relevance) Example: price

sort_order optional string

optional Sorting order (default: asc) Example: desc