Immoweb Scraper
Immoweb is Belgium's biggest property portal, and pricing a house means comparing it against dozens of others in the same postal code.
Immoweb is Belgium's biggest property portal, and pricing a house means comparing it against dozens of others in the same postal code. Rows give price, previous price on reductions, bedrooms, surface, EPC score and sale-or-rent. Street numbers and coordinates never collected.
$3.00 / 1,000 · 100.0% success over 55 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
propertyType |
string | What kind of property to search: houses and apartments together (default), or one category. | house-and-apartment |
transaction |
string | Search properties for sale or for rent. | sale |
listingIds |
array | Re-check listings you already know instead of searching: one listing ID per line (the number at the end of every Immoweb listing address, and the listingId of every dataset item), or the listing's full address. Each one is read from its own page - price, surfaces, location, EPC, agency, every photo and the full description - whether or not Scrape details is on. A listing that is gone from the site (sold, rented, expired, removed) is skipped, named in the log and not billed. When given, the search fields of this form are ignored and the run status says which. Up to 50. |
[] |
postalCodes |
string | Comma-separated Belgian postal codes to search in, e.g. "1000,1050". Leave empty to search all of Belgium. | - |
priceMinEur |
integer | Only include listings priced at least this many euros. For rentals this is euros per month. | - |
priceMaxEur |
integer | Only include listings priced at most this many euros. For rentals this is euros per month. | - |
bedroomsMin |
integer | Only include properties with at least this many bedrooms. | - |
sortBy |
string | Order of results: newest (best for monitoring), cheapest, most_expensive, or relevance. | newest |
maxItems |
integer | Stop after this many listings. Free-plan runs are capped at 5 items. The form starts at 25 for a cheap first run - that is the form's prefill, not a cap on your plan; clear it to use the default of 1000. One run cannot return more than about 10,020 items however high you set this: Immoweb serves 334 pages of 30 results for a search. | 1000 |
scrapeDetails |
boolean | Read each listing's own classified page for the seller's full property description, which the search results do not carry. This makes one extra request per listing, so a run is slower and costs one more page fetch each. The agency or advertiser contact block is never read - no name, email or phone reaches the output. Leave off for a fast search-only sweep. | False |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"agencyName": "Dewaele-woonvastgoed Kortrijk",
"bedrooms": 1,
"createdAt": null,
"currency": "EUR",
"displayPrice": "€160,000",
"epcScore": "B",
"flag": "new",
"habitableSurfaceM2": 70,
"imageUrls": [
"https://media-resize.immowebstatic.be/classifieds/f79c79d7-2212-4e4d-b254-4e9167c509c1/300x300/287152f2b8fea53874aa2c653e26cd71.jpg",
"https://media-resize.immowebstatic.be/classifieds/f79c79d7-2212-4e4d-b254-4e9167c509c1/300x300/d1a225a044e045c582869fb09fe513f9.jpg",
"https://media-resize.immowebstatic.be/classifieds/f79c79d7-2212-4e4d-b254-4e9167c509c1/300x300/5486281a8c567feaa495d2f0b6d2ad40.jpg",
"https://media-resize.immowebstatic.be/classifieds/f79c79d7-2212-4e4d-b254-4e9167c509c1/300x300/eb8aa7461e00ade916454c0f969b3b0b.jpg"
],
"landSurfaceM2": null,
"listingId": "21922251",
"locality": "Kortrijk",
"oldPriceEur": null,
"postalCode": "8500",
"priceEur": 160000,
"propertySubtype": "APARTMENT",
"propertyType": "APARTMENT",
"province": "West Flanders",
"publicSale": false,
"region": "Flanders",
"sellerType": "agency",
"title": "1-bedroom apartment (72m²) with garage for sale in Kortrijk",
"transaction": "sale",
"updatedAt": "2026-10-17T09:14:23.946Z",
"url": "https://www.immoweb.be/en/classified/apartment/for-sale/kortrijk/8500/21922251"
}
| Field | Type | Meaning |
|---|---|---|
listingId |
string | Immoweb listing ID. |
url |
string | Direct link to the listing. |
title |
string | Listing title as posted. |
propertyType |
['string', 'null'] | Main property category, e.g. HOUSE, APARTMENT. |
propertySubtype |
['string', 'null'] | Property subtype, e.g. VILLA, FLAT_STUDIO, MIXED_USE_BUILDING. |
transaction |
['string', 'null'] | sale or rent. |
priceEur |
['integer', 'null'] | Price in euros; for rentals per month. Null when the listing hides its price. |
oldPriceEur |
['integer', 'null'] | Previous price in euros when the listing was reduced. |
displayPrice |
['string', 'null'] | Price as the site displays it. |
currency |
string | Always EUR. |
bedrooms |
['integer', 'null'] | Number of bedrooms; 0 for studios. |
habitableSurfaceM2 |
['number', 'null'] | Net habitable surface in square meters. |
landSurfaceM2 |
['number', 'null'] | Land surface in square meters. |
region |
['string', 'null'] | Belgian region, e.g. Brussels, Flanders, Wallonia. |
province |
['string', 'null'] | Province. |
locality |
['string', 'null'] | Municipality. Locality-level only - street, house number and exact coordinates are never collected. |
postalCode |
['string', 'null'] | Belgian postal code. |
epcScore |
['string', 'null'] | Energy performance certificate score when reported, e.g. A, B, C. |
publicSale |
boolean | True for public (auction) sales. |
flag |
['string', 'null'] | The site's listing flag, e.g. new. |
sellerType |
string | agency or private. Private sellers are anonymous on the site itself. |
agencyName |
['string', 'null'] | Estate agency business name; null for private sellers. |
createdAt |
['string', 'null'] | When the listing was created (ISO timestamp), when reported. |
updatedAt |
['string', 'null'] | When the listing was last modified (ISO timestamp). |
imageUrls |
array | Listing photo URLs (up to 8). |
description |
string | The seller's full free-text property description. Only present when Fetch descriptions is on; read from the listing's own page. The agency/advertiser contact is never read. |
Health
100.0% success over 55 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.