Depreciation projects what a vehicle is worth over several years from today’s mileage. You need a vehicleId, not a year and model name. The body has a short summary plus one row per year, with trade-in and private-party values.
👉 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
Get vehicleId from GET /v1/vehicles/trims or from the specs on GET /v1/vehicles/details. This call is the multi-year curve. A single price for the current mileage is GET /v1/vehicles/car-value, and that endpoint takes mileage as a string. Here mileage is an integer.
Estimate vehicle depreciation
Endpoint: GET /v1/vehicles/depreciation
Documentation:
https://docs.steadyapi.com/#autohub-api-GETapi-v1-vehicles-depreciation
Parameters
vehicleId— required (example:475635)mileage— required integer, minimum 0 (example:50000)zipcode— optional, default73101condition— optional:excellent,verygood,good,fair,poor. DefaultverygoodannualMileage— optional integer, default12000, maximum100000
Condition and annual mileage change the curve. verygood is one word, with no hyphen. poor is valid here. The car-value endpoint does not use that same condition list. Zip code changes the dollar amounts. The default ZIP is still a place, not a national average you can ignore. The response does not echo vehicleId. Keep the id you sent.
Python
import requests
url = "https://api.steadyapi.com/v1/vehicles/depreciation"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={
"vehicleId": "475635",
"mileage": 50000,
})
response.raise_for_status()
body = response.json().get("body") or {}
summary = body.get("summary") or {}
rows = body.get("depreciation_data") or []
print(summary.get("total_depreciation"), summary.get("depreciation_percentage"))
if rows:
print(rows[0].get("year"), rows[0].get("trade_in_value"), rows[0].get("is_projected"))
Annotated sample
{
"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
}
]
}
The sample meta for this curve is zip 73101, condition verygood, mileage 50000, and annual mileage 12000. total_depreciation is the first trade-in value minus the last one in the series, in dollars. depreciation_percentage is that drop divided by the first trade-in value, rounded to two decimals. Read is_projected on each row. The 2024 row above is not a projection. Later years in the same list can be.
Practical use
The 2026 row in this series is the one whose mileage is 50000, matching meta.mileage. The first row is an earlier year at 26000 miles, not “today” by itself. Use the row whose mileage matches the request when you want the current point on the curve.
trade_in_value and private_party_value are numbers. Do not mix them with car-value’s nested excellent / good objects. That is a different response.
Changing condition or annualMileage builds a new curve. Store those meta fields with the summary so two saves of the same vehicleId stay comparable.
👉 Get your API key and estimate depreciation: https://steadyapi.com/register