Immoweb.be Scraper - Properties, Prices & 70+ Fields avatar

Immoweb.be Scraper - Properties, Prices & 70+ Fields

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Immoweb.be Scraper - Properties, Prices & 70+ Fields

Immoweb.be Scraper - Properties, Prices & 70+ Fields

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.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

2

Bookmarked

13

Total users

3

Monthly active users

4 days ago

Last modified

Share

Immoweb Scraper: Belgian Property Listings, Prices & Agent Details

Immoweb Scraper turns Immoweb into structured Belgian real estate data. Search by filters (transaction type, location, price, bedrooms, area, building condition, EPC grade, amenities) or paste immoweb.be search result URLs directly, and get 20+ core fields per listing: price, full address, coordinates and photos. Switch on detail pages for 70+ additional fields, including description, EPC score, building details, energy features and agent contact. Export to JSON, CSV or Excel, or pull results through the API. Incremental mode tracks a recurring search and returns only what changed.

Why This Scraper?

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

Use Cases

  • 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 search covers houses and apartments; garages, offices, commercial and new-build projects must be 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.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
id12345678
url"https://www.immoweb.be/en/classified/12345678"
title"Charming villa with garden"
transactionType"FOR_SALE"
propertyType"HOUSE"
propertySubtype"VILLA"
price425000
displayPrice"โ‚ฌ425,000"
price_per_sqm2125
bedrooms / rooms4 / 7
livingArea200
landArea850
street / number"Rue de la Gare" / "15"
postalCode"1000"
locality / district"Bruxelles" / "Brussels"
province / region"Brussels" / "Brussels"
latitude / longitude50.8503 / 4.3517
images / imageCountarray of photo URLs / 12
salePrice425000
lastModified"2026-04-15T10:30:00.000Z"
customerName"Example Agency"

With Fetch Detail Pages on, each listing also carries description (English), descriptionFr and descriptionNl, building details (building_constructionYear, building_condition, building_facadeCount, building_floorCount), energy fields (epcScore, energy_heatingType, energy_hasHeatPump, energy_hasPhotovoltaicPanels, energy_hasDoubleGlazing), interior counts (bathrooms, toiletCount, showerRoomCount, kitchen_type), garden and terrace details (gardenSurface, terraceSurface, hasGarden, hasTerrace, hasSwimmingPool), amenities (hasLift, hasAirConditioning, hasJacuzzi, hasSauna, hasWorkspace, hasDisabledAccess), transaction details (sale_cadastralIncome, availabilityPeriod, sale_isSubjectToVat), agent fields (agencyName, agencyId, agencyPhone, agencyEmail, customerType), status flags (flag_isNewlyBuilt, flag_isPublicSale, flag_isSoldOrRented), view and bookmark counters (stat_viewCount, stat_bookmarkCount), publication dates (publication_creationDate, publication_expirationDate), rental terms as rental_* fields on rentals, and permit and land fields such as permit_floodZoneType, permit_hasPlotDivisionAuthorization and land_latestUseDesignation where Immoweb provides them. Which fields appear depends on the property type, since the actor flattens whatever Immoweb's own detail page returns for that listing (nested sections keep a prefix such as building_, energy_, sale_, rental_, flag_). In Incremental mode, every returned record also carries changeType (NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED), changedFields, firstSeenAt and lastSeenAt.

Output views and run summary

The Output tab offers four views of the same rows: Overview, Detail (extra attributes when Fetch details is on), Agents and agencies (agency name, id, phone, email) and Changes (change type, changed fields, first and last seen, for incremental runs). Each run also stores an OUTPUT record in the key-value store with, per start URL, the pages walked, rows returned and whether the end of results was reached.

How to Use

  1. Pick a mode: Search mode (use the filter fields) or URL mode (paste one or more immoweb.be search result URLs already filtered in your browser).
  2. In Search mode, set Transaction Type, Property Types, Postal Codes, and any of the price, bedroom, area, building condition, EPC grade or amenity filters you need.
  3. Turn on Fetch Detail Pages if you want the 70+ extra fields per listing; leave it off for search result data only.
  4. Set Maximum Listings (and, optionally, Maximum Pages per URL) to control run size and cost, then click Start.

Search Brussels houses for sale:

{
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["house"],
"postalCodes": ["1000"],
"maxItems": 20
}

Search with price, amenity and EPC filters, enriched:

{
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["apartment"],
"priceMax": 350000,
"bedroomsMin": 2,
"hasTerrace": true,
"epcGradeMax": "C",
"fetchDetails": true,
"maxItems": 50
}

URL shapes

URL mode accepts these shapes; each is routed automatically. With the urls field untouched, one example per shape is scraped.

ShapeExample pathResult
Search (English)/en/search/house/for-sale?countries=BElistings, paginated
Search page N...&page=2listings from page N onward (partial scope)
Filtered and sorted search/en/search/house-and-apartment/for-rent?postalCodes=BE-1000&minPrice=500&orderBy=cheapestlistings
Dutch search/nl/zoeken/huis/te-kooplistings
French search/fr/recherche/maison/a-vendrelistings
Location path/en/search/apartment/for-sale/brussels/province or .../antwerpen/2000listings
New projects/en/search/new-real-estate-project-houses/for-salelistings
Listing page/en/classified/apartment/for-sale/aalst-9300/9300/21925957 or /en/classified/21925957one row from the detail page
Agency page/en/agency/immo-bastogne-sa/318779that agency's listings: houses and apartments for sale and for rent, and land for sale (new-project listings are not included)

Paste a search URL directly:

{
"mode": "url",
"urls": [
"https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&page=1&orderBy=newest"
],
"maxItems": 100
}

Recurring monitoring of a rental search:

{
"mode": "search",
"transactionType": "for-rent",
"propertyTypes": ["apartment"],
"postalCodes": ["2000"],
"incrementalMode": true,
"stateKey": "antwerp-rentals",
"maxItems": 0
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/immoweb-scraper").call(run_input={
"mode": "search",
"transactionType": "for-sale",
"propertyTypes": ["house"],
"postalCodes": ["1000"],
"maxItems": 20,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
print(listing.get("title"), listing.get("displayPrice"))

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/immoweb-scraper').call({
mode: 'search',
transactionType: 'for-sale',
propertyTypes: ['house'],
postalCodes: ['1000'],
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

Pagination and limits

Both modes forward-walk search result pages (about 30 listings each) until one of three things happens: Maximum Listings is reached, Immoweb's own reported total for that search is reached, or a page returns no new listings. Maximum Pages per URL is an optional extra safety bound on top of that; leave it empty to let the walk run its course.

Resume and recurring updates

  • Resume from a previous run (resumeFromRunId): paste a previous run id or dataset id from this account to collect only the listings that run doesn't already have. Combine both runs' datasets for the full set. Long runs also checkpoint their own progress, so a platform migration or a Resurrect of a failed run picks up where it left off instead of starting over.
  • Incremental mode (incrementalMode): for scheduling this actor on the SAME search repeatedly. The first run returns everything as NEW. Later runs compare against the stored state and mark each listing NEW, UPDATED (with changedFields), UNCHANGED (suppressed and not billed unless emitUnchanged is on), or EXPIRED (only once a run has proven it scanned the whole tracked search to completion, and only with emitExpired on). REAPPEARED only appears for a listing that was previously marked EXPIRED that way and is then found again in a later run, so it needs at least one prior complete scan with emitExpired on before it can ever show up. stateKey names or shares a monitoring baseline; leave it empty and one is derived from your search filters automatically. With incremental mode off, the output is exactly as before.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each listing, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify โ†’ Settings โ†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

Input Parameters

ParameterTypeDefaultDescription
modestringsearchsearch (use filter fields) or url (paste immoweb.be search result URLs).
transactionTypestringfor-salefor-sale or for-rent. Search mode only.
propertyTypesarraynone (houses and apartments)House, apartment, house or apartment, land, parking, office, industry, commercial, apartment block, garage, or new-build houses/apartments. Leave empty to search houses and apartments; select other types explicitly.
postalCodesarraynone (all of Belgium)Belgian 4-digit postal codes to search in.
countriesarray["BE"]Countries to include; Immoweb also lists properties in neighboring regions.
orderBystringnewestrelevance, newest, cheapest, most-expensive, or postal-code.
priceMinintegernoneMinimum property price in EUR.
priceMaxintegernoneMaximum property price in EUR.
bedroomsMinintegernoneMinimum number of bedrooms.
bedroomsMaxintegernoneMaximum number of bedrooms.
livingAreaMinintegernoneMinimum living area in mยฒ.
livingAreaMaxintegernoneMaximum living area in mยฒ.
landAreaMinintegernoneMinimum land area in mยฒ (mainly houses and land).
landAreaMaxintegernoneMaximum land area in mยฒ.
constructionYearMinintegernoneFilter out buildings older than this year.
buildingConditionsarraynoneAs new, just renovated, good, to be done up, to renovate, or to restore.
epcGradeMaxstringnoneOnly listings at or better than this EPC grade (A++ to G).
hasGardenbooleanfalseOnly listings with a garden.
hasTerracebooleanfalseOnly listings with a terrace.
hasSwimmingPoolbooleanfalseOnly listings with a swimming pool.
newBuildsOnlybooleanfalseOnly new-build projects.
urlsarrayone example per URL shape (see URL shapes)Immoweb URLs (URL mode): searches and single listings. The page query param sets the starting page; the walk paginates forward from there. Left untouched, URL mode scrapes one example per shape.
fetchDetailsbooleanfalseFetch each listing's detail page for 70+ extra fields (description, EPC score, building details, energy features, agent contact). Billed per listing enriched.
maxItemsinteger20Stop after scraping this many listings (0 = the hard cap of 100000 listings per run).
maxPagesPerUrlintegernone (hard cap of 1000 pages per URL)Optional safety bound on how many search result pages to walk forward per URL (about 30 listings each).
resumeFromRunIdstringnoneRun id or dataset id from this account; continues ONE interrupted run by skipping listings already collected there.
incrementalModebooleanfalseTrack this search across scheduled runs and classify each listing as NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED.
stateKeystringnone (auto-derived from filters or URLs)Name this monitoring campaign, or share one baseline across runs, for Incremental mode.
emitUnchangedbooleanfalseAlso return (and bill) listings that did not change. Incremental mode only.
ignoreFieldsForChangesarraynoneField names (or dotted paths) whose changes do not count as UPDATED in Incremental mode. The fields stay in the output. View and bookmark counters are always ignored.
emitExpiredbooleanfalseAlso return, once, listings that disappeared, but only after a run proves it scanned the whole tracked search. Incremental mode only.
proxyConfigurationobjectApify Proxy, Residential groupConnection settings. This actor requires Apify residential proxy access to reach immoweb.be reliably.
mcpConnectorsarraynoneOptional: send a summary of each listing to apps you authorized under Integrations.
notionParentPageUrlstringnoneNotion connector only: page under which listing pages are created.
maxNotifyListingsinteger50Cap on items written to each connector per run.

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"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"
}

Plan Requirement

Immoweb sits behind Cloudflare and blocks datacenter proxies with a 403 "Attention Required" block page, so this actor needs Apify residential proxy access (the default Residential group). Apify free plans do not include residential proxies. When the default connection is unavailable the run logs "The selected connection is unavailable to this run" and continues on a backup connection, which may still be blocked; if it serves pages it logs "Served over the backup connection (the default connection was unavailable)." If no results page can be loaded at all, the run ends as failed with a clear status message (for example "No results: residential proxies are unavailable on this run ..." or "Could not load any results page (the requests failed) ... This is a connection problem, not an empty search"). You can also supply your own proxy URLs. Billing is described in the FAQ below; use Maximum Listings to cap the size of any run.

FAQ

How much does it cost?

This actor uses pay-per-event pricing with three events: a result for every listing row saved to the dataset, a start fee once per run, and a detail-enrichment event for each listing pushed with its detail page fetched and parsed (only when Fetch Detail Pages is on). Nothing is charged for listings that are not delivered, such as unchanged listings in Incremental mode (unless you turn on Emit unchanged listings) or failed requests. The Pricing tab shows the current rate of each event. Use Maximum Listings to cap the size of any run.

This actor collects only publicly available property listing data. You are responsible for how you use it: follow Immoweb's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Listing facts like price, size and address are generally not protected, but photos and full descriptions may be subject to third-party rights.

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.

Why did my run fail instead of returning an empty dataset?

A run is marked failed for a bad input, such as a resumeFromRunId that doesn't resolve to a run or dataset you can read, or combining it with Incremental mode on a search that already has saved state. If no results page can be loaded at all (for example, the account has no residential proxy access and the backup connection is also blocked), the run is marked failed with a status message explaining the connection problem, rather than finishing as an empty success. An empty dataset on a successful run means the search genuinely matched nothing.

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.

๐Ÿ”— Want more real estate data?

Pair this actor with these related scrapers from the same team:

๐Ÿ  ImmobilienScout24.de Scraper
Extract property listings from immobilienscout24.de, Germany's #1 real estate platform...
๐Ÿ  SeLoger Scraper
Scrape SeLoger.com properties for sale and rent. Search by location with price, room and...
๐Ÿ  Real Estate AU
Extract detailed Australian real estate property listings with 30+ structured fields...
๐Ÿ  Otodom.pl Scraper
Scrape Otodom.pl properties for sale and rent, including apartments, houses, plots...
๐Ÿ  Zumper Scraper
Scrape Zumper.com rental listings: apartments, houses, condos and rooms. Pulls 60+ fields...
๐Ÿš— Dubizzle.com Scraper
Scrape dubizzle.com across the UAE for property, motors, and agent listings. Search by...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email contact@abotapi.com.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.