Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

pyfunda

PyPI versionPython versionsLicense

pyfunda is a Python API wrapper for Funda.nl, the Netherlands' largest Dutch real estate platform. It talks to Funda's reverse engineered mobile JSON API, so you get clean typed objects for listings, prices, media, brokers, and price history without HTML scraping, Selenium, a headless browser, or CAPTCHA solving.

Funda has no public developer API. pyfunda is the only working opensource Python client that hits Funda's app facing *.funda.io endpoints directly, the same ones the official Android app uses.

Use pyfunda as a Funda API client or Funda Python SDK to fetch Dutch property listings, run search queries by city and price, pull listing detail and media, get broker info and reviews, read price history, and stream new listings. If you have been looking for a working fundascraper alternative or a Netherlands housing API, this is the only Python wrapper hitting the same *.funda.io endpoints the Funda Android app uses.

If you find this useful, consider giving it a star, it helps others discover the project.

Star History Chart

Why I'm open-sourcing this?

After pyfunda, I got messages asking why I'd give this away when aggregators will just take it and sell it. They're right, every week there's a new "revolutionary AI-powered housing finder" charging EUR40/month or a EUR250 "success fee." They all pull from the same one or two sources and wrap it in a fancy UI completely built with AI.

That's exactly why I'm open-sourcing it.

These services are selling air to people who are looking for any kind of hope. The data is public. The APIs aren't hard to figure out. You shouldn't have to pay someone to refresh a webpage for you. Funda could kill this entire market overnight by offering a public API. They don't, so here we are.

Here's the code, do it yourself. Send my library link to any AI service you use and ask it to build whatever tool you think will make your life easier while searching for your next home.

With pyfunda, I've already done all the heavy lifting for you.

Why pyfunda?

Because it simply works.

Funda has no public developer API. If you want Dutch real estate data programmatically, your options are limited:

LibraryApproachLimitations
whchien/funda-scraperHTML scrapingListing dates blocked since Q4 2023 (requires login). Breaks when Funda changes frontend.
khpeek/funda-scraperScrapyLast updated 2016. No longer maintained.
joostboon/Funda-ScraperSeleniumRequires manual CAPTCHA solving. Slow browser automation.
Official APIBroker APIOnly available to registered brokers. Not accessible to regular developers.

pyfunda takes a different approach: it uses Funda's app-facing JSON APIs instead of scraping browser HTML.

  • Pure Python, no browser or Selenium needed
  • No manual CAPTCHA solving
  • Typed Python objects for listings, prices, media, brokers, coordinates, and history
  • Search, listing detail, enrichment, broker, price-history, polling, and parallel batch workflows
  • Raw Funda payloads are still available when you need fields that pyfunda does not model yet

Installation

pip install pyfunda

For local development:

uv sync
uv run python -m unittest discover -s tests

Quick Start

fromfundaimportFundawithFunda() asclient:
# Get a listing by global id, tiny id, or Funda URLlisting=client.listing(43117443)
print(listing.title, listing.city, listing.price.amount)
# Search listingsresults=client.search("amsterdam", max_price=500000)
foriteminresults:
print(item.title, item.price.amount, item.url)

How It Works

This library uses Funda's undocumented app-facing APIs, which provide clean JSON responses unlike the website that embeds data in Nuxt.js/JavaScript bundles.

Discovery Process

The original API was reverse engineered by intercepting and analyzing HTTPS traffic from the official Funda Android app:

  1. Configured an Android device to route traffic through an intercepting proxy
  2. Used the Funda app normally - browsing listings, searching, opening shared URLs
  3. Identified the *.funda.io API infrastructure separate from the www.funda.nl website
  4. Analyzed request/response patterns to understand the query format and available filters
  5. Discovered how the app resolves URL-based IDs (tinyId) to internal IDs (globalId)

API Architecture

The app-facing APIs live across several *.funda.io services:

EndpointMethodPurpose
listing-detail-page.funda.io/api/v4/listing/object/nl/{globalId}GETFetch listing by internal ID
listing-detail-page.funda.io/api/v4/listing/object/nl/tinyId/{tinyId}GETFetch listing by URL ID
listing-search-wonen.funda.io/_msearch/templatePOSTSearch listings
listing-search-wonen.funda.io/geo-wonen-alias-prod/_search/templatePOSTAutocomplete location/search-box text
listing-detail-summary.funda.io/api/v1/listing/nl/{globalId}GETFetch lightweight listing summary
contacts-flows-bff.funda.io/.../contact-blockGETFetch realtor contact block
contacts-bff.funda.io/.../contact-formGETFetch contact-form availability
local-listings.funda.io/api/v1/similarlistingsGETFetch similar and recently sold listing IDs
marketinsights.funda.io/v2/localinsights/preview/...GETFetch neighbourhood market insights
brokerpresentation-office-pages-bff.funda.io/.../office-page/...GETFetch broker profile and listings
reviews-office-pages-bff.funda.io/.../reviews/nlGETFetch broker review aggregates
api.walterliving.com/hunter/lookupPOSTFetch price history data

The request transport, headers, retry profiles, and TLS fingerprint rotation are internal implementation details. Normal users only construct Funda() and call the public methods below.

Documentation

Disclaimer

This is an unofficial library and is not affiliated with, authorized, maintained, sponsored, or endorsed by Funda or any of its affiliates. Use at your own risk.

This library only accesses publicly available listing data through Funda's undocumented internal APIs. Using this library may violate Funda's Terms of Service. The authors are not responsible for any consequences of using this software.

This project is intended for personal use, research, and educational purposes only.

  • The APIs are undocumented and may change or break at any time without notice.
  • Please use this library responsibly and avoid excessive requests that could burden Funda's infrastructure.
  • Data may be subject to copyright and usage restrictions. Ensure your use complies with applicable laws.

License

AGPL-3.0

About

Python API wrapper for Funda.nl, the Dutch real estate platform. Uses the real mobile API. No scraping, no Selenium, no CAPTCHA.

Topics

Resources

Stars

191 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages