Funda Netherlands Real Estate Scraper avatar

Funda Netherlands Real Estate Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Funda Netherlands Real Estate Scraper

Funda Netherlands Real Estate Scraper

Scrape property listings from Funda.nl — the largest real estate platform in the Netherlands. Supports buy and rent, all property types, price ranges, locations, and detailed filters.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Ali

Farhan Ali

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Funda Netherlands Real Estate Scraper creates a structured dataset of property listings collected from Funda.nl, the largest real estate platform in the Netherlands. Each dataset item represents one property and can include address, price, size, energy label, rooms, and agent details, with optional full descriptions, coordinates, photo galleries, and agent contact information. Query the source by Funda search URL or by location with detailed filters, control the result limit with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or other supported formats.

Dataset at a glance

PropertyValue
Sourcefunda.nl (Netherlands)
Record unitOne property listing, with optional nested detail and agent-contact fields
Input methodsFunda search URL (startUrls) or location search (searchQueries) with filters
Main identifierslistingId, listing url
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, XML, HTML (Apify dataset exports)
Update modelFresh records per Actor run
Pricing$1 per 1,000 listings; +$1 per 1,000 for details; +$1 per 1,000 for agent contact

Coverage and available records

The Actor collects properties from public Funda pages using one of two entry points:

  • URL-based: Pass full Funda search result URLs in startUrls. Parameters are read from the URL; any filter missing from the URL is taken from the input fields below it.
  • Location-based: Pass city names, neighborhoods, or postal codes (for example Amsterdam or 1012AB) in searchQueries, combined with offeringType and filters. URLs without a location search nationwide.

Supported property types: apartment, house, parking, berth, pitch, land, storage, storage_space, and substructure.

Record types and limits:

  • Listing-level records are always collected: address, price, price value, price condition, offering type, property type, construction type, floor area, rooms, bedrooms, energy label, description, coordinates, and agent name.
  • Detail fields are conditional: the full listing description, property features, coordinates, and complete photo gallery are returned when extractDetails is enabled.
  • Agent contact fields are conditional: phone number, contact person name, and office details are returned when extractAgentContact is enabled.
  • Result cap: maxItems limits the number of listings collected (0 means no limit; the default is 100).

Known exclusions: each run captures page state at run time (no historical snapshots); detail and agent-contact fields are not collected unless their toggles are enabled.

Data dictionary

Field names below match dataset record JSON properties exactly. Fields marked conditional appear only when the corresponding input toggle is enabled.

FieldTypeNullableDescriptionExample
addressstringNoFull address stringWilhelminastraat 117 3, 1054WB Amsterdam
streetNamestringYesStreet nameWilhelminastraat
houseNumberstringYesHouse number117
postalCodestringYesDutch postal code1054WB
citystringYesCityAmsterdam
neighbourhoodstringYesNeighborhoodCremerbuurt-West
municipalitystringYesMunicipalityAmsterdam
provincestringYesProvinceNoord-Holland
pricestringYesPrice as rendered (with condition)€975.000 k.k.
priceValuenumberYesNumeric price in EUR975000
priceConditionstringYesPrice conditionkosten_koper
offeringTypestringYesBuy or rentbuy
propertyTypestringYesProperty typeapartment
constructionTypestringYesConstruction typeresale
floorAreanumberYesFloor area in m²110
roomsnumberYesNumber of rooms4
bedroomsnumberYesNumber of bedrooms3
energyLabelstringYesEnergy label (A++++ to G)B
descriptionstringYesShort promo descriptionDubbel bovenhuis met dakterras...
agentNamestringYesListing agent nameLiving Real Estate
agentPhonestringYesAgent phone (conditional — extractAgentContact)0205287862
agentContactNamestringYesContact person (conditional — extractAgentContact)Angelique Bijleveld
latitudenumberYesMap latitude (conditional — extractDetails)52.36126
longitudenumberYesMap longitude (conditional — extractDetails)4.862332
urlstringYesListing detail URLhttps://www.funda.nl/detail/koop/amsterdam/...
listingIdnumberNoFunda listing identifier; best stable deduplication key8054903
publicationDatestringYesPublication timestamp (ISO 8601)2026-06-21T09:00:02.7905094+02:00
statusstringYesListing statusnone
imagesstring[]YesPhoto gallery URLs (conditional — extractDetails)["https://cloud.funda.nl/...", ...]

Example dataset record

Real record produced with a location search (searchQueries: ["Amsterdam"]), buy offering, details and agent contact enabled. The images array is truncated for readability.

{
"address": "Wilhelminastraat 117 3, 1054WB Amsterdam",
"streetName": "Wilhelminastraat",
"houseNumber": "117",
"postalCode": "1054WB",
"city": "Amsterdam",
"neighbourhood": "Cremerbuurt-West",
"municipality": "Amsterdam",
"province": "Noord-Holland",
"price": "€975.000 k.k.",
"priceValue": 975000,
"priceCondition": "kosten_koper",
"offeringType": "buy",
"propertyType": "apartment",
"constructionType": "resale",
"floorArea": 110,
"rooms": 4,
"bedrooms": 3,
"energyLabel": "B",
"description": "Dubbel bovenhuis met dakterras op toplocatie, eigen grond en 3 slpkmr",
"agentName": "Living Real Estate",
"agentPhone": "0205287862",
"agentContactName": "Angelique Bijleveld",
"latitude": 52.36126,
"longitude": 4.862332,
"url": "https://www.funda.nl/detail/koop/amsterdam/appartement-wilhelminastraat-117-3/44409366/",
"listingId": 8054903,
"publicationDate": "2026-06-21T09:00:02.7905094+02:00",
"status": "none",
"images": ["https://cloud.funda.nl/valentina_media/b9028258-c909-48d7-b7eb-a77d10135299/14cb40c3-a40f-4e8d-ae1b-e66956f7c18d"]
}

The record above was produced with this input:

{
"searchQueries": ["Amsterdam"],
"offeringType": "buy",
"minPrice": 150000,
"maxPrice": 750000,
"propertyTypes": ["apartment", "house"],
"extractDetails": true,
"extractAgentContact": true,
"maxItems": 50,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Query and input reference

InputTypeRequiredDefaultAccepted valuesDescription
startUrlsarray (requestListSources)No*prefill URLFunda search result URLsURL-based entry point; parameters are read from the URL
searchQueriesarray (stringList)No*["Amsterdam"]City names, neighborhoods, postal codesLocation search, ignored when URLs are provided
offeringTypestringNobuybuy, rentBuy (koop) or rent (huur)
minPriceintegerNo0 or positive integerMinimum asking price in EUR
maxPriceintegerNo0 or positive integerMaximum asking price in EUR
propertyTypesarrayNo["apartment", "house"]apartment, house, parking, berth, pitch, land, storage, storage_space, substructureProperty types; empty means all
constructionTypestringNo"""", resale, newly_builtConstruction type filter
minFloorArea / maxFloorAreaintegerNo0 or positive integerLiving area range in m²
minPlotArea / maxPlotAreaintegerNo0 or positive integerPlot area range in m²
minRooms / maxRoomsintegerNo0 or positive integerRoom count range
minBedrooms / maxBedroomsintegerNo0 or positive integerBedroom count range
publicationDatestringNono_preferenceno_preference, 1, 3, 7, 10, 14, 30Listings published within N days
availabilitystringNoavailableavailable, negotiations, available_and_negotiations, soldAvailability status
energyLabelsarrayNo[]A++++GEnergy label filter; empty means all
exteriorSpaceTypesarrayNo[]garden, balcony, terraceExterior space filter
hasGardenbooleanNofalsetrue / falseShortcut for exterior space garden
constructionPeriodsarrayNo[]before_1906after_2020Construction period filter
surroundingTypesarrayNo[]rural, in_center, by_water, and moreSurrounding area filter
garage* / parking*booleanNofalsetrue / falseGarage and parking filters
freeTextSearchstringNoFree textSearch within listing descriptions
sortBystringNorelevancerelevance, price_asc, price_desc, floor_area_desc, publication_date_descSort order
extractDetailsbooleanNofalsetrue / falseCollect detail fields and photo gallery (charged as listing details)
extractAgentContactbooleanNofalsetrue / falseCollect agent phone and contact (charged as contact info)
detailConcurrencyintegerNo10150Parallel detail requests
maxItemsintegerNo1000 (no limit) or positive integerMaximum listings to collect
proxyConfigurationobjectNoApify proxy, RESIDENTIAL groupApify proxy groups or custom proxiesResidential proxies are required for reliable runs

* Provide either startUrls or searchQueries — at least one source is required.

Minimal request:

{ "searchQueries": ["Amsterdam"], "offeringType": "buy" }

Advanced request (location search with filters and enrichment):

{
"searchQueries": ["Amsterdam"],
"offeringType": "buy",
"minPrice": 150000,
"maxPrice": 750000,
"propertyTypes": ["apartment", "house"],
"energyLabels": ["A", "B"],
"exteriorSpaceTypes": ["garden"],
"availability": "available_and_negotiations",
"sortBy": "publication_date_desc",
"extractDetails": true,
"extractAgentContact": true,
"maxItems": 500,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Retrieve the data through the API

The Actor runs on the Apify platform, so there is no server to host and no crawling infrastructure to maintain.

  1. Start the Actor with a JSON input (console or API).
  2. Wait for the run to finish, or use a synchronous endpoint if you want the response inline.
  3. Retrieve items from the run's default dataset.
  4. Paginate or export the dataset.

Python example:

from apify_client import ApifyClient
client = ApifyClient("YOUR-APIFY-TOKEN")
run_input = {
"searchQueries": ["Amsterdam"],
"offeringType": "buy",
"maxItems": 50,
}
run = client.actor("datascrapers/funda-nl-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["listingId"], item["priceValue"], item["address"])

Apify generates ready-to-run Python, JavaScript, and cURL examples on the Actor's API tab. Do not put a real API token in shared code or URLs.

Data quality and record handling

  • Conditional fields: detail fields (latitude, longitude, images) are present only when extractDetails is enabled; agentPhone and agentContactName are present only when extractAgentContact is enabled.
  • Source changes: Funda page structure and values can change; unreadable fields are returned as null rather than fabricated.
  • Deduplication: each run appends fresh records; the Actor does not deduplicate listings across runs. Use listingId as the stable key and filter repeated runs against previously stored IDs.
  • Rate limits: Funda can rate-limit automated traffic; residential proxies are required for reliable runs.
  • Normalization: priceValue is a numeric EUR value while price preserves the rendered string with condition; publicationDate is an ISO 8601 timestamp.

Export and pipeline examples

DestinationRecommended methodTypical use
PostgreSQL / SupabaseDataset API poll or webhook consumerStore Dutch property inventory with price history
Google SheetsApify Google Sheets integrationShare market shortlists with agents
BI tools (Looker, Tableau)Scheduled export via Apify schedulerPrice-per-m² benchmarking by city
S3 / cloud storageScheduled export + integrationArchival of market snapshots

Pricing and cost examples

The Actor uses pay-per-event pricing with three chargeable events, all billed per 1,000 listings:

EventTriggerRate
ResultEvery listing record pushed to the dataset$1 per 1,000
Listing detailsextractDetails enabled, detail page fetched$1 per 1,000
Contact infoextractAgentContact enabled, agent contact retrieved$1 per 1,000

Example costs:

RecordsConfigurationEstimated base cost
1,000Listing only$1.00
10,000Listing only$10.00
1,000Listing + details$2.00
1,000Listing + details + agent contact$3.00

Apify paid plans reduce the per-1,000 rate. Compute units consumed by the run are billed by your Apify plan. Estimates depend on the verified pricing model and the options selected for the run.

Limitations and responsible data use

  • The Actor collects publicly accessible data from Funda pages only.
  • Field availability depends on what Funda renders at run time; some values can be null or missing, and site changes can alter fields.
  • Detail and agent-contact fields are only collected when their toggles are enabled.
  • The Actor does not provide historical snapshots unless you store them yourself.
  • Large runs require residential proxies; without them, coverage may degrade due to rate limiting.
  • You are responsible for compliance with Funda's terms of service, applicable privacy law, and any contractual obligations before using the data.

Dataset questions

What does one dataset item represent?

One property listing from Funda. Detail-page fields (images, coordinates) and agent-contact fields are nested inside the same record, so a listing with full details still produces a single dataset item.

Which field should I use as a unique identifier?

listingId is the stable Funda listing identifier and is the recommended deduplication key. The url (listing detail URL) is a reasonable secondary key.

Are fields nullable or conditional?

Yes. Detail fields (latitude, longitude, images) exist only when extractDetails is enabled; agentPhone and agentContactName exist only when extractAgentContact is enabled. Within available records, fields that Funda does not render (for example neighbourhood or energyLabel) are returned as null.

Can I retrieve the records as CSV or JSON?

Yes. The dataset can be exported as JSON, CSV, Excel, XML, or HTML from the Apify Console, and queried through the Dataset API.

Does the Actor return historical data?

No. Each run captures the state of the pages at run time. To track price changes over time, schedule repeated runs and store the outputs yourself.

What counts as a billable result?

Three pay-per-event charges apply: a result charge for every listing record ($1 per 1,000), a listing-details charge for each detail page fetched ($1 per 1,000), and a contact-info charge for each agent contact retrieved ($1 per 1,000). A listing-only run incurs only the result charge.

Which filters can I combine?

The Actor supports price, property type, construction type, floor and plot area, rooms, bedrooms, publication date, availability, energy label, exterior space, construction period, surrounding area, garage, and parking filters. Filters are ignored when startUrls are provided, since parameters are read from the URL.

  • Zoopla Scraper — UK property listings for cross-market housing research alongside Dutch data.
  • Apartments Scraper — US rental listings for comparative market analysis.
  • Redfin Scraper — US property listings and market signals for international real estate datasets.

Data Scrapers support

Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, required fields, expected record volume, and preferred delivery format.