Immoweb.be Belgium Property Scraper
Pricing
from $3.00 / 1,000 results
Immoweb.be Belgium Property Scraper
Scrape property listings from Immoweb.be — Belgium's #1 real estate platform with 200K+ listings. Extract price, EPC energy score, rooms, location, agency info for sale and rent across Flanders, Wallonia and Brussels.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Immoweb.be Belgium Property Scraper — Brussels, Flanders & Wallonia Real Estate Data Extractor
The most complete Immoweb.be data extraction tool on Apify. Pull structured for-sale and for-rent property listings from Belgium's #1 real estate portal — price, EPC energy rating, bedrooms, bathrooms, living area, location, agency contacts and 70+ deep-detail fields — ready for investor analytics, EU expat relocation tooling, prop-tech apps, valuer comps, mortgage broker intel and energy-transition research across Brussels, Flanders and Wallonia.
What This Actor Does
The Immoweb.be Belgium Property Scraper is a production-ready Apify Actor that extracts structured real estate listings from Immoweb.be — Belgium's largest property portal with 200,000+ active for-sale and for-rent listings spanning the Brussels-Capital Region, Flanders (Vlaanderen) and Wallonia (Wallonie).
In a single run the actor returns a clean JSON dataset covering every listing surfaced by an Immoweb search URL or filter combination you pass in. Optionally enable detail-page enrichment to pull deep fields like EPC energy score, heating type, build year, flood-zone flag, full multilingual description and agency contact info — the kind of data that powers serious analytics, not just lead lists.
The actor returns the following entity types from Immoweb:
- Houses — detached, semi-detached, terraced, villas, manor houses, farmhouses, bungalows
- Apartments — flats, penthouses, duplexes, studios, lofts, ground-floor units with garden
- Land — building plots (terrain à bâtir / bouwgrond) across Flemish and Walloon municipalities
- Office space — leasable and for-sale commercial offices, primarily in Brussels and Antwerpen
- Commercial premises — retail units, warehouses, mixed-use buildings
- Garages & parking — covered, lock-up and street parking spaces (popular in Brussels EU quarter)
Each record includes a normalized listingId, transaction type (for-sale / for-rent), price in EUR, bedroom and bathroom counts, living area in m², postcode, city, province, region (auto-derived from postcode), latitude/longitude, EPC score (A++ to G) and kWh/m²/year value, agency contact block and the canonical Immoweb URL — the fastest way to populate or refresh a Belgian property dataset for investor underwriting, expat relocation tools, prop-tech back-ends, mortgage broker intelligence, valuer comparables and Brussels EU-institution housing research.
Why scrape Immoweb yourself when this exists?
Immoweb is one of the harder European real-estate sites to scrape reliably. Most teams attempt a custom scraper and hit the same brick wall within hours:
- Cloudflare bot protection — naïve
requests/axioscalls return 403 within the first dozen requests - Datacenter IPs are blocked outright — AWS, GCP, DigitalOcean and Hetzner ranges are pre-banned; you need a Belgian residential proxy to look like a normal Brussels household
- JavaScript-rendered listings — Immoweb embeds the structured listing payload in
window.classifiedand__NEXT_DATA__blobs that only materialize after JS execution - Trilingual URL paths —
/en/,/fr/and/nl/route to the same listing with different description strings; you have to canonicalize - Postcode-to-region mapping — Immoweb returns 4-digit postcodes but no normalized region/province; you have to manually map
1000-1299 → Brussels,2000-2999 → Antwerp,9000-9999 → East Flanders, etc. - EPC scores live deep on the detail page — the search index returns price and beds but not the energy certificate, which is exactly the field European buyers care about most in 2026
- Schema drift — Immoweb has refactored its Next.js payload structure multiple times since 2022; XPath selectors break overnight
- Rate-limit walls — too-fast pagination triggers a 429 cool-down that lasts hours per IP
- Headless detection — Playwright with default settings is flagged immediately; you need stealth patches (webdriver flag, plugins array, languages, Chrome runtime, permissions API) plus a
Europe/Brusselstimezone and Belgian locale to look human
This actor solves all of that out of the box: Playwright + Belgian residential proxy + structured-JSON extraction + automatic region/province enrichment + retry logic + pagination control — no DOM scraping, no Cloudflare wrestling, no postcode lookup tables to maintain.
Quick Start
One-Click Run
- Click "Try for free" on the Apify Store page
- Paste an Immoweb search URL (or leave the prefilled Belgium-wide houses+apartments for-sale search)
- Optionally enable Scrape Detail Pages for full EPC and agency data
- Hit Start — your dataset streams into the Apify console; download as JSON, CSV, Excel, or HTML
API Run (Python)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/immoweb-scraper").call(run_input={"startUrls": [{"url": "https://www.immoweb.be/en/search/apartment/for-rent/brussels/district?countries=BE&page=1"}],"scrapeDetails": True,"maxListings": 200,"maxPages": 7,"language": "en","proxyConfiguration": {"useApifyProxy": True,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "BE"}})for listing in client.dataset(run["defaultDatasetId"]).iterate_items():print(listing["listingId"], listing["price"], listing["epcScore"], listing["city"])
API Run (Node.js / TypeScript)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/immoweb-scraper').call({propertyType: 'house',transactionType: 'for-sale',location: 'ghent/city',language: 'nl',minPrice: 250000,maxPrice: 600000,minBedrooms: 3,scrapeDetails: true,maxListings: 100,maxPages: 5});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Got ${items.length} Ghent houses between €250k and €600k`);
API Run (cURL)
curl -X POST "https://api.apify.com/v2/acts/haketa~immoweb-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"propertyType": "apartment","transactionType": "for-rent","location": "antwerpen/province","minPrice": 800,"maxPrice": 1800,"minBedrooms": 2,"scrapeDetails": false,"maxListings": 150,"maxPages": 5}'
How It Works
Immoweb is a Next.js single-page application sitting behind Cloudflare Bot Management. Pure HTTP scraping is impossible from datacenter ranges — this actor uses a two-stage hybrid pipeline:
| Stage | Engine | Purpose | Notes |
|---|---|---|---|
| 1. Search listing index | got-scraping with rotating Belgian residential IPs + browser-like header generation | Fast pagination through /{lang}/search/{type}/{tx}?page=N | Falls back to Playwright if 403 |
| 2. Detail enrichment (optional) | Playwright (real Chromium) with stealth patches | Parse window.classified + __NEXT_DATA__ for 70+ fields | Only runs when scrapeDetails: true |
Source URL patterns
| Pattern | Example | Used For |
|---|---|---|
| Search index | https://www.immoweb.be/en/search/house-and-apartment/for-sale?countries=BE&page=1 | List view, ~30 listings per page |
| Locality search | https://www.immoweb.be/en/search/apartment/for-rent/brussels/district?countries=BE | Filter to a city/province/district |
| Classified detail | https://www.immoweb.be/en/classified/house/for-sale/etterbeek/1040/12345678 | Single-listing deep page |
| Next.js data | window.__NEXT_DATA__ and window.classified JSON blobs | Structured payload extraction |
Engineering details
- Belgian residential proxy — Apify Proxy with
apifyProxyGroups: ["RESIDENTIAL"]andapifyProxyCountry: "BE"is required; datacenter IPs return Cloudflare 403 within seconds - Stealth Playwright — patches
navigator.webdriver,navigator.plugins,navigator.languages,window.chrome.runtime, and the permissions API; setsEurope/Brusselstimezone anden-GB/fr-BE/nl-BElocale - Structured JSON extraction — the actor reads
window.classifiedfirst, then falls back to__NEXT_DATA__.props.pageProps, then to JSON-LD as a last resort — far more reliable than DOM selectors - Postcode → region mapping — built-in lookup converts Belgian 4-digit postcodes into Region (
Brussels/Flanders/Wallonia) and Province (Antwerp,East Flanders,Liège,Hainaut,Namur,Luxembourg,Limburg,Walloon Brabant,Flemish Brabant,West Flanders,Brussels) - Trilingual safe — pick
en/fr/nl; listing descriptions and agency text return in the chosen language - Pagination control —
maxPagescaps depth;maxListingscaps total volume so a Belgium-wide query doesn't accidentally run for hours - Deduplication — internal
seenIdsset ensures a listing surfaced twice (e.g. across overlapping searches) is only stored once - Configurable politeness —
requestDelaybetween page loads defaults to 2000 ms; tune it for your proxy pool budget - Auto retry on 403/429 — six HTTP attempts and three browser attempts with exponential jitter before giving up
Input Parameters
{"startUrls": [{ "url": "https://www.immoweb.be/en/search/house-and-apartment/for-sale?countries=BE&page=1&orderBy=relevance" }],"propertyType": "house-and-apartment","transactionType": "for-sale","location": "","language": "en","minPrice": 0,"maxPrice": 0,"minBedrooms": 0,"scrapeDetails": false,"maxListings": 50,"maxPages": 3,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "BE"},"requestDelay": 2000}
Parameter reference
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array<object> | one Belgium-wide search | Paste any Immoweb search URL (https://www.immoweb.be/...). When supplied, overrides propertyType / transactionType / location filters. Best way to replicate a search you've already built in the Immoweb UI. |
propertyType | string | house-and-apartment | Filter category. One of house-and-apartment, house, apartment, land, office, commercial, garage. |
transactionType | string | for-sale | for-sale or for-rent. |
location | string | "" (all Belgium) | City, district or province slug as it appears in the Immoweb URL path. Examples: brussels/district, antwerpen/province, ghent/city, liege/city, bruges/city, namur/city, hasselt/city, etterbeek/municipality. Leave empty for nationwide. |
language | string | en | Site language: en (English), fr (Français), nl (Nederlands). Affects listing descriptions and agency content. |
minPrice | integer | 0 | Minimum price in EUR. 0 disables the floor. |
maxPrice | integer | 0 | Maximum price in EUR. 0 disables the ceiling. |
minBedrooms | integer | 0 | Minimum bedroom count. 0 disables. |
scrapeDetails | boolean | false | Strongly recommended for analytics use. When false (the fast default) the actor only returns search-card fields — listingId, propertyType, price (~60 % populated, the rest are "Contact agent"), postcode, city, region, listingUrl. Bedroom/bathroom counts, living area, EPC score, heating type, build year, agency contact info, descriptions and images are not in the search index and stay null. Set true to fetch each listing's detail page and harvest those 20+ extra fields. Costs an extra ~3 s per listing. |
maxListings | integer | 50 | Hard cap on total listings returned. 0 for unlimited. |
maxPages | integer | 3 | Maximum search result pages to walk. Each page returns ~30 listings. 0 for unlimited. |
proxyConfiguration | object | Apify Residential BE | Required. Belgian residential proxy is needed because Immoweb's Cloudflare layer blocks datacenter IPs. Defaults are sensible — leave as-is unless you bring your own residential pool. |
requestDelay | integer (ms) | 2000 | Milliseconds to wait between page navigations. Lower = faster but higher risk of triggering Cloudflare cooldown. |
💡 Tip — search vs detail mode tradeoff
The default
scrapeDetails: falseis fast and cheap — a 200-listing Belgium-wide run completes in ~60 seconds and costs roughly $0.01 of compute — but you only get the ~10 fields that Immoweb embeds in its search-result cards. Most analytics use cases (rent comp, EPC research, agency intel, lender risk modelling) need the detail-page fields. SetscrapeDetails: truewhenever you want bedrooms / bathrooms / living area / EPC / heating type / build year / agency name / phone / email / images / description / view & bookmark counts. The detail crawl is per-listing and uses Playwright; budget ~3 s extra per item plus the per-result pricing.Quick guide:
- Inventory snapshot / price-only trend →
scrapeDetails: false(fast + cheap)- Comp pricing with beds/baths/area →
scrapeDetails: true- EPC / energy-transition research →
scrapeDetails: true(EPC is detail-page only)- Agency / lead-gen →
scrapeDetails: true(phone, email, website are detail-page only)
Output Schema
Every record uses the same flat JSON shape regardless of whether the source listing is a house, apartment, garage or commercial unit — making it trivial to load the dataset into Postgres, BigQuery or a downstream Pandas pipeline without per-type branching.
Core listing fields
| Field | Type | Description |
|---|---|---|
listingId | string | Immoweb internal classified ID (e.g. 12345678) — stable across requests |
listingType | string | for-sale or for-rent |
propertyType | string | house, apartment, land, office, commercial, garage, etc. |
title | string | Listing title as displayed on Immoweb |
price | number | Asking price (sale) or monthly rent (rent) in EUR |
currency | string | Always EUR |
bedrooms | integer | Bedroom count |
bathrooms | integer | Bathroom count |
livingArea | number | Habitable surface in m² |
landSurface | number | Plot / land surface in m² (where applicable) |
Location fields
| Field | Type | Description |
|---|---|---|
postcode | string | 4-digit Belgian postcode (e.g. 1000, 1040, 2000, 9000) |
city | string | Locality name (e.g. Brussels, Etterbeek, Antwerpen, Gent, Liège) |
province | string | One of the ten Belgian provinces, derived from postcode |
region | string | Brussels, Flanders, or Wallonia |
latitude | number | Decimal latitude (when Immoweb publishes it) |
longitude | number | Decimal longitude (when Immoweb publishes it) |
Energy & building fields (detail page only — set scrapeDetails: true)
| Field | Type | Description |
|---|---|---|
epcScore | string | EPC energy certificate letter A++, A+, A, B, C, D, E, F, G |
epcValue | number | Energy consumption in kWh/m²/year |
heatingType | string | gas, fuel-oil, electric, heat-pump, pellet, solar |
buildYear | integer | Construction year |
condition | string | as-new, good, to-renovate, to-restore, just-renovated |
facade | integer | Number of façades (2, 3, 4) — Belgian classification quirk |
floodZone | boolean | Whether the property is in a designated flood-risk zone |
Agency & engagement fields
| Field | Type | Description |
|---|---|---|
description | string | Full listing description in the requested language |
agencyName | string | Listing agency / agent name |
agencyPhone | string | Contact phone (detail page only) |
agencyEmail | string | Contact email (detail page only) |
agencyWebsite | string | Agency homepage URL |
viewCount | integer | Immoweb view counter (detail page only) |
bookmarkCount | integer | Number of users who bookmarked the listing |
daysOnMarket | integer | Days since the listing was first published |
images | array<string> | Array of high-resolution image URLs |
listingUrl | string | Canonical Immoweb URL |
searchUrl | string | Source search URL that surfaced this listing |
scrapedAt | string | ISO-8601 UTC timestamp |
Example: Brussels EU-quarter apartment for rent
{"listingId": "11234567","listingType": "for-rent","propertyType": "apartment","title": "Bright 2-bedroom apartment, Square Ambiorix","price": 1650,"currency": "EUR","bedrooms": 2,"bathrooms": 1,"livingArea": 95,"landSurface": null,"postcode": "1000","city": "Brussels","province": "Brussels","region": "Brussels","latitude": 50.8466,"longitude": 4.3796,"epcScore": "C","epcValue": 198,"heatingType": "gas","buildYear": 1925,"condition": "good","facade": 2,"floodZone": false,"description": "Charming Art Nouveau apartment a 7-minute walk from Schuman, the EU Commission and EEAS...","agencyName": "Engel & Völkers Brussels","agencyPhone": "+32 2 640 08 01","agencyEmail": "brussels@engelvoelkers.com","agencyWebsite": "https://www.engelvoelkers.com/en-be/brussels","viewCount": 412,"bookmarkCount": 17,"daysOnMarket": 9,"images": ["https://media.immoweb.be/uploads/11234567/0.jpg","https://media.immoweb.be/uploads/11234567/1.jpg"],"listingUrl": "https://www.immoweb.be/en/classified/apartment/for-rent/brussels/1000/11234567","searchUrl": "https://www.immoweb.be/en/search/apartment/for-rent/brussels/district?countries=BE&page=1","scrapedAt": "2026-05-16T08:14:22.318Z"}
Example: Ghent townhouse for sale
{"listingId": "12876543","listingType": "for-sale","propertyType": "house","title": "Renovated 4-bedroom townhouse near Sint-Pieters","price": 495000,"currency": "EUR","bedrooms": 4,"bathrooms": 2,"livingArea": 215,"landSurface": 145,"postcode": "9000","city": "Gent","province": "East Flanders","region": "Flanders","epcScore": "B","epcValue": 142,"heatingType": "heat-pump","buildYear": 1932,"condition": "just-renovated","facade": 2,"floodZone": false,"agencyName": "Immo Pieters Gent","daysOnMarket": 21,"listingUrl": "https://www.immoweb.be/nl/classified/house/for-sale/gent/9000/12876543","scrapedAt": "2026-05-16T08:15:01.778Z"}
Belgian Region & Postcode Reference
Every postcode in the dataset is mapped to a region and province by an internal lookup — no extra work on your side.
| Postcode Range | Region | Province | Examples |
|---|---|---|---|
| 1000 – 1299 | Brussels | Brussels-Capital | Brussels (1000), Etterbeek (1040), Ixelles (1050), Schaerbeek (1030) |
| 1300 – 1499 | Wallonia | Walloon Brabant | Wavre (1300), Ottignies (1340), Waterloo (1410) |
| 1500 – 1999 | Flanders | Flemish Brabant | Halle (1500), Leuven (3000-area), Vilvoorde (1800) |
| 2000 – 2999 | Flanders | Antwerp | Antwerpen (2000), Mechelen (2800), Turnhout (2300) |
| 3000 – 3499 | Flanders | Flemish Brabant | Leuven (3000), Tienen (3300) |
| 3500 – 3999 | Flanders | Limburg | Hasselt (3500), Genk (3600) |
| 4000 – 4999 | Wallonia | Liège | Liège (4000), Verviers (4800), Spa (4900) |
| 5000 – 5999 | Wallonia | Namur | Namur (5000), Dinant (5500) |
| 6000 – 6599 | Wallonia | Hainaut | Charleroi (6000) |
| 6600 – 6999 | Wallonia | Luxembourg | Bastogne (6600), Arlon (6700) |
| 7000 – 7999 | Wallonia | Hainaut | Mons (7000), Tournai (7500) |
| 8000 – 8999 | Flanders | West Flanders | Brugge (8000), Oostende (8400), Kortrijk (8500) |
| 9000 – 9999 | Flanders | East Flanders | Gent (9000), Aalst (9300), Sint-Niklaas (9100) |
Property Type Reference
| Slug | Used For | Notes |
|---|---|---|
house-and-apartment | Combined residential search | Default; broadest residential coverage |
house | Houses only | Detached, semi-detached, terraced, villas, farmhouses |
apartment | Apartments only | Flats, studios, penthouses, duplexes, lofts |
land | Building land | Plots zoned for residential or mixed-use construction |
office | Office space | Brussels EU quarter, Antwerpen Eilandje, Gent business parks |
commercial | Retail & warehouses | Storefronts, mixed-use buildings, light industrial |
garage | Garages & parking | Especially relevant in Brussels & Antwerpen where parking is scarce |
EPC Energy Score Reference
Belgium's EPC (Energieprestatiecertificaat / Certificat de Performance Énergétique) is mandatory at sale and rental in all three regions. The score directly affects buyer demand, mortgage approval, and — in Flanders — legally enforced renovation deadlines.
| EPC Score | kWh/m²/year (approx) | Meaning | Market Impact |
|---|---|---|---|
A++ | ≤ 0 | Energy-positive (NZEB+) | Premium pricing, no renovation pressure |
A+ | 0 – 100 | Highly efficient | Strongest resale value |
A | 100 – 200 | Efficient | Within EU 2030 target band |
B | 200 – 300 | Good | Acceptable for most buyers and lenders |
C | 300 – 400 | Average | Typical Brussels/Antwerpen 1920s-1970s stock |
D | 400 – 500 | Below average | Renovation discussions become routine |
E | 500 – 600 | Poor | Flanders: 5-year renovation obligation post-sale |
F | 600 – 700 | Very poor | Substantial buyer discount expected |
G | > 700 | Worst | Subject to strict renovation rules; large discount baked in |
Use Cases
Real Estate Investment & Buy-to-Let Analytics
Investors and small funds use this dataset to:
- Benchmark gross rental yields across Brussels, Antwerpen and Ghent submarkets by joining for-sale and for-rent runs at the same postcode
- Identify under-valued postcodes by combining median €/m² per postcode with EPC distribution to spot energy-arbitrage opportunities
- Track new-listing velocity in target cities and trigger "first-look" alerts the moment a listing appears below your underwriting threshold
- Underwrite multi-asset acquisitions with up-to-date comparables, days-on-market and bedroom mix
- Run €/m² heat maps in QGIS or Kepler using the actor's latitude / longitude fields
- Compare yields across regions — Brussels (steady), Flanders (institutional flows), Wallonia (higher gross yields, lower liquidity)
EU Expat & International Relocation Tools
Relocation agents, EU institutions, NATO, embassies, NGOs and global mobility platforms use the dataset to:
- Build candidate-housing shortlists filtered by commute time to Schuman, Place du Luxembourg, NATO HQ, SHAPE Mons, or Antwerpen Diamond District
- Surface furnished short-term apartments by filtering listing descriptions for
meublé/gemeubeld/furnished - Match family-size accommodation with
minBedrooms: 3plus garden / facade filters - Show EPC scores upfront — expats relocating from Northern Europe expect heating-cost transparency
- Provide multilingual property briefs by running the same search in
en,fr, andnl - Bridge corporate housing for diplomats and EU officials with current listings refreshed on demand
Prop-Tech & PortalsConsumer Apps
Founders building Belgian-market real estate apps use this dataset as a back-end feed when the official Immoweb developer API is closed or capacity-restricted:
- Power "new listings near me" mobile push notifications by polling on a 30-minute schedule
- Build a savings calculator that estimates monthly heating cost from
epcValue × livingArea × energy tariff - Drive comparable-listing carousels on agent-facing dashboards
- Train on-platform recommendation models with rich agency, location and engagement signals
- Provide white-label widgets for mortgage brokers, notaries and law firms
Mortgage Broker & Lender Intelligence
Belgian mortgage brokers, banks and credit comparators use the dataset to:
- Pre-screen properties against lender LTV / DSCR / EPC constraints before originating a file
- Detect price reductions by re-running the same
startUrlsdaily and diffing the price field — strong signal for buyer-side negotiation - Benchmark broker pipeline against the live market in their service area
- Model post-2030 renovation costs for EPC F/G stock that lenders increasingly haircut
- Monitor agency-of-origin trends to identify high-volume agents worth a partnership conversation
Valuer & Surveyor Comparable Sales (Comps)
Sworn valuers (Vastgoedexpert / expert immobilier), surveyors and AVM providers use the dataset to:
- Pull weekly comparables within a 1 km radius for any subject property
- Adjust for EPC bracket when the subject and comparables differ by more than one letter
- Track façade-count premiums (4-facade detached houses command a clear premium over 2-facade row houses)
- Build defensible valuation memos with timestamped Immoweb evidence
Brussels EU-Institution & Diplomatic Housing Research
The EU quarter (1000, 1040, 1050, 1150, 1200) has its own micro-market. Policy researchers, EU procurement officers and think tanks use the dataset to:
- Quantify housing-cost burden on EU staff, MEPs, accredited journalists and trainees
- Map rental price evolution around Berlaymont, Schuman, Place du Luxembourg and NATO HQ
- Study the impact of EU enlargement waves on Brussels rental demand
- Provide briefings to MEPs and ECOSOC on EU-quarter affordability
Energy Transition & EPC / Climate Research
Researchers, climate NGOs, the IEA, building-renovation consultancies and the Flemish/Walloon regional governments use the EPC fields to:
- Track EPC distribution of the existing housing stock by postcode and region
- Quantify the renovation backlog — how many F/G-rated properties remain for sale in Flanders ahead of the 2030 deadline?
- Correlate EPC class with asking price to compute the "green premium" empirically
- Compare regional progress between Brussels, Flanders and Wallonia on the EU EPBD trajectory
- Inform municipal climate plans with hyperlocal renovation pipeline data
Journalism & Investigative Reporting
Belgian outlets (De Tijd, L'Echo, De Standaard, Le Soir, RTBF, VRT NWS) and data desks at international publications use this dataset to:
- Investigate Brussels rental affordability with empirical, refreshable numbers
- Map flood-zone listings along the Maas, Vesdre and Dijle to track post-2021 disclosure changes
- Quantify foreign-buyer activity in the Belgian coast (Knokke, Oostende, De Haan)
- Cover seasonal trends — student-rental cycle in Leuven, Gent, Louvain-la-Neuve
Insurance & Risk Underwriting
Property insurers and reinsurers use the dataset to:
- Score flood exposure using the
floodZoneboolean alongside latitude / longitude - Estimate replacement cost from
livingArea,buildYearandcondition - Detect new-build hotspots to forecast capacity demand for builders-risk policies
- Cross-reference EPC stock with regulatory caps on premiums for poorly insulated dwellings
Academic & Public Policy Research
Université Libre de Bruxelles, KU Leuven, UGent, UCLouvain, the Federal Planning Bureau, BNB / NBB and the EU Joint Research Centre use Immoweb data to:
- Study housing affordability along the Brussels-language frontier
- Measure spatial inequality between Flemish, Walloon and Brussels municipalities
- Analyze gentrification trajectories in neighborhoods like Saint-Gilles, Forest, Anderlecht, Molenbeek
- Track post-COVID urban-to-suburban flows at scale
Sample Queries & Recipes
Recipe 1: All for-sale apartments in central Brussels (1000) under €450k
{"propertyType": "apartment","transactionType": "for-sale","location": "brussels/district","maxPrice": 450000,"minBedrooms": 1,"scrapeDetails": true,"maxListings": 200,"maxPages": 8}
Recipe 2: Family-home rentals in Etterbeek for EU expats (full EPC data)
{"startUrls": [{ "url": "https://www.immoweb.be/en/search/house/for-rent/etterbeek/municipality?countries=BE&page=1" }],"language": "en","minBedrooms": 3,"scrapeDetails": true,"maxListings": 100,"maxPages": 4}
Recipe 3: High-EPC (A or better) properties for sale in Antwerpen province
{"propertyType": "house-and-apartment","transactionType": "for-sale","location": "antwerpen/province","language": "nl","minPrice": 350000,"scrapeDetails": true,"maxListings": 500,"maxPages": 17}
Then filter downstream:
high_efficiency = [r for r in records if r["epcScore"] in ("A", "A+", "A++")]
Recipe 4: Buy-to-let yield study in Liège (joins sale & rent)
Run twice with transactionType: "for-sale" and for-rent against the same postcode, then group by postcode and divide annualized median rent by median asking price.
{"propertyType": "apartment","transactionType": "for-sale","location": "liege/city","language": "fr","minBedrooms": 1,"maxListings": 300,"maxPages": 10}
Recipe 5: Bruges coastal & old-town listings for second-home buyers
{"propertyType": "house","transactionType": "for-sale","location": "bruges/city","language": "nl","minPrice": 400000,"scrapeDetails": true,"maxListings": 150,"maxPages": 6}
Recipe 6: Building-land plots in Walloon Brabant (for developers)
{"propertyType": "land","transactionType": "for-sale","location": "walloon-brabant/province","language": "fr","maxListings": 200,"maxPages": 8}
Recipe 7: Quick sample run — 25 mixed listings for prototyping
{"propertyType": "house-and-apartment","transactionType": "for-sale","scrapeDetails": false,"maxListings": 25,"maxPages": 1}
Integration Examples
Google Sheets (via Apify Integration)
- Schedule the actor to run every morning at 07:00 Europe/Brussels
- Add the Export to Google Sheets integration to your schedule
- Receive a fresh Belgian property worksheet — perfect for solo investors and small agencies
Make.com / Zapier / n8n
Use the Apify connector to trigger downstream workflows on:
- New listings (today's run minus yesterday's run, keyed on
listingId) - Price drops (compare today's
priceto last week's) - Status changes (listing disappears = sold or withdrawn)
- New A or A+ EPC listings (push to a "premium green inventory" Slack channel)
Power BI / Tableau / Looker Studio
Connect the Apify dataset REST endpoint as a live source. Build dashboards covering:
- Median €/m² per Belgian postcode with month-over-month trend
- EPC class mix per province (Flanders vs. Wallonia vs. Brussels)
- Days-on-market distribution by agency
- Brussels EU-quarter rental affordability index
Postgres / Snowflake / BigQuery
Use the Apify webhook integration to POST run results directly to your warehouse ingestion endpoint. Suggested schema:
CREATE TABLE immoweb_listings (listing_id TEXT PRIMARY KEY,listing_type TEXT,property_type TEXT,price NUMERIC,bedrooms INTEGER,living_area NUMERIC,postcode TEXT,city TEXT,province TEXT,region TEXT,epc_score TEXT,epc_value NUMERIC,agency_name TEXT,listing_url TEXT,scraped_at TIMESTAMPTZ);
CRM Enrichment — HubSpot, Salesforce, Pipedrive
For mortgage brokers and buyer-agent CRMs, trigger a nightly run and upsert against a Property custom object keyed on listingId. Price-change events can auto-create Tasks; EPC upgrades can trigger renovation-loan campaigns.
Webhooks
Configure an Apify Actor webhook to POST every run's dataset to your internal /ingest/immoweb endpoint. Idempotency key: listingId + scrapedAt.
Major Belgian Markets at a Glance
| City / Region | Postcodes | Region | Significance |
|---|---|---|---|
| Brussels (city + 19 communes) | 1000–1210 | Brussels | EU institutions, NATO, capital headquarters market |
| Etterbeek / Ixelles | 1040 / 1050 | Brussels | EU expat heartland, premium rental yields |
| Schaerbeek / Saint-Gilles | 1030 / 1060 | Brussels | Gentrification frontier, value-add opportunities |
| Antwerpen | 2000 | Flanders | Largest Flemish city, Eilandje regeneration, diamond district |
| Gent | 9000 | Flanders | University city, student rentals, strong owner-occupier demand |
| Brugge | 8000 | Flanders | UNESCO heritage, second-home & tourism market |
| Leuven | 3000 | Flanders | KU Leuven student housing, biotech corridor |
| Mechelen | 2800 | Flanders | Commuter-belt growth between Antwerpen and Brussels |
| Hasselt | 3500 | Flanders | Limburg capital, regional commercial centre |
| Liège | 4000 | Wallonia | Largest Walloon urban centre, strong gross yields |
| Namur | 5000 | Wallonia | Walloon capital, government workforce |
| Charleroi | 6000 | Wallonia | Industrial regeneration, lowest €/m² of major BE cities |
| Mons | 7000 | Wallonia | SHAPE NATO HQ housing demand |
| Tournai | 7500 | Wallonia | French-border commuter market |
| Oostende / Knokke | 8400 / 8300 | Flanders | Belgian coast — second-home & holiday-let market |
| Waterloo / Wavre | 1410 / 1300 | Wallonia | French-speaking expat suburbs of Brussels |
Cost & Performance
| Metric | Value |
|---|---|
| Engine | Playwright (real Chromium) with stealth + Belgian residential proxy |
| Runtime — search-only, 50 listings | 45–90 seconds |
| Runtime — search-only, 500 listings | 4–8 minutes |
| Runtime — detail enrichment, 100 listings | 6–12 minutes (depends on proxy latency) |
| Pricing model | Pay-per-event — start fee plus per-listing fee |
| Data freshness | Live at run time — Immoweb updates listings continuously |
| Auth required | None on the Immoweb side |
| Proxy required | Yes — Belgian residential (default Apify Residential BE works out of the box) |
| Concurrency | Safe to run multiple filtered configurations in parallel |
| Memory footprint | 1024 MB minimum, 4096 MB recommended for large detail-enrichment runs |
Compliance, Privacy & Legal Notes
- Public data only — every field is what Immoweb publishes to anonymous visitors at immoweb.be
- No personal data on buyers / sellers / tenants — only agency contact info (which Immoweb itself markets as the point of contact) and listing-level engagement counters
- No bank, payment, or identity data
- Agency phone / email is the publicly-listed business contact for the listing agent — treat as B2B data
- GDPR — the data is public commercial listing content, not personal data within the meaning of Art. 4 GDPR; however, any downstream profiling or marketing use case remains your responsibility under GDPR Art. 5–7
- robots.txt / ToS — Immoweb's terms of service prohibit "systematic" reproduction of the site at scale; this actor is designed for reasonable, targeted research and lead-generation queries, not whole-site mirroring. Stay within your contractual rights and consider acquiring an official data licence from Immoweb if you operate at high volume
- Compliance with EU ePrivacy, Belgian residential rental disclosure rules, and AML/KYC when using listings for transactional purposes is your responsibility
Important: This actor scrapes for-sale and for-rent listings — content the publisher places online specifically to be discovered. It is not designed to re-publish full listing pages or images. Don't redistribute scraped HTML or image binaries without the right licence in place.
Frequently Asked Questions
How fresh is the data?
Listings are pulled live at run time. Immoweb agents and portals update inventory continuously throughout the business day; a fresh run gives you exactly what is on the site at that moment.
How many listings does Immoweb publish?
Immoweb's active inventory hovers around 200,000+ for-sale and for-rent listings across all six categories nationwide. Your run total depends entirely on your maxListings, maxPages and filter combination.
Do I need a Belgian residential proxy?
Yes — strongly recommended and the actor defaults to it. Immoweb sits behind Cloudflare Bot Management and denies datacenter IPs almost immediately. Apify's Residential proxy with apifyProxyCountry: "BE" is included in the defaults and works out of the box for paying Apify users.
Will it work on the Apify Free Plan?
Free-plan Apify Residential Proxy quota is limited; small runs (a few dozen listings without detail enrichment) work. For production-scale use, a paid plan is recommended because residential bandwidth is what drives the cost — not actor compute.
Why are bedrooms, EPC, agency or images missing from my results?
These come from individual listing detail pages, not the search-result cards. The actor's fast default (scrapeDetails: false) only walks the search index and returns the ~10 fields Immoweb embeds in each card (listingId, propertyType, price for listings that publish one, postcode, city, region, listingUrl). Roughly 60 % of search-card results carry a price (the rest are "Contact agent" / "Price on request") and bedrooms appear on only ~10 % of cards.
Set scrapeDetails: true to fetch each listing's detail page (Playwright, ~3 s per item) and harvest 20+ extra fields: bedroom and bathroom counts, living area, land surface, EPC score and band, heating type, build year, flood-zone flag, full multilingual description, agency name / phone / email / website, image gallery, view count and bookmark count.
Pagination works — but my run stopped early. Why?
Run stops cleanly when any of three caps is hit, in priority order:
maxListings(default50, raise to0for unlimited)maxPages(default3, ~30 listings/page, raise to0for unlimited)maxListings - totalSeenreaches zero after de-duplication (Immoweb sometimes repeats listings across adjacent pages)
The actor walks ?page=1, ?page=2, … and stops automatically when a page yields zero new listings. Belgium-wide for-sale inventory is ~10,000 houses + ~10,000 apartments at any moment, so deeper crawls are absolutely feasible — verified live: maxListings: 200, maxPages: 10 returned the full 200 in 4 pages and 62 seconds. Want 1,000? Set maxListings: 1000 and maxPages: 0.
Does the actor cover all three Belgian regions?
Yes — Brussels (Brussels-Capital), Flanders (Antwerp, East Flanders, West Flanders, Flemish Brabant, Limburg) and Wallonia (Liège, Namur, Hainaut, Luxembourg, Walloon Brabant). Postcodes are automatically mapped to region and province.
Can I search in French or Dutch instead of English?
Yes — set language to fr (Français) or nl (Nederlands). Listing descriptions, agency text and the actor's URL routes use the chosen language. The structured fields (price, beds, EPC) are language-agnostic.
Does it handle pagination automatically?
Yes — the actor walks ?page=1, ?page=2, ?page=3... up to maxPages, halting early once maxListings is reached.
Can I scrape a single specific listing?
Yes — paste the full classified URL into startUrls:
{"startUrls": [{ "url": "https://www.immoweb.be/en/classified/apartment/for-sale/brussels/1000/12345678" }],"scrapeDetails": true}
Can I run this on a schedule?
Yes — Apify Scheduler supports hourly, daily, weekly and full cron expressions. Daily 07:00 Europe/Brussels is a common cadence for keeping a Belgian property inventory fresh.
What export formats are supported?
JSON, CSV, Excel (XLSX), HTML, XML and RSS — directly from the Apify dataset view. The Apify API also supports JSON Lines for streaming consumers.
Does the actor deduplicate listings?
Yes. An internal seenIds set guarantees each Immoweb classified ID appears once even if it surfaces in overlapping search URLs.
How do I get just sold / withdrawn listings?
Immoweb removes listings the moment they go off-market. To track sold/withdrawn, schedule the actor daily and diff each run against the previous one — listings present yesterday but absent today are off the market.
What is a "facade" count? Why does the dataset return it?
In Belgium, houses are classified by the number of free-standing façades (2, 3, or 4). 4-facade detached houses command a clear premium; 2-facade terraced row houses are the most common Brussels typology. It's a uniquely Belgian valuation dimension.
Does the actor handle Immoweb's Cloudflare anti-bot layer?
Yes — Playwright with the stealth patches listed in the How It Works section, plus a Belgian residential proxy and humane request delays, gets past the standard Cloudflare challenge. If you hit a captcha wall, slow down requestDelay or reduce concurrency.
Can I get historical price history?
Not from a single run — Immoweb only exposes the current asking price. To build history, schedule the actor and archive each run's dataset; Apify stores datasets indefinitely on most plans.
What about Vlan.be, Logic-Immo.be, Zimmo.be, Realo.be?
Different portals — different actors. Immoweb is the largest and most widely scraped Belgian source; reach out via the Apify Store page if you need cross-portal coverage and we can scope a sibling actor.
Is there a free trial?
Yes — Apify offers a free tier and this actor uses pay-per-event pricing, so a 25-listing test run costs only a few cents and tells you whether the data shape fits your pipeline.
Are images downloaded?
No. The actor returns image URLs in the images array — your pipeline can fetch the binaries directly from Immoweb's CDN if your licence allows it.
Related Apify Actors by Haketa
If you need real-estate listing data outside Belgium — or scrapers for adjacent verticals — these sibling actors are part of the same suite:
- Domain.com.au Property Scraper (Australia) — Sydney / Melbourne / Brisbane residential listings
- Realtor.ca Scraper (Canada) — Toronto, Vancouver, Montreal MLS-linked listings
- Apartments.com Scraper (US) — US multifamily rental inventory at scale
- Rent.com Scraper (US) — US rental listings & community details
- Zameen.com Pakistan Real Estate Scraper — Karachi, Lahore, Islamabad property listings
- VivaReal Brazil Real Estate Scraper — São Paulo, Rio de Janeiro and Brazilian metro coverage
- ZAP Imóveis Brazil Scraper — sibling Brazilian real-estate portal
- Lamudi Philippines Real Estate Scraper — Manila / Cebu / Davao property listings
- Realestate.com.kh Cambodia Scraper — Phnom Penh, Sihanoukville and Cambodian market
- Kleinanzeigen.de Scraper (Germany) — German classifieds (Wohnung mieten, Haus kaufen and more)
- Marktplaats.nl Scraper (Netherlands) — Dutch classifieds, adjacent BE/NL market
- H1B Visa Database Scraper — compensation benchmarks that often pair with relocation tools
Comparison vs. Alternatives
| Approach | Setup time | Data freshness | Cost (500 listings) | EPC included | Maintenance burden |
|---|---|---|---|---|---|
| This actor | < 5 minutes | Live at run | A few cents to a few euros | Yes (with scrapeDetails: true) | None — we maintain it |
| Manual browsing & copy/paste | Hours per query | Live | "Free" | Manual only | Painful and not scalable |
| Custom Playwright scraper | 2–5 days dev + ongoing maintenance | Live | Free + residential proxy bill | DIY | Constant — Immoweb refactors regularly |
| Official Immoweb data licence | Days to weeks of procurement | Live | Significant enterprise pricing | Yes | Low |
| Generic web scraping API | Hours | Live | Often Cloudflare-blocked on Immoweb | No | High — you still parse the payload |
Why Pay-Per-Event Pricing?
This actor uses pay-per-event pricing, which means:
- You only pay when the actor runs — no monthly subscription
- Charges scale with how much data you actually consume
- Transparent line-item billing inside Apify (start event + per-listing event)
- No minimums — sample with
maxListings: 25for pennies before scaling up - Predictable budgeting — a single Brussels submarket run is always in cents, not euros
Changelog
| Version | Date | Notes |
|---|---|---|
| 1.0.0 | 2026-05 | Initial public release — Playwright + Belgian residential proxy, search & detail pipelines, EPC enrichment, postcode-to-region mapping, EN/FR/NL language support |
Keywords
Immoweb scraper · Immoweb.be scraper · Belgium real estate data · Brussels property scraper · Immoweb.be API · Immoweb data extraction · Belgian property listings extractor · EPC energy rating Belgium data · EPC score scraper Belgium · Vlaanderen property data · Wallonie property data · Flanders real estate scraper · Brussels rental data · Belgian housing market data · Belgium for sale listings · Belgium for rent listings · Brussels EU quarter rental data · Etterbeek apartment data · Ixelles property scraper · Antwerpen vastgoed scraper · Gent immo data · Bruges property scraper · Liège immobilier data · Charleroi property listings · Namur immobilier · Hasselt vastgoed · Belgian mortgage broker intel · Belgium buy-to-let yield data · Brussels real estate API · Belgian property scraper API · Immoweb pagination scraper · Belgian residential proxy real estate · Apify Belgium real estate actor · scrape Immoweb listings · Immoweb listing JSON · Immoweb Next.js scraper · vastgoed scraper België · expat housing Brussels data · EU institution housing research · Belgian flood zone property data · Belgian EPC certificate scraper
Support
- Bug reports: Use the Issues tab on the Apify Store page
- Feature requests: Same place — describe the use case and the city / data point you need
- Direct contact: Through the Apify developer profile
If this actor saves you time or unlocks a new product, please leave a 5-star rating on the Apify Store — it helps other Belgian-market builders find it.