Immoweb.be Scraper - Properties, Prices & 70+ Fields
Pricing
from $1.00 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
12
Total users
2
Monthly active users
8 days ago
Last modified
Categories
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 active listings.
- 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.
| Field | Example |
|---|---|
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 / rooms | 4 / 7 |
livingArea | 200 |
landArea | 850 |
street / number | "Rue de la Gare" / "15" |
postalCode | "1000" |
locality / district | "Bruxelles" / "Brussels" |
province / region | "Brussels" / "Brussels" |
latitude / longitude | 50.8503 / 4.3517 |
images / imageCount | array of photo URLs / 12 |
salePrice | 425000 |
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.
How to Use
- 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).
- 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.
- Turn on Fetch Detail Pages if you want the 70+ extra fields per listing; leave it off for search result data only.
- 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}
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 ApifyClientclient = 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 asNEW. Later runs compare against the stored state and mark each listingNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on), orEXPIRED(only once a run has proven it scanned the whole tracked search to completion, and only withemitExpiredon).REAPPEAREDonly appears for a listing that was previously markedEXPIREDthat way and is then found again in a later run, so it needs at least one prior complete scan withemitExpiredon before it can ever show up.stateKeynames 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.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search (use filter fields) or url (paste immoweb.be search result URLs). |
transactionType | string | for-sale | for-sale or for-rent. Search mode only. |
propertyTypes | array | none (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. |
postalCodes | array | none (all of Belgium) | Belgian 4-digit postal codes to search in. |
countries | array | ["BE"] | Countries to include; Immoweb also lists properties in neighboring regions. |
orderBy | string | newest | relevance, newest, cheapest, most-expensive, or postal-code. |
priceMin | integer | none | Minimum property price in EUR. |
priceMax | integer | none | Maximum property price in EUR. |
bedroomsMin | integer | none | Minimum number of bedrooms. |
bedroomsMax | integer | none | Maximum number of bedrooms. |
livingAreaMin | integer | none | Minimum living area in m². |
livingAreaMax | integer | none | Maximum living area in m². |
landAreaMin | integer | none | Minimum land area in m² (mainly houses and land). |
landAreaMax | integer | none | Maximum land area in m². |
constructionYearMin | integer | none | Filter out buildings older than this year. |
buildingConditions | array | none | As new, just renovated, good, to be done up, to renovate, or to restore. |
epcGradeMax | string | none | Only listings at or better than this EPC grade (A++ to G). |
hasGarden | boolean | false | Only listings with a garden. |
hasTerrace | boolean | false | Only listings with a terrace. |
hasSwimmingPool | boolean | false | Only listings with a swimming pool. |
newBuildsOnly | boolean | false | Only new-build projects. |
urls | array | none (prefill: one example immoweb.be search URL) | Search result page URLs (URL mode). The page query param sets the starting page; the walk paginates forward from there. |
fetchDetails | boolean | false | Fetch each listing's detail page for 70+ extra fields (description, EPC score, building details, energy features, agent contact). Billed per listing enriched. |
maxItems | integer | 20 | Stop after scraping this many listings (0 = unlimited). |
maxPagesPerUrl | integer | none (walk every page) | Optional safety bound on how many search result pages to walk forward per URL (about 30 listings each). |
resumeFromRunId | string | none | Run id or dataset id from this account; continues ONE interrupted run by skipping listings already collected there. |
incrementalMode | boolean | false | Track this search across scheduled runs and classify each listing as NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED. |
stateKey | string | none (auto-derived from filters or URLs) | Name this monitoring campaign, or share one baseline across runs, for Incremental mode. |
emitUnchanged | boolean | false | Also return (and bill) listings that did not change. Incremental mode only. |
emitExpired | boolean | false | Also return, once, listings that disappeared, but only after a run proves it scanned the whole tracked search. Incremental mode only. |
proxyConfiguration | object | Apify Proxy, Residential group | Connection settings. This actor requires Apify residential proxy access to reach immoweb.be reliably. |
mcpConnectors | array | none | Optional: send a summary of each listing to apps you authorized under Integrations. |
notionParentPageUrl | string | none | Notion connector only: page under which listing pages are created. |
maxNotifyListings | integer | 50 | Cap 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
This actor requires Apify's residential proxy access to reach immoweb.be reliably; pick the Residential group under Connection. Without it, a run can fail to connect and finish with no listings and a warning in the run log. The Pricing tab shows the current rate for the detail-page enrichment event, which is the only per-listing charge this actor defines; use Maximum Listings to cap the size of any run.
FAQ
How much does it cost?
This actor bills a per-listing charge only for the optional detail-page enrichment: one unit for every listing whose detail page is actually fetched and parsed. The Pricing tab shows the current rate. Use Maximum Listings to cap the size of any run.
Is it legal to scrape Immoweb?
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 only 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 a connection to immoweb.be can't be established at all (for example, no residential proxy access on your account), the run finishes normally with an empty dataset and a warning in the run log rather than being marked failed, so check the log if a run returns 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:
| 🏠 Real Estate AU Extract detailed Australian real estate property listings with 30+ structured fields... | 🏠 Realtor.ca From $1/1K. Scrape Realtor.ca property listings with prices, descriptions, images, agent... |
| 🏠 Immowelt.de Scraper Scrape detailed property listings from Immowelt.de into clean structured data. Extract... | 🏠 Zumper Scrape Zumper.com rental listings: apartments, houses, condos and rooms. Pulls 60+ fields... |
| 🏠 Real Estate AU Agents Scraper Scrape Australian real estate agent and agency profiles by suburb or profile URLs... | 🏠 ImmobilienScout24.de Scraper $0.9💰/1K for Gold discount. Extract property listings from immobilienscout24.de... |
💬 Support & custom scrapers
- 🐞 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 abotapi@proton.me or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.