# ImmobilienScout24 Scraper - Germany Real Estate (`haketa/immobilienscout24-scraper`) Actor

ImmobilienScout24 scraper & API for German real estate: search apartments & houses for rent & buy and export price, m², rooms, energy class, address, GPS, agent-vs-private and price drops. Germany property market data and real-estate lead generation — fast, no login.

- **URL**: https://apify.com/haketa/immobilienscout24-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Real estate, Lead generation
- **Features:** Limited permissions
- **Stats:** 16 total users, 5 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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?

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

## ImmobilienScout24 Scraper 🇩🇪 — Germany Real Estate Data (Rent & Buy)

> **Extract structured German real-estate listings from [ImmobilienScout24 (immobilienscout24.de)](https://www.immobilienscout24.de/) — Germany's #1 property marketplace — without writing code.** This **ImmobilienScout24 scraper** lets you **scrape ImmobilienScout24** apartments (*Wohnungen*) and houses (*Häuser*), **for rent (*mieten*) and for sale (*kaufen*)**, with full property intelligence: price, Warmmiete/Kaltmiete, living space (`m²`), rooms, **energy efficiency class (*Energieausweis*)**, GPS coordinates, high-res photos, agent contact, **private-seller vs. agency (*Makler*) detection**, and **price-drop signals (*Preissenkung*)**.

Export every result to **JSON, CSV, Excel, or API** with **1,000+ results pagination** unlocked.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/immobilienscout24-scraper)
[![Region](https://img.shields.io/badge/Region-Germany%20%F0%9F%87%A9%F0%9F%87%AA-black)]()
[![Data](https://img.shields.io/badge/Data-Rent%20%26%20Buy%20Listings-success)]()
[![Signals](https://img.shields.io/badge/Signals-Private%20FSBO%20%26%20Price%20Drops-orange)]()
[![Proxy](https://img.shields.io/badge/Proxy-Datacenter%20Ready-brightgreen)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%C2%B7%20CSV%20%C2%B7%20Excel-lightgrey)]()

***

### ⚡ At a glance

| Feature | Details |
| :--- | :--- |
| **Target Platform** | [ImmobilienScout24.de](https://www.immobilienscout24.de/) (ImmoScout24 Germany) |
| **Listing Types** | Apartments for Rent (`wohnung-mieten`), Apartments for Sale (`wohnung-kaufen`), Houses for Rent (`haus-mieten`), Houses for Sale (`haus-kaufen`) |
| **Core Fields** | Scout ID, URL, Title, Price (€), Living Space (`m²`), Rooms, Address, GPS Coordinates (`latitude`/`longitude`), Photos |
| **Detail Enrichment** | `baseRent` (Kaltmiete), `totalRent` (Warmmiete), `serviceCharge` (Nebenkosten), `pricePerSqm`, Year Built, Condition, Heating, Energy Class, Amenities, Agent Name & Company |
| **Lead-Gen Signals** | **Private vs. Agency (`isPrivate` / `onlyPrivate`)** + **Price Reduction Detection (`priceReduced`, `originalPrice`, `reductionPercentage`)** |
| **Search Inputs** | 34-City German Dropdown + Transaction/Property Selectors OR Custom `startUrls` (`/Suche/de/...`) |
| **Pagination & Scale** | Automatic multi-page extraction (**50 listings/page**, **1,000+ listings** per run, deduplicated by Scout ID) |
| **Export Formats** | JSON, CSV, Excel (XLSX), XML, HTML, RSS, and Apify REST API |

***

### 📋 Table of contents

- [Why scrape ImmobilienScout24?](#-why-scrape-immobilienscout24)
- [What this ImmobilienScout24 scraper does](#-what-this-immobilienscout24-scraper-does)
- [Use cases](#-use-cases)
- [Input configuration](#-input-configuration)
- [Output sample & field reference](#-output-sample--field-reference)
- [Private vs. agency & price drops](#-private-vs-agency--price-drops)
- [Pagination & 1,000+ scale](#-pagination--1000-scale)
- [How to use](#️-how-to-use)
- [Tips for German property data](#-tips-for-german-property-data)
- [Honest limitations](#-honest-limitations)
- [FAQ](#-faq)
- [Related scrapers](#-related-scrapers)
- [Changelog](#-changelog)

***

### 🔎 Why scrape ImmobilienScout24?

**ImmobilienScout24 (IS24)** is the undisputed real-estate market leader in Germany, hosting over one million active residential listings across Berlin, Munich, Hamburg, Cologne, Frankfurt, Stuttgart, Düsseldorf, Leipzig, and every German *Bundesland*. It is the primary source of live German housing intelligence: asking rents (*Kaltmiete* and *Warmmiete*), purchase prices per square meter, building energy efficiency ratings, and seller classification.

Collecting German property data manually is slow and error-prone. Listings rotate constantly, major cities span dozens of pagination pages, and key metrics like *Nebenkosten*, *Baujahr*, energy demand, and price reductions live inside individual exposé views. This **ImmobilienScout24 data extractor** automates both search pagination and exposé enrichment into one structured dataset.

**Common reasons teams scrape ImmobilienScout24:**

- 📈 **Track Rent & Purchase Price per m²** — monitor *Kaltmiete*, *Warmmiete*, and purchase prices across German cities, districts (*Bezirke*), and postal codes.
- 🏷️ **Spot Price Drops (*Preissenkung*) Early** — identify motivated sellers and discounted investment properties using `priceReduced`, `originalPrice`, and `reductionPercentage`.
- 🧑‍💼 **Source Off-Market Private Seller Leads (FSBO)** — filter with `onlyPrivate: true` to extract listings posted directly by private owners (*privater Anbieter*) without a broker (*Makler*).
- 🏢 **Monitor Competitor Broker Inventory** — track which real-estate agencies (`agentCompany`, `agentName`) dominate specific German neighborhoods.
- 🗺️ **Geospatial & Yield Screening** — map active supply by exact `latitude` and `longitude` coordinates and compare asking rents against purchase prices.
- 🤖 **PropTech & Automated Valuation Models (AVM)** — feed clean German real-estate attributes (living space, year built, condition, heating type, energy class) into valuation pipelines.

***

### ✨ What this ImmobilienScout24 scraper does

- ✅ **All 4 Major Residential Categories** — scrapes **apartments for rent** (*Wohnung mieten*), **apartments for sale** (*Wohnung kaufen*), **houses for rent** (*Haus mieten*), and **houses for sale** (*Haus kaufen*).
- ✅ **34-City German Dropdown + Custom URLs** — pick any major German city from the dropdown, or paste any number of `/Suche/de/...` URLs from your browser (including district-level searches) into `startUrls`.
- ✅ **Deep 1,000+ Pagination** — automatically determines `totalResults` and `numberOfPages` (50 listings per page) and paginates until your `maxItems` target is reached.
- ✅ **Strict Deduplication by Scout ID** — tracks every exposé ID across pages and multiple search URLs so duplicate listings are never saved.
- ✅ **Full Exposé Enrichment (`includeDetails`)** — extracts *Kaltmiete* (`baseRent`), *Warmmiete* (`totalRent`), *Nebenkosten* (`serviceCharge`), *Kaution* (`deposit`), `pricePerSqm`, `bedrooms`, `bathrooms`, `floor`, `yearBuilt`, `condition`, `interiorQuality`, `heatingType`, `energySource`, `energyEfficiencyClass`, `availableFrom`, `pets`, `features`, `description`, and `agentName` / `agentCompany`.
- ✅ **Private Seller Filter (`onlyPrivate`)** — optionally skip agency listings and collect only private-owner properties, automatically scaling pagination depth so your target item count is still met.
- ✅ **High-Resolution Usable Photo URLs** — resolves dynamic image dimension placeholders into ready-to-load `800x600` WebP/JPEG URLs.

***

### 🎯 Use cases

- **🏢 German Real-Estate Brokers (*Makler*)** — run daily scheduled scrapes with `onlyPrivate: true` in your target city to discover private owners selling or renting without an agent.
- **📊 PropTech & Market Analysts** — benchmark *Mietspiegel* trends, energy-class price premiums (`A+` vs `F/G`), and new-build (*Erstbezug*) supply across Germany's top 34 cities.
- **🎯 B2B Lead Generation Teams** — build verified directories of active German property agencies (`agentCompany`) and individual agents (`agentName`) along with their live portfolio size.
- **🏦 Real-Estate Investors & Family Offices** — screen thousands of apartments and multi-family houses for high gross rental yields and flagged price reductions (`priceReduced: true`).
- **🏗️ Relocation & Corporate Housing Providers** — aggregate available apartments in Berlin, Munich, or Frankfurt matching client room and budget criteria.

***

### 📥 Input configuration

Start with the built-in city and property dropdowns, or paste one or more ImmobilienScout24 search URLs for custom districts. Running with an empty input `{}` returns a fast, diverse 100-listing sample across 8 German cities.

| Field | Type | Default / Prefill | Description |
| :--- | :--- | :--- | :--- |
| `region` | `string` | Prefill: `"/de/berlin/berlin"` | Select a German city/region from the 34-city dropdown (e.g., Berlin, Hamburg, Munich, Cologne, Frankfurt). Ignored when `startUrls` is provided. |
| `transactionType` | `string` | Prefill: `"rent"` | Choose `"rent"` (*mieten*) or `"buy"` (*kaufen*). |
| `propertyType` | `string` | Prefill: `"apartment"` | Choose `"apartment"` (*Wohnung*) or `"house"` (*Haus*). |
| `startUrls` | `array` | Prefill: Berlin rent URL | Optional power-user list of `immobilienscout24.de/Suche/de/...` URLs. Extracts region and listing type directly from each URL. Overrides the dropdowns above when set. |
| `maxItems` | `integer` | Default: `0` (Prefill: `100`) | Maximum number of listings to collect across all searches. `0` = no limit (collects all available listings, up to thousands per city). |
| `includeDetails` | `boolean` | `true` | Fetch each listing's exposé detail view to add *Warmmiete*, *Nebenkosten*, year built, heating, features, agent info, and price-drop metrics. Disable for ultra-fast search-only runs. |
| `onlyPrivate` | `boolean` | `false` | Save only listings from private owners (`isPrivate: true`), skipping real-estate agencies (*Makler*). |
| `proxyConfiguration` | `object` | `{ "useApifyProxy": true }` | Apify Proxy configuration. Default datacenter proxies work out of the box. |
| `maxConcurrency` | `integer` | `8` (1–30) | Maximum parallel requests. |

#### Example 1 — Apartments for rent in Berlin with full exposé details

```json
{
  "startUrls": [
    { "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten" }
  ],
  "maxItems": 500,
  "includeDetails": true,
  "onlyPrivate": false,
  "proxyConfiguration": { "useApifyProxy": true },
  "maxConcurrency": 8
}
```

#### Example 2 — 1,000+ multi-city pull (Munich, Hamburg & Frankfurt apartments for sale)

```json
{
  "startUrls": [
    { "url": "https://www.immobilienscout24.de/Suche/de/bayern/muenchen/wohnung-kaufen" },
    { "url": "https://www.immobilienscout24.de/Suche/de/hamburg/hamburg/wohnung-kaufen" },
    { "url": "https://www.immobilienscout24.de/Suche/de/hessen/frankfurt-am-main/wohnung-kaufen" }
  ],
  "maxItems": 1500,
  "includeDetails": true
}
```

#### Example 3 — Off-market FSBO private sellers only (`onlyPrivate: true`)

```json
{
  "region": "/de/nordrhein-westfalen/koeln",
  "transactionType": "buy",
  "propertyType": "apartment",
  "onlyPrivate": true,
  "includeDetails": true,
  "maxItems": 200
}
```

***

### 📤 Output sample & field reference

Each scraped property is stored as a structured JSON object. Below is a real record from a Berlin apartment rental run featuring a detected price drop:

```json
{
  "id": "164121835",
  "url": "https://www.immobilienscout24.de/expose/164121835",
  "title": "Möbliertes Studio Standard mit Gemeinschaftsflächen: Padelplatz, Fitness, Dachterrasse & mehr",
  "realEstateType": "apartmentrent",
  "priceLabel": "1.039 €",
  "price": 1039,
  "livingSpace": "28 m²",
  "livingSpaceValue": 28,
  "rooms": "1 Zi.",
  "roomsValue": 1,
  "energyEfficiencyClass": "B",
  "isPrivate": false,
  "advertiserType": "agency",
  "isNewObject": false,
  "isProject": false,
  "published": "vor einem Jahr",
  "address": "Buschkrugallee 64, 12359 Berlin, Britz (Neukölln)",
  "latitude": 52.45779,
  "longitude": 13.4465,
  "titlePicture": "https://pictures.immobilienscout24.de/listings/01b80b4a-1989-4e16-b254-3ee94ee26b59-2116214270.png/ORIG/resize/800x600>/format/webp/quality/80",
  "pictures": [
    "https://pictures.immobilienscout24.de/listings/01b80b4a-1989-4e16-b254-3ee94ee26b59-2116214270.png/ORIG/legacy_thumbnail/800x600/format/webp/quality/80"
  ],
  "listingType": "XL",
  "priceReduced": true,
  "scrapedAt": "2026-11-10T02:30:00.000Z",
  "baseRent": "1.039 €",
  "totalRent": "1.190 €",
  "serviceCharge": "76 €",
  "pricePerSqm": "37,11 €/m²",
  "bedrooms": "1",
  "bathrooms": "1",
  "yearBuilt": "2026",
  "condition": "Erstbezug",
  "heatingType": "Fußbodenheizung",
  "energySource": "Fernwärme",
  "pets": "Ja",
  "agentName": "Frau Beata Sanders",
  "agentCompany": "Momento Berlin",
  "features": ["Balkon/Terrasse", "Personenaufzug", "Einbauküche"],
  "description": "Objektbeschreibung Kontaktieren Sie uns jetzt...",
  "originalPrice": "1.139 €",
  "reductionPercentage": "-9 %",
  "details": {
    "Kaltmiete": "1.039 €",
    "Nebenkosten": "76 €",
    "Gesamtmiete": "1.190 €",
    "Baujahr": "2026"
  }
}
```

#### 🗂️ Field reference & coverage table

##### 🏠 Core Property & Pricing Fields (Search & Detail)

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `id` | `string` | 🟢 High (100%) | Unique ImmobilienScout24 Scout-ID. |
| `url` | `string` | 🟢 High (100%) | Direct link to the public exposé page on `immobilienscout24.de`. |
| `title` | `string` | 🟢 High (100%) | Property listing headline. |
| `realEstateType` | `string` | 🟢 High (100%) | Category code: `apartmentrent`, `apartmentbuy`, `houserent`, or `housebuy`. |
| `price` | `number` | 🟢 High (100%) | Parsed numeric price in EUR (rent or purchase price). |
| `priceLabel` | `string` | 🟢 High (100%) | Formatted German price string (e.g., `1.039 €`). |
| `livingSpace` / `livingSpaceValue` | `string` / `number` | 🟢 High (100%) | Living area formatted (`28 m²`) and numeric (`28`). |
| `rooms` / `roomsValue` | `string` / `number` | 🟢 High (100%) | Room count formatted (`2,5 Zi.`) and numeric (`2.5`). |
| `isPrivate` / `advertiserType` | `boolean` / `string` | 🟢 High (100%) | Identifies private owners (`true` / `"private"`) vs. agencies (`false` / `"agency"`). |
| `isNewObject` / `isProject` | `boolean` | 🟢 High (100%) | Flags for newly constructed properties or multi-unit development projects. |
| `published` | `string` | 🟢 High (100%) | Relative publication age (e.g., `"vor 2 Stunden"`, `"vor 3 Tagen"`). |
| `listingType` | `string` | 🟢 High (100%) | IS24 placement tier (`S`, `M`, `L`, `XL`, `PROJECT`). |

##### 📍 Location & Media Fields

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `address` | `string` | 🟢 High (100%) | Street, postal code, city, and district (or district-only when the seller hides the street number). |
| `latitude` / `longitude` | `number` | 🟢 High (~87%) | Exact WGS84 GPS coordinates when street-level address is disclosed by the seller. |
| `titlePicture` | `string` | 🟢 High (~99%) | Cover image URL. |
| `pictures` | `array` | 🟢 High (~99%) | Array of high-resolution `800x600` property photo URLs. |

##### 🔍 Rich Exposé Detail Fields (`includeDetails: true`)

| Field | Type | Coverage | Description |
| :--- | :--- | :--- | :--- |
| `baseRent` / `totalRent` | `string` | 🟢 High (Rentals) | *Kaltmiete* (cold rent) and *Warmmiete* / *Gesamtmiete* (total rent). |
| `serviceCharge` / `deposit` | `string` | 🟡 Conditional | *Nebenkosten* (ancillary costs) and *Kaution* (security deposit). |
| `pricePerSqm` | `string` | 🟡 Conditional | Price per square meter (`Preis/m²`). |
| `bedrooms` / `bathrooms` | `string` | 🟡 Conditional | Number of *Schlafzimmer* and *Badezimmer*. |
| `floor` / `apartmentType` | `string` | 🟡 Conditional | Floor level (*Etage*) and apartment sub-type (*Dachgeschoss*, *Erdgeschoss*, *Maisonette*). |
| `plotArea` | `string` | 🟡 Conditional | Land plot area (*Grundstücksfläche*, primarily on house listings). |
| `yearBuilt` / `condition` | `string` | 🟢 High (~80%) | Construction year (*Baujahr*) and property state (*Erstbezug*, *gepflegt*, *saniert*). |
| `interiorQuality` / `heatingType` | `string` | 🟡 Conditional | *Qualität der Ausstattung* and heating system (*Fußbodenheizung*, *Zentralheizung*). |
| `energyEfficiencyClass` | `string` | 🟡 Conditional | Official German energy rating (`A+`, `A`, `B`, `C`, `D`, `E`, `F`, `G`, `H`). |
| `energySource` / `energyDemand` / `energyConsumption` | `string` | 🟡 Conditional | *Wesentliche Energieträger*, *Endenergiebedarf*, or *Endenergieverbrauch*. |
| `availableFrom` / `pets` | `string` | 🟡 Conditional | Move-in availability (*Bezugsfrei ab*) and pet policy (*Haustiere*). |
| `features` | `array` | 🟢 High (~90%) | Array of amenity checkmarks (e.g., `["Balkon/Terrasse", "Einbauküche", "Personenaufzug", "Keller"]`). |
| `description` | `string` | 🟢 High (~98%) | Full combined German property description (*Objektbeschreibung*, *Ausstattung*, *Lage*). |
| `agentName` / `agentCompany` | `string` | 🟢 High (~95%) | Contact person and real-estate agency name. |
| `priceReduced` | `boolean` | 🟢 High (100%) | `true` when IS24 flags an active price drop on the listing. |
| `originalPrice` / `reductionPercentage` | `string` | 🟡 Conditional | Previous asking price and percentage discount (populated when `priceReduced: true`). |
| `details` | `object` | 🟢 High (100%) | Raw German key-value attribute dictionary from the exposé. |

***

### 🏷️ Private vs. agency & price drops

Two high-margin intelligence signals included out of the box:

1. **Private Sellers vs. Agencies (*Makler*)**
   Every record includes `isPrivate: true/false` and `advertiserType: "private" | "agency"`. Enabling `onlyPrivate: true` filters out all commercial brokers and automatically increases pagination depth by 6× so your run collects a deep dataset of pure private-owner listings.
2. **Price-Drop Detection (*Preissenkung*)**
   When a seller lowers the asking price on ImmobilienScout24, `priceReduced` turns `true` and the scraper captures both `originalPrice` (e.g., `"1.139 €"`) and `reductionPercentage` (e.g., `"-9 %"`).

***

### 🔁 Pagination & 1,000+ scale

- **50 Listings per Search Page** — page 1 reports the exact `totalResults` and `numberOfPages` for your city or URL, then queues pages `2..N` automatically.
- **1,000+ Multi-Page & Multi-City Scale** — set `maxItems: 1000` (or `0` for unlimited) to extract thousands of properties from major markets like Berlin (~6,000+ listings) or across multiple `startUrls`.
- **Global Deduplication** — an in-memory `seenIds` set ensures 0% duplicate Scout IDs across all pages and searches.
- **Smart Empty-Run Diversity** — when launched with no parameters (`{}`), the actor samples across 8 German cities and both rent/buy categories (`EMPTY_RUN_CAP = 100`), while honoring any explicit `maxItems > 100` without per-city clamping.

***

### ⚙️ How to use

1. Open **[ImmobilienScout24 Scraper](https://apify.com/haketa/immobilienscout24-scraper)** in Apify Console.
2. **Choose a location**: either pick a city from the **City / Region** dropdown (plus **Rent or Buy** and **Apartment or House**), or paste one or more `/Suche/de/...` URLs into **Start URLs**.
3. Set **Max items** (e.g., `100` for a quick test, `1000` for a deep city pull, or `0` for all listings).
4. Choose whether to keep **Scrape full listing details** (`includeDetails`) enabled.
5. Click **Start** and export your results to **JSON, CSV, Excel, or API**.

***

### 💡 Tips for German property data

- **Use `includeDetails: false` for ultra-fast market scans** — if you only need price, `m²`, rooms, GPS coordinates, and private-vs-agency flags for 5,000 listings, disabling `includeDetails` fetches 50 listings per request and finishes in seconds.
- **Combine district URLs in `startUrls`** — paste multiple neighborhood URLs (e.g., Berlin-Mitte, Kreuzberg, Charlottenburg) into `startUrls` to build a custom multi-district feed in one run.
- **Schedule daily runs for FSBO lead generation** — combine `onlyPrivate: true` with an Apify Schedule and a webhook to alert your sales team whenever new private listings appear.

***

### ⚠️ Honest limitations

- **Germany (`immobilienscout24.de`) Only** — this actor targets the German portal; Austrian (`.at`) and Swiss (`.ch`) portals use different backends.
- **Seller-Hidden Street Numbers** — when a seller chooses *"Adresse nicht veröffentlichen"* on IS24, `address` contains only the postal code, city, and district, and `latitude`/`longitude` are omitted by the platform (~13% of listings).
- **Phone Numbers** — direct phone numbers are gated behind interactive contact forms on IS24; the actor extracts `agentName`, `agentCompany`, and the direct `url`.

***

### ❓ FAQ

#### How many listings can I scrape per run?

There is no hard limit. Setting `maxItems: 0` (or `1000`, `5000`, etc.) paginates through all available result pages (50 listings per page) until the search is exhausted or your target is reached.

#### Do I need residential proxies or an ImmobilienScout24 account?

No account or login is ever required, and standard Apify **datacenter proxies** (enabled by default) work reliably and cost-effectively.

#### How does `onlyPrivate: true` affect pagination?

Because private sellers typically represent 10–20% of German listings, enabling `onlyPrivate: true` automatically scales up the number of search pages scanned so you still reach your requested `maxItems`.

#### Can I scrape commercial properties (*Gewerbe*) or land plots (*Grundstücke*)?

The dropdown builder and URL parser focus on the four core residential categories (`wohnung-mieten`, `wohnung-kaufen`, `haus-mieten`, `haus-kaufen`).

#### What export formats are available?

Dataset items can be downloaded as **JSON, CSV, Excel (XLSX), XML, HTML, or RSS**, or consumed programmatically via the **Apify REST API**, Python/Node.js SDKs, Make, Zapier, n8n, and Google Sheets.

#### How can I run the scraper from Python or Node.js?

You can trigger runs and stream dataset items using the official `apify-client` SDKs or standard HTTP requests.

##### Python API Example

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("haketa/immobilienscout24-scraper").call(run_input={
    "region": "/de/berlin/berlin",
    "transactionType": "rent",
    "propertyType": "apartment",
    "maxItems": 500,
    "includeDetails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['id']} | {item['title']} | {item['price']} € | {item['livingSpace']} | {item['address']}")
```

##### JavaScript / Node.js API Example

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/immobilienscout24-scraper').call({
    region: '/de/bayern/muenchen',
    transactionType: 'buy',
    propertyType: 'apartment',
    maxItems: 500,
    includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Saved ${items.length} ImmobilienScout24 listings.`);
```

***

### 🔌 Integrations & automated property monitoring

| Integration | Real-Estate Automation Workflow |
| :--- | :--- |
| **Google Sheets** | Sync new Berlin, Munich, or Hamburg listings directly into a collaborative deal-screening spreadsheet. |
| **Make / Zapier / n8n** | Trigger instant CRM lead creation when a private seller (`isPrivate: true`) or price reduction (`priceReduced: true`) is detected. |
| **Slack / Email Alerts** | Schedule hourly runs and alert acquisition teams when apartments below a target `pricePerSqm` hit the market. |
| **PostgreSQL / BigQuery** | Ingest weekly multi-city snapshots to track German rental indices (*Mietspiegel*) and energy-label pricing trends. |

***

### 🔗 Related scrapers

Explore our other European & global real-estate scrapers on Apify:

- [Funda.nl Scraper — Netherlands Real Estate](https://apify.com/haketa/funda-scraper)
- [Willhaben.at Scraper — Austria Real Estate & Marketplace](https://apify.com/haketa/willhaben-scraper)
- [Otodom.pl Scraper — Poland Real Estate](https://apify.com/haketa/otodom-scraper)
- [Hemnet.se Scraper — Sweden Real Estate](https://apify.com/haketa/hemnet-scraper)
- [Boliga.dk Scraper — Denmark Real Estate](https://apify.com/haketa/boliga-scraper)
- [Daft.ie Scraper — Ireland Real Estate](https://apify.com/haketa/daft-scraper)

***

### 📋 Changelog

#### v1.2 (2026-11) — Unlocked 1,000+ Pagination, Global Deduplication & Deep FSBO Scaling

- **Unlocked 1,000+ Deep Pagination**: Removed per-search sample clamping when `maxItems > 100` so high-volume runs (`1,000+` listings) paginate smoothly across all available pages and cities.
- **Global Scout-ID Deduplication**: Added cross-page and cross-URL `seenIds` deduplication in the search handler, guaranteeing 0% duplicate listings.
- **Smart `onlyPrivate` Page Scaling**: Automatically scales search page depth by 6× when `onlyPrivate: true` is enabled so FSBO lead-generation runs reach their full target count.
- **Documentation Upgrade**: Added `⚡ At a glance` summary, emoji-grouped field tables with coverage indicators, and inline changelog.

#### v1.1 (2026-10) — German Locale Pinning & Image URL Normalization

- Forced `de-DE` locale headers so prices, square meters, and attribute labels parse identically regardless of proxy exit region.
- Resolved `%WIDTH%x%HEIGHT%` image URL placeholders to ready-to-use `800x600` URLs.

#### v1.0 (2026-06) — Initial Release

- Initial release with 34-city German dropdown, `startUrls` parser, exposé detail enrichment, private-seller detection, and price-drop signals.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/immobilienscout24-scraper/changelog.md

# Actor input Schema

## `region` (type: `string`):

Pick the German city or region you want listings from. This is the easiest way to start — just choose a location and run. To scrape a very specific search, use the optional Start URLs field below instead.

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

Choose whether you want listings for rent or for sale.

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

Choose the type of property you want to scrape.

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

Power-user option. Paste one or more immobilienscout24.de search-result URLs from your browser (e.g. https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten). The region and listing type are read straight from each URL, letting you combine several cities or filters in one run. When provided, the City/Region, Rent/Buy and Apartment/House selectors above are ignored. Leave empty to just use the dropdowns.

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

Maximum number of listings to scrape across all searches. Use 0 for no limit (large cities can have thousands). A run with no filters returns a fast, mixed sample of about 100 listings.

## `includeDetails` (type: `boolean`):

Fetch each listing's detail page (one extra request per listing) to add Warmmiete/Nebenkosten, year built, condition, heating, full feature list, description, agent contact and PRICE-DROP detection. Disable for a faster, cheaper, search-only run.

## `onlyPrivate` (type: `boolean`):

Save only listings from private owners (privater Anbieter), skipping real-estate agents (Makler). Ideal for off-market lead generation.

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

Rotating Apify proxies keep large runs smooth and avoid rate limits. The default works out of the box.

## `maxConcurrency` (type: `integer`):

Maximum parallel requests.

## Actor input object example

```json
{
  "region": "/de/berlin/berlin",
  "transactionType": "rent",
  "propertyType": "apartment",
  "startUrls": [
    {
      "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
    }
  ],
  "maxItems": 100,
  "includeDetails": true,
  "onlyPrivate": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8
}
```

# Actor output Schema

## `listings` (type: `string`):

All listings collected during the run.

## `runUrl` (type: `string`):

Open this run in the Apify Console.

# 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 = {
    "region": "/de/berlin/berlin",
    "transactionType": "rent",
    "propertyType": "apartment",
    "startUrls": [
        {
            "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
        }
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/immobilienscout24-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 = {
    "region": "/de/berlin/berlin",
    "transactionType": "rent",
    "propertyType": "apartment",
    "startUrls": [{ "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten" }],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/immobilienscout24-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 '{
  "region": "/de/berlin/berlin",
  "transactionType": "rent",
  "propertyType": "apartment",
  "startUrls": [
    {
      "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
    }
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/immobilienscout24-scraper --silent --output-dataset

```

## MCP server setup

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