# Funda.nl Scraper - Netherlands Real Estate Listings Extractor (`haketa/funda-scraper`) Actor

Scrape property listings from Funda.nl: price, m², rooms, energy label, address, broker, photos & more. Search by city or paste URLs. Export to JSON, CSV & Excel.

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

## Pricing

from $3.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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.nl Scraper – Extract Netherlands Real Estate Listings

**Funda.nl Scraper** turns the Netherlands' #1 property portal into clean, structured data. Scrape thousands of **Dutch real estate listings** — homes and apartments **for sale (koop)** or **for rent (huur)** — with price, living area (m²), number of rooms, energy label, year built, address, photos and more. No login, no API key, no coding required. Export to JSON, CSV, Excel, HTML or XML in seconds.

Whether you're a **real estate investor** hunting for deals, an **agent or appraiser** benchmarking the market, a **proptech / property portal** that needs a fresh listings feed, or a **data analyst** studying Dutch housing trends — this Funda scraper gives you the data Funda.nl publishes, in a spreadsheet-ready format.

> ⚡ **TL;DR** – Type a city (e.g. `amsterdam`), press **Start**, and download a spreadsheet of Funda property listings with prices, surfaces, rooms, energy labels and photos.

---

### 🔑 Why use this Funda.nl Scraper?

Funda.nl is *the* real estate marketplace in the Netherlands — almost every home for sale or rent passes through it. That makes it the single best source of Dutch property data. But Funda has no public API, and copying listings by hand is impossible at scale.

This scraper solves that:

- ✅ **No login, no API key** – works out of the box.
- ✅ **Three ways to scrape** – by city/area, by pasting a Funda search URL (with your own filters), or by individual listing URLs.
- ✅ **Rich, structured data** – price, living area, plot size, rooms, bedrooms, energy label, year built, property type, address, postcode, province, photos and description.
- ✅ **Sale & rent** – scrape *koop* (for sale) and *huur* (for rent).
- ✅ **Automatic pagination** – collect far more than the first page.
- ✅ **Fast & cheap** – uses Funda's own server-rendered data (JSON-LD + Nuxt), not a heavy headless browser.
- ✅ **Export anywhere** – JSON, CSV, Excel, HTML, XML, or pull straight from the Apify API.
- ✅ **Automation-ready** – schedule runs and connect to Google Sheets, Slack, Zapier, Make, or use it as an AI agent tool.

---

### 🧩 What can you do with Funda data?

#### Real estate investing & deal sourcing
Find undervalued properties, track price per m² by neighbourhood, and spot new listings the moment they appear. Filter by price, surface, energy label, and build year to surface exactly the deals you want.

#### Market research & price analytics
Build datasets of asking prices, surfaces and energy labels across cities and provinces. Track market movements, average price/m², and supply over time for any Dutch city.

#### Real estate agents & appraisers
Benchmark comparable listings (comps) instantly, monitor competitor inventory, and value properties with real, current market data.

#### Proptech, portals & lead generation
Power your own property website, newsletter, or valuation model with a continuously refreshed Funda feed — complete with photos, descriptions and locations.

#### Mortgage, insurance & relocation services
Enrich your product with up-to-date property attributes (surface, energy label, year built) for any Dutch address you target.

#### Academic & data science research
Collect structured housing datasets for studies on affordability, energy efficiency, urban density and price formation.

---

### 📦 What data does the Funda Scraper extract?

For every listing, you get:

| Field | Description |
|---|---|
| `url` | Direct link to the Funda listing |
| `listingType` | `koop` (for sale) or `huur` (for rent) |
| `address` | Street + house number |
| `postalCode` | Dutch postcode (e.g. `1011EW`) |
| `city` | City / place |
| `province` | Province (e.g. Noord-Holland) |
| `price` | Asking price (sale) or monthly rent (rent), in EUR |
| `priceCurrency` | Currency (EUR) |
| `priceType` | `asking_price` or `rent_per_month` |
| `livingArea` | Living area in m² |
| `plotArea` | Plot / land area in m² (houses) |
| `rooms` | Total number of rooms |
| `bedrooms` | Number of bedrooms |
| `energyLabel` | Energy label (A, B, C, …) |
| `energyEfficient` | Whether the home is flagged energy-efficient |
| `yearBuilt` | Construction year |
| `propertyType` | Appartement, Huis, etc. |
| `buildType` | New build / existing build |
| `leasehold` | Ownership type (eigendom / erfpacht) |
| `status` | Availability (e.g. beschikbaar = available) |
| `neighbourhood` | Neighbourhood |
| `municipality` | Municipality |
| `garden` | Has a garden (true/false) |
| `balcony` | Has a balcony (true/false) |
| `roofTerrace` | Has a roof terrace (true/false) |
| `solarPanels` | Has solar panels (true/false) |
| `heatPump` | Has a heat pump (true/false) |
| `privateParking` | Private parking on own land (true/false) |
| `nationalMonument` | Listed national monument (true/false) |
| `brokerId` | Funda broker (makelaar) ID running the listing |
| `description` | Listing description |
| `photo` | Main photo URL (high resolution) |
| `photos` | All photo URLs |
| `photoCount` | Number of photos |
| `scrapedAt` | ISO timestamp of extraction |

---

### 🚀 How to use the Funda Scraper (step by step)

No technical knowledge required:

1. Open the Actor in the Apify Console.
2. Choose **how** to scrape:
   - **By city/area** – set the listing type (sale/rent) and add one or more areas (e.g. `amsterdam`, `rotterdam`).
   - **By search URL** – build any filter on funda.nl and paste the result URL.
   - **By listing URL** – paste individual property links.
3. (Optional) Set a **Max items** limit to control cost.
4. Click **Start** ▶️.
5. Download your data from the **Storage / Dataset** tab as JSON, CSV, Excel, HTML or XML.

---

### ⚙️ Input examples

#### Example 1 – Homes for sale in Amsterdam
```json
{
  "listingType": "koop",
  "areas": ["amsterdam"],
  "maxItems": 200
}
````

#### Example 2 – Rentals in multiple cities, newest first

```json
{
  "listingType": "huur",
  "areas": ["rotterdam", "den-haag", "utrecht"],
  "sortBy": "date_down",
  "maxItems": 300
}
```

#### Example 3 – Use a Funda search URL with your own filters

Build a filtered search on funda.nl (price, surface, energy label…) and paste the URL:

```json
{
  "searchUrls": [
    { "url": "https://www.funda.nl/zoeken/koop?selected_area=[\"amsterdam\"]&price=\"250000-500000\"" }
  ],
  "maxItems": 150
}
```

#### Example 4 – Scrape specific listings

```json
{
  "startUrls": [
    { "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-koningsstraat-42/44468743/" }
  ]
}
```

***

### 📤 Output example

Each listing is saved as one dataset record:

```json
{
  "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-koningsstraat-42/44468743/",
  "listingType": "koop",
  "address": "Koningsstraat 42",
  "postalCode": "1011EW",
  "city": "Amsterdam",
  "province": "Noord-Holland",
  "price": 600000,
  "priceCurrency": "EUR",
  "priceType": "asking_price",
  "livingArea": 107,
  "plotArea": null,
  "rooms": 2,
  "bedrooms": null,
  "energyLabel": "A",
  "yearBuilt": 1983,
  "propertyType": "Appartement",
  "buildType": "bestaandebouw",
  "leasehold": "erfpacht",
  "brokerId": "24607",
  "description": "Appartement te koop: Koningsstraat 42 1011 EW Amsterdam",
  "photo": "https://cloud.funda.nl/valentina_media/229/292/344_1440x960.jpg",
  "photos": ["https://cloud.funda.nl/valentina_media/229/292/344_1440x960.jpg"],
  "photoCount": 6,
  "scrapedAt": "2026-05-22T11:59:13.476Z"
}
```

***

### 📝 Input parameters reference

| Parameter | Type | Default | Description |
|---|---|---|---|
| `listingType` | string | `koop` | `koop` (for sale) or `huur` (for rent). |
| `areas` | array of strings | – | Funda area slugs to search (e.g. `amsterdam`, `amsterdam/centrum`). |
| `sortBy` | string | `relevancy` | `relevancy`, `date_down` (newest), `price_up`, `price_down`. |
| `searchUrls` | array of URLs | – | Full Funda search-result URLs with your own filters. |
| `startUrls` | array of URLs | – | Direct Funda listing URLs to scrape at full detail. |
| `maxItems` | integer | `0` (no limit) | Max number of listings to scrape. Use it to control cost. |
| `maxConcurrency` | integer | `5` | Max pages scraped in parallel (keep polite). |
| `maxRequestRetries` | integer | `3` | Retries per failed request. |
| `proxyConfiguration` | object | Apify Proxy on | Proxy settings (residential recommended for large runs). |

***

### 🌍 Finding area slugs

Funda area slugs are simple. Search on funda.nl for a city or neighbourhood and copy the area name from the URL:

- `amsterdam` → all of Amsterdam
- `rotterdam`, `den-haag`, `utrecht`, `eindhoven`, `groningen` → other major cities
- `amsterdam/centrum`, `amsterdam/zuid` → specific neighbourhoods
- You can add several areas at once; each is searched separately.

For complex filters (price ranges, surface, number of rooms, energy label, garden, etc.), build the search on funda.nl and paste the full URL into **Funda search URLs** — every filter is respected.

#### Popular areas to scrape

| Region | Example slugs |
|---|---|
| Randstad (major cities) | `amsterdam`, `rotterdam`, `den-haag`, `utrecht` |
| Tech & student hubs | `eindhoven`, `delft`, `groningen`, `wageningen` |
| Coastal & expat-popular | `haarlem`, `the-hague`, `amstelveen`, `zandvoort` |
| Neighbourhood-level | `amsterdam/centrum`, `amsterdam/zuid`, `rotterdam/kralingen` |

Add as many areas as you like — each one is searched separately, then merged into a single dataset.

***

### 🔄 Keeping your data fresh

Property markets move fast — listings appear and disappear daily. To keep an always-current dataset:

1. **Schedule the Actor** to run daily or hourly from the Apify Console.
2. Sort by `date_down` so the newest listings are collected first.
3. Connect a **webhook** or **Google Sheets / Slack** integration to be alerted on new results.
4. De-duplicate downstream by the `url` field (each listing has a unique URL).

This turns the scraper into a live feed for deal alerts, price-tracking dashboards, or a property portal.

***

### 💡 Tips & best practices

- **Use `maxItems` to control cost.** Start with 50–100 to preview the data, then scale up.
- **Search URLs are the most powerful option** — any filter you can set on funda.nl works.
- **Combine multiple cities** by adding several entries to `areas`.
- **Sort by `date_down`** to catch the newest listings first — ideal for deal alerts.
- **Schedule the Actor** (e.g. daily) to maintain an always-fresh listings feed or price-tracking dataset.
- **Enable residential proxies** for very large runs to avoid rate limits.
- **For rentals**, set `listingType` to `huur`; `price` then represents the monthly rent.

***

### 🌐 Proxy & reliability

Funda.nl is server-rendered and works from most connections, so this Actor uses a fast HTTP + Cheerio crawler (no headless browser). For large runs, enable **Apify Proxy** (residential recommended) to avoid rate limits — it's on by default. The scraper includes **automatic retries** so transient errors don't break your run, and respects your **Max concurrency** setting to stay polite to Funda.

***

### 🔌 Integrations & automation

- **Apify API** – trigger runs and pull data programmatically.
- **Webhooks** – get notified when a run finishes.
- **Zapier, Make (Integromat), n8n** – push results into thousands of apps.
- **Google Sheets, Slack, Airtable** – send listings where your team works.
- **MCP / AI agents** – use this Actor as a tool for LLM-powered agents.
- **Scheduler** – run automatically on a daily, weekly or custom schedule.

***

### 👩‍💻 Using the Funda Scraper via API

Call this Actor from any language using the [Apify API](https://docs.apify.com/api/v2). Python example:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run_input = {
    "listingType": "koop",
    "areas": ["amsterdam"],
    "maxItems": 100,
}

run = client.actor("YOUR_USERNAME/funda-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["address"], "-", item.get("price"), "EUR", "-", item.get("livingArea"), "m²")
```

JavaScript / Node.js:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const input = { listingType: 'koop', areas: ['rotterdam'], maxItems: 100 };
const run = await client.actor('YOUR_USERNAME/funda-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### ❓ Frequently asked questions

#### Do I need a Funda account or API key?

No. This scraper uses only publicly available data on funda.nl. No login, cookies or API key required.

#### Can I scrape both rentals and properties for sale?

Yes. Set `listingType` to `koop` for sale or `huur` for rent. For rentals, the `price` field is the monthly rent.

#### How many listings can I scrape?

The scraper paginates automatically across search-result pages. Use `maxItems` to cap the total and control cost. A single area can return hundreds of listings.

#### Can I apply filters like price or number of rooms?

Yes — build the filtered search on funda.nl and paste the URL into **Funda search URLs**. All filters (price, surface, rooms, energy label, garden, etc.) are respected.

#### Why are some fields empty?

Not every listing publishes every field on Funda (e.g. an apartment has no plot area; bedrooms aren't always listed). Empty fields simply mean the data isn't published.

#### In what formats can I download the data?

JSON, CSV, Microsoft Excel (XLSX), HTML table, and XML — plus direct API access and dataset views.

#### How fresh is the data?

The scraper fetches live data from Funda.nl on every run, so results always reflect the current state of the site. Schedule it to keep your dataset up to date.

***

### ⚖️ Is it legal to scrape Funda.nl?

This Actor collects only **publicly available information** that anyone can view on funda.nl without logging in. Scraping public data is generally legal, but **how you use it is your responsibility**:

- Do not use the data to violate GDPR or other privacy laws.
- Do not republish copyrighted content (e.g. listing photos/descriptions) in ways that infringe rights.
- Respect Funda's Terms of Service and applicable regulations.
- Use the data for legitimate purposes such as research, analytics and aggregated market insight.

If unsure about your specific use case, consult a legal professional.

***

### 🛟 Support & feedback

Found a bug, missing a field, or need a new feature? Open an issue on the Actor's **Issues** tab — feedback is welcome and helps improve the scraper. If a listing fails to scrape, please include the exact URL.

***

### 🏷️ Keywords

Funda scraper, Funda.nl scraper, scrape Funda, Netherlands real estate scraper, Dutch property data, real estate listings scraper, property data extraction, makelaar data, koop, huur, housing data Netherlands, real estate API alternative, property price scraper, real estate lead generation, proptech data, Amsterdam Rotterdam property data, JSON CSV Excel export.

***

*This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Funda or its parent companies. "Funda" is a trademark of its respective owner.*

# Actor input Schema

## `listingType` (type: `string`):

Whether to scrape properties for sale (koop) or for rent (huur). Used together with the <b>Areas</b> below.

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

Funda area slugs to search, e.g. <code>amsterdam</code>, <code>rotterdam</code>, <code>den-haag</code>, or a neighbourhood like <code>amsterdam/centrum</code>. Each area is searched separately. Tip: search on funda.nl, then copy the area name from the URL. Leave empty if you only use Search URLs or Start URLs.

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

Order in which listings are collected for city/area searches.

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

Paste full Funda.nl search-result URLs (e.g. <code>https://www.funda.nl/zoeken/koop?selected\_area=\["amsterdam"]\&price="250000-500000"</code>). Build any filter on funda.nl (price, surface, rooms, energy label…) and paste the URL here — all filters are respected. Pagination is handled automatically.

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

Paste direct Funda listing URLs (e.g. <code>https://www.funda.nl/detail/koop/amsterdam/appartement-koningsstraat-42/44468743/</code>) to scrape specific properties at full detail.

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

Maximum number of listings to scrape across the whole run. Use this to control cost. Set 0 for no limit.

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

Maximum number of pages scraped in parallel. Keep this moderate to stay polite to Funda and avoid rate limits.

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

How many times a failed request is retried before being marked as failed.

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

Proxy settings. Funda works from most connections; residential proxies are recommended for large runs to avoid rate limits. Apify Proxy is enabled by default.

## Actor input object example

```json
{
  "listingType": "koop",
  "areas": [
    "amsterdam",
    "rotterdam"
  ],
  "sortBy": "relevancy",
  "maxItems": 50,
  "maxConcurrency": 5,
  "maxRequestRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All extracted property listings for this run.

## `overviewTable` (type: `string`):

A clean, human-readable table view of the scraped 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 = {
    "areas": [
        "amsterdam"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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"
  ],
  "maxItems": 50
}' |
apify call haketa/funda-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Funda.nl Scraper - Netherlands Real Estate Listings Extractor",
        "description": "Scrape property listings from Funda.nl: price, m², rooms, energy label, address, broker, photos & more. Search by city or paste URLs. Export to JSON, CSV & Excel.",
        "version": "1.0",
        "x-build-id": "0g41nBpTjyy53s11g"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/haketa~funda-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-haketa-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/haketa~funda-scraper/runs": {
            "post": {
                "operationId": "runs-sync-haketa-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/haketa~funda-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-haketa-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": {
                    "listingType": {
                        "title": "Listing type",
                        "enum": [
                            "koop",
                            "huur"
                        ],
                        "type": "string",
                        "description": "Whether to scrape properties for sale (koop) or for rent (huur). Used together with the <b>Areas</b> below.",
                        "default": "koop"
                    },
                    "areas": {
                        "title": "Areas (cities / neighbourhoods)",
                        "type": "array",
                        "description": "Funda area slugs to search, e.g. <code>amsterdam</code>, <code>rotterdam</code>, <code>den-haag</code>, or a neighbourhood like <code>amsterdam/centrum</code>. Each area is searched separately. Tip: search on funda.nl, then copy the area name from the URL. Leave empty if you only use Search URLs or Start URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevancy",
                            "date_down",
                            "price_up",
                            "price_down"
                        ],
                        "type": "string",
                        "description": "Order in which listings are collected for city/area searches.",
                        "default": "relevancy"
                    },
                    "searchUrls": {
                        "title": "Funda search URLs",
                        "type": "array",
                        "description": "Paste full Funda.nl search-result URLs (e.g. <code>https://www.funda.nl/zoeken/koop?selected_area=[\"amsterdam\"]&price=\"250000-500000\"</code>). Build any filter on funda.nl (price, surface, rooms, energy label…) and paste the URL here — all filters are respected. Pagination is handled automatically.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "startUrls": {
                        "title": "Listing URLs",
                        "type": "array",
                        "description": "Paste direct Funda listing URLs (e.g. <code>https://www.funda.nl/detail/koop/amsterdam/appartement-koningsstraat-42/44468743/</code>) to scrape specific properties at full detail.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of listings to scrape across the whole run. Use this to control cost. Set 0 for no limit.",
                        "default": 0
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Maximum number of pages scraped in parallel. Keep this moderate to stay polite to Funda and avoid rate limits.",
                        "default": 5
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "maximum": 15,
                        "type": "integer",
                        "description": "How many times a failed request is retried before being marked as failed.",
                        "default": 3
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Funda works from most connections; residential proxies are recommended for large runs to avoid rate limits. Apify Proxy is enabled by default.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
