ActorStack.dev

Analysing the Spanish used-car market from listing data

What you can and cannot conclude from marketplace listings: asking prices are not transaction prices, inventory is not demand, and the badge distribution tells you more than the fuel type does.

By Oswaldo Carabano8 min read

Short answer

Listing data measures supply and asking prices, not demand or transactions. Used carefully it supports depreciation curves by make and model year, regional price differences across 52 provinces, environmental-badge composition of supply, and dealer-versus-private inventory mix. It does not support claims about what cars actually sold for, or how quickly.

Key points

  • An asking price is an offer, not a transaction. Every conclusion has to be phrased in terms of supply.
  • Depreciation by model year is measurable and robust because year, mileage, power and price are all at 100% coverage.
  • Regional analysis works across all 52 provinces, and province is a proper noun kept in Spanish precisely so it joins cleanly to other Spanish datasets.
  • The DGT badge distribution is the most policy-relevant cut available: it maps directly onto low-emission-zone access.
  • Repeat sweeps with `maxCacheAgeDays: 0` turn a snapshot into a time series, and disappearance from the listing set is the closest available proxy for a sale.
On this page7 sections

Listing data is one of the richest public sources on the Spanish car market and one of the easiest to over-read. It measures what sellers are asking, in the moment you looked. Everything you can legitimately conclude follows from that sentence, and so does everything you cannot.

What listing data actually measures

Supply and asking prices. Not demand, not transactions, not time to sale. A listing is an offer that may be accepted at the asking price, accepted lower, or never accepted at all — and the data cannot distinguish those outcomes, because none of them appears in it.

This is not a limitation to note once and forget. It changes how every finding has to be worded: “asking prices for 2019 diesels fell 6%” is supportable; “2019 diesels lost 6% of their value” is not.

Depreciation curves

The strongest analysis available here, because every input is at 100% coverage: year, mileage, power and asking price. Group by make, model and registration year, take the median asking price per year, and you have an asking-price depreciation curve for a specific model in a specific market.

Two adjustments make it much better. Control for mileage, because year and mileage are correlated but not interchangeable — a 2019 car at 200,000 km is not a 2019 car. And exclude Km 0 listings, which are nearly-new cars self-registered by dealers: they have a recent registration year and almost no mileage, and left in they flatten the first year of every curve.

Regional price differences

Province is at 100% coverage, there are 52 of them, and it is the unit the site's own facets use — so regional analysis is both easy and well supported. Median asking price for the same model varies meaningfully across provinces, and the field stays in Spanish specifically so it joins cleanly to census, income and vehicle-registration data.

Be careful about attribution. A province with higher asking prices may have wealthier buyers, younger stock, more dealers relative to private sellers, or all three. The mix is visible in the data — seller_type, year, km — so decompose it rather than reporting the headline.

Badge composition of supply

The most policy-relevant cut available. environmental_label maps directly onto low-emission-zone access, so the distribution of 0, ECO, C, B and unbadged across a province tells you how exposed that market is to urban access restrictions.

Tracked over time it becomes a measure of supply response to regulation — which is a genuinely interesting series, and one nobody publishes. Coverage is 79.6%, and a null means unbadged or unstated, so report the null share rather than dropping it.

Dealer versus private mix

seller_type is at 100%, which makes the split trivial to compute and easy to over-interpret. The two segments differ in more than who is selling: dealers carry warranties, publish financing, hold newer stock and carry the marketplace valuation on 86.6% of listings against 38.2% for private sellers.

So a naive comparison of dealer and private asking prices is comparing two different sets of cars with two different levels of instrumentation. Match on make, model, year band and mileage band before comparing anything, and say so in the output.

Turning snapshots into a time series

One run is a snapshot. Repeated runs on the same facets, with maxCacheAgeDays: 0 so every row is a fresh read, become a series — and ad_id is the join key that makes it one.

Two things become measurable that a single snapshot cannot give you:

  • Price changes on a specific advert. The same ad_id at a lower price_eur is a seller repricing, which is the closest thing to a demand signal in the dataset.
  • Disappearance. An ad_id that stops appearing has sold, expired or been withdrawn. The data cannot tell you which — but in aggregate, time-to-disappearance by segment is a usable proxy for liquidity, as long as you label it as one.

Keep every snapshot. You cannot re-scrape last week.

Four things not to claim

  1. What cars sold for. You have asks, not transactions.
  2. How fast they sold. Disappearance has at least three causes.
  3. Market size. You have one marketplace's inventory, not the national fleet.
  4. That the site's valuation is correct. It is coches.net's estimate, filled on 77.6% of listings, with no published methodology. Quote it as theirs.

Frequently asked questions

Can listing data tell me what used cars sell for in Spain?
No. It tells you what sellers are asking. A listing that disappears may have sold, expired or been withdrawn, and the data cannot distinguish those.
Can I build a depreciation curve from coches.net data?
Yes, and it is one of the strongest analyses available here, because year, mileage, power and asking price are all filled on 100% of listings. Phrase the output as asking-price depreciation.
How do I track prices over time?
Run the same facets on a schedule with `maxCacheAgeDays: 0` so every row is a fresh read, and keep `ad_id` as the join key. Rows that stop appearing are the closest proxy you have for cars leaving the market.

Sources

Every URL below was requested and returned a page on the date shown.

  1. Operator claimchecked 18 Aug 2026
    Coches.net Car Listings & Dealer Scraper — Actor README and input schemaActorStack / Apify Store
  2. Law or regulatorchecked 18 Aug 2026
    Distintivo ambientalDirección General de Tráfico (Spain)
  3. Platform docschecked 18 Aug 2026
    Dataset storageApify
Close-up of a car instrument cluster showing the speedometer in kilometres and miles per hour.
coches.netGuide

Cars below market price

A concrete screen: which fields to filter on, which segments carry the valuation data, and how to avoid the two biases that make a below-market list look better than it is.

8 min
Paper receipts and printed documents arranged on a desk beside office stationery.
coches.netExplainer

Price rank explained

Coches.net computes its own valuation for each model and publishes it next to the asking price. Two fields, filled on 77.6% of listings, that replace a pricing model you would otherwise have to build.

7 min
A narrow street in Valencia, Spain, lined with parked cars and apartment blocks.
coches.netComparison

Comparing data sources

Coches.net, Milanuncios, Wallapop and AutoScout24 all list Spanish cars, and they differ in the one thing that matters for data work: how much structure the site publishes.

7 min