Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the Funda.nl API page →
Real Estate

Funda.nl API & Scraper

The Funda API returns Dutch real-estate listings as clean JSON.

3 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

The primary search endpoint returns listings with id, URL, contract, object type, price (EUR), surface (m2), rooms and bedrooms, and you can pull a detail and an area. It is built for real-estate tools and Dutch property analytics that need Funda data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.

Reference

The Dutch property vocabulary Funda returns, translated

Search results are normalized into English enum values, but the detail action returns the raw Dutch Kenmerken table, so the two vocabularies have to be read together. Every value below was observed on live listings across Amsterdam, Rotterdam, Utrecht and Noord-Holland on 2026-08-26 - 60 sale listings and 15 rentals.

Field and valueDutch on the siteWhat it means
price.condition = kosten_koperk.k.the asking price excludes transfer tax and notary costs, which the buyer pays - 58 of 60 measured sale listings
price.condition = vrij_op_naamv.o.n.those costs are already inside the asking price - the other 2, both new-build
price.period = per_monthper maandrentals carry period and no condition; sale listings carry condition and no period
surface_m2Wonenliving area in m2 - 206 on a measured house
plot_m2Perceelplot or land in m2 - 134 on the same house, and null on every apartment
detail features onlyInhoudinternal volume in m3 - 655 on the same house; there is no search field for it
status = noneBeschikbaarstill available - 58 of 60
status = sold_under_reservationVerkocht onder voorbehoudunder offer, sale not yet final - the other 2
construction_type = resale / newly_builtBestaande bouw / Nieuwbouwexisting home versus new construction
contract = ["buy"] / ["rent"]koop / huuran array, not a string, and the URL path segment matches (/detail/koop/ or /detail/huur/)
agent.associationNVM / VN / MZVthe agent's professional body - measured 48 / 6 / 6

energy_label runs A+++, A++, A+, A, B, C, D, E and F, and also returns the literal string "unknown" rather than null when Funda has no label. Check for the word, not for a nullish value.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/funda/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "area": "amsterdam"
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "funda",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 4176.1,
    "record_count": 15,
    "bytes": 1101960,
    "cache_hit": false,
    "stop_reason": "limit_reached",
    "locale": "nl-NL",
    "currency": "EUR",
    "total": 6600,
    "count": 15,
    "page": 1,
    "max_pages": 440,
    "area_slug": "amsterdam",
    "filters_applied": {},
    "charged_credits": 1,
    "version": "1.1.0"
  },
  "data": {
    "results": [
      {
        "id": 8163668,
        "global_id": 8163668,
        "tiny_id": "44518021",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-erich-salomonstraat-554/44518021/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 745000,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 137,
        "plot_m2": null,
        "rooms": 5,
        "bedrooms": 4,
        "energy_label": "A",
        "status": "none",
        "publish_date": "2026-09-23T21:01:01.6138619+02:00",
        "zoning": "residential",
        "address": {
          "street": "Erich Salomonstraat",
          "house_number": "554",
          "house_number_suffix": null,
          "postal_code": "1087KC",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "Ed Pelsterparkbuurt",
          "district": "IJburg-West",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 35,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/93004c9d-5806-4a29-ab8a-7e53e7b87083/8ab1b912-a9f8-441c-a36f-852fbc70a291",
        "agent": {
          "office_name": "Amster Vastgoed ",
          "office_id": "a869afc1-d58d-4fd3-b32b-dcfa0c1d4bca",
          "association": "NVM",
          "url": "https://www.funda.nl/makelaar/24900-amster-vastgoed/",
          "personal_contact": [
            "[trimmed-depth]"
          ]
        }
      },
      {
        "id": 8163535,
        "global_id": 8163535,
        "tiny_id": "44518998",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-suze-groenewegplantsoen-37/44518998/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 449500,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 102,
        "plot_m2": null,
        "rooms": 4,
        "bedrooms": 3,
        "energy_label": "A",
        "status": "none",
        "publish_date": "2026-09-23T17:34:06.3836528+02:00",
        "zoning": "residential",
        "address": {
          "street": "Suze Groenewegplantsoen",
          "house_number": "37",
          "house_number_suffix": null,
          "postal_code": "1067DB",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "Eendrachtspark",
          "district": "Geuzenveld",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 36,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/3d084f92-fdb5-47b2-b145-78984ac605c2/b51dd453-39de-4061-bf0a-9c8c5e942c95",
        "agent": {
          "office_name": "Makelaardij Van der Linden Amsterdam",
          "office_id": "4832538a-479f-4126-b4d1-896acc39ee5c",
          "association": "NVM",
          "url": "https://www.funda.nl/makelaar/24079-makelaardij-van-der-linden-amsterdam/",
          "personal_contact": [
            "[trimmed-depth]"
          ]
        }
      },
      {
        "id": 8163555,
        "global_id": 8163555,
        "tiny_id": "80972554",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-kempenlaan-7/80972554/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 490000,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 97,
        "plot_m2": null,
        "rooms": 3,
        "bedrooms": 2,
        "energy_label": "A",
        "status": "none",
        "publish_date": "2026-09-23T17:22:58.6956712+02:00",
        "zoning": "residential",
        "address": {
          "street": "Kempenlaan",
          "house_number": "7",
          "house_number_suffix": null,
          "postal_code": "1066PW",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "Belgiëplein e.o.",
          "district": "Sloten/Nieuw-Sloten",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 31,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/af961ad5-3e46-4c0d-943c-1367dd2685f5/2778c112-a59d-4074-91e2-ab0dda3b49ea",
        "agent": {
          "office_name": "Vlindermolen Makelaardij",
          "office_id": "23c7c2ae-adc9-4784-9aec-1549e47c34fe",
          "association": "VN",
          "url": "https://www.funda.nl/makelaar/63683-vlindermolen-makelaardij/"
        }
      }
    ],
    "total": 6600,
    "count": 15,
    "page": 1,
    "max_pages": 440,
    "area": {
      "query": "amsterdam",
      "area_slug": "amsterdam",
      "label": "Koopwoningen Amsterdam - huizen te koop in Amsterdam | Funda",
      "matched": true
    },
    "filters_applied": {}
  }
}
Actions

What the Funda.nl API does

ActionDescriptionConcrete use caseKey params
searchSearch Funda.nl property listings by area (for sale or for rent), with structured filters: price (EUR), rooms, living surface (m²), plot size, property type and sort. Each result carries price, object type, surface, rooms, bedrooms, energy label, construction type, address, agent and the primary photo. Paginate with page.Real-estate investors call search to search Funda.nl property listings by area (for sale or for rent), with structured filters.area, contract, home_type, sort, page, ...
detailFull record for a single listing by its Funda detail URL or path (funda.nl/detail/koop/<city>/<slug>/<id>/). Returns price, address, description, every photo at full resolution, and the complete Kenmerken (specifications) table — surface, rooms, year built, energy label, heating, location and more.Brokerage tools call detail to get full record for a single listing by its Funda detail URL or path (funda.nl/detail/koop/<city>….url
areaArea resolver — map a free-text Dutch place name to Funda's search area-slug and report the live listing count there. Use it to power a search box or to confirm the exact area the search will use (a city resolves to its slug, a province to its provincie- slug).Property dashboards call area to get area resolver.query
Code samples

Call search from your stack

curl -X POST https://api.reefapi.com/funda/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"area":"amsterdam"}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.funda.search with {"area":"amsterdam"}.
Use cases

Who uses this API and why

  • Investors call search to track Dutch listing prices by area.
  • Property dashboards use detail to enrich a listing.
  • Market analysts use area to size inventory in a Dutch region.
FAQ

Questions developers ask before integrating

Do the Dutch price suffixes k.k. and v.o.n. show up in the API?

Yes, as price.condition, and it is the most consequential field on a Dutch sale listing. kosten_koper (k.k.) means the buyer pays transfer tax and notary fees on top of the asking price, and vrij_op_naam (v.o.n.) means those costs are already included, which is typical of new-build. Measured across 60 sale listings: 58 kosten_koper and 2 vrij_op_naam. The detail action prints the same thing in Dutch inside the Kenmerken table, as Vraagprijs = "€ 1.625.000 kosten koper". Comparing a k.k. price against a v.o.n. price without adjusting understates the new-build.

Which id is the listing id? I see three different numbers.

All three are real and they point at the same property. A measured Amsterdam house returned id 8123078 on the search row while its own url ended in /44578431/, and calling detail on that URL returned id "17205704" with a rewritten url ending /17205704/. The detail id is the one Funda canonicalizes to, and both URL forms resolve - a second detail call on the /17205704/ URL returned the same record. Practical rule: pass the search row's url straight into detail rather than constructing a URL from an id, and key your own store on the detail id.

How do I tell living area from plot size?

surface_m2 is the living area (Wonen on the site) and plot_m2 is the land (Perceel). A measured house came back with surface_m2 206 and plot_m2 134, while every apartment measured returned plot_m2 null - which is correct rather than missing, since an apartment has no plot. The detail action adds two more that search does not carry: "Overige inpandige ruimte" (other internal space, 32 m2 on that house) and "Inhoud", the volume in cubic metres that Dutch listings quote alongside floor area.

How do I search rentals instead of sales, and what changes?

Pass contract "rent" - Funda calls it huur. Three things change. The price object swaps condition for period "per_month", so an amount_eur of 2400 is monthly rent, not a purchase price. The URL path becomes /detail/huur/. And the object_type mix widens: a measured Rotterdam rental page returned 11 apartments, 2 houses and 2 parking spaces, so filter on object_type if you do not want garages in a rent index. Rental supply is far thinner - 334 rentals against 5,857 sale listings in the measured cities.

Why is Energielabel useless on the detail record?

Because Funda renders the label as a graphic with an explainer link beside it, so that Kenmerken row scrapes as Energielabel = "Wat betekent dit?" ("what does this mean?") rather than a grade. The usable value is on the search row, as energy_label, where measured values ran A+++, A++, A+, A, B, C, D, E, F and the literal string "unknown". Keep the search row when you need the label; do not expect detail to confirm it.

How do I resolve a place name before searching?

The area action takes free text and returns the slug the search will actually use, plus the live listing count there. Measured: "Den Haag" resolved to area_slug den-haag with total_for_sale 3,008, and "Noord-Holland" resolved to provincie-noord-holland with 17,772 - provinces get a provincie- prefix, cities do not. An unrecognized place does not error: it returns ok:true with matched false, area_slug null and total_for_sale 0, so check matched before you search on it.

How many listings can I page through?

15 per page. A measured Amsterdam sale search reported meta.total 5,857 and meta.max_pages 391, with meta.stop_reason "limit_reached" on a full page. Page with page += 1 until you pass max_pages. If you are building an inventory rather than sampling, split by price band or object_type instead of walking 391 pages - filters_applied is echoed on every response so you can confirm what actually took effect.

Why do search and detail disagree about the same listing?

They read different documents, and each is authoritative for different fields. On one measured property, search reported photo_count 73 and postal_code "1032LS", while detail on the same listing reported photo_count 6 and postal_code null, and returned object_type in Dutch ("Huis") where search returned English ("house"). What detail contributes is the features[] array - 32 rows across Overdracht, Bouw, Oppervlakten en inhoud, Indeling, Energie, Kadastrale gegevens, Buitenruimte, Garage and Parkeergelegenheid - carrying facts search has no field for at all, including ground-lease status (Eigendomssituatie: erfpacht) and its annual charge.

What is the Funda.nl API?

Funda.nl API is a ReefAPI endpoint group for funda.nl It returns live JSON through POST requests under /funda/v1.

Is the Funda.nl API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Funda.nl calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Funda.nl login or account?

No login to Funda.nl is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Funda.nl data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Funda.nl API use?

Funda.nl actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

Can I call Funda.nl from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call funda actions with the same key, credit pool and JSON envelope used by normal REST requests.

docs / funda

Funda.nl

Funda.nl

base /funda/v13 endpoints
post/funda/v1/detail1 credit

Full record for a single listing by its Funda detail URL or path (funda.nl/detail/koop/<city>/<slug>/<id>/). Returns price, address, description, every photo at full resolution, and the complete Kenmerken (specifications) table — surface, rooms, year built, energy label, heating, location and more.

ParameterAllowed / rangeDescription
urlrequired—A Funda listing detail URL or path — the funda.nl/detail/koop/<city>/<slug>/<id>/ link from a search result's `url`. A full https URL or just the /detail/... path both work.
Try in playground →
post/funda/v1/area1 credit

Area resolver — map a free-text Dutch place name to Funda's search area-slug and report the live listing count there. Use it to power a search box or to confirm the exact area the search will use (a city resolves to its slug, a province to its provincie- slug).

ParameterAllowed / rangeDescription
queryrequired—Free-text Dutch place to resolve — a city, town or province ('Amsterdam', 'Den Haag', 'Noord-Holland').
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.

Comparing scraping APIs?ReefAPI vs Bright Data