# AutoScout24 Scraper: EU Car Listings & Prices (`automation_craft/autoscout24-scraper`) Actor

Pull AutoScout24 car, motorbike, van and caravan ads from 8 EU countries on 11 sites, no login, beyond 4,000 rows a search. Rows hold price, price rating, mileage, first registration, kW, fuel, gearbox, dealer phones, English codes. Alerts for new ads; Excel, JSON or API; pay per listing.

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

## Pricing

from $0.14 / 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

### AutoScout24 Scraper: EU Car Listings & Prices

**AutoScout24 Scraper** turns AutoScout24, the European vehicle marketplace, into clean rows: one row per ad with the
price, AutoScout24's own price rating, mileage, first registration, power in kW and hp, fuel, gearbox, engine size,
consumption and CO2, the place, and the seller (a dealer's name, contact person, phones and star rating). It reads the 11
AutoScout24 sites (.de, .at, .it, .nl, .fr, .lu, .es, .com, .pl, .ro, .bg) and the 8 seller countries they list (Germany,
Austria, Belgium, Spain, France, Italy, Luxembourg, the Netherlands), for cars, motorbikes, vans and caravans. Search by make
and model, keyword, postcode or coordinates with a radius, or a dealer's whole stock, paste search links from any of the
sites, or give ad links. No login, no browser.

Every row carries AutoScout24's coded values in English (`fuel`, `gearbox`, `condition`, `priceRating`) next to the words of
the site you searched, so a run on AutoScout24.it and one on AutoScout24.de give the same values. Searches larger than
AutoScout24's 4,000 row limit are split into price slices on their own. Turn on **Listing details** for the description,
equipment, previous owners, accident flag, warranty, VAT and net price, and **Dealer profiles** for a dealer's rating,
reviews and imprint with its e-mail address and VAT id. Name a **monitor** and schedule the Actor: each run delivers and
bills only ads it has not delivered before, tracks price drops and removed ads, and can send them to Telegram, Slack,
Discord, WhatsApp or your webhook.

#### Who uses it

- **Traders and exporters** comparing one model across Germany, Italy, France, Spain and the Benelux, with net prices and
  VAT where a business buyer can deduct it.
- **Dealers** watching other dealers' stock and prices in a region, and checking where an ad sits against AutoScout24's price rating.
- **Lead and market teams** reading a dealer's whole stock, its rating, phones and, with Dealer profiles, its e-mail address,
  VAT id and reviews.
- **Analysts and valuation tools** who need AutoScout24 as rows in JSON, CSV or Excel with the same English codes for every
  country, through the Apify API.

#### Features

| Feature | Settings | Event billed |
|---|---|---|
| Makes and models by name ("Volkswagen Golf", "BMW 3er", "Volkswagen Golf (all)" for a model line, "Volkswagen Golf / GTI" for a version text) or id; 295 car makes in a pick list | `makeModels`, `makes` | Listing |
| AutoScout24's own keyword search | `keywords` | Listing |
| 4 vehicle types: car, motorbike, van, caravan | `vehicleType` | Listing |
| 11 sites, each in its own language; 8 seller countries | `site`, `countries` | Listing |
| Postcodes of the 8 countries with their country, or coordinates, with a radius of 1 to 1,000 km | `locations`, `radiusKm` | Listing |
| A dealer's whole stock from its dealer page link, or a dealer's stock within the makes you name | `dealers` | Listing |
| Pasted AutoScout24 search links from any site, every parameter checked | `searchUrls` | Listing |
| Single ads by link or id, read with their details | `adUrls` | Listing by URL |
| Named filters: fuel, gearbox, body type, condition, seller type, price, first registration, mileage, power (kW or hp), exterior and interior colour, upholstery, paint, cylinders, drive, price rating, equipment (136 items), quality seals, seats, doors, engine size, electric range, previous owners, online within days, emission class, German emission sticker, battery, damaged cars, online sale ads, VAT deductible, leasing, price reduced, suitable for new drivers | see Input | no charge |
| Any other AutoScout24 filter by its own parameter name | `filters` | no charge |
| Row filters: words to keep or leave out, an online since window, ads you already have, custom rules on 36 output fields | `includeKeywords`, `excludeKeywords`, `postedWithinHours`, `postedWithinDays`, `postedAfter`, `postedBefore`, `excludeAdIds`, `customFilters` | no charge |
| 12 sorts, caps per run, per search and in pages, a start page | `sort`, `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `startPage` | no charge |
| Past 4,000 rows a search: price slices planned with count calls | `splitLargeSearches` (on) | no charge |
| Continue an interrupted run without paying for an ad twice | `resumeFromDatasetId` | no charge |
| Description, equipment by category, body, colours, seats, doors, gears, cylinders, drive, weight, emission class, previous owners, accident flag, service history, inspection, warranty, VAT rate and net price, history report link, coordinates, the date the ad went online; a dealer's address, phones, WhatsApp, opening hours and rating breakdown | `includeDetails` | Listing details |
| A dealer's AutoScout24 page, once per dealer per run: rating, reviews, imprint with e-mail address and VAT id, opening hours, contact persons, services | `includeDealerProfiles`, `maxDealerReviews` | Dealer profile |
| A monitor: only ads new to it, run after run | `monitorName` | Listing (new ads only) and Results page |
| Price and field changes, removed and reappeared ads | `trackChanges`, `trackFields` (with a monitor) | Listing update |
| Every known ad again as a full snapshot; reposts marked or left out | `emitUnchanged`, `markReposts`, `skipReposts` | Listing (snapshot rows) |
| Notifications: Telegram, Slack, Discord, WhatsApp Cloud API, webhook (HMAC SHA-256 signature, extra headers) | see The monitor and notifications | free |
| English codes on every row next to the site's own labels; prices also in one of 15 other currencies at the European Central Bank's rate of the day | always, `currency` | included |
| Image size, description format and length, compact rows, empty fields left out | `imageSize`, `descriptionFormat`, `descriptionMaxLength`, `compactOutput`, `excludeEmptyFields` | included |
| A private seller's phone, WhatsApp number and exact coordinates (off by default) | `includePersonalData` | free |
| A coverage row per search, free status rows for misses, a run summary and an HTML run report (key `REPORT`) | always | free |

### Quick start

1. Type a make and model (for example `Volkswagen Golf`, `BMW 3er` or `Fiat 500`).
2. Pick the seller countries (Germany is preset) and, if you like, a postcode with its country (`10115, DE`, `20121, IT`)
   and a radius.
3. Optional: pick filters (fuel, gearbox, price, first registration, mileage, power, seller type, price rating).
4. Set **Maximum listings** and press **Start**.
5. Download the rows as JSON, CSV or Excel, or read them through the API.

Example input, the Actor's own prefill:

```json
{
    "makeModels": ["Volkswagen Golf"],
    "countries": ["DE"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": true }
}
```

Dealer offers of the BMW 3 series from Italy, 2020 or newer, under 60,000 km, with a very good or good price rating and
the details:

```json
{
    "makeModels": ["BMW 3er"],
    "countries": ["IT"],
    "sellerType": "dealer",
    "yearMin": 2020,
    "mileageMax": 60000,
    "priceRatings": ["very_good_price", "good_price"],
    "includeDetails": true,
    "maxItems": 200
}
```

Every car of one dealer, read from its dealer page:

```json
{
    "dealers": ["https://www.autoscout24.de/haendler/tk-autos"],
    "maxItems": 100
}
```

### What you get

One row per ad (`type: "listing"`), one coverage row per search (`type: "search"`), free status rows for anything that did
not end as a listing (`type: "status"`), with change tracking a removed row per ad a monitor no longer finds
(`type: "removed"`), and one run summary at the end (`type: "summary"`).

#### Listing fields

Fill rates were measured on a 3,400 row platform run on 2026-10-15 (Volkswagen Golf, seller country Germany, AutoScout24.de,
newest first: 3,024 dealer and 376 private rows; `includePersonalData` off).

| Field | What it holds | Filled |
|---|---|---|
| `adId`, `url`, `urlInternational`, `title`, `subtitle` | AutoScout24's ad id, the ad's link on the searched site and on AutoScout24.com, the title and subtitle | 100 % (subtitle 11.9 %) |
| `make`, `model`, `modelGroup`, `variant`, `version`, `motorType` | make, model and model line as AutoScout24 lists them, the variant, the seller's version text and the engine | 100 % (version 99.8 %) |
| `vehicleType`, `condition`, `conditionCode` | car, motorbike, van or caravan; new, used, pre owned approved and the other offer types, with the site's code | 100 % |
| `price`, `currency`, `previousPrice`, `conditionalPrice` | the price in euros, the price before a reduction, AutoScout24's conditional price flag | price 100 %, previous price 0.3 % |
| `priceRating`, `priceRatingLabel`, `priceRatingSiteLabel`, `priceEvaluation` | AutoScout24's price rating as an English code (`very_good_price` to `high_price`, `price_too_low`, `no_rating`), its English label, the label in the site's language, the site's number | code 100 %, a rating other than `no_rating` 84.3 % |
| `mileageKm`, `firstRegistration`, `firstRegistrationYear` | kilometres, month and year of first registration | 99.6 %, 93.9 % |
| `powerKw`, `powerHp`, `fuel`, `fuelCode`, `fuelLabel`, `gearbox`, `gearboxLabel` | engine power; fuel and gearbox as English codes and in the site's words | 100 % (gearbox 99.9 %) |
| `engineSizeCcm` | displacement | 96.2 % |
| `consumption`, `consumptionUnit`, `consumptionText`, `co2GramsPerKm`, `co2Text`, `electricType` | combined consumption and CO2 as AutoScout24 shows them | 49.9 to 51.7 %; electric type 4.7 % |
| `country`, `postcode`, `city`, `street` | the vehicle's place; the street for dealers only | 100 %; street on 2,915 of 3,024 dealer rows |
| `sellerType`, `sellerId` | dealer or private, the seller's id (the same on every ad of one seller) | 100 % |
| `dealerName`, `dealerContactName`, `dealerPhones`, `dealerRating`, `dealerRatingCount`, `dealerPage` | a dealer's name, contact person, phone numbers (office, mobile, WhatsApp), stars, number of ratings and dealer page link | on dealer rows: name and page 100 %, contact 98.1 %, phones 86.6 %, rating 84.3 % |
| `privateSellerPhones` | a private seller's phones, only with `includePersonalData` | 0 % in this run (off) |
| `image`, `images`, `imageCount` | the first photo, the photos the search row carries, their number | 99.1 %, count 100 % (median 16) |
| `hasVideo`, `onlineSale`, `availableNow`, `availableFrom`, `leadsRange`, `seals` | video, sold through AutoScout24's online shop, availability, AutoScout24's leads band (`Zero`, `Some`, `Many`, `VeryMany`), quality seals | 100 %; available now 95.6 %, from 1.9 %, seals 11.0 % |
| `placement` | `organic` (a result in the search's own order) or `promoted` (a row AutoScout24 inserts at the top of a block of results) | 20 of 20 on the later prefill run (added after this run) |
| `missingFields` | the core fields (price, mileage, registration, power, fuel, gearbox, postcode, city, image) the source left empty on this ad | empty on 92.9 % of rows |
| `converted` | with `currency`: the price converted, the rate, its date and source | with a currency other than EUR |
| `searchKey`, `searchLabel`, `searchPage`, `searchSlice`, `searchPosition`, `source`, `site`, `monitorName`, `deliveryId`, `scrapedAt` | what found the ad (`search`, or `adUrl` for ad links), the search, its page, price slice and position, the site, when the row was made | set by the Actor |
| `detailsIncluded`, `dealerProfileCharged`, `pageCharged` | whether this row's details were read and billed, whether it carried the dealer's one charged profile, whether it carried its page's Results page charge | set by the Actor |
| `change`, `possibleRepostOf` | with a monitor: what changed since the last delivery; an earlier ad id of the same vehicle | monitor runs |

#### Listing details (`includeDetails`, and every ad link)

Measured on a 100 row platform run with details on 2026-10-15 (BMW 3 series, seller country Italy, AutoScout24.de: 64 dealer
and 36 private rows).

| Field | What it holds | Filled |
|---|---|---|
| `description` (and `descriptionHtml`, `descriptionMarkdown` by `descriptionFormat`) | the seller's full text | 97 % |
| `equipment`, `equipmentByCategory` | the equipment list, also grouped by AutoScout24's categories | 82 % (median 41 items) |
| `images` | every photo link | 100 % (median 15) |
| `bodyType`, `bodyColor`, `manufacturerColor`, `paintType`, `upholstery`, `upholsteryColor` | as named | 100 %, 63 %, 25 %, 82 %, 53 %, 50 % |
| `seats`, `doors`, `gears`, `cylinders`, `driveTrain`, `weight`, `particleFilter` | as named | 92 %, 92 %, 73 %, 84 %, 76 %, 63 %, 24 % |
| `emissionClass`, `co2Class`, `electricRangeKm`, `batteryOwnership` | as the seller gives them (no electric car in this sample) | 62 %; 0 % |
| `previousOwners`, `hadAccident`, `accidentFree`, `damageConditions` | previous owners, the accident flag | 46 %, 69 %, 69 %, 0 % |
| `fullServiceHistory`, `nonSmoking`, `newInspection`, `nextInspection`, `lastServiceDate`, `lastBeltServiceDate` | service and inspection | 94 %, 94 %, 94 %, 10 %, 19 %, 3 % |
| `originalMarket`, `productionYear`, `isRental`, `warranty`, `warrantyExists` | as named | 37 %, 13 %, 100 %, 42 %, 100 % |
| `netPrice`, `vatRate`, `vatDeductible`, `priceNegotiable`, `priceOnRequest` | the net price and VAT rate where a business can deduct VAT | 24 %, 20 %, flags 100 % |
| `hsnTsn`, `marketPriceMedian`, `priceRanges`, `suggestedRetailPrice` | the German type codes; AutoScout24's market price and the price bands behind its rating, where it serves them | 0 % in this Italian sample |
| `qualitySeals`, `historyReportUrl`, `partnerLinks`, `videoUrl` | seals, the vehicle history report link, AutoScout24's partner offers, a video | 0 %, 100 %, 100 %, 2 % |
| `onlineSince`, `daysOnline` | when the ad went online and days since | 100 % |
| `latitude`, `longitude` | the place (rounded to 2 decimals for private sellers with `includePersonalData` off) | 100 % |
| `whatsApp` | a dealer's WhatsApp number (a private seller's only with `includePersonalData`) | 40 of 64 dealer rows |
| `dealer` | `name`, `contactName`, `street`, `postcode`, `city`, `country`, `phones`, `whatsApp`, `rating`, `ratingAverage`, `ratingCount`, `recommendPercent`, `ratingsByCategory`, `customerSince`, `homepage`, `logo`, `openingHours` | on 64 of 64 dealer rows; name, address, phones, customer since 100 %, rating 96.9 %, opening hours 93.8 %, homepage and logo 0 % |

#### Dealer profile (`includeDealerProfiles`)

`dealerProfile` carries `customerId`, `name`, `companyAddOn`, `pageUrl`, `address`, `phones`, `faxes`, `homepage`, `emails`,
`vatId`, `contactName`, `contactPersons`, `imprint`, `about`, `rating`, `reviews` (up to `maxDealerReviews`, 10 by default,
of those the dealer page shows), `reviewsOnPage`, `openingHours`, `dealerTypes`, `services`, `logo` and `branches`. The
e-mail address and the VAT id come from the dealer's own imprint text where the dealer wrote them. A dealer's profile is
billed once per run and carried free on its later rows; a run reads at most 300 dealer pages, and a profile that could not be
read is never billed. Measured on one dealer in a platform run on 2026-10-15 (8 rows, one Dealer profile billed): name,
address, phones, homepage, e-mail address, contact persons, imprint, about text, rating (4.86 from 747 ratings), 10 reviews,
opening hours, services, logo and branches filled; no fax and no company add on. Its VAT id, written with spaces in the
imprint, came empty on that build and is read since (tested on the same page).

#### Removed rows (`trackChanges`)

`adId`, `url`, `reason` (`notFoundByCompleteSearches`), `message`, `lastPrice`, `firstSeenPrice`, `priceChangeCount`,
`firstSeenAt`, `daysTracked`, `monitorName`, `scrapedAt`. Written only when every search of the run was read to its end (no
ad links, no posted window, no stop); when more than half of the tracked ads (and more than 5) are missing at once, none
are reported and the run says so in a free row.

#### Sample row (a real row of the prefill run; some fields left out)

```json
{
    "type": "listing",
    "adId": "1f5c2e68-f998-48e0-a962-79fbd41774f0",
    "urlInternational": "https://www.autoscout24.com/offers/1f5c2e68-f998-48e0-a962-79fbd41774f0",
    "title": "Volkswagen Golf Variant 1.5 eTSI",
    "make": "Volkswagen",
    "model": "Golf",
    "version": "*1.5eTSI*Life*Virtual*Navi*App-Con*AHK*LED*",
    "vehicleType": "car",
    "condition": "used",
    "price": 20990,
    "currency": "EUR",
    "priceRating": "very_good_price",
    "priceRatingLabel": "Very good price",
    "priceRatingSiteLabel": "Sehr guter Preis",
    "mileageKm": 28590,
    "firstRegistration": "2025-06",
    "powerKw": 85,
    "powerHp": 116,
    "fuel": "petrol",
    "fuelLabel": "Benzin",
    "gearbox": "automatic",
    "gearboxLabel": "Automatik",
    "engineSizeCcm": 1498,
    "consumption": 5.8,
    "consumptionUnit": "l/100km",
    "co2GramsPerKm": 132,
    "country": "DE",
    "postcode": "38116",
    "city": "Braunschweig",
    "sellerType": "dealer",
    "sellerId": "39179166",
    "dealerName": "Automobile Michel Zobel",
    "dealerPhones": [{ "type": "Office", "number": "+49 (0)531 - 18059709", "callTo": "+4953118059709" }],
    "dealerRating": 4.5,
    "dealerRatingCount": 13,
    "imageCount": 3,
    "placement": "organic",
    "missingFields": [],
    "searchLabel": "Volkswagen Golf",
    "searchPage": 1,
    "searchPosition": 5,
    "source": "search",
    "site": "de",
    "detailsIncluded": false,
    "scrapedAt": "2026-10-15T09:59:00.864Z"
}
```

#### Coverage row (one per search)

`searchKind`, `searchLabel`, `searchMakeModel`, `searchKeyword`, `searchPlace`, `searchRadiusKm`, `searchDealerId`, `site`,
`countries`, `vehicleType`, `sort`, `adsOnAutoScout24` (AutoScout24's total), `searchCapRows`, `slices`, `slicesWalked`,
`countCalls`, `adsBeyondReach`, `pagesRead`, `rowsSeen`, `distinctAdsSeen`, `adsDelivered`, `alreadyDelivered`,
`knownToMonitor`, `filteredOut` and `filteredOutBy` (per filter), `removedOrGone`, `detailsFailed`, `newAdsMayLieBeyond` (a
monitor), `complete`, `stoppedBy`, `morePagesOffered` and a `note`.

#### Free status rows

A setting or an item the Actor refused (`invalid`), a make or model name that matches several entries (`ambiguous`, with the
candidates), a postcode or dealer page AutoScout24 does not know (`not_found`), an ad that was sold, withdrawn or expired
(`removed`) or an id that never existed (`not_found`), an online sale ad link (`online_sale`), an ad or a page that could not
be read (`failed`), a search whose filters AutoScout24 did not apply as sent (`search_not_applied`), an ad link a monitor
already delivered (`skipped`), a notification that failed (`notification_failed`), and the reason a run stopped
(`limit_reached`, `source_unavailable`, `monitor_unavailable`). A run writes 20 such rows plus one per billed event, at most
200 of one kind; past that it counts the rest in the summary.

#### How searches are read

- **Past 4,000 rows.** AutoScout24 serves at most 20 pages of 200 rows for one search, and about 15 percent of each page are
  rows it inserts that repeat other results, so one walk reaches about 3,400 distinct ads. When a search holds more and your
  caps want more, it is split into whole euro price slices planned at 3,000 ads or fewer with count calls (price ranges
  partition a search exactly), each slice read from its first page. The coverage row counts the slices and anything left
  beyond reach.
- **Every filter checked.** AutoScout24 answers an unknown parameter with a wider search and repeats it in its echo. The
  Actor sends only parameters from AutoScout24's own filter map, refuses a pasted link with any other, compares the echo
  with what it sent on every page, and checks every row against the filters it can read; a page that differs is billed as
  nothing and gets a free `search_not_applied` row.
- **Places.** A postcode is resolved by AutoScout24 itself, once per run, with a count call in the postcode's own country,
  and searched by the coordinates AutoScout24 gives back; a postcode it does not resolve is a free row. Place names are not taken: in a test of 2026-10-15 AutoScout24 placed "Paris"
  in Rhineland-Palatinate and a made up name searched the whole country, without a sign of failure.
- **Which site.** AutoScout24.de (the default) lists the most ads of every seller country: in a count of Volkswagen Golf ads
  on 2026-10-15 it held 8,752 Italian ads against 6,056 on AutoScout24.it, and 1,511 of the 1,518 French ads on
  AutoScout24.fr. Another site gives its own share in its own language. Belgian ads are searched with the seller country
  Belgium; Belgian links are read as the French or Dutch site.
- **One row per ad.** An ad found by several searches in one run is delivered and billed once.
- **Access.** Requests leave through one Apify datacenter exit per run, two at a time, at most 3 a second by default, and
  only through the doors each site's robots.txt allows. A refusal is asked once more on the same exit after a pause; a
  second refusal ends the run's reading with a free `source_unavailable` row.

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

You pay per listing row delivered, plus a small start fee per run. Platform usage and the datacenter proxy are included.

| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (per 1,000 ads from searches, search links and dealer stock) | $0.20 | $0.18 | $0.16 | $0.14 |
| Results page (per 1,000 pages of up to 200 ads, 20 on a dealer page, that delivered a paid row; in a monitor run, every page read) | $0.40 | $0.36 | $0.33 | $0.30 |
| Listing details (per 1,000 rows, only with `includeDetails`) | $0.28 | $0.27 | $0.26 | $0.25 |
| Listing by URL (per 1,000 ads from `adUrls`) | $0.48 | $0.45 | $0.42 | $0.39 |
| Listing update (per 1,000 changes and removed rows, monitor runs with `trackChanges` only) | $0.20 | $0.18 | $0.16 | $0.14 |
| Dealer profile (per 1,000 dealers, only with `includeDealerProfiles`) | $1.40 | $1.30 | $1.20 | $1.00 |
| Actor start (per run) | $0.0045 | $0.0045 | $0.0045 | $0.0045 |

Platinum and Diamond plans pay the Gold price. The Actor start event is a flat $0.0045, charged once per run, with no plan
discount. The Store pricing card shows these same prices per 1,000 events: "$0.18 / 1,000" on the Listing row means one
listing costs $0.00018, and "$1.30 / 1,000" on the Dealer profile row means one dealer profile costs $0.0013.

- **3,400 listings from one search** (a measured run: 3,400 Listings, 18 Results pages, 1 Actor start) cost $0.68 + $0.0072
  - $0.0045 = **$0.6917** on Free, $0.612 + $0.00648 + $0.0045 = **$0.62298** on Bronze, $0.544 + $0.00594 + $0.0045 =
    **$0.55444** on Silver and $0.476 + $0.0054 + $0.0045 = **$0.4859** on Gold. With Listing details on, add $0.918 on
    Bronze: $1.54098.
- **100 ad links** on Bronze cost 100 x $0.00045 = $0.045, plus $0.0045: $0.0495.
- **A monitor run** on Bronze over 2 searches reads 3 pages each (6 x $0.00036 = $0.00216); with 12 new listings it costs
  $0.00216 + 12 x $0.00018 + $0.0045 = $0.00882.
- **Dealer profiles** for 3 dealers on Bronze add 3 x $0.0013 = $0.0039 to the run.
- **What is never billed:** ads left out by your filters, an ad found twice in one run, ads a monitor already delivered
  (unless change tracking finds a change, or you ask for a full snapshot), removed and unknown ads, online sale ad links, the
  details of an online sale ad, a page whose filters AutoScout24 did not apply, a dealer profile that could not be read,
  count calls and postcode lookups, coverage, status and summary rows, the run report and the notifications.
- **Limits:** set **Maximum listings** (100 when left empty) and, in the run options, a maximum charge for the run: the
  Actor stops before it would pass either, and a row whose events do not all fit is withheld whole. Maximum listings counts
  listings, changes and removed rows together. A run also spends a small allowance on work that delivers nothing billable
  (count calls, postcode lookups, pages whose ads your filters leave out), USD 0.0006 plus a share of every paid event it
  delivers; past it the run stops with a free row that says so.

### Input

| Setting | What it does |
|---|---|
| `makeModels` | makes, or makes with a model, as AutoScout24 lists them; a model line with "(all)"; a version text after " / "; ids such as `74` or `74|2084`; the names follow the vehicle type |
| `makes` | car makes picked from AutoScout24's list of 295 |
| `keywords` | free text for AutoScout24's own keyword search, each its own search within the makes |
| `vehicleType` | car (default), motorbike, van, caravan |
| `site` | de (default), at, it, nl, fr, lu, es, com, pl, ro, bg: the ads and the language of labels |
| `countries` | the seller countries DE, AT, BE, ES, FR, IT, LU, NL |
| `locations`, `radiusKm` | postcodes with their country (`10115, DE`, `20121, IT`, `1010, AT`, `1012, NL` with the 4 digits; a postcode alone is German) or coordinates (`52.52, 13.40`); a radius of 1 to 1,000 whole km (50 by default) |
| `dealers` | dealer page links (`https://www.autoscout24.de/haendler/<name>`, also .at, .it `/concessionari/`, .nl `/autobedrijven/`, .fr `/garages/`, .es `/profesionales/`): alone, the whole stock; with makes, the dealer's stock within those makes. A dealer id (`sellerId`) needs makes |
| `searchUrls` | AutoScout24 search links with a make, from any site; a parameter the Actor does not know refuses the link with a free row |
| `adUrls` | ad links of any AutoScout24 site or ad ids, each billed as a Listing by URL |
| `resumeFromDatasetId` | the dataset of an earlier run of this Actor: its ads are left out, free (up to 200,000 rows read) |
| named filters | `fuelTypes`, `gearbox`, `bodyTypes`, `conditions`, `sellerType`, `minPrice` to `maxPrice`, `yearMin` to `yearMax`, `mileageMin` to `mileageMax`, `powerMin` to `powerMax` with `powerUnit`, `colors`, `interiorColors`, `upholstery`, `paintTypes`, `cylinders`, `driveTypes`, `priceRatings`, `equipment`, `seals`, `seatsMin` to `seatsMax`, `doorsMin` to `doorsMax`, `engineSizeMin` to `engineSizeMax`, `electricRangeMin` to `electricRangeMax`, `previousOwnersMax`, `onlineWithinDays`, `emissionClassMin`, `emissionSticker`, `batteryOwnership`, `damagedCars`, `onlineSaleAds` (AutoScout24.de only), `vatDeductibleOnly`, `leasingOnly`, `priceReducedOnly`, `newDriverSuitableOnly` |
| `filters` | any other AutoScout24 parameter by its own name and value; an unknown name refuses the run with a free row |
| row filters | `includeKeywords`, `excludeKeywords`, `customFilters`, `postedWithinHours`, `postedWithinDays`, `postedAfter`, `postedBefore` (need details and the newest or oldest sort), `excludeAdIds` (up to 5,000) |
| `sort` | newest (default), oldest, price_low, price_high, mileage_low, mileage_high, registration_new, registration_old, power_high, power_low, best, distance (needs a place) |
| `maxItems`, `maxItemsPerSearch`, `maxPagesPerSearch`, `startPage`, `splitLargeSearches` | caps and how far each search is read |
| `includeDetails`, `includeDealerProfiles`, `maxDealerReviews` | the two add-ons |
| `currency`, `imageSize`, `descriptionFormat`, `descriptionMaxLength`, `compactOutput`, `excludeEmptyFields` | how rows are written |
| `includePersonalData` | a private seller's phones, WhatsApp number and exact coordinates (off by default; see Privacy) |
| monitor and notifications | `monitorName`, `trackChanges`, `trackFields`, `emitUnchanged`, `markReposts`, `skipReposts`, `notificationLimit`, `notifyOnlyChanges` and the channel settings below |
| `failIfIncomplete`, `maxFailedRequestsPercent`, `requestsPerSecond`, `proxyConfiguration` | fail the run when a search was not read to its end or too many reads failed; the pace (0.5 to 4 a second, 3 by default); Apify datacenter (default) or your own proxy links |

A run holds up to 200 searches (makes and models x keywords x places x dealers, plus one per search link) and up to 5,000
ad links.

### The monitor and notifications

Name a monitor (`monitorName`) and schedule the Actor (every hour, for example). The monitor remembers every ad it delivered
in a named store this Actor creates for itself, up to 35,000 ads, so each run delivers and bills only ads it never delivered
before; known ads are skipped for free. A monitor reads newest first, the newest 3 pages of 200 ads of each search by
default (set `maxPagesPerSearch` to change it), does not split searches, and pays a Results page for each page it reads;
when the coverage row says `newAdsMayLieBeyond`, raise the pages or run more often. One monitor name belongs to one set of
settings: a run with other settings delivers nothing and gets a free row saying so.

- **Change tracking** (`trackChanges`): a known ad whose price changed comes back with `change` (previous price, difference,
  first seen price, up to 6 dated prices, drop in percent since first seen), billed as a Listing update. With `trackFields`
  a change of other fields counts too (`changeType: "updated"`, `changedFields`). When every search was read to its end, an
  ad the monitor tracks that the run did not meet gets a `removed` row; one that comes back is `reappeared`.
- **Snapshots and reposts:** `emitUnchanged` delivers known ads again (billed as Listing); `markReposts` marks a new ad with
  the same seller, make, model, first registration, mileage and power as one the monitor delivered earlier under another
  id (`possibleRepostOf`), and `skipReposts` leaves it out free. Two such twins that are both new in one batch are both
  delivered.
- **Notifications** (free, with or without a monitor) after the rows were delivered and billed: Telegram (your own bot, one
  message per listing), Slack and Discord incoming webhooks and WhatsApp Cloud API (one message per run), each naming up to
  `notificationLimit` listings (10 by default, up to 30); a webhook (`webhookUrl`) gets JSON batches of 100, up to 1,000 a
  run, signed in the header `x-signature-sha256` with `webhookSecret` (8 to 200 characters), with your own
  `webhookHeaders`. A failed call never fails the run: it is a free `notification_failed` row, without your address or
  token.

### Privacy and personal data

Private sellers are private persons. With `includePersonalData` off (the default), the phone numbers and WhatsApp number
AutoScout24 shows for them are not delivered, phone numbers and e-mail addresses written into their title, version text,
subtitle and description are replaced with `[phone number removed]` and `[e-mail removed]`, and the exact coordinates of the
details are rounded to 2 decimals (about 1 km); their HTML and Markdown descriptions are rebuilt from the masked text, and
their `url` is the id only link on AutoScout24.com (a private ad's own link carries the seller's version text). With it on, nothing
is masked or rounded. AutoScout24 shows no private seller's name or street. A dealer's name, address, phones, WhatsApp
number, opening hours, rating and contact person are business data and are always delivered. Photos are delivered as links;
they belong to the people who posted them. You are responsible for a lawful use of personal data, GDPR included.

### Legal

This Actor is not affiliated with, endorsed by or sponsored by AutoScout24. AutoScout24 is a trademark of its owner. It is an
unofficial tool that reads public pages without logging in, through the doors each site's robots.txt allows. AutoScout24's
terms forbid automated queries, and EU law protects databases (in Germany the database maker's right, sections 87a to 87e
of the Urheberrechtsgesetz). You are responsible for a lawful use of the data, for complying with the GDPR for any personal
data, and for keeping a scheduled monitor to what you need.

### What this Actor does NOT do

- **No login, no messages to sellers, no offers, no saved searches or anything else that needs an AutoScout24 account.**
- **No private seller phone numbers, WhatsApp numbers or exact coordinates unless you turn on `includePersonalData`.**
  Dealers' business contacts are always delivered.
- **No place names.** Give a postcode with its country, or coordinates; a name is refused with a free row.
- **No AutoScout24.ch.** The Swiss site is a different platform; this Actor reads the 11 sites named above (and Belgian
  links).
- **No trucks, buses, trailers or machines.** The vehicle types are car, motorbike, van and caravan.
- **No details of online sale ads.** Their pages are closed by robots.txt: from a search they come with the search data
  only, and as an ad link they are a free row.
- **No more than 4,000 rows from one AutoScout24 page walk.** Past that the search is split by price automatically
  (`splitLargeSearches`, on by default, not in a monitor); what a split cannot reach is counted on the coverage row.
- **No more dealer reviews than the dealer page shows, and at most 300 dealer pages per run.**
- **No e-mail addresses from a dealer's own website.** E-mail addresses come only from the imprint on the dealer's
  AutoScout24 page (Dealer profiles). No other sites are read.
- **No AI summaries of an ad and no translation.** Descriptions come as the seller wrote them; `site` sets the language of
  AutoScout24's labels only.
- **No radius in miles.** Give `radiusKm` in whole kilometres (1 mile is 1.609 km).
- **No export into Notion, Airtable or other apps from inside the run.** Connect the dataset with Apify's integrations,
  using your own accounts.
- **No preloaded snapshot.** Every run reads AutoScout24 live; the data is as fresh as the run.

### FAQ

#### Does AutoScout24 have an API?

AutoScout24's official API serves dealers and partners who publish their own ads; there is no public API to search
everyone's ads. This Actor reads the same public ads any visitor sees, with no login, and gives them to you as rows you can
read through the Apify API (examples below).

#### Is it legal to scrape AutoScout24?

This Actor reads only public ads without logging in, through the doors each site's robots.txt allows, and a private seller's
phone number comes only when you turn it on. AutoScout24's terms forbid automated queries and EU law protects databases, so
you are responsible for a lawful use of the data, the GDPR included (see Legal).

#### How many cars can one AutoScout24 search return?

AutoScout24 serves at most 4,000 rows (20 pages of 200) for one search, and about 15 percent of them repeat other results,
so one walk reaches about 3,400 distinct ads. Past that, this Actor splits the search into price slices on its own and reads
every slice; the coverage row gives AutoScout24's total, the slices read and anything left beyond reach.

#### What does the AutoScout24 price rating mean?

It is AutoScout24's own rating of an ad's price against the market, from very good price to high price, or no rating. Every
row carries it as an English code (`priceRating`), an English label (`priceRatingLabel`) and the label of the site you
searched (`priceRatingSiteLabel`), and you can search by it (`priceRatings`).

#### How do I get alerts for new AutoScout24 listings?

Name a monitor and schedule the Actor, every hour for example. Each run delivers and bills only ads the monitor has not
delivered before, and can send them to Telegram, Slack, Discord, WhatsApp or your webhook.

#### Why does this Actor run with limited permissions?

It needs nothing beyond its own storages: it reads AutoScout24's public ads and writes to its own dataset and key-value
store. Limited permissions keep it from touching anything else in your account. A monitor's memory is a named store the
Actor creates for itself.

### API

Each example starts a run and waits for its rows (the run-sync endpoint suits short runs; use `maxItems` to keep them short).

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~autoscout24-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer <YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"makeModels": ["Volkswagen Golf"], "countries": ["DE"], "maxItems": 20}'
```

```js
const res = await fetch('https://api.apify.com/v2/acts/automation_craft~autoscout24-scraper/run-sync-get-dataset-items', {
    method: 'POST',
    headers: { Authorization: 'Bearer <YOUR_API_TOKEN>', 'Content-Type': 'application/json' },
    body: JSON.stringify({ makeModels: ['Volkswagen Golf'], countries: ['DE'], maxItems: 20 }),
});
const rows = await res.json();
console.log(rows.filter((r) => r.type === 'listing'));
```

```python
import requests

res = requests.post(
    "https://api.apify.com/v2/acts/automation_craft~autoscout24-scraper/run-sync-get-dataset-items",
    headers={"Authorization": "Bearer <YOUR_API_TOKEN>"},
    json={"makeModels": ["Volkswagen Golf"], "countries": ["DE"], "maxItems": 20},
    timeout=330,
)
listings = [r for r in res.json() if r["type"] == "listing"]
```

### Changelog

See the Changelog tab. 0.1: first release.

### More data tools by Automation Craft

- [Mobile.de Scraper: Cars, Prices, Dealers & Ratings](https://apify.com/automation_craft/mobile-de-scraper)
- [Kleinanzeigen Scraper & API: Ads, Prices, Places](https://apify.com/automation_craft/kleinanzeigen-scraper)
- [Leboncoin Scraper: Ads, Prices, Real Estate & Cars](https://apify.com/automation_craft/leboncoin-scraper)
- [Kijiji Scraper: Listings, Cars, Rentals & Prices](https://apify.com/automation_craft/kijiji-scraper)
- [OfferUp Scraper: Local Listings, Prices, Sellers](https://apify.com/automation_craft/offerup-scraper)
- [Facebook Marketplace Scraper with Sold Tracker](https://apify.com/automation_craft/facebook-marketplace-scraper)

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/autoscout24-scraper/changelog.md

# Actor input Schema

## `makeModels` (type: `array`):

Makes, or makes with a model, as AutoScout24 lists them: "Volkswagen", "Volkswagen Golf", "BMW 3er", "Mercedes-Benz C 200", a whole model line with "(all)" ("Volkswagen Golf (all)"), and a version text after " / " ("Volkswagen Golf / GTI"). Ids work too ("74", "74|2084"). The names follow the vehicle type below.

## `makes` (type: `array`):

Car makes picked from AutoScout24's own list (295 makes); each is searched like a make written in "Makes and models". Cars only.

## `keywords` (type: `array`):

Free text AutoScout24 searches in the ads (its own keyword search), such as "Panorama", "AHK", "garanzia". Each keyword is its own search within the makes above.

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

The kind of vehicle every built search reads. Default: cars. A search link carries its own type.

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

The site whose ads and labels the built searches read. AutoScout24.de lists the most ads of every country (it held 98 to 99.5 percent of each country site's own ads and up to 84 percent more in the 2026-10-15 spike); another site gives its own share in its language. Every row also carries the coded values in English. Default: de.

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

The countries the cars are offered in. Default: all eight countries AutoScout24 lists ads from.

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

A postcode with its country ("10115, DE", "20121, IT", "1010, AT", "1012, NL" with the 4 digits; a postcode alone is German) or coordinates ("52.52, 13.40"). AutoScout24 resolves each postcode itself (once per run); a postcode it does not resolve is a free row. Place names are not taken (the site resolves some to the wrong place). Each place is searched with the radius below.

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

The radius around each place in whole kilometres, 1 to 1,000 (AutoScout24's form offers 10 to 400). Default 50 km when a place is given.

## `dealers` (type: `array`):

A dealer's stock: its dealer page link (https://www.autoscout24.de/haendler/<name>, also .at, .it /concessionari/, .nl /autobedrijven/, .fr /garages/, .es /profesionales/) reads the whole stock; with makes above, the dealer id (the "sellerId" of its rows) or link searches its stock within those makes, with every filter.

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

AutoScout24 search links copied from your browser after choosing a make and filters, on any site (https://www.autoscout24.it/lst/fiat/500?...). Each is read on its own site with its own filters and sort; a parameter this Actor does not know refuses the link (the site would ignore it and search wider). A link without a make is refused (robots.txt).

## `resumeFromDatasetId` (type: `string`):

The dataset id of an earlier run of this Actor in your account (its "defaultDatasetId"). Ads delivered in it are left out, free, so an interrupted run can be continued without paying for an ad twice. At most 200,000 rows are read.

## `adUrls` (type: `array`):

Ad links of any AutoScout24 site, or ad ids, read with their details and delivered as given (billed as Listing by URL). A removed, unknown or online sale ad is a free row.

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

Any of these fuels.

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

Any of these gearboxes.

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

Any of these body types (cars).

## `conditions` (type: `array`):

Any of these offer types.

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

Dealers, private sellers, or both (default).

## `minPrice` (type: `integer`):

Lowest price in euros.

## `maxPrice` (type: `integer`):

Highest price in euros.

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

Earliest year of first registration.

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

Latest year of first registration.

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

Lowest mileage in km.

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

Highest mileage in km.

## `powerMin` (type: `integer`):

Lowest power, in the unit below (kW by default).

## `powerMax` (type: `integer`):

Highest power, in the unit below (kW by default).

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

The unit of "Power from" and "Power up to". Default kW.

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

Any of these exterior colours.

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

Any of these interior colours.

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

Any of these upholsteries.

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

Any of these paint types.

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

Any of these cylinder counts.

## `driveTypes` (type: `array`):

Any of these drives.

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

Any of these AutoScout24 price ratings (its own rating against the market).

## `equipment` (type: `array`):

Equipment every car must have, by its name in English or in the site's language, or its AutoScout24 number: "Navigation system", "Panorama roof", "Trailer hitch", "Heated seats", "Full service history", "Non-smoking vehicle" (136 items).

## `seals` (type: `array`):

Cars with any of these quality seals, by name or number as the site lists them (such as "Dekra Siegel").

## `seatsMin` (type: `integer`):

Fewest seats.

## `seatsMax` (type: `integer`):

Most seats.

## `doorsMin` (type: `integer`):

Fewest doors.

## `doorsMax` (type: `integer`):

Most doors.

## `engineSizeMin` (type: `integer`):

Smallest engine displacement in cubic centimetres.

## `engineSizeMax` (type: `integer`):

Largest engine displacement in cubic centimetres.

## `electricRangeMin` (type: `integer`):

Shortest electric range in km.

## `electricRangeMax` (type: `integer`):

Longest electric range in km.

## `previousOwnersMax` (type: `integer`):

At most 1, 2 or 3 previous owners (4 means 4 or more, as on the site).

## `onlineWithinDays` (type: `integer`):

Ads online for at most this many days, as AutoScout24 filters them: 1 to 7, or 14.

## `emissionClassMin` (type: `string`):

The lowest emission class.

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

The lowest German emission sticker.

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

Whether the battery is included in the price.

## `damagedCars` (type: `string`):

Damaged cars are left out by default, as on the site.

## `onlineSaleAds` (type: `string`):

Ads sold through AutoScout24's own online shop. Their details are not read (their pages are in robots.txt), so with details on they are delivered with the search data only.

## `vatDeductibleOnly` (type: `boolean`):

Only cars whose price lets a business buyer deduct VAT.

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

Only cars with a leasing offer.

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

Only "super deal" cars whose price was reduced.

## `newDriverSuitableOnly` (type: `boolean`):

Only cars AutoScout24 marks as suitable for new drivers.

## `filters` (type: `object`):

Any other filter of the site, by its own parameter name and value, such as {"lsavno": true, "wbfrom": 3000, "sout": \["2"]}. A name this Actor does not know refuses the run (the site would ignore it and search wider).

## `includeKeywords` (type: `array`):

Whole words looked for in the title, version and subtitle (and the description and equipment when details are read). A row needs one of them.

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

Whole words that leave a row out, looked for where the words above are.

## `customFilters` (type: `array`):

Rules on any output field, all of which must hold: \[{"field": "powerHp", "op": "gte", "value": 150}, {"field": "city", "op": "notEquals", "value": "Berlin"}]. Ops: includes, notIncludes, equals, notEquals, gt, gte, lt, lte.

## `excludeAdIds` (type: `array`):

Ad ids or links never delivered.

## `postedWithinHours` (type: `integer`):

Only ads that went online within this many hours of the run's start (needs details on; the date is on the details).

## `postedWithinDays` (type: `integer`):

Only ads that went online within this many days of the run's start (needs details on).

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

Only ads that went online on or after this day, YYYY-MM-DD in UTC (needs details on).

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

Only ads that went online on or before this day, YYYY-MM-DD in UTC (needs details on).

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

The order of every built search. Default: newest first. A search link keeps its own sort.

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

The most listing rows the run delivers (searches, links and updates together). Default 100.

## `maxItemsPerSearch` (type: `integer`):

The most listing rows one search delivers.

## `maxPagesPerSearch` (type: `integer`):

The most result pages (200 rows each, 20 on a dealer page) one search reads. A monitor reads 3 by default.

## `startPage` (type: `integer`):

The result page each search starts on (not with a monitor).

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

On by default: a search with more ads than one walk reaches (about 3,400 of the site's 4,000 row cap) is split into price slices with count calls, so every ad is read. Off for monitors.

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

Read each search row's details: description, full equipment list, previous owners, accident flag, warranty, next inspection, emission class, VAT rate and net price, HSN/TSN where shown, history report link, coordinates, the date the ad went online, and the dealer's rating breakdown and opening hours. Billed as Listing details per row read.

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

Read each dealer's AutoScout24 page once per run: rating, reviews, imprint with its e-mail address and VAT id, opening hours, contact persons, services, homepage. Billed as Dealer profile once per dealer.

## `maxDealerReviews` (type: `integer`):

The most reviews a dealer profile carries (those the dealer page shows). Default 10.

## `includePersonalData` (type: `boolean`):

Off by default. On: private sellers' phone numbers and WhatsApp numbers as AutoScout24 shows them, their exact coordinates, and phone numbers and e-mail addresses inside their own texts (off, those are removed and coordinates rounded to about 1 km). Dealers' contact details are business data and always delivered. You are responsible for a lawful use, GDPR included.

## `currency` (type: `string`):

Prices stay in euros; another currency adds a converted price at the European Central Bank's rate of the day.

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

The size of the image links. Default large.

## `descriptionFormat` (type: `string`):

The format of the description (rows with details).

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

Cut descriptions to this many characters.

## `compactOutput` (type: `boolean`):

Only the core fields on each row (what a row paid for stays).

## `excludeEmptyFields` (type: `boolean`):

Drop fields that are empty on a row.

## `monitorName` (type: `string`):

A short name ("golf-de"). The monitor remembers every ad it delivered; known ads are free. One name holds one set of settings.

## `trackChanges` (type: `boolean`):

Also deliver known ads whose price (or a tracked field) changed or that came back, and ads that left every search (removed), billed as Listing update.

## `trackFields` (type: `array`):

The fields whose change makes a Listing update. Default: price.

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

Deliver known ads without a change as well (billed as Listing), each marked unchanged.

## `markReposts` (type: `boolean`):

Mark a new ad whose car the monitor delivered under another id (same seller, make, model, registration, mileage and power).

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

Leave such reposts out (free).

## `webhookUrl` (type: `string`):

Rows are POSTed here in batches of 100 (JSON).

## `webhookSecret` (type: `string`):

Signs each batch (HMAC SHA-256, header X-Signature-Sha256).

## `webhookHeaders` (type: `object`):

Extra headers, such as {"Authorization": "Bearer ..."}.

## `telegramBotToken` (type: `string`):

The token BotFather gave your bot.

## `telegramChatId` (type: `string`):

Your chat id, or a channel name starting with @.

## `slackWebhookUrl` (type: `string`):

An incoming webhook of your Slack workspace.

## `discordWebhookUrl` (type: `string`):

A webhook of your Discord channel.

## `whatsappAccessToken` (type: `string`):

Your WhatsApp Cloud API token.

## `whatsappPhoneNumberId` (type: `string`):

The id of your WhatsApp Cloud API number.

## `whatsappTo` (type: `string`):

The number to message, international form without +.

## `notificationLimit` (type: `integer`):

The most listings named in each chat message. Default 10.

## `notifyOnlyChanges` (type: `boolean`):

With a monitor, leave unchanged ads out of the messages (default on).

## `failIfIncomplete` (type: `boolean`):

Mark the run failed when a search or ad link was not read completely (the rows stay delivered).

## `maxFailedRequestsPercent` (type: `integer`):

Mark the run failed when more than this share of its pages and ad reads failed (the rows stay delivered).

## `requestsPerSecond` (type: `number`):

The pace of requests to AutoScout24 (default 3).

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

Apify's datacenter proxy (the default: AutoScout24 answers it and its traffic is not billed to you), or your own proxy links.

## Actor input object example

```json
{
  "makeModels": [
    "Volkswagen Golf"
  ],
  "countries": [
    "DE"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `items` (type: `string`):

No description

## `report` (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 = {
    "makeModels": [
        "Volkswagen Golf"
    ],
    "countries": [
        "DE"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "makeModels": ["Volkswagen Golf"],
    "countries": ["DE"],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "makeModels": [
    "Volkswagen Golf"
  ],
  "countries": [
    "DE"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automation_craft/autoscout24-scraper --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

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