# Immoweb Scraper — Belgian Real Estate Listings (`studio-amba/immoweb-scraper`) Actor

Scrape real estate listings from Immoweb.be — Belgium's #1 property portal. Search by location, property type, sale or rent. Get prices, addresses, surfaces, EPC scores, images, and more.

- **URL**: https://apify.com/studio-amba/immoweb-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Features:** Limited permissions
- **Stats:** 8 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Immoweb Scraper

Extract property listings from [Immoweb.be](https://www.immoweb.be) — Belgium's #1 real estate portal with over 200,000 active listings — into structured JSON with prices, locations, EPC scores, photos, and full property details.

### What is Immoweb Scraper?

**Immoweb Scraper** lets you extract structured real estate data from Belgium's largest property platform, helping you monitor the market, compare prices, and automate property research — all without manual browsing.

- **Track market prices by neighbourhood:** extract listings with prices, surface areas, and EPC scores to build price-per-m² maps across any Belgian city or postcode
- **Monitor new listings in real time:** schedule daily runs and get alerted the moment a property matching your criteria hits the market
- **Build property datasets for analysis:** export thousands of listings with GPS coordinates, build year, and energy ratings for valuation models, academic research, or investment screening
- **Compare rental vs. sale markets:** switch between sale and rent listings to analyse yield gaps and rental demand across regions
- **Feed your CRM or dashboard:** export structured data to Google Sheets, Airtable, or any BI tool via Apify integrations

Immoweb.be has **no public API and no bulk export feature**. This scraper is the only way to get structured data out of Belgium's dominant property platform at scale.

### What data does Immoweb Scraper extract?

🏠 **Title** and full property description
📍 **Address** — street, postal code, city, province
🗺️ **GPS coordinates** — latitude and longitude for mapping
💰 **Price** — asking price for sale or monthly rent
🏷️ **Listing type** — sale or rent
🏗️ **Property details** — type, bedrooms, bathrooms, surface (m²), land surface (m²), build year
⚡ **EPC energy score** — official energy performance certificate rating
🏢 **Agency name** — the estate agent marketing the property
📸 **All images** — main photo and full gallery of property photos
📝 **Description** — complete listing text
🔗 **Direct URL** to the listing on Immoweb.be

### How to scrape Immoweb.be

The input is simple: choose your **search criteria** and hit run. You can configure the scraper through the Apify Console UI or programmatically via the API.

#### Input fields

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| **searchQuery** | String | — | Search by location, e.g. `"Brussels"`, `"Gent"`, `"1000"` |
| **startUrls** | Array | — | Immoweb search result URLs or individual listing URLs |
| **listingType** | String | `"sale"` | `"sale"` or `"rent"` |
| **propertyType** | String | `"any"` | `"any"`, `"house"`, or `"apartment"` |
| **maxResults** | Integer | `100` | Maximum number of listings to return (1–10,000) |
| **proxyConfiguration** | Object | — | Proxy settings (recommended — Immoweb has bot detection) |

#### Tips for best results

- **Use `searchQuery` for quick location searches:** type a city name like `"Antwerpen"` or a postal code like `"1050"` to target a specific area
- **Use `startUrls` for advanced filtering:** apply filters on Immoweb.be (price range, number of bedrooms, garden, etc.), copy the URL, and paste it as a start URL to preserve all filters
- **Proxy is strongly recommended.** Immoweb blocks most datacenter IPs. Use residential proxy for large runs to avoid rate limits
- **Start with a small `maxResults`** (e.g. 50) to verify the output, then scale up
- **Schedule daily runs** to track new listings — Immoweb typically sees hundreds of new properties per day across Belgium

### Output

Results are stored in a **dataset** that you can download in JSON, CSV, Excel, XML, or HTML format directly from the Apify Console.

#### JSON example

```json
{
    "title": "Apartment for sale in Brussels",
    "price": 325000,
    "currency": "EUR",
    "url": "https://www.immoweb.be/en/classified/apartment/for-sale/brussels/1000/11284753",
    "scrapedAt": "2026-04-04T08:30:00.000Z",
    "listingType": "sale",
    "propertyType": "apartment",
    "address": "Rue de la Loi 42",
    "city": "Brussels",
    "postalCode": "1000",
    "province": "Brussels",
    "bedrooms": 2,
    "bathrooms": 1,
    "surface": 95,
    "landSurface": null,
    "buildYear": 1985,
    "epcScore": "B",
    "imageUrl": "https://pic.immoweb.be/pics/11284753/1.jpg",
    "imageUrls": [
        "https://pic.immoweb.be/pics/11284753/1.jpg",
        "https://pic.immoweb.be/pics/11284753/2.jpg",
        "https://pic.immoweb.be/pics/11284753/3.jpg",
        "https://pic.immoweb.be/pics/11284753/4.jpg"
    ],
    "description": "Bright 2-bedroom apartment in the European quarter with open kitchen, balcony, and cellar. Close to Schuman metro station and Parc du Cinquantenaire. Recently renovated with new double glazing and EPC B rating.",
    "latitude": 50.8465,
    "longitude": 4.3717,
    "agencyName": "Trevi Brussels"
}
```

### How much does it cost to scrape Immoweb?

You pay $0.004 per listing returned, and nothing for a run that returns none.

| Scenario | Est. cost | Time |
|----------|-----------|------|
| 100 listings | ~$0.40 | ~45 sec |
| 1,000 listings | ~$4.00 | ~5 min |
| 5,000 listings | ~$20.00 | ~25 min |

**Pricing breakdown:**

- Per result: $0.004
- Requests per result: about 1 search request per 30 listings, plus 1 request per listing. No browser, so compute is a small fraction of the result price.

A run's usage cost only settles after the run reports SUCCEEDED. A run you abort halfway still bills the platform usage it consumed.

### Can I integrate Immoweb Scraper with other apps?

Yes. Immoweb Scraper connects with any tool through [Apify integrations](https://apify.com/integrations):

- **Google Sheets** — automatically export property data to a spreadsheet
- **Slack / Email** — get notified when new listings match your criteria
- **Zapier / Make** — trigger workflows when data is ready
- **Airtable** — build a searchable property database
- **REST API** — call the scraper programmatically from any language
- **Webhooks** — get notified when a run finishes

### Can I use Immoweb Scraper as an API?

Yes. Use the [Apify API](https://docs.apify.com/api/v2) to run Immoweb Scraper programmatically.

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/immoweb-scraper").call(run_input={
    "searchQuery": "Brussels",
    "listingType": "sale",
    "propertyType": "apartment",
    "maxResults": 200,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']} — {item['city']} — €{item['price']:,}")
```

**JavaScript:**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('studio-amba/immoweb-scraper').call({
    searchQuery: 'Brussels',
    listingType: 'sale',
    propertyType: 'apartment',
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Check the [API tab](https://apify.com/studio-amba/immoweb-scraper/api) for full documentation.

### FAQ

#### What is Immoweb.be?

Immoweb.be is Belgium's largest and most-visited real estate platform, with over 200,000 active property listings. It covers the entire Belgian market — Flanders, Wallonia, and Brussels — for both sales and rentals across all property types. It's operated by Immoweb Group (part of Aviv Group / Axel Springer).

#### How does Immoweb Scraper work?

It reads Immoweb's own JSON. The search route answers with 30 listings per request, and every listing page carries the whole property as a `window.classified` object inlined in its HTML. The scraper fetches both over plain HTTP and maps that object straight to the output fields, so nothing is parsed out of rendered markup.

Location filtering goes through Immoweb's own autocomplete endpoint, the one behind the site's search box, so `searchQuery` becomes the filter Immoweb actually applies. Every listing returned is then checked against that filter, and the run fails rather than hand you the unfiltered national list.

#### Can I scrape both sale and rental listings?

Yes. Set `listingType` to `"sale"` or `"rent"`. You can also filter by property type: `"house"`, `"apartment"`, or `"any"` for all types.

#### Can I filter by price, bedrooms, or other criteria?

Yes. Apply any filters on Immoweb.be directly, then copy the resulting URL and paste it into `startUrls`. The scraper will respect all URL parameters including price range, number of bedrooms, garden, terrace, and more.

#### Is it legal to scrape Immoweb?

This scraper extracts publicly available listing data that Immoweb.be displays to all visitors. The data is factual (prices, addresses, property specifications) and does not contain private personal information. As with any scraping tool, use the data responsibly and in compliance with applicable laws.

### Limitations

- **Belgium only.** Immoweb.be covers exclusively Belgian real estate.
- **Belgian residential proxy required.** Immoweb blocks datacenter exits. The default proxy configuration is Apify RESIDENTIAL with country BE, and changing it is what breaks runs.
- **Search depth caps at 333 pages.** Immoweb's search route answers page 334 with an error, so a single search reaches about 10,000 listings. Split a larger job by location or property type.
- **New-build projects are one row.** A project with several units comes back as one row with `isProject: true`. Its `price` and `surface` are the lowest unit price and the smallest unit, and `priceMax`, `surfaceMin`, `surfaceMax`, `bedroomRange` and `projectName` give the range Immoweb shows.
- **Some fields may be null.** Not all sellers fill in every field — `landSurface`, `buildYear`, or `epcScore` may be missing on some listings.

### Other Belgian real estate scrapers

Combine Immoweb Scraper with these actors for comprehensive Belgian and European property market coverage:

- ⚖️ [Biddit Scraper](https://apify.com/studio-amba/biddit-scraper) — Belgian notarial property auctions with bid prices
- 🏠 [Logic-Immo Scraper](https://apify.com/studio-amba/logicimmo-scraper) — French-language Belgian real estate listings
- 🏡 [Immovlan Scraper](https://apify.com/studio-amba/immovlan-scraper) — Belgian property listings (VTM/DPG network)
- 🇱🇺 [Athome.lu Scraper](https://apify.com/studio-amba/athome-scraper) — Luxembourg real estate
- 🇩🇪 [ImmoScout24 Scraper](https://apify.com/studio-amba/immoscout24-scraper) — German property listings

### Your feedback

Found a bug or have a feature request? Please open an issue on the [Issues tab](https://apify.com/studio-amba/immoweb-scraper/issues). We actively maintain this scraper and respond to all reports.

# Actor input Schema

## `searchQuery` (type: `string`):

Belgian locality, postal code, district or province, spelled as immoweb.be spells it — for example 'Gent', '9000', 'Antwerpen', 'Liège' or 'East Flanders'. The location is resolved through Immoweb's own location lookup and every listing is checked against it. Leave empty to search all of Belgium. If you also pass Start URLs, this location is applied to them.

## `startUrls` (type: `array`):

Immoweb search or listing URLs to scrape. Used instead of building a search URL from the location; if a Search Location is set as well, it is applied to these URLs.

## `listingType` (type: `string`):

Type of listing to search for.

## `propertyType` (type: `string`):

Type of property to search for.

## `maxResults` (type: `integer`):

Maximum number of listings to return.

## `proxyConfiguration` (type: `object`):

Proxy settings. Recommended for reliable scraping — Immoweb blocks non-proxy requests.

## Actor input object example

```json
{
  "searchQuery": "Gent",
  "listingType": "sale",
  "propertyType": "any",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "Gent",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/immoweb-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "Gent",
    "maxResults": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/immoweb-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "Gent",
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/immoweb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/immoweb-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/zsC3vrXG6VVITohHL/builds/OIehMgNK5Ck7NzBdD/openapi.json
