Jump to section
- Map the Market Structure Before You Crawl
- Market Routing and Currency by Country
- How to Build a Complete Discovery Crawl
- Why Partitioning Decides Completeness
- Three Pitfalls That Break Discovery
- Fields to Capture and How to Normalize Them
- Listing Fields, Raw Storage and Normalized Form
- Build a Listing History That Supports Market Analysis
- Treat Each Crawl as an Observation
- Deduplication Order
- Analyses the History Makes Valid
- Blocks, Errors and Count Mismatches
- Symptoms, Likely Causes and Fixes
- Compliance Boundaries
- Decide Between an In-House Scraper and a Managed Service
You need current AutoScout24 prices for a pricing model, a stocking decision, or a competitor report, and a quick scrape looks like the shortest route. The first run returns a clean file, the row count looks plausible, and nobody can tell whether the file missed a third of the market or counted the same car twice. That’s the normal failure mode for an AutoScout24 scraper. It doesn’t crash. It produces data that looks finished while partitions truncate, listings disappear, and German labels get reused for a market that doesn’t share them.
A reliable crawl treats AutoScout24 as a longitudinal dataset from the first request. Every record carries its market, every listing keeps a lifecycle history, and every partition reconciles against a reported count before it’s accepted. That discipline costs little at design time and it’s what makes the data auditable six months later.
Map the Market Structure Before You Crawl
Route every query before you fetch a single listing. AutoScout24 isn’t one site with a country filter. It’s eleven European markets, and each one behaves like its own site with its own language, currency, dealer structure, and vehicle categories.
The AutoScout24 company portrait traces the business to Munich in 1998, launched as MasterCar.de before joining the Scout24 Group and expanding across Europe, and it lists the current footprint as Germany, Austria, Italy, Belgium, the Netherlands, France, Luxembourg, Norway, Denmark, Poland, and Sweden. After Hellman & Friedman acquired the company in 2020, it has operated as an independent business covering new and used cars, motorcycles, camping vehicles, and commercial vehicles. A mature, multi-country platform means country-aware routing and schema normalization aren’t optional refinements.
Market Routing and Currency by Country
| Market | Currency | Routing note |
|---|---|---|
| Germany | EUR | Origin market; load its own taxonomy |
| Austria | EUR | German-language content; do not assume it matches Germany |
| Italy | EUR | Italian labels and taxonomy |
| Belgium | EUR | Dutch and French listing text |
| Netherlands | EUR | Dutch labels and taxonomy |
| France | EUR | French labels and taxonomy |
| Luxembourg | EUR | Mixed French and German content |
| Norway | NOK | Non-euro currency; check decimal and separator format |
| Denmark | DKK | Non-euro currency; check decimal and separator format |
| Poland | PLN | Non-euro currency; check decimal and separator format |
| Sweden | SEK | Non-euro currency; check decimal and separator format |
Make three decisions in order. First, choose the market endpoint each query goes to. Second, load the reference taxonomy for that market. Third, attach provenance fields to every record, specifically market, listing date, seller type, vehicle category, and source URL. A German make and model query reused for Norway can return empty or mismatched results because the labels come from a different reference set, and Norwegian prices in NOK need their own separator checks before any parser is trusted.
Markets are never merged into one table without a market column.
Run that check on a small sample from each market before scaling, and follow the same country-aware discipline described in the vehicle data scraping guide on methods and best practices. If a sample fails on labels or number formats, fix the routing, not the parser.
How to Build a Complete Discovery Crawl
A crawl can return valid pages and still miss part of the inventory. Completeness depends on how searches are divided, paginated, and checked. Build discovery in seven steps, keeping market and partition information on each result so gaps can be traced and corrected.
- Select the market endpoint for each query and record the market on every row.
- Load the reference taxonomies for that market before crawling, including makes, models, and vehicle categories.
- Estimate the search space using counts or facets when the endpoint provides them. Use the result to plan partitions.
- Partition searches by stable dimensions, such as make, model, price band, fuel type, geography, or registration year.
- Paginate each partition with the available page and size parameters, recording the partition and page alongside every result.
- Fetch detail records for newly observed or changed listing IDs, rather than repeatedly refetching unchanged listings.
- Reconcile each partition against an available count or total. Treat a mismatch as an incomplete partition and rerun it.

Why Partitioning Decides Completeness
A fixed page limit can truncate a large result set without returning an error. A broad search for a popular make may reach that limit while the crawler reports success. Because omitted listings often sit at the tail of the sort order, the resulting dataset can be biased rather than merely smaller. Divide broad searches into narrower partitions, then verify each partition wherever the endpoint exposes a count.
The Swiss AutoScout24 developer API reference documents resources for search, listings, vehicles, dealers, makes, models, vehicle categories, and reference data. Use the reference to understand the Swiss API’s documented structure, but do not assume it provides a count or facet endpoint for reconciliation. Where an endpoint supplies no count, record that limitation and use the partition and pagination records to check coverage.
For any API response, validate the returned structure against the expected schema. Keep authentication failures distinct from empty search results: an access error is not evidence that a partition contains no listings. This distinction prevents a failed request from becoming a gap in the longitudinal dataset.
Store the retrieval timestamp, market, query partition, page, and source listing ID on every observation. These fields make it possible to trace duplicates, investigate listings that disappear between runs, and rerun a specific partition after a correction. Keep observations partitioned by market, then compare runs using the same market and query boundaries. If those identifiers are missing, the run cannot be audited reliably.
Three Pitfalls That Break Discovery
- Seller-authorized access mistaken for public search: Credentials intended for a dealer’s own listings do not establish permission to search the wider marketplace. Confirm the endpoint’s access scope before designing discovery around it.
- Country taxonomies mixed across markets: Make, model, trim, and category labels can differ by market. Reusing one market’s reference set may produce empty or mismatched results that look like low inventory. Load the appropriate taxonomy before running each market’s searches.
- Page numbers treated as stable: Inventory can change while a crawl is running. A listing may shift between pages, causing a duplicate or a missed observation. Record the partition and page for diagnosis, and use listing IDs to identify repeated records across pages.
Reconciliation rule: When a partition has an available reported count, a mismatch means that partition is incomplete, regardless of the HTTP status.
Fields to Capture and How to Normalize Them
Keep the raw text beside every normalized value. That’s the governing principle for the whole field set, because every conversion you make, from price parsing to mileage cleanup, must be auditable and reversible later. If a normalization rule turns out to be wrong for one market, raw storage lets you reprocess history without recrawling pages that no longer exist.
Listing Fields, Raw Storage and Normalized Form
| Field | Keep as raw | Normalize to | Watch for |
|---|---|---|---|
| Listing ID | Platform identifier as shown | String key | Primary deduplication key |
| Canonical URL | Full URL as observed | URL without tracking parameters | Relisting may produce a new URL |
| Price | Price text as displayed | Numeric value with explicit currency code | Separators differ by market |
| Currency | Symbol or code as displayed | ISO 4217 code, such as EUR, NOK, or PLN | Symbols such as kr are shared by several currencies |
| Mileage | Text with unit label | Integer in kilometres where the unit is confirmed | Unit labels and thousands separators vary |
| Registration year | Date text as shown | Four-digit year | Partial or missing dates |
| Seller type | Dealer or private label | Enumerated value | Mixing types distorts price comparisons |
| Powertrain and battery | Attribute text | Enumerated fuel type; battery capacity in kWh where present | Inconsistent across model generations |
| Market and retrieval time | Country code and capture time | ISO country code; UTC timestamp | Required for audit and cross-market comparison |
Work through the table in order. Identifiers come first, because a listing without a stable ID can’t be deduplicated or tracked over time. Price, currency, mileage, registration year, seller type, and powertrain follow, and provenance closes the record. Formatting is where markets diverge most. Decimal separators, thousands separators, currency symbols, and unit labels all vary, so a price displayed as EUR 12.990 must become a numeric value with an explicit currency code, not a float that a later analyst misreads by a factor of a thousand.
Powertrain fields deserve the same rigour as price. The AutoScout24 data page reports that in 2023, electric-vehicle listings on AutoScout24’s European marketplace increased by 143%, according to AutoScout24. At that growth rate, battery capacity, charging, and range fields aren’t edge cases to be parked in a free-text attributes column. They need enumerated fuel types and numeric capacity fields now, even when coverage is uneven across model generations.
The same compare-like-with-like discipline applies outside cars. Anyone who has had to compare used bike listings across inconsistent seller descriptions will recognise the pattern, where the comparison only works once condition, components, and price basis are normalised into shared fields. Vehicle listings add currency and market provenance on top of that problem.
Validate at ingestion, not at analysis time, following the approach set out in the guide to normalize web scraped data with Python.
- Reject records without a listing ID: They can’t be deduplicated, linked, or audited.
- Flag implausible mileage values: A separator error usually shows up as a mileage figure that’s wildly out of range for the registration year.
- Log currency conflicts instead of guessing: A symbol shared by several currencies must be resolved from the market field, and the conflict recorded.
A field missing in one market is stored as null with a reason, never filled from a neighbouring listing.
That last rule protects cross-market comparisons. A null with a reason is honest data. A borrowed value is a silent error that survives every later check.
Build a Listing History That Supports Market Analysis
A large scrape of today’s inventory isn’t a reliable pricing or competitiveness dataset. It can’t tell you how long vehicles sat on the market, which listings were relisted to look fresh, or whether a price movement was a genuine cut. Those are the questions pricing and stocking decisions depend on, and a snapshot answers none of them.

AutoScout24’s own market reporting points the same way. The Swiss Marketplace Group media release on falling average prices describes reporting built on published listings, searches, contact enquiries, and deleted listings, with supply and demand analysed over defined quarters. Deleted listings and enquiry signals carry the demand story, and both are invisible in a one-off extract. The practical conclusion is that a production AutoScout24 scraper should be designed as a recurring measurement system, not a lead list generator.
Treat Each Crawl as an Observation
Never overwrite the listing table. Add to it.
- Run a discovery snapshot for the market and record when it ran.
- Canonicalize each URL and preserve the platform listing ID exactly as observed.
- Upsert into an immutable observation table with first-seen and last-seen timestamps, so history accumulates instead of being replaced.
- Request details with bounded retries, so a transient failure doesn’t mark a live listing as gone.
- Mark a listing inactive only after it’s absent from multiple consecutive snapshots or returns an explicit not-found response, and retain its final observation rather than deleting it.
The SearchAPI AutoScout24 listing API documentation underlines why step one matters, because public listing records can disappear when a vehicle is sold, so fresh search results should supply the current link or identifier before detail retrieval. A crawler that recycles old detail URLs manufactures missing data. The same documentation supports checking HTTP status, JSON validity, required identifiers, and schema drift on every response, and it notes that robots rules disallow selected paths including /dealerarea/, which a compliant crawl must exclude.
Deduplication Order
Apply keys in strict order. Use listing ID first, then canonical URL, then a composite fallback of normalized dealer, make, model, registration year, mileage, and price. The fallback exists for one job. When a vehicle disappears and returns under a new listing ID, the composite key links the new record to its earlier history instead of counting the same car twice. Without that link, relisted stock inflates supply and resets apparent time on market to zero.
Time-to-market runs from first-seen to deletion, not from the date you happened to crawl.
Analyses the History Makes Valid
Price-change tracking needs headline price and monthly financing figure stored as separate fields. Say a dealer lowers the headline price by EUR 500 while raising the financing rate. The listing appears cheaper, the monthly figure barely moves, and the effective cost changes less than the advertisement suggests. Only separate fields let you classify that correctly. The Sunmax Motors guide to auction prices makes a related point for auction data, where a price history is only useful when each past figure keeps its own context instead of being collapsed into a single current value.
Geographic comparability needs currency normalization and equivalent vehicle categories before any cross-border claim is made. A price gap between two markets can be a currency artefact, a category mismatch, or a genuine market difference, and the dataset must let an analyst separate the three. Electric vehicles raise the bar further, because powertrain, battery, charging, range, and equipment attributes are represented inconsistently across markets and model generations, so missing or changed fields need explicit treatment rather than silent defaults.
Use fixed quarterly snapshots for trend reporting so periods stay consistent and comparable, the same longitudinal logic that makes a price history product such as an eBay price tracker valuable. Ad hoc extracts taken on irregular dates produce trends that reflect your crawl schedule more than the market.
Blocks, Errors and Count Mismatches
The most frequent failure is a run that reports success while returning fewer records than the source holds. Check counts before you check anything else. Compare the extracted total with totalElements or the count response for every partition, and rerun any partition that comes up short. A short partition is a data problem with a mechanical fix, and it’s cheap to catch on the day it happens.
Keep count mismatches separate from access errors in your logs. An HTTP 401 or 403 must never be read as an empty result, because that single misclassification can wipe a market’s apparent inventory overnight and trigger false deletion logic downstream. Authentication failures and empty-result responses are different events, and they need different alerts and different responses.
Symptoms, Likely Causes and Fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Extracted count below totalElements | Partition too broad or fixed page limit reached | Split the partition by make, model or price band and rerun |
| Empty results for a known query | Taxonomy from another market | Reload the reference taxonomy for that market |
| Same vehicle stored twice | Relisting under a new ID | Apply the composite fallback key and link the records |
| Monthly price jumps without a real change | Financing display changed | Compare raw headline and monthly text separately |
| Schema validation fails | Site markup or API schema changed | Quarantine the batch, alert, and re-tune the parser |
Compliance Boundaries
Respect robots rules, which disallow selected paths including /dealerarea/. A permitted path isn’t permission to bypass authentication or access controls, and rotating identities to evade a block crosses that line. Keep request concurrency low, honour 429 responses and Retry-After headers, identify the crawler clearly, and review each market’s terms before production use, as the general guidance on common web scraping errors and their solutions recommends.
Close the loop with monitoring. Alert on schema drift and falling extraction success rates so breakage is caught in the same refresh cycle, and quarantine the batch whenever schema validation fails rather than loading partial records into history. In our managed pipelines, monitoring alerts WebscrapingHQ, not the client, when a target site changes or extraction success rate dips, which keeps the response inside the team that can re-tune the parser.
Decide Between an In-House Scraper and a Managed Service
Make the build decision before writing code. Build in-house when you need one market, a low refresh rate, and a team that will maintain selectors and validation as the site changes. Hand the work to a managed team when you need several markets, daily refreshes, monitoring, and retained history, because the operating burden grows with each market added.
Answer five questions first.
- Market scope: How many of the eleven markets are in scope now, and how many within a year?
- Refresh rate: How often must each market refresh for the data to stay decision-grade?
- Field depth: How many normalized fields, including powertrain and battery attributes, are required?
- History retention: Must historical observations, deletions, and price changes be kept?
- Incident ownership: Who responds, and how quickly, when the site changes mid-quarter?
The trade-off is maintenance, not extraction. Any competent engineer can fetch listings once. Keeping eleven market taxonomies current, reconciling counts daily, and linking relisted vehicles across quarters is an operations commitment, and the case for outsourcing web scraping usually turns on whether that commitment sits with your team or ours.
WebscrapingHQ does not sell self-serve scrapers. It builds a custom scraper and AI extraction pipeline tuned to the specific use case and delivers it on a recurring schedule as a managed engagement, and consultation requests are quoted within 24 hours. Write down the seven-step crawl and the field table for your own markets first, then make the build-or-hand-off decision against that specification rather than against a generic capability claim.
If your AutoScout24 data must stay complete, comparable, and auditable across several European markets and daily refreshes, WebscrapingHQ can build and operate the custom pipeline, with partition reconciliation, listing history, and monitoring handled as a managed recurring delivery. Share your markets, fields, and refresh schedule, and you’ll receive a scoped quote within 24 hours.
Want this done for you?
Send us the URLs. We'll quote it in 24 hours.
Paste the URL(s) you want scraped. We'll reply within 24 hours with a feasibility check and a ballpark quote.


