# Funda Netherlands Real Estate Scraper (`scraptivo/funda-nl-scraper`) Actor

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.

- **URL**: https://apify.com/scraptivo/funda-nl-scraper.md
- **Developed by:** [Scraptivo](https://apify.com/scraptivo) (community)
- **Categories:** Real estate, MCP servers, Integrations
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

**Funda Netherlands Real Estate Scraper** collects property listings from [Funda.nl](https://www.funda.nl) — the largest real estate platform in the Netherlands — and turns them into structured data for market research, price monitoring, and lead generation. Provide a search URL or city names, run the Actor, and export addresses, prices, property types, sizes, energy labels, and agent details to JSON, CSV, Excel, or your preferred integration. Use it to analyze the Dutch housing market, track asking prices, and collect agent contacts. Pricing starts at **$1 per 1,000 listings**, with optional detail extraction and agent contact extraction at **$1 per 1,000 each**.

### What can you automate with Funda Netherlands Real Estate Scraper?

- **Build property databases** — Collect buy and rent listings across all property types, locations, and price ranges in the Netherlands.
- **Monitor asking prices** — Track listing prices, price per m², and availability changes over time.
- **Analyze market trends** — Study supply and demand across cities, price brackets, and property types.
- **Generate agent leads** — Extract agent names and, when enabled, phone numbers and contact details for outreach.
- **Schedule recurring collection** — Run daily or weekly on the Apify Scheduler to keep market data current.

### Who is this scraper for?

| Team | Workflow |
|---|---|
| Real-estate investors | Analyzing the Dutch market and identifying opportunities by city and price range. |
| Market researchers | Studying price trends, energy labels, and construction periods. |
| Agents and brokerages | Benchmarking competitor listings and monitoring new inventory. |
| Lead-generation teams | Collecting agent contact details for outreach. |

### What data can you collect from Funda.nl?

| Data group | Example fields | How it helps |
|---|---|---|
| Address | `address`, `streetName`, `houseNumber`, `postalCode`, `city`, `neighbourhood`, `municipality`, `province` | Locate each property precisely. |
| Price | `price`, `priceValue`, `priceCondition` | Track asking price and price condition (kosten koper / vrij op naam). |
| Property | `offeringType`, `propertyType`, `constructionType`, `floorArea`, `rooms`, `bedrooms`, `energyLabel` | Filter and compare listings by type and size. |
| Agent | `agentName`, `agentPhone`, `agentContactName` | Identify the listing agent; contact fields when enabled. |
| Location | `latitude`, `longitude` | Map listings geographically. |
| Media | `images` | Grab full photo galleries when detail extraction is enabled. |

`agentPhone` and `agentContactName` appear only when **Extract Agent Phone & Contact** is enabled; full descriptions, features, and galleries appear only when **Extract Listing Details** is enabled.

### How to use Funda Netherlands Real Estate Scraper

1. Open the [Funda Netherlands Real Estate Scraper](https://apify.com/scraptivo/funda-nl-scraper) on Apify.
2. Paste a Funda search URL or enter **Search Locations** such as "Amsterdam".
3. Optionally set filters for price, property type, rooms, floor area, energy label, and more.
4. Enable **Extract Listing Details** and **Extract Agent Phone & Contact** for enriched output.
5. Run the Actor and export the dataset or connect it to your workflow.

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

### Example workflow

#### Track apartments for sale in Amsterdam each week

1. Schedule a run every Monday with `searchQueries` = `["Amsterdam"]`, `offeringType` = `"buy"`, and `propertyTypes` = `["apartment"]`.
2. Export the dataset and keep `address`, `priceValue`, `floorArea`, `rooms`, `energyLabel`, and `url`.
3. Compare this week's `priceValue` against last week's to spot price changes and new listings.
4. Deduplicate user-side against the stable `listingId` or listing `url`.

### Automate and integrate your results

- **Schedules** — New listings and price changes appear daily. Run **daily** for close monitoring of a city or **weekly** for market research. Create separate scheduled tasks per location so each keeps its own dataset.
- **Webhooks** — Enable a webhook on run completion to push fresh listings into a CRM, database, or Slack pipeline.
- **Exports and API** — Download results as JSON, CSV, or Excel from the Apify Console, or call the Actor from the API:

```shell
curl "https://api.apify.com/v2/acts/scraptivo/funda-nl-scraper/runs?token=YOUR-APIFY-TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["Amsterdam"],
    "offeringType": "buy",
    "extractDetails": true,
    "extractAgentContact": true,
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
  }'
```

- **Deduplication** — The Actor appends new results on every run and does not deduplicate across runs. Use the stable listing `url` or `listingId` when merging results.

### Input reference

| Field | Type | Required | Default | What it controls |
|---|---:|---|---|---|
| `startUrls` | Array of URLs | No | — | Funda search URLs (parameters extracted from the URL; other filters taken from fields below). |
| `searchQueries` | Array of strings | No | `[]` | City names, neighborhoods, or postal codes (ignored when URLs provided). |
| `offeringType` | Select | No | `buy` | Buy (koop) or rent (huur). |
| `minPrice` / `maxPrice` | Integer | No | — | Filter by asking price in EUR. |
| `propertyTypes` | Array | No | `["apartment","house"]` | Property types (apartment, house, parking, land, and more). |
| `minFloorArea` / `maxFloorArea` | Integer | No | — | Filter by floor area in m². |
| `minRooms` / `maxRooms` | Integer | No | — | Filter by number of rooms. |
| `minBedrooms` / `maxBedrooms` | Integer | No | — | Filter by number of bedrooms. |
| `publicationDate` | Select | No | `no_preference` | Show listings published within a time frame. |
| `availability` | Select | No | `available` | Availability status (available, negotiations, sold). |
| `energyLabels` | Array | No | `[]` | Filter by energy label (A++++ to G). |
| `extractDetails` | Boolean | No | `false` | Include full description, features, coordinates, and photo gallery. |
| `extractAgentContact` | Boolean | No | `false` | Include agent phone, contact name, and office details. |
| `detailConcurrency` | Integer | No | `10` | Parallel detail requests when detail extraction is enabled (1–50). |
| `maxItems` | Integer | No | `100` | Maximum listings to scrape (`0` = no limit). |
| `proxyConfiguration` | Proxy object | No | Apify proxy, RESIDENTIAL | Proxy settings for the run. |

Additional filters cover construction period, exterior space, garage/parking, and more. See the Input tab in Apify Console for the full list.

### Output example

Each dataset item is one property listing:

```json
{
    "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/..."]
}
```

### How much does it cost to scrape Funda.nl?

The Actor uses pay-per-event pricing with three chargeable events:

- **$1 / 1,000 listings** — a `result` event for every listing record pushed to the dataset.
- **$1 / 1,000 listings** — a `listing-details` event per listing when **Extract Listing Details** is enabled.
- **$1 / 1,000 listings** — a `contact-info` event per listing when **Extract Agent Phone & Contact** is enabled.

You only pay for what you extract. A basic run of 1,000 listings costs **$1**; enabling both add-ons costs **$3** per 1,000 listings in total. A one-time actor-start event is also charged per run (one event per GB of memory, minimum one). Compute units consumed are deducted from your Apify plan, and volume discounts on paid Apify plans reduce the per-1,000 rate. When your event spending limit is reached, the run stops gracefully.

### Reliability and responsible use

- **Proxy requirement** — The Actor defaults to the Apify proxy with the RESIDENTIAL group. Residential IPs are required for reliable runs on Apify Cloud.
- **Retries and rate limits** — The Actor includes built-in retry logic and handles rate limiting gracefully.
- **Conditional fields** — `agentPhone` and `agentContactName` appear only when **Extract Agent Phone & Contact** is enabled; detail fields appear only when **Extract Listing Details** is enabled. Some fields are nullable on the platform.
- **Public data** — The Actor collects publicly visible property information from Funda.nl.
- **Responsible use** — Only use the data in ways that comply with Funda.nl's terms of service and applicable law.

### Frequently asked questions

#### Can I scrape Funda.nl by city or postal code?

Yes. Add city names, neighborhoods, or postal codes to `searchQueries` — for example "Amsterdam" or "1012AB" — or paste a full Funda search URL. URLs without a location search nationwide.

#### Can I scrape both buy and rent listings?

Yes. Set `offeringType` to `buy` (koop) or `rent` (huur). The default is `buy`.

#### What counts as one result?

A listing record counts as one `result` event ($1 per 1,000). If **Extract Listing Details** is enabled, each listing also counts as a `listing-details` event ($1 per 1,000), and if **Extract Agent Phone & Contact** is enabled, each listing counts as a `contact-info` event ($1 per 1,000).

#### Why are some fields empty?

Detail fields (full description, features, photo gallery) require **Extract Listing Details**, and agent phone/contact require **Extract Agent Phone & Contact**. Funda itself also leaves some fields unset for certain listings, so a null value usually means the platform has no data for it.

#### How do I avoid duplicate records?

The Actor appends results on every run and does not deduplicate across runs. Use the stable listing `url` or `listingId` as the key when merging a fresh run into existing data.

#### Do I need a proxy?

The Actor defaults to the Apify residential proxy, which is required for reliable runs on Apify Cloud.

### Related Scraptivo automations

- **[Rightmove Scraper](https://apify.com/scraptivo/rightmove-scraper)** — Scrape UK property listings from Rightmove.
- **[Apartments.com Scraper](https://apify.com/scraptivo/apartments-scraper)** — Collect US rental listings from Apartments.com.
- **[Otodom Scraper](https://apify.com/scraptivo/otodom-scraper)** — Extract Polish real estate listings from Otodom.
- **[Immoweb Scraper](https://apify.com/scraptivo/immoweb-belgium-scraper)** — Scrape Belgian property listings from Immoweb.

### Support and custom workflows

Need a different field, source, or delivery workflow? Contact Scraptivo at scraptivo@gmail.com. Include the Actor name, sample URL, required fields, and expected volume so we can assess the request.

# Actor input Schema

## `startUrls` (type: `array`):

Paste full Funda search result URLs copied from your browser. Parameters are extracted from the URL; any filter not in the URL is taken from the input fields below. URLs without a location search nationwide. Optional: add Search Locations to restrict to a city when the URL has no selected\_area.

## `searchQueries` (type: `array`):

City names, neighborhoods, or postal codes (e.g. Amsterdam, Rotterdam, 1012AB). Ignored when Funda Search URLs are provided.

## `offeringType` (type: `string`):

Buy or rent. Ignored when Funda Search URLs are provided.

## `minPrice` (type: `integer`):

Minimum asking price. Buy: total sale price. Rent: monthly rent.

## `maxPrice` (type: `integer`):

Maximum asking price.

## `propertyTypes` (type: `array`):

Leave empty for all property types.

## `constructionType` (type: `string`):

Filter by construction type

## `minFloorArea` (type: `integer`):

Minimum living area in square meters

## `maxFloorArea` (type: `integer`):

Maximum living area in square meters

## `minPlotArea` (type: `integer`):

Minimum plot/land area in square meters

## `maxPlotArea` (type: `integer`):

Maximum plot/land area in square meters

## `minRooms` (type: `integer`):

Minimum number of rooms

## `maxRooms` (type: `integer`):

Maximum number of rooms

## `minBedrooms` (type: `integer`):

Minimum number of bedrooms

## `maxBedrooms` (type: `integer`):

Maximum number of bedrooms

## `publicationDate` (type: `string`):

Show listings published within this time frame

## `availability` (type: `string`):

Filter by availability status

## `energyLabels` (type: `array`):

Leave empty for all energy labels.

## `exteriorSpaceTypes` (type: `array`):

Leave empty for all exterior space types.

## `hasGarden` (type: `boolean`):

Only show properties with a garden (shortcut for Exterior Space Types → Garden)

## `constructionPeriods` (type: `array`):

Leave empty for all construction periods.

## `surroundingTypes` (type: `array`):

Leave empty for all surrounding area types.

## `garageAllGarages` (type: `boolean`):

Filter for properties with any garage type

## `garageBasement` (type: `boolean`):

Filter for properties with a basement garage

## `garageBuiltIn` (type: `boolean`):

Filter for properties with a built-in garage

## `garageCarport` (type: `boolean`):

Filter for properties with a carport

## `garageDetached` (type: `boolean`):

Filter for properties with a detached garage

## `garageAndCarport` (type: `boolean`):

Filter for properties with both garage and carport

## `garagePossible` (type: `boolean`):

Filter for properties where a garage can be built

## `garageLeanTo` (type: `boolean`):

Filter for properties with a lean-to garage

## `garageLockUp` (type: `boolean`):

Filter for properties with a lock-up garage

## `garageParkingSpace` (type: `boolean`):

Filter for properties with a garage parking space

## `garageUnderground` (type: `boolean`):

Filter for properties with an underground garage

## `parkingOnEnclosedProperty` (type: `boolean`):

Filter for parking on enclosed property

## `parkingOnPrivateProperty` (type: `boolean`):

Filter for parking on private property

## `parkingPaidParking` (type: `boolean`):

Filter for paid parking nearby

## `parkingGarage` (type: `boolean`):

Filter for parking garage availability

## `parkingPermits` (type: `boolean`):

Filter for parking permit availability

## `parkingPublic` (type: `boolean`):

Filter for public parking nearby

## `freeTextSearch` (type: `string`):

Search within listing descriptions and details

## `sortBy` (type: `string`):

How to sort the results

## `extractDetails` (type: `boolean`):

When enabled, includes the full listing description, property features, coordinates, and complete photo gallery for each result.

## `extractAgentContact` (type: `boolean`):

When enabled, includes the agent phone number, contact person name, and office details when available.

## `detailConcurrency` (type: `integer`):

Maximum number of listings processed in parallel when detail extraction is enabled.

## `maxItems` (type: `integer`):

Maximum number of listings to scrape (0 = no limit)

## `proxyConfiguration` (type: `object`):

Proxy settings. Residential proxy is required for reliable runs on Apify Cloud. The default enables Apify residential proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D"
    }
  ],
  "searchQueries": [
    "Amsterdam"
  ],
  "offeringType": "buy",
  "propertyTypes": [
    "apartment",
    "house"
  ],
  "publicationDate": "no_preference",
  "availability": "available",
  "energyLabels": [],
  "exteriorSpaceTypes": [],
  "hasGarden": false,
  "constructionPeriods": [],
  "surroundingTypes": [],
  "garageAllGarages": false,
  "garageBasement": false,
  "garageBuiltIn": false,
  "garageCarport": false,
  "garageDetached": false,
  "garageAndCarport": false,
  "garagePossible": false,
  "garageLeanTo": false,
  "garageLockUp": false,
  "garageParkingSpace": false,
  "garageUnderground": false,
  "parkingOnEnclosedProperty": false,
  "parkingOnPrivateProperty": false,
  "parkingPaidParking": false,
  "parkingGarage": false,
  "parkingPermits": false,
  "parkingPublic": false,
  "sortBy": "relevance",
  "extractDetails": false,
  "extractAgentContact": false,
  "detailConcurrency": 10,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing scraped property listings

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D"
        }
    ],
    "searchQueries": [
        "Amsterdam"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scraptivo/funda-nl-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D" }],
    "searchQueries": ["Amsterdam"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scraptivo/funda-nl-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D"
    }
  ],
  "searchQueries": [
    "Amsterdam"
  ],
  "maxItems": 20
}' |
apify call scraptivo/funda-nl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scraptivo/funda-nl-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CI6PNL9oB1bUejz9P/builds/81kIZVv3oEOpvag1g/openapi.json
