# Immoweb Property Search Scraper (`alexist/immoweb-property-search-scraper`) Actor

Scrape property listings from Immoweb.be with precision. Extract 16+ fields including property details, pricing, media assets, and virtual tour availability — essential for real estate professionals, investors, and market researchers analyzing the Belgian property market.

- **URL**: https://apify.com/alexist/immoweb-property-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Immoweb Property Search Scraper: Extract Belgian Real Estate Listings

***

### What Is Immoweb.be?

Immoweb.be is Belgium's leading property marketplace, hosting hundreds of thousands of residential and commercial listings. The platform aggregates properties from real estate agents, private sellers, and developers across Flanders, Wallonia, and Brussels. For real estate professionals, investors, and analysts, manually collecting property data is inefficient — the **Immoweb Property Search Scraper** automates extraction, transforming search result pages into structured datasets ready for analysis.

***

### Overview

The **Immoweb Property Search Scraper** extracts property listings from Immoweb search results pages, collecting essential metadata and multimedia assets. It is ideal for:

- **Real estate investors** monitoring market trends and pricing patterns
- **Property managers** aggregating listings for competitive analysis
- **Market researchers** studying Belgian housing demand
- **Real estate platforms** building property databases or price comparison tools
- **Data analysts** conducting market intelligence studies

The scraper handles pagination efficiently, with configurable per-URL limits and failure tolerance for reliable bulk collection.

***

### Input Format

The scraper accepts a configuration object defining URLs and collection parameters:

```json
{
  "urls": [
    "https://www.immoweb.be/en/search/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"
  ],
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

| Parameter | Type | Description |
|---|---|---|
| `urls` | Array | Immoweb search result page URLs. Supports any location, property type, or filter combination |
| `max_items_per_url` | Integer | Maximum properties scraped per URL (e.g., `200` for full page results) |
| `ignore_url_failures` | Boolean | If `true`, scraper continues if a URL fails; if `false`, entire run stops on error |

**Example URLs:**

- Search by location: `https://www.immoweb.be/en/search/house/for-sale/brussels/`
- With filters: `https://www.immoweb.be/en/search/house-and-apartment/for-rent/antwerp/?countries=BE&priceType=monthly&transactionType=2`

> **Tip:** Copy URLs directly from your browser after applying filters (location, price range, property type, sale/rent). The scraper respects all active filter parameters.

***

### Output Format

**Example output record:**

```json
{
  "id": 21722288,
  "cluster": {
    "min_price": null,
    "max_price": null,
    "min_room": null,
    "max_room": null,
    "min_surface": null,
    "max_surface": null,
    "project_info": null,
    "bedroom_range": "",
    "surface_range": ""
  },
  "customer_logo_url": "https://media.immowebstatic.be/customers/001P600000FIok6IAD/logo/f4a41df5516661cc70c49cbb8eb6d38d.png",
  "customer_name": "IMMO BEGUIN",
  "flags": {
    "main": "new",
    "secondary": [],
    "percent_sold": null
  },
  "media": {
    "pictures": [
      {
        "small_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/100x100/f211a33f05b7ddb07c983816f7ef9f91.jpg",
        "medium_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/300x300/f211a33f05b7ddb07c983816f7ef9f91.jpg",
        "large_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/736x736/f211a33f05b7ddb07c983816f7ef9f91.jpg",
        "extralarge_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/2560x1440/f211a33f05b7ddb07c983816f7ef9f91.jpg",
        "is_vertical": false
      },
      {
        "small_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/100x100/262717d09f72a8953ecf8e639e4fb7ad.jpg",
        "medium_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/300x300/262717d09f72a8953ecf8e639e4fb7ad.jpg",
        "large_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/736x736/262717d09f72a8953ecf8e639e4fb7ad.jpg",
        "extralarge_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/2560x1440/262717d09f72a8953ecf8e639e4fb7ad.jpg",
        "is_vertical": false
      },
      {
        "small_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/100x100/81701a38efe7d20bfc918f5789ffcfdb.jpg",
        "medium_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/300x300/81701a38efe7d20bfc918f5789ffcfdb.jpg",
        "large_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/736x736/81701a38efe7d20bfc918f5789ffcfdb.jpg",
        "extralarge_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/2560x1440/81701a38efe7d20bfc918f5789ffcfdb.jpg",
        "is_vertical": false
      },
      {
        "small_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/100x100/9542a5f0944b2cf72b1c16a6b9b9ac01.jpg",
        "medium_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/300x300/9542a5f0944b2cf72b1c16a6b9b9ac01.jpg",
        "large_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/736x736/9542a5f0944b2cf72b1c16a6b9b9ac01.jpg",
        "extralarge_url": "https://media-resize.immowebstatic.be/classifieds/a2a67562-89de-4a4a-b478-35c39c17d423/2560x1440/9542a5f0944b2cf72b1c16a6b9b9ac01.jpg",
        "is_vertical": false
      }
    ],
    "external_video_url": null,
    "external_video_thumbnail_url": null
  },
  "property": {
    "type": "HOUSE",
    "subtype": "HOUSE",
    "title": "Landelijk gelegen woning met 4 slpk en tuin in Dottenijs",
    "bedroom_count": 4,
    "location": {
      "country": "Belgium",
      "region": "Wallonie",
      "province": "Hainaut",
      "district": "Mouscron",
      "locality": "Mouscron Dottignies",
      "postal_code": "7711",
      "street": "Rue de la Rouge Croix",
      "number": "37A",
      "box": null,
      "property_name": "",
      "floor": null,
      "latitude": 50.7291815,
      "longitude": 3.2802821,
      "distance": null,
      "approximated": null,
      "region_code": "WALLONIE",
      "type": null,
      "has_sea_view": null,
      "points_of_interest": null,
      "place_name": ""
    },
    "net_habitable_surface": 145,
    "land_surface": 468,
    "room_count": null
  },
  "publication": {
    "publisher_id": null,
    "visualisation_option": "XL",
    "detailed_page_visibility": "CLASSIC",
    "size": "xl",
    "creation_date": null,
    "last_modification_date": "2026-07-20T13:16:13.043Z"
  },
  "transaction": {
    "certificate_logo_url": "https://media.immowebstatic.be/epc/pics/peb/peb_c.png",
    "certificate": "C",
    "hide_price": null,
    "type": "FOR_SALE",
    "rental": null,
    "sale": {
      "life_annuity": null,
      "has_starting_price": false,
      "old_price": null,
      "price": 259000,
      "price_per_sqm": null,
      "public_sale": null,
      "to_build": null,
      "is_subject_to_vat": null
    }
  },
  "price_type": null,
  "price": {
    "type": "residential_sale",
    "main_value": 259000,
    "alternative_value": null,
    "additional_value": null,
    "old_value": null,
    "min_range_value": null,
    "max_range_value": null,
    "main_display_price": "€259,000",
    "h_t_m_l_display_price": "<span aria-hidden=\"true\">€259,000</span>",
    "alternative_display_price": "",
    "old_display_price": null,
    "short_display_price": "€259K",
    "accessibility_price": "259000€",
    "label": "Price",
    "date": null,
    "language": "en",
    "hide_price": false
  },
  "is_bookmarked": false,
  "has_360_tour": null,
  "has_virtual_tour": null,
  "has_video": null,
  "advertisement_id": null,
  "from_url": "https://www.immoweb.be/en/search-results/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"
}
```

Each property record contains 16+ fields covering identity, pricing, media, and listing details:

#### Property Identification

| Field | Meaning | Example |
|---|---|---|
| `ID` | Unique Immoweb property identifier | `12345678` |
| `Advertisement ID` | Internal advertisement reference | `ad_987654` |
| `Cluster` | Property cluster or neighborhood grouping | `Brussels Central`, `Antwerp South` |

#### Pricing & Transaction

| Field | Meaning |
|---|---|
| `Price` | Listed sale or rental price |
| `Price Type` | Price category (e.g., `sale`, `rent monthly`, `rent yearly`) |
| `Transaction` | Transaction type (`buy`, `rent`, `lease`) |

#### Seller & Branding

| Field | Meaning |
|---|---|
| `Customer Name` | Real estate agency or seller name |
| `Customer Logo URL` | Agency logo image URL for branding |

#### Property Details

| Field | Meaning |
|---|---|
| `Property` | Property metadata (type: house/apartment, rooms, area, condition, etc.) |
| `Publication` | Listing metadata (publication date, listing duration, visibility status) |
| `Flags` | Special attributes (e.g., new listing, urgent sale, VIP promotion) |

#### Media & Tours

| Field | Meaning |
|---|---|
| `Media` | Array of image URLs, photo count, and thumbnail assets |
| `Has 360 Tour` | Boolean indicating 360° virtual tour availability |
| `Has Virtual Tour` | Boolean indicating interactive virtual tour (3D walkthrough) |
| `Has Video` | Boolean indicating property video presence |

#### User Interaction

| Field | Meaning |
|---|---|
| `Is Bookmarked` | Whether the property is bookmarked/favorited by logged-in user |

***

### How to Use

1. **Navigate to Immoweb.be** — Use the search interface to filter by location, property type (house/apartment), price range, and transaction type (buy/rent).
2. **Copy the search URL** — Once filters are applied, copy the full URL from your browser's address bar.
3. **Paste into the scraper** — Add URLs to the `urls` array in your configuration.
4. **Set collection limits** — Adjust `max_items_per_url` (recommended: 100–200 for comprehensive results).
5. **Enable fault tolerance** — Set `ignore_url_failures: true` for robust bulk operations.
6. **Run and export** — Execute the scraper and download results as JSON, CSV, or Excel.

**Best practices:**

- Filter search results *before* copying the URL for targeted data collection.
- Use moderate `max_items_per_url` values (50–150) to balance completeness and speed.
- Run multiple scrapes with different location filters rather than one massive request.

**Common issues:**

- If few items are returned, verify the search URL contains listings (check manually in browser).
- Immoweb may rate-limit bulk requests; space out large scrapes or use proxy rotation (via API settings if available).

***

### Use Cases & Business Value

- **Price benchmarking:** Compare property prices across neighborhoods, districts, or time periods
- **Market analysis:** Identify trends in square meter pricing, listing density, or property type demand
- **Investment screening:** Build datasets for rental yield or capital appreciation analysis
- **Competitive intelligence:** Monitor competitor agency listings and market positioning
- **Real estate aggregation:** Feed data into your own property platform or comparison tool
- **Academic research:** Analyze Belgian housing market dynamics, affordability, or geographic patterns

The Immoweb Property Search Scraper eliminates manual data entry and enables data-driven decision-making in real estate.

***

### Conclusion

The **Immoweb Property Search Scraper** is a powerful tool for real estate professionals and analysts seeking reliable, structured property data from Belgium's largest marketplace. With 16+ output fields and flexible URL-based collection, it scales effortlessly from single searches to bulk market analysis. Transform Immoweb listings into actionable insights — start scraping today.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the property list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.immoweb.be/en/search/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}
```

# 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 = {
    "urls": [
        "https://www.immoweb.be/en/search/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 200
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/immoweb-property-search-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 = {
    "urls": ["https://www.immoweb.be/en/search/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"],
    "ignore_url_failures": True,
    "max_items_per_url": 200,
}

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.immoweb.be/en/search/house-and-apartment/for-sale/mouscron/district?countries=BE&page=1&orderBy=relevance"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 200
}' |
apify call alexist/immoweb-property-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=alexist/immoweb-property-search-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/MmMyyvMw7XKiAOouG/builds/xm36ZRWtQIHxL8LGB/openapi.json
