# European Real Estate Scraper & Price Alerts (`polunga/europe-real-estate-scraper`) Actor

Scrape listings from Immoweb, SeLoger, Immowelt and other European property portals into one dataset: price, m², price per m², rooms, city, photos. Schedule it to catch new listings and price drops.

- **URL**: https://apify.com/polunga/europe-real-estate-scraper.md
- **Developed by:** [jérémy PINSON](https://apify.com/polunga) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 listings

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

## European Real Estate Scraper & Price Alerts: Immoweb, SeLoger, Immowelt (beta)

**European Real Estate Scraper** turns the **search results URLs** of European property portals into **one unified dataset**: price, surface, **price per m²**, rooms, bedrooms, city, GPS, photos and link. Schedule it to get **new listings and price drops**, with a **price history** for every property.

Instead of one scraper per site, it reads the structured data that modern portals embed in their pages, so the same engine works across several portals and keeps working when the page design changes.

### Supported portals (tested October 2026)

| Portal | Country | Status |
|---|---|---|
| Immoweb | Belgium | ✅ ~30 listings per page, pagination with `page` |
| SeLoger | France | ✅ ~30 listings per page, pagination with `page` |
| Immowelt | Germany | ✅ ~30 listings per page, pagination with `page` |
| Funda | Netherlands | ✅ 15 listings per page (pagination not tested yet), but blocks an IP after a few requests: keep residential proxies on |
| Idealista | Spain, Italy, Portugal | ❌ blocked (HTTP 403 + captcha) without residential proxies |

Another portal? Open an issue with a search URL and a dedicated parser will be added.

### Features

- 🏠 **One schema for every portal**, ready for spreadsheets, dashboards or a CRM.
- 📉 **Alerts**: `NEW`, `PRICE_DROP`, `PRICE_UP`, plus `priceHistory` and `firstSeen` per listing.
- 💶 **Price per m²** computed for every listing.
- 🔁 **Pay only for changes** with *Output only changes* on a daily schedule.

### Who is it for?

- **Property investors and buyers**: be the first to see new listings and price drops in your area.
- **Real estate agents**: watch the competition and the market in your city.
- **Analysts and proptech teams**: build price-per-m² datasets across countries.

### How much does it cost?

You pay **$1.50 per 1,000 listings** in the output (see the *Pricing* tab for the exact price).

| Use case | Listings | Cost |
|---|---|---|
| Test one search page | 30 | $0.05 |
| Baseline of a city search, 5 pages | 150 | $0.23 |
| Daily alert with *Output only changes* | usually a few per day | a few cents per week |

### How to scrape property listings

1. Open the portal, set your filters (city, budget, property type), copy the **results page URL**.
2. Paste one or more URLs. Several portals can be mixed in one run.
3. Keep the pagination parameter (`page` works for all tested portals).
4. Run once for the baseline, then [schedule](https://docs.apify.com/platform/schedules) it daily.
5. Get alerts with a webhook, Slack, email or Google Sheets [integration](https://docs.apify.com/platform/integrations).

```json
{
    "searchUrls": [{ "url": "https://www.immoweb.be/fr/recherche/maison/a-vendre?countries=BE&page=1" }],
    "maxPagesPerSearch": 5,
    "trackChanges": true,
    "onlyChanges": true
}
```

### Output

```json
{
    "portal": "immoweb",
    "listingId": "20123456",
    "title": "Appartement 2 chambres",
    "price": 289000,
    "surface": 85,
    "pricePerM2": 3400,
    "rooms": 3,
    "bedrooms": 2,
    "city": "Bruxelles",
    "postalCode": "1050",
    "changeType": "PRICE_DROP",
    "previousPrice": 299000,
    "priceHistory": [{ "date": "2026-10-01", "price": 299000 }, { "date": "2026-10-27", "price": 289000 }],
    "url": "https://www.immoweb.be/fr/annonce/..."
}
```

Download it as Excel, CSV or JSON, or read it with the [Apify API](https://docs.apify.com/api/v2).

### FAQ

**Do I need proxies?** Immoweb, SeLoger and Immowelt worked without proxies in our tests. Funda and Idealista block datacenter IPs: keep the default residential proxies.

**Why did a run return nothing?** Some portals render results only in the browser or use aggressive anti-bot protection. The run log tells you when it happens: open an issue with the URL.

**Is it legal?** The Actor reads public listing pages without login. Check the portal's terms for your use case, and avoid storing personal data of private sellers.

### Status

This Actor is in **beta**. Feedback is very welcome in the **Issues** tab, I usually reply within 24 h.

# Actor input Schema

## `searchUrls` (type: `array`):

Set your filters on the portal (city, price, type...) and paste the results page URL. Several portals can be mixed.

## `maxPagesPerSearch` (type: `integer`):

Result pages to follow for each search URL.

## `pageParam` (type: `string`):

URL parameter the portal uses for pagination (page, p, pagina, pg...).

## `maxListings` (type: `integer`):

Upper limit for the whole run.

## `trackChanges` (type: `boolean`):

Keeps a price history per listing and flags NEW, PRICE_DROP and PRICE_UP on later runs.

## `onlyChanges` (type: `boolean`):

Skip unchanged listings (the first run always outputs everything).

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

Most portals block datacenter IPs. Residential proxies are strongly recommended.

## Actor input object example

```json
{
  "searchUrls": [
    {
      "url": "https://www.immoweb.be/fr/recherche/maison/a-vendre?countries=BE&page=1"
    }
  ],
  "maxPagesPerSearch": 1,
  "pageParam": "page",
  "maxListings": 1000,
  "trackChanges": true,
  "onlyChanges": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Property listings with price, surface, price per m², rooms, location, photos and price changes since the last run, shown in the overview table.

# 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 = {
    "searchUrls": [
        {
            "url": "https://www.immoweb.be/fr/recherche/maison/a-vendre?countries=BE&page=1"
        }
    ],
    "maxPagesPerSearch": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("polunga/europe-real-estate-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 = {
    "searchUrls": [{ "url": "https://www.immoweb.be/fr/recherche/maison/a-vendre?countries=BE&page=1" }],
    "maxPagesPerSearch": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("polunga/europe-real-estate-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 '{
  "searchUrls": [
    {
      "url": "https://www.immoweb.be/fr/recherche/maison/a-vendre?countries=BE&page=1"
    }
  ],
  "maxPagesPerSearch": 1
}' |
apify call polunga/europe-real-estate-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,polunga/europe-real-estate-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/A75KBbLZriqj24Z6Y/builds/C83emD6cqKbF43XR3/openapi.json
