Funda in Business APIfundainbusiness.nl ↗
Search and retrieve Dutch commercial property listings from fundainbusiness.nl. Offices, retail, industrial, and land for sale or rent across the Netherlands.
What is the Funda in Business API?
The funda in business API provides access to Dutch commercial real estate data through 2 endpoints. Use search_listings to query offices, retail spaces, industrial halls, hospitality venues, and land across the Netherlands by location slug, offer type, price range, and area — then call get_listing to retrieve full detail on any individual listing including address, floor area, energy label, price, photos, and a structured features table grouped by the site's own section headings.
curl -X GET 'https://api.parse.bot/scraper/135866f8-6d2c-4445-9954-af605c73156e/search_listings?location=gemeente-amsterdam&offer_type=huur&property_type=kantoor' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace fundainbusiness-nl-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: search commercial listings in Amsterdam and drill into a detail page."""
from parse_apis.fundainbusiness_nl_api import (
FundaInBusiness,
OfferType,
PropertyType,
SortOrder,
InputNotFound,
)
client = FundaInBusiness()
# Search office spaces for rent in Amsterdam, newest first
for listing in client.listing_summaries.search(
location="gemeente-amsterdam",
property_type=PropertyType.KANTOOR,
offer_type=OfferType.HUUR,
sort=SortOrder.DATE,
limit=5,
):
print(listing.address, listing.city, listing.price_display, listing.area_m2)
# Drill into the first result to get full detail (photos, description, features)
summary = client.listing_summaries.search(
location="amsterdam",
offer_type=OfferType.HUUR,
limit=1,
).first()
if summary is not None:
# Navigate from summary to full listing via typed method
detail = summary.details()
print(detail.address, detail.postal_code, detail.province)
print("price:", detail.price_display, "area:", detail.area_m2, "m²")
print("energy label:", detail.energy_label)
print("photos:", len(detail.photos))
print("description:", detail.description[:120])
# Direct point lookup when you already know the listing id
try:
office = client.listings.get(listing_id="80974101")
print(office.address, office.price_display, office.status)
except InputNotFound:
print("listing no longer available")
print("exercised: listing_summaries.search / summary.details / listings.get")
Searches commercial property listings for one location and returns one page of 15 results (the site's fixed page size) with the site's total result count and page count. The location is a site location slug: a city (amsterdam), a municipality (gemeente-amsterdam), a province (provincie-utrecht) or a 4-digit postal code area (1031). Results are a mix of object listings and new-build projects (kind field); featured/promoted rows appear among regular ones in the order the site shows them. The area filter is applied by the site on the size of the units offered, so the area_m2 shown per row (total floor area) can fall outside the requested range. A price range is only accepted together with offer_type koop or huur; for huur the range is interpreted in rent_price_unit. Paging is by the page parameter (default 1); has_more is true while further pages exist. An unknown location slug returns a 422 stale_input error; a page beyond the last one returns an empty listings array.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based results page; each page holds 15 rows. |
| sort | string | Result ordering. relevance and date are descending; city, postal_code, address and rent_per_m2 ascending; area and units descending (the directions the site offers). |
| locationrequired | string | Site location slug: lowercase letters, digits and hyphens, e.g. amsterdam, gemeente-amsterdam, provincie-utrecht, or a 4-digit postal code area such as 1031. |
| max_price | integer | Upper price bound in euros, same unit rules as min_price. Requires offer_type koop or huur. |
| min_price | integer | Lower price bound in euros. For koop this is the asking price; for huur it is measured in rent_price_unit. Requires offer_type koop or huur. |
| radius_km | integer | Search radius around the location. The site accepts only 0, 1, 2, 5, 10, 15, 30, 50 or 100; other values are rejected with a 422. |
| offer_type | string | Whether to return properties for sale (koop), for rent (huur) or both (beide). |
| max_area_m2 | integer | Maximum unit size in m². |
| min_area_m2 | integer | Minimum unit size in m². |
| property_type | string | Property category to search within. Omitted = all commercial property. |
| rent_price_unit | string | Unit in which min_price/max_price are interpreted when offer_type is huur: total rent per year, per month, or rent per m² per year. Ignored otherwise. |
{
"type": "object",
"fields": {
"page": "page number returned",
"has_more": "true when a later page exists",
"listings": "array of result rows in site order",
"location": "echo of the location slug searched",
"per_page": "rows per page (always 15)",
"offer_type": "koop, huur or beide as applied",
"total_pages": "last page number the site offers",
"property_type": "property category code applied",
"total_results": "total matching listings reported by the site",
"listings[].url": "site-relative path of the listing page",
"listings[].city": "place name",
"listings[].kind": "object (single property) or project (new-build/multi-unit project)",
"listings[].labels": "site badges on the row (e.g. Nieuw)",
"listings[].address": "street and house number",
"listings[].area_m2": "total floor area in m² as shown in the row, null when absent",
"listings[].global_id": "site-wide numeric id of the listing",
"listings[].image_url": "main photo URL",
"listings[].placement": "promo (featured) or regular",
"listings[].agent_name": "listing agent name",
"listings[].listing_id": "numeric listing id as string; pass to get_listing (kind=object only)",
"listings[].price_display": "price exactly as shown, e.g. '€ 129 /m²/jaar', '€ 595.000 k.k.', or 'Huurprijs op aanvraag'",
"listings[].property_type": "site label(s) of the property function, | separated when multiple"
},
"sample": {
"data": {
"page": 1,
"has_more": true,
"listings": [
{
"url": "/kantoor/amsterdam/object-80974101-asterweg-20-p1/",
"city": "Amsterdam",
"kind": "object",
"labels": [],
"address": "Asterweg 20-P1",
"area_m2": 481,
"global_id": 8165102,
"image_url": "https://cloud.funda.nl/valentina_media/235/305/913_720x480.jpg",
"placement": "regular",
"agent_name": "Blauwman Bedrijfsmakelaars",
"listing_id": "80974101",
"price_display": "€ 129 /m²/jaar",
"property_type": "Kantoor"
},
{
"url": "/alle-bedrijfsaanbod/amsterdam/project-89938061-stitch-offices/",
"city": "Amsterdam",
"kind": "project",
"labels": [
"Bedrijfsverzamelgebouw"
],
"address": "H.J.E. Wenckebachweg 123",
"area_m2": 728,
"global_id": 7129062,
"image_url": "https://cloud.funda.nl/valentina_media/215/734/602_720x480.jpg",
"placement": "regular",
"agent_name": "Spring Serviced Offices",
"listing_id": "89938061",
"price_display": "huurprijs op aanvraag",
"property_type": "Kantoorruimte|Kantoor, Stitch Offices"
}
],
"location": "gemeente-amsterdam",
"per_page": 15,
"offer_type": "beide",
"total_pages": 114,
"property_type": "alle-bedrijfsaanbod",
"total_results": 2190
},
"status": "success"
}
}About the Funda in Business API
Searching Commercial Listings
The search_listings endpoint accepts a required location parameter — a lowercase hyphenated slug such as amsterdam, gemeente-amsterdam, or provincie-utrecht — and returns up to 15 results per page (the site's fixed page size). The response includes total_results, total_pages, and a has_more flag so you can paginate programmatically. Optional filters include offer_type (koop, huur, or beide), min_price and max_price in euros, max_area_m2, and a radius_km parameter that accepts only the discrete values 0, 1, 2, 5, 10, 15, 30, 50, or 100 — other values are rejected. Results can be ordered by relevance, date, city, postal_code, address, rent_per_m2, or area.
Listing Detail
The get_listing endpoint takes a numeric listing_id from a search_listings result (only rows where kind is object are valid) and returns the full property record. Fields include address, city, province, area_m2, price (numeric, null when on request), price_display (formatted label), status (e.g. beschikbaar), construction_year, energy_label, a photos array of large image URLs, and a features object. The features object is keyed by the site's section headings — such as general characteristics, surface area breakdown, or facility details — and each section maps characteristic labels to their displayed values.
Coverage and Scope
All listings are sourced from fundainbusiness.nl, which covers commercial property across the Netherlands. The offer_type filter controls whether results are for sale, for rent, or both. Price semantics differ by offer type: for koop the price is the asking price; for huur it corresponds to the rent expressed in rent_price_unit. Listings without a public price return null for the numeric price field while price_display may show a label like "op aanvraag".
The Funda in Business API is a managed, monitored endpoint for fundainbusiness.nl — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when fundainbusiness.nl changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official fundainbusiness.nl API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a dashboard tracking available office space in a specific Dutch municipality by polling search_listings with a gemeente slug.
- Aggregate asking prices for industrial halls across multiple provinces to produce a rent-per-m² benchmark.
- Feed a CRM with structured listing data — address, area_m2, energy_label, features — by chaining search_listings and get_listing.
- Alert users when new retail properties matching a price range appear in a city by comparing total_results across polling intervals.
- Populate a comparison tool for commercial tenants by fetching full detail records including photos and features for shortlisted listing IDs.
- Analyse energy label distribution across Dutch commercial stock by extracting the energy_label field from bulk get_listing calls.
- Map available land plots within a 10 km radius of a logistics hub using the radius_km filter and the returned address and city fields.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.