# Immoscoop Scraper - Belgian Real Estate Listings (`studio-amba/immoscoop-scraper`) Actor

Scrape property listings from Immoscoop.be, a Belgian real estate aggregator. Extract prices, addresses, surfaces, EPC scores, bedrooms, bathrooms, images, and agency details. No login required. Supports sale and rental listings.

- **URL**: https://apify.com/studio-amba/immoscoop-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 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?

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

## Immoscoop Scraper

Scrape real estate listings from [Immoscoop.be](https://www.immoscoop.be), a Belgian property aggregator. Extract property prices, locations, surfaces, EPC energy scores, images, and agency details — no login or cookies required.

### How to scrape Immoscoop data

1. Go to the [Immoscoop Scraper](https://apify.com/store) on the Apify Store.
2. Click **Try for free** to open the actor in Apify Console.
3. Enter a Belgian city name (e.g., `gent`, `brussel`, `antwerpen`) in the **Search Location** field.
4. Choose whether you want **For Sale** or **For Rent** listings.
5. Set the **Max Results** to control how many listings you want.
6. Click **Start** and wait for the run to complete.
7. Download your data in JSON, CSV, Excel, or any other format from the **Dataset** tab.

You can also provide direct Immoscoop.be URLs in the **Start URLs** field to scrape specific search results or individual property pages.

### Why use this actor?

Real estate professionals, data analysts, and property investors need structured data from Belgian property portals. Immoscoop.be aggregates listings from multiple agencies across Belgium, giving you a broad view of the market in one scrape. This actor extracts all key property attributes in a clean, structured format ready for analysis, comparison, or integration with your own tools.

### Features

- Scrapes both **sale** and **rental** listings
- Extracts detailed property specifications (bedrooms, bathrooms, surface, EPC)
- Collects all listing images
- Captures agency/broker contact information
- Handles pagination automatically
- No login, cookies, or authentication required
- Supports direct URL input for specific pages
- Default search query ensures the actor works even with empty input

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | City or region to search (e.g., `gent`, `brussel`). Defaults to `gent`. |
| `startUrls` | Array | No | Direct Immoscoop.be search or property URLs. Overrides `searchQuery`. |
| `listingType` | String | No | `sale` (default) or `rent` |
| `maxResults` | Integer | No | Maximum listings to scrape (default: 100) |
| `proxyConfiguration` | Object | No | Proxy settings. Belgian residential proxies recommended. |

#### Input example

```json
{
    "searchQuery": "gent",
    "listingType": "sale",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "countryCode": "BE"
    }
}
```

### Output

Each result contains the following fields:

| Field | Type | Example |
|-------|------|---------|
| `title` | String | `"Appartement te koop"` |
| `price` | Number | `282500` |
| `currency` | String | `"EUR"` |
| `url` | String | `"https://www.immoscoop.be/te-koop/9000-gent/1137659"` |
| `listingType` | String | `"sale"` or `"rent"` |
| `propertyType` | String | `"appartement"`, `"huis"`, `"villa"`, etc. |
| `address` | String | `"Wilderoosstraat 46"` |
| `city` | String | `"Gent"` |
| `postalCode` | String | `"9000"` |
| `bedrooms` | Integer | `2` |
| `bathrooms` | Integer | `1` |
| `surface` | Number | `65` (m2) |
| `landSurface` | Number | `255` (m2) |
| `buildYear` | Integer | `1985` |
| `epcScore` | String | `"B"` |
| `epcValue` | Number | `186` (kWh/m2/year) |
| `imageUrl` | String | Main property image URL |
| `imageUrls` | Array | All property image URLs |
| `description` | String | Full property description text |
| `latitude` | Number | Geographic latitude |
| `longitude` | Number | Geographic longitude |
| `agencyName` | String | `"Herbert Lambrecht"` |
| `agencyAddress` | String | `"Dublinstraat 37, 9000 Gent"` |
| `listingId` | String | `"1137659"` |
| `scrapedAt` | String | `"2026-05-29T14:30:00.000Z"` |

### Example output

```json
{
    "title": "Appartement te koop in Wilderoosstraat 46 9000 Gent",
    "price": 282500,
    "currency": "EUR",
    "url": "https://www.immoscoop.be/te-koop/9000-gent/1137659",
    "listingType": "sale",
    "propertyType": "appartement",
    "address": "Wilderoosstraat 46",
    "city": "Gent",
    "postalCode": "9000",
    "bedrooms": 1,
    "bathrooms": 1,
    "surface": 65,
    "landSurface": null,
    "buildYear": null,
    "epcScore": "B",
    "epcValue": 186,
    "imageUrl": "https://images.immoscoop.be/cp-c653855c3bcbac8b46c6885506e90553.jpg",
    "imageUrls": [
        "https://images.immoscoop.be/cp-c653855c3bcbac8b46c6885506e90553.jpg",
        "https://images.immoscoop.be/cp-a1b2c3d4e5f6.jpg"
    ],
    "description": "Licht en rustig 1-slaapkamerappartement met terras in hartje Gent...",
    "latitude": null,
    "longitude": null,
    "agencyName": "Herbert Lambrecht",
    "agencyAddress": "Dublinstraat 37, 9000 Gent",
    "listingId": "1137659",
    "scrapedAt": "2026-05-29T14:30:00.000Z"
}
```

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

This actor uses lightweight HTTP requests (CheerioCrawler), making it very efficient. Approximate costs:

| Results | Estimated Cost |
|---------|----------------|
| 100 | $0.22 |
| 1,000 | $2.02 |
| 5,000 | $10.02 |

This actor charges $0.02 per run (start fee, based on its 4 GB memory allocation) plus $0.002 per result. Residential proxy bandwidth, if your Apify plan doesn't include it, is billed separately by Apify but is recommended for reliability.

### Tips for best results

- **Use Belgian cities in Dutch**: Immoscoop uses Dutch city names (e.g., `gent` not `ghent`, `brussel` not `brussels`, `antwerpen` not `antwerp`).
- **Residential proxies**: For best reliability, use Belgian residential proxies. The actor works without proxies for small runs but may get blocked on larger scrapes.
- **Start URLs**: For targeted scraping, paste Immoscoop.be search URLs directly into the Start URLs field. This gives you full control over filters.
- **Rate limiting**: The actor includes built-in concurrency limits and retry logic to avoid overloading the site.

### Limitations

- Coordinates (latitude/longitude) are only available when the listing page includes map data.
- Some fields may be empty depending on what the listing agent provided.
- Data is scraped from the public website and may change without notice.
- The actor scrapes the Dutch (nl) version of the site.

### Changelog

- **v0.1** — Initial release. Supports search by city, sale/rent filtering, full detail extraction with pagination.

# Actor input Schema

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

City or region to search for properties, e.g., 'gent', 'brussel', 'antwerpen', 'brugge'. Defaults to 'gent' if empty.

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

Immoscoop.be search or property detail URLs. Overrides searchQuery if provided.

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

Search for properties for sale or for rent.

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

Maximum number of property listings to scrape.

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

Proxy settings. Belgian residential proxies recommended for best results.

## Actor input object example

```json
{
  "searchQuery": "gent",
  "startUrls": [
    {
      "url": "https://www.immoscoop.be/zoeken/te-koop/gent"
    }
  ],
  "listingType": "sale",
  "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": [
        {
            "url": "https://www.immoscoop.be/zoeken/te-koop/gent"
        }
    ],
    "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/immoscoop-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": [{ "url": "https://www.immoscoop.be/zoeken/te-koop/gent" }],
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "BE",
    },
}

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

```

## MCP server setup

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