Immoweb Scraper avatar

Immoweb Scraper

Pricing

Pay per event

Go to Apify Store
Immoweb Scraper

Immoweb Scraper

Extract public Immoweb Belgium sale and rental listings with prices, property attributes, locations, images, dates, and advertiser context for monitoring.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Export public Immoweb Belgium sale and rental listings from the search URLs you already use. The Actor follows those filters, opens each listing, and returns stable IDs, prices, property attributes, location, images, publication dates, and publicly displayed advertiser context.

Use the resulting dataset for one-time comparable-property research or schedule the same input to monitor Belgium inventory and asking-price changes. English, French, and Dutch Immoweb search and classified URLs are supported.

What does the Immoweb Scraper do?

The Actor turns an Immoweb search into structured records:

  1. It validates every supplied URL as an Immoweb search or classified URL.
  2. It preserves the location, transaction, property-type, price, and other filters encoded in that URL.
  3. It follows ordinary Immoweb result pagination.
  4. It bootstraps a coherent Belgium browser session and reuses it for lightweight detail requests, with browser navigation as a fallback.
  5. It normalizes the embedded listing data and deduplicates records by Immoweb ID.
  6. It stores accepted records in the run's default dataset.

You can also supply a classified URL when you need one specific property rather than a whole search.

Who is this Actor for?

  • Property investors comparing asking prices and available inventory.
  • Brokers and agencies tracking new supply in a territory.
  • Market analysts building repeatable Belgian property datasets.
  • Proptech teams enriching internal search, valuation, or inventory pipelines.
  • Researchers comparing sale and rental characteristics by municipality.

The Actor extracts public records. It does not log in, send contact forms, estimate values, or determine whether an asking price is fair.

Why use it for Immoweb Belgium data?

  • Supply the same filtered URLs that work in your browser.
  • Receive stable listingId values for change detection and joins.
  • Get detail-page attributes instead of only summary-card text.
  • Collect sale and rental records in one consistent output shape.
  • Keep source provenance in sourceUrl for multi-search runs.
  • Use bounded pagination and maxItems to control scope.
  • Run with a Belgium residential session by default for cloud reliability.
  • Block non-document browser assets and use HTTP-first detail fetches while retaining image URLs in output.

What Immoweb data can I extract?

GroupExample fields
IdentitylistingId, url, sourceUrl
TransactiontransactionType, price, priceDisplay, oldPrice, currency
PropertypropertyType, propertySubtype, title, description
Dimensionsbedrooms, bathrooms, habitableSurface, landSurface
Featuresconstruction year, condition, furnishing, garden, terrace, parking
EnergyenergyScore, energyConsumption
Locationlocality, postal code, street, province, district, coordinates
MediaimageUrls
Advertiserpublic name, type, phone, and website when displayed
Timelinepublication, modification, availability, and scrape timestamps
Engagementpublic view and bookmark counts when available

Fields are omitted when Immoweb does not publish them for a particular listing. Exact addresses or advertiser contacts may therefore be absent.

Getting started

  1. Open Immoweb and apply the property filters you need.
  2. Copy the resulting search URL.
  3. Create a Task from this Actor.
  4. Paste the URL into Immoweb search or classified URLs.
  5. Set Maximum listings to the number of records you need.
  6. Keep the default Belgium residential proxy unless you have verified direct access.
  7. Start the run and open the Listings dataset when it finishes.
  8. Export JSON, CSV, Excel, XML, or RSS from Apify, or consume the dataset API.

A useful first input is:

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

Input parameters

startUrls

Required array of Immoweb URLs. Accepted paths are:

  • https://www.immoweb.be/en/search/...
  • https://www.immoweb.be/fr/search/...
  • https://www.immoweb.be/nl/search/...
  • public classified URLs under the same three language prefixes.

URLs on other hosts and unrelated Immoweb pages fail validation rather than being fetched.

maxItems

Maximum unique listings stored across all start URLs. The default is 25 and the supported range is 1–1,000. The Actor stops scheduling details when this limit is reached.

maxPagesPerSearch

Safety limit for each search URL. The default is 20 and the supported range is 1–333. Natural result exhaustion or maxItems can stop pagination earlier.

proxyConfiguration

The default uses Apify residential proxy traffic with Belgium geography. A single proxy identity and browser context are kept together for the run. Custom proxy URLs and explicit proxy disabling are supported through the standard proxy editor.

Direct mode can be cheaper, but it depends on the network running the Actor. A challenged page is treated as an error, never as a valid empty result.

Output example

A representative record has this shape (values shortened for readability):

{
"listingId": "21760024",
"url": "https://www.immoweb.be/en/classified/house/for-sale/bruxelles/1000/21760024",
"sourceUrl": "https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&page=1&orderBy=newest",
"transactionType": "FOR_SALE",
"propertyType": "HOUSE",
"propertySubtype": "HOUSE",
"title": "Single-family house near the European district",
"price": 630000,
"priceDisplay": "€630,000",
"currency": "EUR",
"bedrooms": 5,
"bathrooms": 4,
"habitableSurface": 190,
"hasGarden": true,
"gardenSurface": 20,
"energyScore": "E",
"locality": "BRUXELLES",
"postalCode": "1000",
"province": "Brussels",
"imageUrls": [
"https://media-resize.immowebstatic.be/classifieds/.../736x736/photo.jpg"
],
"advertiserType": "AGENCY",
"publicationDate": "2026-08-11T12:00:00.000Z",
"scrapedAt": "2026-08-12T06:30:00.000Z"
}

The dataset schema contains the complete field list and an overview table for the most useful columns.

How much does it cost to extract Immoweb property listings?

Pricing uses one start event per run plus one item event for each listing saved. The per-listing event has volume tiers, so the active Apify pricing panel is the source of truth for your account tier.

At the initial BRONZE reference price of $0.006 per run plus $0.002 per listing:

ListingsCalculated BRONZE event total (USD)
10.008
100.026
250.056
1000.206

Apify platform compute and proxy usage are handled inside the Actor run; customers are billed through the active pay-per-event configuration. A failed detail fetch is not charged as an item.

Monitor new listings and price changes

The Actor returns source identifiers and timestamps that work well in a scheduled workflow:

  1. Save a filtered Immoweb URL in an Apify Task.
  2. Schedule it daily or weekly.
  3. Export each dataset to your warehouse or spreadsheet.
  4. Join records on listingId.
  5. Compare price, oldPrice, lastModifiedDate, and presence between runs.

The Actor does not itself persist a historical database or emit alerts. Apify schedules, webhooks, dataset integrations, and your downstream system provide those workflow steps.

Use multiple search URLs

One run can combine cities, transaction types, or property categories:

{
"startUrls": [
{ "url": "https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&orderBy=newest" },
{ "url": "https://www.immoweb.be/en/search/apartment/for-rent?countries=BE&postalCodes=2000&orderBy=newest" }
],
"maxItems": 100,
"maxPagesPerSearch": 5
}

sourceUrl records which input produced each item. If the same listing occurs more than once, the Actor stores it once per run.

Export to spreadsheets and data pipelines

From the dataset you can:

  • download CSV or Excel for manual analysis;
  • connect Google Sheets through Apify integrations;
  • send the dataset ID through a webhook;
  • load JSON into a warehouse or BI tool;
  • use Make, Zapier, n8n, or custom code after each scheduled run;
  • compare current and previous datasets by listingId.

For large recurring jobs, keep filtered searches narrow and use a deliberate schedule rather than repeatedly extracting the full Belgian market.

Run with the Apify API using cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~immoweb-belgium-property-listings-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{"url":"https://www.immoweb.be/en/search/apartment/for-rent?countries=BE&postalCodes=1000&orderBy=newest"}],
"maxItems": 25
}'

Keep tokens in environment variables or secret stores, not source code.

Run with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/immoweb-belgium-property-listings-scraper').call({
startUrls: [
{ url: 'https://www.immoweb.be/en/search/house/for-sale?countries=BE&postalCodes=1000&orderBy=newest' },
],
maxItems: 25,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Run with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/immoweb-belgium-property-listings-scraper").call(
run_input={
"startUrls": [
{
"url": "https://www.immoweb.be/en/search/apartment/for-sale?countries=BE&postalCodes=2000&orderBy=newest"
}
],
"maxItems": 25,
}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

Use this Actor through MCP

Add the Apify MCP server to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/immoweb-belgium-property-listings-scraper"

Claude Desktop, Cursor, and VS Code MCP setup

Claude Desktop, Cursor, and VS Code can use this equivalent HTTP MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/immoweb-belgium-property-listings-scraper"
}
}
}

Example prompts:

  • “Run the Immoweb scraper for this Brussels sale URL and summarize median asking price per square metre.”
  • “Collect the latest Antwerp apartment listings and save the dataset link.”
  • “Run my Brussels rental Task and identify listing IDs that are new compared with yesterday’s exported dataset.”

Tips for reliable runs

  • Use a normal filtered Immoweb search URL copied from your browser.
  • Prefer a city or property segment over a country-wide unfiltered search.
  • Keep the default residential proxy for Apify cloud runs.
  • Start with 10–25 records when validating a new filter.
  • Increase maxPagesPerSearch only when the item limit requires it.
  • Use stable listing IDs rather than titles to compare runs.
  • Expect optional fields to vary by property type and advertiser.

Limits and failure behavior

Immoweb can change its page structure or anti-bot policy. The Actor detects blocked/challenge pages and missing embedded listing data. It fails clearly instead of silently returning an empty successful run.

Listings can expire between search discovery and detail extraction. Very broad searches are capped by the configured page and item limits. Results represent public data available during the run, not a complete historical record.

Phone numbers, exact addresses, coordinates, statistics, and energy fields are included only when publicly displayed. The Actor does not reveal gated contact details or bypass account access.

Responsible use and legality

You are responsible for complying with Immoweb’s terms, applicable laws, contractual restrictions, and data-protection requirements. Collect only data you have a lawful purpose to process.

Avoid excessive schedules, republishing copyrighted descriptions or images, unsolicited contact, discriminatory housing decisions, and attempts to identify private individuals. Public availability does not remove intellectual-property or privacy obligations. Use listing and advertiser data proportionately and secure your exports.

Frequently asked questions

Can I scrape both sale and rental listings?

Yes. Supply the corresponding Immoweb search URLs. The transaction type and applicable sale or rental price are normalized into the same record shape.

Can I use French or Dutch Immoweb URLs?

Yes. /fr/search, /nl/search, and their public classified paths are accepted along with English URLs.

Can I scrape one property URL?

Yes. Supply a public classified URL in startUrls. It produces one record unless the same listing has already been seen in that run.

Why did the run fail with a challenge message?

Confirm that the default Belgium residential proxy is enabled. Custom datacenter proxies are frequently blocked. A fresh rerun creates a new session; repeated failures may indicate a source change that needs maintenance.

Why is a field missing?

Immoweb does not publish every attribute for every property type. Missing optional values are omitted rather than guessed.

Does the Actor track history automatically?

No. Schedule an Apify Task and compare datasets by listingId in your preferred destination. This keeps history and alert logic under your control.

Does it contact advertisers?

No. It only exports public listing and advertiser context. It does not submit forms, make calls, or send messages.

For multi-market European research, combine this Actor with other automation-lab property tools:

Use each source-specific Actor independently, then normalize records downstream around source ID, location, transaction type, price, and scrape timestamp.