Funda in Business Scraper at a glance
Funda in Business Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, change type (incremental mode), deal and type, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Real Estate
- Region
- Europe
- Pricing
- $1.80 per 1,000 results (Free plan), from $1.00 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 38 options
Scrape Funda in Business commercial listings: offices, retail, industrial, catering and more. Full detail pages, pricing, floor areas, energy labels, coordinates, images, and agent/agency contacts with ratings. Dual search and URL modes, deep filters, and forward pagination.
What Funda in Business Scraper can do
- Dual input modes. Search mode builds listing URLs from location and filter fields. URL mode scrapes the listing or search-result links you already have.
- Deep filters. Property category, buy or rent, price and area ranges, energy label, construction period, surrounding context, building features, parking, publication date, auction and open day windows, and nine sort orders.
- Full detail-page enrichment. Complete description, every characteristic grouped by section (transfer, construction, areas, layout, energy), map coordinates, all photos and the listing agent's phone number.
- Agency profiles with reviews. Opt in to add each listing's agency contact details, address, employee count, average rating and individual reviews.
- Rich nested output. Pricing, location, property characteristics, media and agency relationships come back as one structured record, not a flat row.
- Built for schedules. Incremental mode tracks a search over time and returns only new and changed listings on recurring runs, and a rejected run fails loudly instead of returning an empty dataset.
Choose what to collect
These inputs let you configure Funda in Business Scraper - Commercial Property & Agents. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Choose how to start: 'search' uses the location + filter fields below; 'url' scrapes the listing URLs you paste. |
locationsarray | Cities, towns or areas to search, for example Amsterdam, Rotterdam, Utrecht. Each becomes a separate search. Leave empty to search all of the Netherlands. |
propertyTypestring | Which commercial category to search. As a filter this works in search mode only, where it picks the Funda in Business category page. In URL mode it filters nothing, but its value is still copied onto every record as property.property_type and source_context.search.property_type, so leave it at 'All commercial offerings' unless you want that label. |
dealTypestring | Filter by transaction type. As a filter this works in search mode only. In URL mode it filters nothing, but its value is still copied onto every record as source_context.search.deal_type and is used as the fallback for listing.deal_type when a listing's price text does not say whether it is for sale or for rent, so leave it at 'Both buy and rent' unless you want that label. |
keywordstring | Optional free-text term to narrow results. |
minPriceinteger | Lowest price or rent. For rent this is interpreted with the rent price basis below. |
maxPriceinteger | Highest price or rent. |
Show 31 more inputs
| Input | What it controls |
|---|---|
rentPriceBasisstring | How rent price bounds are applied (per month, per year, or per square metre). |
minAreainteger | Smallest floor area in square metres. |
maxAreainteger | Largest floor area in square metres. |
publicationDatestring | Only listings published within this window. |
surroundingarray | Filter by the type of area the property sits in. |
amenitiesarray | Require one or more building features. |
availabilityarray | Filter by availability characteristics. |
parkingstring | Minimum number of parking spaces. |
constructionTypestring | Filter by existing versus new construction. |
propertyAgearray | Filter by the period the property was built. |
energyLabelarray | Filter by energy label. |
auctionDatestring | Filter by upcoming auction window. |
openDaystring | Filter by open day availability. |
includeSoldRentedboolean | Also include historical listings that are already sold or rented. |
sortBystring | Result ordering. |
urlsarray | Funda in Business URLs. Search-result pages (category, location, buy/rent, archive, English, or a /pN/ start page) are paginated forward; listing URLs are scraped directly; a project page scrapes the detail page of each listing it links (skipped with a warning when Fetch full detail pages is off), and an agency (makelaar) profile follows the agency's own all-listings page. With several URLs, Max items is split evenly across them. Broker directories and id-only /object-/ links are skipped with a warning. The search-mode filter fields above are ignored here, because they are only sent to the Funda in Business search form. The filter in the next section still applies to a pasted search-result URL. |
highlightedboolean | Return only featured (highlighted) listings. This filter applies in BOTH search mode and URL mode: Funda in Business has no server-side option for it, so the run drops non-featured cards from every result page it walks, including a search-result URL you pasted. A pasted single-listing URL is scraped directly and is never dropped by this filter. |
languagestring | Language of the listing pages (nl or en). |
fetchDetailsboolean | Include the full description, all characteristics, coordinates, all images, and the agent phone for each listing. Adds one request per listing. |
includeAgencyDetailsboolean | Enrich each listing's agency with contact details, address, ratings and reviews from its profile page. Profiles are fetched once and reused across listings. |
maxItemsinteger | Maximum listings to return across the whole run. The single cap: set 0 for unlimited. |
maxPagesinteger | Safety ceiling on result pages walked per search. Leave at 0: the run stops at Max items, and a hard cap of 200 pages per search applies in code (values above 1000 are clamped to 1000). |
resumeFromRunIdstring | Paste a previous run ID or dataset ID to continue a large crawl of listings without returning or charging for listings already collected there. Use this after an interrupted run, or when continuing a large search in another run. For recurring daily monitoring of the same search, use Incremental mode below instead. |
incrementalModeboolean | Turn this on for daily or recurring monitoring. The first run returns all matching listings as NEW. Later runs normally return only NEW, UPDATED, and REAPPEARED listings. Turn on "Emit unchanged" or "Emit expired" only when you also want those listings returned (and billed). State is kept separately for each mode/location/URL and filter setup; use State key when you want to name or deliberately share a monitoring campaign. Compared: every output field (price, status, location, property and detail data and so on); a change makes the row UPDATED and changedFields names the top-level groups that moved. Excluded: scrape time and the listing's position and page number in the results, plus anything you list under Ignore fields below (all stay in the output). To continue one specific interrupted run instead, use Resume from a previous run above. |
stateKeystring | Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the mode/location/URL and filter settings -- different searches then never mix state with each other. |
emitUnchangedboolean | Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns -- and bills -- extra rows you already have, so leave it off unless you specifically want the full snapshot every run. |
emitExpiredboolean | Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search -- not when Max items capped it or when Resume was used. This returns -- and bills -- extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Incremental mode only. Field names (or dotted paths such as entity.status or pricing.price) whose changes should NOT turn a listing into UPDATED. The fields stay in the output; they are just left out of the comparison and out of changedFields. The scrape timestamp and the listing's position and page number in the result list are always ignored. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify then Settings then API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write. Leave empty to skip; never changes the dataset output. Supported: Notion, Linear, Airtable, Apify. |
notionParentPageUrlstring | URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
record_idIDentity.titleTitlechangeTypeChange type (incremental mode) (text)listing.deal_typeDealproperty.property_typeTypepricing.price_textPriceproperty.floor_areaArea m2property.energy_labelEnergylocation.cityCitylocation.latitudeLatlocation.longitudeLngrelationships.agency.nameAgencyShow 19 more fields
relationships.agency.phoneAgency phoneentity.urlURLchangedFieldsChanged fields (incremental mode) (array)firstSeenAtFirst seen (incremental mode) (date)lastSeenAtLast seen (incremental mode) (date)entity.descriptionDescriptionproperty.featuresFeaturesproperty.usage_typesUsageproperty.construction_yearBuiltmedia.image_countPhotosmedia.main_image_urlMain photoavailability.statusAvailabilityavailability.available_fromAvailable fromrelationships.agency.emailEmailrelationships.agency.websiteWebsiterelationships.agency.addressAddressrelationships.agency.employee_countEmployeesrelationships.agency.reviewsReviewsrelationships.agency.urlAgency URLExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"record_type": "property_listing",
"record_id": "00000001",
"source_context": {
"source_domain": "fundainbusiness.nl",
"source_url": "https://www.fundainbusiness.nl/kantoor/amsterdam/object-00000001-sample-street-1/",
"enrichment_status": "enriched",
"page_number": 1,
"position": 1,
"scraped_at": "2026-01-01T00:00:00+00:00",
"language": "nl",
"country": "NL"
},
"entity": {
"title": "Sample Street 1, Amsterdam",
"description": "Full listing description appears here when Fetch full detail pages is on.",
"url": "https://www.fundainbusiness.nl/kantoor/amsterdam/object-00000001-sample-street-1/",
"category": "Office"
},
"listing": {
"deal_type": "rent",
"offer_type": "rent",
"is_featured": false,
"source_category": "Kantoor",
"available_from": "Per direct beschikbaar"
},
"pricing": {
"price": 3250,
"currency": "EUR",
"price_text": "EUR 3.250 /mnd"
},
"location": {
"city": "Amsterdam",
"region": "Noord-Holland",
"latitude": 52,
"longitude": 4
},
"property": {
"property_type": "office",
"floor_area": 98,
"energy_label": "A",
"construction_year": "2020"
},
"media": {
"image_count": 6,
"image_urls": [
"https://cloud.funda.nl/valentina_media/000/000/000_1440x960.jpg"
]
},
"relationships": {
"agency": {
"name": "Sample Brokers",
"url": "https://www.fundainbusiness.nl/makelaar/0000-sample-brokers/",
"phone": "+310000000000",
"email": "agent@example.com",
"reviews": {
"total": 2,
"average_score": 8.6,
"formatted_average_score": "8,6"
}
}
}
}Ways to use this data
- Commercial brokers and agencies: track competing listings and new inventory across Dutch cities to spot pricing and availability trends.
- Investors and asset managers: build a searchable database of office, retail, industrial and investment properties with pricing, area and location for deal sourcing.
- Market research and PropTech: monitor supply, energy labels and construction periods across the commercial market for reports and models.
- Lead generation: collect listing agent and agency contact details, plus agency ratings, for outreach.
- Recurring monitoring: schedule the actor with Incremental mode to catch only new and updated listings in a target market without re-downloading everything each run.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Funda in Business Scraper return?
The documented output for Funda in Business Scraper includes id, title, change type (incremental mode), deal, type, price, area m2 and energy. Availability of each field depends on the source page and the selected mode.
How much does Funda in Business Scraper cost?
It costs $1.80 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed listings on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental changes for scheduled runs. Each run then returns only new and updated listings by default, and unchanged ones are not billed.
What is the difference between Resume and Incremental mode?
Resume from a previous run continues one specific interrupted crawl from a pasted run or dataset ID and never repeats what that run already collected. Incremental changes for scheduled runs is for running the same search again and again, for example daily, without pasting anything: the actor remembers the previous run itself and returns only what changed. Use Resume after an interruption, and Incremental mode for ongoing monitoring.
Why did my run fail instead of returning an empty dataset?
If every page fetch for a search was rejected, the run stops with a clear message instead of quietly returning zero listings, so "no listings match this search" is never confused with "nothing could be read." Run it again in a few minutes. In URL mode, a pasted listing URL that comes back as a clean 404 is treated as a normal outcome, the listing was removed or sold, not a failure; only fetches that exhaust every retry count toward that failure message.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push listing summaries into Notion, Linear or Airtable.
