How DealScore grades work
DealScore compares a listing's asking price to expected market value from live comps, then maps the gap to a grade. No guesswork when data is thin — DealScore would rather say cannot_score than invent a Great deal.
The core number: delta_pct
Every score starts with one ratio. delta_pct = (asking_price - expected_price) / expected_price. Negative means the ask is below market; positive means above.
Expected price comes from dealer listing comps. The default score uses US national inventory. ZIP is optional local refine. Production at cardealscore.com uses live comps (data_source: live). Local dev may use deterministic mock data instead. A private-party ask may grade lower than a dealer ask for the same car, because the comps are dealer-market.
score_v1 grade bands
Rubric version score_v1 turns delta_pct into one of five grades and a 0–100 score (linear map: score = clamp(100 - delta_pct × 200, 0, 100)).
Want the math without scoring a car? POST /api/explain accepts a delta_pct and returns the grade breakdown.
Live comps vs. cannot_score
Production fetches fresh comps on each score request. We don't cache across requests — each call is independent.
- scored — enough nearby comps to compute expected price and a grade.
- cannot_score — live data unavailable, upstream failed, rate limits hit, or comps are too thin. No silent fallback to mock data.
- partial — mock mode only (dev). Fine for local testing, not production truth.
Confidence adjusts with comp count and whether data is live or mock. Fewer comps → lower confidence, even when we can score.
What we don't do
- No Facebook Marketplace or Craigslist URL fetch. Paste listing text on the homepage, or send year/make/model (or VIN), asking price, and mileage. ZIP is optional.
- No affiliate links, no invented testimonials, no fake comp counts.
- No cross-request comp caching. Each call is independent.
See also: how to judge if a car is a good deal, scoring by VIN, scoring with an agent, or call the API from an agent.