Immoweb.be Scraper icon

Immoweb.be Scraper

From $1/1K. Extract property listings from immoweb.be. Get price, location, coordinates, images, and 27 structured fields per listing. Enable detail…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Immoweb.be Scraper at a glance

Immoweb.be Scraper is a ready-to-run Apify actor from abotapi for collecting real estate data. Its documented output includes id, title, price, type and beds, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Real Estate, Automation, Lead Generation
Pricing
$2.20 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
34 options

From $1/1K. Extract property listings from immoweb.be. Get price, location, coordinates, images, and 27 structured fields per listing. Enable detail page fetching for 70+ additional fields, including description, EPC score, building details, energy features, and agent contact.

What Immoweb.be Scraper can do

  • Two ways to search. Fill in filter fields (transaction type, property type, postal codes, price, bedrooms, area, building condition, EPC grade, amenities) or paste immoweb.be search URLs you already refined in your browser.
  • Every property type and transaction. Houses, apartments, land, parking, offices, industry, commercial, apartment blocks, garages and new-build projects, for sale or for rent.
  • Full Belgian location data. Street, number, postal code, locality, district, province, region and coordinates on every listing.
  • Optional deep enrichment. Turn on detail pages for 70+ extra fields per listing (description, EPC score, building and energy details, agent contact, amenities), only when you need them.
  • Built for monitoring. Incremental mode returns only new and changed listings on a recurring search, and a resume option continues an interrupted run instead of re-collecting what you already have.
  • Automatic pagination and deduplication. The walk stops on its own once results run out, and no listing is returned twice across pages or URLs.

Choose what to collect

These inputs let you configure Immoweb.be Scraper - Properties, Prices & 70+ Fields. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch mode = use the filter fields below to build the search query. URL mode = paste any immoweb.be search URL already refined in a browser (recommended for complex filters).

Choices: search, url

transactionTypestringListings to search for. Search mode only.

Choices: for-sale, for-rent

propertyTypesarrayFilter by property type. Leave empty to search houses and apartments; select other types (land, parking, office, industry, commercial, apartment block, garage, new-build projects) explicitly.
postalCodesarrayBelgian postal codes to search in (e.g. 1000 for Brussels, 2000 for Antwerp). Leave empty to search all of Belgium.
countriesarrayCountries to include (Immoweb also lists properties in neighboring regions).
orderBystringSort order for search results (search mode only).

Choices: relevance, newest, cheapest, most-expensive, postal-code

priceMinintegerMinimum property price in EUR.
Show 27 more inputs
More input fields
InputWhat it controls
priceMaxintegerMaximum property price in EUR.
bedroomsMinintegerMinimum number of bedrooms.
bedroomsMaxintegerMaximum number of bedrooms.
livingAreaMinintegerMinimum living area in square meters.
livingAreaMaxintegerMaximum living area in square meters.
landAreaMinintegerOnly relevant for houses and land listings.
landAreaMaxintegerMaximum land area in square meters.
constructionYearMinintegerFilter out buildings older than this year.
buildingConditionsarrayFilter by building condition (leave empty for any).
epcGradeMaxstringOnly include listings with an energy rating at or better than this grade (A++ is best).

Choices: A++, A+, A, B, C, D, E, F, G

hasGardenbooleanOnly include listings with a garden.
hasTerracebooleanOnly include listings with a terrace.
hasSwimmingPoolbooleanOnly include listings with a swimming pool.
newBuildsOnlybooleanOnly include new-build projects.
urlsarrayImmoweb URLs: search pages (en, nl and fr), filtered/sorted searches, location-path searches, new-project searches, and single listing pages. The ?page=N query param sets the starting page; pagination then walks forward up to Maximum Pages per URL. Agency pages (/en/agency//) are expanded into that agency's listings: houses and apartments for sale and for rent, and land for sale. Leaving this field untouched scrapes one example per shape. In URL mode, all the search-mode filter fields above are ignored.
fetchDetailsbooleanFetch each listing's detail page for 70+ extra attributes: description, EPC score, building details, energy features, agent contact, amenities, view count, etc. Applies regardless of search mode.
maxItemsintegerStop after scraping this many listings (0 = the hard cap of 100000 listings per run).
maxPagesPerUrlintegerOptional safety limit on how many search result pages to walk forward per URL (~30 listings each). Leave empty to walk result pages up to a hard cap of 1000 pages per URL, 'Maximum Listings' above is the real hard cap; the walk also stops on its own once the site's reported total is reached or a page returns no new listings.
resumeFromRunIdstringOptional. ID of a previous run of this actor (or a dataset ID) to continue ONE interrupted crawl. Listings already in that dataset are skipped, so this run returns only NEW listings (a delta). Combine both runs' datasets for the full set. For a search you run on a RECURRING schedule, use Incremental mode below instead, it remembers state itself so you don't paste an id every time.
incrementalModebooleanFor a search you run repeatedly on a schedule. When ON, the actor remembers the previous run of the SAME search itself (see Resume above instead for a one-off continuation by id) and adds changeType (NEW/UPDATED/REAPPEARED/EXPIRED/UNCHANGED) + changedFields/firstSeenAt/lastSeenAt to every listing. UNCHANGED listings are neither pushed nor billed unless 'Emit unchanged listings' is on. Off by default, existing schedules and output are unaffected.
stateKeystringOnly used when Incremental mode is on. Name this monitoring campaign so its baseline is tracked separately from any other search. Leave empty to auto-derive a key from your search filters or URLs, two differently-filtered searches never share a baseline either way.
emitUnchangedbooleanOnly used when Incremental mode is on. When ON, listings with no change since the last run are still pushed to the dataset (changeType=UNCHANGED) and billed like any other row. Off by default, so a recurring run returns and bills only what actually changed.
emitExpiredbooleanOnly used when Incremental mode is on. When ON, and this run scans the tracked search to completion, listings that were previously tracked but no longer appear are pushed once with changeType=EXPIRED (and billed). Off by default. Never fires on a capped, resumed, or otherwise partial run.
ignoreFieldsForChangesarrayOnly used when Incremental mode is on. Field names whose changes should NOT mark a listing as UPDATED, for example agencyPhone or a dotted path for a nested field. A bare name also matches at any nested depth. The fields stay in the output; they are just left out of the comparison and out of changedFields. View and bookmark counters (stat_viewCount, stat_bookmarkCount) are always ignored. Changing this list never causes a one-time wave of UPDATED rows.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

idID (text)
titleTitle (text)
displayPricePrice (text)
propertyTypeType (text)
bedroomsBeds (number)
livingAreaArea m2 (number)
postalCodePostal (text)
localityLocality (text)
provinceProvince (text)
urlURL (link)
priceprice (number)
propertySubtypepropertySubtype (text)
Show 25 more fields
transactionTypetransactionType (text)
bathroomCountbathroomCount (number)
landArealandArea (number)
gardenSurfacegardenSurface (number)
building_conditionbuilding_condition (text)
epcScoreepcScore (text)
epcUrlepcUrl (link)
energy_heatingTypeenergy_heatingType (text)
hasGardenhasGarden (boolean)
hasTerracehasTerrace (boolean)
hasSwimmingPoolhasSwimmingPool (boolean)
hasLifthasLift (boolean)
location_latitudelocation_latitude (number)
location_longitudelocation_longitude (number)
descriptiondescription (text)
agencyNameagencyName (text)
agencyIdagencyId (text)
agencyPhoneagencyPhone (text)
agencyEmailagencyEmail (text)
customerNamecustomerName (text)
customerTypecustomerType (text)
changeTypechangeType (text)
changedFieldschangedFields (array)
firstSeenAtfirstSeenAt (text)
lastSeenAtlastSeenAt (text)

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "id": 12345678,
  "url": "https://www.immoweb.be/en/classified/12345678",
  "title": "Charming villa with garden",
  "transactionType": "FOR_SALE",
  "propertyType": "HOUSE",
  "propertySubtype": "VILLA",
  "price": 425000,
  "displayPrice": "€425,000",
  "price_per_sqm": 2125,
  "bedrooms": 4,
  "rooms": 7,
  "livingArea": 200,
  "landArea": 850,
  "street": "Rue de la Gare",
  "number": "15",
  "postalCode": "1000",
  "locality": "Bruxelles",
  "district": "Brussels",
  "province": "Brussels",
  "region": "Brussels",
  "regionCode": "BRUSSELS",
  "country": "Belgium",
  "latitude": 50.8503,
  "longitude": 4.3517,
  "images": [
    "https://media-resize.immowebstatic.be/classifieds/example/736x736/image1.jpg",
    "https://media-resize.immowebstatic.be/classifieds/example/736x736/image2.jpg"
  ],
  "imageCount": 12,
  "lastModified": "2026-04-15T10:30:00.000Z",
  "customerName": "Example Agency"
}

Ways to use this data

  • Property portals and aggregators: mirror fresh Belgian listings by postal code, region or property type.
  • Investors and analysts: track price per square meter, building condition and EPC ratings across a market segment.
  • Agencies and lead generation: collect agent and agency contact details from the listings you search. The default agency contact search covers houses and apartments only; garages, offices, commercial and new-build listings are excluded unless explicitly selected under Property types.
  • Market monitoring: schedule a recurring search and get only new, updated and expired listings with incremental mode.
  • Real estate research: build historical datasets of prices, locations and property attributes.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Immoweb.be Scraper return?

The documented output for Immoweb.be Scraper includes id, title, price, type, beds, area m2, postal and locality. Availability of each field depends on the source page and the selected mode.

How much does Immoweb.be Scraper cost?

It costs $2.20 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I get only new or changed listings on a schedule?

Yes. Schedule the actor from the Schedules tab on the SAME search and turn on Incremental mode. The first run returns everything as NEW; later runs return only NEW, UPDATED and, once a prior run has tombstoned a listing as EXPIRED, REAPPEARED listings. Unchanged listings are not billed unless you turn Emit unchanged listings on.

Why do I see EXPIRED listings sometimes but never REAPPEARED ones?

EXPIRED only fires when Emit expired listings is on AND a run proves it scanned the whole tracked search to completion, never on a run capped by Maximum Listings, a resumed run, or one that hit a block partway through. REAPPEARED then only shows up for a listing that was marked EXPIRED that way and is later found again. If you have never turned Emit expired listings on, REAPPEARED can never appear, because nothing has been marked gone yet.

What's the difference between Resume and Incremental mode?

Resume (resumeFromRunId) continues ONE specific interrupted run by its id, skipping listings that run already collected, for a one-off continuation. Incremental mode is for running the SAME search repeatedly on a schedule; it remembers its own baseline and classifies every listing against the previous run. Combining resumeFromRunId with Incremental mode is only allowed to bootstrap a brand-new monitoring baseline; it is rejected if that search already has saved state.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each listing into Notion, Linear or Airtable.

Ready to collect with Immoweb.be Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.