# AutoScout24 Scraper: Car Listings, New Ads & Price Drops (`scrapewise/autoscout24-scraper`) Actor

Scrape AutoScout24 car listings in Germany, Italy, France, Netherlands, Belgium, Austria, Spain and Luxembourg. Paste a search link or use make, model, price, year, mileage and fuel filters. Schedule it daily: only new listings and price drops.

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

## Pricing

from $0.34 / 1,000 listing delivereds

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?

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

## AutoScout24 Scraper: car listings, new ads and price drops

Scrape [AutoScout24](https://www.autoscout24.com), Europe's largest online car marketplace, **without an
account, cookies or a browser**. Paste any AutoScout24 search link (Germany, Italy, France, the
Netherlands, Belgium, Austria, Spain, Luxembourg or the .com site) with your filters, or just fill in make,
model, country, price, year, mileage, fuel and body type. You get price, mileage, first registration, fuel,
transmission, AutoScout24's price rating, photos and the dealer, for up to 4,000 cars per search.

Built to run **every day on a schedule**: `onlyNew` returns only cars you have not received before, and
`trackPriceChanges` tells you which listings dropped their price since the last run. A day with nothing
new costs nothing.

### At a glance

- **Price per 1,000 listings:** US$ 0.40 (down to US$ 0.34 on Gold and above)
- **Full listing page (optional):** US$ 0.40 per 1,000 listings
- **Fee per run start:** None
- **Countries:** Germany, Austria, Belgium, Spain, France, Italy, Luxembourg, Netherlands (one, several or all)
- **Search by link or by fields:** Both, in the same run
- **New listings only, price drops:** Yes, remembered in your own account between runs
- **Private sellers' data:** Never (see below)
- **Error rows:** Free, with an `errorCode`

### One real row

From a test run on 2026-10-06 (BMW 3 Series, Germany, dealers, with `includeDetails` and
`trackPriceChanges`; photos and equipment shortened):

```json
{
  "type": "listing",
  "id": "b5ebf61e-2d1f-485c-aac3-fd05aa77577c",
  "url": "https://www.autoscout24.com/offers/bmw-320-i-limousine-bi-xenon-naviprof-standklima-17z-gasoline-brown-cat_ma13mo1641-b5ebf61e-2d1f-485c-aac3-fd05aa77577c",
  "title": "BMW 320 i Limousine BI-XENON,NAVIPROF,STANDKLIMA,17Z",
  "make": "BMW",
  "model": "320",
  "modelGroup": "3 Series",
  "variant": "Sedan",
  "price": 5880,
  "currency": "EUR",
  "priceRating": "veryGood",
  "mileageKm": 230000,
  "firstRegistration": "2012-08",
  "firstRegistrationYear": 2012,
  "fuelType": "gasoline",
  "transmission": "Automatic",
  "engineCcm": 1998,
  "offerType": "used",
  "sellerType": "dealer",
  "dealerName": "Autohaus Royal GmbH",
  "countryCode": "DE",
  "city": "Ludwigsfelde",
  "zip": "14974",
  "images": ["https://prod.pictures.autoscout24.net/listing-images/b5ebf61e-2d1f-485c-aac3-fd05aa77577c_68ccadcf-65b2-4999-b3d3-1a881d4a4d58.jpg/1280x960.webp"],
  "imageCount": 20,
  "position": 1,
  "isNewListing": true,
  "previousPrice": null,
  "priceChange": null,
  "isPriceDrop": false,
  "powerHp": 184,
  "bodyType": "Sedan",
  "bodyColor": "Brown",
  "doors": 4,
  "gears": 8,
  "driveTrain": "Rear Wheel Drive",
  "emissionClass": "Euro 5",
  "equipment": ["Air conditioning", "Armrest", "Automatic climate control, 2 zones", "Cruise control"],
  "listedAt": "2026-09-30T23:39:34.068Z",
  "scrapedAt": "2026-10-06T14:43:44Z",
  "errorCode": null
}
```

### What you can do with it

- **New-car alerts:** schedule your saved search every morning with `onlyNew` and send the new cars
  to Slack, e-mail or Google Sheets before other buyers call the dealer.
- **Price-drop watch:** `trackPriceChanges` with `onlyPriceDrops` returns only the cars that just
  got cheaper, with the old price, the new price and the change in percent.
- **Dealer sourcing and arbitrage:** compare the same model across Germany, Italy, the Netherlands
  and Spain in one run, using `priceRating` and, with full pages, `marketMedianPrice`.
- **Market and residual value research:** price against mileage and year for any model, up to
  4,000 listings per search; split by year or price range to go further.
- **Dealer lead lists:** dealer name, city, address and rating for every car a
  dealer lists (dealers only; nothing from private sellers).
- **Datasets for pricing models and AI agents:** clean numbers (`price`, `mileageKm`,
  `firstRegistrationYear`, `powerHp`) on every row.

### Input

| Field | Type | What it does |
|---|---|---|
| `startUrls` | list | AutoScout24 search links from any country site, filters kept. Listing links also work. |
| `make`, `model` | text | For example `BMW` and `3 Series` (or `320`), `Volkswagen` and `Golf`. |
| `countries` | list | `DE`, `AT`, `BE`, `ES`, `FR`, `IT`, `LU`, `NL`. Empty = all. |
| `priceMin`, `priceMax` | EUR | Price range. |
| `yearMin`, `yearMax` | year | First registration range. |
| `mileageMin`, `mileageMax` | km | Mileage range. |
| `fuelTypes` | list | `gasoline`, `diesel`, `electric`, `hybridGasoline`, `hybridDiesel`, `lpg`, `cng`, `hydrogen`, `ethanol`, `other`. |
| `bodyTypes` | list | `compact`, `convertible`, `coupe`, `suv`, `stationWagon`, `sedan`, `van`, `transporter`, `other`. |
| `transmission` | text | `any`, `automatic`, `manual`, `semiAutomatic`. |
| `sellerType` | text | `any`, `dealer`, `private`. |
| `offerTypes` | list | `used`, `new`, `employeesCar`, `classic`, `demonstration`, `preRegistered`. |
| `zipCode`, `radiusKm` | text, km | Cars around a postal code (needs one country). |
| `sortBy` | text | `standard`, `newest`, `priceLowToHigh`, `priceHighToLow`, `mileageLowToHigh`, `yearNewest`. |
| `maxItems` | integer, default 50 | Listings per search. `0` = all the site shows (up to 4,000). |
| `onlyNew` | boolean | Only listings never returned by this search before. |
| `trackPriceChanges` | boolean | Adds the price change since the last run; with `onlyNew`, also returns listings whose price changed. |
| `onlyPriceDrops` | boolean | With both options above, price increases are skipped. |
| `includeDetails` | boolean | Full listing page for each car (extra event). |
| `site` | text, default `com` | Site for the fields search; `com` gives English labels. |
| `proxyConfiguration` | proxy | Apify Proxy by default. |

```json
{
  "make": "BMW",
  "model": "3 Series",
  "countries": ["DE"],
  "priceMax": 30000,
  "yearMin": 2018,
  "fuelTypes": ["diesel"],
  "maxItems": 200
}
```

Or with a link copied from the site:

```json
{
  "startUrls": ["https://www.autoscout24.de/lst/bmw/3er-(alle)?atype=C&cy=D&fregfrom=2018&priceto=30000"],
  "maxItems": 200
}
```

### Schedule it daily: new listings and price drops

1. Set up your search (a link or the fields) and turn on `onlyNew` and `trackPriceChanges`.
2. Save it as a Task and add a Schedule (every morning, or every hour).
3. Connect the Task to Slack, e-mail, Google Sheets, Make, n8n or Zapier.

```json
{
  "startUrls": ["https://www.autoscout24.de/lst/porsche/911?atype=C&cy=D&priceto=90000"],
  "onlyNew": true,
  "trackPriceChanges": true,
  "maxItems": 0
}
```

What each run returns:

- **New listings** (`isNewListing: true`), cars this search has never returned before.
- **Price changes** on cars you already have, with `previousPrice`, `priceChange`,
  `priceChangePct` and `isPriceDrop`. Add `onlyPriceDrops: true` to get only the drops.
- Nothing else. Cars you already have at the same price are skipped and **not charged**, so a quiet
  day costs nothing (the run says so in its status message).

Good to know:

- The memory lives in a Key-Value Store in your own account, `autoscout24-scraper-memory`, one
  record per search and filter set. You can open it, and deleting it starts over.
- The first run returns up to `maxItems` cars and remembers them; later runs return only what changed.
- `onlyNew` alone reads newest first and stops at the first page with nothing new. With
  `trackPriceChanges` it reads the whole search (up to `maxItems` delivered), because a price can
  change on any car.
- Changing a filter makes a new search with its own memory.
- `trackPriceChanges` without `onlyNew` returns every car, each with the change since the last run.

### Output fields

Every listing row:

- `id`, `url`, `title`, `make`, `model`, `modelGroup`, `variant`, `version`
- `price`, `currency`, `priceFormatted`, `priceRating` (AutoScout24's label: `veryGood`, `good`,
  `fair`, `increased`, `high`, `belowMarket`)
- `mileageKm`, `firstRegistration` (`YYYY-MM`), `firstRegistrationYear`, `fuelType` (English code),
  `fuel` and `transmission` (site labels), `engineCcm`, `offerType`, `isDamaged`, `highlights`
- `sellerType` (`dealer` or `private`), `countryCode`
- Dealers only: `dealerName`, `dealerId`, `dealerRating`, `dealerReviewCount`,
  `dealerPageUrl`, `city`, `zip`, `street`
- `images` (full size), `imageCount`, `thumbnail`, `position`, `searchUrl`, `scrapedAt`
- With `onlyNew` or `trackPriceChanges`: `isNewListing`, `firstSeenAt`, `previousSeenAt`,
  `previousPrice`, `priceChange`, `priceChangePct`, `isPriceDrop`

With `includeDetails` (or a listing link): `description`, `equipment`, `equipmentByCategory`,
`powerKw`, `powerHp`, `bodyType`, `bodyColor`, `bodyColorOriginal`, `paintType`, `doors`, `seats`,
`gears`, `cylinders`, `driveTrain`, `emptyWeightKg`, `upholstery`, `previousOwners`,
`hasFullServiceHistory`, `nonSmoking`, `nextInspection`, `emissionClass`, `co2EmissionsGKm`,
`consumptionL100Km`, `electricRangeKm`, `warranty`, `priceNegotiable`, `netPrice`, `vatRate`,
`marketMedianPrice`, `listedAt`, `listingStatus` and, for dealers, `latitude` and `longitude`.

### Errors you may see

| `errorCode` | Meaning | Charged |
|---|---|---|
| `INVALID_INPUT` | a filter value is not valid, an unknown make or model (the row lists valid names), or a link that is not an AutoScout24 search or listing | no |
| `NOT_FOUND` | the search page or the listing does not exist (sold or removed) | no |
| `NO_RESULTS` | AutoScout24 found no car for this search and filters | no |
| `BLOCKED` | AutoScout24 did not answer after four attempts on new IPs; run again | no |
| `NOT_REACHED` | the run timeout arrived before this search or listing | no |
| `UNEXPECTED` | a listing came in a shape we did not expect; the rest of the run goes on | no |

### Pricing

- **US$ 0.40 per 1,000 listings** delivered (down to US$ 0.34 on Gold and above).
- **US$ 0.40 per 1,000 full listing pages**, only with `includeDetails` (or listing links), because
  each one is an extra request. A listing with its full page costs US$ 0.80 per 1,000.
- No start fee. Error rows, duplicates (the same car found by two searches) and cars skipped by
  `onlyNew` are free.

### Limitations

- **4,000 listings per search.** That is all AutoScout24 shows for one search. Split a broad
  search by price, year or country to go further.
- **Private sellers' data is never returned.** For a private seller you get the car, the country
  and `sellerType: "private"`. No name, phone, e-mail, postal code, city, street, coordinates or
  seller id. In a private seller's description, e-mail addresses and phone numbers are replaced with
  `[removed]`. Dealers are businesses: their company name, address and rating are
  returned, never the name of the person to contact.
- **Labels follow the site.** With `site: "com"` (the default for field searches) `fuel`,
  `transmission`, `bodyType` and equipment come in English; a link from autoscout24.de returns them in
  German. `fuelType`, `offerType` and `priceRating` are always the same English codes.
- **autoscout24.ch** is a separate platform and is not supported.
- `priceRating` is missing on some listings; AutoScout24 only rates cars it has enough data for.

### FAQ

**Do I need an AutoScout24 account?** No. Nothing to log in to and no cookies to paste.

**Can I paste a search link from my browser?** Yes, from any AutoScout24 country site, with all its
filters (make, model, price, year, mileage, fuel, equipment, radius...). The Actor reads every page of
it, 100 listings per request.

**How fast is it?** About 100 listings per second of search; 150 listings took 3.4 seconds in a test.
Full listing pages are read six at a time.

**How do I get only cars that just got cheaper?** Turn on `onlyNew`, `trackPriceChanges` and
`onlyPriceDrops`, and schedule the Task. The first run builds the memory; from the second run on, you
get new cars and price drops only.

**Can I use it from n8n, Make, Zapier or an AI agent?** Yes, through the Apify integrations or the
Apify MCP server. Error rows are free, so an agent can explore cheaply.

**What if a run is cut by its timeout?** The Actor stops shortly before the limit and ends
successfully with what it delivered, telling you in the status message how to get the rest.

### Changelog

- **0.1 (2026-10-06)**: first version. Search links from every AutoScout24 country site and field
  search (make, model, countries, price, year, mileage, fuel, body, transmission, seller, condition,
  postal code and radius), up to 4,000 listings per search, `onlyNew`, `trackPriceChanges` and
  `onlyPriceDrops` for daily schedules, optional full listing pages, free error rows.

# Actor input Schema

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

Search results links from any AutoScout24 site (autoscout24.de, .it, .fr, .nl, .be, .at, .es, .lu, .com), one per line. Set your filters on the site, copy the link from the address bar and paste it here: every filter in the link is kept. Listing links (one car) also work and return the full listing page. Leave empty to search with the fields below.

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

Car make as AutoScout24 shows it, for example BMW, Volkswagen, Mercedes-Benz, Tesla.

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

Model or model range as AutoScout24 shows it, for example 3 Series, 320, Golf, C-Class, Model 3. Needs a make. If a name is not found, the error row lists valid names.

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

Where the cars are. Empty = all eight AutoScout24 countries.

## `priceMin` (type: `integer`):

Only cars at or above this price.

## `priceMax` (type: `integer`):

Only cars at or below this price.

## `yearMin` (type: `integer`):

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

## `yearMax` (type: `integer`):

Only cars first registered in this year or earlier.

## `mileageMax` (type: `integer`):

Only cars with at most this many kilometers.

## `mileageMin` (type: `integer`):

Only cars with at least this many kilometers.

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

Only these fuel types. Empty = any.

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

Only these body types. Empty = any.

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

Gearbox type.

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

Dealers only, private sellers only, or both.

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

Used, new, demonstration and so on. Empty = any.

## `zipCode` (type: `string`):

Search around this postal code, for example 10115 (Berlin). Needs exactly one country above.

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

Distance from the postal code, for example 50. Default 50.

## `sortBy` (type: `string`):

AutoScout24's own orders. With a limit it also decides which listings you get. onlyNew always uses newest first.

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

Stop each search (each link, and the field search) after this many listings. AutoScout24 shows at most 4,000 per search. 0 = as many as the site shows.

## `onlyNew` (type: `boolean`):

For scheduled runs. Remembers which listings each search (with its filters) already returned, in a named key-value store in your account ('autoscout24-scraper-memory'), and delivers only listings never returned before. Seen listings are not delivered and not charged. Uses the newest-first order. A run with nothing new costs nothing. Delete the store to start over.

## `trackPriceChanges` (type: `boolean`):

Remembers the last price of every listing per search (same key-value store) and adds previousPrice, priceChange, priceChangePct and isPriceDrop to each row. Together with 'Only new listings', a run delivers new listings plus listings whose price changed since the last run.

## `onlyPriceDrops` (type: `boolean`):

With both options above on, listings you already have come back only when their price went down (price increases are skipped and not charged).

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

Also read each listing's own page: full description, equipment list, power, body type, color, doors, seats, previous owners, consumption, CO2, warranty and the date the listing went online. One extra request per listing, charged as a separate event.

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

Which AutoScout24 site runs the search built from the fields above. autoscout24.com returns labels (fuel, transmission, body) in English; a country site returns them in its language. Links you paste always use their own site.

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

Apify Proxy, default group. If AutoScout24 keeps refusing it, the Actor switches to a stronger proxy group by itself.

## Actor input object example

```json
{
  "make": "BMW",
  "model": "3 Series",
  "countries": [
    "DE"
  ],
  "transmission": "any",
  "sellerType": "any",
  "sortBy": "standard",
  "maxItems": 50,
  "onlyNew": false,
  "trackPriceChanges": false,
  "onlyPriceDrops": false,
  "includeDetails": false,
  "site": "com",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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",
    "countries": ["DE"],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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",
  "countries": [
    "DE"
  ]
}' |
apify call scrapewise/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

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