Use AutoScout24 Car Search Across 9 European Markets with Python
Search AutoScout24 car listings across nine European countries by make, price, mileage, fuel type and body type, or fetch full detail records for specific listing URLs.
1. Choose the data you need
Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.
2. Prepare a source-based input
This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.
{
"country": "de",
"includeDetails": false,
"includeSellerProfile": false,
"make": "BMW",
"maxItems": 3,
"mode": "searchCars",
"powerUnit": "kw",
"vatDeductibleOnly": false
}
Download input.example.json and save your reviewed copy as input.json.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to do: search by filters, fetch listing URLs, replay search URLs, read dealer inventory, or resolve listing IDs. |
make | string | optional | Car brand/manufacturer to filter by (e.g. BMW, Mercedes-Benz, Volkswagen, Audi, Toyota). |
model | string | optional | Model name to filter (e.g. 3 Series, Golf, A4). Leave empty for all models. |
searchQuery | string | optional | Free-text keyword applied to the search (e.g. panoramic, quattro). |
yearFrom | integer | optional | Minimum first registration year (1900-2026). |
yearTo | integer | optional | Maximum first registration year (1900-2026). |
priceFrom | integer | optional | Minimum price in the selected market's currency (EUR everywhere except Switzerland, which uses CHF). |
priceTo | integer | optional | Maximum price in the selected market's currency. |
mileageMax | integer | optional | Maximum mileage in kilometres. |
fuelType | string | optional | Fuel type filter. 'hybrid' matches all hybrid and plug-in hybrid listings. |
transmission | string | optional | Transmission type filter. |
country | string | optional | Market to search. 'all' loops the 8 HTML markets plus Switzerland. '.com' is URL-only and is not part of 'all'. |
condition | string | optional | Vehicle condition. N=new, U=used, J=young used, O=oldtimer, D=demonstrator, S=other. Sent as `offer`, never `ustate`. |
bodyType | string | optional | Vehicle body type filter. |
vehicleType | string | optional | Vehicle category. HTML sends `atype` (C/B/N/X) and uses `/lst-moto`, `/lst-caravan` or `/lst-transporter` for motorcycles, campers and utility vehicles; Switzerland sends the plural `vehicleCategories` field with car/motorcycle/camper/utility/truck. |
drivetrain | string | optional | Drivetrain filter (HTML `dtrain`, CH equivalent). |
bodyColor | string | optional | Exterior colour filter. |
interiorColor | string | optional | Interior colour filter. |
upholstery | string | optional | Interior upholstery filter. |
equipment | array | optional | AutoScout24 equipment taxonomy IDs passed as `eq` (HTML) or `equipmentSearchAttributes` (CH). |
emissionStandard | string | optional | Emission standard code 1-11 (HTML `emclass`). |
previousOwnersMax | string | optional | Maximum previous owners (HTML `prevownersid`). |
listedWithinDays | string | optional | Only listings created within this many days (HTML `adage`). |
powerFrom | integer | optional | Minimum engine power in the unit set by Power Unit. HP is converted to kW before the request. |
powerTo | integer | optional | Maximum engine power in the unit set by Power Unit. HP is converted to kW before the request. |
powerUnit | string | optional | Unit for Power From / Power To. Bounds are always sent to AutoScout24 in kW. |
doorsFrom | integer | optional | Minimum number of doors. |
doorsTo | integer | optional | Maximum number of doors. |
seatsFrom | integer | optional | Minimum number of seats. |
seatsTo | integer | optional | Maximum number of seats. |
rangeFromKm | integer | optional | Minimum electric range. CH applies it server-side; HTML applies it when a detail record carries a range. |
engineSizeFromCc | integer | optional | Minimum engine displacement in cc (HTML `ccmfrom`, CH `cubicCapacityFrom`). |
engineSizeToCc | integer | optional | Maximum engine displacement in cc (HTML `ccmto`, CH `cubicCapacityTo`). |
vatDeductibleOnly | boolean | optional | Only VAT-deductible listings (HTML `vatded=true`). CH has no equivalent filter. |
damagedListings | string | optional | Whether to exclude, include, or return only damaged listings. |
zipCode | string | optional | Postal code for the radius filter (HTML `zip`; CH geo lookup). |
radiusKm | string | optional | Radius around the ZIP/postal code. |
sellerType | string | optional | Filter by dealer or private seller. |
sortBy | string | optional | Result ordering. `distance` requires zipCode; `power` and `make` are not exposed because they are unreliable or empty. |
sortOrder | string | optional | Ascending or descending. |
startPage | integer | optional | First result page (1-based, 200 listings per page). |
endPage | integer | optional | Last result page (inclusive). Clamped to the server's maximum page. |
listingUrls | array | optional | AutoScout24 detail URLs (absolute or market-relative) to fetch details for. |
searchUrls | array | optional | AutoScout24 search URLs. Their filters are parsed and replayed; page/size/tracking params are dropped. A user-supplied `cy` on a `.com` URL is preserved because it selects the real country feed there; `/lst-moto` paths switch to motorcycles. |
dealerUrls | array | optional | AutoScout24 dealer/stock URLs. The actor reads the dealer page and, when possible, follows its stock search. |
dealerIds | array | optional | HTML dealer customer IDs (cid) or Swiss seller IDs. Used by dealerInventory. |
listingIds | array | optional | UUIDs, Swiss numeric IDs, or full listing URLs. |
includeDetails | boolean | optional | Fetch each listing's detail page (or CH detail + equipment) to fill body, colour, doors, seats, equipment, history, VAT, seller, GPS, price evaluation, view/favourite counters, mileage-history URL, Carfax (with partner-integration fallback) and created date. Failures keep the search card. |
includeSellerProfile | boolean | optional | Fetch the dealer/seller profile once per seller from `dealerInfoPage` for website, email, VAT/UID, phones, address, contact name, opening hours, imprint, ratings and up to 10 reviews. No extra request is made when this option is off; failures do not drop the listing. |
maxItems | integer | optional | Maximum listings to return. Values above the 4,000/query ceiling use year/price slicing; the hard maximum is 10,000. Prefill uses 3 so scheduled checks stay fast. |
3. Start an Actor run
Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.
Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.
import json
import os
import urllib.request
# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
actor_input = json.load(stream)
token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
"https://api.apify.com/v2/acts/1K4YT3j4kaybWbN6D/runs?timeout=120&maxTotalChargeUsd=0.50",
data=json.dumps(actor_input).encode("utf-8"),
headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.
4. Inspect the actual results
Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.
Car listings from AutoScout24 with identity, vehicle, price, consumption, location, dealer profile (email, VAT/UID, reviews, address, opening hours), EV/charging, engagement counters, media, equipment/history, and enrichment metadata. Fields that the source does not publish are omitted; CHF prices use priceAmount + priceCurrency=CHF and all other markets use EUR.
Questions before you run
Which inputs are required?
The published required fields are mode
What does this guide verify?
The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.
What if the run request times out?
Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.
Generated from source build 7pM4ZAf08ybOi0aeF and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.