How to use AutoScout24 Scraper
Step by step: in the Apify Store, over the API, from JavaScript or Python, in n8n, and from AI agents through MCP or LangChain.
$0.44 per 1,000 Car listings (live Apify price on 2026-10-31).
1. In the Apify Store (no code)
- Open arcadium/eu-car-listings and sign in to Apify (a free account works).
- Fill in the input form. The fields below are the ones the example uses.
- Set a maximum cost per run in the run options if you want a hard cap.
- Start the run. Rows appear in the Output tab as they arrive.
- Export the dataset as JSON, CSV or Excel, or connect an integration.
| Input field | Type | Description |
|---|---|---|
startUrls | array | AutoScout24 result pages from any country site (e.g. https://www.autoscout24.de/lst/bmw/3er?atype=C&cy=D&fregfrom=2018) and single car pages. Every filter in a result URL is kept. Car pages give one row each with the listing details. |
maxResultsPerSearch | integer | Cars per result URL or filter search, 1 to 100000 (default 500). The site pages through 4,000 cars per query; larger searches are split into price bands automatically (cars without a price are then left out). |
Example input:
{
"startUrls": [
"https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020"
],
"maxResultsPerSearch": 50
}
2. Over the Apify API
The synchronous endpoint runs the actor and returns its rows in one call (for runs up to about five minutes; use the asynchronous run endpoint for longer ones).
curl -X POST "https://api.apify.com/v2/acts/arcadium~eu-car-listings/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":["https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020"],"maxResultsPerSearch":50}'
3. From JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/eu-car-listings').call({
"startUrls": [
"https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020"
],
"maxResultsPerSearch": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
4. From Python
# pip install apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/eu-car-listings").call(run_input={
"startUrls": ["https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020"],
"maxResultsPerSearch": 50,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
5. In n8n
Paste this node into a workflow (it is a plain HTTP Request node). Create a Header Auth credential with name Authorization and value Bearer <APIFY_TOKEN>; each returned row becomes one item for the next node.
{
"nodes": [
{
"name": "Run arcadium/eu-car-listings",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
0,
0
],
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/arcadium~eu-car-listings/run-sync-get-dataset-items",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\"startUrls\":[\"https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020\"],\"maxResultsPerSearch\":50}",
"options": {
"timeout": 300000
}
}
}
],
"connections": {}
}
6. From an AI assistant (MCP)
Add Apify’s MCP server to Claude Desktop, Cursor, VS Code or any MCP client, limited to this actor:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/eu-car-listings",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}
More on the MCP page.
7. From LangChain
# pip install langchain-apify (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("arcadium/eu-car-listings")
rows = tool.invoke({"run_input": {
"startUrls": ["https://www.autoscout24.de/lst/volkswagen/golf?atype=C&cy=D&fregfrom=2020"],
"maxResultsPerSearch": 50,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])
Sample output
One row, from the example in the actor’s README. Long text is shortened and lists are cut to two items.
{
"rowType": "vehicle",
"platform": "autoscout24",
"site": "autoscout24.de",
"listingId": "c602bfa6-95b9-4317-ad1d-8a59fa9f149d",
"url": "https://www.autoscout24.de/angebote/bmw-3er-d-sport-line-ahk-navi-sitzheizung-diesel-blau-cat_ma13gr100038ge26va104mt118tr189-c602bfa6-95b9-4317-ad1d-8a59fa9...",
"make": "BMW",
"model": "320",
"modelGroup": "3er",
"variant": "d Sport Line*AHK*NAVI*SITZHEIZUNG",
"condition": "used",
"firstRegistration": "2021-08",
"year": 2021,
"mileageKm": 135972,
"price": 16990,
"currency": "EUR",
"priceRating": "top_price",
"fuel": "diesel",
"transmission": "manual",
"powerKw": 140,
"powerHp": 190,
"city": "Bad Segeberg ( bei Hamburg)",
"zip": "23795",
"countryCode": "DE",
"sellerType": "dealer",
"dealerName": "H&S Automobile Hamburg GmbH",
"dealerRating": null,
"dealerRatingCount": null,
"photoCount": null,
"detailed": false,
"searchRank": 1
}
| Field | What it holds |
|---|---|
rowType | Kind of row. Filter on this first. Values: 'vehicle': one car offer (charged). 'error': a URL or search gave no cars; see code and message (free). |
platform | Always 'autoscout24'. |
site | Country site the row was read from, e.g. autoscout24.de or autoscout24.com (labels such as fuelLabel follow its language). |
listingId | AutoScout24 listing id (UUID at the end of the car URL), stable while the car is online. Use it to deduplicate and to track price changes across runs. |
url | Car page on AutoScout24. |
title | Listing title as shown, e.g. 'BMW 320 Touring'. |
make | Make, e.g. 'BMW'. |
model | Model as the site names it, e.g. '320', 'Golf'. |
modelGroup | Model family, e.g. '3 Series' / '3er'. |
variant | Version text the seller entered, e.g. 'd Sport Line', or the engine name. |
condition | used, new, demo, pre_registered, employee or classic. |
firstRegistration | First registration as YYYY-MM. |
year | Year of first registration. |
mileageKm | Mileage in kilometres. |
price | Asking price in currency (public price, VAT as the seller states it). |
currency | ISO currency code, EUR on the eight euro-area sites. |
priceRating | AutoScout24 price label vs. its market estimate: top_price, good_price, fair_price, increased_price, high_price or not_rated. |
marketPriceMedian | AutoScout24's market price median for comparable cars (details only). |
fuel | gasoline, diesel, electric, hybrid_gasoline, hybrid_diesel, lpg, cng, hydrogen, ethanol or other. |
fuelLabel | Fuel as the site shows it, e.g. 'Electric/Gasoline'. |
transmission | manual, automatic or semi_automatic. |
powerKw | Engine power in kW. |
powerHp | Engine power in hp (PS). |
engineCc | Engine displacement in cm³. |
bodyType | Body type in English snake_case, e.g. 'station_wagon', 'sedan', 'suv', 'compact' (details only). |
colour | Exterior colour in English lower case, e.g. 'blue', 'black' (details only). |
doors | Number of doors (details only). |
seats | Number of seats (details only). |
consumptionCombined | Combined consumption, l/100 km (kWh/100 km for electric cars) as stated. |
co2GramsPerKm | CO2 emissions in g/km as stated. |
previousOwners | Number of previous owners (details only, when stated). |
hadAccident | Accident history as stated by the seller (details only). |
city | City where the car is offered. |
zip | Postal code where the car is offered. |
countryCode | Country of the offer, ISO 3166-1 alpha-2 (DE, IT, NL, ...). |
sellerType | dealer or private. Private sellers carry no name, phone, street or id. |
dealerName | Dealer business name (dealers only). |
dealerId | AutoScout24 dealer id (dealers only); groups a dealer's stock. |
dealerStreet | Dealer business address street (dealers only). |
dealerRating | Dealer rating in stars, 1-5 (dealers with ratings only). |
dealerRatingCount | Number of dealer ratings. |
photoCount | Number of photos of the listing. |
imageUrl | Cover photo URL. |
features | Equipment list in the language of site (English on autoscout24.com, German on .de), e.g. 'Navigation system', 'Heated seats' (details only, empty otherwise). |
postedAt | When the listing went online, ISO timestamp (details only). |
updatedAt | Last change of the listing, ISO timestamp, when the site states it. |
detailed | True when the car page was read (details fields filled); such rows are charged as listing-details. |
searchInput | The URL or filter search that found the car (null for car URLs). |
searchRank | 1-based position of the car in that search. |
scrapedAt | When the row was read, ISO timestamp. |
input | Error rows: the URL or search that failed. |
code | Error rows: invalid_input, not_found, no_match, blocked or unavailable. |
message | Error rows: what went wrong, in plain words. |
Schedule it
In Apify Console, create a Task from your input and add a Schedule (for example daily). Each run writes a new dataset; integrations can push the rows to Google Sheets, Slack, a webhook or your database.