---
title: "Car price history: reading auction price movement over time"
description: "Price history turns a listing into a signal. How auction price series are actually shaped, the mistakes that make them useless, and how to build comparables and valuation on top."
slug: car-price-history-api
canonical: https://thecarapi.com/blog/car-price-history-api
category: Market intelligence
author: TheCarApi Engineering
published: 2026-05-19
updated: 2026-08-07
tags: [price history, valuation, market data, comparables]
---

# Car price history: reading auction price movement over time

A price is a fact about a moment. A price series is a fact about a market — and it is the only one you cannot go back and collect later.

Nearly every question worth asking about a vehicle listing is comparative. Is this cheap? Is the seller moving on price? Has this model softened this quarter? None of those can be answered from the listing in front of you. They all need history, and history has an awkward property: it only accrues in real time. You cannot buy back the six months you did not record.

This is about what auction price series actually look like, the interpretation errors that make them worse than useless, and what you can build once you have them.

## The shape of an auction price series

A wholesale lot generates several distinct kinds of price observation, and conflating them is the first and most damaging mistake.

| Observation | What it means | Safe to compare across lots? |
| --- | --- | --- |
| Opening / start price | Where the seller chose to begin | Weakly — it reflects strategy, not value |
| Current bid | Highest bid so far, possibly below reserve | **No** — it is a floor, not a value |
| Buy-now price | A price at which the car is actually available | Yes |
| Reserve met / not met | Whether the current bid is transactable | Essential context for any of the above |
| Final / hammer | What it actually cleared at | Yes — this is the real signal |
| Relisted price | A second attempt after failing to sell | Yes, but flag it as a relist |

The current-bid row is where most naive models go wrong. A lot sitting at €4,200 with an unmet reserve of €9,000 is not a €4,200 car. Feed unmet-reserve current bids into a valuation model as if they were sale prices and the model will systematically underestimate the market — badly, and in a way that looks fine on aggregate metrics.

> **The relist trap** — A car that fails to sell and is relisted appears as two lots. Count both as observations of market activity and you double-count the same vehicle, over-weighting exactly the cars the market did not want. Deduplicate on VIN where available, and on a specification-plus-mileage signature where it is not.

## What a price change actually tells you

When an observed price moves, there are at least five possible causes, only one of which is "the market changed":

1. A genuine bid arrived — real demand signal.
2. The seller reduced the asking or buy-now price — a supply-side signal about their urgency, which is different information.
3. The auction moved to a new phase with different mechanics.
4. An FX rate moved, on a non-euro source. Nothing about the car changed.
5. A fee or VAT basis changed upstream, so the *same* underlying price is now presented differently.

Causes four and five are why a price series needs to record more than a number and a timestamp. If you cannot tell an FX move from a price cut, your "market softening" chart is partly a currency chart.

```bash
curl -s "https://api.thecarapi.com/api/auction/openlane/11125938/price-history" \
  -H "X-API-Key: $API_KEY"
```

_The series carries both the source-currency figure and the comparable EUR figure at each observation, along with which fields changed — so a currency move is distinguishable from a price move._

## Sampling, and the gaps in your series

Any price history is a sampled series, not a continuous record. Two properties follow, and both matter for interpretation.

First, **you see changes, not moments.** If the observation interval is a few minutes, a burst of bidding in the final ninety seconds of an auction may be compressed into one or two points. The series will show the endpoints correctly and understate the volatility in between.

Second, **absence of a point is not absence of change.** A gap in the series means nothing was observed to have changed, which is different from nothing having changed — particularly around the close of an auction, when the interesting activity is densest and the pipeline is under the most load.

> **Prefer final over trajectory** — For most analytical purposes the clearing price is far more valuable than the path taken to it. Bid trajectory is interesting for auction-dynamics research; if you are building valuation or comparables, weight the final observation heavily and treat the path as context.

## Building comparables

The practical output most teams want is: given this car, what have similar cars actually sold for recently? Building that is mostly a question of defining "similar" without letting the comparable set collapse to zero.

### The matching hierarchy

1. **Same make, model and registration year.** The non-negotiable core.
2. **Mileage within a band** — proportional rather than absolute. ±15% is more sensible than ±20,000 km, which is a rounding error on a 200,000 km car and a different vehicle on a 30,000 km one.
3. **Same fuel and gearbox.** These are large, discrete price effects and should never be pooled.
4. **Same damage state.** Never compare a damaged car to a clean one. This is the single biggest source of nonsense comparables.
5. **Recency window** — 60 to 90 days is usually the right trade-off. Shorter and you have no sample; longer and you are averaging across a market that has moved.

### When the sample is too small

It frequently will be. Relax constraints in a deliberate order rather than all at once, and surface which ones you relaxed:

- First widen the **mileage band** — the cheapest relaxation, and mileage is the easiest variable to adjust for.
- Then widen the **year range** to ±1, adjusting for depreciation.
- Then widen the **geography**, accepting that cross-border price levels differ.
- **Never** relax fuel, gearbox or damage state. A comparable set that mixes those is not a comparable set.

And show the sample size. A valuation built on four observations and one built on four hundred should not look identical to the user. Confidence is information, and hiding it is how a price estimate becomes a liability.

## Reference prices in practice

The `/api/top-offers` endpoint applies this logic to find lots priced below their reference, and — importantly — returns the reference with the lot rather than just a verdict:

```json
{
  "auction_id": 11125938,
  "site_name": "openlane",
  "public_price_eur": 9800,
  "market_reference": {
    "price_eur": 12400,
    "mileage": 71000,
    "km_difference": -6205,
    "explanation": "Reference from comparable listings, adjusted for mileage difference"
  }
}
```

_A deal signal you cannot inspect is a black box. The reference price, the mileage it was drawn at, and the adjustment are all returned so the number can be argued with._

That transparency matters more than the accuracy of any single estimate. Users will find cases where a signal looks wrong, and being able to show them the comparable set turns a credibility problem into a conversation.

## Wholesale is only half the picture

Auction history tells you what the trade pays. It does not tell you what the car retails for, and the spread between those two is where the margin lives. Retail asking prices come from classifieds, which is a separate dataset with separate semantics — an asking price is not a transaction price, and the gap between them varies by model and by how long the ad has been running.

[Used car market value and comparables](/blog/used-car-market-value-comparables) covers combining the two properly, including why asking prices need discounting before you compare them to hammer prices.

## Start recording now

The recurring theme: history is the one dataset that cannot be acquired retroactively. If price intelligence is anywhere on your roadmap — even eighteen months out — the archive needs to exist by then, which means either starting collection today or choosing a provider that already has it. Deciding later is deciding not to have it.

## Frequently asked questions

### What is a car price history API?

An endpoint returning the sequence of observed price changes for a specific auction lot over its lifetime — opening price, bid movements, buy-now changes and the final clearing figure — each with a timestamp and, ideally, an indication of which fields changed so a currency movement can be distinguished from a genuine price change.

### Can I use current bids as market value?

No. A current bid below an unmet reserve is a floor, not a value — the car is not available at that price. Models trained on unmet-reserve current bids as if they were sale prices systematically underestimate the market, and the error is invisible in aggregate quality metrics. Weight final clearing prices instead.

### How far back should price history go for valuation?

For comparables, 60 to 90 days is usually the right window — shorter leaves you without a sample, longer averages across a market that has moved. For detecting seasonal patterns or year-over-year depreciation you need at least two full years, which is why the archive depth of a provider matters more than most buyers realise at evaluation time.

### Why do two providers disagree about what a car is worth?

Almost always the comparable set, not the arithmetic. Different mileage bands, different recency windows, different handling of damaged vehicles, different treatment of relisted lots, and different decisions about whether unsold lots count as observations all move the answer. A provider that shows you the comparable set is more useful than one that shows a more confident number.

### Should relisted vehicles be counted twice?

No. A car that failed to sell and was relisted appears as two lots but is one vehicle, and counting both over-weights exactly the cars the market rejected. Deduplicate on VIN where it is published, and on a specification-plus-mileage signature where it is not — then flag the relist, because the fact that it failed to sell the first time is itself signal.
