Funda Scraper 🏠 Sale & Rental Listings | Only $0.75/1,000
Pricing
from $0.75 / 1,000 property listings
Funda Scraper 🏠 Sale & Rental Listings | Only $0.75/1,000
Extract Funda sale and rental listings by URL or city. Get structured property details, optional raw records and public agency contacts. Track price and status changes across runs. Start with a 5-listing sample.
Pricing
from $0.75 / 1,000 property listings
Rating
0.0
(0)
Developer
Pebblework Labs Inc
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Features
Share
Funda Scraper 🏠 | $0.75 per 1,000 Listings

Turn a Funda search into a property dataset. Come back to see what changed.
Paste a Funda search or property URL, or enter a Dutch city and price range. Get one structured row per unique listing, with optional property details, the full raw source record, and public agency contacts. Save a monitoring key to compare price, status and property changes across runs.
Built for housing research, property analysis and recurring market monitoring. No Funda login required.
Try it with 5 listings
Enter these settings in the Input tab, then select Start. Once the run finishes, open Dataset to inspect the property rows and download your results. This example requests up to five Amsterdam homes with property details.
{"location": "Amsterdam","transaction": "sale","maxItems": 5,"includeDetails": true,"residentialOnly": true,"maxRequests": 8,"maxRunSeconds": 180}
Prefer a URL? Replace location and transaction with:
{"searchUrls": ["https://www.funda.nl/zoeken/koop?selected_area=amsterdam&price=300000-600000"],"maxItems": 5,"includeDetails": true,"residentialOnly": true,"maxRequests": 8,"maxRunSeconds": 180}
Use either URL inputs or simple search settings in one run. Work limits can stop a run before the requested number is reached; its coverage summary explains why.
Bulk extraction
Requests above 50 properties automatically split dense searches into smaller price ranges. Results appear together in one dataset, deduplicated by Funda property ID. Each page is checkpointed; unfinished partitions retry with a bounded delay while completed work is retained. The Actor's status and Extraction progress output show delivered rows and pending or failed partitions. Confirmed rows can be downloaded while collection continues.
This bounded example targets 1,000 basic listing snapshots:
{"location": "Amsterdam","maxItems": 1000,"autoPartition": true,"includeDetails": false,"maxPages": 160,"maxRequests": 250,"maxRunSeconds": 1800,"maxTrafficMb": 150}
All partitions share these whole-run limits and one delivery/billing journal. Reaching 1,000 rows is limited coverage of the search, not a claim that every matching property was collected. Source failures or exhausted budgets can produce fewer rows. Original scope totals are reconciled before reporting complete coverage; unpriced listings are checked through the original search when needed. Explicit sort orders and starting pages retain ordinary pagination. Set autoPartition: false to use ordinary pagination for any search.
To resume an interrupted run, use Apify's Resurrect action with its original build and unchanged input. It reconciles existing output before continuing; work and fee budgets do not reset. Starting a new run creates a separate job and can charge for the same results again once customer billing is enabled.
What can you do with it?
| Your goal | What to use |
|---|---|
| Compare homes in a city or price band | Structured prices, addresses, living areas, bedrooms and energy labels |
| Build a richer property dataset | Optional descriptions, coordinates, construction year, features, VvE and cadastral sections |
| Watch a search over time | Persistent first/last observed times, changed fields and previous values |
| Connect properties with their agencies | Optional public agency names, phone numbers, emails and websites, where available |
| Keep source fields for your own analysis | Optional complete raw property record alongside normalized fields |
| Feed a report or data pipeline | Apify dataset access, JSON exports and CSV options |
Why try this Funda scraper?
- Start with a city, not a query URL. Choose sale or rent, then narrow by price, living area, room count or property type.
- Get useful columns immediately. Numeric EUR prices, normalized statuses and energy labels, stable listing identities, and explicit missing values make the output easier to work with.
- Keep the raw data when you need it. Enable
includeRawRecordto retain the full detail response alongside the structured record. This also enables detail collection. - Follow changes across runs. Reuse a
monitoringKeyto identify newly observed, updated, unchanged and returned listings. UsechangesOnlyto suppress verified unchanged rows. - Add public agency contacts. Enable
includeAgencyContacts; each unique agency is looked up once per run and its available contact fields are attached to relevant properties. - Know what was collected. The run summary distinguishes complete, empty, limited and partial results, with per-search coverage and stop reasons.
Choose how much data to collect
| Mode | Settings | Output |
|---|---|---|
| Listing snapshot | Default | Search-result fields such as price, address, area, bedrooms and energy label, where available |
| Property details | includeDetails: true | Adds descriptions, coordinates, construction year, full feature sections and media links, where available |
| Raw source record | includeRawRecord: true | Adds the complete property detail object and the original search record for search-derived rows |
| Agency contacts | includeAgencyContacts: true | Adds public agency name, phone, email and website, where available |
| Repeat-run monitoring | Set monitoringKey | Adds observed history and field changes for one fixed search scope |
A direct Funda property URL fetches that property's details automatically. Photos, floor plans, videos and brochures are returned as links; media files are not downloaded.
Example output
Trimmed from a real detailed result collected on November 5, 2026. Prices, availability and source data can change.
{"schemaVersion": "2.0","globalId": "8216708","transaction": "sale","address": "Columbusplein 12-1","postalCode": "1057TZ","city": "Amsterdam","province": "Noord-Holland","neighbourhood": "Columbusplein e.o.","price": 450000,"currency": "EUR","bedrooms": 2,"energyLabel": "C","yearBuilt": 1929,"status": "available","detailStatus": "complete"}
Detailed rows can also contain description, latitude, longitude, featureSections, cadastral, vve, floorPlans, photos360, videos and brochureUrl. Optional rawRecord, agencyContacts and change fields hold raw source data, agency enrichment and monitoring history. Missing source values remain null; a missing value is not converted to zero.
Track new observations and price changes
Run this input, then repeat it later with the same monitoring key:
{"location": "Amsterdam","transaction": "sale","minPrice": 300000,"maxPrice": 600000,"includeDetails": true,"residentialOnly": true,"monitoringKey": "amsterdam-sale-300k-600k","changesOnly": true,"maxItems": 20,"maxRequests": 25,"maxRunSeconds": 180}
The first run establishes observations; later runs compare the homes they actually see. Updated rows include changedFields and previous values. Reusing the same key with a different search scope is rejected; use a new key when changing that scope. Run one collection at a time for each key.
An unchanged search can produce zero dataset rows with changesOnly: true. Suppressed observations still count toward the item limit and consume source requests. A failed detail lookup stays explicitly unverified rather than being labelled a change.
The separate REMOVALS output is only populated after complete, exact search coverage. Absence means a listing left that search scope; it does not prove a sale or delisting. A capped snapshot cannot establish complete market changes. First-seen times mean first observed by this monitoring key, not the property's original publication date.
Main inputs
| Input | Purpose | Default |
|---|---|---|
location | Dutch city or Funda area slug; use instead of URLs | Required in simple search mode |
transaction | sale or rent | sale in simple search mode |
searchUrls | Funda search URLs or individual property URLs | Use instead of simple search settings |
minPrice, maxPrice | Price range in EUR | Unset |
minLivingArea, maxLivingArea | Living-area range in m² | Unset |
minRooms, minBedrooms | Minimum room/bedroom count | Unset |
propertyTypes | house, apartment, parking or building_plot | Unset |
includeDetails | Collect detailed property information | false |
includeRawRecord | Preserve complete raw property data; enables details | false |
includeAgencyContacts | Fetch available public agency contacts | false |
monitoringKey | Persistent history for a fixed search scope | Unset |
changesOnly | Suppress verified unchanged rows; requires a monitoring key | false |
residentialOnly | Keep confirmed houses/apartments | false |
maxItems | Global unique-observation limit across all inputs | 20; maximum 1000 |
Use maxRequests, maxPages, maxRunSeconds and maxTrafficMb to bound source work. An item limit is a ceiling, not a promise that the source will return that many homes.
Export and automate
Use the Apify dataset API to connect results to your own workflow. To repeat a search, save it as an Apify task and configure a schedule; use the same monitoring key when you want a continuing history. Running the Actor once does not create a schedule.
Download JSON/JSONL for complete nested and raw records. Native CSV is convenient for selected fields, but Apify's 2,000-column limit can omit fields when large nested records are flattened. Use JSON/JSONL when you need all nested fields; select a smaller set of fields for CSV.
Pricing and beta availability
Currently a private beta with pay-per-event pricing configured. The Actor has not been published on the Store. Basic extraction starts at $0.75 per 1,000 delivered listings, plus the run-start fee. Start with the five-listing example to assess your results.
| Event | Price (USD) |
|---|---|
| Basic property listings | $0.75 per 1,000 delivered listings |
| Complete property details | Additional $0.75 per 1,000 complete details ($1.50 total per 1,000 detailed listings) |
| Optional agency contacts | $3.50 per 1,000 successfully enriched unique agencies per run |
| Run start | $0.005 per run at up to 1 GB RAM, including runs with no new or changed output; $0.01 at 2 GB |
These event prices include standard run infrastructure costs. Overlapping inputs do not charge twice for the same property in one run. Failed detail and agency lookups do not incur their optional enrichment fees. Repeated scheduled runs can charge for results again. With changesOnly, suppressed unchanged rows have no listing, detail or contact fee; the run-start fee still applies. Apify's Pricing tab is the source of truth for active prices.
maxSpendUsd limits listing, detail and agency fees. The run-start fee is additional, including when this input is zero. Use Apify’s maximum cost per run to cap all event fees including the start fee. At up to 1 GB RAM, the minimum selectable total cap is $0.005; a detailed listing needs at least $0.0065 including start. At 2 GB, allow $0.01 for start alone. Use the source-work limits above to bound a trial. Owner-run infrastructure benchmarks are not customer prices.
Frequently asked questions
Does it work for rentals? Yes. Set transaction to rent, or use a Funda /zoeken/huur URL. Use sale or rental asking prices for analysis; these are not verified completed transaction prices.
Does it support fundainbusiness.nl? No. This Actor accepts supported funda.nl search and property URLs; the separate commercial portal is not supported.
Can I fetch a single property? Yes. Put its current Funda /detail/koop/... or /detail/huur/... URL in searchUrls and set maxItems to 1.
Can I collect all of the Netherlands? Collection follows your supplied search scope, up to 1,000 unique observations per run and your other work limits. Nationwide completeness and unlimited extraction are not promised. Automatic nationwide partitioning is not implemented.
Are contact details guaranteed? No. Agency enrichment returns public details available from the source. It does not discover private owner contacts or infer missing emails.
Are descriptions translated? No. Source descriptions and feature labels are generally Dutch. Neighbourhood names are available where supplied; demographic enrichment is not included.
What happens if collection stops early? Inspect the SUMMARY output. It reports coverage, counts, errors and stop reasons. Bounded runs can finish with limited coverage; source failures and excessive row issues are reported separately. Previously confirmed rows are retained.
How was it tested? Automated tests cover extraction, input validation, monitoring, spending limits, interrupted delivery and billing reconciliation. Private cloud checks inspect actual exported rows, not only the container status. An earlier reliability check exhausted its 60-second source budget without a result; the current release adds request diagnostics and reports unsuccessful zero-result collection as failed. A successful small sample does not establish seven-day reliability or nationwide completeness.
Help and technical details
Report a problem through the Actor's support/Issues channel when available. Include the run ID, input and the fields you expected, without credentials. This helps reproduce missing results, source changes and filter problems.
Use the Input, Output and API tabs for field definitions and integration examples. For complete nested data, export JSON or JSONL.
This Actor is independent of Funda and is not affiliated with or endorsed by Funda.