# Zimmo Scraper - Belgian Real Estate Listings & Prices (`studio-amba/zimmo-scraper`) Actor

Scrape property listings from Zimmo.be, Belgium's second-largest real estate portal. Extract prices, locations, surfaces, EPC scores, images, and agent details. No login needed. Supports sale and rental listings.

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

## Pricing

from $20.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

## Zimmo Scraper

Extract real estate listings from [Zimmo.be](https://www.zimmo.be), Belgium's second-largest property portal.

### Why use this actor?

Zimmo.be lists property from estate agencies and private sellers across Belgium. This actor returns each listing as one structured row: price, address, bedrooms, bathrooms, living area, plot area, EPC label, photos, coordinates and the agency.

Use cases include market analysis, investment research, relocation planning, price monitoring and housing studies.

### How to scrape Zimmo data

1. Go to the actor's page on the Apify Store
2. Enter a Belgian place (for example "Gent", "Mariakerke", "De Pinte" or a postal code) or paste Zimmo.be search URLs
3. Choose the listing type (sale or rent) and, if you want, a property type
4. Click "Start"
5. Download the results as JSON, CSV or Excel

The actor reads the same search service the Zimmo.be website uses. It needs no browser and no login.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | A Belgian place: town or sub-municipality ("Gent", "Mariakerke", "De Pinte"), postal code ("9030"), name with postal code ("Mariakerke 9030") or province ("Oost-Vlaanderen"). Defaults to "Gent". |
| `startUrls` | Array | No | Zimmo.be search pages or listing pages. Overrides `searchQuery` if provided. |
| `listingType` | String | No | `sale` (default) or `rent` |
| `propertyType` | String | No | Filter by type: `huis`, `appartement`, `studio`, `bouwgrond`, `kot`, `kantoor`, `garage`. Empty returns all types, including commercial property and garages. |
| `maxResults` | Integer | No | Maximum listings to return (default 100, at most 10,000) |
| `proxyConfiguration` | Object | No | Proxy settings. Belgian residential exits are the default. |

#### Places

A place name is looked up in Zimmo's own list of Belgian places, so every municipality and sub-municipality works, with or without hyphens and accents.

- A bare name is the town itself. "Gent" is Gent 9000, the same as `https://www.zimmo.be/nl/gent-9000/`. Sub-municipalities such as Gentbrugge or Drongen are separate places.
- A name that exists more than once in Belgium returns all places of that name and the log lists them. Add the postal code to pick one ("Beveren 9120").
- A place Zimmo does not know returns 0 listings and the run's status message names it. No other place is searched in its place.

#### Several places in one run

Give one start URL per place. Places with the same listing type and property type are read as one search, so the rows follow Zimmo's own ranking across all of them and each listing appears once.

```json
{
    "maxResults": 300,
    "startUrls": [
        { "url": "https://www.zimmo.be/nl/gent-9000/te-huur/" },
        { "url": "https://www.zimmo.be/nl/gentbrugge-9050/te-huur/" },
        { "url": "https://www.zimmo.be/nl/de-pinte-9840/te-huur/" }
    ]
}
```

Start URL forms the actor reads:

| Start URL | Result |
|-----------|--------|
| `https://www.zimmo.be/nl/gent-9000/te-huur/` | Rentals in Gent 9000 |
| `https://www.zimmo.be/nl/gent-9000/te-koop/appartement/` | Apartments for sale in Gent 9000 |
| `https://www.zimmo.be/fr/liege-4000/a-louer/` | Rentals in Liège, rows link to the French pages |
| `https://www.zimmo.be/nl/te-huur/?search=mariakerke` | Rentals in Mariakerke (the old search-box URL) |
| `https://www.zimmo.be/nl/gent-9000/te-huur/appartement/LSC6O` | That one listing |

### Output

Every row has the same fields. A field is `null` when the listing does not state it.

| Field | Type | Example |
|-------|------|---------|
| `title` | String | `"Huis te koop in Gent"` |
| `price` | Number | `325000` (monthly rent for rentals, `null` when on request) |
| `currency` | String | `"EUR"` |
| `listingType` | String | `"sale"` or `"rent"` |
| `propertyType` | String | `"huis"`, `"appartement"`, `"bedrijfsvastgoed"`, `"garage"`, `"kot-kamer"`, `"nieuwbouwproject"` |
| `address` | String | `"Veldstraat 25, 9000 Gent"` |
| `city` | String | `"Gent"` |
| `postalCode` | String | `"9000"` |
| `province` | String | `"Oost-Vlaanderen"` |
| `bedrooms` | Number | `3` |
| `bathrooms` | Number | `1` |
| `surface` | Number | `145` (living area, m²) |
| `landSurface` | Number | `280` (plot area, m²) |
| `buildYear` | Number | `1965` |
| `epcScore` | String | `"C"` |
| `epcValue` | Number | `216` (kWh/m² per year) |
| `monthlyCosts` | Number | `125` (common costs, when stated) |
| `availableFrom` | String | `"2026-11-01"` |
| `furnished` | Boolean | `true` |
| `imageUrl` | String | Main photo |
| `imageUrls` | Array | All photos |
| `description` | String | Listing text |
| `latitude` | Number | `51.0543` |
| `longitude` | Number | `3.7174` |
| `agencyName` | String | `"ERA Vastgoed"` |
| `agencyUrl` | String | Agency page on Zimmo.be |
| `agencyPhone` | String | `"09 245 24 24"` |
| `zimmoCode` | String | `"LSC6O"` |
| `publishedAt` | String | ISO 8601 timestamp |
| `url` | String | Listing page on Zimmo.be |
| `scrapedAt` | String | ISO 8601 timestamp |

Bedrooms and bathrooms are filled on nearly all houses and apartments. Commercial property and garages usually have none, so a search without `propertyType` has more `null` values in those two fields.

### Example output

```json
{
    "title": "Appartement te huur in Gent",
    "price": 2000,
    "currency": "EUR",
    "url": "https://www.zimmo.be/nl/gent-9000/te-huur/appartement/LSC6O",
    "listingType": "rent",
    "propertyType": "appartement",
    "address": "Kouter 41, 9000 Gent",
    "city": "Gent",
    "postalCode": "9000",
    "province": "Oost-Vlaanderen",
    "bedrooms": 2,
    "bathrooms": 1,
    "surface": 101,
    "landSurface": null,
    "buildYear": null,
    "epcScore": "A",
    "epcValue": 100,
    "monthlyCosts": 125,
    "availableFrom": null,
    "furnished": null,
    "latitude": 51.04974,
    "longitude": 3.722845,
    "agencyName": "Axel Lenaerts makelaars Gent",
    "agencyPhone": "09 245 24 24",
    "zimmoCode": "LSC6O",
    "publishedAt": "2026-10-09T01:23:44Z",
    "scrapedAt": "2026-10-12T13:18:03.681Z"
}
```

### Cost

You pay per listing returned, plus a small fee per run start. The Pricing tab shows the current amounts.

One request to Zimmo returns up to 100 listings, so platform usage per result is low. The usage cost of a run only settles after the run has finished with status SUCCEEDED.

### Limits

- Zimmo serves at most 10,000 listings per search. For more, split the search by place or property type.
- `maxResults` is capped at 10,000.
- A rent search returns rentals only. Zimmo's website mixes new-build projects for sale into rental results; the actor leaves those out.
- A sale search can contain new-build projects (`propertyType` `nieuwbouwproject`). Their `price` is the lowest unit price and they have no bedroom count.
- Listing data is what the agent or seller published. Fields they left empty are `null`.
- The price is the asking price, not the final sale price.

### Related scrapers

- [Immoweb Scraper](https://apify.com/itsnotyouitsme/immoweb-scraper) — Belgium's #1 real estate portal
- [Immovlan Scraper](https://apify.com/itsnotyouitsme/immovlan-scraper) — Another major Belgian property portal
- [Logic-Immo Scraper](https://apify.com/itsnotyouitsme/logicimmo-scraper) — French real estate listings
- [ImmoScout24 Scraper](https://apify.com/itsnotyouitsme/immoscout24-scraper) — German/Austrian real estate
- [Immobiliare Scraper](https://apify.com/itsnotyouitsme/immobiliare-scraper) — Italian real estate listings

# Actor input Schema

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

Any Belgian place as Zimmo writes it: a town or sub-municipality ('Gent', 'Mariakerke', 'De Pinte'), a postal code ('9030'), a name with its postal code ('Mariakerke 9030') or a province ('Oost-Vlaanderen'). Defaults to 'Gent' if empty. A place Zimmo does not know ends the run with 0 listings and a message.

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

Zimmo.be search pages (https://www.zimmo.be/nl/gent-9000/te-huur/ or with a type, .../te-huur/appartement/) or listing pages. Several places with the same listing type are read as one search. Overrides searchQuery if provided.

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

Search for properties for sale or for rent.

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

Type of property to search for. Leave empty for all types.

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

Maximum number of property listings to return. Zimmo serves at most 10,000 listings per search.

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

Proxy for the requests to Zimmo. Belgian residential exits are the default. A request that fails on the proxy is retried without it.

## Actor input object example

```json
{
  "searchQuery": "gent",
  "startUrls": [
    "https://www.zimmo.be/nl/gent-9000/te-koop/"
  ],
  "listingType": "sale",
  "propertyType": "",
  "maxResults": 20,
  "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",
    "startUrls": [
        "https://www.zimmo.be/nl/gent-9000/te-koop/"
    ],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "BE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/zimmo-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",
    "startUrls": ["https://www.zimmo.be/nl/gent-9000/te-koop/"],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/zimmo-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",
  "startUrls": [
    "https://www.zimmo.be/nl/gent-9000/te-koop/"
  ],
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "BE"
  }
}' |
apify call studio-amba/zimmo-scraper --silent --output-dataset

```

## MCP server setup

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