Funda Scraper - Netherlands Property Listings
Pricing
from $2.20 / 1,000 results
Funda Scraper - Netherlands Property Listings
Extract Funda property listings, new-build projects, broker offices and area statistics across the Netherlands. Pay per delivered row, plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Funda Scraper
Extract Funda property listings, broker offices and area statistics as exportable rows for Dutch real-estate research.
- Search homes for sale, rentals and new-build properties.
- Collect several Dutch areas or specific listing URLs in one run.
- Get prices, floor areas, rooms, energy labels and public broker contacts.
- Add property features and media when available.
- Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.
What does Funda Scraper do?
Funda Scraper collects public data from Funda.nl for property research, price monitoring and agency directories. Each row represents a listing, project, office, area or insights record; rowType identifies it.
- Property search:
koopfor sale,huurfor rent andnieuwbouwfor new builds. - Other channels:
makelaarfor offices,mapfor map search,sitemapfor URL inventory,suggestfor area suggestions andinsightsfor area statistics. - Specific listings:
detailUrlscollects the links you supply instead of an area search. - Enrichment:
enrichDetailsandenrichLeaddefault totrue;enrichMediaandsitemapDetailsdefault tofalse. They add fields to the same row, not separately billed contact or photo rows.
What data can you extract from Funda?
Fields depend on the channel and public availability. Missing values remain empty or absent. Examples below are illustrative, not current listings or valuations.
Listing rows
| Field | Description | Example |
|---|---|---|
rowType | Entity category | listing |
id | String identifier | 43000000 |
listingUrl | Funda detail link | https://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/ |
address | Structured property address | {"street":"Example Street","unit":"1","locality":"Amsterdam"} |
city | City | Amsterdam |
price | Asking price or rent; usually numeric | 450000 |
priceCurrency | Currency when a price is present | EUR |
floorArea | Living area in square metres | 85 |
rooms | Room count | 4 |
bedrooms | Bedroom count | 3 |
energyLabel | Published energy rating | A |
agentName | Property agency name | Example Agency |
features | Detailed property characteristics | {"overdracht.Aanvaarding":"In overleg"} |
media | Available photos, floor plans and videos | {"photos":[]} |
contentDepth | Public-access scope | guest_preview |
Project rows
New-build searches can return individual listings as well as projects.
| Field | Description | Example |
|---|---|---|
rowType | Project category | project |
name | Project name | Example Development |
listingKind | Grouped offering when provided | group |
constructionType | Construction category | newly_built |
listingUrl | Project page | https://www.funda.nl/nieuwbouw/ |
id | Project identifier | 43000001 |
city | Project location | Amsterdam |
price | Price when supplied | 450000 |
floorArea | Area when supplied, in square metres | 85 |
status | Availability when supplied | active |
Office rows
| Field | Description | Example |
|---|---|---|
rowType | Office category | office |
officeName | Brokerage name | Example Agency |
officeUrl | Office page | https://www.funda.nl/makelaar/12345-example-agency/ |
phones | Public office phone numbers | [{"value":"+1 555 0100","type":"landline"}] |
emails | Public office email addresses | [{"value":"name@example.com","type":"office"}] |
listingUrls | Office listing links | [] |
id | Office identifier | 12345 |
address | Structured office address | {"street":"Example Street","unit":"1"} |
web | Office website and social links | {"website":"https://example.com","socials":[]} |
employeeCount | Published employee count | 5 |
Area rows
| Field | Description | Example |
|---|---|---|
rowType | Suggestion category | area |
name | Display name | Amsterdam |
geoIdentifier | Value usable in selectedArea | amsterdam |
areaType | Funda area classification | Plaats |
listingCount | Published listing count | 120 |
id | Area identifier | amsterdam |
type | Preview category | area |
exact | Exact-match indicator | true |
country | Country code | NL |
scrapedAt | Collection timestamp | 2026-10-24T00:00:00Z |
Insights rows
| Field | Description | Example |
|---|---|---|
rowType | Statistics category | insights |
insightsCity | Requested city | amsterdam |
population | Published population | 100000 |
averageAskingPrice | Asking-price statistics | {"value":450000} |
averageAskingPricePerM2 | Price-per-square-metre statistics | {"value":5000} |
averageSellingTimeInDays | Selling-time statistics | {"value":30} |
id | City identifier | amsterdam |
province | Province name | Noord-Holland |
ageGroups | Population age breakdown | [] |
householdSituation | Household breakdown | [] |
How to scrape Funda
- Open Funda Scraper in Apify Console.
- Fill
selectedArea, such asamsterdam, and choosechannel. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Download the dataset or read it through the API.
An empty input starts an Amsterdam koop example with at most 3 rows from the form's sample values. Normal event charges apply. A single area field is enough for the default sale search; other channels still require channel. There is no public mode field.
Sale search
Use channel: "koop" and an area. selectedAreas accepts several areas; duplicate entities across them are delivered once.
Rental search
Use channel: "huur". A price filter such as Max-2000 limits the advertised rent.
New-build search
Use channel: "nieuwbouw". When omitted, constructionType becomes newly_built.
Specific listings
Fill detailUrls with Funda listing links. Leave channel on a property channel rather than combining it with office or statistics queries.
Office lookup
Set channel: "makelaar" and supply officeId or officeUrl. An office ID alone does not select this channel.
Map search
Set channel: "map", bbox and mapListingType. Coordinates use longitude first.
Sitemap inventory
Set channel: "sitemap" and select sitemapBuckets; no area is needed. Rows contain URLs and modification dates unless details are requested.
Area suggestions
Set channel: "suggest" and use selectedArea as the search text. Returned geoIdentifier values can be used in later searches.
Area insights
Set channel: "insights" and a city. Each available city produces one statistics row, not one row per property.
What to fill in
| Field | What to enter | Default |
|---|---|---|
selectedArea | City, province, neighbourhood, postcode or nl | Empty; sample amsterdam |
selectedAreas | Array of area names or slugs | Empty |
detailUrls | Array of Funda listing links | Empty |
officeUrl | Funda office link with channel: "makelaar" | Empty |
officeId | Numeric office ID as a string | Empty |
postalCode | Dutch postcode when no area is supplied | Empty |
channel | A channel described above; sale and rent are aliases | koop |
maxResults | Rows per area or detail URL; 1–500 | 70; form sample 3 |
maxPages | Search pages per area; 1–50 | 1 |
mapListingType | koop or huur for map search | koop |
bbox | minLon,minLat,maxLon,maxLat | Empty |
zoom | Map zoom level | Unset |
objectType | house, apartment, parking, land, storage, office, garage | Empty |
price | Funda range, such as Min-200000-Max-500000 | Empty |
sort | Funda sorting value, such as price.selling_price_asc | Empty |
constructionType | Construction filter, such as newly_built | Empty |
locale | nl or en for detail pages | nl |
enrichDetails | Include detail-page characteristics | true |
enrichLead | Include public broker office contacts | true |
enrichMedia | Include additional media where available | false |
sitemapBuckets | koop, huur, nieuwbouw, recreatie, europe | ["koop"] |
sitemapDetails | Add details to sitemap rows | false |
fields | Requested output fields, such as ["price","city"] | [] |
includeRaw | Include available original source data | false |
fields also selects the detail information needed; requesting contact or media fields can enable that enrichment. Identity fields remain in the output.
Sale search across two areas:
{"channel":"koop","selectedAreas":["amsterdam","utrecht"],"maxResults":3}
Rentals:
{"channel":"huur","selectedArea":"rotterdam","objectType":"apartment","price":"Max-2000","maxResults":3}
New builds:
{"channel":"nieuwbouw","selectedArea":"amsterdam","maxResults":3}
Specific listing: replace this illustrative URL with a current Funda link.
{"detailUrls":["https://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/"],"locale":"en","enrichMedia":true,"maxResults":1}
Office: replace the illustrative ID with the office's real ID.
{"channel":"makelaar","officeId":"12345","maxResults":1}
Map:
{"channel":"map","bbox":"4.85,52.35,4.95,52.40","mapListingType":"koop","maxResults":3}
Sitemap:
{"channel":"sitemap","sitemapBuckets":["koop"],"maxResults":3}
Suggestions:
{"channel":"suggest","selectedArea":"amsterdam","maxResults":3}
Insights:
{"channel":"insights","selectedArea":"amsterdam","maxResults":1}
maxItemsandlimitare accepted as aliases ofmaxResults.- Close field-name misspellings are corrected; other unknown fields are ignored with a note. Some invalid filters, such as an unsupported
locale, are ignored; an invalidchannelstill fails. - Invalid targets fail before row delivery with
INVALID_INPUT:, followed by the field and correction, such asdetailUrls must be funda.nl listing links. No rows are charged; the start fee can still apply. - Every run writes
INPUT_REPORTto its default key-value store, showing filled, corrected and ignored fields and whether it used the example input.
Output example
Illustrative listing row with a placeholder address:
{"id": "43000000","rowType": "listing","type": "listing","country": "NL","authority": "funda.nl","name": "Example Street 1","channel": "koop","listingUrl": "https://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/","city": "Amsterdam","price": 450000,"priceCurrency": "EUR","floorArea": 85,"rooms": 4,"energyLabel": "A","contentDepth": "guest_preview"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Nested fields such as media are easiest to preserve in JSON.
Why use this Funda scraper?
- Delivery-based billing: row charges apply to rows written to the dataset, plus the start fee.
- Partial results: rows returned before a handled stop or deadline can still be delivered. Already written rows remain available; a forced termination cannot guarantee delivery of unfinished work.
- Clear reporting:
RUN_SUMMARYrecords partial results and failed or skipped areas;ERROR_SUMMARYrecords failures. - Source-based values: absent information is not invented.
- Batch input: combine several areas or listing URLs in one run.
- No proxy setup: you do not need to set up proxies.
How much does it cost to scrape Funda?
The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. Default memory is 1024 MB, so a normal start costs $0.005. Platform usage is included in these prices.
| Apify plan | Start at 1024 MB | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
maxResults applies to each selected area or detail URL, defaults to 70 and accepts up to 500. Larger requests are collected in parts of 70. All row types count together; maxPages, availability and duplicate removal can reduce the number delivered.
The Free plan is limited to 200 rows per run and 10 runs of this Actor. These are limits set by the publisher. Paid plans do not have the 10-run cap. Set Maximum cost per run (maxTotalChargeUsd in the API) to cap the whole run's charges.
Example: two areas delivering 3 distinct rows each give 6 rows. On the Free plan at 1024 MB, the cost is 6 × $0.003 + $0.005 = $0.023 for one normal start.
What happens when the run timeout is too short
For a single-query run, automatic resumption can pause the run when collection needs longer than the chosen timeout. Multi-area runs keep waiting instead. When resumption is accepted, the status message is:
Queued on the collection backend; this run will resume automatically when results are ready (about N s).
The run temporarily appears as ABORTED. Once results are ready, the same run resumes, reports Resumed: delivering N rows., writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped, not delivered or charged twice. No manual restart is needed for this pause.
- The resume-attempt limit is 3. Keep the default timeout of 3600 seconds to reduce interruptions.
- If resumption is unavailable or refused, the run waits within its remaining time; genuine failures can still occur.
run-syncandrun-sync-get-dataset-itemswait at most 300 seconds and may return an empty dataset during a pause. For longer runs, start asynchronously and read the dataset afterSUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Add this remote server in Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:
https://mcp.apify.com?tools=lentic_clockss/funda-scraper
Sign in with Apify through OAuth, or supply Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/funda-scraper with APIFY_TOKEN set.
Example prompt: “Find three Funda rental apartments in Rotterdam with advertised rent up to EUR 2,000 and return their prices and URLs.”
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/funda-scraper").call(run_input={"channel": "koop", "selectedArea": "amsterdam", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/funda-scraper').call({channel: 'koop', selectedArea: 'amsterdam', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Over HTTP, send the JSON input to POST https://api.apify.com/v2/acts/lentic_clockss~funda-scraper/runs with an Authorization: Bearer header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.
Integrations
Use the Actor's Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable or your webhook. Apify Schedules can run recurring searches.
In het Nederlands
Met Funda Scraper verzamel je openbare woninggegevens van Funda in een exporteerbare tabel. Vul bij selectedArea een plaats in, bijvoorbeeld amsterdam, of gebruik selectedAreas voor meerdere gebieden. Kies koop voor koopwoningen, huur voor huurwoningen of nieuwbouw voor nieuwbouw. Voor een makelaarskantoor kies je makelaar en vul je officeId of officeUrl in. Begin met maxResults op 3 om de uitvoer te bekijken. Je ontvangt beschikbare prijzen, woonoppervlakten, kamers, energielabels en links. Niet-openbare gegevens blijven leeg. De kosten bestaan uit een startbedrag en een bedrag per geleverde rij. Download de resultaten als CSV, Excel of JSON. Stel vooraf een maximaal bedrag per uitvoering in.
FAQ
Is it legal to scrape Funda?
This Actor collects public data. You are responsible for checking Funda's terms and applicable data-protection law. Personal data requires a lawful basis; public availability alone does not authorize every reuse.
Why did my run end as ABORTED?
Read the status message. The automatic-resumption message described above means a temporary pause, not a completed failure. Other aborts, including manual stops, do not imply automatic resumption.
How many results can I get?
maxResults accepts 1–500 per input. Search availability, maxPages, the run's spending cap and Free-plan limits may reduce delivery. An office lookup or city-insights input normally returns one row.
Why are some fields empty?
Funda may not publish them, the chosen channel may not include them, or enrichment may be disabled or unsuccessful. loginGatedFields flags detected sign-in restrictions; it does not grant access.
Can I search several cities together?
Yes, use selectedAreas. Duplicate entities are removed across areas. If one area fails, available rows from other areas can still be delivered.
Can I get English descriptions?
Set locale to en for detail pages. This requests the English page where available; it does not promise translation of every source field.
Are broker contacts the homeowner's details?
No. Public office contacts are not private owner contacts. Contact forms and signed-in details are not exposed by this Actor.
Why did my Free-plan runs stop after ten runs?
The publisher allows 10 runs and at most 200 rows per run on the Free plan. A paid Apify plan removes that run-count cap.
Limitations
- Coverage focuses on Funda's Dutch property offering, not other property portals. A sitemap bucket is not a guarantee of complete geographic coverage.
- No signed-in content or guaranteed contact-field completeness. Rows use
contentDepth: "guest_preview". - Sitemap rows omit property details by default. Enable
sitemapDetailsor request relevant fields to add them. - Image lists, individual media lists and office employee lists are capped at 50 entries; count fields can show larger totals. Oversized
rawdata is trimmed. - Current searches are not a complete historical sales archive. Funda changes and unavailable pages can cause partial results or failures.
Related scrapers
More real estate and property data scrapers from the same publisher:
- Zumper Scraper
- Booli Scraper
- Craigslist Scraper
- PropertyGuru Scraper
- OpenSooq Scraper
- Apartments.com Rental Scraper
- Dot Property Scraper
- FINN.no Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.