# AutoScout24 Scraper: Car Listings, Prices & Specs (`kyungminlee/autoscout24-listings-scraper`) Actor

Scrape AutoScout24 car listings from 8 European countries by search URL or simple make/model/price/year filters. Clean English fields: price, mileage, fuel, gearbox, power, location, dealer, AS24 price rating. Optional detail pages: equipment, description, images, VAT, market median. Unofficial.

- **URL**: https://apify.com/kyungminlee/autoscout24-listings-scraper.md
- **Developed by:** [Kyungmin Lee](https://apify.com/kyungminlee) (community)
- **Categories:** E-commerce, Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 listings

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does AutoScout24 Listings Scraper do?

**AutoScout24 Listings Scraper** collects car listings from AutoScout24, Europe's largest online car marketplace, in **8 countries**: Germany, Austria, Belgium, France, Italy, the Netherlands, Spain and Luxembourg. You can paste search URLs straight from your browser (autoscout24.com, .de, .at, .be, .fr, .it, .nl, .es, .lu), or just type a **make, model and filters** such as price, year, mileage, fuel, gearbox, country and postal code + radius. No URL building needed.

Each listing becomes one clean row: **price and currency, mileage, first registration, fuel, transmission, power (kW and hp), make, model, version, city / postal code / country, seller type, dealer name**, AutoScout24's own **price rating** (top price, good price, fair price…) and the listing URL. Turn on **listing details** to add the full **equipment list, description, all photos, VAT information, AutoScout24's market median price and price bands, previous owners, accident and service history, colour, body type and emissions**.

It reads the same public pages a logged-out visitor sees. No AutoScout24 account, cookies or browser needed: 1,000 listings take about one minute.

This is an **unofficial** tool. It is not affiliated with, endorsed by or connected to AutoScout24 GmbH or Scout24.

### Why use AutoScout24 Listings Scraper?

- **Clean, comparable fields across countries.** `fuel`, `transmission` and `condition` are always English codes (`petrol`, `hybrid-petrol`, `automatic`, `used`…), whatever site language the listing came from; the original label is kept next to them. Mileage, power and price are numbers and first registration is `YYYY-MM`, not text like "138.000 km" or "06/2021".
- **Filters without URL building.** Make, model, price, year, mileage, power, fuel, gearbox, body type, condition, seller type, countries and postal code + radius as plain inputs. Model names work in any site language (`3 Series`, `3er` and `Serie 3` all find the BMW 3 Series).
- **More than 4,000 results per search.** AutoScout24 shows at most 4,000 listings per search. The Actor splits large searches into price bands automatically, so one search can give you tens of thousands of listings.
- **Market pricing built in.** Every row has AutoScout24's price rating; detail rows add the market median price, the price bands and `priceVsMarketPct` (how far above or below the median the car is priced), ready to sort for deals.
- **Privacy-safe.** Private sellers' names, phone numbers, seller IDs, street addresses and coordinates are never collected, and phone numbers and e-mail addresses inside private sellers' descriptions are masked. Only dealer business details (company name, dealer page, office phone, showroom address) are kept.
- **Low price per listing.** You pay per saved listing; failed searches and failed detail pages are not charged.

Typical uses: used-car price monitoring and valuation models, dealer stock tracking, cross-border import/export comparisons, dealer lists, and market research by make, model or region.

### How to scrape AutoScout24

1. Click **Try for free**.
2. Either paste one or more AutoScout24 search URLs (open a search on the site, set your filters, copy the address bar), or type a make and model and set filters.
3. Choose how many listings you want per search, and whether to include listing details.
4. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the Apify API. Save the run as a task and add a schedule for daily price tracking.

### Input

```json
{
  "searchUrls": ["https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2015"],
  "make": "BMW",
  "model": "3 Series",
  "countries": ["DE", "AT"],
  "site": "com",
  "priceFrom": 15000,
  "priceTo": 40000,
  "yearFrom": 2019,
  "mileageTo": 100000,
  "fuelTypes": ["petrol", "hybrid-petrol"],
  "transmissions": ["automatic"],
  "sellerType": "any",
  "zip": "80331",
  "radiusKm": 100,
  "sort": "newest",
  "maxListingsPerSearch": 500,
  "splitLargeSearches": true,
  "includeDetails": false,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

- `searchUrls`: AutoScout24 search result URLs. Every filter in the URL is kept. The URL must contain a make (`…/lst/<make>…`).
- `make`, `model` and the filters: one extra search built from the inputs. Leave `make` empty to use only URLs.
- `countries`: where the cars are offered. `site`: the AutoScout24 site (language) used for the filter search.
- `maxListingsPerSearch`: limit per search URL and for the filter search.
- `splitLargeSearches`: split searches with more than 4,000 results into price bands.
- `includeDetails`: open each listing page for the extra fields (slower; extra event).
- `proxyConfiguration`: the Apify datacenter proxy is on by default.

### Output

One dataset item per listing (detail fields shortened):

```json
{
  "listingId": "0b94e2e5-e580-4ec8-8ce0-e3f890dc29d7",
  "url": "https://www.autoscout24.de/angebote/bmw-3er-m340i-xdrive-benzin-weiss-…-0b94e2e5-e580-4ec8-8ce0-e3f890dc29d7",
  "title": "BMW 340 M340i xDrive",
  "make": "BMW", "model": "340", "modelGroup": "3er", "version": "M340i xDrive",
  "price": 42500, "currency": "EUR", "priceLabel": "good-price",
  "mileageKm": 82000, "firstRegistration": "2019-10", "year": 2019,
  "fuel": "petrol", "fuelOriginal": "Benzin",
  "transmission": "automatic", "transmissionOriginal": "Automatik",
  "powerKw": 275, "powerHp": 374, "engineCcm": 2998, "condition": "used",
  "city": "Aldenhoven", "zip": "52457", "country": "DE",
  "sellerType": "private", "dealerName": null,
  "imageCount": 24, "mainImage": "https://prod.pictures.autoscout24.net/listing-images/…/250x188.webp",
  "position": 4, "searchTotalResults": 11025, "site": "de",
  "detailStatus": "ok",
  "marketMedianPrice": 42700, "priceVsMarketPct": -0.5,
  "vatDeductible": false, "previousOwners": 1, "hadAccident": false, "fullServiceHistory": true,
  "bodyType": "Limousine", "color": "White", "driveTrain": "4x4", "emissionClass": "Euro 6d-TEMP",
  "equipment": ["360° Kamera", "Abstandstempomat", "Head-up display", "…"],
  "description": "Hier biete ich meinen M340i an. …",
  "images": ["https://prod.pictures.autoscout24.net/listing-images/…/1280x960.webp", "…"],
  "scrapedAt": "2026-10-07T00:00:00+00:00"
}
```

A `SUMMARY` record in the run's key-value store lists every search with its total result count, saved listings, price bands, failures and request timings.

### Data fields

| Field | Description |
|---|---|
| `listingId`, `url` | AutoScout24 listing ID (UUID) and listing URL |
| `title`, `make`, `model`, `modelGroup`, `version`, `variant` | Vehicle naming as listed |
| `price`, `currency`, `vatLabel` | Asking price (number), `EUR`, and the VAT note shown in the results |
| `priceLabel` | AutoScout24 price rating: `top-price`, `good-price`, `fair-price`, `somewhat-expensive`, `expensive`, `too-low-price` or `unknown` |
| `mileageKm`, `firstRegistration`, `year` | Mileage in km, first registration as `YYYY-MM`, and its year (empty for new cars) |
| `fuel`, `fuelOriginal` | `petrol`, `diesel`, `electric`, `hybrid-petrol`, `hybrid-diesel`, `lpg`, `cng`, `hydrogen`, `ethanol` or `other`, plus the site's own label |
| `transmission`, `transmissionOriginal` | `automatic`, `manual` or `semi-automatic`, plus the site's own label |
| `powerKw`, `powerHp`, `engineCcm` | Engine power and displacement |
| `condition`, `conditionCode` | `used`, `new`, `employee-car`, `classic`, `demonstration` or `pre-registered`, and AutoScout24's code |
| `city`, `zip`, `country` | Location of the car (country as ISO code) |
| `sellerType` | `dealer` or `private` |
| `dealerName`, `dealerId`, `dealerUrl`, `dealerPhones` | Dealer business details (empty for private sellers) |
| `isSponsored`, `isSmyle` | Paid placement in the results; AutoScout24 "smyle" direct-sale car |
| `imageCount`, `mainImage` | Number of photos and the first photo |
| `position`, `searchInput`, `searchUrl`, `searchTotalResults`, `priceBand` | Rank within the search, the search it came from, AutoScout24's total for that search, and the price band if the search was split |
| `site`, `scrapedAt` | AutoScout24 site and UTC collection time |
| **Detail mode** | |
| `description`, `equipment`, `equipmentByCategory`, `images` | Seller description, equipment names (in the site language) with categories, full-size photo URLs |
| `marketMedianPrice`, `priceVsMarketPct`, `priceEvaluationRanges` | AutoScout24 market median, % above (+) or below (−) it, and the price bands behind the rating |
| `vatDeductible`, `netPrice`, `vatRate`, `negotiable`, `priceOnRequest` | Price and VAT details |
| `previousOwners`, `hadAccident`, `fullServiceHistory`, `nonSmoking`, `warranty` | History and warranty |
| `bodyType`, `color`, `paintType`, `upholstery`, `seats`, `doors`, `driveTrain`, `gears`, `cylinders` | Body and interior |
| `emissionClass`, `co2GPerKm`, `fuelConsumptionCombined`, `electricRangeKm` | Environment data when listed |
| `dealerStreet`, `latitude`, `longitude`, `dealerRating`, `dealerRatingCount` | Dealer showroom location and rating (never for private sellers) |
| `createdAt`, `listingStatus`, `detailStatus`, `detailError` | Listing creation time, status, and whether the detail page could be read |

### Pricing: how much does it cost to scrape AutoScout24?

This Actor uses pay-per-event pricing:

- `listing`: **$0.40 per 1,000 listings** saved.
- `listing-detail`: **$0.40 per 1,000** listings enriched from their listing page (only when `includeDetails` is on, on top of `listing`).

So 1,000 listings cost about $0.40, or $0.80 with details. Searches that fail are not charged, and a listing whose detail page cannot be read is charged as `listing` only. Set a maximum charge for the run and the Actor stops exactly at that limit.

### Tips and limits

- **4,000 per search is AutoScout24's limit.** Keep `splitLargeSearches` on to go past it; listings without a price (price on request) are not in any price band.
- **Sponsored listings** appear where AutoScout24 places them (`isSponsored: true`), so a price-sorted search is not strictly sorted. Each listing is saved once per run, even if several searches find it.
- **Detail mode is slower:** one extra page per listing, roughly 6 to 11 minutes per 1,000 listings. Use it on filtered searches for the cars you need.
- **Make-less searches** (`…/lst?…`) are not supported because AutoScout24's robots.txt asks crawlers not to load them. Pick a make, or run one search per make.
- **AutoScout24 "smyle" cars** (AutoScout24's own direct-sale offers) come from a separate app; they are returned with search data only (`detailStatus: "not-available"`).
- **autoscout24.ch** (Switzerland) is a different platform and is not supported. Only car searches are supported, not motorbikes or trucks.
- Equipment names and descriptions are in the language of the AutoScout24 site you search. Use `site: "com"` (or an autoscout24.com URL) for English.

### FAQ

#### Do I need an AutoScout24 account?

No. The Actor reads public search and listing pages that anyone can open without logging in. It never asks for or uses credentials.

#### Does it collect personal data?

Not from private sellers: names, phone numbers, seller IDs, street addresses and coordinates are dropped, and contact details inside their descriptions are masked. Dealer business contact details are included. You are responsible for using any data in line with the GDPR and other laws that apply to you.

#### Can I monitor new listings every day?

Yes. Use the sort order "Newest listings first", save the run as a task and add a daily schedule; compare `listingId`s between runs to find new cars and price changes.

#### Is it legal to scrape AutoScout24?

The Actor collects public listing data at a polite rate, follows AutoScout24's robots.txt for the pages it loads, and does not get around logins or captchas. Check AutoScout24's terms and the law in your country for your use case.

#### Is this an official AutoScout24 product?

No. This is an unofficial, independent tool and is not affiliated with AutoScout24 GmbH. AutoScout24 is a trademark of its owner.

Found a problem or need another field? Open an issue on the **Issues** tab.

# Actor input Schema

## `searchUrls` (type: `array`):

AutoScout24 search result URLs copied from your browser, one per line, for example `https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000`. Every filter in the URL is kept. Works on autoscout24.com, .de, .at, .be, .fr, .it, .nl, .es and .lu. The URL must contain a make (…/lst/<make>…); autoscout24.ch is a different platform and is not supported. You can use URLs, the filters below, or both.

## `make` (type: `string`):

Car make for a search without a URL, for example `BMW`, `Volkswagen`, `Mercedes-Benz`, `Alfa Romeo`. Leave empty if you only use search URLs.

## `model` (type: `string`):

Optional model or model range, for example `3 Series` (or `3er`, `Serie 3`), `Golf`, `C-Klasse`, `Model 3`. AutoScout24 understands the model name in any of its site languages. Leave empty for all models of the make.

## `countries` (type: `array`):

Countries where the cars are offered. Pick several to search them together. Leave empty for the site's default (all 8 countries on autoscout24.com, the home country on the national sites).

## `site` (type: `string`):

Which AutoScout24 site to use for the filter search. It decides the language of free-text fields (equipment names, description, body type) and the domain of the listing URLs. Normalized fields such as `fuel`, `transmission` and `condition` are always in English.

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

Minimum price in euros.

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

Maximum price in euros.

## `yearFrom` (type: `integer`):

Earliest first-registration year, for example `2018`.

## `yearTo` (type: `integer`):

Latest first-registration year.

## `mileageFrom` (type: `integer`):

Minimum mileage in kilometres.

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

Maximum mileage in kilometres, for example `100000`.

## `fuelTypes` (type: `array`):

Only these fuel types. Leave empty for all.

## `transmissions` (type: `array`):

Only these gearbox types. Leave empty for all.

## `bodyTypes` (type: `array`):

Only these body types. Leave empty for all.

## `conditions` (type: `array`):

Only these offer types. Leave empty for the site's default.

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

Minimum engine power in kW (1 kW = 1.36 hp).

## `powerToKw` (type: `integer`):

Maximum engine power in kW.

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

Only dealer or only private listings. Private sellers' names and phone numbers are never collected either way.

## `zip` (type: `string`):

Optional postal code to search around, for example `10115` (Berlin). Use it with one country so the code is unambiguous.

## `radiusKm` (type: `integer`):

Search radius around the postal code. AutoScout24 offers 10, 20, 50, 100, 150, 200, 250, 300 and 400 km.

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

Order of the filter search. Search URLs keep the sort order that is in the URL.

## `maxListingsPerSearch` (type: `integer`):

How many listings to save for each search URL and for the filter search. AutoScout24 shows at most 4,000 listings per search; above that the Actor splits the search into price bands (see below). The run's maximum charge can stop it earlier.

## `splitLargeSearches` (type: `boolean`):

When a search has more than 4,000 results and you ask for more than 4,000 listings, split it into price bands that each stay under the limit, so you can collect all of them. Listings without a price (price on request) are not included in price bands.

## `includeDetails` (type: `boolean`):

Also open every listing page and add the equipment list, full description, all image URLs, VAT information, AutoScout24's market median price and price bands, previous owners, accident and service history, colour, body type, emissions and more. One extra request per listing (slower) and charged as an extra `listing-detail` event.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy (default) spreads requests over several IPs and switches to a fresh IP if AutoScout24 slows one down. You can turn it off; requests then come from the run's own IP at a slower pace.

## Actor input object example

```json
{
  "make": "BMW",
  "model": "3 Series",
  "countries": [
    "DE"
  ],
  "site": "com",
  "sellerType": "any",
  "radiusKm": 50,
  "sort": "newest",
  "maxListingsPerSearch": 40,
  "splitLargeSearches": true,
  "includeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "make": "BMW",
    "model": "3 Series",
    "countries": [
        "DE"
    ],
    "maxListingsPerSearch": 40,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("kyungminlee/autoscout24-listings-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 = {
    "make": "BMW",
    "model": "3 Series",
    "countries": ["DE"],
    "maxListingsPerSearch": 40,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("kyungminlee/autoscout24-listings-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 '{
  "make": "BMW",
  "model": "3 Series",
  "countries": [
    "DE"
  ],
  "maxListingsPerSearch": 40,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call kyungminlee/autoscout24-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kyungminlee/autoscout24-listings-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/6FDi0Wa6IF6u57tC7/builds/DY5h7tVXYEY73thSM/openapi.json
