KBB API alternative: used car values by VIN, with the listings behind them
What developers searching for a Kelley Blue Book API usually need, the MarketCheck endpoints that return it, and the documented request and response for each.
MarketCheck5 min read
For developers building appraisal, trade-in, pricing and marketplace tools
Developers who search for a KBB API usually want car values inside their own product: what a used car is worth from its VIN, mileage and ZIP, the listings behind that number, what private sellers are asking, and the make, model and trim lists that feed a valuation form.
About Kelley Blue Book: as of Oct 2026, its InfoDriver Web Service page describes a REST service for putting Kelley Blue Book Values into a business's website or mobile app, with access requested through a contact form on that page. MarketCheck's numbers come from its own model and from live listings, so they differ from Kelley Blue Book values.
In short. For a used car's value, send
vin,miles,dealer_typeand a ZIP to MarketCheck Price. Base returns the predicted price and the MSRP. The two higher tiers add the comparable listings behind the prediction and, at the top, a full NeoVIN decode. Inventory Search and Private Party Search return asking-price statistics for cars like it, and the taxonomy endpoints feed year, make, model and trim pickers. Label every figure as MarketCheck's, with the count of listings behind it.
What developers looking for a KBB API usually need
| Need | MarketCheck endpoint | Documented sample answer |
|---|---|---|
| A used car's value from VIN, mileage and ZIP | MarketCheck Price Base, GET /v2/predict/car/us/marketcheck_price |
Predicted 29,014, MSRP 38,000 |
| The listings behind the value | MarketCheck Price Premium, .../marketcheck_price/comparables |
114 comparables, median asking price 29,980 |
| The build and its original price | MarketCheck Price Premium Plus, .../comparables/decode, or NeoVIN |
The full decode beside the price |
| Dealer asking prices for the same year, make, model and trim | Inventory Search with vins, match and stats |
7,756 listings, median 41,035.62 |
| What private sellers are asking | Private Party Search with vins, match and stats |
5 listings, median 22,995 |
| Year, make, model and trim pickers | Taxonomy Auto-Complete and Taxonomy Facets | ["Toyota"] for the input toy |
A used car's value from VIN, mileage and ZIP
- Customer enters VIN, miles, ZIP
- MarketCheck Price
- Condition adjustments
- Appraiser confirms
MarketCheck Price takes four inputs: the VIN, the mileage, the dealer type (franchise or independent) and a location, either a ZIP or a city with a state. The documented Base sample prices a car at an independent dealer in ZIP 80215, certified:
curl "https://api.marketcheck.com/v2/predict/car/us/marketcheck_price?api_key=YOUR_API_KEY&vin=2T3DWRFV3LW077677&miles=76189&dealer_type=independent&zip=80215&is_certified=true"{ "marketcheck_price": 29014, "msrp": 38000 }The docs describe the model as trained on recent dealer retail data and retrained weekly, and each prediction as a reading of the market on the day of the call. It answers one question: what this car is worth on a dealer lot of that type near that ZIP today. There is no separate trade-in or private-party figure, so a trade-in offer starts from this prediction and subtracts your own reconditioning and margin. The used car price guide covers appraisal and repricing builds on the same endpoint.
The listings behind the value
The Premium tier takes the same parameters and adds the comparable listings. Here is the documented answer for the same car, trimmed to one listing and a few statistics:
curl "https://api.marketcheck.com/v2/predict/car/us/marketcheck_price/comparables?api_key=YOUR_API_KEY&vin=2T3DWRFV3LW077677&miles=76189&dealer_type=independent&zip=80215&is_certified=true"{
"marketcheck_price": 29014,
"msrp": 38000,
"comparables": {
"num_found": 114,
"listings": [
{ "vin": "2T3DWRFV8LW066769", "year": 2020, "make": "Toyota", "model": "RAV4", "trim": "Limited",
"price": 29101, "miles": 79372, "dos_active": 16, "dist": 3.78 }
],
"stats": {
"price": { "min": 22672, "max": 39995, "median": 29980, "percentiles": { "25.0": 27568.5, "75.0": 32995.25 } }
}
},
"recent_comparables": { "num_found": 19, "stats": { "price": { "median": 30998 } } }
}Show the prediction beside the comparables' median and middle range, each with its label, because they answer different questions: 29,014 is the model's price for this car and mileage, while 29,980 is the median asking price of 114 similar listings. Sort the comparables by dist so the nearest come first. Premium Plus, .../comparables/decode, adds a full NeoVIN decode, so the same answer carries the trim, the options and the original MSRP behind the 38,000.
Asking prices for cars like it
A pricing page often wants the market around a car next to the predicted number. Inventory Search does that with vins and match: the documented example matches a 2023 Ford F-150 XLT on year, make, model and trim, and asks for statistics only:
curl "https://api.marketcheck.com/v2/search/car/active?api_key=YOUR_API_KEY&vins=1FTFW1E81PKE39204&match=year,make,model,trim&stats=price,miles&rows=0"{
"num_found": 7756,
"listings": [],
"stats": {
"price": { "count": 7373, "missing": 383, "median": 41035.62, "percentiles": { "25.0": 37231.78, "75.0": 45035.55 } },
"miles": { "median": 32262.91 }
}
}rows=0 returns the statistics without listings, in one call. Always pass match: without it, the docs say the search falls back to matching on the squish VIN, and they recommend against relying on that default. Add zip and radius to narrow the market to a region.
Private Party Search, GET /v2/search/car/fsbo/active, takes the same parameters and covers for-sale-by-owner listings. Its documented example, matched to a sample VIN the same way, finds 5 listings with a median asking price of 22,995. These are private sellers' asking prices, not a private-party value, and five listings is a thin sample, so show the count beside the median. The private seller guide covers FSBO search pages and private versus dealer price gaps.
Year, make, model and trim pickers
A valuation form that starts with dropdowns needs lists of makes, models and trims. Taxonomy Auto-Complete, GET /v2/specs/car/auto-complete, suggests values as the user types, from MarketCheck's specs database, which lists models whether or not any are in stock:
curl "https://api.marketcheck.com/v2/specs/car/auto-complete?api_key=YOUR_API_KEY&field=make&input=toy"{ "terms": ["Toyota"] }Taxonomy Facets, GET /v2/specs/car/terms, returns every value of a field in one call (field=make,fuel_type in the docs' example), which suits a cached list. Expect raw variants in some fields: the documented trim suggestions for the F-150 include both Harley Davidson and HARLEY-DAVIDSON, so normalize before you display them. The autocomplete guide shows how. When the user has the VIN, skip the dropdowns and send it to MarketCheck Price.
A value endpoint for a trade-in form
- Form posts VIN, miles and ZIP
- MarketCheck Price Premium
- Prediction with the comparables' range
- Appraiser sets the offer
This server-side function returns the prediction with the comparables' middle range, ready for an appraiser's screen:
const BASE = 'https://api.marketcheck.com/v2/predict/car/us/marketcheck_price/comparables'
export interface ValueRequest { vin: string, miles: number, zip: string, dealerType: 'franchise' | 'independent' }
export async function marketValue(req: ValueRequest) {
const url = new URL(BASE)
url.searchParams.set('api_key', process.env.MARKETCHECK_API_KEY ?? '')
url.searchParams.set('vin', req.vin)
url.searchParams.set('miles', String(req.miles))
url.searchParams.set('zip', req.zip)
url.searchParams.set('dealer_type', req.dealerType)
const res = await fetch(url)
// 400 covers missing parameters and a VIN that could not be decoded: ask the user to check the VIN
if (res.status === 400) return null
if (!res.ok) throw new Error(`MarketCheck Price returned ${res.status}`)
const p = await res.json()
const asks = p.comparables?.stats?.price
return {
predicted: p.marketcheck_price, // MarketCheck's prediction for this dealer type and ZIP
msrp: p.msrp,
comparables: p.comparables?.num_found ?? 0,
askingMedian: asks?.median ?? null,
askingRange: asks ? [asks.percentiles['25.0'], asks.percentiles['75.0']] : null
}
}The offer is the store's decision. Your code starts from predicted and subtracts reconditioning and margin, and the appraiser who signs off sees the comparables.
What to know before you switch
- Different numbers. The prediction comes from MarketCheck's own model and dealer listings, so a customer comparing it with another valuation source will see a different figure. Label it with its source.
- One kind of price. The prediction is a dealer price for the dealer type you send, and the same car can price differently at a franchise and an independent store.
- Required inputs.
vin,milesanddealer_type, pluszipor bothcityandstate. On the Base tier only,fallback_to_generic=truereturnsgeneric_pricesfor a VIN that cannot be decoded exactly. - Errors. A 400 means missing parameters or a VIN that could not be decoded, and a 403 means your key cannot use that tier.
- US and Canada. The same three tiers run under
/us/in USD and/ca/in CAD. - Cache by input. Store each answer by VIN, mileage, dealer type and ZIP for the day, and call again when the mileage changes.
Who this is for
Developers building appraisal and trade-in tools, dealer repricing screens, marketplace price badges and insurance valuation workflows who want values, and the listings behind them, from one API.
Start here
- Create a free account and copy your API key. Start on the Free tier for development; plans are on the pricing page.
- Run the documented VIN through Base and Premium and compare the prediction with the comparables' median.
- Add the taxonomy calls to your form, or skip them when the user has the VIN.
- Keep the MarketCheck Price reference open for the tier details and error codes.