A VIN lookup or a trim list gives you a vehicle_id. This call prices that id. You send the id, a mileage, and an optional ZIP code. Trade-in comes back as one low-to-high range. Private-party comes back as a range for each condition: excellent, very good, good, and fair.
Mileage is sent as a string. The default ZIP is 73101 when you omit zipcode.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
Two earlier calls can supply vehicleId. GET /v1/vehicles/vin returns vehicle_id for a VIN. GET /v1/vehicles/trims returns vehicle_id for a year, make, and model, after GET /v1/vehicles/make and GET /v1/vehicles/model. Recalls, GET /v1/vehicles/recalls, take the same id and do not need mileage. Price this id twice if you want both trade-in and private-party.
Value for a vehicle
Endpoint: GET /v1/vehicles/car-value
Documentation:
https://docs.steadyapi.com/#autohub-api-GETapi-v1-vehicles-car-value
Parameters
vehicleId— required vehicle idmileage— required mileage, sent as a stringzipcode— optional ZIP code, default73101priceType— optional:trade-in(default) orprivate-party
priceType changes the shape of body, not just a label. trade-in is one object with value, low, and high. private-party is four condition objects, each with those three numbers. mileage and zipcode move the numbers. Mileage has to be present even when you only want the default trade-in price. Send it as a string, for example 50000.
Python
import requests
url = "https://api.steadyapi.com/v1/vehicles/car-value"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {
"vehicleId": trim["vehicle_id"],
"mileage": "50000",
"zipcode": "73101",
"priceType": "trade-in",
}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
value = response.json().get("body", {})
print(value.get("value"), value.get("low"), value.get("high"))
Annotated sample
A trade-in body is one object with value, low, and high. A private-party body uses those same three keys under each condition:
{
"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 }
}
Read meta.price_type before you parse body. For trade-in, value is the point estimate and low and high are the range. For private-party, those three numbers sit under excellent, verygood, good, and fair. There is no poor key on this response. meta also echoes vehicle_id, zipcode, and mileage.
Practical use
Do not assume body.value exists. That key is only on a trade-in response. On a private-party response, body.value is missing and the numbers live under the condition keys.
The same vehicleId with a different mileage or zipcode is a different price. The default ZIP is 73101, so an omitted ZIP is still a location, not a national average you chose.
The id has to be a vehicle id from VIN or trims. A make id or a model id will not price. Recalls can use the id with no mileage. This call cannot.
👉 Get your API key and price a vehicle: https://steadyapi.com/register