AutoScout24 Scraper – European Car Listings avatar

AutoScout24 Scraper – European Car Listings

Pricing

from $1.50 / 1,000 results

Go to Apify Store
AutoScout24 Scraper – European Car Listings

AutoScout24 Scraper – European Car Listings

Extract AutoScout24 car listings, prices, mileage and dealer data. Optional details, per-search limits, budget checks and explicit coverage reports. Export JSON/CSV for vehicle market research.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

ninhothedev

ninhothedev

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

17 days ago

Last modified

Categories

Share

What does AutoScout24 Scraper do?

Extract AutoScout24 car listings, asking prices and dealer information into JSON, CSV or Excel. Use a German AutoScout24 search or structured filters for make, model, price, mileage, year, fuel and seller type. Optional detail requests add descriptions, photos and location fields where published.

For dealers and researchers, this provides repeatable input for stock comparisons and price analysis through the Apify API. Each run is a current snapshot; compare listing IDs downstream to detect changes. It does not calculate valuations or retain a price history for you.

  1. Paste a results URL in Search URLs, or clear that field to use the filters. A starting page is honored; pagination never adds a second page parameter.
  2. Start with three cars. Enable Fetch full details if you need descriptions and inspect detail_status afterward.
  3. Check the Coverage and stop reasons output, then download the dataset or connect your workflow. Increase the sample only after checking its fields and coverage.
{
"searchUrls": ["https://www.autoscout24.de/lst/bmw?sort=standard&page=2"],
"maxItemsPerSearch": 3,
"fetchDetails": true,
"detailConcurrency": 2
}

The Input tab lists all filters. maxItemsPerSearch is a cap per distinct search URL, not a guarantee that this many matching cars exist. Identical URLs are processed once. Overlapping, different searches can each contain the same car; deduplicate by id downstream for a combined inventory.

What data is available?

FieldsMeaning
id, url, titleListing identity and source link
price, currency, price_eurAsking price and EUR conversion; conversion uses a static fallback if the FX service is unavailable
price_label, is_super_deal, old_priceSource price label and advertised reduction, where available
make, model, model_group, variantVehicle identity
mileage_km, first_registration, yearMileage and registration
fuel_type, transmission, power_kw, power_ps, engine_ccmVehicle characteristics in the source language
seller_type, seller_name, city, zip_code, countryPublic seller and location fields
images, thumbnail_urlSource image URLs
description, street, latitude, longitude, suggested_retailDetail enrichment where published; description limited to 4,000 characters
detail_statusnot_requested, succeeded or failed; success does not imply every optional field exists
search_url, scraped_atSearch provenance and UTC collection time

Coverage, limits and restarting

The Actor visits at most source page 20 per search. A URL starting at page 19 therefore has at most two pages left. Page size, inventory and source access can vary. Requesting 5,000 cars does not unlock 5,000 results. Split broad searches by model, price or region if the report shows page_limit; splitting is not automatic.

RUN_SUMMARY reports complete, partial or incomplete, stored row counts, attempted searches, per-search stop reasons and unprocessed URLs. complete means the requested bounded work finished, not that you have every car in a market.

  • item_limit: requested per-search cap reached.
  • source_exhausted: a valid source response explicitly contained no further listings.
  • page_limit or repeated_page: coverage is partial; inspect and narrow the search.
  • fetch_failed, parse_failed or search_error: the source could not be read reliably.
  • budget_limit: the available result budget stopped further work.

Failed detail requests retain the useful search row with detail_status=failed and make the report partial. If all searches fail without any output, the run fails instead of reporting an empty success. A genuine zero-result response is allowed.

A restart of the same run uses stored listing IDs and search checkpoints to avoid delivering the same search/listing pair again. Completed searches are skipped. A partially processed search may be fetched again to find its remaining rows. Keep searches, limits and detail mode unchanged on resurrection. A new scheduled run creates a new, separately billed snapshot; it does not return only new listings.

Pricing and spending limits

Current base prices are $1.50 per 1,000 saved rows, plus $0.00005 per GB of start memory, with at least one start event. The live Pricing tab is authoritative for your plan and any discounts. A three-row run at 512 MB is $0.00455 at these base event prices; actual source output may be lower.

Set Maximum total charge to bound result spending. The Actor checks the SDK allowance before each search and only enriches rows within the current allowance. It counts rows accepted by the SDK. Detail failures still produce a useful, billable search row with an explicit failure status. Prices are unchanged by this release.

Output example

Historical search-row example from a 15 October 2026 test, with images shortened. Current output additionally includes detail_status; live cars and prices will differ.

[
{
"id": "550dd6a5-ac4b-46be-8350-b8f431a54223",
"url": "https://www.autoscout24.de/angebote/bmw-3er-i-xdrive-limousine-m-sportpaket-hifi-dab-led-benzin-grau-cat_ma13gr100038ge28va105mt122tr479990-550dd6a5-ac4b-46be-8350-b8f431a54223",
"title": "BMW 3er i xDrive Limousine M Sportpaket HiFi DAB LED",
"country": "DE",
"price": 47890,
"currency": "EUR",
"price_eur": 47890,
"price_label": "top-price",
"is_super_deal": false,
"old_price": "",
"make": "BMW",
"model": "330",
"model_group": "3er",
"variant": "Limousine",
"mileage_km": 26641,
"first_registration": "02-2026",
"year": 2026,
"fuel_type": "Benzin",
"transmission": "Automatik",
"power_kw": 180,
"power_ps": 245,
"engine_ccm": 1998,
"condition": "used",
"seller_type": "dealer",
"seller_name": "Autohaus Unterberger GmbH",
"city": "Rosenheim",
"zip_code": "83026",
"street": "",
"latitude": null,
"longitude": null,
"description": "",
"suggested_retail": null,
"images": [
"https://prod.pictures.autoscout24.net/listing-images/550dd6a5-ac4b-46be-8350-b8f431a54223_7047deeb-4785-4c21-9bc8-d9e201b15d53.jpg/250x188.webp"
],
"thumbnail_url": "https://prod.pictures.autoscout24.net/listing-images/550dd6a5-ac4b-46be-8350-b8f431a54223_7047deeb-4785-4c21-9bc8-d9e201b15d53.jpg/250x188.webp",
"search_url": "https://www.autoscout24.de/lst/bmw",
"scraped_at": "2026-10-15T18:01:20.656531+00:00"
}
]

You can download the dataset as JSON, HTML, CSV or Excel. Check the output schema for the coverage-report link as well as the rows.

API and recurring workflows

import os
from datetime import timedelta
from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("ninhothedev/autoscout24-scraper").call(
run_input={
"searchUrls": ["https://www.autoscout24.de/lst/bmw?sort=standard&page=2"],
"maxItemsPerSearch": 3, "fetchDetails": True, "detailConcurrency": 2,
},
memory_mbytes=512,
run_timeout=timedelta(seconds=180),
max_total_charge_usd=Decimal("0.01"),
)
if run is None or run.status != "SUCCEEDED":
raise RuntimeError("Run did not succeed; inspect its log.")
record = client.key_value_store(run.default_key_value_store_id).get_record("RUN_SUMMARY")
if record is None or record["value"]["status"] != "complete":
raise RuntimeError("Coverage is partial or unavailable; inspect RUN_SUMMARY.")
for car in client.dataset(run.default_dataset_id).iterate_items():
print(car["id"], car["price_eur"], car["detail_status"], car["url"])

Save a task and use Apify Schedules, n8n, Make or webhooks for recurring snapshots. Compare stable IDs and prices in your own database or sheet. A webhook signals run completion; interpreting changes and sending alerts belongs to your downstream workflow.

FAQ and support

Which country sites can I use?

Inputs accept .de, .at, .ch, .it, .es, .nl, .be, .fr, .lu and .com AutoScout24 search domains. Source layouts and access differ; this is not a guarantee that all domains work at every moment. Begin with a small test of your actual country URL. Country filters are ignored when explicit URLs are supplied.

Do I need a proxy?

The default uses Apify Proxy; it can be explicitly disabled. Availability depends on the source and IP. A configured proxy is not a guarantee of access. Inspect the run log and summary if searches are blocked rather than treating a missing dataset as proof of no matching cars.

How do I report a problem?

Open the Actor’s Issues tab with the run ID, minimal input and expected result. Keep credentials and private customer data out. Public listings can contain personal information; use the data only for an appropriate purpose and follow applicable source terms.

mobile.de vehicle listings · Immowelt property listings · ImmoScout24 listings