# Funda.nl Scraper (`piotrv1001/funda-nl-scraper`) Actor

The Funda.nl Scraper extracts Dutch property listings from funda.nl — asking or rental prices, floor area, rooms, energy label, address, agent and photos for any city, municipality, province or postcode, plus sold and rented homes with last asking price — idealfor valuation, research and lead lists.

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

## Pricing

from $1.50 / 1,000 listings

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/actors/running/actors-in-store.md#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 Scraper

Extract Dutch property listings from **funda.nl** as clean, structured JSON. The **Funda Scraper** turns a location — a city, municipality, province, postcode area or the whole country — into rows with **asking or rental price**, floor and plot area, rooms and bedrooms, energy label, full address down to the neighbourhood, listing agent, photos and publish date. Switch on details for the description, coordinates, build year, price per m², VvE fee and every feature section, or fetch the agent's phone number. It also returns **sold and rented homes with their last asking price**, so you can build comparables without opening a single page by hand. Built for valuation, investment screening, market research and agent lead lists.

### ✨ Features

- 🏠 **Complete listing rows from the results page**: Price and price condition (k.k. / v.o.n. / per month), floor area, plot area, rooms, bedrooms, energy label, object and construction type, status (available, under offer, sold, rented), publish date, open-house slots and all photo URLs — 15 listings per request, no detail page needed.
- 📍 **Full address**: Street, house number, postcode, city, neighbourhood, district, municipality and province.
- 🧑‍💼 **Agent**: Name, association (NVM, VBO, MZV…) and Funda profile URL on every row; phone, e-mail and website with `includeAgentContact`.
- 📋 **Listing details (optional)**: Description, coordinates, build year, price per m², VvE contribution, every "Kenmerken" section as label/value pairs, Funda's listing highlights, full-size photos, floor plans, videos and brochure.
- 📉 **Sold & rented comparables**: Set `availability` to *Sold or rented* and get finished listings with their last asking price, size and publish date.
- 🔎 **Any Funda search**: Use the simple location / price fields, or paste any funda.nl search URL to keep its exact filters — object type, energy label, floor area, garden, sorting and more. Pagination runs to the last page.
- 💸 **Pay per result**: A small fee per listing row, plus optional fees per detail page and per agent contact.

### 🛠️ How It Works

1. **Pick a location** – `location` such as `Amsterdam`, `Den Haag`, `Gemeente Utrecht`, `Provincie Noord-Holland`, `1058` or `Netherlands`; choose `offeringType` (for sale / for rent) and an optional `priceMin` / `priceMax`.
2. **Or paste search URLs** – Any `https://www.funda.nl/zoeken/koop?...` or `/zoeken/huur?...` URL in `searchUrls` runs with its own filters.
3. **Choose depth** – `availability` (available, under offer, sold or rented), `includeDetails`, `includeAgentContact` and `maxItems` (default 50).
4. **Run the scraper** – Results stream into the dataset as JSON, CSV or Excel.

### 💰 Pricing

| Event            | Price   | What you get                                                                                           |
| ---------------- | ------- | ------------------------------------------------------------------------------------------------------ |
| `listing`        | $0.0015 | One listing row with price, size, rooms, energy label, address, agent, photos and publish date         |
| `listing-detail` | $0.003  | Per listing, when `includeDetails` is on: description, coordinates, build year, price per m², features |
| `agent-contact`  | $0.001  | Per listing, when `includeAgentContact` is on: the agent's phone, e-mail and website                   |

Example: 2,000 Amsterdam listings = **$3.00**; the same with details = $3.00 + $6.00 = **$9.00**; a daily 500-row sold-comps feed ≈ **$0.75 per day**.

### ⚠️ Good to know

- Prices are asking prices (or monthly rents) as published by the agent. For sold and rented homes Funda shows the **last asking price**, not the final transaction price.
- `price` is empty and `priceMin` / `priceMax` carry the range for new-build projects that list several homes at once.
- `location` is matched the way Funda spells it: `Den Haag` (not The Hague), `'s-Hertogenbosch`, `Gemeente Utrecht`, `Provincie Gelderland`. If a run returns nothing, copy the URL from a Funda search into `searchUrls` instead.
- `pricePerM2` is only available for homes for sale. Agent e-mail is filled only when the agent publishes it on Funda.

### 📊 Sample Output Data

```json
[
    {
        "id": 8146842,
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-bonairestraat-61-1/44591205/",
        "title": "Bonairestraat 61-1",
        "status": "available",
        "offeringType": "buy",
        "listingType": "single",
        "objectType": "apartment",
        "constructionType": "resale",
        "price": 550000,
        "priceMin": 550000,
        "priceMax": 550000,
        "priceCondition": "kosten_koper",
        "priceType": "regular",
        "currency": "EUR",
        "floorArea": 56,
        "plotArea": null,
        "rooms": 4,
        "bedrooms": 2,
        "energyLabel": "D",
        "address": {
            "street": "Bonairestraat",
            "houseNumber": "61",
            "houseNumberSuffix": "1",
            "postalCode": "1058XD",
            "city": "Amsterdam",
            "neighbourhood": "Paramariboplein e.o.",
            "district": "Westindische Buurt",
            "municipality": "Amsterdam",
            "province": "Noord-Holland",
            "country": "NL"
        },
        "agent": {
            "id": 10164,
            "name": "Jeroen van den Boogaard Makelaars",
            "association": "NVM",
            "url": "https://www.funda.nl/makelaar/10164-jeroen-van-den-boogaard-makelaars/",
            "phone": "(+31) 20 123 45 67",
            "email": null,
            "website": "https://www.example-makelaar.nl"
        },
        "images": [
            "https://cloud.funda.nl/tiara-media/9ba17888-d325-4b6f-b0b7-c7c33dcbecf8/274d11b3-fd0b-4696-bb99-b17860566132?options=width=1440",
            "https://cloud.funda.nl/tiara-media/9ba17888-d325-4b6f-b0b7-c7c33dcbecf8/38e74711-b3e5-4d3d-b3ee-18278b541b20?options=width=1440"
        ],
        "mediaTypes": ["floor_plan", "photo_360", "video"],
        "openHouse": [{ "from": "2026-09-22T16:00:00+02:00", "to": "2026-09-22T17:00:00+02:00" }],
        "promoText": "Wonen in De Baarsjes: licht 3-kamerappartement vlak bij Vondelpark!",
        "publishedAt": "2026-09-12T07:00:05.5139081+02:00",
        "description": "Driekamer appartement in de Baarsjes met de stadse gezelligheid en het groen van het Rembrandtpark en Vondelpark om de hoek. …",
        "coordinates": { "lat": 52.36162, "lng": 4.855149 },
        "priceText": "€ 550.000 k.k.",
        "pricePerM2": 9821,
        "buildYear": 1930,
        "vveContribution": "€ 120,00 per maand",
        "isSoldOrRented": false,
        "labels": ["Nieuw"],
        "highlights": [
            {
                "category": "KitchenAndLiving",
                "title": "Lichte woonkamer en keuken",
                "description": "Ruime woonkamer met grote ramen en open keuken."
            }
        ],
        "features": {
            "Overdracht": {
                "Vraagprijs": "€ 550.000 kosten koper",
                "Vraagprijs per m²": "€ 9.821",
                "Status": "Beschikbaar",
                "Bijdrage VvE": "€ 120,00 per maand"
            },
            "Bouw": {
                "Soort appartement": "Bovenwoning (appartement)",
                "Soort bouw": "Bestaande bouw",
                "Bouwjaar": "1930"
            },
            "Energie": { "Energielabel": "D" }
        },
        "photos": ["https://cloud.funda.nl/valentina_media/234/555/581.jpg"],
        "floorPlans": ["https://cloud.funda.nl/listing-management/fe3586f1-20cd-4e06-94bd-d73fcb3a212c"],
        "searchUrl": "https://www.funda.nl/zoeken/koop?selected_area=%5B%22amsterdam%22%5D",
        "scrapedAt": "2026-09-12T07:48:48.995Z"
    }
]
```

Track the Dutch housing market with the **Funda Scraper** today! 🚀

# Actor input Schema

## `location` (type: `string`):

A city (`Amsterdam`, `Den Haag`), a municipality (`Gemeente Utrecht`), a province (`Provincie Noord-Holland`), a 4-digit postcode area (`1058`) or `Netherlands` for the whole country.

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

Homes for sale (koop) or for rent (huur).

## `priceMin` (type: `integer`):

In EUR. Asking price for sale, monthly rent for rentals.

## `priceMax` (type: `integer`):

In EUR. Asking price for sale, monthly rent for rentals.

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

`Sold or rented` returns finished listings with their last asking price — handy for comparables.

## `searchUrls` (type: `array`):

Paste any funda.nl search page URL (`https://www.funda.nl/zoeken/koop?...`) to use its exact filters — object type, energy label, floor area, sorting and more. When given, the fields above are ignored.

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

Also open each listing page for the description, coordinates, build year, price per m², VvE fee, all feature sections, floor plans and full-size photos. One extra request per listing, billed separately.

## `includeAgentContact` (type: `boolean`):

Also fetch the listing agent's phone number (and e-mail when published). One request per unique agent, billed per listing.

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

Maximum number of listings to save in total.

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

Proxy settings. The default works.

## Actor input object example

```json
{
  "location": "Amsterdam",
  "offeringType": "buy",
  "availability": "default",
  "includeDetails": false,
  "includeAgentContact": false,
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (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 = {
    "location": "Amsterdam",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("piotrv1001/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 = {
    "location": "Amsterdam",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("piotrv1001/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 '{
  "location": "Amsterdam",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call piotrv1001/funda-nl-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,piotrv1001/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/HmJzBmvXfZkZtabms/builds/J3as9IlMoynTIdL6l/openapi.json
