Funda.nl API

Read Funda listings with the Dutch price convention already parsed

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

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Funda.nl endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
F
/funda/v1

3 active endpoints, on 0 and 1 credit tiers.

  • POST/funda/v1/search
  • POST/funda/v1/detail
  • POST/funda/v1/area

What Funda.nl endpoints does ReefAPI ship?

3 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

3 endpoints

search

1 cr

Search Funda.nl property listings by area (for sale or for rent), with structured filters.

required
area
optional
contract, home_type, sort, page, price_min, price_max, rooms_min, rooms_max, surface_min, surface_max, plot_min, plot_max

detail

1 cr

Full record for a single listing by its Funda detail URL or path (funda.nl/detail/koop/<city>…

required
url
optional

area

0 cr

Area resolver.

required
query
optional

Every parameter, every allowed value →

Funda.nl API

3 of 3 endpoints, ready to run

View docs ↗

15 rows a page with a publish timestamp on each, an energy label, and a price object that tells you what the number includes.

1 credit1 required · 4 optional
POST/funda/v1/search
ok1584 ms · 15 records · sample
{
  "ok": true,
  "meta": {
    "api": "funda",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1583.5,
    "record_count": 15,
    "cache_hit": false
  },
  "data": {
    "results": [
      {
        "id": 8126547,
        "global_id": 8126547,
        "tiny_id": "44571900",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-jisperveldstraat-244/44571900/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 350000,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 85,
        "plot_m2": null,
        "rooms": 4,
        "bedrooms": 3,
        "energy_label": "C",
        "status": "none",
        "publish_date": "2026-08-28T18:00:15.6384767+02:00",
        "zoning": "residential",
        "address": {
          "street": "Jisperveldstraat",
          "house_number": "244",
          "house_number_suffix": null,
          "postal_code": "1024AM",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "Markengouw-Noord",
          "district": "Waterlandpleinbuurt",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 33,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/96ee6c32-fea5-4788-b72e-5e0ca4f57c94/22ee3d45-1c51-4326-8108-6c0d22909e0d",
        "agent": {
          "office_name": "Pim de Jong Makelaars",
          "office_id": "7f668e85-4705-41d2-98a4-710235eb3889",
          "association": "NVM",
          "url": "https://www.funda.nl/makelaar/24728-pim-de-jong-makelaars/"
        }
      },
      {
        "id": 8126415,
        "global_id": 8126415,
        "tiny_id": "44571878",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-hellingstraat-220/44571878/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 925000,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 104,
        "plot_m2": null,
        "rooms": 4,
        "bedrooms": 3,
        "energy_label": "A",
        "status": "none",
        "publish_date": "2026-08-28T18:00:11.5513958+02:00",
        "zoning": "residential",
        "address": {
          "street": "Hellingstraat",
          "house_number": "220",
          "house_number_suffix": null,
          "postal_code": "1033WW",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "NDSM terrein",
          "district": "Noordelijke IJ-oevers-West",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 42,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/3fd3553b-bf3f-48ea-b2bb-f4a9bc1d7db0/e261735c-6cd6-4fb5-b0bd-bc0526e68ad4",
        "agent": {
          "office_name": "KRK Makelaars Amsterdam",
          "office_id": "590c7b38-22af-4cd9-834d-a059db09162b",
          "association": "NVM",
          "url": "https://www.funda.nl/makelaar/24607-krk-makelaars-amsterdam/"
        }
      },
      {
        "id": 8126487,
        "global_id": 8126487,
        "tiny_id": "44571840",
        "url": "https://www.funda.nl/detail/koop/amsterdam/appartement-willy-sluiterstraat-20/44571840/",
        "contract": [
          "buy"
        ],
        "object_type": "apartment",
        "construction_type": "resale",
        "price": {
          "amount_eur": 575000,
          "currency": "EUR",
          "kind": "sale",
          "condition": "kosten_koper",
          "type": "regular"
        },
        "surface_m2": 90,
        "plot_m2": null,
        "rooms": 3,
        "bedrooms": 2,
        "energy_label": "A++",
        "status": "none",
        "publish_date": "2026-08-28T18:00:07.8584232+02:00",
        "zoning": "residential",
        "address": {
          "street": "Willy Sluiterstraat",
          "house_number": "20",
          "house_number_suffix": null,
          "postal_code": "1061TH",
          "city": "Amsterdam",
          "municipality": "Amsterdam",
          "neighbourhood": "Overtoomse Veld-Noord",
          "district": "Overtoomse Veld",
          "province": "Noord-Holland",
          "country": "NL"
        },
        "photo_count": 44,
        "primary_photo_url": "https://cloud.funda.nl/tiara-media/e1e8b315-53bd-4d92-bbce-31a51ce65598/9de1c1d0-41a6-4169-b51a-33ea37d5b489",
        "agent": {
          "office_name": "MAKELAAR BERT",
          "office_id": "f3c83f82-2e73-448f-815d-02c6c4dbc19d",
          "association": "NVM",
          "url": "https://www.funda.nl/makelaar/24770-makelaar-bert/"
        }
      }
    ],
    "total": 5927,
    "count": 15,
    "page": 1,
    "max_pages": 396,
    "area": {
      "query": "amsterdam",
      "area_slug": "amsterdam",
      "label": "Koopwoningen Amsterdam - huizen te koop in Amsterdam | Funda",
      "matched": true
    },
    "filters_applied": {}
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Funda.nl API works

Funda.nl is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /funda/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
0 or 1 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

A daily new-listing sweep for the Netherlands

Funda stamps every listing with a publish timestamp to the second, which makes an incremental sweep a matter of reading pages until the timestamps go stale — no diffing, no snapshots.

01area
POST/funda/v1/area
{"query": "Den Haag"}

Free. Returns the area slug and total_for_sale — Den Haag came back at 3,040 — so you know the size of the job.

02search
POST/funda/v1/search
{"area": "den-haag", "sort": "newest", "page": 1}

1 credit for 15 rows. Stop paging when publish_date drops below your last run: an Amsterdam page one held 5 listings from that day and 10 from the day before.

One credit a page, a timestamp on every row, and no snapshot comparison to maintain. The price object already tells you whether the figure includes transfer costs.

request
curl -X POST https://api.reefapi.com/funda/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"area":"amsterdam"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "funda",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

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.

kosten koper, per_month, and the three different ids for one flat

Measured on 2026-08-28 on Amsterdam and Rotterdam, sale and rent, with two listings opened individually. Three of these lines go against us and the first is the one that will break a database.

Coverage

The Netherlands, nationwide — cities, towns and provinces all resolve to an area slug. koop (sale) and huur (rent). Amsterdam reported 5,910 for-sale listings on our run, Den Haag 3,040.

The price object answers the tax question

This is what this engine has. On sale rows the price is an object with amount_eur, currency, kind "sale" and condition "kosten_koper" — the Dutch convention meaning transfer tax and notary costs are on the buyer, as opposed to vrij op naam where they are in the price. On rent rows the same object reads kind "rent" and period "per_month". 15 of 15 rows on both channels. You never have to guess what the number includes.

Every row carries a publish timestamp

publish_date is a full ISO instant with offset — the finest listing date in this batch. An Amsterdam page one, read just after midnight UTC, held five listings stamped that day and ten from the day before. That is a real incremental sweep without keeping a snapshot.

One flat, three different numbers

Against us, and confirmed on two listings in a row. The search row reported id 8123125; its own url ended in /44578588/; the detail response for that url reported id 17205851 and a url ending in /17205851/. The second listing: 8124190, /44579553/, 17206826. Three id spaces, nothing joining them but the address slug. Key your database on the search url, which is also what detail takes — never on the numeric id from either surface.

detail's description field is the page title

Against us, 2 of 2. The detail response returns description as "Appartement te koop: Assumburg 24 1081 GC Amsterdam [funda]" — the browser tab text, not the advert. The real content is in the features array, which is genuinely good: grouped Dutch label and value pairs including Aangeboden sinds (listed since), Vraagprijs with its kosten koper suffix, Vraagprijs per m², Bijdrage VvE (the monthly service charge), Bouwjaar, roof type and accessibility.

And detail is thinner than the grid in two places

Against us. postal_code is filled on the search row and null on the detail response for the same property. The detail price object drops the condition and period fields the search row carried. Read the money and the postcode from search; read the specification sheet from detail.

status is not a sold marker

Against us, in the sense that it does not do what its name suggests. status came back as the string "none" on 15 of 15 rows on both the sale and rent channels. There is no sold archive and no price history in this engine — the publish timestamp is the whole freshness story.

Paging is deep

15 rows a page. Page 100 of an Amsterdam query returned 15 fresh listings with zero overlap against page one, against a reported total of 5,910 and a stated max_pages of 394. The reported total looks reachable here, which is not true of most portals in this batch.

Price

area free, search 1 flat credit for 15 rows, detail 1 flat credit. No per-row billing. Search responses ran one to seven seconds depending on the city.

What people build with Funda.nl

The jobs this data is most often used for.

3

endpoints

0/1

credits per call

01

Investors call search to track Dutch listing prices by area.

02

Property dashboards use detail to enrich a listing.

03

Market analysts use area to size inventory in a Dutch region.

What Funda.nl data costs

The cheapest call here is 0 credits, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/funda/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"area":"amsterdam"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/funda/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "area": "amsterdam"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Funda.nl.

Get a free key →
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, and 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.

11 Real Estate APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Funda.nl, you are one call away from the rest of the category — no second contract, no second integration.

Already paying for something else?Funda.nl vs Bright Data

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.