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

Scrape Dutch real estate listings from Funda.nl — prices, photos, coordinates, characteristics, neighborhood data, and more.

- **URL**: https://apify.com/parsebird/funda-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Real estate, Lead generation, Agents
- **Stats:** 10 total users, 4 monthly users, 99.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 funda listing scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.nl Scraper — Dutch Real Estate Data Extraction

Scrape residential property listings from [Funda.nl](https://www.funda.nl), the Netherlands' largest real estate platform. Extract prices, photos, coordinates, property characteristics, neighborhood data, and more — powered by Funda's internal API for maximum speed and reliability.

<table><tr>
<td style="border-left:4px solid #1a73e8;padding:12px 16px;font-weight:600">Extract Dutch real estate listings with full property details — prices, characteristics, photos, floor plans, GPS coordinates, neighborhood data, and broker info. No browser rendering needed.</td>
</tr></table>

<br>

<table>
<tr>
<td colspan="2" style="padding:10px 14px;background:#1a73e8;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">Funda Real Estate Suite</span>
<span style="color:#B3D4FC;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Dutch property market data</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 0 4px;border-right:none;border-top:none;vertical-align:top;width:50%;background:#DBEAFE">
&#127968; &nbsp;<strong>Funda.nl Scraper</strong><br>
<span style="color:#1a73e8;font-size:11px;font-weight:600">&#10148; You are here</span><br>
<span style="color:#78716C;font-size:11px">Residential properties — houses & apartments</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 4px 0;border-top:none;vertical-align:top;width:50%">
&#127970; &nbsp;<a href="https://apify.com/parsebird/fundainbusiness-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Funda in Business Scraper</a><br>
<span style="color:#78716C;font-size:11px">Commercial properties — offices, retail, industrial</span>
</td>
</tr>
</table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/funda-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/funda-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: startUrls (array of {"url": "..."}, search or detail pages), searchTransactionType (string, "buy"/"rent", default "buy"), searchLocation (string, e.g. "amsterdam"), searchPriceMin (integer, EUR), searchPriceMax (integer, EUR), maxItems (integer, default 100), includeNeighborhoodData (boolean, default false), contentLanguage (string, "nl"/"en", default "en"), maxConcurrency (integer, default 3). Full actor spec: fetch build via GET https://api.apify.com/v2/acts/parsebird~funda-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does Funda.nl Scraper do?

This Actor scrapes property listings from Funda.nl — the Netherlands' dominant real estate platform with 80%+ market share. It connects directly to Funda's internal listing API, bypassing the website entirely for fast, structured JSON data without browser rendering.

For each property listing, the scraper extracts:

- **Price data** — asking price, price per m², auction status, rental price
- **Property characteristics** — bedrooms, living area, plot size, energy label, construction year, building type
- **Full descriptions** — Dutch or English listing text with all property details
- **Media** — all photo URLs, floor plans, 360° photos, virtual tours, brochure links
- **Location** — GPS coordinates, neighborhood name/identifier, full address with postcode
- **Broker info** — broker ID, association (NVM/VBO/VastgoedPRO), contact details
- **Property features** — garden, balcony, solar panels, heat pump, parking, monument status
- **Neighborhood data** (optional) — local market insights from Funda's Market Insights API
- **Status & metadata** — publication date, sold/rented status, labels, views/saves count

### How to use Funda.nl Scraper

1. **Provide search URLs** — paste Funda.nl search URLs (e.g. `https://www.funda.nl/zoeken/koop?selected_area=["amsterdam"]`) or individual listing detail URLs
2. **Or use search parameters** — set location, price range, and transaction type (buy/rent) without a URL
3. **Configure limits** — set max items, concurrency, and optional neighborhood data enrichment
4. **Run** — the scraper fetches listings via Funda's API, processes details concurrently, and outputs structured JSON

#### Input examples

**Search by URL:**

```json
{
  "startUrls": [
    {"url": "https://www.funda.nl/zoeken/koop?selected_area=[\"amsterdam\"]"}
  ],
  "maxItems": 50
}
```

**Search by parameters:**

```json
{
  "searchLocation": "rotterdam",
  "searchTransactionType": "buy",
  "searchPriceMin": 200000,
  "searchPriceMax": 450000,
  "maxItems": 100,
  "includeNeighborhoodData": true
}
```

**Single listing:**

```json
{
  "startUrls": [
    {"url": "https://www.funda.nl/detail/koop/amsterdam/appartement-wildeman-97/43279645/"}
  ]
}
```

### Output

Each listing is output as a JSON object matching Funda's internal data structure:

```json
{
  "_id": "7998544",
  "Price": {
    "SellingPrice": "€ 595.000 k.k.",
    "NumericSellingPrice": 595000,
    "IsAuction": false
  },
  "KenmerkSections": [...],
  "Labels": [{"Text": "Nieuw", "Type": "New"}],
  "Aanbiedingstekst": "Full property description...",
  "WoonOppervlakteSubTitle": "72 m²",
  "KoopprijsSubTitle": "€ 595.000 k.k.",
  "AddressTitle": "Waalstraat 122",
  "AddressSubTitle": "1079 EC Amsterdam",
  "NumberOfBedrooms": "1",
  "ListingUrl": "https://www.funda.nl/detail/43343907",
  "BuurtName": "Scheldebuurt-Midden",
  "Coordinates": {"Latitude": 52.343155, "Longitude": 4.9018593},
  "Media": {"HoofdfotoUrl": "...", "Photos": [...], "FloorPlan": {...}},
  "IsSoldOrRented": false,
  "PublicationDate": "2026-05-12T00:00:00"
}
```

### Use cases

- **Real estate market research** — analyze property prices, trends, and market dynamics across Dutch cities
- **Investment analysis** — find undervalued properties by comparing asking prices to neighborhood averages
- **Property monitoring** — track new listings matching specific criteria (area, price range, features)
- **Portfolio valuation** — compare similar properties for accurate real estate appraisals
- **Academic research** — study housing market patterns, gentrification, and urban development
- **Data journalism** — investigate property market trends and housing affordability

### Pricing

This Actor uses pay-per-event pricing:

| Event | Price |
|-------|-------|
| 1 listing scraped | $0.00072 |
| 1,000 listings scraped | $0.72 |
| 10,000 listings scraped | $7.20 |

Platform costs (compute + proxy) are charged separately by Apify.

### Limitations

- Funda's internal API has a pagination limit of ~10,000 results per search query. For larger datasets, use multiple searches with different filters.
- Neighborhood data enrichment adds an extra API call per listing, which may slow down large runs.
- Some sold/rented listings may have limited data available.

### FAQ

**Can I scrape sold properties?**

Currently the scraper focuses on available listings. Sold properties may return limited data.

**How often does the data update?**

Funda updates listings in real-time. New listings appear within minutes of being published.

**Is this legal?**

This scraper uses publicly available API endpoints. Always ensure your use case complies with applicable laws and Funda's terms of service.

# Actor input Schema

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

Search pages (/zoeken/koop, /zoeken/huur) or individual listing detail pages (/detail/…). Leave empty to use search parameters below instead.

## `includeNeighborhoodData` (type: `boolean`):

Fetch extra neighborhood stats from Funda Market Insights API for each listing.

## `contentLanguage` (type: `string`):

Accept-Language for listing copy: Dutch original vs English translated.

## `searchTransactionType` (type: `string`):

Koop (sale) or huur (rent). Pick Rent (huur) to search rentals only.

## `searchKeywords` (type: `string`):

Words Funda should match in listings. Examples: gracht, tuin, zuid, nieuwbouw. Leave empty to skip text filter.

## `searchLocation` (type: `string`):

City or area slug. Examples: amsterdam, rotterdam, den-haag. Use postcode + radius for radius search.

## `searchPriceMin` (type: `integer`):

Lower bound in euros (whole numbers). Example: 200000 for €200,000.

## `searchPriceMax` (type: `integer`):

Upper bound in euros. Example: 450000 for €450,000. Use with min or alone.

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

Stop after this many listings. Set to 0 for unlimited.

## `maxConcurrency` (type: `integer`):

Parallel requests cap for fetching listing details.

## `minConcurrency` (type: `integer`):

Minimum parallel workers.

## `maxRequestRetries` (type: `integer`):

Retries on failed HTTP calls before giving up.

## `storeName` (type: `string`):

Optional KV store name for cross-run deduplication of listing IDs. Leave empty to skip.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.funda.nl/zoeken/koop?selected_area=[%22amsterdam%22]"
    }
  ],
  "includeNeighborhoodData": false,
  "contentLanguage": "en",
  "searchTransactionType": "buy",
  "searchLocation": "amsterdam",
  "maxItems": 5,
  "maxConcurrency": 3,
  "minConcurrency": 1,
  "maxRequestRetries": 5
}
```

# Actor output Schema

## `dataset` (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=[%22amsterdam%22]"
        }
    ],
    "searchTransactionType": "buy",
    "searchLocation": "amsterdam",
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/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 = {
    "startUrls": [{ "url": "https://www.funda.nl/zoeken/koop?selected_area=[%22amsterdam%22]" }],
    "searchTransactionType": "buy",
    "searchLocation": "amsterdam",
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/funda-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=[%22amsterdam%22]"
    }
  ],
  "searchTransactionType": "buy",
  "searchLocation": "amsterdam",
  "maxItems": 5
}' |
apify call parsebird/funda-scraper --silent --output-dataset

```

## MCP server setup

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