# AutoScout24 Scraper: 9 Countries, Price History & Price Alerts (`epicscrapers/autoscout24-scraper`) Actor

Scrape AutoScout24 in all 9 countries, Switzerland included: full price history, AutoScout24's market price, dealer stock and seller phones, with no 4,000-result limit. Alerts for new listings, price drops, sold cars and reposts. From $0.35 per 1,000 listings, platform usage included.

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

## Pricing

from $0.35 / 1,000 listing saveds

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 from 9 countries with full price history, market prices and price alerts

AutoScout24 Scraper turns any AutoScout24 search into a spreadsheet: cars, motorbikes, vans and caravans from Germany, Austria, Belgium, Spain, France, Italy, Luxembourg, the Netherlands and Switzerland. Paste a search, dealer or listing URL from any AutoScout24 site, or just pick a make, model and filters. Every listing comes with numbers AutoScout24 itself keeps: every price the seller ever asked, AutoScout24's market price for the car, its price label, and how many people saved it.

- **Full price history from the first run.** Every past price with its date, straight from AutoScout24. No need to track a listing for weeks first.
- **AutoScout24's own market price.** The market price for comparable cars, the Top/Good/Fair/Higher/High price label, the fair-price band, and how far each car is above or below the market (`priceVsMarketPercent`).
- **No 4,000-result limit.** AutoScout24 shows at most 4,000 results per search, and a scraper that pages through the website gets even fewer. This actor splits big searches by price automatically, so "all Golfs in Germany" really returns all 29,000+.
- **Alerts that catch everything.** Schedule it in monitoring mode and get only new listings, price drops and increases, sold (removed) cars, cars that come back, and reposts: cars deleted and listed again under a new ID to look fresh.
- **9 countries, one dataset.** All 8 EU sites plus autoscout24.ch (Switzerland), which runs on a separate platform. Dealer pages return a dealer's whole stock.
- **From $0.35 per 1,000 listings ($0.45 on the free plan), platform usage included.** No subscription, no account, no API key, no proxy setup. Export to JSON, CSV, Excel or Google Sheets.

**Scope:** This actor covers AutoScout24 in 9 countries. For eBay Motors vehicles and parts use [eBay Motors Scraper](https://apify.com/epicscrapers/ebay-motors-scraper). For car ads on Subito in Italy use [Subito Automotive Scraper](https://apify.com/epicscrapers/subito-automotive-scraper). For German classified car ads use [Kleinanzeigen Scraper](https://apify.com/epicscrapers/kleinanzeigen-scraper).

### What can you do with AutoScout24 Scraper?

| Goal                                      | How                                                                                                         |
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Find underpriced cars to flip             | Sort by `priceVsMarketPercent`, or filter `priceRating` = `top_price`.                                      |
| Get alerts for new cars                   | Monitoring mode + sort Newest, scheduled every 5–15 minutes, with a webhook, Slack or email integration.    |
| Spot motivated sellers                    | `totalPriceDrop`, `priceChangesCount`, `priceHistory` and `daysOnMarket`. Reposts are flagged (`isRepost`). |
| Watch a competitor dealer                 | Paste the dealer's page and schedule it daily: new stock, price changes and sold cars.                      |
| Value cars and research a market          | Whole markets without the 4,000 cap, with AutoScout24's market price and fair-price band for each car.      |
| Compare prices across borders             | One run over several countries, Switzerland included (in CHF).                                              |
| Generate dealer leads                     | Dealer names, phones, websites, ratings and addresses (`sellerPhones`, `dealerWebsite`, `dealerRating`).    |
| Feed an AI assistant or a valuation model | Compact rows and a description length cap keep the data small.                                              |

### How it compares

| What you need                | AutoScout24 Scraper                                           | Typical AutoScout24 scrapers             |
| ---------------------------- | ------------------------------------------------------------- | ---------------------------------------- |
| Results per search URL       | Everything (automatic splitting)                              | 400 to 4,000, or split by hand           |
| Price history                | Every past price with dates, from the first run               | Only what they saw across their own runs |
| Market price and price label | Market price, label, fair-price band, % above or below market | Label at most                            |
| Demand                       | Favourites, enquiry level, days on market                     | Rarely                                   |
| Alerts                       | New, price drop/increase, removed, reappeared, reposts        | Some have an "incremental" mode          |
| Monitoring cost              | Only changes are charged; checks are free                     | Some charge for every listing compared   |
| Countries                    | 8 EU sites + Switzerland                                      | Usually the 8 EU sites or Switzerland    |
| Input                        | Search, dealer or listing URLs from any site, or filters      | Often search URLs only                   |
| Speed                        | 400 listings per request: 9,000 cars in about 20 seconds      | 20 per page                              |
| Price per 1,000 listings     | $0.35–$0.45, platform usage included                          | $0.45–$4.00                              |

### Quick start

1. Click **Try for free** and sign in to Apify. The free plan's monthly credit covers about 10,000 listings.
2. Open AutoScout24 in your browser, set your filters, copy the URL and paste it into **AutoScout24 URLs**. Or leave URLs empty and use **Make**, **Model** and the other filters.
3. For a first run, set **Max listings per search** to `50`.
4. Click **Start**. When the run finishes, open the **Output** tab and export the data.

```json
{
    "startUrls": [{ "url": "https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000&sort=age&desc=1" }],
    "maxItems": 50
}
```

### Which URLs work?

| URL                                                                                                 | What you get                  |
| --------------------------------------------------------------------------------------------------- | ----------------------------- |
| Search page on any EU site: `autoscout24.de/lst/bmw/3er?fregfrom=2018`, `autoscout24.it/lst?...`    | Every listing of the search   |
| Dealer page: `autoscout24.de/haendler/...`, `autoscout24.com/dealerinfo/...`                        | The dealer's whole stock      |
| Listing page: `autoscout24.de/angebote/...`, `autoscout24.com/offers/...`                           | That listing                  |
| Switzerland: `autoscout24.ch/de/s/...` (search), `.../s/seller-...` (dealer), `.../d/...` (listing) | The same, from autoscout24.ch |

Set any filters and sort on the website first; the actor keeps them all.

### What data can you extract?

Every row is one listing:

| Group      | Fields                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Vehicle    | `title`, `make`, `model`, `modelGroup`, `version`, `vehicleType`, `mileageKm`, `firstRegistration`, `firstRegistrationYear`, `modelYear`, `condition`, `fuel`, `transmission`, `driveTrain`, `powerKw`, `powerHp`, `engineSizeCc`, `cylinders`, `gears`, `bodyType`, `color`, `doors`, `previousOwners`, `hadAccident`, `isDamaged`, `hasFullServiceHistory`, `isNonSmoking`, `hasNewInspection`, `hasWarranty`, `equipment`, `description` |
| Price      | `price`, `currency`, `priceNet`, `vatRate`, `isVatDeductible`, `isPriceNegotiable`, `isPriceOnRequest`                                                                                                                                                                                                                                                                                                                                      |
| Market     | `marketPrice`, `priceRating`, `priceRatingCode`, `priceVsMarketPercent`, `fairPriceMin`, `fairPriceMax`                                                                                                                                                                                                                                                                                                                                     |
| History    | `priceHistory`, `originalPrice`, `totalPriceDrop`, `priceChangesCount`, `createdAt`, `updatedAt`, `renewedAt`, `isRenewed`, `daysOnMarket`                                                                                                                                                                                                                                                                                                  |
| Demand     | `favoritesCount`, `interestLevel`                                                                                                                                                                                                                                                                                                                                                                                                           |
| Seller     | `sellerType`, `sellerId`, `sellerName`, `sellerContactName`, `sellerPhones`, `dealerRating`, `dealerRatingCount`, `dealerRecommendPercent`, `dealerWebsite`, `dealerStockNumber`                                                                                                                                                                                                                                                            |
| Location   | `country`, `postalCode`, `city`, `street`, `latitude`, `longitude`                                                                                                                                                                                                                                                                                                                                                                          |
| Media      | `mainImageUrl`, `imageUrls`, `imageCount`                                                                                                                                                                                                                                                                                                                                                                                                   |
| Monitoring | `changeType`, `previousPrice`, `priceChange`, `priceChangePercent`, `firstSeenAt`, `removedDetectedAt`, `isRepost`, `repostOfId`, `repostedAsId`                                                                                                                                                                                                                                                                                            |
| Source     | `id`, `url`, `searchUrl`, `searchQuery`, `scrapedAt`                                                                                                                                                                                                                                                                                                                                                                                        |

With **Compact rows** on, each row has about 25 core fields (title, price, price rating, mileage, registration, fuel, location, seller, link) plus the monitoring fields.

#### Switzerland

autoscout24.ch is a separate platform with its own data. Swiss rows have the same fields, with these differences:

- Prices are in CHF (`currency: "CHF"`). The price filters use CHF for Switzerland too.
- No price history, market price, price label, favourites or enquiry level: autoscout24.ch doesn't publish them. When the seller lowered the price, `originalPrice` is the price before the last change and `totalPriceDrop` the difference.
- No equipment list. Description, body type, colour, engine and seller details (phones, address, website, Google rating) are included.
- The postal code and radius filters are not available.
- Each Swiss listing takes an extra request for its details, so Switzerland is slower: about 30 listings per second.

### Monitoring: new listings, price drops, sold cars and reposts

1. Set **Sort by** to **Newest first** and turn on **Only new or changed listings**. Give the monitor a name, e.g. `bmw-3er-munich`.
2. Run it once. The first run saves what it finds (up to **Max listings**) to learn the current listings.
3. Schedule it (see below) and add an integration (webhook, Slack, email, Make, Zapier).

Each run then reads only the newest page(s) until it reaches listings it has already seen, and re-checks earlier listings it didn't see in this run. Every saved row has a `changeType`:

| `changeType`                    | Meaning                                                                                               |
| ------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `new`                           | Appeared since the last run. `isRepost: true` when it's a car that was just deleted and listed again. |
| `price_drop` / `price_increase` | With `previousPrice`, `priceChange` and `priceChangePercent`.                                         |
| `removed`                       | Taken down, usually sold, with the last known price. `repostedAsId` when the car was listed again.    |
| `reappeared`                    | A removed listing that is back online.                                                                |

A repost is a new listing from the same seller for the same car (make, model, first registration, power and mileage within 1,000 km) as a listing that was just removed. Dealers do this to reset "days on market". Turn on **Skip reposts** to receive only genuinely new cars.

You pay only for these rows. Re-checks and unchanged listings are free.

```json
{
    "startUrls": [{ "url": "https://www.autoscout24.de/lst/bmw/3er?zip=80331&zipr=50" }],
    "sort": "newest",
    "maxItems": 200,
    "onlyNewOrChanged": true,
    "monitorKey": "bmw-3er-munich"
}
```

In monitoring, **Max listings** is how far back each run looks: set it above the number of new listings between two runs. All of Germany gets about 10 new cars per minute; a narrow search gets far fewer.

### Track AutoScout24 over time with scheduled runs

#### 1. Save your input as a task

Open the actor, set your URLs or filters, then click **Save as a new task**. A task is a saved input you can run again with one click or on a schedule.

#### 2. Schedule the task

In Apify Console, go to **Schedules**, click **Create new**, choose how often to run, and add your task. See [Schedules](https://docs.apify.com/platform/schedules) and [How to create a schedule](https://help.apify.com/en/articles/7120817-how-to-create-a-schedule).

Watch how to schedule an Actor:

https://www.youtube.com/watch?v=1jI7WcVQmwM

Or schedule a saved task:

https://www.youtube.com/watch?v=GRFW_Loo2dk

Common schedules:

| Use case                          | Frequency        | Cron expression |
| --------------------------------- | ---------------- | --------------- |
| New-listing and price-drop alerts | Every 10 minutes | `*/10 * * * *`  |
| Competitor dealer stock           | Daily            | `0 7 * * *`     |
| Market prices for a model         | Weekly (Monday)  | `0 6 * * 1`     |

#### 3. Send the results where you need them

Connect Google in the task's **Integrations** tab to save every run to Google Sheets or Google Drive automatically:

https://www.youtube.com/watch?v=IFTeKdj6ZGM

For alerts, add a Slack, email or webhook integration that fires when a run succeeds. In monitoring mode the run's dataset holds only the changes, so every message is news.

#### 4. Compare runs

Every row has `id`, `sellerId` and `scrapedAt`, so runs are easy to join:

- **Sold cars per dealer:** count `removed` rows per `sellerId`.
- **Time to sell:** `daysOnMarket` on `removed` rows, per make and model.
- **Price cuts:** `price_drop` rows, or `priceHistory` on any row.
- **Market trend:** median `price` and `marketPrice` per model, week by week.

### Input reference

| Field                     | Type    | Default | Effect                                                                                                              |
| ------------------------- | ------- | ------- | ------------------------------------------------------------------------------------------------------------------- |
| `startUrls`               | Array   | Empty   | Search, dealer or listing URLs from any AutoScout24 site, including autoscout24.ch.                                 |
| `maxItems`                | Integer | `100`   | Listings per search. `0` = all, with automatic splitting past 4,000.                                                |
| `sort`                    | String  | `keep`  | `keep` (the URL's sort), `standard`, `newest`, `price_asc`, `price_desc`, `mileage_asc`, `year_desc`, `power_desc`. |
| `vehicleType`             | String  | `car`   | Filters only (no URLs): `car`, `motorbike`, `van`, `caravan`.                                                       |
| `countries`               | Array   | 8 EU    | `DE`, `AT`, `BE`, `ES`, `FR`, `IT`, `LU`, `NL`, `CH`. Empty = the 8 EU countries; add `CH` for Switzerland.         |
| `make`, `model`           | String  | Empty   | Names as on AutoScout24: `BMW` + `3 Series` (all 3 Series) or `320` (one model).                                    |
| `priceMin`/`priceMax`     | Integer | Empty   | EUR (CHF for Switzerland).                                                                                          |
| `yearMin`/`yearMax`       | Integer | Empty   | First registration year.                                                                                            |
| `mileageMax`              | Integer | Empty   | km.                                                                                                                 |
| `fuelTypes`, `gearbox`    | Array   | Any     | e.g. `["diesel", "electric"]`, `["automatic"]`.                                                                     |
| `condition`, `sellerType` | String  | `any`   | `used`/`new`; `dealer`/`private`.                                                                                   |
| `postalCode`, `radiusKm`  | Mixed   | Empty   | Search around a postal code (EU countries only).                                                                    |
| `onlyNewOrChanged`        | Boolean | `false` | Monitoring: save only new, changed, removed and reappeared listings since the last run of the same search.          |
| `monitorKey`              | String  | Empty   | Name of the monitor's memory. Same name + same search = runs continue from each other.                              |
| `detectRemovals`          | Boolean | `true`  | Monitoring: re-check listings not seen in this run; report removed, reappeared and reposted listings.               |
| `skipReposts`             | Boolean | `false` | Monitoring: don't save reposts of removed listings.                                                                 |
| `includeDescription`      | Boolean | `true`  | The seller's description as plain text.                                                                             |
| `includeEquipment`        | Boolean | `true`  | Equipment list (EU sites).                                                                                          |
| `descriptionMaxLength`    | Integer | `0`     | Cut descriptions to this many characters. `0` = full.                                                               |
| `compact`                 | Boolean | `false` | About 25 core fields per row instead of 80+.                                                                        |

The filters are used when there are no URLs. With URLs, set the filters on AutoScout24 and copy the URL.

### Ready-to-run examples

#### Every Volkswagen Golf in Germany (no 4,000 limit)

```json
{ "make": "Volkswagen", "model": "Golf", "countries": ["DE"], "maxItems": 0 }
```

29,000+ listings in a few minutes. The run summary shows how the search was split.

#### Compare a model in Germany and Switzerland

```json
{ "make": "Tesla", "model": "Model 3", "countries": ["DE", "CH"], "maxItems": 1000, "compact": true }
```

Group the rows by `country` and compare `price` per `firstRegistrationYear` (EUR for Germany, CHF for Switzerland).

#### A competitor dealer's stock, checked daily

```json
{
    "startUrls": [{ "url": "https://www.autoscout24.de/haendler/auto-croll-und-sondermann-gmbh-velbert" }],
    "maxItems": 0,
    "onlyNewOrChanged": true,
    "monitorKey": "dealer-croll"
}
```

Schedule it daily: you get the dealer's new cars, price changes and sold cars.

#### Underpriced cars from private sellers

```json
{ "countries": ["DE", "AT"], "sellerType": "private", "priceMax": 15000, "sort": "newest", "maxItems": 1000 }
```

Filter the results to `priceRating` = `top_price` or sort by `priceVsMarketPercent`.

#### Cheapest electric cars in France and Belgium

```json
{ "countries": ["FR", "BE"], "fuelTypes": ["electric"], "sort": "price_asc", "maxItems": 500 }
```

#### Motorbikes in Italy

```json
{ "vehicleType": "motorbike", "countries": ["IT"], "maxItems": 1000 }
```

### Analyze the results with ChatGPT or Claude

Export the dataset as CSV (the **Deals & price history** view, or **Compact rows** with a **Max description length** of 300, keeps it small) and attach it to a chat with ChatGPT, Claude or another AI assistant. Some prompts to start with:

**Find the deals.** "This is AutoScout24 data for one model. List the 10 cars with the lowest `priceVsMarketPercent` that have under 150,000 km. For each, say whether the description mentions damage, missing service history or anything else that explains the low price."

**Price my car.** "Using these listings, estimate a fair asking price for a \[year] \[model] with \[km] km and \[equipment]. Use `marketPrice`, `fairPriceMin` and `fairPriceMax` of similar cars, and show the 5 most comparable listings."

**Read a dealer's strategy.** "These rows are one dealer's monitoring results for a month. How many cars did they sell (`removed`), how long did they take (`daysOnMarket`), how often did they cut prices, and which cars did they repost (`isRepost`)?"

The dataset is also available through the [Apify API](https://docs.apify.com/api/v2) and integrations such as Make, Zapier and n8n, so you can feed it into an automated workflow.

### Output

Results go to the run's default dataset. Use the views **Overview**, **Deals & price history**, **Monitoring changes** or **Sellers & contacts**, or export everything as JSON, CSV, Excel, XML or HTML.

A real row from October 2, 2026 (equipment, images and phone number shortened):

```json
{
    "id": "e8045477-b1dc-4c40-866d-235451553990",
    "url": "https://www.autoscout24.com/offers/bmw-116-116-d-tuev-xenon-klimaaut-alu-8-fach-bereift-diesel-black-cat_ma13mo18480-e8045477-b1dc-4c40-866d-235451553990",
    "title": "BMW 116 d TÜV/Xenon/Klimaaut/Alu/8-fach bereift",
    "make": "BMW",
    "model": "116",
    "vehicleType": "car",
    "price": 1000,
    "currency": "EUR",
    "priceRating": null,
    "marketPrice": 2500,
    "priceVsMarketPercent": -60,
    "fairPriceMin": 2501,
    "fairPriceMax": 2900,
    "originalPrice": 1200,
    "totalPriceDrop": 200,
    "priceChangesCount": 3,
    "priceHistory": [
        {
            "date": "2026-09-30T12:29:25.183Z",
            "price": 1200
        },
        {
            "date": "2026-09-30T12:32:13.474Z",
            "price": 1150
        },
        {
            "date": "2026-10-02T08:28:00.672Z",
            "price": 1100
        },
        {
            "date": "2026-10-02T11:22:45.922Z",
            "price": 1000
        }
    ],
    "mileageKm": 327000,
    "firstRegistration": "2011-03",
    "condition": "used",
    "fuel": "Diesel",
    "transmission": "Manual",
    "powerKw": 85,
    "powerHp": 116,
    "bodyType": "Compact",
    "color": "Black",
    "previousOwners": 3,
    "equipment": ["Armrest", "Automatic climate control", "Cruise control", "Electrical side mirrors"],
    "country": "DE",
    "city": "Triptis",
    "sellerType": "dealer",
    "sellerPhones": [
        {
            "type": "Office",
            "number": "+49 (0)364 - xxxxxx",
            "callTo": "+49364xxxxxxxx"
        }
    ],
    "createdAt": "2026-09-30T09:03:21.274Z",
    "daysOnMarket": 2,
    "favoritesCount": 0,
    "interestLevel": "none",
    "imageCount": 2,
    "scrapedAt": "2026-10-02T13:20:41.317Z"
}
```

#### Notes on fields

- `priceRating` is AutoScout24's label: `top_price`, `good_price`, `fair_price`, `higher_price`, `high_price`. It is `null` when AutoScout24 doesn't rate the price (too far from the market, or not enough comparable cars).
- `priceVsMarketPercent` is `(price − marketPrice) / marketPrice`. It is `null` for placeholder prices of 100 EUR or less (many sellers list at 1 EUR).
- `interestLevel` is AutoScout24's enquiry level for the listing: `none`, `some`, `many`, `very_many`.
- `isRepost`, `repostOfId` and `changeType` are only set in monitoring mode. `repostedAsId` is set on `removed` rows.
- Missing values are `null`. Each listing is saved once per run, even if several searches find it.

### FAQ

#### Which AutoScout24 sites work?

All of them. The EU sites (autoscout24.de, .at, .be, .es, .fr, .it, .lu, .nl, .com and the other language versions) share one inventory of about 2.2 million vehicles. autoscout24.ch and motoscout24.ch (Switzerland, about 160,000 cars and 27,000 motorbikes) are a separate platform with their own data and prices in CHF; the actor reads them too.

#### How does it get past the 4,000-result limit?

AutoScout24 never shows more than 4,000 results per search. When you ask for more, the actor counts the results of price ranges (and mileage ranges for prices with thousands of cars, like 1 EUR) and splits the search into parts of at most 4,000. The parts add up to the full total; the run summary lists them. Switzerland has no such limit.

#### Where does the price history come from?

From AutoScout24 itself: it keeps every price a listing has had, and the actor reads it on the first scrape. autoscout24.ch keeps only the previous price.

#### Can I scrape a dealer's whole stock?

Yes. Paste the dealer's page (`/haendler/...`, `/dealerinfo/...`, or `/s/seller-...` on autoscout24.ch). You can also search any dealer by the `sellerId` from your results: `https://www.autoscout24.com/lst?cid=<sellerId>`.

#### How fast is it?

On the EU sites it reads 400 listings per request: 9,000 cars with all fields took about 20 seconds in our tests. Switzerland needs one request per listing for the details, about 30 listings per second.

#### Why did a run stop before my limit?

AutoScout24 had fewer listings (see `SUMMARY` in the key-value store: `totalResults` and `stoppedBecause`), the monitor caught up with the last run (`caught_up`), or the run reached its maximum cost.

#### Do I need a proxy or an account?

No account, no API key, no cookies. Leave **Proxy configuration** at its default.

#### Is it legal to scrape AutoScout24?

The actor collects listing data that AutoScout24 shows publicly. Seller names and phone numbers can be personal data; you are responsible for using them lawfully (e.g. GDPR) and for respecting AutoScout24's terms.

### Cost

This actor uses pay-per-event pricing, with no subscription. Platform usage is included. You pay per listing saved; in monitoring mode, only for new, changed, removed and reappeared listings. The price per listing depends on your Apify plan:

| Apify plan                | Per listing | Per 1,000 listings |
| ------------------------- | ----------- | ------------------ |
| Free                      | $0.00045    | $0.45              |
| Starter (Bronze)          | $0.0004     | $0.40              |
| Scale (Silver)            | $0.00038    | $0.38              |
| Business (Gold) and above | $0.00035    | $0.35              |

Each run also has a start fee of $0.00005 per GB of memory ($0.0002 at the default 4 GB).

Example runs on the free plan (paid plans pay up to 22% less):

| Run                                                    | Cost           |
| ------------------------------------------------------ | -------------- |
| 50 listings                                            | $0.02          |
| 10,000 listings                                        | $4.50          |
| Every Volkswagen Golf in Germany (~29,000)             | ~$13           |
| Monitor every 10 minutes, ~30 changes per run, 30 days | ~$58 / month   |
| Monitor a dealer daily, ~5 changes per day, 30 days    | ~$0.07 / month |

Set a maximum cost per run; the actor stops cleanly when it's reached. The **Pricing** tab always shows the current prices.

### Related Actors

- [eBay Motors Scraper](https://apify.com/epicscrapers/ebay-motors-scraper): cars, motorcycles and parts on eBay Motors.
- [Subito Automotive Scraper](https://apify.com/epicscrapers/subito-automotive-scraper): car and motorbike ads on Subito in Italy.
- [Kleinanzeigen Scraper](https://apify.com/epicscrapers/kleinanzeigen-scraper): classified ads in Germany, including cars.

Compare the same model across AutoScout24, Subito and Kleinanzeigen to see where it sells for less.

### Support

Report problems or request features in the **Issues** tab. Include the run ID, the input and what you expected. We read every issue.

This actor is not affiliated with or endorsed by AutoScout24 GmbH or Auto Scout 24 Schweiz AG. "AutoScout24" is a trademark of its owner.

# Actor input Schema

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

Paste URLs from any AutoScout24 site: search pages (autoscout24.de, .it, .fr, .es, .nl, .be, .at, .lu, .com, and autoscout24.ch for Switzerland) with any filters and sort you set on the site, e.g. https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018\&priceto=30000. Dealer pages (…/haendler/…, …/dealerinfo/…, autoscout24.ch …/s/seller-…) return the dealer's whole stock. Listing pages (…/angebote/…, …/offers/…, autoscout24.ch …/d/…) are scraped as single listings. Leave empty to use the filters below instead.

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

Maximum listings saved per search URL (or for the filter search). AutoScout24 shows only 4,000 results per search; above that the Actor splits the search by price automatically, so 0 (no limit) really gets every listing.

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

Order of the results. "Keep" uses the sort in each URL (or AutoScout24's standard order). For monitoring, use Newest first.

## `vehicleType` (type: `string`):

Kind of vehicle to search.

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

Seller countries. Empty = the 8 EU countries (all except Switzerland). Switzerland is a separate AutoScout24 marketplace with prices in CHF; select it to search it too.

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

Brand as written on AutoScout24, e.g. BMW, Volkswagen, Mercedes-Benz, Tesla.

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

A model (Golf, 320, Model 3) or a model range (3 Series, A-Class). A range includes all its models. Needs a make.

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

Lowest price, in EUR (CHF for Switzerland).

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

Highest price, in EUR (CHF for Switzerland).

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

Earliest first-registration year.

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

Latest first-registration year.

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

Highest mileage in km.

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

Only these fuel types. Empty = any.

## `gearbox` (type: `array`):

Only these gearboxes. Empty = any.

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

Used or new vehicles only.

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

Dealers or private sellers only.

## `postalCode` (type: `string`):

Search around this postal code (in the selected country). Use with Radius. Not available for Switzerland.

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

Distance around the postal code, in km.

## `onlyNewOrChanged` (type: `boolean`):

Save only listings that are new or changed price since the last run of the same search. The first run saves everything it finds, to learn what exists. Pair with Sort: Newest first, so each run reads only the newest page(s).

## `monitorKey` (type: `string`):

Name for this monitor's memory (e.g. "bmw-3er-berlin"). Runs with the same name and search continue from each other; use different names for independent monitors of the same search. Setting a name also adds changeType/previousPrice/isRepost to every row.

## `detectRemovals` (type: `boolean`):

When monitoring, re-check listings from earlier runs that this run didn't see. Saves the ones that were removed (changeType "removed"), came back ("reappeared") or changed price, and flags new listings that are reposts of a removed one (isRepost, repostOfId). Re-checks are free; only resulting rows are charged.

## `skipReposts` (type: `boolean`):

When monitoring, don't save new listings that are reposts of a removed listing (same seller, car, registration and mileage). Useful when you only want genuinely new cars.

## `includeDescription` (type: `boolean`):

The free-text description written by the seller (as plain text).

## `includeEquipment` (type: `boolean`):

Equipment and options, e.g. Navigation system, Heated seats, Parking sensors.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters, e.g. to keep rows small for spreadsheets or AI tools. 0 = full description.

## `compact` (type: `boolean`):

Save about 25 core fields per listing (title, price, price rating, mileage, year, fuel, location, seller, link) instead of 80+. Monitoring fields are kept.

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

Proxy used for AutoScout24 requests. The default Apify proxy works; change it only if you have a reason to.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000&sort=age&desc=1"
    }
  ],
  "maxItems": 50,
  "sort": "keep",
  "vehicleType": "car",
  "condition": "any",
  "sellerType": "any",
  "onlyNewOrChanged": false,
  "detectRemovals": true,
  "skipReposts": false,
  "includeDescription": true,
  "includeEquipment": true,
  "descriptionMaxLength": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "startUrls": [
        {
            "url": "https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000&sort=age&desc=1"
        }
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epicscrapers/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 = {
    "startUrls": [{ "url": "https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000&sort=age&desc=1" }],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("epicscrapers/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 '{
  "startUrls": [
    {
      "url": "https://www.autoscout24.de/lst/bmw/3er?fregfrom=2018&priceto=30000&sort=age&desc=1"
    }
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call epicscrapers/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

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