Immoweb.be Scraper - Properties, Prices & 70+ Fields avatar

Immoweb.be Scraper - Properties, Prices & 70+ Fields

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Immoweb.be Scraper - Properties, Prices & 70+ Fields

Immoweb.be Scraper - Properties, Prices & 70+ Fields

From $1/1K. Extract property listings from immoweb.be. Get price, location, coordinates, images, and 27 structured fields per listing. Enable detail page fetching for 70+ additional fields, including description, EPC score, building details, energy features, and agent contact.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

1

Bookmarked

12

Total users

2

Monthly active users

8 days ago

Last modified

Share

Immoweb Scraper: Belgian Property Listings, Prices & Agent Details

Immoweb Scraper turns Immoweb into structured Belgian real estate data. Search by filters (transaction type, location, price, bedrooms, area, building condition, EPC grade, amenities) or paste immoweb.be search result URLs directly, and get 20+ core fields per listing: price, full address, coordinates and photos. Switch on detail pages for 70+ additional fields, including description, EPC score, building details, energy features and agent contact. Export to JSON, CSV or Excel, or pull results through the API. Incremental mode tracks a recurring search and returns only what changed.

Why This Scraper?

  • Two ways to search. Fill in filter fields (transaction type, property type, postal codes, price, bedrooms, area, building condition, EPC grade, amenities) or paste immoweb.be search URLs you already refined in your browser.
  • Every property type and transaction. Houses, apartments, land, parking, offices, industry, commercial, apartment blocks, garages and new-build projects, for sale or for rent.
  • Full Belgian location data. Street, number, postal code, locality, district, province, region and coordinates on every listing.
  • Optional deep enrichment. Turn on detail pages for 70+ extra fields per listing (description, EPC score, building and energy details, agent contact, amenities), only when you need them.
  • Built for monitoring. Incremental mode returns only new and changed listings on a recurring search, and a resume option continues an interrupted run instead of re-collecting what you already have.
  • Automatic pagination and deduplication. The walk stops on its own once results run out, and no listing is returned twice across pages or URLs.

Use Cases

  • Property portals and aggregators: mirror fresh Belgian listings by postal code, region or property type.
  • Investors and analysts: track price per square meter, building condition and EPC ratings across a market segment.
  • Agencies and lead generation: collect agent and agency contact details from active listings.
  • Market monitoring: schedule a recurring search and get only new, updated and expired listings with incremental mode.
  • Real estate research: build historical datasets of prices, locations and property attributes.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id12345678
url"https://www.immoweb.be/en/classified/12345678"
title"Charming villa with garden"
transactionType"FOR_SALE"
propertyType"HOUSE"
propertySubtype"VILLA"
price425000
displayPrice"€425,000"
price_per_sqm2125
bedrooms / rooms4 / 7
livingArea200
landArea850
street / number"Rue de la Gare" / "15"
postalCode"1000"
locality / district"Bruxelles" / "Brussels"
province / region"Brussels" / "Brussels"
latitude / longitude50.8503 / 4.3517
images / imageCountarray of photo URLs / 12
salePrice425000
lastModified"2026-04-15T10:30:00.000Z"
customerName"Example Agency"

With Fetch Detail Pages on, each listing also carries description (English), descriptionFr and descriptionNl, building details (building_constructionYear, building_condition, building_facadeCount, building_floorCount), energy fields (epcScore, energy_heatingType, energy_hasHeatPump, energy_hasPhotovoltaicPanels, energy_hasDoubleGlazing), interior counts (bathrooms, toiletCount, showerRoomCount, kitchen_type), garden and terrace details (gardenSurface, terraceSurface, hasGarden, hasTerrace, hasSwimmingPool), amenities (hasLift, hasAirConditioning, hasJacuzzi, hasSauna, hasWorkspace, hasDisabledAccess), transaction details (sale_cadastralIncome, availabilityPeriod, sale_isSubjectToVat), agent fields (agencyName, agencyId, agencyPhone, agencyEmail, customerType), status flags (flag_isNewlyBuilt, flag_isPublicSale, flag_isSoldOrRented), view and bookmark counters (stat_viewCount, stat_bookmarkCount), publication dates (publication_creationDate, publication_expirationDate), rental terms as rental_* fields on rentals, and permit and land fields such as permit_floodZoneType, permit_hasPlotDivisionAuthorization and land_latestUseDesignation where Immoweb provides them. Which fields appear depends on the property type, since the actor flattens whatever Immoweb's own detail page returns for that listing (nested sections keep a prefix such as building_, energy_, sale_, rental_, flag_). In Incremental mode, every returned record also carries changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt.

How to Use

  1. Pick a mode: Search mode (use the filter fields) or URL mode (paste one or more immoweb.be search result URLs already filtered in your browser).
  2. In Search mode, set Transaction Type, Property Types, Postal Codes, and any of the price, bedroom, area, building condition, EPC grade or amenity filters you need.
  3. Turn on Fetch Detail Pages if you want the 70+ extra fields per listing; leave it off for search result data only.
  4. Set Maximum Listings (and, optionally, Maximum Pages per URL) to control run size and cost, then click Start.

Search Brussels houses for sale:

{
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["house"],
"postalCodes": ["1000"],
"maxItems": 20
}

Search with price, amenity and EPC filters, enriched:

{
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["apartment"],
"priceMax": 350000,
"bedroomsMin": 2,
"hasTerrace": true,
"epcGradeMax": "C",
"fetchDetails": true,
"maxItems": 50
}

Paste a search URL directly:

{
"mode": "url",
"urls": [
"https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&page=1&orderBy=newest"
],
"maxItems": 100
}

Recurring monitoring of a rental search:

{
"mode": "search",
"transactionType": "for-rent",
"propertyTypes": ["apartment"],
"postalCodes": ["2000"],
"incrementalMode": true,
"stateKey": "antwerp-rentals",
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/immoweb-scraper").call(run_input={
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["house"],
"postalCodes": ["1000"],
"maxItems": 20,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing.get("title"), listing.get("displayPrice"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/immoweb-scraper').call({
mode: 'search',
transactionType: 'for-sale',
propertyTypes: ['house'],
postalCodes: ['1000'],
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Pagination and limits

Both modes forward-walk search result pages (about 30 listings each) until one of three things happens: Maximum Listings is reached, Immoweb's own reported total for that search is reached, or a page returns no new listings. Maximum Pages per URL is an optional extra safety bound on top of that; leave it empty to let the walk run its course.

Resume and recurring updates

  • Resume from a previous run (resumeFromRunId): paste a previous run id or dataset id from this account to collect only the listings that run doesn't already have. Combine both runs' datasets for the full set. Long runs also checkpoint their own progress, so a platform migration or a Resurrect of a failed run picks up where it left off instead of starting over.
  • Incremental mode (incrementalMode): for scheduling this actor on the SAME search repeatedly. The first run returns everything as NEW. Later runs compare against the stored state and mark each listing NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), or EXPIRED (only once a run has proven it scanned the whole tracked search to completion, and only with emitExpired on). REAPPEARED only appears for a listing that was previously marked EXPIRED that way and is then found again in a later run, so it needs at least one prior complete scan with emitExpired on before it can ever show up. stateKey names or shares a monitoring baseline; leave it empty and one is derived from your search filters automatically. With incremental mode off, the output is exactly as before.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each listing, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (use filter fields) or url (paste immoweb.be search result URLs).
transactionTypestringfor-salefor-sale or for-rent. Search mode only.
propertyTypesarraynone (houses and apartments)House, apartment, house or apartment, land, parking, office, industry, commercial, apartment block, garage, or new-build houses/apartments. Leave empty to search houses and apartments; select other types explicitly.
postalCodesarraynone (all of Belgium)Belgian 4-digit postal codes to search in.
countriesarray["BE"]Countries to include; Immoweb also lists properties in neighboring regions.
orderBystringnewestrelevance, newest, cheapest, most-expensive, or postal-code.
priceMinintegernoneMinimum property price in EUR.
priceMaxintegernoneMaximum property price in EUR.
bedroomsMinintegernoneMinimum number of bedrooms.
bedroomsMaxintegernoneMaximum number of bedrooms.
livingAreaMinintegernoneMinimum living area in m².
livingAreaMaxintegernoneMaximum living area in m².
landAreaMinintegernoneMinimum land area in m² (mainly houses and land).
landAreaMaxintegernoneMaximum land area in m².
constructionYearMinintegernoneFilter out buildings older than this year.
buildingConditionsarraynoneAs new, just renovated, good, to be done up, to renovate, or to restore.
epcGradeMaxstringnoneOnly listings at or better than this EPC grade (A++ to G).
hasGardenbooleanfalseOnly listings with a garden.
hasTerracebooleanfalseOnly listings with a terrace.
hasSwimmingPoolbooleanfalseOnly listings with a swimming pool.
newBuildsOnlybooleanfalseOnly new-build projects.
urlsarraynone (prefill: one example immoweb.be search URL)Search result page URLs (URL mode). The page query param sets the starting page; the walk paginates forward from there.
fetchDetailsbooleanfalseFetch each listing's detail page for 70+ extra fields (description, EPC score, building details, energy features, agent contact). Billed per listing enriched.
maxItemsinteger20Stop after scraping this many listings (0 = unlimited).
maxPagesPerUrlintegernone (walk every page)Optional safety bound on how many search result pages to walk forward per URL (about 30 listings each).
resumeFromRunIdstringnoneRun id or dataset id from this account; continues ONE interrupted run by skipping listings already collected there.
incrementalModebooleanfalseTrack this search across scheduled runs and classify each listing as NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED.
stateKeystringnone (auto-derived from filters or URLs)Name this monitoring campaign, or share one baseline across runs, for Incremental mode.
emitUnchangedbooleanfalseAlso return (and bill) listings that did not change. Incremental mode only.
emitExpiredbooleanfalseAlso return, once, listings that disappeared, but only after a run proves it scanned the whole tracked search. Incremental mode only.
proxyConfigurationobjectApify Proxy, Residential groupConnection settings. This actor requires Apify residential proxy access to reach immoweb.be reliably.
mcpConnectorsarraynoneOptional: send a summary of each listing to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"id": 12345678,
"url": "https://www.immoweb.be/en/classified/12345678",
"title": "Charming villa with garden",
"transactionType": "FOR_SALE",
"propertyType": "HOUSE",
"propertySubtype": "VILLA",
"price": 425000,
"displayPrice": "€425,000",
"price_per_sqm": 2125,
"bedrooms": 4,
"rooms": 7,
"livingArea": 200,
"landArea": 850,
"street": "Rue de la Gare",
"number": "15",
"postalCode": "1000",
"locality": "Bruxelles",
"district": "Brussels",
"province": "Brussels",
"region": "Brussels",
"regionCode": "BRUSSELS",
"country": "Belgium",
"latitude": 50.8503,
"longitude": 4.3517,
"images": [
"https://media-resize.immowebstatic.be/classifieds/example/736x736/image1.jpg",
"https://media-resize.immowebstatic.be/classifieds/example/736x736/image2.jpg"
],
"imageCount": 12,
"lastModified": "2026-04-15T10:30:00.000Z",
"customerName": "Example Agency"
}

Plan Requirement

This actor requires Apify's residential proxy access to reach immoweb.be reliably; pick the Residential group under Connection. Without it, a run can fail to connect and finish with no listings and a warning in the run log. The Pricing tab shows the current rate for the detail-page enrichment event, which is the only per-listing charge this actor defines; use Maximum Listings to cap the size of any run.

FAQ

How much does it cost?

This actor bills a per-listing charge only for the optional detail-page enrichment: one unit for every listing whose detail page is actually fetched and parsed. The Pricing tab shows the current rate. Use Maximum Listings to cap the size of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow Immoweb's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts like price, size and address are generally not protected, but photos and full descriptions may be subject to third-party rights.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab on the SAME search and turn on Incremental mode. The first run returns everything as NEW; later runs return only NEW, UPDATED and, once a prior run has tombstoned a listing as EXPIRED, REAPPEARED listings. Unchanged listings are not billed unless you turn Emit unchanged listings on.

Why do I see EXPIRED listings sometimes but never REAPPEARED ones?

EXPIRED only fires when Emit expired listings is on AND a run proves it scanned the whole tracked search to completion, never on a run capped by Maximum Listings, a resumed run, or one that hit a block partway through. REAPPEARED then only shows up for a listing that was marked EXPIRED that way and is later found again. If you have never turned Emit expired listings on, REAPPEARED can never appear, because nothing has been marked gone yet.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues ONE specific interrupted run by its id, skipping listings that run already collected, for a one-off continuation. Incremental mode is for running the SAME search repeatedly on a schedule; it remembers its own baseline and classifies every listing against the previous run. Combining resumeFromRunId with Incremental mode is only allowed to bootstrap a brand-new monitoring baseline; it is rejected if that search already has saved state.

Why did my run fail instead of returning an empty dataset?

A run is only marked failed for a bad input, such as a resumeFromRunId that doesn't resolve to a run or dataset you can read, or combining it with Incremental mode on a search that already has saved state. If a connection to immoweb.be can't be established at all (for example, no residential proxy access on your account), the run finishes normally with an empty dataset and a warning in the run log rather than being marked failed, so check the log if a run returns nothing.

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 a summary of each listing into Notion, Linear or Airtable.

🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

🏠 Real Estate AU
Extract detailed Australian real estate property listings with 30+ structured fields...
🏠 Realtor.ca
From $1/1K. Scrape Realtor.ca property listings with prices, descriptions, images, agent...
🏠 Immowelt.de Scraper
Scrape detailed property listings from Immowelt.de into clean structured data. Extract...
🏠 Zumper
Scrape Zumper.com rental listings: apartments, houses, condos and rooms. Pulls 60+ fields...
🏠 Real Estate AU Agents Scraper
Scrape Australian real estate agent and agency profiles by suburb or profile URLs...
🏠 ImmobilienScout24.de Scraper
$0.9💰/1K for Gold discount. Extract property listings from immobilienscout24.de...

👉 Browse all abotapi scrapers

💬 Support & custom scrapers

  • 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • 🛠️ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • ⭐ Enjoying it? A quick review on the actor page helps other users find it.