Immoweb Scraper & New-Listing Monitor - Belgium Property
Pricing
from $0.88 / 1,000 property returneds
Immoweb Scraper & New-Listing Monitor - Belgium Property
Turn monitoring on and every later run returns only the listings it has not returned before, so you are never charged for the same property twice. Every Immoweb.be listing as clean JSON: price with its meaning, monthly charges apart from rent, bedrooms, living and land area, EPC. Unofficial.
Pricing
from $0.88 / 1,000 property returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
Share
Immoweb Scraper - Belgium Real Estate Data, Price & Area
Pull property listings from Immoweb.be — Belgium's largest property portal — as clean JSON: the price as a number and what it means, the monthly charges kept apart from the rent, bedrooms, living and land area, EPC class, the full address with coordinates and the agency, for sale or to rent, anywhere in Belgium.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Immoweb. All product names are trademarks of their respective owners.
No API key. Reads the same public pages a visitor sees.
Run it tomorrow and you only get what is new
Schedule this Actor with monitoringMode: true and each run returns only the listings it has not returned before. Not "here is everything again, please de-duplicate it yourself" — the Actor remembers what it already gave you, so a daily feed of a 4,000-listing search costs you the handful of new homes, not 4,000 rows every morning. You are never charged for the same property twice.
Listings your filters removed are remembered too, so widening a filter later does not resurrect them as false "new" listings. Listings that did not fit under your limit are not remembered, so they are still waiting on the next run instead of being silently lost.
Why this one is different
The monthly charges are not sold to you as rent
Immoweb's rental cards carry two numbers: the requested monthly rent and, on most of them (29 of the 30 rentals measured), an additional monthly amount. That second figure is the charges (common costs), median €190 against a median rent of €1,580. Adding them together, or passing the second one off as rent, would be wrong in either direction, so they come back apart:
price+priceType: "monthly-rent"— the rent Immoweb asks formonthlyCharges— the charges, in their own column, only on rentals
Sales come back as priceType: "sale" with the total in price.
A new-build project is a range, not a zero
Grouped new-build listings (5 of the 90 measured) carry no single price — only a minimum and a maximum. They come back as priceType: "sale-range" with price: null, priceMin and priceMax, and Immoweb's own display text in priceDisplay. A price filter keeps a project if any part of its range fits.
A place Immoweb does not know is reported, not silently widened
Immoweb answers an unknown locality, an unknown postcode, or a property-type word it does not use with HTTP 200 and a full page of houses from the whole of Belgium. Read naively, that is a successful search. This Actor reads the place and the property type from the page title, and when they do not match what was asked for it returns one no-such-search row that explains how Immoweb spells its addresses — instead of charging you for 30 properties from the wrong end of the country. Property-type words are also checked before any request is made. A search that really has zero results is a different row (no-results); both are free.
Every row says where Immoweb actually searched
searchedLocation carries the place from Immoweb's own page title — Brussels City (1000), Brussels (Province), Belgium — so a locality that Immoweb widened to its province is visible in the data.
No private sellers' names
Immoweb's card data carries the advertiser's name with no flag saying whether it is an agency or a private person. This Actor returns the name only when the advertiser has an agency logo (all 90 listings measured did); a listing without one comes back with agencyName: null. Belgian phone numbers and e-mail addresses written into the title or address are removed. Property data, not a contact list.
One request, 30 complete properties
Immoweb embeds every card's full data in the list page. This Actor reads all 30 from that single page and never opens individual property pages. A listing that repeats across pages is dropped before delivery, so you are never charged twice for the same property. The list card carries at most four photos, so no photo count is claimed - only mainImageUrl.
Filters run here, because Immoweb's robots.txt says so
Immoweb's robots.txt disallows every query-string filter on its search pages (minprice, maxprice, orderBy, countries, searchByRooms …). This Actor therefore requests only the plain path plus ?page=N, and every filter — price, bedrooms, living and land area, subtype, postcode, province, EPC class, under-option, new construction, keywords, agency, last-updated date — runs on the rows already fetched. Nothing extra is requested and nothing extra is charged. A property is never dropped for a value Immoweb did not publish. Sorting cannot be requested either; rows come in Immoweb's own order.
Input
Either paste a search URL, or build one from the fields below.
| Field | Type | Default | Description |
|---|---|---|---|
searchUrl | string | — | e.g. https://www.immoweb.be/en/search/house/for-sale/brussels/1000. Query parameters are dropped |
channel | string | sale | sale or rent |
propertyType | string | house-and-apartment | house, apartment, house-and-apartment, garage, office, land, industry, business, castle — Immoweb's own words |
locality | string | — | brussels, antwerp, gent, liege … Empty = all of Belgium. On its own Immoweb takes it as the province (brussels/province) and this Actor follows that redirect for every page |
postalCode | string | — | 4 digits, with the locality (brussels + 1000). Ignored by Immoweb on its own |
maxListings | integer | 20 | 1-1000. One property = one row = one charged event |
maxPages | integer | 0 | Hard cap on requests; 0 = decide from maxListings |
useProxy | boolean | false | Off by default — Immoweb answers Apify's network directly. Switches on by itself if blocked |
keywords / keywordMatch / excludeKeywords | array / string / array | — | Match on title, type, address, flags, project and agency |
agencyNames | array | — | Keep only these agencies (partial match) |
minPrice / maxPrice | integer | 0 | EUR. Sale total or monthly rent; a project is kept if any part of its range fits |
requirePrice | boolean | false | Drop listings with no single published price (a new-build range counts as none) |
minBedrooms / maxBedrooms | integer | -1 | -1 = off. An unpublished count is kept |
minLivingAreaSqm / maxLivingAreaSqm | integer | 0 | m². An unpublished area is kept |
minLandAreaSqm | integer | 0 | m² |
propertySubtypes | array | — | VILLA, BUNGALOW, DUPLEX, PENTHOUSE, FLAT_STUDIO, GROUND_FLOOR, LOFT, MANSION, APARTMENT_BLOCK … |
postalCodes / provinces | array | — | Keep only these postcodes or provinces (as Immoweb names them) |
epcCertificates | array | — | A+ … G. An unpublished class is kept |
excludeUnderOption | boolean | false | Drop listings flagged under option |
newConstructionOnly | boolean | false | Keep only new construction / new projects |
excludeProjects | boolean | false | Drop grouped projects that carry a price range |
updatedWithinDays | integer | 0 | By Immoweb's last-modification date. 0 = off |
monitoringMode | boolean | false | Return only properties not returned on a previous run |
resetMonitoringState | boolean | false | One-shot: forget what was already returned |
{ "channel": "sale", "propertyType": "house", "locality": "gent", "postalCode": "9000", "maxListings": 100,"minBedrooms": 3, "maxPrice": 450000, "minLivingAreaSqm": 120, "epcCertificates": ["A", "B", "C"], "excludeUnderOption": true }
Monitoring mode turns this into a daily feed
Schedule it and set monitoringMode: true: each run returns only the properties it has not returned before. Properties removed by your filters are remembered too, so changing a filter later does not resurrect them as false "new" listings — and properties that simply did not fit under maxListings, or were cut off by the run's charge limit, are not remembered, so they are still waiting for you on the next run rather than being silently lost.
Measured on 2026-09-05: 48,659 houses for sale across Belgium; 749 apartments to rent in Brussels City (1000).
Output
One row per property:
{"source": "immoweb.be","status": "ok","listingId": "21814826","title": "Flémalle, 4 chs, terrasse, jardin, élec conf","url": "https://www.immoweb.be/en/classified/21814826","searchedLocation": "Belgium","transactionType": "sale","propertyType": "HOUSE","propertySubtype": "HOUSE","bedrooms": 4,"roomCount": null,"livingAreaSqm": 152,"landAreaSqm": 195,"floor": null,"price": 199000,"priceCurrency": "EUR","priceType": "sale","priceDisplay": "€199,000","priceMin": null,"priceMax": null,"isPriceHidden": false,"hasStartingPrice": true,"monthlyCharges": null,"epcCertificate": "C","street": "Grand'Route","houseNumber": "445","postalCode": "4400","locality": "Flémalle","district": "Liège","province": "Liège","region": "Wallonie","country": "Belgium","placeName": "Liège environs","latitude": 50.5939295,"longitude": 5.456208,"listingFlag": "new","isNewListing": true,"isUnderOption": false,"secondaryFlags": [],"isNewConstruction": false,"projectName": null,"projectSoldPercent": null,"agencyName": "Nigel Immo","mainImageUrl": "https://media-resize.immowebstatic.be/classifieds/…/736x736/….jpg","hasVirtualTour": true,"lastModifiedAt": "2026-09-04T11:04:56.740Z","scrapedAt": "2026-09-05T07:50:35.742Z"}
Measured across 90 live listings on 2026-09-05: id, title, url, type, subtype, street, postcode, locality, province, region, coordinates, listing flag, agency and last-modified date on 90 of 90; house number on 89; a single price on 85 (the other 5 are project ranges); bedrooms on 85; living area on 85; land area on 55; floor on 30; EPC class on 19; monthly charges on 29 of the 30 rentals. Immoweb does not publish a first-listed date on the list page, so lastModifiedAt is the only date.
Rows that are never charged
status | when |
|---|---|
no-results | Immoweb reports zero properties for this search (its title carries no count). That is its answer, not a failure |
no-such-search | Immoweb does not know the locality, postcode or property type and silently widened the search to all houses in Belgium. Not a claim that there is nothing there |
no-filter-match | Listings were read, but your filters removed all of them. The row says how many were read |
no-new-listings | Monitoring mode: nothing new since the previous run |
unreadable | The page could not be read (Immoweb answers a page beyond the last with HTTP 500), its cards were missing, or its title claimed a count while yielding nothing |
Pricing
Pay per property returned. Rows that report an empty search, an unknown location or type, a filter that matched nothing, or a page that could not be read are not charged. A property that appears twice across pages is dropped before delivery, so it is never charged twice.
Notes
robots.txtwas read in full on 2026-09-05. TheUser-agent: *section disallows profile, ad-placement, print and map pages, advanced search, and every search query parameter it names (countries,orderBy,minprice,maxprice,searchByRooms,searchId,isCheap,ln,translate). This Actor requests only/en/search/<type>/<for-sale|for-rent>[/<locality>[/<postcode>]]with?page=N.- Only public pages are read. No login, no API key.