DEV Community

Devil Scrapes
Devil Scrapes

Posted on

How to Scrape 2dehands.be Car Listings (Belgium) to JSON/CSV

Quick answer: 2dehands.be publishes no public API for its Auto's (used-car) category. Use the 2dehands Belgium Car Scraper on Apify to extract price, make, model, year, mileage, fuel type, transmission, seller details, and photos from any filtered search โ€” no account required. Results land in a clean JSON or CSV dataset within minutes.

Belgium's biggest classifieds marketplace has tens of thousands of used-car ads posted every week. Whether you're building a price-comparison tool for the Belgian market, tracking a dealer's stock, or hunting arbitrage opportunities between Flanders and Wallonia, getting that data out of 2dehands.be is the hard part. The listings are behind a dynamic search layer, the site pushes back on anything that looks like a bot, and there's no developer API in sight. That's where a managed scraper earns its keep.

Does 2dehands.be have an API? ๐Ÿ”Ž

No. 2dehands.be (owned by Adevinta, the same group behind marktplaats.nl in the Netherlands) does not offer a public data API for its Auto's category. The platform's data is accessible only through its website. Developers who need structured data must scrape the public search and listing pages.

The challenge is that 2dehands actively defends against automated access: it fingerprints TLS handshakes, monitors request cadence, and serves different payloads to traffic it identifies as non-browser. A raw requests call against the listing endpoint returns either a block or a degraded payload.

We handle this for you. The Actor rotates Chrome, Firefox, and Safari TLS fingerprints via curl-cffi on every session, routes traffic through Apify's residential proxy pool (fresh exit IP on every block), and retries with exponential backoff โ€” up to 5 attempts per page, honouring Retry-After when the server provides one. You hand it a search URL; it hands you a dataset.

What data does the scraper return? ๐Ÿ“ค

Every row in the output dataset corresponds to one 2dehands car listing. The fields come directly from the ResultRow Pydantic model that validates every record before it touches your dataset:

{
  "listing_id": "m2405222556",
  "listing_url": "https://www.2dehands.be/v/auto-s/mini/m2405222556-mini-cooper-cabrio-1-6i-122pk-lci-highgate",
  "title": "Mini Cooper Cabrio 1.6i 122pk LCI Highgate",
  "make": "Mini",
  "model": "Cabrio",
  "year": 2013,
  "price": 8990,
  "currency": "EUR",
  "mileage_km": 124600,
  "fuel_type": "Benzine",
  "transmission": "Handgeschakeld",
  "engine_power_hp": null,
  "engine_power_kw": null,
  "engine_size_cc": null,
  "body_type": "Cabriolet",
  "color": null,
  "first_registration": "2013",
  "location": "Geel",
  "region": "Belgiรซ",
  "seller_type": "private",
  "seller_name": "jo",
  "photo_urls": [
    "https://images.2dehands.com/api/v1/hz-twh-pro-listing/images/c40a8319-34f2-493d-928a-1248413f3dfd?rule=ecg_mp_eps$_82.jpg"
  ],
  "description": "Mooie, exclusieve Mini Cooper Cabrio 1.6i 122pk in Iced Chocolate Metallic...",
  "posted_date": "Vandaag",
  "scraped_at": "2026-06-02T00:00:00+00:00"
}
Enter fullscreen mode Exit fullscreen mode

The full field list: listing_id, listing_url, title, make, model, year, price, currency, mileage_km, fuel_type, transmission, engine_power_hp, engine_power_kw, engine_size_cc, body_type, color, first_registration, location, region, seller_type, seller_name, photo_urls, description, posted_date, scraped_at.

Price is always an integer in EUR (or null for bidding / on-request listings). Mileage is always in kilometres. The posted_date field is the label as 2dehands shows it โ€” "Vandaag" (today), "Gisteren" (yesterday), or a date string.

Turn on enrichDetails and the Actor fetches each listing's detail page to pull the full Dutch description and confirm the make/model. Turn it off to halve the request count when you only need the search-card fields.

How to run it with Python ๐Ÿ

Install the Apify client:

pip install apify-client
Enter fullscreen mode Exit fullscreen mode

Then run a search. Paste any 2dehands Auto's results URL โ€” with your make, price range, region, or fuel-type filters already applied โ€” into searchUrl:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("DevilScrapes/2dehands-belgium-cars").call(
    run_input={
        "searchUrl": "https://www.2dehands.be/l/auto-s/bmw/",
        "maxResults": 100,
        "enrichDetails": True,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"]
        }
    }
)

items = list(
    client.dataset(run["defaultDatasetId"]).iterate_items()
)

print(f"Scraped {len(items)} listings")
for item in items[:3]:
    print(item["make"], item["model"], item["year"], item["price"], "EUR")
Enter fullscreen mode Exit fullscreen mode

Leave searchUrl empty to scrape the default used-car listing page across all makes.

What can you build with Belgian used-car data? ๐Ÿ’ก

Price analytics. Track asking prices for a specific make/model/year combination across Belgium. Filter by fuel_type to compare petrol vs. diesel vs. hybrid pricing in the same segment โ€” useful for insurers, fleet managers, and automotive researchers.

Dealer inventory monitoring. Run the scraper daily on a specific dealer's listings URL. Diff the listing_id sets between runs to detect new arrivals and price cuts. The seller_name and location fields let you scope the run to a single dealer.

Market research. Aggregate transmission and fuel_type across a full search result to measure EV and hybrid adoption in the Belgian secondhand market. 2dehands's Auto's category is a live proxy for consumer preference.

Lead generation. Build a dealer directory from seller_name + location + seller_type. Filter for seller_type == "dealer" to separate professional inventory from private sellers.

Arbitrage and sourcing. Apply mileage, year, and power filters on 2dehands, then compare against marktplaats.nl (Netherlands, same Adevinta platform) or AutoScout24 to identify under-priced imports. The shared EUR currency and consistent field names make cross-market comparison straightforward.

How much does it cost? ๐Ÿ’ฐ

The Actor uses Pay-Per-Event pricing. Two events fire per run:

Event Price
actor-start (once per run) $0.05
result-row (per listing) $0.002

1,000 listings costs $2.05 ($0.05 start + 1,000 ร— $0.002). You pay only for rows that land in your dataset โ€” if the run returns nothing, no result-row events fire. Every new Apify account starts with $5 of free credit, and no credit card is required to try.

FAQ โ“

Is scraping 2dehands.be legal?

Scraping publicly accessible web pages is a legal grey area that varies by jurisdiction; this Actor accesses only data visible to any anonymous visitor without logging in. Consult legal counsel before using the data commercially. The Actor does not access gated content, bypass authentication, or store personal data beyond what is publicly visible. See the Actor's Terms of Service notice on the Store listing.

How often should I run the scraper?

2dehands refreshes its Auto's inventory continuously. For price-tracking, a daily run is enough to catch new listings and price changes. For real-time lead generation on fresh private listings, consider running every few hours.

What happens if 2dehands blocks the scraper?

We rotate residential proxy exits and browser TLS fingerprints, retry with exponential backoff, and surface a clear status message rather than returning an empty dataset. If a page yields nothing after 5 attempts, the run fails loudly โ€” you see exactly what happened, not a silent empty result.

Can I filter by region or price?

Yes. Build your search on 2dehands.be with whatever filters you need โ€” region (Antwerpen, Brussel, Gent), price band, year range, body type โ€” then paste the resulting URL into searchUrl. The Actor walks all result pages from that filtered entry point.

Get started

The 2dehands Belgium Car Scraper is live on the Apify Store. Try it free โ€” no credit card, no signup friction beyond a free Apify account, and the first $5 of credit is on them.

Store link: https://apify.com/DevilScrapes/2dehands-belgium-cars

The devil's in the data โ€” go get it.


Built by Devil Scrapes โ€” a fleet of opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

Further reading:

Top comments (0)