# 🏡 Immoweb Scraper — Belgium Property Listings (`hipersoft/immoweb-scraper`) Actor

Scrape public real-estate listings from Immoweb, Belgium's #1 property portal. Filter houses or apartments, for-sale or for-rent, by postal code or price, and export one clean row per property: price, location, bedrooms, surface, energy score, photos and listing URL as JSON, CSV or Excel.

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

## Pricing

from $0.0015 / property scraped

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 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 Scraper — Belgium Property Listings

Scrape public real-estate listings from **Immoweb**, Belgium's #1 property portal, and export clean, structured data. Choose houses or apartments, **for sale** or **for rent**, narrow down by postal code or price — or paste a ready-made Immoweb search or property URL — and get one tidy row per property: price, location, bedrooms, living surface, land surface, energy score (EPC), map coordinates, photos and the listing link. Download everything as **JSON, CSV or Excel**, or pull it straight from the API.

Great for real-estate market research, price benchmarking, investment analysis, building a property feed, or tracking listings across Belgium.

### What it does

- 🏠 **Houses, apartments and more** — pick houses, apartments, new-build, land, garages, offices or businesses.
- 🏷️ **For sale or for rent** — choose the transaction type you want.
- 📍 **Filter by postal code** — limit the search to one or more Belgian postal codes (e.g. `1000` Brussels, `2000` Antwerp, `9000` Ghent).
- 💶 **Filter by price** — set a minimum and/or maximum price (sale price, or monthly rent for rentals).
- 🔗 **Paste Start URLs** — drop in any Immoweb search or property URL straight from your browser.
- 📐 **Rich property fields** — price, living surface (m²), land surface, bedrooms, energy score, coordinates and photos.
- 🔎 **Optional full details** — enable *Include full details* for description, bathrooms, construction year, energy consumption, heating, parking and every photo.
- 📊 **Clean, flat output** — ready for spreadsheets, databases and dashboards.

### Input

| Field | Description |
| --- | --- |
| **Property type** | `house`, `apartment`, `new-real-estate`, `garage`, `land`, `office` or `business`. |
| **Transaction** | Collect properties **for sale** or **for rent**. |
| **Postal codes / localities** | Optional list of Belgian postal codes to limit the search. |
| **Minimum / Maximum price (€)** | Optional price range (sale price, or monthly rent for rentals). |
| **Start URLs** | Optional list of Immoweb search or property URLs. When set, these are used instead of the fields above. |
| **Include full details** | Fetch each property's detail page for extra fields. Slower, richer output. |
| **Max items** | Maximum number of properties to collect (0 = no limit). |

#### Example input

```json
{
  "propertyType": "house",
  "transaction": "for-sale",
  "postalCodes": ["1000", "9000"],
  "minPrice": 200000,
  "maxPrice": 500000,
  "maxItems": 100
}
```

### Output

Each property is one record. Example (fields vary by listing):

```json
{
  "id": "21814826",
  "type": "HOUSE",
  "subtype": "HOUSE",
  "title": "Flémalle, 4 bedrooms, terrace, garden",
  "transactionType": "FOR_SALE",
  "price": 199000,
  "currency": "EUR",
  "priceLabel": "€199,000",
  "locality": "Flémalle",
  "postalCode": "4400",
  "province": "Liège",
  "region": "Wallonie",
  "district": "Liège",
  "street": "Grand'Route",
  "bedroomCount": 4,
  "netHabitableSurface": 152,
  "landSurface": 195,
  "energyScore": "C",
  "latitude": 50.5939295,
  "longitude": 5.456208,
  "agencyName": "Nigel Immo",
  "thumbnailUrl": "https://media-resize.immowebstatic.be/.../736x736/....jpg",
  "images": ["https://media-resize.immowebstatic.be/.../736x736/....jpg"],
  "imageCount": 24,
  "publishDate": "2026-09-06T01:38:48.517Z",
  "detailUrl": "https://www.immoweb.be/en/classified/21814826",
  "url": "https://www.immoweb.be/en/search-results/house/for-sale?countries=BE&page=1"
}
```

> Search results always include type, price, location, bedrooms, surface, energy score, coordinates, photos and the listing link. Extra fields — full description, bathrooms, construction year, energy consumption, heating and every photo — are filled in when you enable **Include full details**.

### Tips

- For a specific region or filter combination, run your search on the Immoweb website, then paste the resulting URL into **Start URLs** — the filters in the URL are respected.
- Add several **Postal codes** to cover multiple towns in a single run.
- Use **Max items** to cap large searches, or set it to `0` to collect everything a search surfaces.
- Turn on **Include full details** only when you need the richer per-property fields — it fetches each detail page and runs a little slower.

### Notes

This scraper collects **public property listings only**. It does not access, require or return any user account, login or private data. Please use the data responsibly and in line with Immoweb's terms.

# Actor input Schema

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

Which kind of property to collect. Ignored when Start URLs are set.

## `transaction` (type: `string`):

Whether to collect properties for sale or for rent. Ignored when Start URLs are set.

## `postalCodes` (type: `array`):

Optional. One or more Belgian postal codes to limit the search to (e.g. 1000 for Brussels, 2000 for Antwerp, 9000 for Ghent). Leave empty to search all of Belgium.

## `minPrice` (type: `integer`):

Optional. Only collect listings priced at or above this amount (sale price, or monthly rent for rentals).

## `maxPrice` (type: `integer`):

Optional. Only collect listings priced at or below this amount (sale price, or monthly rent for rentals).

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

Optional. One or more Immoweb search-results or classified (property) URLs. Paste the URL straight from your browser. When set, these are used instead of the fields above.

## `includeDetail` (type: `boolean`):

Fetch each property's detail page for extra fields (full description, bathrooms, construction year, energy consumption, heating, parking, all photos). Slower, but richer output.

## `maxItems` (type: `integer`):

Maximum number of properties to collect across all searches (0 = no limit; collect everything the searches return).

## Actor input object example

```json
{
  "propertyType": "house",
  "transaction": "for-sale",
  "postalCodes": [],
  "includeDetail": false,
  "maxItems": 100
}
```

# Actor output Schema

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

The results as dataset items.

# 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 = {
    "postalCodes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/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 = { "postalCodes": [] }

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/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 '{
  "postalCodes": []
}' |
apify call hipersoft/immoweb-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hipersoft/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/ql1JmC2IVSnAyJMoG/builds/Dwddj0xZltawBM5ne/openapi.json
