# AutoScout24 Scraper - Vehicle Listings, Prices & 30+ Fields (`abotapi/autoscout24-scraper`) Actor

From $0.8/1K. A lean, production-grade scraper for autoscout24.com. Point it at a search, get back clean JSON with 30+ fields per vehicle. Designed for dealers, market analysts, valuation pipelines, lead generation, and anyone who needs autoscout24 data on tap.

- **URL**: https://apify.com/abotapi/autoscout24-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Features:** Limited permissions
- **Stats:** 42 total users, 2 monthly users, 55.4% runs succeeded, 3 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 results

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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: Vehicle Listings, Prices and Dealer Contacts

AutoScout24 Scraper turns AutoScout24 into a clean vehicle data feed. Search cars by make, model, country, price, year, mileage, fuel type, transmission or body type, or paste your own AutoScout24 search links, and get back structured listings with price, mileage, specs, location and seller details. Turn on optional detail and dealer lookups for around 100 extra fields per car and a dealer's email, VAT ID, registered address and opening hours, then export to JSON, CSV or Excel, or pull results straight into your app through the API. Coverage spans all 8 countries AutoScout24 lists cars for: Germany, Austria, Belgium, Spain, France, Italy, Luxembourg and the Netherlands.

### Why This Scraper?

- **Two ways to find cars.** Filter by make, model, country, price, year, mileage, fuel type, transmission and body type, or paste a search link straight from your browser. Each URL paginates on its own.
- **30+ core fields per listing.** Make, model, year, price, mileage, transmission, fuel, location, seller type and contact, ratings and images, out of the box.
- **Full detail enrichment on demand.** Switch on Fetch full details for around 100 extra fields: equipment list, fuel consumption, body color, paint type, electric range, drivetrain, previous owners, service history and the dealer's own description.
- **Dealer contact lookup.** Switch on Fetch dealer email, VAT, address to add a dealer's email, VAT ID, registered address, homepage and opening hours, looked up once per dealer and reused across all their listings.
- **Pan-European coverage.** Filter by up to 8 countries, Germany, Austria, Belgium, Spain, France, Italy, Luxembourg and the Netherlands, in a single run.
- **Multi-page pagination with dedup.** Drop in several search URLs or filter combinations, each walks forward page by page with no duplicate listings.
- **Built for schedules.** Incremental mode returns only new, updated and reappeared listings on recurring runs, and Resume continues one interrupted crawl without paying twice for listings it already collected.

### Use Cases

- **Price intelligence:** track asking prices for a specific make, model, year or trim across countries to spot trends.
- **Dealer analysis:** pull every listing from one dealer, with contact and VAT details, to monitor inventory and turnover.
- **Lead generation:** collect dealer name, phone, WhatsApp number and email from fresh listings.
- **Market research:** compare fuel mix, body style share or mileage distribution across the 8 covered countries.
- **Valuation and pricing models:** feed a pricing engine with current inventory and dealer metadata.
- **Inventory mirroring:** sync a dealer's own stock into a CRM or another marketplace.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `listingId` | `"a1b2c3d4-0000-0000-0000-000000000000"` |
| `url` | `"https://www.autoscout24.com/offers/bmw-x5-example"` |
| `title` | `"BMW X5"` |
| `make` / `model` | `"BMW"` / `"X5"` |
| `year` / `firstRegistration` | `2020` / `"03/2020"` |
| `bodyType` | `"SUV/Off-Road/Pick-Up"` (needs Fetch full details) |
| `transmission` | `"Automatic"` |
| `fuel` | `"Diesel"` |
| `powerKw` / `powerHp` | `170` / `231` |
| `mileageKm` | `120000` |
| `price` / `priceDisplay` | `35000` / `"€ 35,000"` |
| `currency` | `"EUR"` |
| `country` / `city` | `"DE"` / `"Munich"` |
| `latitude` / `longitude` | `48.1351` / `11.5820` |
| `sellerType` | `"Dealer"` |
| `companyName` | `"Example Motors GmbH"` |
| `phones` | `[{ "phoneType": "Office", "formattedNumber": "+00 000 0000000" }]` |
| `ratingsStars` / `ratingsCount` | `4.5` / `120` |
| `isOfferNew` | `true` |
| `images` / `imageCount` | `["https://images.example.com/example.jpg"]` / `15` |
| `equipment` | `["Air conditioning", "Navigation system"]` (needs Fetch full details) |
| `dealerEmail` / `dealerVatId` | `"contact@example-dealer.invalid"` / `"DE000000000"` (needs Fetch dealer email, VAT, address) |
| `scrapedAt` | `"2026-04-25T10:00:00.000Z"` |

Fetch full details also adds `variant`, `modelVersion`, `engineDisplacement`, `whatsappNumber`, `createdAt`, `leadsRange`, `offerReference`, `youtubeLink`, `twinnerUrl`, `hasThreeSixtyContent`, `priceNegotiable`, `taxDeductible`, `netPrice`, `vatRate`, `paintType`, `upholstery`, `upholsteryColor`, `seats`, `doors`, `cylinders`, `drivetrain`, `fuelConsumptionCombined`, `co2EmissionGramPerKm`, `electricRangeKm`, `previousOwners`, `hadAccident`, `hasFullServiceHistory`, `newInspection`, `warranty` and `description`. Fetch dealer email, VAT, address (which automatically also fetches full details) also adds `dealerAddress`, `dealerHomepage` and `dealerOpeningHours`. Incremental mode adds `changeType`, `changedFields`, `firstSeenAt` and `lastSeenAt` to every record.

### How to Use

1. Pick a **mode**: `search` (build a search from filters) or `url` (paste your own AutoScout24 search links).
2. In search mode, set **Make**, **Model**, **Countries** and any other filters you need. In URL mode, paste one or more search URLs; filter fields are ignored.
3. Set **Maximum listings** and **Maximum pages per search** to control run size and cost, and turn on **Fetch full details** or **Fetch dealer email, VAT, address** if you need the extra fields.
4. Click **Start**, then download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by filters:**

```json
{
  "mode": "search",
  "make": "bmw",
  "model": "x5",
  "countries": ["D"],
  "yearMin": 2020,
  "maxListings": 50
}
```

**Direct URLs (each auto-paginates):**

```json
{
  "mode": "url",
  "urls": ["https://www.autoscout24.com/lst/audi/a4?fuel=D&gear=A"],
  "maxListings": 100
}
```

**Full detail and dealer contact enrichment:**

```json
{
  "mode": "search",
  "make": "porsche",
  "model": "911",
  "fetchDetails": true,
  "fetchDealerInfo": true,
  "maxListings": 30
}
```

**Daily monitoring, only changes on later runs:**

```json
{
  "mode": "search",
  "make": "volkswagen",
  "model": "golf",
  "countries": ["D", "NL"],
  "incrementalMode": true
}
```

#### URL mode: supported URL shapes

**Default in URL mode:** if **URLs** is left empty, the actor scrapes the all-cars listing `https://www.autoscout24.com/lst` (every make, every country, up to **Maximum listings**), not a specific search. Paste your own links to scope the run. A pasted `?page=N` start page is honoured (the walk begins there, so incremental EXPIRED detection is skipped for that run).

| URL shape | Example | Supported |
|---|---|---|
| All-cars listing | `https://www.autoscout24.com/lst` | Yes |
| Make only | `https://www.autoscout24.com/lst/bmw` | Yes |
| Make + model + filter | `https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020` | Yes |
| Paginated and sorted | `https://www.autoscout24.com/lst/bmw/x5?page=2&sort=price&desc=0` | Yes, starts at page 2 |
| Multi-filter query | `https://www.autoscout24.com/lst/bmw/x5?cy=D&fuel=D&atype=C` | Yes |
| Multi-value country | `https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020&priceto=50000&cy=D%2CA` | Yes |
| Path facet (fuel) | `https://www.autoscout24.com/lst/bmw/x5/ft_diesel` | Yes |
| Path facet (city) | `https://www.autoscout24.com/lst/bmw/x5/ci_berlin` | Yes |
| Other country host | `https://www.autoscout24.de/lst/bmw/x5` | Yes |
| Single listing (`/offers/...`, `/angebote/...`) | `https://www.autoscout24.com/offers/<slug>-<uuid>` or `/offers/<uuid>` | Yes, one full detail record per URL (the same fields as a search row with Fetch full details on) |
| Dealer page | `https://www.autoscout24.com/dealerinfo/acio-bv` | Yes, the dealer's current stock |
| Motorcycle listing | `https://www.autoscout24.com/lst-moto` | Yes |

Migrating from another AutoScout24 scraper: `searchUrls` is accepted as an alias of `urls` and `maxPage` as an alias of `maxPages`. When you fill only `searchUrls` (with **URLs** empty or left at its default), the run switches to URL mode automatically, unless you also set search filters. Each record also carries the raw listing blocks `id`, `availableNow`, `coverImageAttractiveness`, `headerImage`, `ratings`, `location`, `seller`, `vehicle` and `vehicleDetails` (with Fetch details on, `vehicle` also holds the detail-page specifications).

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/autoscout24-scraper").call(run_input={"mode": "search", "make": "bmw", "model": "x5", "countries": ["D"]})
for car in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(car["title"], car["price"], car["mileageKm"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/autoscout24-scraper').call({ mode: 'search', make: 'bmw', model: 'x5', countries: ['D'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted or previous large crawl: paste a run ID or dataset ID and this run loads every `listingId` already saved there, skips it, and appends only new listings, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for running the same search on a schedule (daily, weekly). The first run returns everything as `NEW`. Later runs return only `NEW`, `UPDATED` (with `changedFields`) and `REAPPEARED` listings by default; unchanged listings are suppressed and not billed unless `emitUnchanged` is on. `EXPIRED` listings are only produced after a run that scanned the whole tracked search, and only with `emitExpired` on. Each listing is compared field by field with its saved copy; only `scrapedAt` and the raw listing blocks (`id`, `availableNow`, `coverImageAttractiveness`, `headerImage`, `ratings`, `location`, `seller`, `vehicle`, `vehicleDetails`) are excluded by default (measured: nothing else changed between repeat scrapes of the same search without the car changing). Most of those blocks mirror flat fields that are compared, but with **Fetch full details** on, the detail-only specifications inside `vehicle` (weights, dimensions, load figures, WLTP values, HSN/TSN, service dates) have no flat twin and are NOT compared, so a change in only those values is not reported as `UPDATED`. And `ignoreFieldsForChanges` excludes more, for example `images` or `leadsRange` if you see churn there. `changedFields` never lists an ignored field. Widening the ignore list never causes a wave of `UPDATED` rows, because the saved copy is re-compared with the current ignore set. A pasted URL that starts past page 1 never produces `EXPIRED` rows. State is tracked separately per search or URL setup automatically; set `stateKey` to name or deliberately share a monitoring campaign.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (build a URL from filters) or `url` (paste your own URLs). |
| `urls` | array | `https://www.autoscout24.com/lst` | AutoScout24 search URLs (or single-listing URLs) to scrape. URL mode only; ignored in search mode. |
| `searchUrls` | array | (none) | Alias of `urls`, for migrating from another AutoScout24 scraper. Used when `urls` is empty or still the default; switches to URL mode unless search filters are set. |
| `make` | string | (none) | Manufacturer name or slug, e.g. `BMW`, `Mercedes-Benz`, `mercedes benz`. Checked against the site's own make list; an unknown make fails the run with the closest matches. Search mode only. |
| `model` | string | (none) | Model name or slug, e.g. `X5`, `C-Class`. Checked against the site's model list for the make; an unknown model fails the run with the closest matches. Requires Make. Search mode only. |
| `countries` | array | `[]` | Listing country, multi-select. Empty means all 8 supported countries. Search mode only. |
| `ustate` | string | `both` | Vehicle state: New, Used, or Both. Search mode only. |
| `bodyType` | string | `""` (Any) | Body shape filter. Search mode only. |
| `fuelTypes` | array | `[]` | Fuel type(s), multi-select. Empty means any fuel. Search mode only. |
| `transmission` | string | `""` (Any) | Gearbox type filter. Search mode only. |
| `sellerType` | string | `""` (Any) | `D` dealer or `P` private seller. Search mode only. |
| `colors` | array | `[]` (Any) | Body colour codes (1 Beige, 2 Blue, 3 Brown, 4 Bronze, 5 Yellow, 6 Grey, 7 Green, 10 Red, 11 Black, 12 Silver, 13 Violet, 14 White, 15 Orange, 16 Gold). Search mode only. |
| `priceMin` | integer | (none) | Lower bound for price, in EUR. Search mode only. |
| `priceMax` | integer | (none) | Upper bound for price, in EUR. Search mode only. |
| `yearMin` | integer | (none) | Oldest first registration year. Search mode only. |
| `yearMax` | integer | (none) | Newest first registration year. Search mode only. |
| `kmMin` | integer | (none) | Lower bound for mileage, in km. Search mode only. |
| `kmMax` | integer | (none) | Upper bound for mileage, in km. Search mode only. |
| `powerMinKw` | integer | (none) | Lower bound for engine power, in kW. Search mode only. |
| `powerMaxKw` | integer | (none) | Upper bound for engine power, in kW. Search mode only. |
| `sortBy` | string | `standard` | Sort order: relevance, price, age, mileage or first registration, ascending or descending. Search mode only. |
| `fetchDetails` | boolean | `false` | Fetch each listing's detail page for around 100 extra fields. Adds one request per listing. Each delivered listing whose detail page is read is charged as one detail-page event on top of the per-result charge. |
| `fetchDealerInfo` | boolean | `false` | Fetch each unique dealer's public imprint page for email, VAT ID, registered address, homepage and opening hours. Automatically also fetches full details, since the imprint link comes from the detail page. Cached per dealer. |
| `maxListings` | integer | `20` | Stop after scraping this many listings across the whole run (maximum 1,000,000). |
| `maxPages` | integer | `0` | Safety bound on result pages walked per search or URL, about 20 listings per page. `0` means unlimited: the walk stops naturally once a page is empty or starts repeating, or once Maximum listings is reached. |
| `maxPage` | integer | (none) | Alias of `maxPages`. |
| `resumeFromRunId` | string | (none) | Continue one interrupted or previous large crawl by pasting its run ID or dataset ID. |
| `incrementalMode` | boolean | `false` | Turn on for recurring monitoring of the same search: later runs return only new and changed listings. |
| `stateKey` | string | (none) | Name this monitoring campaign, or share state across differently configured runs. Incremental mode only. |
| `emitUnchanged` | boolean | `false` | Also return, and bill, listings that have not changed since the last run. Incremental mode only. |
| `emitExpired` | boolean | `false` | Also return, and bill, listings that were tracked before but are no longer found. Incremental mode only. |
| `ignoreFieldsForChanges` | array | `[]` | Field names (dotted paths for nested ones) that must not count as a change in incremental mode; they stay in the output. `scrapedAt` and the raw listing blocks (`id`, `availableNow`, `coverImageAttractiveness`, `headerImage`, `ratings`, `location`, `seller`, `vehicle`, `vehicleDetails`) are always ignored; note that with Fetch full details on, the detail-only specifications inside `vehicle` (weights, dimensions, WLTP, HSN/TSN, service dates) are therefore not compared. Incremental mode only. |
| `proxyConfiguration` | object | Apify Proxy | Connection settings. The default works without changes for typical runs. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which item pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "listingId": "a1b2c3d4-0000-0000-0000-000000000000",
  "url": "https://www.autoscout24.com/offers/bmw-x5-example",
  "title": "BMW X5",
  "make": "BMW",
  "model": "X5",
  "year": 2020,
  "firstRegistration": "03/2020",
  "bodyType": "SUV/Off-Road/Pick-Up",
  "transmission": "Automatic",
  "fuel": "Diesel",
  "powerKw": 170,
  "powerHp": 231,
  "mileageKm": 120000,
  "price": 35000,
  "priceDisplay": "€ 35,000",
  "currency": "EUR",
  "country": "DE",
  "city": "Munich",
  "zip": "80331",
  "latitude": 48.1351,
  "longitude": 11.5820,
  "sellerType": "Dealer",
  "companyName": "Example Motors GmbH",
  "phones": [{ "phoneType": "Office", "formattedNumber": "+00 000 0000000" }],
  "ratingsStars": 4.5,
  "ratingsCount": 120,
  "dealerEmail": "contact@example-dealer.invalid",
  "dealerVatId": "DE000000000",
  "color": "Grey",
  "seats": 5,
  "doors": 5,
  "drivetrain": "4WD",
  "previousOwners": 1,
  "hasFullServiceHistory": true,
  "images": ["https://images.example.com/example.jpg"],
  "imageCount": 15,
  "scrapedAt": "2026-04-25T10:00:00.000Z"
}
```

#### Output views

The dataset has these table views in the Console: **Overview** (core listing fields), **Seller info**, **Media** (images), **Changes (incremental mode)** (`changeType`, `changedFields`, `firstSeenAt`, `lastSeenAt` with price and URL) and **Vehicle details (fetchDetails)** (colour, paint, seats, drivetrain, consumption, owners, service history, equipment, description). A run summary (`totalListings`, searches requested and run) is saved under the `OUTPUT` key of the run's key-value store.

### Plan Requirement

The default Apify Proxy setting works for typical runs, including datacenter connections; no residential proxy is required. If a connection is rejected the actor rotates to another automatically. For very large or frequent runs a residential proxy group gives more headroom; pick it under Proxy configuration.

If your Apify plan has no proxy access (free plans), the run stops with: "The proxy connection was refused for this account, so no page could be read. Your Apify plan does not include proxy access; a paid plan is required". If a residential group was selected on a free plan the actor continues on a backup connection and logs that residential proxies are unavailable; if that also cannot load pages the run fails with "No results: residential proxies are unavailable on this run". If pages simply fail to load you get "Could not load any results page ... This is a connection problem, not an empty search." You can also supply your own proxy URLs.

### FAQ

#### How much does it cost?

Pricing is pay per event: a small one-time Actor Start charge per run (one event per GB of memory) plus a result charge per delivered listing, as registered on the actor's Pricing tab. With **Fetch full details** on, each delivered listing whose detail page is read is also charged as one detail-page event; the dealer imprint read folds into the same unit. A pasted single-listing URL is itself read from its detail page, so its row carries the detail charge too. Listings whose detail page is refused, and listings incremental mode suppresses as unchanged, are never charged. The **Pricing** tab on the actor page shows current rates. Use **Maximum listings** to cap the size, and cost, of any run.

#### Is it legal to scrape AutoScout24?

This actor collects only publicly available listing and imprint data. You are responsible for how you use it: follow AutoScout24's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listed prices and specifications are generally facts, but photos and dealer branding may be subject to third-party rights.

#### What is the difference between Resume and Incremental mode?

They solve different problems. **Resume** (`resumeFromRunId`) continues one specific run that was interrupted or capped: it skips listings a named previous run or dataset already collected. **Incremental mode** is for scheduling the same search again and again, for example daily, and getting back only what changed since last time, without you ever pasting a run ID. Turning both on together fails the run with a clear message if that search already has saved incremental state.

#### Do I need to turn on Fetch full details separately to get dealer email, VAT and address?

No. Turning on **Fetch dealer email, VAT, address** automatically fetches each listing's detail page too, since that is where the link to the dealer's imprint page comes from. You do not need to also check **Fetch full details**, though doing so adds the roughly 100 extra vehicle fields on top.

#### Why did my run return fewer listings, or an empty dataset, instead of failing?

A run stops with an explicit error only when the connection settings cannot be set up, when **Resume from a previous run** points at a run or dataset this account cannot read, or when **Incremental mode** is combined with **Resume** on a search that already has tracked incremental state. In every other case, for example filters that match nothing, or a stretch where AutoScout24 pages could not be read, the run finishes normally and simply returns fewer records, or none. Check the run log for page-level warnings to tell "no matching cars" apart from "some pages could not be read".

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more car data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🚗 <a href="https://apify.com/abotapi/mobile-de-scraper"><b>mobile.de Scraper</b></a><br>Scrape mobile.de vehicle listings with 30+ fields including price, mileage, registration...</td><td>🚗 <a href="https://apify.com/abotapi/autotrader"><b>AutoTrader UK Scraper</b></a><br>Pull structured vehicle listings from autotrader.co.uk at scale. Search by filters or use...</td></tr>
<tr><td>🚗 <a href="https://apify.com/abotapi/easyauto123-cars-scraper"><b>EasyAuto123 Scraper</b></a><br>Scrape EasyAuto123 vehicle listings into clean structured data. Extract prices, VINs...</td><td>🚗 <a href="https://apify.com/abotapi/autotrader-com-scraper"><b>Autotrader US</b></a><br>Scrape US car listings from Autotrader by make, model, ZIP, price, year, body style...</td></tr>
<tr><td>🚗 <a href="https://apify.com/abotapi/cars-com-scraper"><b>Cars.com Scraper</b></a><br>Scrape cars.com listings by make, ZIP and radius. 90+ fields per car: price, MSRP...</td><td>🚗 <a href="https://apify.com/abotapi/craigslist-classifieds-scraper"><b>Craigslist Scraper</b></a><br>Scrape Craigslist postings in any of 700+ cities worldwide: price, title, posting text...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/autoscout24-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Choose how to find listings. Only fields belonging to the chosen mode are used.

## `urls` (type: `array`):

AutoScout24 URLs to scrape. Search-results URLs (/lst...) auto-paginate forward until Maximum Pages or Maximum Listings; a single-listing URL (/offers/<id> or /angebote/<id>) returns one full detail record. Ignored in Search mode. Dealer pages (/dealerinfo/<dealer>) and motorcycle listings (/lst-moto) are walked like search results. A pasted ?page=N start page is honoured. If left empty, the default is https://www.autoscout24.com/lst. Example: https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020

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

Manufacturer name or slug, e.g. BMW, Mercedes-Benz, Land Rover, volkswagen. Checked against the site's own make list; an unknown make fails the run with the closest matches. Leave empty for all makes. (Search mode only — ignored in URL mode.)

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

Model name or slug, e.g. X5, A4, C-Class, Golf, 911. Checked against the site's model list for the make; an unknown model fails the run with the closest matches. Requires a Make. (Search mode only — ignored in URL mode.)

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

Listing country (multi-select). Default = all 8 supported countries. (Search mode only — ignored in URL mode.)

## `ustate` (type: `string`):

New / Used / Both. (Search mode only — ignored in URL mode.)

## `bodyType` (type: `string`):

Body shape. Codes verified against autoscout24's own taxonomy. (Search mode only — ignored in URL mode.)

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

AutoScout24 fuel codes (multi-select). Verified by single-fuel probe: B = Gasoline, D = Diesel, E = Electric, 2 = Hybrid Electric/Gasoline, 3 = Hybrid Electric/Diesel, L = LPG, C = CNG, M = Ethanol (E85), H = Hydrogen, O = Other. Leave empty for any fuel. (Search mode only — ignored in URL mode.)

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

Gearbox type. (Search mode only — ignored in URL mode.)

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

Dealer or private seller. (Search mode only — ignored in URL mode.)

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

Only listings in any of these body colours. Empty = any colour. (Search mode only — ignored in URL mode.)

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

Lower bound for price. (Search mode only — ignored in URL mode.)

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

Upper bound for price. (Search mode only — ignored in URL mode.)

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

Oldest first-registration year. (Search mode only — ignored in URL mode.)

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

Newest first-registration year. (Search mode only — ignored in URL mode.)

## `kmMin` (type: `integer`):

Lower bound for mileage. (Search mode only — ignored in URL mode.)

## `kmMax` (type: `integer`):

Upper bound for mileage. (Search mode only — ignored in URL mode.)

## `powerMinKw` (type: `integer`):

Lower bound for engine power in kW. (1 hp ≈ 0.735 kW) (Search mode only — ignored in URL mode.)

## `powerMaxKw` (type: `integer`):

Upper bound for engine power in kW. (Search mode only — ignored in URL mode.)

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

Sort order. AutoScout24 also offers default 'standard' (relevance). (Search mode only — in URL mode the sort comes from the URL itself.)

## `fetchDetails` (type: `boolean`):

Fetch each listing's detail page for ~100 extra fields (full equipment list, fuel consumption, body color, paint type, electric range, drivetrain, dealer description, coordinates, WhatsApp, listing creation timestamp). Adds ~1 HTTP request per listing. Each delivered listing whose detail page is read is charged as one detail-page event on top of the per-result charge; listings whose detail page is refused, and listings incremental mode suppresses as unchanged, are not charged.

## `fetchDealerInfo` (type: `boolean`):

Fetch each unique dealer's legal Imprint page to extract email, VAT ID, registered address, homepage URL, and opening hours. The fetch is cached per dealer so a 1000-listing run from 50 dealers only costs ~50 extra requests. Requires `Fetch full details` to be on (the imprint URL comes from the detail page).

## `maxListings` (type: `integer`):

Stop after scraping this many listings across the whole run. Capped at 1,000,000.

## `maxPages` (type: `integer`):

Safety bound on how many result pages to walk per search or URL (~20 listings per page). 0 (default) means unlimited: the walk stops naturally once a page comes back empty, once it starts repeating listings already seen this walk (the site's own clamp signature), or sooner once Maximum listings is reached. Set a number only for an explicit page cap below that natural stop.

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

Proxy configuration. The default works on every Apify plan, including the free tier. Change it only if you need a specific country or are running very large jobs.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a walk-all pull in another run. For recurring monitoring of the same search, use Incremental mode below instead.

## `incrementalMode` (type: `boolean`):

Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Each listing is compared field by field with its saved copy (price, mileage, seller, location, specs, detail fields); scrapedAt and the raw listing blocks (which mirror the flat fields, except that with Fetch full details on the detail-only specifications inside vehicle such as weights, dimensions, WLTP, HSN/TSN and service dates are not compared) are excluded because they change without the car changing (use Ignore fields to exclude more). Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each search/filter/URL and detail-mode setup; use State key when you want to name or deliberately share a monitoring campaign. To continue one specific interrupted run instead, use Resume from a previous run above.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search/filter/URL and detail settings — different searches then never mix state with each other.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns — and bills — extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search — not when Maximum listings/pages capped it or when Resume was used. This returns — and bills — extra synthetic rows, so leave it off unless you need expiry tracking.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names that must NOT count as a change (they stay in the output). Use dotted paths for nested fields, for example "a.b". Already ignored automatically: scrapedAt and the raw listing blocks id, availableNow, coverImageAttractiveness, headerImage, ratings, location, seller, vehicle and vehicleDetails. With Fetch full details on, the detail-only specifications inside vehicle (weights, dimensions, WLTP, HSN/TSN, service dates) are therefore not compared for changes. Add e.g. price, mileageKm, images or phones to also ignore those.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

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

Alias of 'URLs' for migration from other AutoScout24 scrapers. Used when 'URLs' is empty or still the default; switches the run to URL mode unless search filters are set.

## `maxPage` (type: `integer`):

Alias of 'Maximum pages per search'. Used only when that field is 0/empty.

## Actor input object example

```json
{
  "mode": "search",
  "urls": [
    "https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020",
    "https://www.autoscout24.com/lst",
    "https://www.autoscout24.com/lst/bmw",
    "https://www.autoscout24.com/lst?sort=price&desc=0&cy=D",
    "https://www.autoscout24.com/lst/bmw/x5?pricefrom=10000&priceto=30000&kmto=100000&fregfrom=2018&sort=price&desc=0&page=3",
    "https://www.autoscout24.com/lst/bmw/x5?atype=C&cy=D&ustate=N%2CU&sort=standard&desc=0",
    "https://www.autoscout24.com/lst/bmw/x5/ft_diesel?sort=age&desc=1",
    "https://www.autoscout24.de/lst/bmw/x5",
    "https://www.autoscout24.it/lst/bmw",
    "https://www.autoscout24.com/lst-moto",
    "https://www.autoscout24.com/offers/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.com/offers/f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.de/angebote/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.com/dealerinfo/acio-bv",
    "https://www.autoscout24.com/dealerinfo/acio-bv?atype=C"
  ],
  "countries": [],
  "ustate": "both",
  "bodyType": "",
  "fuelTypes": [],
  "transmission": "",
  "sellerType": "",
  "colors": [],
  "sortBy": "standard",
  "fetchDetails": false,
  "fetchDealerInfo": false,
  "maxListings": 20,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `seller` (type: `string`):

No description

## `media` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `detail` (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 = {
    "mode": "search",
    "urls": [
        "https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020",
        "https://www.autoscout24.com/lst",
        "https://www.autoscout24.com/lst/bmw",
        "https://www.autoscout24.com/lst?sort=price&desc=0&cy=D",
        "https://www.autoscout24.com/lst/bmw/x5?pricefrom=10000&priceto=30000&kmto=100000&fregfrom=2018&sort=price&desc=0&page=3",
        "https://www.autoscout24.com/lst/bmw/x5?atype=C&cy=D&ustate=N%2CU&sort=standard&desc=0",
        "https://www.autoscout24.com/lst/bmw/x5/ft_diesel?sort=age&desc=1",
        "https://www.autoscout24.de/lst/bmw/x5",
        "https://www.autoscout24.it/lst/bmw",
        "https://www.autoscout24.com/lst-moto",
        "https://www.autoscout24.com/offers/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.com/offers/f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.de/angebote/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.com/dealerinfo/acio-bv",
        "https://www.autoscout24.com/dealerinfo/acio-bv?atype=C"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "mode": "search",
    "urls": [
        "https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020",
        "https://www.autoscout24.com/lst",
        "https://www.autoscout24.com/lst/bmw",
        "https://www.autoscout24.com/lst?sort=price&desc=0&cy=D",
        "https://www.autoscout24.com/lst/bmw/x5?pricefrom=10000&priceto=30000&kmto=100000&fregfrom=2018&sort=price&desc=0&page=3",
        "https://www.autoscout24.com/lst/bmw/x5?atype=C&cy=D&ustate=N%2CU&sort=standard&desc=0",
        "https://www.autoscout24.com/lst/bmw/x5/ft_diesel?sort=age&desc=1",
        "https://www.autoscout24.de/lst/bmw/x5",
        "https://www.autoscout24.it/lst/bmw",
        "https://www.autoscout24.com/lst-moto",
        "https://www.autoscout24.com/offers/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.com/offers/f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.de/angebote/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
        "https://www.autoscout24.com/dealerinfo/acio-bv",
        "https://www.autoscout24.com/dealerinfo/acio-bv?atype=C",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "mode": "search",
  "urls": [
    "https://www.autoscout24.com/lst/bmw/x5?fregfrom=2020",
    "https://www.autoscout24.com/lst",
    "https://www.autoscout24.com/lst/bmw",
    "https://www.autoscout24.com/lst?sort=price&desc=0&cy=D",
    "https://www.autoscout24.com/lst/bmw/x5?pricefrom=10000&priceto=30000&kmto=100000&fregfrom=2018&sort=price&desc=0&page=3",
    "https://www.autoscout24.com/lst/bmw/x5?atype=C&cy=D&ustate=N%2CU&sort=standard&desc=0",
    "https://www.autoscout24.com/lst/bmw/x5/ft_diesel?sort=age&desc=1",
    "https://www.autoscout24.de/lst/bmw/x5",
    "https://www.autoscout24.it/lst/bmw",
    "https://www.autoscout24.com/lst-moto",
    "https://www.autoscout24.com/offers/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.com/offers/f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.de/angebote/bmw-x5-40d-m-paket-neuer-motor-pano-h-k-hud-memory-diesel-grey-cat_ma13mo16406-f1d1ba45-25d0-4707-b2d7-bc87784c74ce",
    "https://www.autoscout24.com/dealerinfo/acio-bv",
    "https://www.autoscout24.com/dealerinfo/acio-bv?atype=C"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

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