# AutoScout24 Scraper - Used Car Listings, Prices & Specs (`dami_studio/autoscout24-scraper`) Actor

Used-car listings from AutoScout24 in eight countries: price, mileage, first registration, fuel, gearbox, power, town, dealer or private seller, dealer name, link and photos. Search by make and model or paste a search link.

- **URL**: https://apify.com/dami\_studio/autoscout24-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (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.43 / 1,000 car listing scrapeds

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 Scraper

Give it a make and model with the filters you'd set on the site, or paste a search from any AutoScout24 country site, and it returns the cars as rows: price, mileage, first registration, fuel, gearbox, power, where the car is, whether a dealer or a private person is selling it, the dealer's name, the link and the photos.

It reads AutoScout24's results pages, the same ones you scroll through in a browser, and never opens the individual listings. Germany, Austria, Italy, France, Spain, the Netherlands, Belgium and Luxembourg are all on it.

Two things to know before you start. AutoScout24 shows at most 200 pages of any search, however many cars it says it has. At 17 to 20 cars a page, which is what our tests saw, that's 3,400 to 4,000 cars, and the run tells you when a search runs into it. And the sellers' phone numbers stay out of the rows. If someone types a phone number or an email address into a listing's text, it's replaced with a marker. A number written in an unusual way, broken up with spaces and missing both a country code and a leading zero, can still get through.

### What it doesn't do

- **No sellers' phone numbers, contact names or street addresses.** The results pages carry dealers' phone numbers, and for some private sellers a phone number too. They're left out, along with the names of the people to contact and the street part of the address. You get the dealer's company name, the postcode and the town. Some sellers also type a phone number or an email address into the car's title, or even into the town. Wherever it turns up in a row, it comes out as `[phone removed]` or `[email removed]`. The kind that can still get past is the unusual one described above.
- **Nothing that's only on the car's own page.** The seller's description, the full equipment list and the finance and leasing terms live there, and this actor doesn't open it. You can filter by equipment or by a monthly rate; the rows just don't list them.
- **Not past page 200.** That's AutoScout24's own ceiling. For a search with more cars, split it by price or by year and run the parts.
- **No searches without a make.** A search link where no make was chosen is skipped. AutoScout24's robots.txt asks automated visitors to stay off those pages, and this actor keeps to it.
- **Three filters from autoscout24.de aren't in the form.** The manufacturers' certification seals change with the make. Smyle online buying only works on the German site. SuperDeal does run on the English site, but there it brought back mostly cars without the badge. Set any of them on autoscout24.de and paste the link: the link keeps it.
- **Cars only.** Motorbike searches are skipped, and autoscout24.ch isn't read.

### Input

You can search two ways, and use both in one run.

**Make and model.** Type them the way autoscout24.com writes them: `BMW` and `3 Series`, `Volkswagen` and `Golf`, `Mercedes-Benz` and `C-Class`. The model is optional; leave it empty for every model of that make. If the site doesn't recognise a name you typed, you get no rows rather than the wrong cars, and the run report lists the names it does use for that make.

**Filters.** The fields right under the make and model are the ones most people use: words in the listing title (the site's "Model version" box), country, new or used, price, first registration year, mileage, fuel, gearbox, and dealer or private seller. The rest of AutoScout24's search form sits in the sections below them, grouped the way the site groups it:

- **Place.** A postcode or town and a radius. Pick one country first: with all eight, AutoScout24 doesn't place a postcode at all, so the run asks for one. A postcode is the surest. A town is read the site's way, and "Munich" once came back as Münichham, a village about 85 km east, so the status and the run report say which place was searched. With no radius the site uses 200 km.
- **Condition and history.** Offer type (new, used, employee's car, classic, demonstration, pre-registered), accident vehicles (left out unless you ask, as on the site), the most previous owners, warranty, full service history, non-smoking, and a fresh German inspection (HU/AU).
- **Engine and body.** Power in kW or hp, electric range, body type, seats and doors.
- **Colour and interior.** Colour, metallic paint, interior colour and upholstery.
- **Environment.** Euro emission class and the German emission sticker, both "at least" as on the site, and a particulate filter.
- **Equipment.** AutoScout24's own list, 136 items long.
- **Price and listing.** The site's price rating, SuperDeal, VAT a business can reclaim, and how recently the car went up.
- **Finance and leasing.** The monthly finance rate, and the German site's leasing filters: leasing offers only, rate, term, yearly kilometres, available now, trade-in and the environmental bonus. The last two found no cars at all in our tests.

Picking several values in one list means any of them: black or grey. Equipment works the other way round, as on the site: every item you pick has to be on the car.

**Order** decides which cars come first. With a limit smaller than the search, it also decides which cars you get, so "newest listings first" gives you the latest arrivals and "price, low to high" the bottom of the market. "Nearest first" needs a place.

**Search links.** Set up a search on any AutoScout24 country site (.de, .com, .at, .it, .fr, .es, .nl, .be or .lu) with whatever filters you like, copy the address from the browser and paste it. Up to 10 links a run. Each link keeps its own filters and its own country site. The form fields don't touch links.

**Maximum listings.** 1,000 unless you change it, and up to 40,000 a run across all searches. With several searches, each gets an equal part of it, and what one doesn't use passes to the next. A car that turns up twice counts once.

```json
{
  "make": "BMW",
  "model": "3 Series",
  "country": "DE",
  "condition": "used",
  "priceTo": 25000,
  "yearFrom": 2019,
  "fuel": "D",
  "sort": "newest",
  "maxItems": 200
}
```

With a place and some of the newer filters:

```json
{
  "make": "Volkswagen",
  "model": "Golf",
  "country": "DE",
  "condition": "used",
  "location": "10115",
  "radiusKm": "100",
  "powerFrom": 85,
  "powerUnit": "kw",
  "bodyTypes": ["station-wagon"],
  "equipment": ["apple-carplay"],
  "fullServiceHistory": true,
  "sort": "nearest",
  "maxItems": 300
}
```

### Output

One row per car.

| Field | Example | Notes |
|---|---|---|
| `listingId` | `3332bbfd-eaff-4a2b-8dfd-8b8979fc748d` | AutoScout24's id for the listing |
| `title` | `BMW 330 PHEV*M-Pack*Pano*...` | make, model and the seller's version text |
| `make`, `model`, `modelGroup` | `BMW`, `330`, `3 Series` | `modelGroup` is empty on some older listings |
| `version` | `PHEV*M-Pack*Pano*...` | as the seller wrote it, asterisks and all |
| `price`, `currency` | `29900`, `EUR` | the asking price |
| `priceRating` | `good` | AutoScout24's price badge: `top`, `good`, `fair`, `somewhat-expensive` or `expensive`; empty when the site hasn't rated the car |
| `mileageKm` | `98117` | |
| `firstRegistration` | `2022-02` | year and month; empty for a car that was never registered |
| `fuel` | `Electric/Gasoline` | in the English autoscout24.com uses, whichever site the search came from |
| `transmission` | `Automatic` | `Automatic`, `Manual` or `Semi-automatic` |
| `powerKw`, `powerHp` | `215`, `292` | |
| `condition` | `Used` | `New`, `Used` or `Accident vehicle`. Employee's cars, classics, demonstration and pre-registered cars come through as `Used`, because that's how the results page lists them |
| `countryCode`, `zip`, `city` | `BE`, `9400`, `Voorde` | where the car is |
| `distanceKm` | `12` | how far from the place you searched around, as AutoScout24 gives it; empty without a place |
| `sellerType` | `dealer` | `dealer` or `private` |
| `dealerName`, `dealerId` | `Garage Brys`, `40964387` | empty for private sellers |
| `url` | `https://www.autoscout24.com/offers/...` | the listing on AutoScout24 |
| `images`, `imageCount` | | links to the photos at full size, as many as the results page lists |
| `searchUrl`, `page` | | the search and the page the car was found on |
| `scrapedAt` | `2026-09-13T08:53:10.141Z` | |

Prices are what the seller typed, so a car listed at 1 euro comes through as 1.

Every car is checked against the search before it's kept, on everything the results page shows about it: make, model, price, year, mileage, power, fuel, gearbox, seller type, country, new, used or accident, price rating and distance. The filters the results page doesn't show per car, like body type, colour, owners, emission class or equipment, are checked against the site's own record of the search it ran. That matters because AutoScout24 sometimes answers a search it can't match with a broader one: a model it doesn't know can come back as every car of that make, and a place it can't find as every car in the country, both on a normal-looking page. The actor returns nothing rather than the wrong cars, and charges nothing for them.

AutoScout24 draws a radius its own way, so a car a few kilometres past the edge can turn up. Up to 10% or 5 km past it, whichever is more, the car is kept, and anything further is left out.

The run also writes a report, `RUN_REPORT` in the key-value store: each search, what AutoScout24 said it has, the place it searched around, the pages read, the repeats skipped, cars left out because they didn't fit and why, and why the run stopped.

### What you pay

You're charged per car returned. Repeats, cars left out because they didn't fit your search, and searches that come back empty add nothing to it. If you set a maximum charge for the run, it stops when that's reached, and every row you get has been paid for. The price is on the Pricing tab.

### Limits

- 200 pages per search, which came to 3,400 to 4,000 cars in our tests. That ceiling is AutoScout24's.
- 10 links plus the make-and-model search per run, and 40,000 cars per run.
- One page at a time, with a short pause between pages. A thousand cars took a minute and a half in our tests, and a search read to its last page just under six minutes.
- If a page doesn't come through, it's tried again a few times. Two pages in a row that fail end that search, and the status says so. Nothing is charged for cars that never arrived.
- Listings come and go while a long search is being read. If the same car turns up twice, the second copy is dropped.

### Questions

**Why do I get fewer cars than the site says it has?** Usually the 200-page ceiling. Next come cars left out because they didn't fit the search. `RUN_REPORT` counts both. The site also shows some cars twice, once in a slot at the top and once in the list; those copies are dropped and were never in its count.

**Can I get the sellers' phone numbers?** No. See the top of this page.

**A demonstration car says Used.** That's how AutoScout24's results page lists employee's cars, classics, demonstration and pre-registered cars. Pick them under Offer type and you get only those.

**My town search came back around somewhere else.** AutoScout24 picked a different place with that name. The status says which one it used. Try the postcode.

**Why does it say Gasoline, not petrol?** That's autoscout24.com's word, and the rows use the English site's words whichever country the search came from, so a German and an Italian search line up in one sheet.

**A model I know exists came back empty.** The site probably names it differently. `RUN_REPORT` lists the names AutoScout24 uses for that make. Or set the search up on the site and paste the link instead.

# Actor input Schema

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

The make the way AutoScout24 spells it: BMW, Volkswagen, Mercedes-Benz, Alfa Romeo. Leave it empty if you only use search links below.

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

Optional. The model in English, as autoscout24.com names it: 3 Series, Golf, C-Class, Model 3. If the site doesn't know the name, the run returns nothing, charges nothing, and lists the model names it does know in RUN\_REPORT.

## `keyword` (type: `string`):

Optional. A word or two the listing title has to contain, like the site's Model version box: 320d, Touring, M Sport.

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

Where the car is for sale.

## `condition` (type: `string`):

As the seller listed the car. Employee's cars, classics, demonstration and pre-registered cars are all used cars here; Offer type below picks them out.

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

Lowest asking price, in euros.

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

Highest asking price, in euros.

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

Earliest year the car was first registered.

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

Latest year the car was first registered.

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

Lowest mileage, in kilometres.

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

Highest mileage, in kilometres.

## `fuel` (type: `string`):

Hybrids are listed under their own two entries.

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

Automatic, manual or semi-automatic.

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

Dealers, private sellers, or both.

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

The order listings are read in. With a limit below the number of listings, this decides which ones you get.

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

Or paste up to 10 results pages from any AutoScout24 country site (autoscout24.de, .com, .at, .it, .fr, .es, .nl, .be, .lu), with the filters you set there. Each link needs a make in it. The form fields don't apply to links.

## `maxItems` (type: `integer`):

The most listings returned in one run, across all searches. Each one returned is charged. Repeats are skipped and not counted.

## `location` (type: `string`):

A postcode is the surest. A town name is read AutoScout24's way: "Munich" once came back as Münichham, a village about 85 km east. The status and RUN\_REPORT say which place was searched. With all eight countries picked, the site can't place it, so the run asks for one country.

## `radiusKm` (type: `string`):

How far from the place. Left empty, AutoScout24 uses 200 km.

## `offerTypes` (type: `array`):

Pick one or more; empty means all of them. The rows still say Used for employee's cars, classics, demonstration and pre-registered cars, because that's how the results page lists them.

## `accidentVehicles` (type: `string`):

Cars the seller lists as having had an accident. AutoScout24 leaves them out unless you ask.

## `maxPreviousOwners` (type: `string`):

Once this is set, cars whose listing doesn't say how many owners they had are left out too.

## `warranty` (type: `boolean`):

Only cars sold with a warranty.

## `fullServiceHistory` (type: `boolean`):

Only cars listed with a full service history.

## `nonSmoking` (type: `boolean`):

Only cars listed as non-smoking.

## `newInspection` (type: `boolean`):

Cars that have just passed the German roadworthiness and emissions test, the site's "HU/AU new".

## `powerFrom` (type: `integer`):

In the unit picked below.

## `powerTo` (type: `integer`):

In the unit picked below.

## `powerUnit` (type: `string`):

Kilowatts or horsepower, for the two fields above.

## `electricRangeFrom` (type: `integer`):

Only electric cars and plug-in hybrids have one, so this leaves everything else out.

## `electricRangeTo` (type: `integer`):

Highest electric range, in kilometres.

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

Pick one or more; empty means all of them.

## `seatsFrom` (type: `integer`):

Fewest seats.

## `seatsTo` (type: `integer`):

Most seats.

## `doorsFrom` (type: `integer`):

The site's own buttons are 2/3, 4/5 and 6/7: from 4 to 5 is its 4/5.

## `doorsTo` (type: `integer`):

Most doors.

## `colors` (type: `array`):

Pick one or more; empty means any colour.

## `metallic` (type: `boolean`):

Only cars listed with metallic paint.

## `interiorColors` (type: `array`):

Pick one or more; empty means any.

## `upholstery` (type: `array`):

Pick one or more; empty means any.

## `emissionClass` (type: `string`):

Euro 6 also brings Euro 6b, 6c, 6d and 6e cars, the way the site's own filter works.

## `emissionSticker` (type: `string`):

The Umweltplakette. Blue found no cars at all in our tests.

## `particulateFilter` (type: `boolean`):

Only cars listed with a particulate filter.

## `equipment` (type: `array`):

Every item you pick has to be on the car, as on the site. The list is AutoScout24's own.

## `priceRatings` (type: `array`):

AutoScout24's own price badge. Pick one or more; empty means any. Once you pick one, cars the site hasn't rated are left out.

## `vatDeductible` (type: `boolean`):

Cars sold with the VAT shown on the invoice, which a business buyer can reclaim. In practice these are dealers' cars.

## `onlineSince` (type: `string`):

Only listings that went up on AutoScout24 in that time.

## `financeRateFrom` (type: `integer`):

The monthly rate AutoScout24 lists for financing the car.

## `financeRateTo` (type: `integer`):

Highest monthly finance rate, in euros.

## `leasingOnly` (type: `boolean`):

The leasing fields below narrow the search to leasing offers on their own too.

## `leasingRateFrom` (type: `integer`):

Lowest monthly leasing rate, in euros.

## `leasingRateTo` (type: `integer`):

Highest monthly leasing rate, in euros.

## `leasingMonthsFrom` (type: `integer`):

Shortest leasing term, in months.

## `leasingMonthsTo` (type: `integer`):

Longest leasing term, in months.

## `leasingMileageFrom` (type: `integer`):

The fewest kilometres a year the lease has to include.

## `leasingAvailableNow` (type: `boolean`):

Only leasing cars you can have straight away.

## `leasingTradeIn` (type: `boolean`):

The site's trade-in tick. It found no cars in our tests.

## `leasingEnvironmentBonus` (type: `boolean`):

The site's Umweltbonus tick. It found no cars in our tests.

## Actor input object example

```json
{
  "make": "BMW",
  "model": "3 Series",
  "country": "all",
  "condition": "used",
  "fuel": "any",
  "transmission": "any",
  "sellerType": "any",
  "sort": "newest",
  "maxItems": 50,
  "accidentVehicles": "hide",
  "powerUnit": "kw"
}
```

# Actor output Schema

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

One row per listing: make, model, version, price, mileage, first registration, fuel, gearbox, power, place, seller type, dealer name, link and photos. A search that finds nothing adds no rows; RUN\_REPORT says why.

## `report` (type: `string`):

Each search with what AutoScout24 answered, how many listings it has, pages read, repeats and off-search listings left out, and why the run stopped. For a make or model the site doesn't know, the names it does know.

# 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",
    "condition": "used",
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 = {
    "make": "BMW",
    "model": "3 Series",
    "condition": "used",
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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 '{
  "make": "BMW",
  "model": "3 Series",
  "condition": "used",
  "maxItems": 50
}' |
apify call dami_studio/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/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/XcX3tLEm9kDm35MQS/builds/neQS3YINBpXja8AFc/openapi.json
