# AutoScout24 Scraper — Cars, Bikes & Vans in 8 Countries (`nice_dev/autoscout24-listings-scraper`) Actor

Scrape AutoScout24 in 8 countries: cars, bikes, vans and motorhomes, every site filter, price rating, price history, dealer data, price tracking. Export to JSON, CSV or Excel.

- **URL**: https://apify.com/nice_dev/autoscout24-listings-scraper.md
- **Developed by:** [Nice Dev](https://apify.com/nice_dev) (community)
- **Categories:** E-commerce, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.13 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

### 🚗 What is AutoScout24 Scraper?

**AutoScout24 Scraper** extracts **vehicle listings from [AutoScout24](https://www.autoscout24.com)** in 8 countries (Germany, Austria, Italy, France, Spain, the Netherlands, Belgium and Luxembourg): **price, AutoScout24 price rating with its price bands and the market median, mileage, first registration, power, fuel, gearbox, photos, dealer name, address and rating, publication date, views and favourites**, for cars, motorbikes, vans and trucks, motorhomes and caravans, and trailers. It works as an **AutoScout24 API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a **make and model** (`BMW` + `X1`), pick the countries, add a postcode with a radius if you want, or paste any AutoScout24 search, listing or dealer link, click **Start**, and download the listings in JSON, CSV or Excel. No login, nothing to set up. **Fast**: about 3,000 listings a minute on the Apify platform (14,162 listings in 4 min 37 s, 1,000 in 41 s); about 120 a minute when an option reads each listing's page (GPS coordinates, dealer profiles).

### 📋 What data can you extract from AutoScout24?

One item per listing, 179 fields:

| Category | What you get |
| --- | --- |
| 🏷️ **Listing** | title, link, AutoScout24 id, make, model, series, generation, version, engine, trim line, vehicle type, body type, new or used — `CUPRA Leon ST VZ Cup` |
| 💰 **Price** | price, price as shown, net price and VAT rate for business buyers, negotiable, crossed-out old price of a price cut — `€38,975` |
| 📊 **Price rating** | AutoScout24's rating (very good to high price), the price bands of that rating for this vehicle, the market median and how far the price is from it — `High price: 18.1 % over the €33,000 median` |
| 🚘 **Vehicle** | first registration, mileage, power in kW and hp, fuel, gearbox, engine size, drive, doors, seats, colour, paint, previous owners, Euro class, CO₂, consumption, electric range, accident-free — `01/2024, 28,653 km, 310 hp, petrol, automatic, 4WD` |
| 🔧 **Full listing** | seller's description, every equipment item by category, gears, cylinders, weight, WLTP values, running costs, next inspection, last service, damage, warranty, quality seals, Carfax report link, financing and leasing offers, availability, home delivery, video — with the **Extract details** option |
| 📷 **Photos** | every photo in the size you choose, photo count, 360° view flag |
| 🕒 **Dates and activity** | first put online, last change, last push to the top, days online, views, favourites, band of contact requests, paid placement — `online since 22/10/2026, 0 views` |
| 📍 **Location** | country, postcode, city, street (dealers), distance from your location; GPS point with the **GPS coordinates** option |
| 🏢 **Seller** | dealer or private seller, seller id, name, star rating and number of ratings, dealer page, stock page, imprint page, logo — `Ing. W. Riemer GmbH & Co. KG, Mölln, 4.5 stars, 24 ratings` |
| 📞 **Contact** | phone numbers, WhatsApp and contact person with the **Seller phone numbers** option; the dealer's e-mail with the **Dealer e-mail** option |
| 🗂️ **Dealer profile** | legal name, imprint, VAT id, trade register, managing directors, website, opening hours, team, makes sold, services, branches, recommendation rate, latest customer reviews — with the **Dealer profiles** option |
| 📈 **Price history** | every price the listing has had with its date, first price, number of price changes — with the **Price history** option |
| 🔔 **Monitoring** | new listing or price changed, the price delivered before, the change in euros and in % |
| 🔎 **Search** | the search that found the listing, its label and the listing's rank in it |

Every field, with an example, is listed in the **Output** section below.

Every option is a box to tick, unticked by default; the pricing section says what each one costs. Without any option, every listing still has its price, price rating, mileage, first registration, power, fuel, gearbox, photos, dates, views, seller name, address and rating.

### ✅ Why use AutoScout24 Scraper?

- 🎯 **Search by make and model, not only by URL**: `BMW X1`, `Volkswagen Golf` or a whole series (`3 Series`), in the countries you pick, around a postcode, with AutoScout24's search filters as fields (price, registration, mileage, power, fuel, gearbox, body, colour, price rating, Euro class, owners, equipment, quality seals, leasing…). Any other filter of the site goes in **Other AutoScout24 filters**.
- 🧩 **Past the 4,000 limit**: AutoScout24 returns at most 4,000 listings per search. The Actor cuts a bigger search into price bands by itself, for free, and the bands add up to the search's total.
- 📈 **Price history with dates**: every price the listing has had, each with its date, from the very first run.
- 📊 **The price rating in numbers**: not only "good price", but the price bands of AutoScout24's rating for that vehicle, the market median and the gap to it in %.
- 🔔 **Monitoring and price tracking**: **Only new listings** returns only what earlier runs never delivered (free); **Report price changes** also brings back a listing whose price moved, with the old price and the change in euros and in %.
- 🏢 **Dealer data**: e-mail, phone numbers, imprint with VAT id and trade register, opening hours and customer reviews, each as an option you tick.
- 🗂️ **Several searches in one run**: make / model lines × keywords × locations × countries, dealers and listing ids, with a cap per search; a listing found by several searches is saved once.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape AutoScout24

1. Create a free Apify account.
2. Open **AutoScout24 Scraper**, keep **Vehicle type** on cars (or pick motorbikes, vans and trucks, motorhomes, trailers), type a **Make** and a **Model** (e.g. `BMW` and `X1`) and tick the **Countries** you want; add a **Location** and a **Radius** if you want.
3. Or paste your own AutoScout24 links into **Start URLs**: a search results page (every filter set on the site is kept, pagination is automatic), a listing page or a dealer page.
4. Set **Max listings** (100 by default, 0 = no limit) — and **Max listings per search** when you run several searches — then click **Start**.
5. Download the dataset in JSON, CSV, Excel or via API.

### 💰 How much does it cost to scrape AutoScout24?

This Actor uses **pay per event** pricing (the prices are in the **Pricing** tab): you pay for the listings saved, plus the options you tick, and nothing else.

| What you pay for | Event |
| --- | --- |
| Each listing saved, with every field of the results list (price rating, mileage, power, photos, dates, views, seller name, address and rating included) | `apify-default-dataset-item` |
| Each listing delivered with its full listing (description, equipment, technical data, offers), only with **Extract details**, on top of the listing | `listing-details` |
| Each listing whose price changed at least once, delivered with its dated prices, only with **Price history** | `price-history` |
| Each listing delivered with at least one phone number, however many it has, only with **Seller phone numbers** | `phone-found` |
| Each listing delivered with the dealer's e-mail, only with **Dealer e-mail** | `email-found` |
| Each listing delivered with its GPS point, only with **GPS coordinates** | `listing-location` |
| Each dealer read, once per dealer and run, its reviews included, only with **Dealer profiles**; a dealer whose number of vehicles for sale, or whose reviews (up to **Dealer reviews per dealer**), could not be read is delivered but not charged on that row (a later listing of the dealer with everything read is) | `dealer-profile` |
| Each listing already delivered that comes back because its price changed, only with **Report price changes**, on top of the listing | `price-change` |
| Each listing already delivered that the run reads again only to check its price, only with **Report price changes** | `price-check` |
| Each listing that one of the Actor's own filters reads and drops | `filter-check` |
| Each run start | `apify-actor-start` |

A listing without a phone number, an e-mail, a price change or GPS point costs nothing more than the listing, even with the option ticked. The vehicle filters of the form are applied by AutoScout24 itself: the listings they leave out are never read and cost nothing. Only the fields of the **Filters** section (posted after / before, exclude keywords, with phone only, min seller rating) are checked by the Actor, and a listing they drop costs a small `filter-check` fee, lower than a listing: filtering never costs more than taking everything. Going past 4,000 listings per search is free. Platform usage (compute, proxy) is included in the price.

### ⚙️ Input

```json
{
    "make": "BMW",
    "model": "X1",
    "countries": ["D"],
    "maxItems": 200
}
```

Several searches, used cars only, a cap per search, only recent listings, only the ones not delivered before:

```json
{
    "models": ["BMW 3 Series", "Volkswagen Golf"],
    "countries": ["D", "A"],
    "yearFrom": 2020,
    "mileageTo": 80000,
    "condition": ["U"],
    "maxItemsPerQuery": 100,
    "postedAfter": "7 days",
    "onlyNew": true,
    "stateKey": "bmw-vw-de-at"
}
```

Or with your own links (a search, a listing, a dealer):

```json
{
    "startUrls": [
        { "url": "https://www.autoscout24.de/lst?atype=C&cy=D&fregfrom=2020&kmto=50000&sort=age&desc=1" },
        { "url": "https://www.autoscout24.de/angebote/cupra-leon-st-vz-cup-carbon-leder-pano-ahk-acc-beats-dcc-benzin-grau-cat_ma51802gr200363ge784va1016mt6286tr8398-f133ee06-321c-4e08-92e3-5984bcf983ea" },
        { "url": "https://www.autoscout24.de/haendler/klaus-scheller-gmbh" }
    ],
    "maxItems": 500
}
```

| Field | Notes |
| --- | --- |
| `startUrls` | AutoScout24 links from any of its sites (.de .at .it .fr .es .nl .be .lu .com): a search (`https://www.autoscout24.de/lst?atype=C&cy=D&fregfrom=2020`, every filter set on the site is kept), a listing or a dealer page (its cars, or the vehicle type of the link: ?atype=B = motorbikes). When it is filled, the search fields and the **Vehicle filters** are ignored; the **Filters**, the caps and monitoring still apply. Max 1,000 URLs. autoscout24.ch is a different platform and is not supported. |
| `vehicleType` | Section searched: `C` cars (default), `B` motorbikes, `X` vans and trucks, `N` motorhomes and caravans, `L` trailers. |
| `make`, `model`, `modelVersion`, `models` | Make and model as written on AutoScout24 (`BMW` + `X1`, a series such as `3 Series`) or their AutoScout24 ids; the version words (`xDrive`); `models` adds more lines such as `Volkswagen Golf` or `Tesla` (one search each, max 100 lines). An unknown make or model stops the run with the closest names. |
| `query`, `searchQueries` | Words AutoScout24 looks for in the listing (`panorama`, `scheckheft`); `searchQueries` adds more (one search each). |
| `countries` | Countries searched, by code: `D` Germany, `A` Austria, `I` Italy, `F` France, `E` Spain, `NL` Netherlands, `B` Belgium, `L` Luxembourg. Empty = all 8, and every search is then run once per country: pick yours. |
| `location`, `locations`, `radiusKm` | Centre of a radius search: a postcode (`80331`; needs exactly one ticked **Country**) or GPS coordinates `48.137,11.575` (any number of countries); `locations` adds more places (max 500 searches per run). The radius is in km (50 by default). |
| `sellerIds` | Every vehicle of these dealers or sellers: the seller id the Actor returns (`6189`) or a dealer page URL (`https://www.autoscout24.de/haendler/klaus-scheller-gmbh`; the vehicle type of its link is kept: ?atype=B = motorbikes). One search each, max 500. |
| `listingIds` | Listings fetched directly, by AutoScout24 id (`f133ee06-321c-4e08-92e3-5984bcf983ea`) or listing URL, 100 per request, max 1,000. Added to the searches. |
| `maxItems` | Stop after this many listings for the whole run (`0` = unlimited). |
| `maxItemsPerQuery` | Cap for EACH search (make / model × keyword × location × country, seller, or start URL). `0` = no per-search cap. |
| `splitLargeSearches` | On by default and free: a search over 4,000 listings is cut into price bands so that every listing is reached. Off = the first 4,000. |
| `extractDetails` | Option: the full listing (description, equipment, technical data, warranty, financing and leasing, quality seals, Carfax link, running costs). |
| `includePriceHistory` | Option: every price of the listing with its date, and the first price. |
| `includePhones` | Option: the seller's phone numbers and the dealer's contact person (WhatsApp too, when `includeCoordinates` reads the listing page). |
| `includeEmails` | Option: the dealer's e-mail address (private sellers have none). |
| `includeCoordinates` | Option: latitude and longitude of the vehicle, read on the listing page (one more page per listing, so the runs are slower). |
| `includeDealerProfiles`, `reviewLimit` | Option: each dealer's pages, read once per run (imprint, VAT id, trade register, managing directors, website, opening hours, makes, services, branches); `reviewLimit` adds up to this many of its latest reviews (0 = none, the default); AutoScout24 serves the 10 reviews of the dealer page, then the reviews from the 21st on, in lots of 10 (some of the 11th to 20th are never served), so a dealer can give up to 10 fewer than asked. |
| `priceFrom`, `priceTo`, `yearFrom`, `yearTo`, `modelYearFrom`, `modelYearTo`, `mileageFrom`, `mileageTo` | Price in euros, year of first registration, model year, mileage in km. |
| `powerFrom`, `powerTo`, `powerUnit`, `engineSizeFrom`, `engineSizeTo`, `electricRangeFrom`, `electricRangeTo` | Power in kW or hp, engine size in cm³, electric range in km. |
| `seatsFrom`, `seatsTo`, `doorsFrom`, `doorsTo`, `maxPreviousOwners` | Seats, doors, at most this many previous owners. |
| `fuelTypes`, `transmission`, `bodyTypes`, `driveType`, `cylinders` | Fuel, gearbox, body type (each vehicle type has its own list), drive, number of cylinders: any of the values ticked. |
| `condition`, `sellerType`, `exteriorColors`, `paintTypes`, `interiorColors`, `upholstery` | New, used, employee's car, classic, demonstration or pre-registered; dealers or private sellers; colours, paint and upholstery. |
| `priceRatings`, `priceReducedOnly`, `vatDeductible`, `onlineSince` | AutoScout24 price rating (e.g. very good + good price = the deals), price cut only, VAT deductible only, put online in the last 1 to 7 days or 14 days. |
| `emissionClass`, `emissionSticker`, `batteryOwnership`, `features`, `qualitySeals`, `includeDamaged` | Euro class or better, German emission sticker or better, battery ownership, equipment the vehicle must ALL have, manufacturer or inspection seals, vehicles with unrepaired damage (hidden by AutoScout24 by default). |
| `leasingOnly`, `leasingTarget`, `maxLeasingRate`, `maxFinanceRate` | Leasing offers only, for private or business customers, highest monthly leasing rate, highest monthly financing instalment. |
| `customFilters` | Any other filter of the AutoScout24 search, by the parameter name of its links (list in the Tips below). |
| `sortBy` | Order of the results: `NEWEST` (default, also the one **Only new listings** and **Posted after** stop early on), `RELEVANCE`, `PRICE_ASC`, `MILEAGE_ASC`, `YEAR_DESC`, `POWER_DESC`… `DISTANCE` needs a location in GPS coordinates `lat,lon`. |
| `postedAfter`, `postedBefore` | First put online on AutoScout24 between these dates: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`, `24 hours`). |
| `excludeKeywords` | Drop the listings whose title or version contains one of these words (`Motorschaden`, `Export`, case and accents ignored). |
| `requirePhone` | Only the listings whose seller shows a phone number. Works on its own: the numbers are returned (and billed) only when `includePhones` is ticked. |
| `minRating` | Only dealers whose exact average rating (e.g. 4.05, not the stars rounded up to the half) is at least this value (`4.5`); private sellers and dealers without a rating are dropped. |
| `onlyNew`, `stateKey`, `resetState` | Monitoring: only the listings never delivered under this memory key (`x1-munich`); `resetState` forgets the memory once. |
| `includePriceChanges`, `minPriceChangePercent` | Option, with `onlyNew`: a listing already delivered comes back when its price changed since, at least by this percentage. |
| `language`, `imageSize`, `includeRaw` | Language of the labels and AutoScout24 site of the listing links (`en` = autoscout24.com, `de`, `it`, `fr`, `es`, `nl`), photo size (large, 1,280 px, by default), and the untouched AutoScout24 data of each listing. |
| Advanced | `proxyConfiguration` (Apify proxy by default, included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute`, `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

### 📦 Output

A real listing (search **CUPRA** + **Leon** in Germany with `language` = `de`, so the labels are German), shortened: the fields that are empty without an option are left out.

```json
{
    "id": "f133ee06-321c-4e08-92e3-5984bcf983ea",
    "url": "https://www.autoscout24.de/angebote/cupra-leon-st-vz-cup-carbon-leder-pano-ahk-acc-beats-dcc-benzin-grau-cat_ma51802gr200363ge784va1016mt6286tr8398-f133ee06-321c-4e08-92e3-5984bcf983ea",
    "title": "CUPRA Leon ST VZ Cup Carbon Leder Pano AHK ACC Beats DCC",
    "vehicleType": "C",
    "make": "CUPRA",
    "model": "Leon",
    "modelVariant": "Leon Sportstourer",
    "motorType": "2.0 TSI",
    "bodyTypeLabel": "Kombi",
    "condition": "U",
    "price": 38975,
    "currency": "EUR",
    "priceText": "€ 38.975",
    "vatReclaimable": true,
    "priceRating": 5,
    "priceRatingLabel": "Hoher Preis",
    "marketMedianPrice": 33000,
    "priceVsMarketPct": 18.1,
    "firstRegistration": "2024-01",
    "mileageKm": 28653,
    "powerKw": 228,
    "powerHp": 310,
    "fuelType": "B",
    "transmission": "Automatic",
    "driveType": "4WD",
    "exteriorColor": "Grau",
    "previousOwners": 1,
    "emissionClass": "Euro 6d",
    "co2EmissionsGKm": 189,
    "fuelConsumptionL100km": 8.3,
    "accidentFree": true,
    "imageUrl": "https://prod.pictures.autoscout24.net/listing-images/f133ee06-321c-4e08-92e3-5984bcf983ea_73100bcb-433c-4b26-b32a-ab1e131a15c6.jpg/1280x960.webp",
    "images": [
        "https://prod.pictures.autoscout24.net/listing-images/f133ee06-321c-4e08-92e3-5984bcf983ea_73100bcb-433c-4b26-b32a-ab1e131a15c6.jpg/1280x960.webp"
    ],
    "publishedAt": "2026-10-22T11:42:18.595Z",
    "views": 0,
    "favorites": 0,
    "country": "DE",
    "postalCode": "23879",
    "city": "Mölln",
    "sellerId": "21687",
    "sellerType": "Dealer",
    "sellerName": "Ing. W. Riemer GmbH & Co. KG",
    "sellerRating": 4.5,
    "sellerRatingCount": 24,
    "sellerPageUrl": "https://www.autoscout24.de/haendler/ing-w-riemer-gmbh-und-co-kg",
    "detailsIncluded": false,
    "searchUrl": "https://www.autoscout24.de/lst?atype=C&cy=D&mmmv=51802%7C75435%7C%7C&damaged_listing=exclude&ocs_listing=include&lm_premium=true&specialconditions=true&sort=age&desc=1&page=1",
    "searchQuery": "CUPRA Leon",
    "searchRank": 2,
    "scrapedAt": "2026-10-22T12:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. The Output tab has 3 views: an overview, the price ratings (deals) and the sellers.

#### All 179 fields

A field is `null` (or an empty list) when the listing does not give it. The rows marked with an option are filled only when that option is ticked.

| Fields | What you get |
| --- | --- |
| `id`, `url`, `title`, `version` | `f133ee06-321c-4e08-92e3-5984bcf983ea` (the same id on every AutoScout24 site), the listing link on the site of the chosen language, title, the seller's version text |
| `vehicleType`, `make`, `makeId`, `model`, `modelId`, `modelGroup`, `modelGeneration`, `modelVariant`, `motorType`, `trimLine` | `C` (car), `CUPRA` and its id `51802`, `Leon` and its id `75435`, series `Leon`, `1. Generation`, `Leon Sportstourer`, `2.0 TSI`, `VZ CUP` |
| `bodyType`, `bodyTypeLabel`, `condition`, `conditionLabel`, `isNew` | `StationWagon` and its label, `U` (used) and its label, AutoScout24's "new listing" badge |
| `legacyId`, `dealerStockNumber`, `crossReferenceId`, `vin`, `licensePlate`, `modelYear` | older AutoScout24 id, the dealer's own references (`6425`), VIN and licence plate when the seller publishes them, model year |
| `price`, `currency`, `priceText`, `priceNet`, `vatRate`, `vatReclaimable`, `negotiable`, `previousPrice`, `priceReduced` | `38975`, `EUR`, `€ 38.975`, net price and VAT rate (`19`) when the VAT is deductible, negotiable, crossed-out old price of a price cut |
| `priceRating`, `priceRatingLabel`, `priceRatingRanges`, `priceConditions`, `marketMedianPrice`, `priceVsMarketPct` | `5` (1 = very good price … 5 = high price, null outside this scale) and its label, the price bands of the rating for this vehicle (`{category, min, max}`), the seller's price conditions, median `33000`, `18.1` (% over the median) |
| `firstRegistration`, `firstRegistrationYear`, `productionDate`, `mileageKm`, `powerKw`, `powerHp` | `2024-01`, `2024`, `2024`, `28653`, `228`, `310` |
| `fuelType`, `fuelTypeLabel`, `fuelDetail`, `transmission`, `transmissionLabel`, `cubicCapacityCc`, `driveType` | `B` (petrol) and its label, `Super 95`, `Automatic` and its label, `1984`, `4WD` |
| `doors`, `seats`, `exteriorColor`, `paintType`, `previousOwners`, `emissionClass` | `5`, `5`, `Grau`, paint finish, `1`, `Euro 6d` |
| `co2EmissionsGKm`, `fuelConsumptionL100km`, `electricConsumptionKwh100km`, `electricRangeKm` | `189` g/km, `8.3` l/100 km, kWh/100 km and range of electric cars |
| `accidentFree`, `hasDamage`, `readyToDrive` | accident-free, unrepaired damage, roadworthy: `true` / `false` |
| `view360Url`, `description`, `features`, `featureIds`, `featuresByCategory`, `highlights` | **Extract details**: link of the 360° view, the seller's description, every equipment item in the chosen language, their ids, grouped by category, the highlighted ones |
| `gears`, `cylinders`, `emptyWeightKg`, `interiorColor`, `upholstery`, `emissionSticker`, `particulateFilter`, `co2Class` | **Extract details**: technical data — `7` gears, `4` cylinders, weight in kg, interior, German emission sticker, particulate filter, German CO₂ class |
| `wltp`, `runningCosts`, `generalInspection`, `lastServiceDate`, `lastBeltServiceDate`, `fullServiceHistory`, `nonSmoking` | **Extract details**: WLTP consumption and CO₂, yearly running costs (Germany), next inspection and last service (`YYYY-MM`), timing belt, full service history, non-smoking |
| `damageConditions`, `hasRepairedDamage`, `kbaHsnTsn`, `countryVersion`, `numberOfBeds`, `numberOfAxles`, `batteryOwnership`, `electricRangeCityKm` | **Extract details**: damage declared, repaired damage flag, German HSN / TSN type key, market version, beds (motorhomes), axles, battery ownership, electric range in town (km) |
| `warranty`, `warrantyMonths`, `qualitySeals`, `carfaxReportUrl` | **Extract details**: warranty and its length in months, quality seals, free Carfax report link |
| `financing`, `leasing`, `leasingRateMonthly`, `availability`, `deliverable`, `videoUrl` | **Extract details**: financing and leasing offers (`{monthlyRate, durationMonths…}`, with the net credit amount, closing costs and the leasing one-time payment), monthly leasing rate, availability, home delivery, video link |
| `imageUrl`, `images`, `imageCount`, `has360View` | first photo and every photo at the chosen **Photo size**, photo count, 360° view flag |
| `publishedAt`, `modifiedAt`, `renewedAt`, `isRenewed`, `daysOnline`, `listingStatus` | `2026-10-22T11:42:18.595Z` (first put online: what the date filters read), last change, last push to the top, days online, `Active` |
| `views`, `favorites`, `leadsRange`, `placement`, `adTier` | AutoScout24's counters of views and favourites, band of contact requests (`Zero`, `Low`…), `Organic` or a paid placement, ad package (`T10`) |
| `distanceKm`, `onlineSale`, `country`, `postalCode`, `city`, `street` | distance from the searched location in km, can be bought online on AutoScout24, `DE`, `23879`, `Mölln`, the dealer's street |
| `latitude`, `longitude` | **GPS coordinates**: GPS point of the vehicle |
| `sellerId`, `sellerType`, `sellerName`, `sellerNameAddOn`, `sellerRating`, `sellerRatingAverage`, `sellerRatingCount` | `21687` (use it in **Dealers / sellers**), `Dealer` or `PrivateSeller`, dealer name and the line under it, star rating `4.5`, exact average, `24` ratings |
| `sellerReviewsUrl`, `sellerPageUrl`, `sellerStockUrl`, `sellerImprintUrl`, `sellerLogo` | the dealer's AutoScout24 pages: reviews, profile, its vehicles of the listing's type (its motorbikes for a motorbike), imprint, and its logo |
| `sellerPhone`, `sellerPhones`, `sellerContactPerson`, `sellerWhatsapp` | **Seller phone numbers**: first number in international format, every number with its type (`Office`, `Mobile`, `Fax`), contact person, WhatsApp (read on the listing page, with **GPS coordinates**) |
| `sellerEmail` | **Dealer e-mail**: the dealer's e-mail address published on AutoScout24 |
| `sellerLegalName`, `sellerImprint`, `sellerVatId`, `sellerTradeRegister`, `sellerManagers`, `sellerImprintEmail` | **Dealer profiles**: legal name, full imprint text, VAT id, trade register entry, managing directors, e-mail of the imprint |
| `sellerWebsite`, `sellerFax`, `sellerOpeningHours`, `sellerContactPersons`, `sellerMakes`, `sellerServices`, `sellerBranches`, `sellerAbout` | **Dealer profiles**: website, fax, opening hours by department and day, team, makes sold, services, branches, "about us" text |
| `sellerRecommendationRate`, `sellerSubRatings`, `sellerCoverImage`, `sellerReviews`, `sellerListingCount`, `dealerProfileFetched` | **Dealer profiles**: share of reviewers who recommend the dealer, average by criterion, cover picture, latest reviews (with **Dealer reviews per dealer**), number of cars the dealer has for sale, `true` once the dealer pages are read |
| `priceHistory`, `firstPrice`, `priceChangesCount` | **Price history**: every price with its date (`{price, date}`, oldest first), first price, number of price changes |
| `changeType`, `lastDeliveredPrice`, `priceChange`, `priceChangePct`, `priceChangedAt` | **Report price changes**: `NEW` or `PRICE_CHANGED`, the price delivered before, the change in euros and in %, when it was seen |
| `detailsIncluded`, `searchUrl`, `searchQuery`, `searchRank` | `true` when the **Extract details** fields are filled, the search that found the listing (null for a listing fetched by id), its label (`CUPRA Leon`), the listing's rank in it (`2`) |
| `raw`, `scrapedAt` | **Include raw data**: the untouched AutoScout24 data of the listing; when the listing was read |

### 💡 Tips

#### How to get more results

Set `maxItems` to `0`, keep **Go past 4,000 listings per search** on, and tick only the countries you need. To follow a market over time, schedule the Actor daily with **Only new listings**: each run brings what was put online since the last one.

#### How to reduce costs

The price is per listing, so the levers are `maxItems`, `maxItemsPerQuery`, the vehicle filters (applied by AutoScout24: what they leave out costs nothing), `onlyNew` for recurring runs (you never pay twice for the same listing) and the options: tick only the ones you use. **Countries** left empty searches all 8 countries; pick yours to read (and pay for) only the listings you want.

#### Several searches in one run

Fill `models`, `searchQueries` and / or `locations`: the Actor runs one search per make / model line × keyword × location, once per country ticked (all 8 when **Countries** is empty), plus one per seller of `sellerIds` and one per 100 ids of `listingIds` — up to 500 per run. The single `make` / `model`, `query` and `location` fields still work and are added to the lists; a `make` alone beside lines of its own models (`BMW` + `X1`, `3 Series`) is the make of those lines, not one more search of all its models. A listing found by several searches is saved — and charged — once. Set `maxItemsPerQuery` to give every search its own cap: without it the first searches can use up the whole `maxItems` budget. You can also paste several search URLs into `startUrls`: each one is a search of its own, with the same cap.

#### Going past 4,000 listings per search

AutoScout24 shows at most 4,000 listings for one search. With **Go past 4,000 listings per search** on (default, free), a bigger search is cut into price bands, each under 4,000, and a band still too big is cut again: the bands add up to the search's total, the listings "price on request" included. The run log says how a search was cut. Turned off, or for a search that cannot be cut (more than 4,000 listings at one same price), you get the first 4,000 in the chosen order. With **Only new listings**, a newest-first search that ran before is not cut: its newest 4,000 are read, where the new listings are.

#### Monitoring: only the new listings

Tick **Only new listings** (`onlyNew`) and schedule the Actor. The first run returns everything; each later run skips the listings already delivered: they are not saved and not charged. The memory lives in a named key-value store of your account (`autoscout24-listings-scraper-seen`, up to 150,000 listings per key) and is only updated with listings that really reached the dataset, so a failed run never hides anything. Give each schedule its own `stateKey` (two schedules sharing a key would hide each other's listings), and tick `resetState` once to start over. With **Sort by** on newest first (the default), a search stops once it meets a long run of listings you already have (sponsored listings pinned at the top are not counted).

#### Price changes

Tick **Report price changes** (`includePriceChanges`, needs `onlyNew`): a listing already delivered under the same `stateKey` comes back, whole, when its price changed since the run that delivered it, with `changeType` = `PRICE_CHANGED`, the price delivered before, the change in euros and in %, and when it was seen. **Min price change** ignores the small moves. An older listing can change its price too, so the search is read past the new listings, as far as the listings already delivered go (it stops at the first stretch of listings no run delivered, at least one results page long): each listing already delivered that the run reads again and finds at the same price costs a small `price-check`, and the run stops when its maximum cost cannot pay one more.

```json
{
    "make": "Volkswagen",
    "model": "Golf",
    "countries": ["D"],
    "onlyNew": true,
    "stateKey": "golf-de",
    "includePriceChanges": true,
    "minPriceChangePercent": 3
}
```

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included, Berlin time) or a period before now (`7 days`, `2 weeks`, `1 month`; via the API also `24 hours` or a full ISO date-time). The filter reads `publishedAt`, the day the listing was first put online (not a later price change or push to the top); a listing without a publication date is dropped as soon as a date bound is set. Filtered-out listings are not saved and do not count in `maxItems` (each listing dropped costs the filter fee, see the pricing section); the run summary tells how many were filtered. With **Sort by** on newest first (the default), a search stops at the first page that is entirely too old. For the last 1 to 7 days or 14 days, **Online since** asks AutoScout24 itself: the older listings are never read.

#### Other AutoScout24 filters

**Other AutoScout24 filters** (`customFilters`) takes any filter of the AutoScout24 search as `"parameter": "value"`, with the parameter names AutoScout24 writes in its links: set the filter on the site, then copy its parameter from the link. Several values = a list. Example: `{"newdriver": "true", "ocs_listing": "exclude"}`.

The parameters accepted: `adage`, `atype`, `axlenumber`, `beds`, `bedsfrom`, `bedsto`, `bcol`, `body`, `bot`, `ccmfrom`, `ccmto`, `cid`, `crossborder`, `cy`, `cylinders`, `damaged_listing`, `doorfrom`, `doorto`, `dtrain`, `efeg`, `ehfrom`, `ehto`, `emclass`, `ensticker`, `eq`, `erfrom`, `erto`, `ewfrom`, `ewto`, `financeratefrom`, `financerateto`, `fregfrom`, `fregto`, `fuel`, `gear`, `grossweightfrom`, `grossweightto`, `hasleasing`, `icol`, `kmfrom`, `kmto`, `kwd`, `lat`, `leasingratefrom`, `leasingrateto`, `lm_premium`, `lon`, `lsavno`, `lsduto`, `lsdufrom`, `lsenbo`, `lstagr`, `lstrinbo`, `lsyeinmifrom`, `mmmv`, `modelyearfrom`, `modelyearto`, `newdriver`, `ocs_listing`, `offer`, `ot_osc`, `pe_category`, `powerfrom`, `powerto`, `powertype`, `prevownersid`, `pricefrom`, `priceto`, `pricetype`, `ptype`, `region`, `sealor`, `seatsfrom`, `seatsto`, `show_nfm`, `sout`, `specialconditions`, `superdeal`, `totlenfrom`, `totlento`, `tradeIn`, `uph`, `custtype`, `vatded`, `version0`, `wbfrom`, `wbto`, `zip`, `zipr`. Most of them already have a field of the form, which wins over the same parameter here. An unknown parameter stops the run (AutoScout24 would ignore it and return everything); `page`, `size`, `slug`, `sort` and `desc` are refused (use **Sort by** and the caps).

Like the AutoScout24 page, the Actor sends `damaged_listing=exclude`, `ocs_listing=include`, `lm_premium=true` and `specialconditions=true` by default, so that its totals match the site's: set them here to change them (**Include damaged vehicles** sets the first one).

### 🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

### 🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the [Apify MCP server](https://mcp.apify.com), billed to their Apify account like any run. It returns one item per AutoScout24 vehicle listing. Actor id: `nice_dev/autoscout24-listings-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/autoscout24-listings-scraper`.

Smallest input, for a cheap first call:

```json
{
    "make": "BMW",
    "model": "X1",
    "countries": ["D"],
    "maxItems": 10
}
```

Key output fields: `url`, `title`, `price`, `priceRating`, `mileageKm`, `firstRegistration`, `powerHp`, `sellerName` and `publishedAt`.

Cost: pay per event, per listing saved plus the options ticked (all unticked by default), see the pricing section above. Cap each call with `maxItems` and, through the API, with the run option `maxTotalChargeUsd`.

### ❓ FAQ

#### Is it legal to scrape AutoScout24?

The Actor logs in to nothing and solves no captcha: it reads the listings AutoScout24 serves to any visitor without an account. Results can contain personal data (the phone number of a private seller, the name of a dealer's contact person), which is protected by GDPR: phone numbers, e-mails and dealer imprints are only returned with the options that ask for them, and you should not store personal data without a legitimate reason. You are responsible for using the data in compliance with AutoScout24's Terms of Use and applicable law. This Actor is not affiliated with AutoScout24.

#### Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session, up to 10 times on top of the retries (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

#### Which AutoScout24 sites are covered?

The 8 national sites (autoscout24.de, .at, .it, .fr, .es, .nl, .be, .lu) and autoscout24.com: a search of the form runs on the national site of each country ticked, and a link from any of them can be pasted into **Start URLs**. **Language** sets the language of the labels and the site the listing links point to; it does not change the listings found. autoscout24.ch is a different platform and is not supported.

#### Is the data safe to open in Excel or to show on a web page?

Titles and descriptions are the sellers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a phone number, a title such as `-20% today`): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger.

#### Known limitations

- The GPS point (and WhatsApp) is only on the listing page: **GPS coordinates** reads one more page per listing, so such runs are slower.
- `onlyNew` alone remembers listing ids, not their content: a listing whose price changed is not returned again unless **Report price changes** is ticked.
- Two runs sharing the same `stateKey` at the same time may both return the same new listing.

**A run that reaches its timeout** stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with `onlyNew`, remembered, and the run ends *Succeeded* with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

**How much fits in the default 1-hour timeout**: well over 100,000 listings at the pace measured on the platform (about 3,000 a minute); about 7,000 when an option reads each listing's page (about 120 a minute).

**A run the platform stops without warning** (out of memory)

- Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the listings already saved are skipped: none is delivered or charged twice, and `maxItems` still counts them.
- With `onlyNew`, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the listings it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the listings of its last 2 seconds once more.

#### Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on AutoScout24 (removed while the run was reading them), and the requests that failed after every retry. Those requests and the removed listings are listed, with the reason, in the `FAILED_REQUESTS` record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause (a search URL that does not exist says so, instead of "run it again").

If AutoScout24 changes its pages, you are told instead of paying for blank rows. A results page that counts listings but gives none the Actor can read is an error (listed in `FAILED_REQUESTS`), never a quiet "No listings found". If the first 20 listings read all lack their title, make, model, price, seller type or publication date, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. The same goes for the listing pages of **GPS coordinates** and the dealer pages of **Dealer profiles**: if the first 20 listing pages read (20 dealers, for the dealer pages) answer without any position (without any imprint), the run stops and fails, naming the field; a shorter run is judged at its end, from 5. A listing that `postedAfter` / `postedBefore` drops because it has no date at all counts among those 20. A run of fewer listings (a scheduled `onlyNew` run that finds a few new ones, a small **Max listings**) is checked at its end, from 5 listings: its listings are already saved, and the run fails with the missing field instead of ending green.

### 🛟 Support

Open an issue in the **Issues** tab with a link to your run: the run log and the `FAILED_REQUESTS` record of the key-value store show exactly which URLs failed and why.

# Actor input Schema

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

AutoScout24 links, pasted as they are in your browser, from any AutoScout24 site (.de .at .it .fr .es .nl .be .lu .com): a search (`https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&fregfrom=2020…`, every filter set on the site is kept), a listing (`https://www.autoscout24.de/angebote/…-<id>`) or a dealer page (`https://www.autoscout24.de/haendler/<name>` = its cars, or the vehicle type of the link: ?atype=B = motorbikes). When this list is not empty, the search fields below (vehicle type, make, keywords, locations, countries) and the **Vehicle filters** are ignored: set them on AutoScout24 before copying the link. The Actor's own filters (dates, words to exclude, phone only), the caps and monitoring still apply. autoscout24.ch is a different platform and is not supported. Max 1 000 URLs.

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

The AutoScout24 section to search. Some filters below exist only for some vehicle types (a filter a section does not have is ignored by the site, and the run log says so).

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

Make as written on AutoScout24, e.g. `BMW`, `Volkswagen`, `Mercedes-Benz` (case and accents ignored) or its AutoScout24 id (`13`). An unknown make stops the run with the list of close names, instead of silently searching every make. Empty = all makes.

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

Model of the make above, as on AutoScout24: a single model (`320`, `Golf`) or a model series (`3 Series` / `3er`, `A-Class` = all its models), or its AutoScout24 id. Needs **Make**. Empty = all models of the make.

## `modelVersion` (type: `string`):

Words of the version searched by AutoScout24 with **Make** + **Model** (its « Version » field), e.g. `xDrive`, `GTI`, `Competition`. Needs **Make**. Empty = any version.

## `models` (type: `array`):

Several make + model searches in one run, one per line: `BMW 3 Series`, `Audi A4`, `Tesla` (make alone = all its models); with **Make** filled, a line that starts with no make (`Golf`, `3 Series`) is a model of that make. Added to **Make** / **Model**; each line is a separate search (times each keyword and location below, max 500 searches); a listing found by several searches is saved once.

## `query` (type: `string`):

Free text searched by AutoScout24 in the listing (title, description, equipment), e.g. `panorama`, `scheckheft`. Empty = no keyword.

## `searchQueries` (type: `array`):

Several keywords in one run: one search per keyword (times each make / model and location). Added to **Search keyword**; listings found by several searches are saved once.

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

Countries where the vehicles are offered: AutoScout24 covers 8 countries. Empty = all 8 countries.

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

Centre of a radius search: a postcode (`80331`; a postcode needs exactly one **Country** ticked, the country it belongs to) or GPS coordinates `48.137,11.575` (any number of countries). Used with **Radius**. Empty = everywhere.

## `locations` (type: `array`):

Several locations in one run: every search is run around every location (3 models × 4 locations = 12 searches, max 500). Added to **Location**. Same rule: a postcode needs exactly one **Country** ticked, GPS coordinates work with several.

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

Distance around each location, in km.

## `sellerIds` (type: `array`):

Every vehicle of these sellers: the seller id this Actor returns (`sellerId`, e.g. `6189`) or a dealer page URL (`https://www.autoscout24.de/haendler/<name>`). Each seller is one search; the filters below still apply.

## `listingIds` (type: `array`):

Fetch these listings directly, by AutoScout24 id (`990bcad7-c393-49a2-ab60-18ef4850cc95`) or listing URL. Always added to the searches above; fetched 100 at a time.

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

Maximum number of listings to save for the whole run (after deduplication and filters). 0 = no limit.

## `maxItemsPerQuery` (type: `integer`):

Cap for EACH search (make / model × keyword × location, seller, or start URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.

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

AutoScout24 returns at most 4 000 listings per search. On: a bigger search is cut into price bands, each under 4 000, so that every listing is reached (free, a few more requests); the bands add up to the search total. Off: the first 4 000.

## `extractDetails` (type: `boolean`):

Add the full listing: seller's description, every equipment item, all technical data (WLTP consumption and CO₂, weight, gears, cylinders, last service, next inspection, damage, origin), warranty, financing and leasing offers, quality seals, Carfax report link, running costs. Read in the same request as the search (no extra page), charged per listing as **Listing details**, on top of the listing (see Pricing). Off = the main fields: price, AutoScout24 price rating and its ranges, mileage, year, power, fuel, gearbox, body, colour, seller name and address, dates, views and favourites.

## `includePriceHistory` (type: `boolean`):

Every price the listing has had on AutoScout24, with the date of each change (`priceHistory`), and the first price seen (`firstPrice`). It comes with the search, from the first run. Charged per listing whose price changed at least once, as **Price history** (see Pricing); a listing still at its first price costs nothing extra.

## `includePhones` (type: `boolean`):

Fill `sellerPhone`, `sellerPhones` and the dealer's contact person (`sellerContactPerson`). Charged per listing as **Phone number found**, once per listing delivered with at least one number (however many it has), on top of the listing (see Pricing); a listing without a number costs nothing extra. Read with the search (no extra page). Off = the phone fields are always empty.

## `includeEmails` (type: `boolean`):

Fill `sellerEmail` with the dealer's e-mail address published on AutoScout24 (most dealers have one; private sellers only have a contact form). Charged per listing delivered with an e-mail, as **E-mail found** (see Pricing). Read with the search (no extra page).

## `includeCoordinates` (type: `boolean`):

Fill `latitude` / `longitude` of the vehicle's location. They are only on the listing page: 1 extra request per listing, charged per listing with coordinates found as **GPS coordinates** (see Pricing).

## `includeDealerProfiles` (type: `boolean`):

For each dealer, read its AutoScout24 dealer pages once per run: imprint (legal name, managing directors, trade register, VAT id, e-mail), own website, opening hours, makes sold, services, branches and, with **Dealer reviews per dealer**, its customer reviews. Charged per dealer as **Dealer profile** (see Pricing), when its number of vehicles for sale and the reviews asked are all read (a dealer whose figure or reviews could not be read is not charged on that listing); private sellers have no dealer page.

## `reviewLimit` (type: `integer`):

With **Dealer profiles**: also return up to this many of the latest customer reviews of each dealer (`sellerReviews`: date, rating and sub-ratings, text, dealer reply). AutoScout24 serves the 10 reviews of the dealer page, then the reviews from the 21st on, in lots of 10 (some of the 11th to 20th are never served), so a dealer can give up to 10 fewer than asked. Included in the **Dealer profile** charge. 0 = no reviews.

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

Lowest price in euros.

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

Highest price in euros.

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

Registered in this year or later.

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

Registered in this year or earlier.

## `modelYearFrom` (type: `integer`):

Model year (not registration year) this one or later.

## `modelYearTo` (type: `integer`):

Model year this one or earlier.

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

Lowest mileage in km.

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

Highest mileage in km.

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

Lowest engine power, in the **Power unit** below.

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

Highest engine power, in the **Power unit** below.

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

Unit of **Min power** / **Max power**.

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

Keep any of these fuels. Empty = all.

## `transmission` (type: `array`):

Keep any of these gearboxes. Empty = all.

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

Keep any of these body types (each vehicle type has its own list: pick those of the **Vehicle type** searched). Empty = all.

## `condition` (type: `array`):

Keep any of these conditions (new, used, employee's car, classic, demonstration, pre-registered). Empty = all.

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

Dealers, private sellers, or both.

## `exteriorColors` (type: `array`):

Keep any of these colours. Empty = all.

## `paintTypes` (type: `array`):

Keep any of these paint finishes (metallic, mica, others). Empty = all.

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

Keep any of these interior colours. Empty = all.

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

Keep any of these upholstery types. Empty = all.

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

Keep only listings with one of these AutoScout24 price ratings (e.g. `Very good price` + `Good price` = the deals). Empty = all.

## `maxPreviousOwners` (type: `integer`):

At most this many previous owners (1 to 3; 4 = 4 or more).

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

At least this many seats.

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

At most this many seats.

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

At least this many doors.

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

At most this many doors.

## `driveType` (type: `array`):

Keep any of these drive types. Empty = all.

## `cylinders` (type: `array`):

Keep any of these numbers of cylinders. Empty = all.

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

This Euro emission class or a better one (e.g. Euro 6 also keeps Euro 6c, 6d-TEMP and 6d).

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

German low-emission zone sticker (Umweltplakette): this sticker or a better one (yellow also keeps green).

## `engineSizeFrom` (type: `integer`):

Lowest cubic capacity in cm³.

## `engineSizeTo` (type: `integer`):

Highest cubic capacity in cm³.

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

Lowest electric range in km (electric and plug-in hybrid vehicles).

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

Highest electric range in km.

## `batteryOwnership` (type: `string`):

Electric vehicles: battery included in the price, rented, or excluded.

## `features` (type: `array`):

Keep only vehicles with ALL of these equipment items (AutoScout24's own list, e.g. navigation system, heated seats, tow bar, full service history, warranty). Empty = no requirement.

## `qualitySeals` (type: `array`):

Only used vehicles with one of these manufacturer or inspection seals (certified used cars). Empty = all.

## `includeDamaged` (type: `boolean`):

AutoScout24 hides vehicles with unrepaired damage by default; tick to include them (`damageConditions` says which damage).

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

Only listings where the VAT can be reclaimed (net price shown), for business buyers.

## `priceReducedOnly` (type: `boolean`):

Only listings whose price was lowered (AutoScout24 « super deal », with the old price: `previousPrice`).

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

Only listings put online in the last N days, filtered by AutoScout24 itself (for any other period use **Posted after**).

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

Only listings that carry a leasing offer (`leasing` and `leasingRateMonthly` in the results).

## `leasingTarget` (type: `string`):

With **Leasing offers only**: offers for private or business customers.

## `maxLeasingRate` (type: `integer`):

With **Leasing offers only**: highest monthly leasing rate, in euros.

## `maxFinanceRate` (type: `integer`):

Highest monthly financing instalment, in euros (listings with a financing offer).

## `customFilters` (type: `object`):

Any other filter of the AutoScout24 search, as `parameter: value` (a list for several values), with the parameter names of AutoScout24 links: e.g. `{"newdriver": "true", "lsdufrom": 24, "ocs_listing": "exclude"}`. The README lists every parameter; an unknown parameter stops the run (AutoScout24 would silently ignore it and return everything). Like the AutoScout24 page, the Actor sends `damaged_listing=exclude`, `ocs_listing=include`, `lm_premium=true` and `specialconditions=true` by default, so totals match the site: set them here to change them. `page`, `size`, `slug`, `sort` and `desc` are refused (use **Sort by** and the caps).

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

Order in which AutoScout24 returns the listings. Newest first is the default and the one used to stop early with **Only new listings**. With a cap, the order decides WHICH listings you get. Distance needs **Location** as GPS coordinates `lat,lon`; with a postcode the order falls back to best results (with a warning).

## `postedAfter` (type: `string`):

Only listings first put online on AutoScout24 on or after this date (`publishedAt`, not a later price change or renewal): `2026-09-01`, or a period before now such as `7 days`, `2 weeks`, `1 month` (API: `24 hours` and full ISO date-times work too).

## `postedBefore` (type: `string`):

Only listings first put online on or before this date (the whole day is included), or older than a period such as `30 days`.

## `excludeKeywords` (type: `array`):

Drop the listings whose title or version contains one of these words (case and accents ignored), e.g. `Motorschaden`, `Export`, `defekt`, or a model to leave out (`M3`). A word also counts inside a longer word.

## `requirePhone` (type: `boolean`):

Keep only the listings whose seller shows a phone number. Works on its own: the numbers are returned (and billed) only when **Seller phone numbers** is ticked.

## `minRating` (type: `string`):

Keep only listings of dealers whose exact average rating (`sellerRatingAverage`, e.g. 4.05; not the stars rounded up to the half) is at least this value, from 1 to 5, e.g. `4.5`; private sellers and dealers without a rating are dropped. Empty = no rating filter.

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

Skip the listings that a previous run (same **Memory key**) already delivered: they are not saved and not charged. First run = everything is new.

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

Name of the memory used by **Only new listings**. Give each schedule / task its own key (e.g. `x1-munich`) so that they do not share their memory. Letters, digits, `-` and `_`.

## `resetState` (type: `boolean`):

Forget everything remembered under this **Memory key** before the run: this run returns (and charges) every listing again. Untick it afterwards.

## `includePriceChanges` (type: `boolean`):

Needs **Only new listings**. A listing already delivered under this **Memory key** comes back, whole, when its price has changed since the run that delivered it: `changeType` = `PRICE_CHANGED`, with `lastDeliveredPrice`, `priceChange`, `priceChangePct` and `priceChangedAt`. Charged per listing as **Price change**, on top of the listing (see Pricing); a listing whose price did not move is not saved. The search is read past the new listings, as far as the listings already delivered go (up to **Max listings** delivered), because an older listing can change its price: each listing already delivered and re-checked is charged a small **Price check** (see Pricing), and the run stops when its maximum cost cannot pay one.

## `minPriceChangePercent` (type: `integer`):

With **Report price changes**: ignore a price change smaller than this percentage (up or down). 0 = every change.

## `language` (type: `string`):

Language of the texts AutoScout24 writes (fuel, gearbox, body, colour, equipment, damage labels) and AutoScout24 site of the listing URLs. The codes and numbers are the same in every language; the listings found do not depend on it.

## `imageSize` (type: `string`):

Size of the photo URLs returned.

## `includeRaw` (type: `boolean`):

Add a `raw` field with the untouched JSON of AutoScout24 for the listing. Useful to recover a field this Actor does not map yet; makes the data much bigger.

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

Apify Proxy or your own proxies. Keep the default: it is included in the price. The residential Apify proxy is not available in this Actor (not needed for AutoScout24).

## `maxConcurrency` (type: `integer`):

Maximum number of requests processed in parallel.

## `maxRequestsPerMinute` (type: `integer`):

Most requests to AutoScout24 in any 60 seconds, all of them counted: searches (up to 400 listings each), listing pages (GPS) and dealer pages. A budget, not an even pace (spread them with the minimum delay below). Lower it if the log shows HTTP 429 / 403.

## `minRequestIntervalMs` (type: `integer`):

Smallest gap between two requests, in milliseconds. Unlike the per-minute rate, this spreads the requests evenly instead of letting them go out in a burst. 0 = no gap.

## `maxRequestRetries` (type: `integer`):

Retries per request before it is marked as failed. Behind a proxy, a request the site turns away is also retried on a new proxy session up to 10 times without using up these retries.

## `debugLog` (type: `boolean`):

Include debug messages in the run log.

## Actor input object example

```json
{
  "startUrls": [],
  "vehicleType": "C",
  "make": "BMW",
  "model": "X1",
  "models": [],
  "searchQueries": [],
  "countries": [
    "D"
  ],
  "locations": [],
  "radiusKm": 50,
  "sellerIds": [],
  "listingIds": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "splitLargeSearches": true,
  "extractDetails": false,
  "includePriceHistory": false,
  "includePhones": false,
  "includeEmails": false,
  "includeCoordinates": false,
  "includeDealerProfiles": false,
  "reviewLimit": 0,
  "powerUnit": "kw",
  "fuelTypes": [],
  "transmission": [],
  "bodyTypes": [],
  "condition": [],
  "sellerType": "ANY",
  "exteriorColors": [],
  "paintTypes": [],
  "interiorColors": [],
  "upholstery": [],
  "priceRatings": [],
  "driveType": [],
  "cylinders": [],
  "features": [],
  "qualitySeals": [],
  "includeDamaged": false,
  "vatDeductible": false,
  "priceReducedOnly": false,
  "leasingOnly": false,
  "customFilters": {},
  "sortBy": "NEWEST",
  "excludeKeywords": [],
  "requirePhone": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "includePriceChanges": false,
  "minPriceChangePercent": 0,
  "language": "en",
  "imageSize": "large",
  "includeRaw": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxRequestsPerMinute": 120,
  "minRequestIntervalMs": 0,
  "maxRequestRetries": 5,
  "debugLog": false
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "make": "BMW",
    "model": "X1",
    "countries": [
        "D"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/autoscout24-listings-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "make": "BMW",
    "model": "X1",
    "countries": ["D"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/autoscout24-listings-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "make": "BMW",
  "model": "X1",
  "countries": [
    "D"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/autoscout24-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/autoscout24-listings-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xr40cbOfEIb0XvDlU/builds/Fec85Hy2JTchJmeXQ/openapi.json
