# Funda Property Scraper Netherlands (`mrdoe/funda-property-scraper-nl`) Actor

Scrape Funda.nl property listings across the Netherlands. Extract prices, addresses, bedrooms, property types, sizes, energy ratings, descriptions, images, agents, coordinates, and listing URLs for real estate research and analysis.

- **URL**: https://apify.com/mrdoe/funda-property-scraper-nl.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Real estate, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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 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

**Turn Funda.nl listings into structured data in minutes** - no coding, no manual copy-pasting. Get price, address, living area, energy label, agent contact, photos, and dozens of other fields for any property listed on Funda.nl, the Netherlands' largest real-estate portal.

### What does Funda Property Scraper Netherlands do?

Funda Property Scraper Netherlands collects property listings from [Funda.nl](https://www.funda.nl) - both `koop` (for sale) and `huur` (for rent). Give it one or more Funda search-result URLs (built using Funda's own filters for area, price, property type, and more) and it pages through every result, then visits each listing's own page to pull the full description, floor area, energy label, construction year, floor plans, photos, and the selling/renting agent's contact details.

### Why use Funda Property Scraper Netherlands?

- **Market research** - track asking prices, price-per-m², and days-on-market trends across a city, province, or postcode.
- **Lead generation** - build a list of listing agents and agencies active in a specific area.
- **Investment analysis** - pull structured data on yield-relevant fields (rent, service charges, energy label) into your own model.
- **Data enrichment** - feed your CRM, valuation tool, or dashboard with structured listing data instead of manual copy-paste.

### How to use Funda Property Scraper Netherlands

1. On [Funda.nl](https://www.funda.nl), set up a search with the filters you want (area, price range, property type, etc.) and copy the resulting URL.
2. Paste that URL into **Start URLs** in the Input tab. Add as many search URLs as you like, or paste direct listing URLs (`funda.nl/detail/...`) to scrape specific properties.
3. Leave **Enrich with detail pages** on to collect full data per listing (recommended), or turn it off for a faster search-only run.
4. Set **Max items** / **Max pages** if you want to cap the run, or leave empty to collect everything the search returns.
5. Click **Start** and wait for the run to finish.
6. Open the **Dataset** tab to preview, filter, and export your results.

### Input

| Field                | Type    | Description                                                                         |
| -------------------- | ------- | ----------------------------------------------------------------------------------- |
| `startUrls`          | Array   | Funda search-result URLs or direct listing URLs. **Required.**                      |
| `includeDetails`     | Boolean | Visit each listing's own page for full data (default: `true`).                      |
| `maxItems`           | Integer | Maximum listings to collect across all start URLs (default: unlimited).             |
| `maxPages`           | Integer | Safety cap on result pages per start URL (default: unlimited).                      |
| `useCache`           | Boolean | Skip listings already collected by a previous run (default: `true`).                |
| `proxyConfiguration` | Object  | Proxy settings. Residential proxy is used by default - Funda blocks datacenter IPs. |

Example input:

```json
{
    "startUrls": [{ "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D" }],
    "includeDetails": true,
    "maxItems": 500,
    "useCache": true
}
```

### Output

Each listing is saved as one item in the dataset, for example:

```json
{
    "propertyId": "8115183",
    "title": "Weerdestein 172",
    "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-weerdestein-172/44560546/",
    "canonicalUrl": "https://www.funda.nl/detail/koop/amsterdam/appartement-weerdestein-172/17297819/",
    "propertyType": "Apartment",
    "propertySubtype": "Portiekflat (appartement)",
    "listingType": "Sale",
    "price": 420000,
    "pricePerM2": 7778,
    "currency": "EUR",
    "address": "Weerdestein 172",
    "postalCode": "1083GL",
    "city": "Amsterdam",
    "province": "Noord-Holland",
    "latitude": 52.330086,
    "longitude": 4.8887696,
    "rooms": 2,
    "bedrooms": 1,
    "livingArea": 54,
    "volume": 179,
    "constructionYear": "1968",
    "energyLabel": "A",
    "agentName": "DMC Makelaars Amsterdam",
    "agentUrl": "https://www.funda.nl/makelaar/24889-dmc-makelaars-amsterdam/",
    "images": ["https://cloud.funda.nl/valentina_media/233/242/325.jpg", "..."],
    "attributes": { "bouw-bouwjaar": "1968", "energie-verwarming": "Blokverwarming", "...": "..." },
    "source": "funda.nl",
    "scrapedAt": "2026-08-21T00:00:00.000Z"
}
```

#### Field reference

| Field                                                                  | Description                                                                            |
| ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `propertyId` / `id`                                                    | Funda's internal listing ID                                                            |
| `url`, `canonicalUrl`                                                  | The listing's own page (canonical URL comes from the detail page)                      |
| `propertyType`, `propertySubtype`, `listingType`                       | e.g. `Apartment`, `Portiekflat (appartement)`, `Sale`/`Rent`                           |
| `price`, `pricePerM2`, `priceType`, `priceDisplay`                     | Asking price and Funda's own formatted price text                                      |
| `rent`, `monthlyRent`, `serviceCharges`                                | Populated for rental listings                                                          |
| `address`, `postalCode`, `city`, `neighborhood`, `province`, `country` | Location                                                                               |
| `latitude`, `longitude`                                                | Coordinates (detail pages only)                                                        |
| `rooms`, `bedrooms`, `bathrooms`, `livingArea`, `plotArea`, `volume`   | Layout and size                                                                        |
| `constructionYear`, `energyLabel`, `heating`, `insulation`             | Building characteristics                                                               |
| `balcony`, `terrace`, `garden`, `parking`, `storage`                   | Outdoor space and facilities, where stated                                             |
| `agentName`, `agentId`, `agentUrl`, `agencyName`                       | Listing (selling/renting) agent                                                        |
| `images`, `floorPlans`, `videoUrl`, `virtualTourUrl`                   | Media (detail pages only)                                                              |
| `description`                                                          | Full listing text (detail pages only)                                                  |
| `attributes`                                                           | Every other site-specific key fact Funda publishes for the listing, as key/value pairs |
| `listingStatus`, `listingDate`, `availability`                         | Status and publication date                                                            |
| `source`, `sourceUrl`, `scrapedAt`                                     | Provenance                                                                             |

Fields with no public data for a given listing are returned as `null` (or `[]`/`{}` for arrays/objects) - never fabricated or guessed.

### Detail-page enrichment

Search-result pages only carry a subset of fields (price, address, room count, energy label). Description, full features, floor plans, photos, coordinates, and agent contact details only exist on the listing's own page. With **Enrich with detail pages** on (default), the Actor visits each new listing's page once to fill these in. Turn it off for a cheaper, faster run if you only need search-result-level data.

### Pagination

The Actor pages through each start URL's search results (15 listings per page) until it reaches the last page, `maxPages`, or `maxItems` - whichever comes first.

### Cache behavior

With `useCache` on (default), every successfully collected listing's ID is stored permanently in the Actor's key-value store - no expiration, no TTL. Re-running the Actor with the same or overlapping start URLs will skip listings already collected and only return new ones. Disable `useCache` to re-collect everything.

### Cost / performance

The Actor makes one lightweight HTTP request per search page and per enriched listing - no browser is launched. Combined with the permanent cache (which skips already-collected listings on repeat runs), this keeps cost close to Apify's per-request compute baseline.

### Troubleshooting

**A run returns 0 listings.** Funda blocks non-residential IPs; make sure the default residential `proxyConfiguration` is enabled. Also double check the start URL is a valid `funda.nl/zoeken/...` search or `funda.nl/detail/...` listing URL copied directly from the site.

**Some fields are `null`.** Not every listing publishes every field (e.g. plot area for apartments, or an exact construction year vs. a construction period). The Actor never invents data - it returns what Funda publishes for that specific listing.

### FAQ / Disclaimer

**Is this legal?** This Actor only collects publicly visible listing data. You are responsible for using the data in accordance with Funda.nl's Terms of Service and applicable law in your jurisdiction.

**Found a bug or have a feature request?** Please use the Issues tab on this Actor's page - feedback directly shapes future updates.

# Actor input Schema

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

Funda.nl search-result URLs (e.g. from <code>funda.nl/zoeken/koop</code> or <code>funda.nl/zoeken/huur</code> after applying filters) or direct listing detail URLs (<code>funda.nl/detail/...</code>). The Actor pages through every search URL and enriches each listing found.

## `includeDetails` (type: `boolean`):

Visit each listing's own page to collect description, full features, floor plans, photos, and agent contact details. Turn off for a faster, cheaper run that only returns search-result data.

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

Maximum number of listings to scrape across all start URLs. Leave empty to collect every listing the search URLs return.

## `maxPages` (type: `integer`):

Safety cap on how many result pages to page through per start URL (15 listings per page). Leave empty to page through all results.

## `useCache` (type: `boolean`):

Skip listings already collected by a previous run of this Actor (matched by Funda's listing ID). The cache is stored permanently and never expires. Disable to re-collect everything.

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

Funda blocks datacenter IPs. Residential proxy is strongly recommended and enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22vlieland%22%5D"
    }
  ],
  "includeDetails": true,
  "useCache": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

# 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%22vlieland%22%5D"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/funda-property-scraper-nl").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%22vlieland%22%5D" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/funda-property-scraper-nl").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%22vlieland%22%5D"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call mrdoe/funda-property-scraper-nl --silent --output-dataset

```

## MCP server setup

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

```

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/8r4P0LfdMGBluNAIj/builds/geqQ9TdaHhGjg1bcV/openapi.json
