# Immovlan Scraper — Belgian Real Estate Listings & Prices (`studio-amba/immovlan-scraper`) Actor

Scrape real estate listings from Immovlan.be — Belgium's #3 property portal. Get prices, addresses, property details, agent info, and more for properties for sale or rent.

- **URL**: https://apify.com/studio-amba/immovlan-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

## Immovlan Scraper

Scrape Belgian real estate listings from [Immovlan.be](https://immovlan.be) — the property portal backed by DPG Media's VTM network — with prices, property details, agency info, and project data in Dutch, French, or English.

### What is Immovlan Scraper?

**Immovlan Scraper** extracts property listings from Belgium's third-largest real estate platform. Immovlan.be is part of the DPG Media ecosystem (the group behind VTM, HLN, and De Morgen), giving it massive reach among Flemish and Belgian audiences. While Immoweb dominates, Immovlan carries thousands of exclusive listings from agencies that prefer its platform or list across multiple portals.

- **Cover Belgium's full property market:** many agencies list on Immovlan exclusively or before other portals. Scraping Immovlan alongside Immoweb and Zimmo gives you near-complete coverage of the Belgian market
- **Track new development projects:** Immovlan flags project listings separately, with price ranges, bedroom ranges, and surface ranges — ideal for tracking which developers are active and at what price points
- **Monitor regional markets:** filter by Belgian city (Brussel, Gent, Antwerpen, Brugge, Liege, Namur) to build hyperlocal price datasets
- **Generate agency leads:** every listing includes the agency name, making it easy to build a database of active real estate agencies per region
- **Automate multilingual research:** the site supports Dutch, French, and English, so you can scrape listings in whichever language your team works in

The scraper uses **HTTP requests only** (no browser) with Cheerio HTML parsing, making it fast and affordable.

### What data does Immovlan Scraper extract?

🏠 **Title** — listing headline in the selected language
💰 **Price** — asking price in EUR, with **price range** support for projects (min/max)
🏗️ **Property type** — house, apartment, land, garage, office, industrial, commercial, or project
🔑 **Transaction type** — sale (te koop / a vendre) or rent (te huur / a louer)
📍 **Address** — postal code and city
🛏️ **Bedrooms** — count with **range support** for new developments (min/max)
🛁 **Bathrooms** count
📐 **Surface area** — living space in m2 with **range support** for projects (min/max)
⚡ **Energy rating** — EPC score when available
📝 **Description** — listing text up to 2,000 characters
📸 **Listing photo** URL
🏢 **Agency name** — the listing agent
🆔 **Listing ID** — Immovlan's internal reference
🏗️ **Project flag** — boolean indicating whether this is a new development project
🔗 **Direct URL** to the listing on Immovlan.be
🕐 **Scraped timestamp** — when the data was collected

### How to scrape Immovlan.be

Configure the scraper through the Apify Console or via the API. All filters are optional — leave everything blank to scrape all active Belgian listings.

#### Input options

| Input | Type | Default | Description |
|-------|------|---------|-------------|
| **Transaction Type** | `ForSale` / `ForRent` / All | All | Filter by sale or rent |
| **Property Type** | select | All types | House, Apartment, Land, Garage, Office, Industrial, Commercial |
| **City** | string | All Belgium | Town name or postal code (e.g., `Gent`, `Mariakerke`, `De Pinte`, `9030`). Dutch and French names work, and the usual English ones (Brussels, Antwerp, Ghent, Bruges) |
| **Min Price** | integer | — | Minimum price in EUR |
| **Max Price** | integer | — | Maximum price in EUR |
| **Min Bedrooms** | integer | — | Minimum bedroom count. Leaves out listings that have no bedroom count on Immovlan |
| **Max Results** | integer | `100` | Maximum listings to return (1 – 5,000) |
| **Language** | `nl` / `fr` / `en` | `nl` | Site language — affects URLs and listing text |
| **Proxy Configuration** | object | — | Recommended — Immovlan uses Akamai bot protection |

#### Tips for best results

- **Use Dutch (`nl`) for the most listings:** Immovlan started as a Flemish platform and still has the deepest coverage in Dutch
- **Enable proxy for reliability:** Immovlan uses Akamai bot protection. Small runs may work without proxy, but for 500+ listings, residential or datacenter proxy is recommended
- **Combine transaction type + city** for targeted research — e.g., all apartments for rent in Gent
- **A town name covers that town only:** `Gent` is postal code 9000. Sub-municipalities such as Mariakerke (9030), Gentbrugge (9050) or Ledeberg (9050) are separate searches. A name shared by several postal codes (`Antwerpen`, `Liège`) covers all of them
- **A search with no matches succeeds with 0 results** and says so in the run status message. The same goes for a town Immovlan does not know
- **Watch for projects:** listings with `isProject: true` represent new developments. Their price, bedrooms, and surface fields may contain ranges (min/max values) rather than single numbers

### Output

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

#### JSON example

```json
{
    "title": "Appartement te koop in Gent",
    "price": 249000,
    "priceMax": null,
    "currency": "EUR",
    "propertyType": "apartment",
    "transactionType": "sale",
    "url": "https://immovlan.be/nl/vastgoed/detail/apartment/te-koop/gent/9000/87654321",
    "address": "9000 Gent",
    "city": "Gent",
    "postalCode": "9000",
    "bedrooms": 2,
    "bedroomsMax": null,
    "bathrooms": 1,
    "surface": 78,
    "surfaceMax": null,
    "energyRating": null,
    "description": "Lichtrijk appartement op toplocatie nabij het Sint-Pietersstation. Ruime living met open keuken, 2 slaapkamers, badkamer met douche en ligbad. Gemeenschappelijke fietsenstalling en kelderberging inbegrepen.",
    "imageUrl": "https://immovlan.be/images/listing/87654321/main.jpg",
    "agencyName": "ERA Vastgoed Gent",
    "listingId": "87654321",
    "isProject": false,
    "scrapedAt": "2026-04-03T10:45:00.000Z"
}
```

#### Project listing example

```json
{
    "title": "Nieuwbouwproject te koop in Antwerpen",
    "price": 195000,
    "priceMax": 385000,
    "currency": "EUR",
    "propertyType": "project",
    "transactionType": "sale",
    "url": "https://immovlan.be/nl/vastgoed/projectdetail/antwerpen/2000/55443322",
    "address": "2000 Antwerpen",
    "city": "Antwerpen",
    "postalCode": "2000",
    "bedrooms": 1,
    "bedroomsMax": 3,
    "bathrooms": 1,
    "surface": 55,
    "surfaceMax": 120,
    "energyRating": null,
    "description": "Nieuwbouwresidentie met 24 appartementen, ondergrondse parking, en gemeenschappelijke tuin. Oplevering voorzien in Q4 2027.",
    "imageUrl": "https://immovlan.be/images/listing/55443322/main.jpg",
    "agencyName": "Heylen Vastgoed",
    "listingId": "55443322",
    "isProject": true,
    "scrapedAt": "2026-04-03T10:45:00.000Z"
}
```

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

Immovlan Scraper uses **HTTP requests only** with Cheerio parsing (no browser), keeping costs minimal.

| Scenario | Est. cost | Time |
|----------|-----------|------|
| 100 listings | ~$0.50 | ~30 sec |
| 500 listings | ~$2.00 | ~2 min |
| 1,000 listings | ~$3.50 | ~4 min |

The scraper includes polite delays between page fetches and automatic retry with backoff for rate-limited requests.

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

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

- **Google Sheets** — export Belgian property data to a spreadsheet shared with your team
- **Slack / Email** — get notified when new listings appear in your target city and price range
- **Zapier / Make** — trigger workflows such as CRM updates or portfolio alerts
- **Airtable** — build a searchable Belgian property database with filtering by city, price, and type
- **REST API** — call the scraper programmatically from any application
- **Webhooks** — receive a callback when a scraping run completes

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

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

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("studio-amba/immovlan-scraper").call(run_input={
    "transactionType": "ForSale",
    "propertyType": "Apartment",
    "city": "brussel",
    "maxResults": 200,
    "language": "nl",
})

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

**JavaScript:**

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('studio-amba/immovlan-scraper').call({
    transactionType: 'ForRent',
    city: 'gent',
    maxPrice: 1200,
    maxResults: 100,
    language: 'nl',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => console.log(`${item.title} — €${item.price}/maand`));
```

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

### FAQ

#### What is Immovlan.be?

Immovlan.be is one of Belgium's three major real estate portals, alongside Immoweb and Zimmo. It's owned by DPG Media, the media group behind VTM (Flanders' largest commercial TV network), HLN, and De Morgen. This gives Immovlan significant visibility among Flemish and Belgian audiences. The platform lists properties for sale and rent across all of Belgium, in Dutch, French, and English.

#### How does Immovlan Scraper work?

The scraper fetches search result pages via HTTP (no browser), parses the HTML with Cheerio, and extracts listing data from the search result cards. The city is matched to its postal code, and the result page confirms which town Immovlan searched; the run log names it. Address, bedroom and bathroom counts come from the schema.org data on each card. Pagination is handled automatically.

#### What's the difference between regular listings and projects?

Regular listings represent individual properties (a specific apartment or house). Project listings represent entire new developments with multiple units. Projects are flagged with `isProject: true` and often have price ranges (e.g., EUR 195,000 – 385,000) and bedroom ranges (1 – 3) instead of single values. The `priceMax`, `bedroomsMax`, and `surfaceMax` fields capture the upper end of these ranges.

#### Is it legal to scrape Immovlan.be?

This scraper extracts publicly available property listing data that Immovlan.be displays to all visitors. The data consists of factual real estate information (prices, addresses, property characteristics) published by Belgian real estate agencies. Use the data responsibly and in compliance with Belgian and EU regulations.

#### Does it work for Wallonia and Brussels?

Yes. Immovlan covers all of Belgium — Flanders, Wallonia, and Brussels. Set the `language` to `"fr"` for French-language listings or `"en"` for English. City slugs work in any language.

#### How does Immovlan compare to Immoweb?

Immoweb is Belgium's largest property portal, but Immovlan has thousands of listings that aren't on Immoweb, especially from agencies in the DPG Media network. For comprehensive market coverage, scrape both platforms and deduplicate by address or listing characteristics.

### Limitations

- **Belgium only.** Immovlan.be exclusively covers the Belgian real estate market.
- **No detail page scraping.** The current version extracts data from search result pages only. Fields like full descriptions are limited to what's visible in the listing card (up to 2,000 characters).
- **Akamai bot protection** may block requests without proxy. Use datacenter or residential proxy for consistent results.
- **Project listings** provide ranges rather than exact values for price, bedrooms, and surface area. Individual unit details require visiting the project page.
- **Energy ratings** are not always displayed on the search results page and may be `null`.
- **Bedrooms and bathrooms are `null` when Immovlan has no count for the listing.** This is common for offices, shops, land and parking, and for some agency feeds that only put the number of bedrooms in the description text. Set **Min Bedrooms** to get only listings with a known bedroom count.

### Other Belgian real estate scrapers

Combine Immovlan Scraper with these actors for full Belgian and Benelux property market coverage:

- 🏛️ [Biddit Scraper](https://apify.com/studio-amba/biddit-scraper) — Belgian notarial property auctions with selling prices
- 🇫🇷 [Logic-Immo Scraper](https://apify.com/studio-amba/logicimmo-scraper) — French real estate listings from Logic-Immo.com
- 🇱🇺 [Athome.lu Scraper](https://apify.com/studio-amba/athome-scraper) — Luxembourg's #1 real estate portal
- 🇱🇺 [WortImmo Scraper](https://apify.com/studio-amba/wortimmo-scraper) — Luxembourg property listings (Wort media group)

### Your feedback

Found a bug, getting blocked, or want to request a feature? Open an issue on the [Issues tab](https://apify.com/studio-amba/immovlan-scraper/issues). We actively maintain this scraper and respond to all reports.

# Actor input Schema

## `transactionType` (type: `string`):

Filter by sale or rent.

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

Filter by property type. Leave empty for all types.

## `city` (type: `string`):

Belgian town name or postal code, e.g. 'Gent', 'Mariakerke', 'De Pinte', '9030'. Dutch and French names work, and the usual English ones (Brussels, Antwerp, Ghent, Bruges). A town name covers that town only: 'Gent' is postal code 9000, its sub-municipalities (Mariakerke, Gentbrugge, Ledeberg) are separate searches. A place Immovlan does not know ends the run with 0 results. Leave empty for all Belgium.

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

Minimum price filter.

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

Maximum price filter.

## `minBedrooms` (type: `integer`):

Minimum number of bedrooms. Listings without a bedroom count on Immovlan (offices, land, some agency feeds) are left out when this is set.

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

Maximum number of listings to return.

## `language` (type: `string`):

Language for the site. Affects URLs and listing text.

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

Proxy settings. Recommended for this site as it uses Akamai bot protection.

## Actor input object example

```json
{
  "transactionType": "",
  "propertyType": "",
  "city": "",
  "maxResults": 100,
  "language": "nl",
  "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 = {
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/immovlan-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 = { "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    } }

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/immovlan-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/immovlan-scraper --silent --output-dataset

```

## MCP server setup

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