Funda Scraper - Netherlands Property Listings avatar

Funda Scraper - Netherlands Property Listings

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Funda Scraper - Netherlands Property Listings

Funda Scraper - Netherlands Property Listings

Extract Funda property listings, new-build projects, broker offices and area statistics across the Netherlands. Pay per delivered row, plus a start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

0

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

Funda Scraper

Extract Funda property listings, broker offices and area statistics as exportable rows for Dutch real-estate research.

  • Search homes for sale, rentals and new-build properties.
  • Collect several Dutch areas or specific listing URLs in one run.
  • Get prices, floor areas, rooms, energy labels and public broker contacts.
  • Add property features and media when available.
  • Pay $3.00 per 1,000 delivered rows on the Free plan, plus a small start fee.

What does Funda Scraper do?

Funda Scraper collects public data from Funda.nl for property research, price monitoring and agency directories. Each row represents a listing, project, office, area or insights record; rowType identifies it.

  • Property search: koop for sale, huur for rent and nieuwbouw for new builds.
  • Other channels: makelaar for offices, map for map search, sitemap for URL inventory, suggest for area suggestions and insights for area statistics.
  • Specific listings: detailUrls collects the links you supply instead of an area search.
  • Enrichment: enrichDetails and enrichLead default to true; enrichMedia and sitemapDetails default to false. They add fields to the same row, not separately billed contact or photo rows.

What data can you extract from Funda?

Fields depend on the channel and public availability. Missing values remain empty or absent. Examples below are illustrative, not current listings or valuations.

Listing rows

FieldDescriptionExample
rowTypeEntity categorylisting
idString identifier43000000
listingUrlFunda detail linkhttps://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/
addressStructured property address{"street":"Example Street","unit":"1","locality":"Amsterdam"}
cityCityAmsterdam
priceAsking price or rent; usually numeric450000
priceCurrencyCurrency when a price is presentEUR
floorAreaLiving area in square metres85
roomsRoom count4
bedroomsBedroom count3
energyLabelPublished energy ratingA
agentNameProperty agency nameExample Agency
featuresDetailed property characteristics{"overdracht.Aanvaarding":"In overleg"}
mediaAvailable photos, floor plans and videos{"photos":[]}
contentDepthPublic-access scopeguest_preview

Project rows

New-build searches can return individual listings as well as projects.

FieldDescriptionExample
rowTypeProject categoryproject
nameProject nameExample Development
listingKindGrouped offering when providedgroup
constructionTypeConstruction categorynewly_built
listingUrlProject pagehttps://www.funda.nl/nieuwbouw/
idProject identifier43000001
cityProject locationAmsterdam
pricePrice when supplied450000
floorAreaArea when supplied, in square metres85
statusAvailability when suppliedactive

Office rows

FieldDescriptionExample
rowTypeOffice categoryoffice
officeNameBrokerage nameExample Agency
officeUrlOffice pagehttps://www.funda.nl/makelaar/12345-example-agency/
phonesPublic office phone numbers[{"value":"+1 555 0100","type":"landline"}]
emailsPublic office email addresses[{"value":"name@example.com","type":"office"}]
listingUrlsOffice listing links[]
idOffice identifier12345
addressStructured office address{"street":"Example Street","unit":"1"}
webOffice website and social links{"website":"https://example.com","socials":[]}
employeeCountPublished employee count5

Area rows

FieldDescriptionExample
rowTypeSuggestion categoryarea
nameDisplay nameAmsterdam
geoIdentifierValue usable in selectedAreaamsterdam
areaTypeFunda area classificationPlaats
listingCountPublished listing count120
idArea identifieramsterdam
typePreview categoryarea
exactExact-match indicatortrue
countryCountry codeNL
scrapedAtCollection timestamp2026-10-24T00:00:00Z

Insights rows

FieldDescriptionExample
rowTypeStatistics categoryinsights
insightsCityRequested cityamsterdam
populationPublished population100000
averageAskingPriceAsking-price statistics{"value":450000}
averageAskingPricePerM2Price-per-square-metre statistics{"value":5000}
averageSellingTimeInDaysSelling-time statistics{"value":30}
idCity identifieramsterdam
provinceProvince nameNoord-Holland
ageGroupsPopulation age breakdown[]
householdSituationHousehold breakdown[]

How to scrape Funda

  1. Open Funda Scraper in Apify Console.
  2. Fill selectedArea, such as amsterdam, and choose channel.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. Download the dataset or read it through the API.

An empty input starts an Amsterdam koop example with at most 3 rows from the form's sample values. Normal event charges apply. A single area field is enough for the default sale search; other channels still require channel. There is no public mode field.

Use channel: "koop" and an area. selectedAreas accepts several areas; duplicate entities across them are delivered once.

Use channel: "huur". A price filter such as Max-2000 limits the advertised rent.

Use channel: "nieuwbouw". When omitted, constructionType becomes newly_built.

Specific listings

Fill detailUrls with Funda listing links. Leave channel on a property channel rather than combining it with office or statistics queries.

Office lookup

Set channel: "makelaar" and supply officeId or officeUrl. An office ID alone does not select this channel.

Set channel: "map", bbox and mapListingType. Coordinates use longitude first.

Sitemap inventory

Set channel: "sitemap" and select sitemapBuckets; no area is needed. Rows contain URLs and modification dates unless details are requested.

Area suggestions

Set channel: "suggest" and use selectedArea as the search text. Returned geoIdentifier values can be used in later searches.

Area insights

Set channel: "insights" and a city. Each available city produces one statistics row, not one row per property.

What to fill in

FieldWhat to enterDefault
selectedAreaCity, province, neighbourhood, postcode or nlEmpty; sample amsterdam
selectedAreasArray of area names or slugsEmpty
detailUrlsArray of Funda listing linksEmpty
officeUrlFunda office link with channel: "makelaar"Empty
officeIdNumeric office ID as a stringEmpty
postalCodeDutch postcode when no area is suppliedEmpty
channelA channel described above; sale and rent are aliaseskoop
maxResultsRows per area or detail URL; 1–50070; form sample 3
maxPagesSearch pages per area; 1–501
mapListingTypekoop or huur for map searchkoop
bboxminLon,minLat,maxLon,maxLatEmpty
zoomMap zoom levelUnset
objectTypehouse, apartment, parking, land, storage, office, garageEmpty
priceFunda range, such as Min-200000-Max-500000Empty
sortFunda sorting value, such as price.selling_price_ascEmpty
constructionTypeConstruction filter, such as newly_builtEmpty
localenl or en for detail pagesnl
enrichDetailsInclude detail-page characteristicstrue
enrichLeadInclude public broker office contactstrue
enrichMediaInclude additional media where availablefalse
sitemapBucketskoop, huur, nieuwbouw, recreatie, europe["koop"]
sitemapDetailsAdd details to sitemap rowsfalse
fieldsRequested output fields, such as ["price","city"][]
includeRawInclude available original source datafalse

fields also selects the detail information needed; requesting contact or media fields can enable that enrichment. Identity fields remain in the output.

Sale search across two areas:

{"channel":"koop","selectedAreas":["amsterdam","utrecht"],"maxResults":3}

Rentals:

{"channel":"huur","selectedArea":"rotterdam","objectType":"apartment","price":"Max-2000","maxResults":3}

New builds:

{"channel":"nieuwbouw","selectedArea":"amsterdam","maxResults":3}

Specific listing: replace this illustrative URL with a current Funda link.

{"detailUrls":["https://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/"],"locale":"en","enrichMedia":true,"maxResults":1}

Office: replace the illustrative ID with the office's real ID.

{"channel":"makelaar","officeId":"12345","maxResults":1}

Map:

{"channel":"map","bbox":"4.85,52.35,4.95,52.40","mapListingType":"koop","maxResults":3}

Sitemap:

{"channel":"sitemap","sitemapBuckets":["koop"],"maxResults":3}

Suggestions:

{"channel":"suggest","selectedArea":"amsterdam","maxResults":3}

Insights:

{"channel":"insights","selectedArea":"amsterdam","maxResults":1}
  • maxItems and limit are accepted as aliases of maxResults.
  • Close field-name misspellings are corrected; other unknown fields are ignored with a note. Some invalid filters, such as an unsupported locale, are ignored; an invalid channel still fails.
  • Invalid targets fail before row delivery with INVALID_INPUT:, followed by the field and correction, such as detailUrls must be funda.nl listing links. No rows are charged; the start fee can still apply.
  • Every run writes INPUT_REPORT to its default key-value store, showing filled, corrected and ignored fields and whether it used the example input.

Output example

Illustrative listing row with a placeholder address:

{
"id": "43000000",
"rowType": "listing",
"type": "listing",
"country": "NL",
"authority": "funda.nl",
"name": "Example Street 1",
"channel": "koop",
"listingUrl": "https://www.funda.nl/detail/koop/amsterdam/appartement-example-street-1/43000000/",
"city": "Amsterdam",
"price": 450000,
"priceCurrency": "EUR",
"floorArea": 85,
"rooms": 4,
"energyLabel": "A",
"contentDepth": "guest_preview"
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. Nested fields such as media are easiest to preserve in JSON.

Why use this Funda scraper?

  • Delivery-based billing: row charges apply to rows written to the dataset, plus the start fee.
  • Partial results: rows returned before a handled stop or deadline can still be delivered. Already written rows remain available; a forced termination cannot guarantee delivery of unfinished work.
  • Clear reporting: RUN_SUMMARY records partial results and failed or skipped areas; ERROR_SUMMARY records failures.
  • Source-based values: absent information is not invented.
  • Batch input: combine several areas or listing URLs in one run.
  • No proxy setup: you do not need to set up proxies.

How much does it cost to scrape Funda?

The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of allocated memory, with a minimum of one event. Default memory is 1024 MB, so a normal start costs $0.005. Platform usage is included in these prices.

Apify planStart at 1024 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.003$3.00
Starter$0.005$0.003$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20

maxResults applies to each selected area or detail URL, defaults to 70 and accepts up to 500. Larger requests are collected in parts of 70. All row types count together; maxPages, availability and duplicate removal can reduce the number delivered.

The Free plan is limited to 200 rows per run and 10 runs of this Actor. These are limits set by the publisher. Paid plans do not have the 10-run cap. Set Maximum cost per run (maxTotalChargeUsd in the API) to cap the whole run's charges.

Example: two areas delivering 3 distinct rows each give 6 rows. On the Free plan at 1024 MB, the cost is 6 × $0.003 + $0.005 = $0.023 for one normal start.

What happens when the run timeout is too short

For a single-query run, automatic resumption can pause the run when collection needs longer than the chosen timeout. Multi-area runs keep waiting instead. When resumption is accepted, the status message is:

Queued on the collection backend; this run will resume automatically when results are ready (about N s).

The run temporarily appears as ABORTED. Once results are ready, the same run resumes, reports Resumed: delivering N rows., writes to the same dataset and finishes as SUCCEEDED if delivery succeeds. Already delivered rows are skipped, not delivered or charged twice. No manual restart is needed for this pause.

  • The resume-attempt limit is 3. Keep the default timeout of 3600 seconds to reduce interruptions.
  • If resumption is unavailable or refused, the run waits within its remaining time; genuine failures can still occur.
  • run-sync and run-sync-get-dataset-items wait at most 300 seconds and may return an empty dataset during a pause. For longer runs, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.

Use with AI agents and the API

Apify MCP server

Add this remote server in Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:

https://mcp.apify.com?tools=lentic_clockss/funda-scraper

Sign in with Apify through OAuth, or supply Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/funda-scraper with APIFY_TOKEN set.

Example prompt: “Find three Funda rental apartments in Rotterdam with advertised rent up to EUR 2,000 and return their prices and URLs.”

Apify API

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/funda-scraper").call(
run_input={"channel": "koop", "selectedArea": "amsterdam", "maxResults": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/funda-scraper').call({
channel: 'koop', selectedArea: 'amsterdam', maxResults: 3
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Over HTTP, send the JSON input to POST https://api.apify.com/v2/acts/lentic_clockss~funda-scraper/runs with an Authorization: Bearer header. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Integrations

Use the Actor's Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable or your webhook. Apify Schedules can run recurring searches.

In het Nederlands

Met Funda Scraper verzamel je openbare woninggegevens van Funda in een exporteerbare tabel. Vul bij selectedArea een plaats in, bijvoorbeeld amsterdam, of gebruik selectedAreas voor meerdere gebieden. Kies koop voor koopwoningen, huur voor huurwoningen of nieuwbouw voor nieuwbouw. Voor een makelaarskantoor kies je makelaar en vul je officeId of officeUrl in. Begin met maxResults op 3 om de uitvoer te bekijken. Je ontvangt beschikbare prijzen, woonoppervlakten, kamers, energielabels en links. Niet-openbare gegevens blijven leeg. De kosten bestaan uit een startbedrag en een bedrag per geleverde rij. Download de resultaten als CSV, Excel of JSON. Stel vooraf een maximaal bedrag per uitvoering in.

FAQ

This Actor collects public data. You are responsible for checking Funda's terms and applicable data-protection law. Personal data requires a lawful basis; public availability alone does not authorize every reuse.

Why did my run end as ABORTED?

Read the status message. The automatic-resumption message described above means a temporary pause, not a completed failure. Other aborts, including manual stops, do not imply automatic resumption.

How many results can I get?

maxResults accepts 1–500 per input. Search availability, maxPages, the run's spending cap and Free-plan limits may reduce delivery. An office lookup or city-insights input normally returns one row.

Why are some fields empty?

Funda may not publish them, the chosen channel may not include them, or enrichment may be disabled or unsuccessful. loginGatedFields flags detected sign-in restrictions; it does not grant access.

Can I search several cities together?

Yes, use selectedAreas. Duplicate entities are removed across areas. If one area fails, available rows from other areas can still be delivered.

Can I get English descriptions?

Set locale to en for detail pages. This requests the English page where available; it does not promise translation of every source field.

Are broker contacts the homeowner's details?

No. Public office contacts are not private owner contacts. Contact forms and signed-in details are not exposed by this Actor.

Why did my Free-plan runs stop after ten runs?

The publisher allows 10 runs and at most 200 rows per run on the Free plan. A paid Apify plan removes that run-count cap.

Limitations

  • Coverage focuses on Funda's Dutch property offering, not other property portals. A sitemap bucket is not a guarantee of complete geographic coverage.
  • No signed-in content or guaranteed contact-field completeness. Rows use contentDepth: "guest_preview".
  • Sitemap rows omit property details by default. Enable sitemapDetails or request relevant fields to add them.
  • Image lists, individual media lists and office employee lists are capped at 50 entries; count fields can show larger totals. Oversized raw data is trimmed.
  • Current searches are not a complete historical sales archive. Funda changes and unavailable pages can cause partial results or failures.

More real estate and property data scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.