AutoScout24 Used Car Prices by Model — Median & Range avatar

AutoScout24 Used Car Prices by Model — Median & Range

Pricing

from $20.00 / 1,000 model market summaries

Go to Apify Store
AutoScout24 Used Car Prices by Model — Median & Range

AutoScout24 Used Car Prices by Model — Median & Range

Type a make/model and get what that car is asked for on AutoScout24, counted across the whole stock, not one page. Returns cars listed, median asking price, the middle 50% range and, from a 20-car sample, the dealer vs private split. $0.02 per make/model; no results = no charge. Unofficial.

Pricing

from $20.00 / 1,000 model market summaries

Rating

0.0

(0)

Developer

h ichi

h ichi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 days ago

Last modified

Share

What it does: Reads AutoScout24 and returns one price summary per make/model: what every car of that model is being asked for right now, counted across the whole stock.

You enter: Make/model slugs, e.g. bmw/3er, and a country (de, at, fr, it, es, nl, be, com).

You get: One row per make/model: cars listed, median asking price, middle 50% range and the range 80% of cars sit in — counted across the whole stock, in EUR and USD. From a 20-car sample: dealer vs private split, median mileage and first-registration year.

Price: $0.02 per make/model, and every make/model in your list is charged. +$0.002 per listing if you also want the listings themselves (off by default). No results = no charge.

Example: enter bmw/3er (Germany) → 11,013 cars · median €23,030 · middle 50% €10,182–35,857 · 80% of cars €4,584–46,228 · and from a 17-car sample: median mileage 190,000 km, median first registered 2011

Unofficial — not affiliated with AutoScout24. Reads public pages only.

Pricing — $0.02 per make/model

EventPriceWhen
Make/model market summary$0.02Per make/model analyzed
Individual listing$0.002Only if you enable Include individual listings

You pay per make/model, not per month. A default run (1 model, summary only) costs $0.02 and makes 14 requests in about 40 seconds — roughly 2.4 MB on the wire, since every AutoScout24 page is ~170 KB gzipped (~720 KB decompressed). Two models fit comfortably in one run; beyond that the run's time budget starts trimming the ladder and says so in the row. A make/model that returns nothing is never charged.

Input

FieldExampleNotes
models["bmw/3er"]make or make/model slugs, or a full AutoScout24 search URL. Each costs $0.02
country"de"de, at, fr, it, es, nl, lu, be, com. Sets the market, the domain and the currency
ladderSteps9Price ceilings to get exact counts for. One request each
refineSteps3Extra requests spent narrowing whichever band the median or a range edge is stuck in, widest first
mileageMax100000Optional. Conditions the whole analysis on cars at or below this mileage
firstRegistrationFrom2018Optional. Conditions the whole analysis on cars first registered from this year
maxListings20Listings kept for the mix sample. Does not affect the median or the price ranges
includeIndividualItemsfalseAlso return each sampled listing as its own row
convertToUsdtrueAdds USD stats at the current exchange rate

mileageMax and firstRegistrationFrom condition the entire record — the stock count, the ladder, the median and the ranges all become "given this filter". {"models": ["bmw/3er"], "mileageMax": 100000, "firstRegistrationFrom": 2018} is the price distribution of a 2018-or-newer 3 Series under 100,000 km: the shape a trade-in quote or a residual-value model actually needs, and one no listing dump can produce.

Model slugs are localisedbmw/3er on de/at, bmw/serie-3 on fr/lu, bmw/3-series on it/es/nl/be/com. You do not have to know which: AutoScout24 308-redirects to its own slug and the Actor follows it while re-attaching your filters, which the redirect itself strips. resolvedName on the record tells you what the site decided you meant: bmw/3er sent to Luxembourg comes back as "BMW Série 3" (real run, 2026-08-18).

The one thing to understand: counts are exact, the mix is a sample

Every block carries its own basis and the record never lets the two blur:

BlockbasisWhy
price, ladder, bands, totalFoundcount-ladderEach rung is a filter, and AutoScout24 prints the exact hit count for whatever filter you send. priceto=17500 returning 4,410 means 4,410 cars cost €17,500 or less, full stop. The median and the range edges are exact at every band edge, and estimated in a straight line inside the band they land in
sampleStatssampleDealer share, mileage and age come from the ~20 listings actually read, with n stated. They are drawn sort=age&desc=1 — newest first — because that ordering is independent of price. A price-sorted page would tell you what the cheap end of the market looks like, which is a different question

If the ladder ever comes back out of order, or flat (the signature of a filter the site did not apply), the Actor does not publish it as a whole-stock figure: it falls back to the listings it actually read, flips priceBasis to "sample", and says so in the row. You never have to guess which kind of number you are holding.

Output example (type: "market_summary")

Measured on 2026-08-02 (real run) — BMW 3er on autoscout24.de, 14 requests, 40 seconds:

{
"type": "market_summary",
"model": "bmw/3er",
"make": "bmw",
"modelSlug": "3er",
"country": "de",
"countryName": "Germany",
"currency": "EUR",
"totalFound": 11013,
"numberOfPages": 200,
"pageCapReached": true,
"resolvedCategory": "ma13gr100038",
"resolvedName": "BMW 3er",
"price": {
"p10": 4584, "p25": 10182, "median": 23030, "p75": 35857, "p90": 46228,
"min": 1, "max": 1000000, "count": 11013
},
"priceBasis": "count-ladder",
"ladder": [
{ "priceTo": 500, "cumulativeCount": 6, "cumulativeShare": 0.0005 },
{ "priceTo": 950, "cumulativeCount": 51, "cumulativeShare": 0.0046 },
{ "priceTo": 1800, "cumulativeCount": 221, "cumulativeShare": 0.0201 },
{ "priceTo": 3500, "cumulativeCount": 786, "cumulativeShare": 0.0714 },
{ "priceTo": 4800, "cumulativeCount": 1164, "cumulativeShare": 0.1057 },
{ "priceTo": 6700, "cumulativeCount": 1761, "cumulativeShare": 0.1599 },
{ "priceTo": 12500, "cumulativeCount": 3414, "cumulativeShare": 0.3100 },
{ "priceTo": 17500, "cumulativeCount": 4410, "cumulativeShare": 0.4004 },
{ "priceTo": 24500, "cumulativeCount": 5798, "cumulativeShare": 0.5265 },
{ "priceTo": 34000, "cumulativeCount": 7964, "cumulativeShare": 0.7231 },
{ "priceTo": 46500, "cumulativeCount": 9955, "cumulativeShare": 0.9039 },
{ "priceTo": 88500, "cumulativeCount": 10997, "cumulativeShare": 0.9985 }
],
"bands": [
{ "from": null, "to": 500, "count": 6 },
{ "from": 500, "to": 950, "count": 45 },
{ "from": 950, "to": 1800, "count": 170 },
{ "from": 1800, "to": 3500, "count": 565 },
{ "from": 3500, "to": 4800, "count": 378 },
{ "from": 4800, "to": 6700, "count": 597 },
{ "from": 6700, "to": 12500, "count": 1653 },
{ "from": 12500, "to": 17500, "count": 996 },
{ "from": 17500, "to": 24500, "count": 1388 },
{ "from": 24500, "to": 34000, "count": 2166 },
{ "from": 34000, "to": 46500, "count": 1991 },
{ "from": 46500, "to": 88500, "count": 1042 },
{ "from": 88500, "to": null, "count": 16 }
],
"sampleStats": {
"basis": "sample",
"sampleDesign": "newest-listings-first (sort=age), price-independent",
"n": 17,
"dealerCount": 8, "privateSellerCount": 9,
"dealerShare": 0.4706, "privateShare": 0.5294,
"medianMileageKm": 190000,
"medianFirstRegistrationYear": 2011,
"medianAgeYears": 15,
"medianPrice": 11900,
"fuelTop": [["Diesel", 10], ["Benzin", 7]],
"transmissionTop": [["Schaltgetriebe", 9], ["Automatik", 8]],
"excludedNonOrganic": 3
},
"ocsResultsReported": 212,
"filters": {
"mileageMaxKm": null, "firstRegistrationFrom": null,
"damagedListings": "excluded", "vehicleState": "new+used"
},
"requestsMade": 14,
"priceUsd": { "p10": 5277, "p25": 11721, "median": 26511, "p75": 41277, "p90": 53215 },
"exchangeRateEurUsd": 1.15115,
"sourceUrl": "https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&damaged_listing=exclude&desc=0&powertype=kw&sort=price&ustate=N%2CU",
"checkedAt": "2026-08-02T15:42:01Z"
}

Read the ladder and the size of the problem becomes obvious. Half the German 3 Series market is under €24,500 — but 5,798 cars sit below that line, and the page cap can only ever show you about 4,000. The median is on the far side of a wall that paging cannot climb. The same call against France returns 1,371 cars and a €26,523 median: the same car, a market 8× smaller and 15% dearer.

What this Actor does not do

  • No personal data, ever. AutoScout24's listing JSON does carry seller.contactName (a named individual), seller.phones[] and location.street — for private sellers too. Those fields are dropped at the parser, not filtered at the end, and a guard asserts no emitted record contains them. A dealer keeps its company name; a private seller keeps nothing beyond the country its car is in. This is a tool for reading the shape of a market, not for collecting people's contact details
  • No /lst?. AutoScout24's robots.txt disallows the make-less all-inventory search, so a make is always required and there is no free-text keyword mode. It also disallows both GraphQL endpoints and the lightweight count-only API, so this Actor pays for a full HTML page per count rather than take the cheap route it is not allowed to take
  • The individual car page is never opened. /angebote/ is disallowed by robots.txt. You get the listing URL to open yourself; the page behind it is never read
  • No cat= in any URL (Disallow: /*?*cat=*). The site resolves the category itself and echoes it back, which is where resolvedCategory comes from
  • No browser, no proxy, nothing cached. Plain HTTP, 256 MB, every run reads the site live

Notes on the data

  • Asking prices, not transaction prices. Used cars turn over slowly and get repriced often; treat these as the live ask distribution
  • min and max are outliers by construction. A measured BMW 3er is listed at €1 (flagged priceLabel: toolow-price) and another at €1,000,000. The ladder deliberately starts at €500 and its top rung sits near the point that 99.8% of cars are cheaper than, rather than at the maximum, so the median and the ranges are unaffected — but do not read min/max as market signal
  • Promoted slots are excluded from the sample. searchResultType: "Nfm" entries look exactly like plain hits — isOcs: false, Main section — and only that one field gives them away. excludedNonOrganic reports how many were dropped. The site's default sort=standard is tier-weighted too: a measured page was 20 dealers out of 20, which is why every request here sends an explicit sort
  • A page renders 17-20 listings, not 20. The count varies with how many placements the page carried, so n is always measured
  • No listing dates. AutoScout24's result pages carry no publication timestamp, so no turnover or days-on-market metric is possible. firstRegistration gives the fleet's age distribution instead
  • Run it without a proxy. Verified 2026-08-02 with the internal dc-ip-probe, using the filtered URL form (&priceto=…), not just the bare one: a plain Apify datacenter IP gets 200 with and without the datacenter proxy, at every price ceiling tested
  • Counts drift between runs. AutoScout24's inventory changes minute to minute; the same query measured 11,008 / 11,012 / 11,013 within an hour. The ladder is internally consistent because every rung of one run is read within ~30 seconds

If something goes wrong

  • Wrong number or a failed run? Open a ticket on the Issues tab. I read every one and reply within 2 business days (Japan time).
  • You never get a fake "empty" result. If the site can't be read, the run fails and says so.
  • No results = no charge. You only pay for results you actually get.
  • Checked every week. An automatic test runs this tool weekly; if the site changes, I fix it.
  • Public pages only. No login, no personal data, and it goes easy on the site.

More tools by the same author

All tools (Japan marketplaces, real estate, jobs, racing, prediction markets): https://apify.com/jpmarketdata

Disclaimer

Unofficial, independent tool — not affiliated with, endorsed by, or sponsored by AutoScout24. Product names and logos belong to their owners and only say where the data comes from. Data is read from public pages, for market research; check before you act on it.