# Funda.nl Real Estate Scraper (`alwaysprimedev/funda-scraper`) Actor

Scrape property listings from Funda.nl — Dutch real estate portal. Extract prices, addresses, sizes, energy labels, photos and more.

- **URL**: https://apify.com/alwaysprimedev/funda-scraper.md
- **Developed by:** [Always Prime](https://apify.com/alwaysprimedev) (community)
- **Categories:** Lead generation, Real estate, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Scraper — The Dutch Real Estate Goldmine 🇳🇱

> **Turn funda.nl into a clean, structured dataset in minutes.**
> Built for analysts, investors, real-estate platforms, ML teams and anyone who wants Dutch property data on tap.

[![Made for Apify](https://img.shields.io/badge/Made%20for-Apify-ff9012)](https://apify.com)
[![Python 3.11](https://img.shields.io/badge/Python-3.11+-blue)](https://www.python.org/)
[![Output: JSON / CSV / XLSX](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20XLSX-success)]()

---

### ✨ Why this scraper?

🚀 **Blazing fast** — uses TLS-impersonated HTTP, **no headless browser**, no GBs of RAM. Pages return in **~0.5s**.
🧠 **Smart parsing** — pulls every meaningful field: price, m², rooms, energy label, year built, photos, location and more.
🧱 **Battle-tested** — rotates browser TLS fingerprints (Chrome / Firefox / Safari) so requests look 100% human.
🎯 **Filter to the listings you want** — by city, price range, sort order, sale or rent.
📦 **Plug-and-play output** — clean JSON ready for BI dashboards, BigQuery, Postgres or Pandas.
💰 **Pay-per-result friendly** — efficient enough to run cheap. Designed for monetization on the Apify platform.

---

### 🎬 What it does

Give it a city. Get a structured catalog of every property currently listed there:

```text
amsterdam ➜ 🏠 1,200+ listings  ➜  📊 30+ fields each  ➜  ☁️ JSON / CSV / XLSX
````

Run it once. Run it daily. Run it across 50 cities in parallel. The shape of the output never changes.

***

### ⚡ Quick start

1. Hit **Try for free** on the actor page.
2. Pick your areas (e.g. `amsterdam`, `rotterdam`, `utrecht`).
3. Choose **For sale** or **For rent**, set price range and how many listings you want.
4. Click **Start** ▶️ — your dataset is ready in a few minutes.

***

### 🛠️ Input

| Field | Type | Description | Example |
|---|---|---|---|
| `searchType` | enum | `koop` (sale) or `huur` (rent) | `"koop"` |
| `areas` | string\[] | City / region slugs | `["amsterdam", "utrecht"]` |
| `minPrice` | int | Minimum asking price (EUR) | `300000` |
| `maxPrice` | int | Maximum asking price (EUR) | `750000` |
| `sortBy` | enum | Order of results | `"price_up"` |
| `maxItems` | int | Stop after N listings (`0` = no limit) | `100` |
| `scrapeDetails` | bool | Full details per listing (slower) or URL-only (lightning fast) | `true` |
| `concurrency` | int | Parallel requests (1–25) | `5` |
| `startUrls` | string\[] | Advanced — raw Funda URLs to scrape directly | – |

#### Example input

```json
{
  "searchType": "koop",
  "areas": ["amsterdam", "haarlem"],
  "minPrice": 400000,
  "maxPrice": 900000,
  "sortBy": "date_down",
  "maxItems": 200,
  "scrapeDetails": true,
  "concurrency": 5
}
```

***

### 📦 Output — beautifully structured

Every listing comes back as a flat, BI-friendly JSON record:

```json
{
  "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-van-nijenrodeweg-488/43331703/",
  "id": "43331703",
  "scraped_at": "2026-05-04T23:19:39+00:00",
  "listing_type": "sale",

  "address": {
    "street": "Van Nijenrodeweg 488",
    "postal_code": "1082 HN",
    "city": "Amsterdam",
    "region": "Noord-Holland",
    "neighborhood": "Buitenveldert-Zuid-Midden"
  },

  "price_eur": 495000,
  "price_per_m2_eur": 5690,
  "service_costs_eur": 70,
  "vve_costs_eur": 238,
  "status": "Beschikbaar",
  "acceptance": "In overleg",

  "property_kind": "Appartement",
  "property_type": "Portiekwoning (appartement)",
  "build_type": "Bestaande bouw",
  "year_built": 1965,
  "roof_type": "Plat dak bedekt met bitumineuze dakbedekking",

  "living_area_m2": 87,
  "exterior_area_m2": 6,
  "external_storage_m2": 6,
  "plot_area_m2": null,
  "volume_m3": 277,

  "rooms": 5,
  "bedrooms": 4,
  "bathrooms": 1,
  "floors": 1,

  "energy_label": "A",
  "insulation": "Dubbel glas, HR-glas en vloerisolatie",
  "heating": "Blokverwarming",
  "hot_water": "Elektrische boiler",

  "garden": null,
  "balcony_or_terrace": "In woonwijk en vrij uitzicht",
  "parking": "Betaald parkeren en parkeervergunningen",

  "description": "In Buitenveldert-West ligt dit lichte en praktisch ingedeelde appartement...",
  "main_photo": "https://cloud.funda.nl/.../868_1440x960.jpg",
  "photos": [
    "https://cloud.funda.nl/.../868_1440x960.jpg",
    "https://cloud.funda.nl/.../913_1440x960.jpg",
    "..."
  ],
  "breadcrumbs": ["Home", "Amsterdam", "Buitenveldert-Zuid-Midden", "Van Nijenrodeweg 488"]
}
```

Choose your format on Apify: **JSON · JSONL · CSV · XLSX · HTML · XML · RSS**.

***

### 💡 Use cases

| Who | What they get |
|---|---|
| 🏢 **Real-estate platforms** | Backfill catalogs, monitor new listings, enrich your own data |
| 📈 **Investors & funds** | Track price/m² trends across neighborhoods over time |
| 🏘️ **Buyers / agents** | Daily alerts for new listings matching your criteria |
| 🤖 **ML / AI teams** | Training data for valuation models, image generation, NLP on descriptions |
| 📊 **Market analysts** | Build dashboards on supply, energy labels, build year, regional pricing |
| 🌍 **PropTech startups** | Skip months of scraper R\&D and ship your product |

***

### 🧰 Tips & tricks

- **Want everything?** Set `maxItems: 0` and let it run.
- **Need a daily delta?** Use `sortBy: "date_down"` with a small `maxItems` and schedule the actor.
- **Targeting a neighborhood?** Use slugs like `amsterdam/centrum` or `rotterdam/kralingen`.
- **Specific pages only?** Drop them into `startUrls`.
- **Speed vs. depth:** `scrapeDetails: false` returns URLs only, perfect for diff-style daily monitoring.

***

### ❓ FAQ

**How many listings can I scrape?**
There is no hard limit. The actor handles pagination automatically. Apify usage costs scale linearly.

**How fresh is the data?**
Real-time. Each run hits Funda's live pages.

**Can I run it on a schedule?**
Yes — use Apify Schedules. Daily, hourly, anything.

**What about rate limiting?**
The actor uses TLS-impersonated requests and a configurable concurrency limit. The default (5) is gentle and safe.

**Does it scrape rentals too?**
Absolutely. Set `searchType: "huur"`.

***

### 📜 Legal

This actor is provided for personal, research and analytical use. You are responsible for ensuring your use complies with Funda's Terms of Service, the GDPR, and any applicable local laws. Scrape only what you need, respect the site, and don't republish copyrighted content.

***

Built with ❤️ for the Apify marketplace. Happy scraping! 🚀

# Actor input Schema

## `searchType` (type: `string`):

Properties for sale or for rent.

## `areas` (type: `array`):

Funda area slugs. Examples: "amsterdam", "rotterdam", "utrecht", "den-haag", "eindhoven". You can also use neighborhood paths like "amsterdam/centrum".

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

Minimum asking price. Leave empty for no minimum.

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

Maximum asking price. Leave empty for no maximum.

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

How results are ordered.

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

Stop after this many listings have been scraped. Set 0 for no limit.

## `scrapeDetails` (type: `boolean`):

If enabled, each listing page is fetched for full data (size, rooms, energy label, photos, description). Disable for a fast index-only run.

## `concurrency` (type: `integer`):

How many pages to fetch in parallel. Higher = faster but heavier.

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

Optional. Provide raw Funda search URLs or detail URLs. If set, the search filters above are ignored.

## Actor input object example

```json
{
  "searchType": "koop",
  "areas": [
    "amsterdam"
  ],
  "sortBy": "relevancy",
  "maxItems": 50,
  "scrapeDetails": true,
  "concurrency": 5
}
```

# Actor output Schema

## `listings` (type: `string`):

All scraped property listings as JSON. One object per listing with full address, price, dimensions, energy label, photos and more.

## `listingsCsv` (type: `string`):

All scraped property listings as a flat CSV — open directly in Excel, Sheets or any BI tool.

## `listingsXlsx` (type: `string`):

All scraped property listings as an .xlsx workbook.

## `consoleView` (type: `string`):

Browse the dataset in the Apify Console UI.

# 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 = {
    "areas": [
        "amsterdam"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alwaysprimedev/funda-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 = { "areas": ["amsterdam"] }

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

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

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

```

## CLI example

```bash
echo '{
  "areas": [
    "amsterdam"
  ]
}' |
apify call alwaysprimedev/funda-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alwaysprimedev/funda-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Funda.nl Real Estate Scraper",
        "description": "Scrape property listings from Funda.nl — Dutch real estate portal. Extract prices, addresses, sizes, energy labels, photos and more.",
        "version": "0.1",
        "x-build-id": "QkCQfoggHc83EomO2"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/alwaysprimedev~funda-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-alwaysprimedev-funda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/alwaysprimedev~funda-scraper/runs": {
            "post": {
                "operationId": "runs-sync-alwaysprimedev-funda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/alwaysprimedev~funda-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-alwaysprimedev-funda-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchType": {
                        "title": "Listing type",
                        "enum": [
                            "koop",
                            "huur"
                        ],
                        "type": "string",
                        "description": "Properties for sale or for rent.",
                        "default": "koop"
                    },
                    "areas": {
                        "title": "Areas (cities / regions)",
                        "type": "array",
                        "description": "Funda area slugs. Examples: \"amsterdam\", \"rotterdam\", \"utrecht\", \"den-haag\", \"eindhoven\". You can also use neighborhood paths like \"amsterdam/centrum\".",
                        "default": [
                            "amsterdam"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "minPrice": {
                        "title": "Min price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum asking price. Leave empty for no minimum."
                    },
                    "maxPrice": {
                        "title": "Max price (EUR)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum asking price. Leave empty for no maximum."
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevancy",
                            "date_down",
                            "date_up",
                            "price_down",
                            "price_up",
                            "floor_area_down",
                            "plot_area_down"
                        ],
                        "type": "string",
                        "description": "How results are ordered.",
                        "default": "relevancy"
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Stop after this many listings have been scraped. Set 0 for no limit.",
                        "default": 50
                    },
                    "scrapeDetails": {
                        "title": "Scrape detail pages",
                        "type": "boolean",
                        "description": "If enabled, each listing page is fetched for full data (size, rooms, energy label, photos, description). Disable for a fast index-only run.",
                        "default": true
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 25,
                        "type": "integer",
                        "description": "How many pages to fetch in parallel. Higher = faster but heavier.",
                        "default": 5
                    },
                    "startUrls": {
                        "title": "Start URLs (advanced)",
                        "type": "array",
                        "description": "Optional. Provide raw Funda search URLs or detail URLs. If set, the search filters above are ignored.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
