Funda Netherlands Real Estate Scraper
Pricing
Pay per event
Funda Netherlands Real Estate Scraper
Scrape normalized sale and rent listings from Funda.nl, the leading Dutch property portal. Get clean price, living area, energy label, room counts, and photo data per listing while we handle blocks, retries, and fingerprint rotation for you.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
🎯 What this scrapes
Funda.nl is the dominant property portal in the Netherlands, and its existing scraper field is crowded but untrusted: easyapi/funda-nl-scraper runs 4,870 jobs a month on a 5★ rating built from just 2 reviews, and ivanvs/funda-scraper runs 4,975 jobs with 0★ in a crowded field where nobody has earned trust at scale. This Actor mirrors the schema conventions of our other real-estate Actors (idealista, Rightmove, Bayut, Domain.com.au, Suumo) so buyers already comparing markets get the same clean shape here — normalized EUR pricing, m² living area, EU energy-label letters, room and bathroom counts, and photo galleries per listing, for both koop (sale) and huur (rent), backed by page- and listing-level fault isolation and a geo-splash guard neither named incumbent documents.
🔥 What we handle for you
- 🛡️ Browser fingerprint rotation —
curl-cffiimpersonates real Chrome / Firefox / Safari TLS handshakes, rotated across requests, so the target sees a browser, not Python. - 🌐 Proxy session rotation via Apify Proxy — fresh session and exit IP on every block, always pinned to a Dutch (
NL) exit so you never get a wrong-country page silently. - 🔁 Retries with exponential backoff on
408 / 429 / 5xx— up to 5 attempts per page,Retry-Afterhonoured. - 🧱 Page- and listing-level fault isolation — one blocked page or one bad listing is skipped and logged, never crashes the run.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps,
listing_idalways sourced from the URL (never Funda's own occasionally-mismatched internal ID). - 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.
💡 Use cases
- Home-buyer market research — pull current koop listings for a Dutch city, normalized price-per-m² included, to compare neighborhoods fast.
- Rental market benchmarking — track huur listing prices and living area across Amsterdam, Rotterdam, and other cities.
- PropTech and real-estate analytics — feed a clean, deduped listings dataset into a pricing or valuation model.
- Relocation services — build client-facing property shortlists with energy label and HOA fee data included.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
searchUrls | array | no | None | Direct funda.nl/zoeken/(koop |
location | string | no | None | City slug (e.g. 'amsterdam'), used when Search URLs is unset. |
operation | string | no | 'sale' | Sale (koop) vs. rent (huur). |
maxResults | integer | no | 100 | Cap on rows this run. |
enrich | boolean | no | True | True: fetch each listing's detail page for the full kenmerken field set (area, rooms, bathrooms, year built, energy… |
proxyConfiguration | object | no | {'useApifyProxy': True} | No proxy group forced by default (RESIDENTIAL availableCount=0 on FREE tier). The Actor pins country_code='NL'… |
Example input
{"location": "amsterdam","operation": "sale","maxResults": 5,"enrich": true,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
listing_id | string | URL-path numeric ID — never the ld+json internal id, which is observed to differ. |
url | string | Canonical detail URL. |
operation | string | 'sale' or 'rent', as requested. |
property_type | ['string', 'null'] | 'appartement'/'huis' from ld+json type or URL slug prefix. |
title | string | Street address, e.g. 'Afrikanerplein 5-3'. |
price | ['number', 'null'] | Vraagprijs / offers.price. |
currency | string | Always 'EUR'. |
price_per_sqm | ['number', 'null'] | Computed when both price and area_sqm are known. |
area_sqm | ['number', 'null'] | Woonoppervlakte (detail) or card text (summary). |
plot_area_sqm | ['number', 'null'] | Perceeloppervlakte, houses only, detail-only. |
rooms | ['integer', 'null'] | Aantal kamers, detail-only. |
bathrooms | ['integer', 'null'] | Aantal badkamers, detail-only. |
year_built | ['string', 'null'] | Bouwjaar, raw string (may be a range), detail-only. |
energy_label | ['string', 'null'] | Energielabel, EU EPC letter, detail-only. |
city | string | Breadcrumb / address.addressLocality. |
neighborhood | ['string', 'null'] | Breadcrumb, detail-only. |
listed_since | ['string', 'null'] | Aangeboden sinds, raw string, detail-only. |
hoa_fee | ['number', 'null'] | Bijdrage VvE, apartments only, detail-only. |
image_urls | array | photo[] gallery URLs (empty OK). |
scraped_at | string | ISO 8601 UTC row-creation timestamp. |
Example output
{"listing_id": "44551250","url": "https://www.funda.nl/detail/koop/amsterdam/appartement-afrikanerplein-5-3/44551250/","operation": "sale","property_type": "appartement","title": "Afrikanerplein 5-3","price": 835000.0,"currency": "EUR","price_per_sqm": 8186.27,"area_sqm": 102.0,"plot_area_sqm": null,"rooms": 3,"bathrooms": 1,"year_built": "1925","energy_label": "C","city": "Amsterdam","neighborhood": "Transvaalbuurt-West","listed_since": "3 dagen","hoa_fee": 150.0,"image_urls": ["https://cloud.funda.nl/valentina_media/232/899/160_1440x960.jpg"],"scraped_at": "2026-08-13T12:00:00+00:00"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.05 | One-off warm-up charge per run |
result-row | $0.0012 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $1.25. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
v1 covers the Netherlands only. Agent/broker name and phone enrichment, mortgage calculators, new-development ('nieuwbouw') microsites, saved searches/alerts, historical price-change tracking, map/geo-coordinate fields, and postal code are out of scope for v1. year_built and listed_since ship as raw strings (Funda's own format, including ranges) rather than normalized values.
❓ FAQ
Do I need a Funda account or API key?
No. This Actor scrapes Funda.nl's own publicly listed property data — no login, no API key.
What's the difference between enrich on and off?
Enrich on fetches each listing's detail page for the full field set (rooms, bathrooms, year built, energy label, plot area, HOA fee, neighborhood, listed-since). Enrich off returns summary rows straight from the search results — faster and cheaper, but those detail-only fields come back null.
Why is listing_id sometimes different from the ID Funda shows elsewhere on the page?
Funda's own detail-page metadata occasionally carries an internal ID that differs from the ID in the page's own URL. We always use the URL-path ID — it's the stable, visible, dedup-safe one.
Can I scrape a specific search (filters already applied)?
Yes — pass your own funda.nl/zoeken/koop or /zoeken/huur URL via Search URLs and we paginate from there.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.