Immoweb Scraper & New-Listing Monitor - Belgium Property avatar

Immoweb Scraper & New-Listing Monitor - Belgium Property

Pricing

from $0.88 / 1,000 property returneds

Go to Apify Store
Immoweb Scraper & New-Listing Monitor - Belgium Property

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

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

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 for
  • monthlyCharges — 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.

FieldTypeDefaultDescription
searchUrlstringe.g. https://www.immoweb.be/en/search/house/for-sale/brussels/1000. Query parameters are dropped
channelstringsalesale or rent
propertyTypestringhouse-and-apartmenthouse, apartment, house-and-apartment, garage, office, land, industry, business, castle — Immoweb's own words
localitystringbrussels, 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
postalCodestring4 digits, with the locality (brussels + 1000). Ignored by Immoweb on its own
maxListingsinteger201-1000. One property = one row = one charged event
maxPagesinteger0Hard cap on requests; 0 = decide from maxListings
useProxybooleanfalseOff by default — Immoweb answers Apify's network directly. Switches on by itself if blocked
keywords / keywordMatch / excludeKeywordsarray / string / arrayMatch on title, type, address, flags, project and agency
agencyNamesarrayKeep only these agencies (partial match)
minPrice / maxPriceinteger0EUR. Sale total or monthly rent; a project is kept if any part of its range fits
requirePricebooleanfalseDrop listings with no single published price (a new-build range counts as none)
minBedrooms / maxBedroomsinteger-1-1 = off. An unpublished count is kept
minLivingAreaSqm / maxLivingAreaSqminteger0m². An unpublished area is kept
minLandAreaSqminteger0
propertySubtypesarrayVILLA, BUNGALOW, DUPLEX, PENTHOUSE, FLAT_STUDIO, GROUND_FLOOR, LOFT, MANSION, APARTMENT_BLOCK
postalCodes / provincesarrayKeep only these postcodes or provinces (as Immoweb names them)
epcCertificatesarrayA+G. An unpublished class is kept
excludeUnderOptionbooleanfalseDrop listings flagged under option
newConstructionOnlybooleanfalseKeep only new construction / new projects
excludeProjectsbooleanfalseDrop grouped projects that carry a price range
updatedWithinDaysinteger0By Immoweb's last-modification date. 0 = off
monitoringModebooleanfalseReturn only properties not returned on a previous run
resetMonitoringStatebooleanfalseOne-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

statuswhen
no-resultsImmoweb reports zero properties for this search (its title carries no count). That is its answer, not a failure
no-such-searchImmoweb 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-matchListings were read, but your filters removed all of them. The row says how many were read
no-new-listingsMonitoring mode: nothing new since the previous run
unreadableThe 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.txt was read in full on 2026-09-05. The User-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.