# AutoScout24 Listings — One Row per Car, $0.0006 Each (`jpmarketdata/autoscout24-listings`) Actor

Give one make (and model) or a whole list and get matching AutoScout24 car listings on one country site, one row each — up to 4,000 per search. Returns price, registration year, mileage, fuel, transmission, seller type and URL. $0.0006 per car and nothing else; no results = no charge. Unofficial.

- **URL**: https://apify.com/jpmarketdata/autoscout24-listings.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.60 / 1,000 listing returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## AutoScout24 Listings — One Row per Car, $0.0006 Each

**What it does:** Returns the AutoScout24 car listings that match your searches — one or a whole list — on one country site, one row per car, at a flat rate per row.

**You enter:** Searches, one or many — a make each, e.g. `{"make":"bmw","model":"3-series"}`; country default de.

**You get:** One row per car: price, make, model, variant, registration year, mileage, fuel, transmission, power (kW), dealer or private, seller country, URL; plus the site's total match count and whether its 200-page ceiling (~4,000 cars) was hit.

**Price:** $0.0006 per car delivered, and the count is per search — two searches at 100 cars bill 200. Nothing else is charged. No results = no charge.

**Example:** enter make `bmw`, model `3-series` (Germany) → 11,004 cars found, of which you get up to 4,000 (100 by default) · one row: BMW 318 Touring · 2011 · 118,300 km · Benzin · Automatik · €11,900 · private seller (real run, 2026-08-10)

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

### Pricing — one flat rate per car

**$0.0006 per car returned. Nothing else is charged.** You pay per car, not
per run and not per month.

You are charged for cars that are actually in your results — the charge is
raised with the number of records written, never with the number you asked
for and never with the site's own hit count. A search that matches nothing
costs nothing.

**A search that matches nothing gets a free row, not a failed run.** It is a
`type: "search_summary"` row carrying `search`, `domain`, `filtersApplied`,
`totalFound: 0`, `pushed: 0`, a `keywordStatus` (`not_found` — nothing on that
country site matches; `unknown` — the site reports cars and returned none of
them) and a one-line `hint`. The run finishes green and the row is never
charged. The run fails only when no search could be read at all.

| cars returned | you pay |
|---|---|
| 100 | $0.06 |
| 1,000 | $0.60 |
| 10,000 | $6.00 |

The count is per search, not per run: two searches of 100 cars each bill 200
cars.

### Input

```json
{
  "searches": [
    { "make": "bmw", "model": "3-series", "priceTo": 20000, "yearFrom": 2018 },
    { "make": "audi", "model": "a4", "mileageTo": 100000 }
  ],
  "maxListings": 200,
  "country": "de"
}
```

| field | meaning |
|---|---|
| `searches` | one object per search. `make` is required (AutoScout24's robots.txt disallows the make-less search). |
| `maxListings` | cars per search, 10-4000. Default 100. |
| `country` | `de`, `at`, `be`, `es`, `fr`, `it`, `lu`, `nl`. Default `de`. |

Search keys applied: **`make`, `model`, `priceFrom`, `priceTo`, `yearFrom`,
`yearTo`, `mileageTo`** (prices in EUR, years are registration years,
mileage in km). Every one of them is checked against the server's own echo of
the query before a single record is emitted — see below. Any other key is
ignored, and the run log says which ones and that the results are *not*
filtered by them.

Model slugs differ per country front-end (`3er` on `.de`, `serie-3` on `.fr`).
You do not have to know them: a wrong-but-recognisable slug such as
`3-series` is followed to the canonical one and the search runs normally.

### The 200-page ceiling — why nobody can hand you more than ~4,000 cars

AutoScout24 never lets you page past page 200, however many cars match.
Measured: 200 pages for a 4,981-car search, 200 for an 11,008-car search, and
200 for the 62,000-car BMW search. At ~20 listings a page that is a hard wall
at roughly **4,000 cars**, and it applies to every tool that reads the site,
including this one. No amount of runtime gets past it.

So a "10,000 BMWs" claim is not a thing anyone can deliver, and a 4,000-row
dump of an 11,000-car market is 36% of that market, not the market.

Every record therefore carries:

- `totalFound` — the site's own exact hit count for your search;
- `pagesReported` — how many pages the site says your search has;
- `pagesCeilingHit` — `true` when that number is 200, i.e. the site stopped
  enumerating and there are cars you cannot reach.

When the ceiling is hit the run log says so explicitly. **To reach the rest of
the market, split the search** with `priceFrom`/`priceTo`, `yearFrom`/`yearTo`
or `mileageTo` into slices that each stay under ~4,000 cars.

### Placeholder prices (`priceIsPlaceholder`)

Dealers use the price field for things that are not prices: price-on-request,
a deposit, a parts-only car. On the cheapest page of `bmw/3er` the first two
listings are **€1**, and the third is €400.

These are **not** filtered out — you paid for the rows and you get them — but
each one is flagged `priceIsPlaceholder: true` and counted in the run log, so
"cheapest car" never means "€1 non-price". The cut is on price alone
(≤ €100). The site's own `priceLabel` (`top-price`, `toolow-price`,
`unknown`) is passed through untouched but is *not* used for the flag: it is a
price *evaluation* and appears on perfectly real cars at €10,900.

### Seller details stop at the business

You get what a visitor sees on the listing header: `sellerType` (`Dealer` /
`PrivateSeller`), `sellerId`, `sellerCompanyName`, `sellerPage` (the dealer
page), `sellerCity` and `sellerCountry`. A named contact person, phone
numbers, street and postcode are published by AutoScout24 but are **never**
read and never appear in a row. The individual car page is never opened
— `/angebote/` is disallowed by robots.txt, so you get the listing URL to
open yourself, and the page behind it is never read.

If you need dealer contact data, this Actor is not the tool and will not
become it.

### Output

One row per car, `"type": "listing"`. Measured on 2026-08-10 (real run):

```json
{
  "type": "listing",
  "search": "bmw/3-series",
  "country": "de",
  "currency": "EUR",
  "totalFound": 11004,
  "pagesReported": 200,
  "pagesCeilingHit": true,
  "id": "44a79204-d10d-4551-95ae-24061aa1f969",
  "url": "https://www.autoscout24.de/angebote/bmw-3er-3er-touring-318i-touring-aut-edition-exclusive-benzin-schwarz-cat_ma13gr100038ge25va106mt102tr181-44a79204-d10d-4551-95ae-24061aa1f969",
  "price": 11900,
  "priceLabel": "unknown",
  "priceIsPlaceholder": false,
  "make": "BMW",
  "model": "318",
  "modelGroup": "3er",
  "variant": "Touring",
  "registrationYear": 2011,
  "firstRegistration": "03-2011",
  "mileageKm": 118300,
  "fuel": "Benzin",
  "transmission": "Automatik",
  "powerKw": 105,
  "sellerType": "PrivateSeller",
  "sellerId": "62854916",
  "sellerCompanyName": null,
  "sellerPage": "/lst?atype=C&cid=62854916",
  "sellerCity": "Stuttgart, Landeshauptstadt",
  "sellerCountry": "DE",
  "scrapedAt": "2026-08-10T04:20:41.708448+00:00"
}
```

`price`, `mileageKm`, `registrationYear` and `powerKw` are numbers, not
strings; a value the page does not carry is `null`, never `0` and never `""`.
Field names and text come from the country front-end you searched, so a German
run says `Benzin` and `Automatik`.

### How it stays honest

- **The redirect echo-check.** AutoScout24 answers `308` when a slug is not
  the canonical one for the front-end, and the redirect target **has the search
  terms stripped**. A naive tool follows it and returns a perfectly
  plausible page of the *unfiltered* make — right shape, right make, wrong
  cars. This Actor re-attaches the search terms by hand and then refuses any
  answer that does not echo back every filter it sent.
- **The sort is never the site default.** `sort=standard` is tier- and
  ad-weighted (a measured page was 20/20 dealers). Enumeration always uses
  `sort=age&desc=1` — newest listing first, independent of price and stable
  across pages.
- **Paid placements are dropped.** Promoted (`Nfm`) and OCS slots sit inline
  among the organic hits and look identical; they are excluded and counted, so
  you are not charged for adverts.
- **Charged = pushed.** The run log prints both, and they are asserted equal.

### Limits

- Asking prices of live listings, not transaction prices.
- \~4,000 cars per search maximum — the site's wall, not ours (above).
- One page every 1.5s, and a run stops paging before the 300s Actor timeout
  rather than being killed mid-write; a truncated search says so in the log.
- `autoscout24.ch` is deliberately unsupported: it is a separate operator
  quoting CHF, and mixing currencies into one feed is not worth it.

### A whole list in one run

`searches` takes a list; each search returns up to 4,000 cars at $0.0006, and only delivered rows are charged.

Two limits for big pulls: the platform stops a run when it reaches its **Maximum cost per run** setting (default $3.00 = 5,000 cars), and the run's default time limit is 300 seconds. Both can be raised in the run options — or split the searches across runs.

### 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

- [AutoScout24 Used Car Prices by Model — Median & Range](https://apify.com/jpmarketdata/autoscout24-price-market-checker)
- [AutoScout24 Underpriced Cars — Discount vs Model Median](https://apify.com/jpmarketdata/autoscout24-underpriced-deals)
- [Vinted Prices by Country — Cheapest vs Priciest Site](https://apify.com/jpmarketdata/vinted-cross-country-price-gap)
- [Vinted Listings — One Row per Item, $0.0008 Each](https://apify.com/jpmarketdata/vinted-listings)
- [Vinted Asking Prices — Median, Range & Favourites](https://apify.com/jpmarketdata/vinted-price-checker)
- [Vinted Underpriced Listings — Cheap and Most Favourited](https://apify.com/jpmarketdata/vinted-underpriced-deals)

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.

# Actor input Schema

## `searches` (type: `array`):

One object per search, e.g. {"make":"bmw","model":"3-series","priceTo":20000}.

## `maxListings` (type: `integer`):

How many cars to return per search. AutoScout24 saturates at 200 pages however deep you go.

## `country` (type: `string`):

AutoScout24 country site to search.

## Actor input object example

```json
{
  "searches": [
    {
      "make": "bmw",
      "model": "3-series"
    }
  ],
  "maxListings": 100,
  "country": "de"
}
```

# Actor output Schema

## `listings` (type: `string`):

One record per AutoScout24 listing: price, make, model, year, mileage, fuel, transmission, seller country and URL.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searches": [
        {
            "make": "bmw",
            "model": "3-series"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/autoscout24-listings").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searches": [{
            "make": "bmw",
            "model": "3-series",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/autoscout24-listings").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searches": [
    {
      "make": "bmw",
      "model": "3-series"
    }
  ]
}' |
apify call jpmarketdata/autoscout24-listings --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/autoscout24-listings"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/h9h5KY69mdUMeaUXU/builds/9IWikQYB0dEYYlIT0/openapi.json
