DEV Community

Devil Scrapes
Devil Scrapes

Posted on

How to Scrape Marktplaats Car Listings (Netherlands) to JSON/CSV

Quick answer: Use the Marktplaats Netherlands Car Scraper on Apify. Paste a filtered Marktplaats auto's search URL, set maxResults, and the Actor walks the result pages and delivers structured rows — price in EUR, make, model, year, mileage, fuel, transmission, body type, drivetrain, energy label, seller, and photos — into a JSON or CSV dataset. No API key, no local scraping stack.

Why scrape Marktplaats for car listings?

Marktplaats.nl is the Netherlands' dominant classifieds marketplace — the Dutch equivalent of Craigslist and eBay Classifieds rolled into one. The auto's category carries listings from both private sellers and professional dealers (handelaren), making it the primary source for Dutch used-car pricing data. Marktplaats publishes no public API for its listings.

The site has a few characteristics that make extraction non-trivial: listing data is served through Marktplaats' own internal search service (not a straightforward HTML scrape), the platform uses Dutch-language spec labels (bouwjaar, kilometerstand, Handgeschakeld, Voorwielaandrijving), and it employs residential proxy detection on its search endpoints. The Actor handles all of that, including Dutch-specific quirks like bid-based listings (Bieden) and the Dutch energy label system (A through G).

What fields does the scraper return? 💡

Every row maps directly to the ResultRow Pydantic model in the Actor's source. Here is a realistic sample row:

{
  "listing_id": "m2406042278",
  "listing_url": "https://www.marktplaats.nl/v/auto-s/skoda/m2406042278-skoda-octavia-1-6-comfort",
  "title": "Skoda Octavia 1.6 Comfort",
  "make": "Skoda",
  "model": "Octavia",
  "year": 2001,
  "price": 1150,
  "currency": "EUR",
  "price_type": "Te koop",
  "mileage_km": 315844,
  "fuel_type": "Benzine",
  "transmission": "Handgeschakeld",
  "body_type": "Hatchback",
  "drive_train": "Voorwielaandrijving",
  "energy_label": "B",
  "color": "Grijs",
  "location": "Lienden",
  "region": "Nederland",
  "seller_type": "dealer",
  "seller_name": "MBSmart",
  "seller_id": "56392587",
  "photo_urls": [
    "https://images.marktplaats.com/api/v1/hz-mp-pro-listing/images/4933080c-8de2-40e5-95e9-e9cc46631ef3?rule=ecg_mp_eps$_85.jpg"
  ],
  "description": "Algemene informatie Aantal deuren: 5 Kleur: Grijs ...",
  "posted_date": "Vandaag",
  "scraped_at": "2026-06-02T00:00:00+00:00"
}
Enter fullscreen mode Exit fullscreen mode

The complete field set is: listing_id, listing_url, title, make, model, year, price, currency (always EUR), price_type, mileage_km, fuel_type, transmission, body_type, drive_train, energy_label, color, location, region, seller_type, seller_name, seller_id, photo_urls, description, posted_date, and scraped_at. The color and description fields are populated via detail-page enrichment.

Note drive_train — this is the exact field name in the ResultRow model (not drivetrain). Use it as-is when processing the dataset.

What does it cost to scrape Marktplaats listings?

Pricing is Pay-Per-Event.

Event Price
actor-start (one-off per run) $0.05
result-row (per car listing) $0.002

1,000 results in a single run costs $2.05 ($0.05 start + 1,000 × $0.002). Every new Apify account gets $5 of free credit — enough to pull your first two thousand listings before spending anything. No credit card required to start.

How does the anti-blocking work? 🔥

Marktplaats.nl protects its search endpoints from automated scraping. Here is how we handle it:

  • We rotate Chrome, Firefox, and Safari TLS fingerprints on every request using curl-cffi browser impersonation. The platform sees a real-browser TLS handshake, not a Python HTTP client.
  • We rotate residential proxy sessions through Apify Proxy on any block — a new session ID and a new Dutch exit IP, automatically.
  • We retry on 408, 429, and 5xx responses with exponential backoff (starting at two seconds, capping at thirty, up to five attempts per page), honouring Retry-After headers.
  • Sponsored Admarkt ads (item IDs beginning with a) are detected and skipped — they contaminate price analysis datasets.
  • Partial successes surface with a clear status message. We never quietly return an empty dataset.

The default proxy configuration already requests Dutch RESIDENTIAL exits. Nothing to configure.

How to run the scraper from Python

Install apify-client and call the Actor:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

run_input = {
    "searchUrl": "https://www.marktplaats.nl/l/auto-s/volkswagen/golf/#Language:all-languages",
    "maxResults": 200,
    "enrichDetails": True,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

run = client.actor("DevilScrapes/marktplaats-netherlands-cars").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(
        item["make"], item["model"], item["year"],
        item["price"], item["mileage_km"], item["energy_label"]
    )
Enter fullscreen mode Exit fullscreen mode

To target a specific search, apply your filters on marktplaats.nl, copy the URL, and paste it into searchUrl. The Actor translates it to the internal search query. Set enrichDetails to False if you only need the search-payload fields — price, make, model, year, mileage, fuel, transmission, body type, drivetrain, energy label, seller, and photos — without fetching each detail page.

What are the main use cases?

Used-car price analytics for the Dutch market

Marktplaats combines private sellers and dealers in a single feed, giving a complete picture of Dutch retail and C2C pricing. Pull listings for a model range, export to CSV, and build price-vs-age and price-vs-mileage charts. The energy_label column adds a sustainability dimension you will not find on most car data APIs.

Energy label composition research

The Netherlands has aggressive emission regulations and a strong push toward electrification. The energy_label field (A through G) lets you aggregate the label distribution across any search filter — useful for fleet compliance reporting, real-estate proximity analysis, or EV market research.

Dealer inventory monitoring

Filter seller_type to dealer, run on a cron schedule, and diff by listing_id to track new stock and price changes. The seller_id field lets you group all listings from the same dealership even when the seller_name display name changes.

Bid-based listing research

Listings with price_type: "Bieden" are minimum-bid auctions. Filter to Bieden listings and you have a view of the distressed-sale segment of the Dutch market — a common source of under-market deals.

Cross-border sourcing

Dutch used-car prices are competitive against some neighbouring markets, especially on specific segments. A Marktplaats dataset filtered by fuel_type, mileage_km, and year gives European importers a current Dutch benchmark.

FAQ

Is it legal to scrape Marktplaats.nl?

The Actor accesses publicly visible listing data — the same data any browser user sees without logging in. Marktplaats's terms of service govern automated access; review them for your use case before running at scale. We recommend responsible pacing and legitimate analytical use.

What is price_type and why is it sometimes Bieden?

Marktplaats supports fixed-price listings (Te koop), bid-based listings (Bieden), and reserved listings (Gereserveerd). The price field is still populated for Bieden listings (it shows the minimum bid), and price_type tells you which mode applies.

Why are color and description sometimes null?

Both come from the listing detail page, not the search payload. Set enrichDetails: true (the default) to fill them in. Turn it off to halve the request count — price, specs, seller, and photos all come from the search results.

How much does a run of 5,000 listings cost?

$0.05 (start) + 5,000 × $0.002 = $10.05.

Are sponsored Admarkt ads included?

No. Admarkt ads (item IDs starting with a) are detected and skipped automatically. They distort price comparisons and typically point to dealer landing pages rather than individual listings.

Start collecting Dutch car listing data

The Marktplaats Netherlands Car Scraper is live on the Apify Store. Click Try for free — $5 of credit included, no card required.

Your first dataset exports to JSON or CSV in minutes. Questions or edge cases? Open an issue on the Actor's Issues tab and we'll address it in the next weekly release.

Resources:

Top comments (0)