Immoweb.be Belgium Property Scraper avatar

Immoweb.be Belgium Property Scraper

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Immoweb.be Belgium Property Scraper

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

Haketa

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

1

Monthly active users

12 days ago

Last modified

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.

Apify Actor


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 / axios calls 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.classified and __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/Brussels timezone 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

  1. Click "Try for free" on the Apify Store page
  2. Paste an Immoweb search URL (or leave the prefilled Belgium-wide houses+apartments for-sale search)
  3. Optionally enable Scrape Detail Pages for full EPC and agency data
  4. Hit Start — your dataset streams into the Apify console; download as JSON, CSV, Excel, or HTML

API Run (Python)

from apify_client import ApifyClient
client = 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:

StageEnginePurposeNotes
1. Search listing indexgot-scraping with rotating Belgian residential IPs + browser-like header generationFast pagination through /{lang}/search/{type}/{tx}?page=NFalls back to Playwright if 403
2. Detail enrichment (optional)Playwright (real Chromium) with stealth patchesParse window.classified + __NEXT_DATA__ for 70+ fieldsOnly runs when scrapeDetails: true

Source URL patterns

PatternExampleUsed For
Search indexhttps://www.immoweb.be/en/search/house-and-apartment/for-sale?countries=BE&page=1List view, ~30 listings per page
Locality searchhttps://www.immoweb.be/en/search/apartment/for-rent/brussels/district?countries=BEFilter to a city/province/district
Classified detailhttps://www.immoweb.be/en/classified/house/for-sale/etterbeek/1040/12345678Single-listing deep page
Next.js datawindow.__NEXT_DATA__ and window.classified JSON blobsStructured payload extraction

Engineering details

  • Belgian residential proxy — Apify Proxy with apifyProxyGroups: ["RESIDENTIAL"] and apifyProxyCountry: "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; sets Europe/Brussels timezone and en-GB / fr-BE / nl-BE locale
  • Structured JSON extraction — the actor reads window.classified first, 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 controlmaxPages caps depth; maxListings caps total volume so a Belgium-wide query doesn't accidentally run for hours
  • Deduplication — internal seenIds set ensures a listing surfaced twice (e.g. across overlapping searches) is only stored once
  • Configurable politenessrequestDelay between 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

ParameterTypeDefaultDescription
startUrlsarray<object>one Belgium-wide searchPaste 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.
propertyTypestringhouse-and-apartmentFilter category. One of house-and-apartment, house, apartment, land, office, commercial, garage.
transactionTypestringfor-salefor-sale or for-rent.
locationstring"" (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.
languagestringenSite language: en (English), fr (Français), nl (Nederlands). Affects listing descriptions and agency content.
minPriceinteger0Minimum price in EUR. 0 disables the floor.
maxPriceinteger0Maximum price in EUR. 0 disables the ceiling.
minBedroomsinteger0Minimum bedroom count. 0 disables.
scrapeDetailsbooleanfalseStrongly 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.
maxListingsinteger50Hard cap on total listings returned. 0 for unlimited.
maxPagesinteger3Maximum search result pages to walk. Each page returns ~30 listings. 0 for unlimited.
proxyConfigurationobjectApify Residential BERequired. 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.
requestDelayinteger (ms)2000Milliseconds to wait between page navigations. Lower = faster but higher risk of triggering Cloudflare cooldown.

💡 Tip — search vs detail mode tradeoff

The default scrapeDetails: false is 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. Set scrapeDetails: true whenever 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

FieldTypeDescription
listingIdstringImmoweb internal classified ID (e.g. 12345678) — stable across requests
listingTypestringfor-sale or for-rent
propertyTypestringhouse, apartment, land, office, commercial, garage, etc.
titlestringListing title as displayed on Immoweb
pricenumberAsking price (sale) or monthly rent (rent) in EUR
currencystringAlways EUR
bedroomsintegerBedroom count
bathroomsintegerBathroom count
livingAreanumberHabitable surface in m²
landSurfacenumberPlot / land surface in m² (where applicable)

Location fields

FieldTypeDescription
postcodestring4-digit Belgian postcode (e.g. 1000, 1040, 2000, 9000)
citystringLocality name (e.g. Brussels, Etterbeek, Antwerpen, Gent, Liège)
provincestringOne of the ten Belgian provinces, derived from postcode
regionstringBrussels, Flanders, or Wallonia
latitudenumberDecimal latitude (when Immoweb publishes it)
longitudenumberDecimal longitude (when Immoweb publishes it)

Energy & building fields (detail page only — set scrapeDetails: true)

FieldTypeDescription
epcScorestringEPC energy certificate letter A++, A+, A, B, C, D, E, F, G
epcValuenumberEnergy consumption in kWh/m²/year
heatingTypestringgas, fuel-oil, electric, heat-pump, pellet, solar
buildYearintegerConstruction year
conditionstringas-new, good, to-renovate, to-restore, just-renovated
facadeintegerNumber of façades (2, 3, 4) — Belgian classification quirk
floodZonebooleanWhether the property is in a designated flood-risk zone

Agency & engagement fields

FieldTypeDescription
descriptionstringFull listing description in the requested language
agencyNamestringListing agency / agent name
agencyPhonestringContact phone (detail page only)
agencyEmailstringContact email (detail page only)
agencyWebsitestringAgency homepage URL
viewCountintegerImmoweb view counter (detail page only)
bookmarkCountintegerNumber of users who bookmarked the listing
daysOnMarketintegerDays since the listing was first published
imagesarray<string>Array of high-resolution image URLs
listingUrlstringCanonical Immoweb URL
searchUrlstringSource search URL that surfaced this listing
scrapedAtstringISO-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 RangeRegionProvinceExamples
1000 – 1299BrusselsBrussels-CapitalBrussels (1000), Etterbeek (1040), Ixelles (1050), Schaerbeek (1030)
1300 – 1499WalloniaWalloon BrabantWavre (1300), Ottignies (1340), Waterloo (1410)
1500 – 1999FlandersFlemish BrabantHalle (1500), Leuven (3000-area), Vilvoorde (1800)
2000 – 2999FlandersAntwerpAntwerpen (2000), Mechelen (2800), Turnhout (2300)
3000 – 3499FlandersFlemish BrabantLeuven (3000), Tienen (3300)
3500 – 3999FlandersLimburgHasselt (3500), Genk (3600)
4000 – 4999WalloniaLiègeLiège (4000), Verviers (4800), Spa (4900)
5000 – 5999WalloniaNamurNamur (5000), Dinant (5500)
6000 – 6599WalloniaHainautCharleroi (6000)
6600 – 6999WalloniaLuxembourgBastogne (6600), Arlon (6700)
7000 – 7999WalloniaHainautMons (7000), Tournai (7500)
8000 – 8999FlandersWest FlandersBrugge (8000), Oostende (8400), Kortrijk (8500)
9000 – 9999FlandersEast FlandersGent (9000), Aalst (9300), Sint-Niklaas (9100)

Property Type Reference

SlugUsed ForNotes
house-and-apartmentCombined residential searchDefault; broadest residential coverage
houseHouses onlyDetached, semi-detached, terraced, villas, farmhouses
apartmentApartments onlyFlats, studios, penthouses, duplexes, lofts
landBuilding landPlots zoned for residential or mixed-use construction
officeOffice spaceBrussels EU quarter, Antwerpen Eilandje, Gent business parks
commercialRetail & warehousesStorefronts, mixed-use buildings, light industrial
garageGarages & parkingEspecially 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 ScorekWh/m²/year (approx)MeaningMarket Impact
A++≤ 0Energy-positive (NZEB+)Premium pricing, no renovation pressure
A+0 – 100Highly efficientStrongest resale value
A100 – 200EfficientWithin EU 2030 target band
B200 – 300GoodAcceptable for most buyers and lenders
C300 – 400AverageTypical Brussels/Antwerpen 1920s-1970s stock
D400 – 500Below averageRenovation discussions become routine
E500 – 600PoorFlanders: 5-year renovation obligation post-sale
F600 – 700Very poorSubstantial buyer discount expected
G> 700WorstSubject 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: 3 plus 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, and nl
  • 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 startUrls daily 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 floodZone boolean alongside latitude / longitude
  • Estimate replacement cost from livingArea, buildYear and condition
  • 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)

  1. Schedule the actor to run every morning at 07:00 Europe/Brussels
  2. Add the Export to Google Sheets integration to your schedule
  3. 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 price to 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 / RegionPostcodesRegionSignificance
Brussels (city + 19 communes)1000–1210BrusselsEU institutions, NATO, capital headquarters market
Etterbeek / Ixelles1040 / 1050BrusselsEU expat heartland, premium rental yields
Schaerbeek / Saint-Gilles1030 / 1060BrusselsGentrification frontier, value-add opportunities
Antwerpen2000FlandersLargest Flemish city, Eilandje regeneration, diamond district
Gent9000FlandersUniversity city, student rentals, strong owner-occupier demand
Brugge8000FlandersUNESCO heritage, second-home & tourism market
Leuven3000FlandersKU Leuven student housing, biotech corridor
Mechelen2800FlandersCommuter-belt growth between Antwerpen and Brussels
Hasselt3500FlandersLimburg capital, regional commercial centre
Liège4000WalloniaLargest Walloon urban centre, strong gross yields
Namur5000WalloniaWalloon capital, government workforce
Charleroi6000WalloniaIndustrial regeneration, lowest €/m² of major BE cities
Mons7000WalloniaSHAPE NATO HQ housing demand
Tournai7500WalloniaFrench-border commuter market
Oostende / Knokke8400 / 8300FlandersBelgian coast — second-home & holiday-let market
Waterloo / Wavre1410 / 1300WalloniaFrench-speaking expat suburbs of Brussels

Cost & Performance

MetricValue
EnginePlaywright (real Chromium) with stealth + Belgian residential proxy
Runtime — search-only, 50 listings45–90 seconds
Runtime — search-only, 500 listings4–8 minutes
Runtime — detail enrichment, 100 listings6–12 minutes (depends on proxy latency)
Pricing modelPay-per-event — start fee plus per-listing fee
Data freshnessLive at run time — Immoweb updates listings continuously
Auth requiredNone on the Immoweb side
Proxy requiredYes — Belgian residential (default Apify Residential BE works out of the box)
ConcurrencySafe to run multiple filtered configurations in parallel
Memory footprint1024 MB minimum, 4096 MB recommended for large detail-enrichment runs

  • 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:

  1. maxListings (default 50, raise to 0 for unlimited)
  2. maxPages (default 3, ~30 listings/page, raise to 0 for unlimited)
  3. maxListings - totalSeen reaches 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.


If you need real-estate listing data outside Belgium — or scrapers for adjacent verticals — these sibling actors are part of the same suite:


Comparison vs. Alternatives

ApproachSetup timeData freshnessCost (500 listings)EPC includedMaintenance burden
This actor< 5 minutesLive at runA few cents to a few eurosYes (with scrapeDetails: true)None — we maintain it
Manual browsing & copy/pasteHours per queryLive"Free"Manual onlyPainful and not scalable
Custom Playwright scraper2–5 days dev + ongoing maintenanceLiveFree + residential proxy billDIYConstant — Immoweb refactors regularly
Official Immoweb data licenceDays to weeks of procurementLiveSignificant enterprise pricingYesLow
Generic web scraping APIHoursLiveOften Cloudflare-blocked on ImmowebNoHigh — 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: 25 for pennies before scaling up
  • Predictable budgeting — a single Brussels submarket run is always in cents, not euros

Changelog

VersionDateNotes
1.0.02026-05Initial 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.