# AutoScout24.ch Scraper: Swiss Car, Motorcycle & Camper Listings (`nice_dev/autoscout24-ch-listings-scraper`) Actor

Scrape car, motorcycle and camper listings from autoscout24.ch and motoscout24.ch with 60+ filters: price in CHF, details, equipment, optional seller profile. Export to JSON, CSV or Excel.

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

## Pricing

from $0.38 / 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.ch Scraper?

**AutoScout24.ch Scraper** extracts **vehicle listings from [AutoScout24.ch](https://www.autoscout24.ch) and [MotoScout24.ch](https://www.motoscout24.ch)**: cars, motorbikes, motorhomes and caravans, vans, trucks and trailers, with **price in CHF, previous price, mileage, first registration, power, fuel, gearbox, photos, seller and location**. It works as an **AutoScout24.ch API alternative**: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n. Dealers, importers, leasing and insurance companies, and price-watch services use it to follow the Swiss used-car market.

Pick a **make and model** (`BMW` `320`), a place and the filters you need, or paste any AutoScout24.ch or MotoScout24.ch search URL, click **Start**, and download the listings in JSON, CSV or Excel. No login, nothing to set up. Every result of a search is read, page after page, with no page limit: AutoScout24.ch had about 200,000 vehicles for sale in October 2026, over 160,000 of them cars.

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

One item per listing, 153 fields:

| Category | What you get |
| --- | --- |
| 🚗 **Vehicle** | make, model, version, vehicle type, condition (new, used, demonstration, oldtimer, pre-registered) — `MAZDA 3 Hatchback 2.5 Homura` |
| 💰 **Price** | price in Swiss francs, previous price, price drop in CHF and %, monthly leasing rate, financing offer — `28950 CHF, was 31500` |
| ⚙️ **Key figures** | first registration, mileage, power in hp and kW, fuel, gearbox, electric range, fuel consumption |
| 🛡️ **History and warranty** | accident-free or not, Swiss MFK inspection, warranty, extra set of tyres, dealer quality labels |
| 📸 **Photos and text** | every photo at the size you choose, the seller's sales line, the full description (with details) |
| 📍 **Location** | postcode, town, canton, Switzerland or Liechtenstein, GPS coordinates (with seller profiles) |
| 🏢 **Seller** | dealer name, dealer or private seller, logo, page of all its vehicles |
| 📐 **Full specs** (option) | body type, colours, doors, seats, engine, CO₂, Euro norm, energy label, battery and charging, dimensions, weights, towing capacity, last MFK date, warranty details |
| 🧰 **Equipment** (option) | standard equipment, paid options with their package contents |
| ⭐ **Seller profile** (option) | street address, website, opening hours, contact person, Google rating and latest reviews, number of vehicles for sale |
| 📞 **Phone numbers** (option) | the seller's phone numbers and fax |
| 🔔 **Monitoring** (option) | new, price changed or removed since your last run, with the old price and the change |

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

The options are **unticked by default**: each one adds pages to read and is charged on its own, only when you tick it (see Pricing). Without them, every listing already has its price, previous price, leasing rate, year, mileage, power, fuel, gearbox, range, consumption, accident and MFK status, warranty type, all photos, seller and dates.

### ✅ Why use AutoScout24.ch Scraper?

- 🎯 **60+ filters of the site itself**: price, year, mileage, power, fuel, gearbox, body type, colours, drive, battery, CO₂, equipment, seller type, quality labels… A run reads only the vehicles that match, so you pay for nothing else.
- 🔗 **Paste the search you already have**: any AutoScout24.ch or MotoScout24.ch results page, a single listing or a dealer's page, every filter kept.
- 🧩 **Nothing missed, nothing twice**: every page of a search, in a stable order, each listing returned once.
- 🏍️ **All six sections**: cars, motorbikes (MotoScout24.ch), motorhomes and caravans, vans, trucks and trailers.
- 📉 **Price drops at a glance**: previous price, drop in CHF and in %, and a monitoring mode that reports price changes and sold or withdrawn vehicles.
- 🧾 **Pay only for what you tick**: details, equipment, seller profiles and phone numbers are separate options.
- 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

### 🚀 How to scrape AutoScout24.ch

1. Create a free Apify account.
2. Open **AutoScout24.ch Scraper**, choose the **Vehicle type**, then type a **Make** and **Model** (e.g. `BMW` and `320`) and, if you want, a **Location** and some **Vehicle filters**.
3. Or paste your own AutoScout24.ch or MotoScout24.ch links into **Start URLs**: a search results page (all filters set on the site are kept, pagination is automatic), a listing, or a dealer's 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.ch?

This Actor uses **pay per event** pricing: you pay for each listing saved, plus a small fee per run start. The current price of each event is shown in the **Pricing** tab of this page; higher Apify plans pay less per listing. Platform usage (compute, proxy) is included in the price.

What can be charged, and when:

- **Listing**: each row saved in the dataset, with the main fields of the search.
- **Listing details** (`extractDetails`): per listing, on top of the listing.
- **Equipment list** (`includeEquipment`): per listing whose equipment list is not empty; a listing without equipment costs nothing extra.
- **Seller profile** (`includeDealerProfiles`): once per seller and per run, for each seller profile found; the Google reviews are included.
- **Phone number found** (`includePhones`): per listing saved with at least one phone number; a listing without a number costs nothing extra.
- **Price check** (`includePriceChanges`, `includeRemovedListings`): per listing you already have that a monitoring run checks again.
- **Price change** (`includePriceChanges`): per listing returned because its price changed, on top of the listing.
- **Filter fees**: the filters the site does not offer are applied by the Actor on every listing it reads (`postedAfter`, `postedBefore`, `excludeKeywords`, `requirePhone`, `minRating`). A listing you keep costs its normal price; a listing a filter drops is not saved and costs only a filter fee instead (its own fee for `requirePhone` and `minRating`, which need the seller's profile).

A listing the monitoring reports as removed is a row of the dataset: it costs a listing, plus its price check, and counts towards **Max listings**. Cap any run with **Max listings** and, through the API, with the run option `maxTotalChargeUsd`.

### ⚙️ Input

```json
{
    "vehicleType": "car",
    "make": "BMW",
    "model": "320",
    "location": "8001",
    "radiusKm": 30,
    "priceTo": 30000,
    "maxItems": 200
}
```

Several searches, a cap per search, only the vehicles not delivered before, with their price changes:

```json
{
    "query": "Tesla Model 3",
    "searchQueries": ["VW Golf", "Audi"],
    "locations": ["Zürich", "Bern"],
    "maxItemsPerQuery": 50,
    "onlyNew": true,
    "includePriceChanges": true,
    "stateKey": "golf-tesla-audi"
}
```

Or with your own links:

```json
{
    "startUrls": [
        { "url": "https://www.autoscout24.ch/de/s/mo-320/mk-bmw?priceTo=30000" },
        { "url": "https://www.autoscout24.ch/de/d/bmw-320-20930678" },
        { "url": "https://www.autoscout24.ch/de/s/seller-64187" }
    ],
    "maxItems": 500
}
```

With the paid options (each one adds pages, see the table below):

```json
{
    "make": "Volkswagen",
    "model": "Golf",
    "extractDetails": true,
    "includeEquipment": true,
    "includeDealerProfiles": true,
    "reviewLimit": 3,
    "maxItems": 100
}
```

| Field | Notes |
| --- | --- |
| `startUrls` | AutoScout24.ch or MotoScout24.ch links as they are in your browser: a search results page (filters kept, pagination automatic, MotoScout24.ch searches motorbikes), a listing, or a seller page such as `https://www.autoscout24.ch/de/s/seller-64187` (all its vehicles). When set, the search fields and the **Vehicle filters** are ignored: set them on the site before copying the link (the one exception: the searches of `sellerIds` keep the **Vehicle filters**, with or without start URLs). The Actor's own filters, the caps and monitoring still apply. autoscout24.de, .at, .it… are another platform, not supported here. |
| `vehicleType` | Section of the site: `car`, `motorcycle` (MotoScout24.ch), `camper`, `utility`, `truck` or `trailer`. |
| `make`, `model` | Make as written on the site, e.g. `BMW`, `Volkswagen`, `Mercedes-Benz` (case and accents ignored), then a model or a model series of that make. An unknown make stops the run with the closest names instead of searching every make. |
| `query`, `searchQueries` | A make and model typed as one text, e.g. `BMW 320`, `Tesla Model 3`, `Audi` (make alone = all its models); `searchQueries` adds more, one search each. AutoScout24.ch has no free-text search: the text is matched to the site's makes and models. |
| `location`, `locations`, `radiusKm` | A postcode (`8001`), a town (`Lausanne`), a canton (`Vaud`, `VD`) or GPS coordinates (`47.37,8.54`), in Switzerland or Liechtenstein; `locations` adds more places, `radiusKm` is the distance around a postcode or town (20 km by default; a canton is searched whole). Every make / model text is searched in every location (max 500 searches per run). |
| `sellerIds` | Every vehicle of these sellers: the seller id this Actor returns (e.g. `64187`) or a seller page URL. One search per seller. |
| `listingIds` | Fetch these listings directly, by id (e.g. `20930678`) or listing URL, read 20 at a time. A listing no longer online gives no row (it is noted in the log and in the FAILED_REQUESTS record); only one you already received under the same state key comes back as a REMOVED row, with **Report removed listings**. |
| `maxItems`, `maxItemsPerQuery` | Stop after this many listings for the whole run, and for EACH search (`0` = no limit). |
| `extractDetails` | **Listing details**: the full listing (description, catalogue price, specs, battery and charging, dimensions, last MFK date, warranty details, documents). 1 more page per listing. Off by default. |
| `includeEquipment` | **Equipment list**: standard equipment and paid options, in the chosen language. 1 more page per listing; with **Listing details** as well, 2 more pages per listing. Off by default. |
| `includeDealerProfiles`, `reviewLimit` | **Seller profiles**: address, website, opening hours, contact person, Google rating, GPS and number of vehicles for sale, read once per seller and per run, plus up to 5 latest Google reviews with **Reviews per seller**. 2 more pages per seller (the profile, then its number of vehicles). Off by default. |
| `includePhones` | **Seller phone numbers**: every number with its type, and the fax. Read from the seller's profile: 1 more page per seller (the same page when **Seller profiles** is on). Off by default. |
| `priceFrom`, `priceTo`, `yearFrom`, `yearTo`, `mileageFrom`, `mileageTo`, `powerFrom`, `powerTo`, `powerUnit` | Price in CHF, first registration year, mileage in km, power in hp or kW (**Power unit**). |
| `fuelTypes`, `transmission`, `bodyTypes`, `condition`, `driveType` | Pick one or more: the vehicle matches any of them. |
| `sellerType`, `exteriorColors`, `metallicOnly`, `interiorColors`, `doorsFrom`, `doorsTo`, `seatsFrom`, `seatsTo` | Dealers or private sellers, colours, doors and seats. |
| `warrantyOnly`, `accidentHistory`, `inspectedOnly`, `withImagesOnly`, `extraTiresOnly`, `handicappedAccessibleOnly`, `availableForExchangeOnly` | Warranty, accident history, MFK inspected, with photos, extra set of tyres, wheelchair accessible, trade-in accepted. |
| `leasingOnly`, `maxLeasingRate` | Leasing offers only, and a maximum monthly rate in CHF. |
| `electricRangeFrom`, `electricRangeTo`, `batteryCapacityFrom`, `batteryCapacityTo`, `batteryHealthFrom`, `batteryCertificateOnly` | Electric vehicles: range in km, battery capacity in kWh, battery health in %, battery certificate. |
| `engineSizeFrom`, `engineSizeTo`, `cylindersFrom`, `cylindersTo`, `co2EmissionTo`, `consumptionTo`, `emissionClass`, `energyLabel` | Engine size in cm³, cylinders, CO₂ in g/km, consumption in l/100 km, Euro norm (this one or newer), Swiss energy label. |
| `features` | Required equipment: the vehicle must have ALL of the items chosen. |
| `towingCapacityFrom`, `weightTotalTo`, `payloadFrom` | Towing capacity, gross weight and payload in kg (vans, trucks, campers). |
| `qualitySeals`, `excludeMakes`, `onlineSince` | Dealer or manufacturer quality labels (the ids this Actor returns), makes to leave out, listings put online in the last days. |
| `customFilters` | Any other filter of the site, as name and value, with the names the site uses in its search links (the full list of names is in the Tips below). An unknown name stops the run. Added to the filters above; a name set here wins. |
| `sortBy` | Order of the results, `NEWEST` (default) or price, mileage, year, power, make, the site's own order. |
| `postedAfter`, `postedBefore` | Date the listing was first put online: `2026-09-01`, or a period before now (`7 days`, `2 weeks`, `1 month`). |
| `excludeKeywords` | Drop the listings whose title or sales line contains one of these words, e.g. `Export`, `Motorschaden` (case and accents ignored). |
| `minRating`, `requirePhone` | Keep only sellers with at least this Google rating, e.g. `4.5` (sellers without a rating are dropped), or only sellers with a phone number. Both read the seller's profile (1 more page per seller); the numbers are returned only with **Seller phone numbers**. |
| `stateKey`, `onlyNew`, `resetState` | Monitoring: only the listings never delivered under this memory key, e.g. `bmw-zurich`; `resetState` forgets the memory. |
| `includePriceChanges`, `minPriceChangePercent`, `includeRemovedListings` | Need `onlyNew`. Return again a listing whose price changed (ignoring changes below `minPriceChangePercent`), and once a listing that is no longer online. The listings you already have are checked again 20 per page. |
| `language`, `imageSize`, `includeRaw` | Language of the labels and equipment: `en` (default), `de`, `fr` or `it`; photo size; the untouched data of the site in an extra field. |
| Advanced | `proxyConfiguration` (Apify proxy by default, included in the price; the residential proxy is not available), `maxConcurrency`, `maxRequestsPerMinute` (120 by default: every page counts, the extra pages of the options too), `minRequestIntervalMs`, `maxRequestRetries`, `debugLog`. |

### 📦 Output

One listing, shortened (37 of the 153 fields, one photo of 24):

```json
{
    "id": "20930678",
    "url": "https://www.autoscout24.ch/en/d/mazda-3-hatchback-2-5-homura-20930678",
    "title": "MAZDA 3 Hatchback 2.5 Homura",
    "vehicleType": "car",
    "make": "MAZDA",
    "model": "3",
    "country": "CH",
    "condition": "demonstration",
    "price": 28950,
    "currency": "CHF",
    "previousPrice": 31500,
    "priceReduced": true,
    "priceDrop": 2550,
    "priceDropPct": 8.1,
    "firstRegistration": "2025-08-27",
    "firstRegistrationYear": 2025,
    "mileageKm": 8000,
    "powerHp": 140,
    "powerKw": 103,
    "fuelType": "mhev-petrol",
    "transmission": "automatic",
    "accidentFree": true,
    "inspected": true,
    "imageUrl": "https://listing-images.autoscout24.ch/listing/678/20930678/647776023.jpg?w=1280",
    "images": ["https://listing-images.autoscout24.ch/listing/678/20930678/647776023.jpg?w=1280"],
    "imageCount": 24,
    "postalCode": "6440",
    "city": "Brunnen",
    "canton": "sz",
    "sellerId": "64187",
    "sellerName": "ZentralGarage Sutter AG",
    "sellerType": "Dealer",
    "publishedAt": "2026-10-23T07:06:46.431Z",
    "detailsIncluded": false,
    "description": null,
    "searchRank": 1,
    "scrapedAt": "2026-10-23T12:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel. The fields of an option you did not tick are always there, empty (`null`, or `[]` for a list), so every row has the same columns.

#### All 153 fields

| Fields | What you get |
| --- | --- |
| `id`, `url`, `title`, `version` | **Listing**: `20930678`, the public listing page, `MAZDA 3 Hatchback 2.5 Homura`, the version as written by the seller |
| `vehicleType`, `make`, `makeKey`, `makeId`, `model`, `modelKey`, `modelId`, `modelGroup` | **Vehicle**: `car`, `MAZDA`, the site's keys and ids of the make and model (usable in **Make** / **Model**), the model series as the site names it (`3 SERIES` for a 320; empty when the model has none, or is newer than the list of models the Actor ships) |
| `condition`, `conditionLabel` | `new`, `used`, `demonstration`, `oldtimer` or `pre-registered`, and its label in the chosen language |
| `price`, `currency`, `previousPrice`, `priceReduced`, `priceDrop`, `priceDropPct` | **Price**: `28950`, `CHF`, `31500`, `true`, `2550`, `8.1` |
| `leasing`, `leasingRateMonthly`, `financing` | leasing offer `{provider, monthlyRate, url}`, `560.78`, loan offer `{provider, url}` |
| `firstRegistration`, `firstRegistrationYear`, `mileageKm`, `powerHp`, `powerKw` | `2025-08-27`, `2025`, `8000`, `140`, `103` |
| `fuelType`, `fuelTypeLabel`, `transmission`, `transmissionLabel`, `electricRangeKm`, `fuelConsumptionL100km` | `mhev-petrol` and its label, `automatic` and its label, range in km, combined consumption in l/100 km |
| `accidentFree`, `inspected`, `extraSetOfTires`, `newTires`, `warrantyType`, `qualitySeals` | **History**: accident-free, Swiss MFK passed, extra set of tyres, new tyres, warranty (`none`, `from-date`…), quality labels `{id, logoUrl, url}` |
| `placements`, `reservable`, `teaser` | paid promotions of the listing (`top-list`), online reservation possible, the seller's sales line |
| `imageUrl`, `images`, `imageCount` | **Photos**: first photo, every photo at the **Photo size** chosen, number of photos |
| `country`, `postalCode`, `city`, `canton` | **Location**: `CH` or `LI`, `6440`, `Brunnen`, `sz` |
| `sellerId`, `sellerName`, `sellerType`, `sellerLogo`, `sellerStockUrl` | **Seller**: `64187`, dealer name (empty for a private seller), `Dealer` or `PrivateSeller`, logo, page of all its vehicles |
| `publishedAt`, `modifiedAt`, `daysOnline` | **Dates**: first put online (what the date filters read), last change by the seller, whole days online |
| `detailsIncluded`, `description`, `listPrice`, `bodyType`, `bodyTypeLabel`, `exteriorColor`, `metallic`, `interiorColor`, `doors`, `seats`, `gears`, `cylinders`, `cylinderArrangement`, `cubicCapacityCc`, `driveType`, `driveSystem` | **Listing details**: whether the full listing was read, the seller's description, catalogue price when new, body type, colours, metallic paint, doors, seats, gears, cylinders and their layout, engine size in cm³, drive |
| `co2EmissionsGKm`, `emissionClass`, `energyLabel`, `fuelConsumptionUrbanL100km`, `fuelConsumptionExtraUrbanL100km`, `electricConsumptionKwh100km` | **Listing details**: CO₂ in g/km, Euro norm (`euro-6d`), Swiss energy label (`a` to `g`), urban and extra-urban consumption, kWh/100 km |
| `batteryCapacityKwh`, `batteryHealthPct`, `batteryCertificateUrl`, `chargingPlugType`, `chargingPowerKw`, `chargingTime0To80Min`, `chargingTime0To100Min`, `fastChargingPlugType`, `fastChargingPowerKw`, `fastChargingTime0To80Min`, `fastChargingTime0To100Min`, `electricMotorHp`, `combustionEngineHp` | **Listing details**: battery capacity, battery health, battery certificate, AC and DC charging plug, power and times, electric and combustion engine power |
| `lengthMm`, `widthMm`, `heightMm`, `emptyWeightKg`, `totalWeightKg`, `payloadKg`, `towingCapacityKg`, `bootVolumeL`, `numberOfAxles`, `numberOfBeds`, `licenseCategory` | **Listing details**: dimensions, weights, payload, towing capacity, load volume in litres (vans, trucks, trailers; the site gives cubic metres), axles, sleeping berths, driving licence needed |
| `lastInspectionDate`, `typeApprovalNumber`, `warrantyMonths`, `warrantyMileageKm`, `warrantyStartDate`, `warrantyDetails` | **Listing details**: last MFK inspection, Swiss type approval number (not a VIN), warranty duration, mileage, start and text |
| `tuned`, `racingVehicle`, `handicappedAccessible`, `directImport`, `availableForExchange`, `listingStatus`, `dealerStockNumber`, `documents`, `videoUrl`, `vehicleReportUrl` | **Listing details**: tuned, racing vehicle, adapted for disabled people, direct import, trade-in accepted, status of the listing, the seller's own reference, documents, video, history report link |
| `equipmentIncluded`, `features`, `optionalExtras`, `featureIds` | **Equipment list**: whether it was read, standard equipment, paid options `{name, packageItems}`, the site's equipment keys (usable in **Required equipment**) |
| `dealerProfileFetched`, `street`, `sellerWebsite`, `sellerAbout`, `sellerContactPerson`, `sellerOpeningHours` | **Seller profiles**: whether the profile was read, street address, website, the seller's presentation, contact person, opening hours `{day, hours}` |
| `sellerRating`, `sellerRatingCount`, `sellerGooglePlaceId`, `sellerGoogleMapsUrl`, `sellerReviews`, `sellerListingCount` | **Seller profiles**: Google rating and number of ratings, Google place and its Maps link, latest reviews `{author, date, rating, text}`, number of vehicles the seller has online |
| `latitude`, `longitude`, `coordinatesSource` | **Seller profiles**: where the seller is — the point the seller set in its profile (`seller-profile`), otherwise the centre of its postcode (`postcode`) |
| `sellerPhone`, `sellerPhones`, `sellerFax` | **Seller phone numbers**: main number, every number with its type (`business`, `private`, `fax`), fax |
| `changeType`, `lastDeliveredPrice`, `priceChange`, `priceChangePct`, `priceChangedAt`, `removedAt` | **Monitoring**: `NEW`, `PRICE_CHANGED` or `REMOVED`, the price last delivered, the change in CHF and in %, when it was seen |
| `searchUrl`, `searchQuery`, `searchRank`, `raw`, `scrapedAt` | the search that found the listing and its place in it, the untouched data of the site (**Include raw data**), ISO timestamp |

### 💡 Tips

#### How to get more results

Set **Max listings** to `0` and leave the vehicle filters you do not need empty. A search of a whole section is read to its last page. To follow the market, keep **Sort by** on **Newest first**, tick **Only new listings** and schedule the Actor.

#### How to reduce costs

The price is per listing, so the levers are `maxItems`, `maxItemsPerQuery`, the vehicle filters (applied by the site: a vehicle that does not match is never read, never charged) and `onlyNew` for recurring runs (you never pay twice for the same listing). Tick an option only when you need its fields: each one is charged on its own and adds pages to read.

#### What each option adds

| Option | Pages read in addition | Charged |
| --- | --- | --- |
| **Listing details** | 1 per listing | per listing |
| **Equipment list** | 1 per listing (2 with **Listing details**) | per listing with equipment |
| **Seller profiles** | 2 per seller and per run (profile, then its number of vehicles) | once per seller and per run, when the profile and its number of vehicles are both read (a seller whose number of vehicles could not be read is not charged for its profile) |
| **Seller phone numbers** | 1 per seller and per run, shared with **Seller profiles** | per listing with a number |
| **With phone only**, **Min seller rating** | 1 per seller and per run, shared with the two above | filter fee per listing dropped |
| **Report price changes**, **Report removed listings** | 1 per 20 listings checked again, plus 1 per listing missing from them | price check per listing checked |

A seller's profile is read once per run, however many of its vehicles are found. A listing dropped by **With phone only** or **Min seller rating** does not read its equipment.

#### Several searches in one run

Fill `searchQueries` and / or `locations`: the Actor runs one search per make / model text × location, plus one per seller of `sellerIds` (3 texts × 4 towns = 12 searches, up to 500 per run). The single `query` and `location` fields still work and are added to the lists, and **Make** / **Model** too. 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.

#### Monitoring: new listings, price changes, removed 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-ch-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 early once it meets a long run of listings you already have.

Tick **Report price changes** and / or **Report removed listings** as well, and each run also checks again the listings you already have under this key, newest first, at most **Max listings** of them (raise it to follow older ones; a run the search already filled checks none, and says so):

- a listing whose price changed comes back whole, with `changeType` = `PRICE_CHANGED`, the price last delivered and the change in CHF and in % (**Min price change** ignores the small ones);
- a listing that is no longer online (sold or withdrawn) comes back once as a short row, `changeType` = `REMOVED`, with the date it was seen gone and the fields last delivered; it then leaves the memory for good: if the same listing comes back online later, it is not returned again under this key;
- the listings delivered for the first time have `changeType` = `NEW`.

The price follow-up covers up to 200,000 listings per key; beyond it a new listing is delivered but not followed.

Each listing checked again costs a small **Price check**, shared by the two options; a listing whose page cannot be read is not counted as removed and stays followed.

#### Filter by publication date

`postedAfter` and `postedBefore` take a date (`2026-09-01`, the whole day is included, Swiss 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 date the listing was first put online (a later change by the seller does not count). Filtered-out listings are not saved and do not count in `maxItems` (each listing dropped costs the filter fee, see Pricing); the run summary tells how many were filtered. With **Sort by** on **Newest first**, searches stop at the first page that is entirely too old. **Online since** is the site's own filter on the same date, in whole days.

#### Other AutoScout24.ch filters

`customFilters` takes any filter of the site's search, with the names the site uses in its search links, e.g. `{"licenseCategories": ["a1"], "sleepingBerthsFrom": 4, "tunedOnly": true}`. The 99 names it accepts: `ageFrom`, `availableForExchangeOnly`, `axisFrom`, `axisTo`, `batteryCapacityFrom`, `batteryCapacityTo`, `batteryHealthPercentageFrom`, `batteryHealthPercentageTo`, `bodyColors`, `bodyTypes`, `co2EmissionFrom`, `co2EmissionTo`, `conditionTypeGroups`, `conditionTypes`, `consumptionCombinedFrom`, `consumptionCombinedTo`, `cubicCapacityFrom`, `cubicCapacityTo`, `cylindersFrom`, `cylindersTo`, `doorsFrom`, `doorsTo`, `driveSystems`, `driveTypes`, `excludingBodyColors`, `emissionStandards`, `energyLabels`, `equipmentSearchAttributeGroups`, `excludingEquipmentSearchAttributeGroups`, `equipmentSearchAttributes`, `excludingEquipmentSearchAttributes`, `excludingMakeModelVersions`, `firstRegistrationYearFrom`, `firstRegistrationYearTo`, `fuelTypeGroups`, `fuelTypes`, `furnitureTransporterOnly`, `geoLocation`, `hadAccidentOnly`, `hadNoAccidentOnly`, `handicappedAccessibleOnly`, `hasAdditionalSetOfTiresOnly`, `hasBatteryCertificateOnly`, `hasImagesOnly`, `hasCraneOnly`, `hasLeasingOnly`, `hasNewTiresOnly`, `hasRestrictorKit25KwOnly`, `hasRestrictorKit35KwOnly`, `hasTailLiftOnly`, `hasTarpaulinOnly`, `hasWinchOnly`, `hasWarrantyOnly`, `horsePowerFrom`, `horsePowerTo`, `ids`, `inspectedOnly`, `interiorColors`, `excludingInteriorColors`, `kiloWattsFrom`, `kiloWattsTo`, `leasingMonthlyRateFrom`, `leasingMonthlyRateTo`, `lengthFrom`, `lengthTo`, `licenseCategories`, `makeModelVersions`, `metallicOnly`, `mileageFrom`, `mileageTo`, `payloadFrom`, `payloadTo`, `priceFrom`, `priceTo`, `qualiLogoIds`, `racingVehicleOnly`, `rangeFrom`, `rangeTo`, `refrigeratorOnly`, `restrictorKit25KwApplicableOnly`, `restrictorKit35KwApplicableOnly`, `schoolBusOnly`, `seatsFrom`, `seatsTo`, `sellerIds`, `sellerTypes`, `sleepingBerthsFrom`, `sleepingBerthsTo`, `towingCapacityBrakedFrom`, `towingCapacityBrakedTo`, `transmissionTypeGroups`, `transmissionTypes`, `transporterOnly`, `tunedOnly`, `vehicleCategories`, `weightCurbFrom`, `weightCurbTo`, `weightTotalFrom`, `weightTotalTo`. An unknown name stops the run (the site would silently ignore it and return everything); `pagination` and `sort` are refused (use **Sort by** and the caps).

### 🔌 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.ch or MotoScout24.ch vehicle listing. Actor id: `nice_dev/autoscout24-ch-listings-scraper`; MCP server with this Actor only: `https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/autoscout24-ch-listings-scraper`.

Smallest input, for a cheap first call:

```json
{
    "make": "BMW",
    "maxItems": 10
}
```

Key output fields: `url`, `title`, `price`, `previousPrice`, `mileageKm`, `firstRegistrationYear`, `powerHp`, `fuelType`, `city` and `sellerName`.

Cost: per listing saved plus a small fee per run start, the options on top; the current prices are in the Pricing tab, 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.ch?

The Actor only reads what AutoScout24.ch and MotoScout24.ch show publicly to any anonymous visitor. It logs in to nothing. Results can contain personal data — a private seller's first name and phone number, with the seller options — which is protected by the Swiss nFADP and the GDPR: do not store it without a legitimate reason. You are responsible for using the data in compliance with AutoScout24.ch's Terms of Use and applicable law. This Actor is not affiliated with AutoScout24.ch, MotoScout24.ch or SMG Swiss Marketplace Group.

#### 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).

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

Titles, sales lines and descriptions are the sellers' own words, copied as they are. A text can begin with `-`, `+`, `=` or `@` (a phone number, a sales line 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

- AutoScout24.ch has no free-text search: `query` takes a make and model, and a text that matches no make stops the run with the closest names. Site filters that are not in the form can still be used through `customFilters` or by pasting a filtered search URL into `startUrls`.
- autoscout24.de, .at, .it… are another platform: their links are not supported.
- The fields of an option are empty when the option is off (`description` and the full specs without **Listing details**, for example).
- No e-mail address and no VIN: the site does not show them. Phone numbers come from the seller's profile only, and some private sellers' numbers are hidden by the site: such a listing has no number (and no **Phone number found** charge).
- GPS coordinates are the point the seller set in its profile, which few sellers do; otherwise the centre of the seller's postcode (`coordinatesSource` says which). AutoScout24.ch shows at most 5 Google reviews per seller.
- `onlyNew` alone remembers listing ids, not their content: tick **Report price changes** to get a listing again when its price changes.
- Two runs sharing the same `stateKey` at the same time may both return the same new listing.
- **Max requests per minute** counts every page the run reads, the extra pages of the options included. Keep the default (120) unless the log shows HTTP 429 or 403. With several options on, and more so with a lower value, the extra pages (equipment list, seller profile, seller's number of vehicles) wait for their turn: one that cannot get it in time is put off to a later minute, and the listing is not read again. The exception is a run that asks for seller profiles or phone numbers without Listing details or Equipment list: there a seller page that cannot get its turn in time is skipped, and that listing's seller profile, phone number or number of vehicles may stay empty.

**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).

**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. The check of the listings delivered before (price changes, removals) goes on from where it stood at that same moment: a price change or a removal already saved is not reported again, but the listings it checked in its last minute without a change are checked, and charged a **Price check**, once more.
- 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. The prices followed for **Report price changes** are saved once a minute: left stopped for good, a change or a removal reported in its last minute may be reported once more by the next run (resurrect the stopped run and they are put back first).

#### Something doesn't work?

The last line of the log counts the listings saved, filtered out and no longer on AutoScout24.ch (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.ch 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, publication date, make, vehicle type, seller or price, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first listings are charged. 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.ch or motoscout24.ch links, pasted as they are in your browser: a search (`https://www.autoscout24.ch/de/s/mo-320/mk-bmw?priceTo=30000…`, every filter set on the site is kept, motoscout24.ch links search motorbikes), a listing (`https://www.autoscout24.ch/de/d/bmw-320-…-20930678`) or a seller page (`https://www.autoscout24.ch/de/s/seller-64187` = all its vehicles). When this list is not empty, the search fields below (vehicle type, make, model, locations) and the **Vehicle filters** are ignored: set them on the site before copying the link (the one exception: the searches of **Dealers / sellers** keep the Vehicle filters). The Actor's own filters (dates, words to exclude, phone only, rating), the caps and monitoring still apply. autoscout24.de / .at / .it… are another platform, not supported here. Max 1 000 URLs.

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

The section to search. Motorbikes are the listings of motoscout24.ch (same Swiss marketplace). Some filters below exist only for some vehicle types (a filter a section does not use returns no listing or is ignored by the site; the run log says so).

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

Make as written on AutoScout24.ch, e.g. `BMW`, `Volkswagen`, `Mercedes-Benz` (case and accents ignored), or its site key (`mercedes-benz`). 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.ch: a single model (`320`, `Golf`) or a model series (`3 Series`, `1-series` = all its models), or its site key. Needs **Make**. Empty = all models of the make.

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

A make and model typed as one text, e.g. `BMW 320`, `Tesla Model 3`, `VW Golf`, `Audi` (make alone = all its models). AutoScout24.ch has NO free-text keyword search (it only searches by make / model and filters): the text is matched to the site's makes and models, and a text that matches no make stops the run with the closest names. Searched in addition to **Make** / **Model**.

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

Several make + model searches in one run, one per line: `BMW 3 Series`, `Audi A4`, `Tesla` (same rules as **Make + model (text)**). Each line is a separate search (times each location below, max 500 searches); a listing found by several searches is saved once.

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

Where to search, in Switzerland or Liechtenstein: a postcode (`8001`), a town (`Lausanne`, `Zürich`) or a canton (`Vaud`, `VD`, `Ticino`), or GPS coordinates `47.37,8.54` (turned into their postcode). Postcode, town and GPS use **Radius**; a canton is searched whole. Empty = all of Switzerland.

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

Several locations in one run: every make / model search is run in every location (3 models × 4 locations = 12 searches, max 500). Added to **Location**.

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

Distance around a postcode or town, in km (a canton is always searched whole).

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

Every vehicle of these sellers: the seller id this Actor returns (`sellerId`, e.g. `64187`) or a seller page URL (`https://www.autoscout24.ch/de/s/seller-64187`). Each seller is one search; the vehicle filters below still apply.

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

Fetch these listings directly, by id (`20930678`) or listing URL. Always added to the searches above; read 20 at a time. A listing no longer online gives no row: it is noted in the run log and listed in the FAILED_REQUESTS record. Only a listing you already received under the same **Memory key** (**Only new listings** with **Report removed listings**) comes back, once, as a REMOVED row.

## `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 × location, seller, or start URL), so that the first search cannot use up the whole **Max listings** budget. 0 = no per-search cap.

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

Add the full listing: seller's description, original list price (new), body type, colours, doors, seats, gears, cylinders, engine size, CO₂, Euro norm, energy label, detailed consumption, every electric vehicle figure (battery, charging, battery certificate), dimensions and weights, towing capacity, last MFK inspection date, warranty details, type approval number, documents and video. 1 extra request per listing, charged per listing as **Listing details**, on top of the listing (see Pricing). Off = the main fields of the search: price, previous price, leasing, year, mileage, power, fuel, gearbox, range, consumption, accident, MFK, warranty type, all photos, seller and dates.

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

Add every equipment item of the vehicle (`features`: standard equipment, `optionalExtras`: paid options with their package contents, `featureIds`: the site's equipment keys), in the **Language** chosen. 1 extra request per listing, charged per listing with equipment as **Equipment list**, on top of the listing (see Pricing); a listing without equipment costs nothing extra.

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

For each seller, read its profile once per run: street address, website, description, opening hours, contact person (first name only for a private seller), number of vehicles for sale, Google place with its rating and, with **Reviews per seller**, its latest Google reviews, and GPS coordinates (the point the seller set in its profile, otherwise the centre of its postcode, `coordinatesSource` says which). 2 extra requests per seller (the profile, then its number of vehicles for sale), charged per seller as **Seller profile** (see Pricing); a seller whose number of vehicles could not be read is not charged.

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

With **Seller profiles**: also return up to this many of the seller's latest Google reviews (`sellerReviews`: author, date, rating, text). AutoScout24.ch shows at most 5 per seller. Included in the **Seller profile** charge. 0 = no reviews.

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

Fill `sellerPhone`, `sellerPhones` (each number with its type: business, private, fax) and `sellerFax`. Read from the seller profile (1 extra request per seller, even when **Seller profiles** is off, then not charged as a profile). Charged per listing delivered with at least one number, as **Phone number found** (see Pricing); a listing without a number costs nothing extra. Private sellers' numbers are personal data: you are responsible for how you use them (Swiss nFADP / GDPR). Off = the phone fields are always empty.

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

Lowest price in Swiss francs.

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

Highest price in Swiss francs.

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

Registered in this year or later.

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

Registered in this year 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** (AutoScout24.ch shows horsepower first).

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

Keep any of these fuels. Empty = all.

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

Keep any of these gearboxes. Automatic = every automatic gearbox (classic, CVT, semi-automatic). Empty = all.

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

Keep any of these body types (cars, motorbikes, motorhomes, vans and trailers each use their own). Empty = all.

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

Keep any of these conditions. Empty = all.

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

Dealers, private sellers, or both.

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

Keep any of these colours. Empty = all.

## `metallicOnly` (type: `boolean`):

Only vehicles with metallic paint.

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

Keep any of these interior colours. Empty = all.

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

At least this many doors.

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

At most this many doors.

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

At least this many seats.

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

At most this many seats.

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

Keep any of these drive types. Empty = all.

## `warrantyOnly` (type: `boolean`):

Only vehicles sold with a warranty.

## `accidentHistory` (type: `string`):

Keep accident-free vehicles only, or vehicles that had an accident only.

## `inspectedOnly` (type: `boolean`):

Only vehicles with a valid Swiss roadworthiness test (MFK / expertisé / collaudato).

## `withImagesOnly` (type: `boolean`):

Only listings with at least one photo.

## `extraTiresOnly` (type: `boolean`):

Only vehicles sold with a second set of tyres.

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

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

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

Highest monthly leasing rate, in Swiss francs (listings with a leasing offer).

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

Electric vehicles: at least this range, in km.

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

Electric vehicles: at most this range, in km.

## `batteryCapacityFrom` (type: `integer`):

Electric vehicles: battery of at least this size.

## `batteryCapacityTo` (type: `integer`):

Electric vehicles: battery of at most this size.

## `batteryHealthFrom` (type: `integer`):

Electric vehicles: battery state of health (SoH) of at least this percentage.

## `batteryCertificateOnly` (type: `boolean`):

Electric vehicles: only listings with a battery health certificate.

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

Lowest engine displacement.

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

Highest engine displacement.

## `cylindersFrom` (type: `integer`):

At least this many cylinders.

## `cylindersTo` (type: `integer`):

At most this many cylinders.

## `co2EmissionTo` (type: `integer`):

At most this CO₂ emission, in g/km.

## `consumptionTo` (type: `integer`):

At most this combined consumption, in l/100 km (whole number).

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

This Euro emission standard or a newer one (e.g. Euro 6 also keeps Euro 6a … 6e).

## `energyLabel` (type: `string`):

This Swiss energy-efficiency label or a better one (A = best).

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

Keep only vehicles with ALL of these equipment items (the site's own list; measured 23/10: tow bar + head-up display = fewer listings than each alone). Empty = no requirement.

## `towingCapacityFrom` (type: `integer`):

Braked towing capacity of at least this weight.

## `weightTotalTo` (type: `integer`):

Gross vehicle weight of at most this value, e.g. 3500 for motorhomes and vans driven with a car licence (B).

## `payloadFrom` (type: `integer`):

Vans, trucks and motorhomes: payload of at least this weight.

## `handicappedAccessibleOnly` (type: `boolean`):

Only vehicles adapted for disabled drivers or passengers.

## `availableForExchangeOnly` (type: `boolean`):

Only listings whose seller accepts a vehicle in exchange.

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

Only used vehicles carrying one of these dealer / manufacturer quality labels, by the label id this Actor returns in `qualitySeals` (e.g. `37`). Empty = all.

## `excludeMakes` (type: `array`):

Leave out these makes (name or site key, as in **Make**), filtered by the site.

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

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

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

Any other filter of the AutoScout24.ch search, as `name: value`, with the names the site uses in its search links: e.g. `{"licenseCategories": ["a1"], "sleepingBerthsFrom": 4, "tunedOnly": true, "excludingBodyColors": ["white"]}`. The README lists every name (99). An unknown name stops the run (the site would silently ignore it and return everything). `pagination` and `sort` are refused (use **Sort by** and the caps). Added to the filters above; a name set here wins.

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

Order in which the listings are read. With a cap, the order decides WHICH listings you get. Newest first is the default and the one used to stop early with **Only new listings**. Every order is completed with newest first, so that no listing is skipped or repeated across pages.

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

Only listings first put online on AutoScout24.ch on or after this date (`publishedAt`, not a later change): `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 (make, model, version) or teaser contains one of these words (case and accents ignored), e.g. `Export`, `Motorschaden`, `défectueux`, or a version 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 (read from the seller profile: 1 extra request per seller). Works on its own: the numbers are returned (and charged) only when **Seller phone numbers** is ticked.

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

Keep only listings of sellers whose Google rating shown on AutoScout24.ch (`sellerRating`, 1 to 5) is at least this value, e.g. `4.5` (read from the seller profile: 1 extra request per seller); sellers 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. `bmw-zurich`) 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). The listings already delivered are re-checked 20 at a time, each charged a small **Price check** (see Pricing), up to **Max listings** re-checked.

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

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

## `includeRemovedListings` (type: `boolean`):

Needs **Only new listings**. A listing already delivered under this **Memory key** that is no longer online (sold or withdrawn) comes back once as a short row: `changeType` = `REMOVED`, `removedAt`, its last price and the fields last delivered. Each listing re-checked is charged a small **Price check** (see Pricing), shared with **Report price changes** (a listing is re-checked once for both).

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

Language of the labels (fuel, body, condition, gearbox), of the equipment names and of the listing URLs. The codes and numbers are the same in every language and the listings found do not depend on it; the seller's description is never translated.

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

Width of the photo URLs returned (every photo of the listing is returned).

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

Add a `raw` field with the untouched JSON of AutoScout24.ch for the listing (search result, plus the full listing with **Listing details**). Seller phone numbers and a private seller's name are never in it. 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.

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

Maximum number of requests processed in parallel.

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

Most requests to the site in any 60 seconds, every one counted on its own: results pages, listing pages, and the extra pages read for a listing (its equipment page when **Listing details** and **Equipment list** are both ticked, its seller's profile). A budget, not an even pace: up to this many can leave at once when the minute starts (spread them with the minimum delay below). Lower it if the site answers HTTP 429 / 403 in the log.

## `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": "car",
  "make": "BMW",
  "model": "320",
  "searchQueries": [],
  "locations": [],
  "radiusKm": 20,
  "sellerIds": [],
  "listingIds": [],
  "maxItems": 100,
  "maxItemsPerQuery": 0,
  "extractDetails": false,
  "includeEquipment": false,
  "includeDealerProfiles": false,
  "reviewLimit": 0,
  "includePhones": false,
  "powerUnit": "hp",
  "fuelTypes": [],
  "transmission": [],
  "bodyTypes": [],
  "condition": [],
  "sellerType": "ANY",
  "exteriorColors": [],
  "metallicOnly": false,
  "interiorColors": [],
  "driveType": [],
  "warrantyOnly": false,
  "accidentHistory": "ANY",
  "inspectedOnly": false,
  "withImagesOnly": false,
  "extraTiresOnly": false,
  "leasingOnly": false,
  "batteryCertificateOnly": false,
  "features": [],
  "handicappedAccessibleOnly": false,
  "availableForExchangeOnly": false,
  "qualitySeals": [],
  "excludeMakes": [],
  "customFilters": {},
  "sortBy": "NEWEST",
  "excludeKeywords": [],
  "requirePhone": false,
  "onlyNew": false,
  "stateKey": "default",
  "resetState": false,
  "includePriceChanges": false,
  "minPriceChangePercent": 0,
  "includeRemovedListings": false,
  "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": "320",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nice_dev/autoscout24-ch-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": "320",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nice_dev/autoscout24-ch-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": "320",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nice_dev/autoscout24-ch-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-ch-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/gmkMjQxuz1waMtXya/builds/XUi6QFCRgNVCUNrhD/openapi.json
