# AutoScout24 Scraper - Car Listings, Prices & Dealer Leads (`webdata_labs/autoscout24-scraper`) Actor

Scrape AutoScout24 car listings across Germany, Austria, Italy, France, the Netherlands and Spain. Price, mileage, first registration and power come back as real numbers, with each seller's dealership, contact person and address. Dealer directory mode returns a lead list instead.

- **URL**: https://apify.com/webdata\_labs/autoscout24-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (community)
- **Categories:** E-commerce, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.68 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper - Car Listings, Prices & Dealer Leads

**Export AutoScout24 car listings from six countries with the price, mileage, first registration and power as real numbers, and the selling dealership's name, contact person and street address on every row.** `[💵 $0.80 / 1K · no start fee]`

Most AutoScout24 exports hand you the same thing the page shows: `"248.122 km"`, `"105 kW (143 PS)"`, `"€ 2.900"`. Before you can build a pricing model, spot an underpriced car or sort by mileage, you write a cleaning script for German number formatting, and then another one when you point it at the Italian site. And if what you actually wanted was a list of the dealers, not the cars, you are on your own. This Actor returns both: parsed numbers on every listing, and a dealer directory mode that collapses a whole search into one row per dealership.

### ✅ What you get / ❌ what this isn't

| ✅ What you get | ❌ What this isn't |
| --- | --- |
| **Dealer directory mode** - one row per dealership with contact person, street address, rating, inventory size and price range | Not a listings dump you have to group and deduplicate yourself |
| **Six countries** - Germany, Austria, Italy, France, Netherlands, Spain, from the same input | Not a Germany-only scraper with a second Actor to buy for each country |
| **Parsed numbers** - `priceEur`, `mileageKm`, `firstRegistration`, `powerKw`, `powerHp`, `consumptionL100km`, `co2GramsPerKm` | Not raw display strings in the site's own locale that you have to clean before you can sort |
| **Full seller block on every listing** - dealership, contact person, street, ZIP, city, star rating, review count | Not a "seller: dealer" boolean and a link you have to go and fetch |
| **`onlyNewListings` delta mode** that remembers what previous runs delivered | Not a full re-scrape every night that bills you for the same cars again |
| **Fifteen filters that map to AutoScout24's own** - price, year, mileage, fuel, gearbox, body, power, seller type | Not a keyword box that returns everything and leaves the filtering to you |
| **No proxy cost in the price** - the source needs no residential IPs, so you are not paying for them | Not a scraper priced as though every request were expensive |

### 🔎 Why use this Actor

- **Dealers are a first-class output, not a by-product.** Switch `outputMode` to `dealers` and a search that would have returned 200 cars returns the roughly 100 dealerships selling them, each with `listingsSeen`, `minPriceEur`, `avgPriceEur`, `maxPriceEur` and the makes they carry. That is a call list, ranked by how much stock the dealer is moving.
- **The contact person is on the listing.** AutoScout24 publishes `contactName` alongside the company name and street address, so a dealer row arrives with a human name on it rather than a generic info@ inbox.
- **Numbers arrive as numbers.** `"248.122 km"` becomes `248122`, `"05/2009"` becomes `2009-05`, `"105 kW (143 PS)"` becomes `105` and `143`. The verbatim string ships alongside every parsed value, so nothing is lost if a format ever changes.
- **The filters are the site's own.** Fuel type, gearbox, body type, price band, registration year, mileage cap, minimum kW and seller type are passed straight through, so the result count matches what you would see browsing AutoScout24 yourself. The run summary reports which filters the site actually applied.
- **Only what is new, on a schedule.** With `onlyNewListings` on, a run remembers every row it has delivered and returns only listings, or dealers, it has not seen. A quiet night returns nothing and charges nothing.
- **It streams.** Every row is written to the dataset the moment it is parsed, so a run you stop early still keeps everything it found.

### 👥 Who it's for

Dealer groups and car-buying services watching what the market is asking, lead-generation agencies selling into automotive retail, and analysts building pricing or depreciation models.

- Build a call list of dealerships in a region, ranked by how many cars they have listed and what they are asking.
- Track a model's asking price across Germany, Italy and Spain to spot arbitrage between markets.
- Feed the parsed price, mileage and registration columns straight into a residual-value model with no cleaning pass.
- Monitor a niche daily (electric vans under 30,000 EUR, say) and get only the cars that appeared since yesterday.
- Enrich a dealer CRM with contact names, addresses and AutoScout24 star ratings.

### Example tasks

- [AutoScout24 BMW car listings in Germany](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-bmw-car-listings-germany)
- [AutoScout24 car dealer leads in Germany](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-car-dealer-leads-germany)
- [AutoScout24 electric cars in Germany](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-electric-cars-germany)
- [AutoScout24 used cars under 10,000 EUR](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-used-cars-under-10000-euro)
- [AutoScout24 Gebrauchtwagen in Deutschland](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-gebrauchtwagen-deutschland)
- [AutoScout24 voitures d'occasion en France](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-voitures-occasion-france)
- [AutoScout24 auto usate in Italia](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-auto-usate-italia)
- [AutoScout24 new car listings daily monitor](https://apify.com/webdata_labs/autoscout24-scraper/examples/autoscout24-new-car-listings-daily-monitor)

### ⚙️ How to scrape AutoScout24

1. Pick the **Country**. Each AutoScout24 site has its own stock, so this is the field that decides what you get.
2. Put the makes you want in **Makes**, written as they appear in an AutoScout24 URL: `bmw`, `volkswagen`, `mercedes-benz`. Leave it empty to search the whole national market.
3. Add **Models** if you want to go narrower. A model belongs to one make, so give exactly one make when you use them.
4. Set the filters you care about: price band, first registration years, maximum mileage, fuel types, gearbox, body types, minimum kW, seller type.
5. Choose **What to return**: car listings, or the dealer directory.
6. Set **Maximum results**. This counts rows: cars in listings mode, dealerships in dealer mode.
7. Click **Start**. Results appear on the run's Output tab as they arrive, and export as JSON, CSV, Excel or XML from there.

#### Get only the new cars every morning

Turn on **Only results not seen before**, save the configuration as a task, and schedule it. The Actor keeps a memory of every row it has ever delivered to you, so each run returns only the listings that appeared since the last one. On a day when nothing new is posted, the run returns nothing and costs nothing. Pair it with **Sort: Newest listing first** so the crawl finds the fresh cars on the first page instead of paging to them.

### 📥 Input

```json
{
  "country": "de",
  "makes": ["bmw"],
  "models": ["3er"],
  "priceFrom": 15000,
  "priceTo": 30000,
  "firstRegistrationFrom": 2019,
  "mileageTo": 80000,
  "fuelType": ["diesel"],
  "transmission": "automatic",
  "bodyType": ["station-wagon"],
  "sellerType": "dealer",
  "sort": "newest-listing",
  "outputMode": "listings",
  "maxResults": 500,
  "onlyNewListings": false
}
```

- `country` - which AutoScout24 site to search: `de`, `at`, `it`, `fr`, `nl` or `es`. Defaults to `de`.
- `makes` - car makes as they appear in an AutoScout24 URL. One search per make. Empty means every make.
- `models` - model slugs such as `3er` or `golf`. Applied only when exactly one make is given.
- `startUrls` - AutoScout24 search URLs you already have. Any `/lst` URL on a supported country site works, and its own query string wins over the fields below. Advanced.
- `outputMode` - `listings` for one row per car, `dealers` for one row per dealership.
- `maxResults` - stop after this many rows. Each row is one charged result. Defaults to 200.
- `sort` - `standard`, `newest-listing`, `price-asc`, `price-desc`, `mileage-asc`, `year-desc` or `power-desc`.
- `priceFrom`, `priceTo` - asking price bounds in EUR.
- `firstRegistrationFrom`, `firstRegistrationTo` - registration year bounds.
- `mileageTo` - maximum kilometres on the clock.
- `fuelType` - any of `petrol`, `diesel`, `electric`, `hybrid`, `lpg`, `cng`. Hybrid covers both petrol and diesel hybrids.
- `transmission` - `automatic`, `manual` or `semi-automatic`.
- `bodyType` - any of `small-car`, `convertible`, `coupe`, `suv`, `station-wagon`, `sedan`, `van`, `transporter`.
- `sellerType` - `dealer` or `private`. Dealer directory mode ignores private sellers either way.
- `powerFromKw` - minimum power in kilowatts. 100 kW is roughly 136 hp.
- `includeDamaged` - AutoScout24 excludes accident and damaged cars by default. Switch this on to put them back in.
- `maxPagesPerQuery` - optional cap on pages per search, 20 listings each. Advanced.
- `onlyNewListings` - return only rows not delivered by a previous run.

### 📤 Output

| make | model | priceEur | mileageKm | firstRegistration | powerHp | city | dealerName |
| --- | --- | --- | --- | --- | --- | --- | --- |
| BMW | 318 | 2900 | 248122 | 2009-05 | 143 | Albershausen | AH Auto und Teile |
| BMW | 320 | 24999 | 41500 | 2021-03 | 190 | Karlsruhe | CME-CARS |
| Volkswagen | Golf | 10890 | 118000 | 2016-06 | 110 | Neustadt | Autocenter Neustadt OHG |

Every listing row also carries `listingId` and `url`, the verbatim `priceText`, `mileageText`, `firstRegistrationText` and `powerText` next to their parsed values, `modelGroup`, `variant`, `motorType`, `fuel`, `transmission`, `powerKw`, `consumptionL100km`, `co2GramsPerKm`, `engineCcm`, `isNew`, `isDamaged`, the full seller block (`sellerType`, `dealerId`, `dealerName`, `dealerContactName`, `dealerUrl`, `dealerRatingStars`, `dealerRatingCount`), the location (`countryCode`, `zip`, `city`, `street`), every photo URL with `imageCount`, AutoScout24's own `leadsRange` interest signal, and which search the row came from.

In dealer directory mode each row is a dealership: `dealerName`, `dealerContactName`, `street`, `zip`, `city`, `countryCode`, `listingsSeen`, `minPriceEur`, `avgPriceEur`, `maxPriceEur`, `makes`, `dealerRatingStars`, `dealerRatingCount`, `dealerUrl` and a `sampleListingUrl` to one of its cars.

The run summary in the key-value store records rows per search, how many listings AutoScout24 reported for it, the filters the site actually applied, where each search stopped, and which searches hit the per-search ceiling.

### 💵 How much does it cost?

`[💵 $0.80 / 1K · no start fee]` - you pay per row delivered, and nothing else. There is no start fee, so a run that finds nothing costs nothing, which is what makes a scheduled `onlyNewListings` monitor cheap to leave running. In dealer directory mode you are charged per dealership, not per listing scanned, so a 200-car crawl that yields about 100 dealers bills for the 100. Heavier users pay less per row, down to $0.68 / 1K.

### 🔁 Run it on the Apify platform

Schedule the Actor daily or weekly from the Schedules tab, or start it from the Apify API and collect the dataset in the same call. Results export as JSON, CSV, Excel or XML, and integrations push them straight into Google Sheets, Make, Zapier, Slack or your own webhook as each run finishes. A dealer directory run drops cleanly into a CRM import.

### ⚠️ Limits and caveats

- **AutoScout24 serves at most 200 pages, that is 4,000 listings, per search.** Page 201 comes back empty. A search for every BMW in Germany reports around 63,000 results and you will get the first 4,000 of them in your chosen sort order. To go deeper, split the search by model, by price band or by registration year. The run summary flags every search that hit the ceiling.
- **Consumption and CO2 are only published on the German and Austrian sites.** The French, Italian, Dutch and Spanish listing strips stop after the power figure, so `consumptionL100km` and `co2GramsPerKm` are legitimately empty there. Electric cars have no l/100 km figure anywhere.
- **Dealer phone numbers and websites are not on the search page**, so they are not in the output. What is there is the company name, the contact person, the street address and the link to the dealer's AutoScout24 page.
- **Star ratings are AutoScout24's own dealer ratings**, and not every dealer has them. Roughly 85 percent of dealer rows carried a rating in testing.
- **Dealer statistics count the listings seen up to the moment the row is written.** Rows stream as each search finishes, so a dealership that also appears under a later search in the same run is not written a second time and its counts are not revised. The run summary reports how often that happened.
- **Private sellers have no company name, contact person or street**, only a ZIP and city. That is how AutoScout24 publishes them.
- **There is no `.be` site.** Belgium is covered by the Dutch and French sites.
- Listings are what the seller advertises. Asking price is not sale price, and AutoScout24 does not publish what a car sold for.

### 🧩 Related Actors

- [Craigslist Scraper](https://apify.com/webdata_labs/craigslist-scraper) - any city, any category, for the classifieds side of the same market.
- [OLX Brazil Scraper](https://apify.com/webdata_labs/olx-brazil-scraper) - Brazilian classifieds, past the 5,000-listing search wall.
- [eBay Scraper](https://apify.com/webdata_labs/ebay-listings-scraper) - active listings with the true delivered price and item specifics.
- [Google Maps No-Website Leads Scraper](https://apify.com/webdata_labs/google-maps-no-website-leads-scraper) - local businesses with no website at all, the softest pitch in local services.
- [Website Email Scraper](https://apify.com/webdata_labs/website-contact-extractor) - turn any list of domains into emails, phone numbers and social profiles.

### ❓ FAQ

**Am I charged for listings the filter throws away?**
No. You are charged per row written to the dataset, so filtered-out cars and, in dealer mode, the listings behind each dealership cost nothing.

**Can I get more than 4,000 cars from one search?**
Not from one search, because that is AutoScout24's own ceiling. Split it: several models instead of a make, or several price bands of the same model. Each is a separate search with its own 4,000-listing allowance, and the Actor runs them all in one go.

**Which countries are covered?**
Germany, Austria, Italy, France, the Netherlands and Spain, each from its own AutoScout24 site. One run searches one country; run the Actor once per country, or save a task per country.

**Do I need a proxy or an account?**
No. AutoScout24's search pages are public and this Actor reads them directly, which is why it is priced the way it is.

**How does the "only new" memory work?**
The Actor keeps the ids of every row it has delivered to you in a store of its own, separate from any single run. Turning on `onlyNewListings` returns only ids that are not in it. Listings mode and dealer mode keep separate memories.

**Does it return sold cars or price history?**
No. AutoScout24 publishes live asking prices only. To track a price falling, run the Actor on a schedule and compare the runs.

### 🛠️ Support

Something wrong? Open an issue on the Actor's Issues tab with the run URL, the input you used and what you expected instead. That is the fastest route to a fix.

### ⭐ Rate this Actor

If this saved you an afternoon, please leave a review on the Reviews tab. Reviews are the only signal buyers have that an Actor works, and they decide what gets built next here. If something is broken, open an issue first and give it a chance to be fixed before rating it low.

# Actor input Schema

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

Which AutoScout24 site to search. Each country has its own inventory, so this is the single most important field.

## `makes` (type: `array`):

Car makes as they appear in an AutoScout24 URL, for example bmw, volkswagen or mercedes-benz. One search per make. Leave empty to search every make in the country.

## `models` (type: `array`):

Model slugs to narrow the search, for example 3er or golf. A model belongs to one make, so these apply only when exactly one make is given, and are ignored otherwise.

## `startUrls` (type: `array`):

AutoScout24 search URLs you already have. Any /lst URL on a supported country site works and its own filters win over the fields below. Other AutoScout24 pages are rejected, because only the search page carries listing data.

## `outputMode` (type: `string`):

Car listings returns one row per car. Dealer directory returns one row per dealership instead, with its contact person, address, rating, how many cars it has listed and its price range. Dealer rows are what you want for a lead list.

## `maxResults` (type: `integer`):

Stop after this many rows across all searches: cars in listings mode, dealerships in dealer directory mode. Each row is one charged result.

## `sort` (type: `string`):

The order AutoScout24 returns listings in. Newest listing first is the one to use for a monitor, because the cars you have not seen are at the front.

## `priceFrom` (type: `integer`):

Only cars asking at least this much. Leave empty for no lower bound.

## `priceTo` (type: `integer`):

Only cars asking at most this much. Leave empty for no upper bound.

## `firstRegistrationFrom` (type: `integer`):

Only cars first registered in this year or later, for example 2020.

## `firstRegistrationTo` (type: `integer`):

Only cars first registered in this year or earlier.

## `mileageTo` (type: `integer`):

Only cars with at most this many kilometres on the clock, for example 50000.

## `fuelType` (type: `array`):

Only cars with one of these fuel types. Hybrid covers both petrol and diesel hybrids. Leave empty for all of them.

## `transmission` (type: `string`):

Only cars with this gearbox. Leave empty for both.

## `bodyType` (type: `array`):

Only cars with one of these body types. Leave empty for all of them.

## `sellerType` (type: `string`):

Only cars sold by dealers, or only by private sellers. Leave empty for both. Dealer directory mode ignores private sellers regardless.

## `powerFromKw` (type: `integer`):

Only cars with at least this much power in kilowatts. 100 kW is roughly 136 hp.

## `includeDamaged` (type: `boolean`):

AutoScout24 leaves accident and damaged vehicles out of its results by default. Switch this on to put them back in.

## `maxPagesPerQuery` (type: `integer`):

Optional cap on pages per search, 20 listings each. Leave at 0 to page until the search runs out. AutoScout24 serves at most 200 pages (4,000 listings) per search whatever this is set to, so split a big search by model or price band to go deeper.

## `onlyNewListings` (type: `boolean`):

Remember every row delivered by previous runs of this Actor and return only what is new since then. Nothing is charged when there is nothing new, which makes a scheduled run cheap.

## Actor input object example

```json
{
  "country": "de",
  "makes": [
    "bmw"
  ],
  "models": [],
  "startUrls": [],
  "outputMode": "listings",
  "maxResults": 200,
  "sort": "standard",
  "fuelType": [],
  "bodyType": [],
  "includeDamaged": false,
  "maxPagesPerQuery": 0,
  "onlyNewListings": false
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per car, trimmed to the fields most buyers scan first.

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

Every field the Actor returns for a car listing, including the parsed price, mileage, first registration and power, the seller block and the photo URLs.

## `dealers` (type: `string`):

One row per dealership with its contact person, address, rating, inventory size and asking price range. Populated by runs in dealer directory mode.

## `OUTPUT` (type: `string`):

Rows per search, how many listings AutoScout24 reported, the filters it actually applied, where each search stopped and which searches hit the 4,000-listing ceiling.

# 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 = {
    "country": "de",
    "makes": [
        "bmw"
    ],
    "outputMode": "listings",
    "maxResults": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/autoscout24-scraper").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 = {
    "country": "de",
    "makes": ["bmw"],
    "outputMode": "listings",
    "maxResults": 200,
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/autoscout24-scraper").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 '{
  "country": "de",
  "makes": [
    "bmw"
  ],
  "outputMode": "listings",
  "maxResults": 200
}' |
apify call webdata_labs/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/EzeWTMLmeXLvu12Zd/builds/vgOaQSHIVF7HbAnJw/openapi.json
