Immoweb.be $1π° Powerful Filters + Deep Search
Pricing
from $1.00 / 1,000 results
Immoweb.be $1π° Powerful Filters + Deep Search
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
9
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Immoweb.be Scraper
Extract property listings from immoweb.be - Belgium's largest property portal. 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.
Key Features
- Two modes: Search by filters (location, price, type) or paste Immoweb URLs directly
- Automatic pagination: Forward-walks search pages until limit reached
- All property types: House, Apartment, Land, Parking, Office, Industry, Garage, New Projects
- Buy and Rent: Supports both for-sale and for-rent listings
- Advanced filters: Price range, bedrooms, living area, land area, building condition, EPC grade, garden, terrace, pool, new builds
- Full location data: Street address, postal code, locality, district, province, region, coordinates (lat/lng)
- Images included: All listing photos with direct URLs
- Optional detail enrichment: Toggle on for 70+ extra fields per listing (description, EPC, building info, energy, agent contact, amenities)
- Deduplication: No duplicate listings across pages or URLs
- Low cost: Search-only mode uses minimal bandwidth; detail pages are opt-in
Output Data
Search Mode (27 fields, default)
| Category | Fields |
|---|---|
| Core | id, url, title, transactionType, propertyType, propertySubtype |
| Price | price, displayPrice, price_per_sqm, salePrice |
| Size | bedrooms, rooms, livingArea, landArea |
| Location | street, number, postalCode, locality, district, province, region, regionCode, country |
| Coordinates | latitude, longitude |
| Media | images (array of URLs), imageCount |
| Other | lastModified, listingFlag, customerName |
Detail Mode (70+ additional fields)
When Fetch Detail Pages is enabled, each listing is enriched with:
| Category | Fields |
|---|---|
| Description | description (EN), descriptionFr, descriptionNl |
| Building | constructionYear, buildingCondition, facadeCount, floorCount |
| Energy | epcScore, heatingType, hasHeatPump, hasPhotovoltaicPanels, hasDoubleGlazing |
| Interior | bathrooms, toiletCount, kitchenType, showerRoomCount |
| Exterior | gardenSurface, terraceSurface, hasGarden, hasTerrace, hasSwimmingPool |
| Amenities | hasLift, hasAirConditioning, hasJacuzzi, hasSauna, hasWorkspace, hasDisabledAccess, ... |
| Transaction | cadastralIncome, availabilityPeriod, isSubjectToVat, renovationObligation |
| Agent | agencyName, agencyId, agencyPhone, agencyEmail, customerType |
| Flags | isNewlyBuilt, isPublicSale, isNewClassified, isNewPrice, isSoldOrRented |
| Stats | viewCount, bookmarkCount |
| Dates | creationDate, expirationDate |
| Rental | monthlyRentalPrice, monthlyRentalCosts, isFurnished, arePetsAllowed (rental listings only) |
| Land | floodZoneType, latestUseDesignation, plotDivisionAuthorization (land listings only) |
Fields vary by property type - houses include garden/terrace data, apartments include floor/lift info, land includes zoning permits, rentals include monthly costs and pet policies.
How to Use
Search by Filters
Set mode to "Search by Filters" and configure:
- Transaction Type: For Sale or For Rent
- Property Types: House, Apartment, Land, Parking, Office, etc.
- Postal Codes: Belgian postal codes (e.g. 1000 for Brussels, 2000 for Antwerp)
- Price Range: Minimum and maximum price in EUR
- Bedrooms: Minimum and maximum bedrooms
- Living/Land Area: Minimum and maximum in m2
- Building Condition: As new, Good, To renovate, etc.
- EPC Grade: Maximum energy rating (A++ to G)
- Amenities: Garden, Terrace, Swimming Pool, New Builds Only
Direct URLs
Set mode to "Direct URLs" and paste search result page URLs from immoweb.be. The scraper will automatically paginate forward from the starting page.
Example URL:
https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&page=1&orderBy=newest
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 record β 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.
Proxy Configuration
The scraper checks the paid proxy group first, then residential proxy access. Residential proxy access is required for detail page scraping. If residential access is unavailable, detail page scraping is disabled and only search-result data is collected.
Example Output
{"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,"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/.../736x736/image1.jpg","https://media-resize.immowebstatic.be/classifieds/.../736x736/image2.jpg"],"imageCount": 12,"lastModified": "2026-04-15T10:30:00.000Z","customerName": "Example Agency"}
With Fetch Detail Pages enabled, each listing includes 70+ additional fields like description, epcScore, building_facadeCount, hasGarden, gardenSurface, agencyPhone, stat_viewCount, etc.
Limits
- Maximum Listings: Controls how many listings to scrape per run (default: 20; 0 = unlimited)
- Maximum Pages per URL: Optional safety bound on search result pages walked per URL (~30 listings per page). Leave empty to walk every result page β the walk stops on its own once Maximum Listings is hit, the site's reported total is reached, or a page returns no new listings.
- Detail Concurrency: Number of parallel detail-page fetches (fixed at 5, not user-configurable)
Resuming a run, and recurring updates
Two different things, both under the Resume & recurring updates input section.
Resume from a previous run (delta) β set resumeFromRunId to 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 unbounded runs also checkpoint their progress to the key-value store, so an Apify platform migration or a Resurrect of a failed run picks up where it left off instead of starting over.
Incremental changes for scheduled runs β turn on incrementalMode (off by default) when you schedule this actor to run the SAME search repeatedly and only want what changed. The first run returns everything as NEW; later runs return only NEW, UPDATED and REAPPEARED listings. Each record then carries changeType, changedFields, firstSeenAt and lastSeenAt.
| Input | Default | What it does |
|---|---|---|
incrementalMode | false | Remember this search between runs and classify each listing against the previous run |
stateKey | (auto) | Name a monitoring campaign explicitly, or deliberately share one baseline across runs. Left empty, it is derived from your search settings, so two differently-configured searches never share a baseline |
emitUnchanged | false | Also return listings that did not change. These are billed like any other row β leave off to pay only for changes |
emitExpired | false | Also return, once, listings that have disappeared. Only emitted after a run has proven it scanned the whole tracked search β never when Max listings, Max pages, a block, or Resume cut the crawl short |