# ImmoScout24 ImmobilienScout24 Scraper (API) Pro - 50+ Felder (`clearpath/immoscout24-api-pro`) Actor

Über 1.000 ImmoScout24-Inserate pro Minute mit 50+ Datenfeldern: Maklerkontakte, Telefonnummern, Preise, Investment- & Energiedaten, Grundrisse & Bilder. Wohnungen, Häuser & Gewerbe zum Mieten und Kaufen, deutschlandweit. Monitor-Modus mit Telegram-Alerts. Export als CSV, JSON oder Excel.

- **URL**: https://apify.com/clearpath/immoscout24-api-pro.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 300 total users, 63 monthly users, 82.4% runs succeeded, 10 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 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

## ImmoScout24 API Pro

[![Der schnellste ImmoScout24-Scraper am Markt. 1.000 Inserate pro Minute. Maklerkontakte. Kaufnebenkosten. Energiedaten.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/immoscout24-api-pro-readme-hero-c9eee5c06f9b.png)](https://console.apify.com/actors/s609dyAJSrju54QSh/input)

Von **Clearpath**, den Entwicklern der [Kleinanzeigen-Immobilien-Scraper](https://apify.com/clearpath/kleinanzeigen-immobilien-api-pro) und von [Immobilien Export Pro](https://apify.com/clearpath/immobilien-export-pro). Eine spezialisierte Suite für Immobiliendaten von ImmoScout24 und Kleinanzeigen.

### Warum diesen Actor wählen?

**Der schnellste ImmoScout24-Scraper am Markt: 1.000 Inserate pro Minute.** Übernimm deine Suchfilter direkt aus einer ImmoScout24-Such-URL und exportiere die Ergebnisse als JSON, CSV oder Excel. Für Marktanalysen, die mehr als eine Handvoll Inserate brauchen.

**50+ Datenfelder mit konkretem Mehrwert.** Neben Beschreibungen und Grundrissen erhältst du verfügbare Maklerkontakte mit Telefonnummern, Energiedaten und bei Kaufobjekten eine Aufschlüsselung der Kaufnebenkosten: Provision, Notar, Grunderwerbsteuer und Grundbuch. Kaufpreisfaktor und Vergleichspreise ergänzen die Bewertung, wenn die nötigen Angaben vorliegen.

**Große Suchen und neue Angebote.** Exportiere alle verfügbaren Seiten deiner Suche oder starte auf einer bestimmten Seite weiter. Im Monitor-Modus erhältst du neue Inserate seit dem letzten Lauf, auf Wunsch mit Telegram-Benachrichtigungen. Dein Kostenlimit kontrolliert das Budget.

<a href="https://console.apify.com/actors/s609dyAJSrju54QSh/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/immoscout24-api-pro-readme-cta-63ff170faa44.svg" width="246" height="48" alt="Eigene ImmoScout24-Suche testen"/></a>

### Mit deiner Suche starten

Das Beispiel lädt eine Ergebnisseite mit Eigentumswohnungen in Berlin. Ersetze die URL durch deine eigene ImmoScout24-Suche, inklusive der gewünschten Filter.

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen"
  ],
  "pageLimit": 1,
  "monitorMode": false
}
```

[Actor-Eingabe öffnen](https://console.apify.com/actors/s609dyAJSrju54QSh/input) und die Such-URL einfügen. Mit `pageLimit: 0` werden alle verfügbaren Seiten gesammelt; lege vorher dein maximales Run-Budget fest. `startPage` erlaubt den Einstieg auf einer späteren Seite.

Abgerechnet wird pro Ergebnis gemäß [Preisliste](https://apify.com/clearpath/immoscout24-api-pro/pricing). Telefonnummern, Grundrisse und Finanzangaben werden übernommen, soweit sie im jeweiligen Inserat veröffentlicht sind. Je nach Immobilientyp unterscheiden sich die verfügbaren Felder.

<table>
<tr>
<td style="background:#3DF5DD;color:#333333;padding:10px 14px;font-size:13px;font-weight:700;border-radius:4px 4px 0 0">Clearpath · Immobilien-Suite</td>
</tr>
<tr>
<td style="padding:6px;border:1px solid #B9E6DD;border-top:none;border-radius:0 0 4px 4px;background:#E7FFF8">
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#CAFFF4"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-s609dyAJSrju54QSh-zj5NeZTykb-ImmoScout24-canva2.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/immoscout24-api-pro" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">ImmoScout Pro</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">Du bist hier</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#E7FFF8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-mwBC2oe2vWbDfbeVb-GOkoVZbFaU-ImmoScout24-canva2.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/immoscout24-api-lite" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">ImmoScout Lite</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">Schnelle Übersicht</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#E7FFF8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-wdaV0qFwqQJ2H7ywd-TAEi6GeGks-ImmoScout24-canva2.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/immoscout24-detail-listing-scraper" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">Exposé-Details</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">Einzelne Inserate</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#E7FFF8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-Yu9fmARTOt79Ungbn-PTLhKqKWa5-kleinanzeigen-immobilien-api-pro-logo.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/kleinanzeigen-immobilien-api-pro" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">Kleinanzeigen</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">Immobiliendaten</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#E7FFF8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-rfUFdb0huw88MIU1k-h35QRTa0k4-immobilien-export-pro-logo2.png" width="20" height="20" alt="" style="vertical-align:middle"/>&nbsp;&nbsp;<a href="https://apify.com/clearpath/immobilien-export-pro" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">Immo-Export</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">Beide Portale</span></span>
<span style="display:inline-block;vertical-align:top;margin:4px;padding:8px 12px;border:1px solid #B9E6DD;border-radius:4px;background:#E7FFF8"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-ewqeUU7AXNvLl7zfn-MHCF0Re4xs-seloger-scraper-logo.png" width="20" height="20" alt="" style="vertical-align:middle">&nbsp;&nbsp;<a href="https://apify.com/clearpath/seloger-scraper" style="color:#333333;text-decoration:none;font-weight:700;font-size:13px">SeLoger</a></span><br><span style="color:#39564F;font-size:12px;white-space:nowrap">France: phones &amp; agency emails</span></span>
</td>
</tr>
</table>

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
clearpath/immoscout24-api-pro on Apify. Call: ApifyClient("TOKEN").actor("clearpath/immoscout24-api-pro").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: startUrls (array of strings, required), monitorMode (boolean, default false), pageLimit (integer, default 0), startPage (integer, default 1, resumes a search; pageLimit counts pages from it). Full actor spec (input schema with all params/enums/defaults, output dataset fields, README): GET https://api.apify.com/v2/acts/clearpath~immoscout24-api-pro/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Pricing: pay-per-result, $1.19 per 1,000 listings (volume discounts to ~$1.00 per 1,000 on higher plans). Get token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### 🆚 Pro vs Lite Comparison

| Feature | **Pro** | Lite |
|---------|---------|------|
| **Basic Property Data** | ✅ | ✅ |
| **Detailed Descriptions** | ✅ | ❌ |
| **Realtor Details** | ✅ Name, Phone | ❌ |
| **Property Amenities** | ✅ 50+ attributes | ❌ |
| **Investment Data** | ✅ Year built, condition, costs | ❌ |
| **Media Gallery** | ✅ All images, floor plans, PDFs | ✅ Same as Pro |
| **Monitor Mode** | ✅ With detailed data | ✅ Basic data only |
| **Pricing** | $1.19 / 1,000 listings (pay per result) | $39/month |

### 💰 Transparent Pricing

**Pay only for the listings you scrape:**

- **$1.19 per 1,000 listings** - billed per result, with volume discounts on higher Apify plans (down to ~$1.00 per 1,000)
- **No subscription, no minimum** - run once or run daily, you pay for exactly what you pull
- **No per-run cap** - fetch as many listings as your search returns
- **Set your own budget** - cap the maximum cost per run in the actor settings

**ROI Calculator**: With detailed contact information, just **one successful deal** from our data typically pays for thousands of listings.

### 🎯 Professional Use Cases

#### 🏢 Real Estate Investment

```javascript
// Get investment-ready property data
{
  "year_constructed": 1995,
  "condition": "well_maintained",
  "deposit_costs": "3.600,00 €",
  "heating_costs": 120,
  "rent_cold": 1200,
  "rent_total": 1450,
  "size": "75"
}
```

#### 📞 Lead Generation

```javascript
// Direct access to realtor contacts
{
  "contact": {
    "type": "agent",
    "name": "Maria Schmidt",
    "company": "Schmidt Immobilien GmbH",
    "phone_number": "+49 30 12345678",
    "url": "https://www.schmidt-immobilien.de"
  }
}
```

#### 📊 Market Analysis

```javascript
// Comprehensive property attributes
{
  "fitted_kitchen": true,
  "heating_type": "central_heating",
  "parking_info": "1 garage space included",
  "pets_allowed": true,
  "balcony_terrace": true
}
```

### 🔧 Quick Start Guide

#### Step-by-Step Instructions

1. **Create an Apify account** [here](https://console.apify.com/sign-up)
   - Register for a free Apify account
   - No credit card required for free accounts

2. **Get your search URLs**
   - Go to ImmoScout24.de
   - Set up your search filters (location, price, rooms, etc.)
   - Copy the complete URLs from your browser

3. **Run the actor**
   - Navigate to the ImmoScout24 API Pro
   - Enter your list of search URLs
   - Configure monitor mode for ongoing monitoring
   - Add your Telegram user ID for notifications
   - Click "Run"

4. **Access your data**
   - View results directly in the Apify console
   - Download as JSON, CSV, or Excel
   - Use the Apify API to integrate with your applications

#### 1. Basic Property Scraping

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-2000"
  ],
  "pageLimit": 10
}
```

#### 2. Monitor Mode with Notifications

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/bayern/muenchen/wohnung-mieten"
  ],
  "monitorMode": true,
  "telegramUserId": "123456789"
}
```

##### Important: Bot Permission Setup

**⚠️ Before notifications will work, you must send a message to the notification bot first:**

1. **Find the bot** - Search for `@immoscout24_api_bot` on Telegram
2. **Send any message** - Type `/start` or any text to initiate contact
3. **Grant permission** - Done! This allows the bot to send you notifications

Without this initial contact, Telegram's privacy settings prevent the bot from sending you messages, even with your correct User ID.

#### 3. Investment Analysis Pipeline

```javascript
// 1. Scrape properties with Pro
const propertiesRun = await client.actor('immoscout24-api-pro').call({
  startUrls: ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen"],
  pageLimit: 100
});

// 2. Filter by investment criteria
const properties = await client.dataset(propertiesRun.defaultDatasetId).listItems();
const investmentProperties = properties.items.filter(property =>
  property.year_constructed > 1990 &&
  property.condition === 'well_maintained' &&
  property.purchase_price < 500000
);

// 3. Contact realtors directly
investmentProperties.forEach(property => {
  console.log(`Contact: ${property.contact.name} - ${property.contact.phone_number}`);
});
```

### ⬇️ Input

The actor accepts the following configuration:

- `startUrls` (required): Array of ImmoScout24 search URLs to scrape
- `monitorMode` (optional): Enable to only get new listings since last run
- `pageLimit` (optional): Maximum pages to scrape, counted from the start page (0 = unlimited, each page ~20-25 listings)
- `startPage` (optional): Page to start from (default: 1)
- `telegramUserId` (optional): Your Telegram user ID for notifications (monitor mode only)
- `telegramNotificationLimit` (optional): Max notifications per run (default: 10)

#### Resuming a large search

Set `startPage` to continue where a previous run stopped, for example after a run hit its maximum
cost, or to split one big search across several runs. Start page 5 with a page limit of 10 returns
pages 5-14. Adding `pagenumber=5` to a search URL does the same for that URL only and overrides the
field, which is handy when several searches sit at different offsets. Monitor mode always returns the
newest listings, so it ignores the setting.

Results are re-ranked between runs as listings are added and removed, so expect a few listings to
repeat or be missed where two runs meet.

**Example Input:**

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-2000",
    "https://www.immobilienscout24.de/Suche/de/bayern/muenchen/wohnung-kaufen"
  ],
  "monitorMode": false,
  "pageLimit": 0,
  "startPage": 1,
  "telegramUserId": "123456789",
  "telegramNotificationLimit": 10
}
```

### ⬆️ Output

Every listing comes back as one flat record, 99 fields, ready for CSV, JSON or Excel. Both samples below are excerpts of real records, so the examples stay readable; every field the Actor returns is listed in the tables and the schema section that follow.

#### Sample output: residential listing (apartment, for sale)

Excerpt of a real record: 44 of the 99 fields, arrays shortened to their first entry. Every field is listed in the tables and the schema section below.

```json
{
  "expose_id": 170152090,
  "listing_url": "https://www.immobilienscout24.de/expose/170152090",
  "address_line_1": "25337, Elmshorn",
  "location_lat": null,
  "location_lng": null,
  "online_since": null,
  "title": "Wunderschöne Dachgeschosswohnung und Stellplatz!",
  "deposit_costs": null,
  "publication_state": "active",
  "real_estate_type": "APARTMENT_BUY",
  "property_type": "wohnung_kauf",
  "rent_cold": 0,
  "rent_total": 0.0,
  "purchase_price": 287000.0,
  "private_offer": false,
  "ancillary_costs": 0.0,
  "year_constructed": 1983,
  "condition": "well_kept",
  "size": "107.14",
  "fitted_kitchen": true,
  "garden": false,
  "cellar": false,
  "rooms": "4",
  "elevator": false,
  "city_district": null,
  "zip_code": 25337,
  "city": "Pinneberg_Kreis",
  "state": "Schleswig_Holstein",
  "pets_allowed": false,
  "balcony_terrace": true,
  "floor": "3",
  "picture_count": 5,
  "pictures": [
    {
      "type": "full",
      "full_url": "https://pictures.immobilienscout24.de/listings/5f8c1355-fa5a-4197-9a6f-47cb18dbaa77-2077780950.png",
      "web_url": "https://pictures.immobilienscout24.de/listings/5f8c1355-fa5a-4197-9a6f-47cb18dbaa77-2077780950.png",
      "preview_url": "https://pictures.immobilienscout24.de/listings/5f8c1355-fa5a-4197-9a6f-47cb18dbaa77-2077780950.png",
      "caption": "Wohnzimmer und Eingangszimme"
    }
  ],
  "sleeping_rooms": "2",
  "bathrooms": "1",
  "costs": [
    {
      "type": "TEXT",
      "label": "Purchase price:",
      "text": "€287,000"
    }
  ],
  "commission": "No",
  "energy_class": "C",
  "energy_value": 96.2,
  "price_per_sqm": 2679.0,
  "heating_type": "electric_heating",
  "contact": {
    "premium_profile_required_for_contacting": true,
    "type": "agent",
    "name": "Mrs. Svenja Radlof",
    "company": "TRÄ Consulting & Immobilien",
    "logo": "https://pictures.immobilienscout24.de/usercontent/8a08f5bf-1df8-4fe5-b94e-34e249e48490.JPG",
    "immoscout_agent_url": null,
    "portrait_url": "https://pictures.immobilienscout24.de/usercontent/7ce380cf-e614-4b9c-b784-910ec1227fe1.JPG/ORIG/resize/%WIDTH%x%HEIGHT%%3E/format/webp/quality/80",
    "address": "Saselheider Str. 69e\n22159 Hamburg",
    "url": null,
    "phone_number": "+49 176 55906497"
  },
  "source_url": "https://www.immobilienscout24.de/Suche/de/schleswig-holstein/pinneberg-kreis/elmshorn/wohnung-kaufen",
  "scraped_timestamp": "2026-09-10T08:07:53.119450+00:00"
}
```

#### Sample output: commercial listing (Halle / Produktion, for sale)

Commercial listings fill a different set of fields. Note `main_floor_space`, `total_area`, `hall_height`, `floor_load` and `available_from`, plus the commercial detail collected under `additional_attributes`.

Excerpt of a real commercial record: 21 of the 99 fields, chosen to show the commercial-only fields; arrays shortened to their first entry. Every field is listed in the tables and the schema section below.

```json
{
  "expose_id": 166904499,
  "listing_url": "https://www.immobilienscout24.de/expose/166904499",
  "title": "Exklusives Gewerbeobjekt mit 8.071 m² Hallen-/Büro-/Sozialfläche an der Stadtgrenze zu Wuppertal",
  "real_estate_type": "INDUSTRY",
  "property_type": "hallen_produktion",
  "rent_cold": 0,
  "purchase_price": 7200000.0,
  "zip_code": 42389,
  "city": "Wuppertal",
  "commission": "3,57% des beurkundeten Kaufpreises inkl. gesetzl. MwSt.",
  "usable_area": null,
  "main_floor_space": 6626.0,
  "total_area": 8071.0,
  "plot_area": null,
  "hall_height": 5.5,
  "floor_load": 5000.0,
  "divisible_from": null,
  "available_from": "01.08.2026",
  "price_per_parking_space": null,
  "no_of_parking_spaces": "40",
  "contact": {
    "premium_profile_required_for_contacting": true,
    "type": "agent",
    "name": "Arnd van Bevern",
    "company": "VALOGIS Immobilien AG",
    "logo": "https://pictures.immobilienscout24.de/usercontent/f57b9ae5-932d-4f70-a3b3-57ba62dfa82e.PNG",
    "immoscout_agent_url": "https://www.immobilienscout24.de/anbieter/valogis-immobilien-ag/ae80943a9a1c8412d9c",
    "portrait_url": "https://pictures.immobilienscout24.de/usercontent/051ccfba-1119-4eeb-9be4-28d59eecb2f6.JPG/ORIG/resize/%WIDTH%x%HEIGHT%%3E/format/webp/quality/80",
    "address": "Obenitterstraße 21\n42719 Solingen",
    "url": null,
    "phone_number": "+49 172 9308830"
  }
}
```

#### Nothing a listing states is dropped

Every labelled detail on an ImmoScout24 listing reaches the dataset: either a dedicated field, or `additional_attributes`, which carries the rest with keys normalised. We audit this against live listings: the current pass checked 1,609 labelled details across 100 listings covering apartments, houses, plots, WGs, short-term lets, garages, investment properties, compulsory auctions and all six commercial types, and found none missing.

`additional_attributes` holds every stated detail that no dedicated field took, and it deliberately keeps rows a dedicated field only partly covers: the field holds a normalised code (`well_kept`) while this holds the advertiser's own wording and unit (`Well-kept`, `70 m²`), and the two can differ. A row is left out here only when a field took that exact value, so between the two nothing is missing. Read the fields for analysis, read `additional_attributes` when you want what the listing literally said. The `attributes` object alongside it holds the listing's values as they arrive, unnormalised, for anyone who wants the rawest form.

#### Area fields, and which one to use

German listings quote several areas and they are not interchangeable. Use the specific field, not `size`.

| Field | German | What it is |
|---|---|---|
| `size` | Wohnfläche | Living space for apartments and houses. For land and commercial listings it falls back to the plot area where one is given, so it is **not comparable across property types**. |
| `main_floor_space` | Hallen-/Lager-, Büro-, Verkaufs-, Gastronomiefläche | The primary usable area, the one the listing is named after. **This is the number you want for a hall.** |
| `total_area` | Gesamtfläche | Primary area plus ancillary space: offices, mezzanines, sanitary rooms. Always ≥ `main_floor_space`. |
| `plot_area` | Grundstücksfläche | The plot the building sits on. Can be many times the building area. |
| `usable_area` | Nutzfläche | Residential listings only. Commercial listings do not report it. |
| `price_per_sqm` | Preis pro m² | Purchase price per m² on sale listings, rent per m² on rentals. |
| `annual_rent` | Jahrespacht | Commercial plots are leased by the year, so their price sits here rather than in `rent_cold`. |

The same distinction applies to search filters. A URL filter on net floor space (Nutzfläche) is stricter than one on total area and can exclude a hall that meets your requirement on total area: a 1,320 m² hall inside a 1,773 m² building is cut by a 1,500 m² net filter but kept by a 1,500 m² total filter. If you need an exact cut-off, scrape without the area filter and compare `main_floor_space` and `total_area` in your own pipeline.

#### Fields that only some property types carry

| Field | German | Property type |
|---|---|---|
| `hall_height` | Hallenhöhe | Halle/Produktion, clear height in metres |
| `floor_load` | Bodenbelastung | Halle/Produktion, kg/m² |
| `divisible_from` | teilbar ab | Commercial, smallest area the space can be split into |
| `available_from` | bezugsfrei ab / frei ab | All types. As written by the advertiser: a date, `ab sofort`, `nach Vereinbarung`. ImmoScout24 states this under two different labels depending on property type and never both, so this field carries either. `vacant_at_from` is kept for backwards compatibility and covers only one of the two. |
| `minimum_bid` | Mindestgebot | Zwangsversteigerung. These listings have no purchase price, this is their price |
| `min_rental_duration` / `max_rental_duration` | Mindest- / Maximalmietdauer | Wohnen auf Zeit |
| `no_of_parking_spaces` | Stellplätze | Count |
| `price_per_parking_space` | Preis pro Stellplatz | EUR, where priced separately |
| `energy_certificate` | Energieausweis | All types. Status, e.g. `available`, `not required by law` |
| `guest_toilet` | Gäste-WC | Residential |

On commercial listings `additional_attributes` typically also carries `building_type`, `industry_type`, `type_of_use`, `commercialisation_type`, `travel_time_to_next_motorway`, `travel_time_to_next_main_station`, `travel_time_to_next_airport`, `walking_distance_to_public_transport`, `ramp`, `goods_lift`, `lan_cables`, `monument` and `guest_room_area`. Details that a dedicated field already carries, the energy certificate and the areas among them, are in that field instead. On residential listings it carries things like `internet`, `credit_report`, `interior_qual`, `last_modernisation_restructuring`, `grz` and `gfz` for plots, `length` and `width` for garages, and `rental_income_target`, `rental_income_actual` and `n_fold_rent` for investment properties.

#### Property Types

The property `real_estate_type` can be one of:

- APARTMENT_BUY / APARTMENT_RENT
- HOUSE_BUY / HOUSE_RENT
- INDUSTRY / OFFICE / STORE
- ASSISTED_LIVING / GASTRONOMY
- SHORT_TERM_ACCOMMODATION / INVESTMENT
- LIVING_RENT_SITE / LIVING_BUY_SITE
- GARAGE_RENT / GARAGE_BUY
- TRADE_SITE / SPECIAL_PURPOSE
- FLAT_SHARE_ROOM / HOUSE_TYPE
- COMPULSORY_AUCTION / SENIOR_CARE

### 📋 Complete Data Schema

#### Property Details

- **Basic Info**: Title, description, property type, real estate type
- **Financial**: Rent (cold/total), purchase price, ancillary costs, deposit, detailed cost breakdown
- **Physical**: Size, rooms, floor, year built, condition, sleeping rooms, bathrooms (commercial areas have their own fields, see below)
- **Location**: Full address (if available), coordinates, district, neighborhood
- **Features**: Kitchen, garden, cellar, elevator, balcony, parking
- **Utilities**: Heating type, heating costs, pets allowed
- **Market Data**: Price comparisons, location-based pricing information
- **Energy**: Year constructed according to energy certificate

#### Contact Information

- **Realtor Details**: Name, company, phone, website, ImmoScout24 profile
- **Professional Info**: License details, company logo, portrait image, full address
- **Contact Type**: Private seller vs. professional agent

#### Media & Documents

- **Images**: High-resolution photos, floor plans, property documents
- **Documents**: PDFs, additional property information
- **Virtual Tours**: 360° views, 3D tours, and interactive property walkthroughs (if available)
- **Reference Links**: Virtual tours, agent websites, property evaluations

#### Financial Intelligence

- **Cost Breakdown**: Purchase price, maintenance fees (`maintenance_fees`), commission text (`commission`), commission required flag (`commission_required`)
- **Purchase Costs**: Broker commission (`broker_commission`), notary costs (`notary_costs`), land transfer tax (`land_transfer_tax`), additional purchase costs (`additional_purchase_costs`), land registry entry (`land_registry_costs`), total costs (`total_purchase_costs`)
- **Market Comparison**: Fair-price market indicator (`fair_price_indicator`, 0 = below market, 1 = above market)
- **Investment Metric**: Price factor / Kaufpreisfaktor (`price_factor`): purchase price divided by annual net cold rent
- **Financing Options**: Monthly rates, interest calculations, equity requirements
- **Energy Data**: Energy efficiency class (`energy_class`), energy value in kWh/m²·a (`energy_value`), certificate type (`energy_type`)
- **Property Detail**: Usable area / Nutzfläche (`usable_area` in m²)
- **Per-m² Price**: Purchase price or rent per square metre as the listing states it (`price_per_sqm`)
- **Catch-All**: `additional_attributes` captures every labelled detail a listing states, so no data is ever lost. It deliberately repeats rows that also have a dedicated field, because the field holds a normalised code and this holds the advertiser's own wording and units. Identifiers and tracking codes that say nothing about the property are excluded

#### Property-Type Coverage

- **Compulsory auctions (Zwangsversteigerung)**: minimum bid (`minimum_bid`), the only price these listings carry
- **Short-term (Wohnen auf Zeit)**: minimum and maximum rental duration (`min_rental_duration`, `max_rental_duration`), maximum occupants
- **Plots (Grundstücke)**: plot area (`plot_area`), plot ratios GRZ/GFZ, development status, constructible type
- **Garages**: length and width, price per space (`price_per_parking_space`)
- **Investment properties**: target and actual rental income, n-fold rent (Kaufpreisfaktor sibling)
- **All types**: price per m² (`price_per_sqm`), energy certificate status (`energy_certificate`), availability (`available_from`)

#### Commercial Properties (Gewerbe)

- **Areas**: Primary usable area (`main_floor_space`: Hallen-/Lager-, Büro-, Verkaufs- or Gastronomiefläche), total area (`total_area`), plot area (`plot_area`). Use these rather than `size`, which means living space and is not comparable across property types.
- **Halle / Produktion**: Clear hall height in metres (`hall_height`), permissible floor load in kg/m² (`floor_load`), smallest divisible unit in m² (`divisible_from`)
- **Availability**: `available_from`, as written by the advertiser (a date, `ab sofort`, `nach Vereinbarung`)
- **Parking**: Number of spaces (`no_of_parking_spaces`), price per space (`price_per_parking_space`)
- **Under `additional_attributes`**: building type, industry type, type of use, commercialisation type, energy certificate, travel time to motorway / main station / airport, walking distance to public transport, ramp, goods lift, LAN cables, monument protection, guest room area
- **All commercial types**: Halle/Produktion, Büro, Einzelhandel, Gastronomie, Spezialgewerbe, Gewerbegrundstücke, Anlageimmobilien, to rent and to buy

#### Enhanced Features

- **Counteroffer Availability**: Shows whether a counteroffer is available
- **Detailed Room Information**: Specific sleeping rooms and bathroom counts
- **Comprehensive Costs**: All associated fees and charges
- **Agent Profiles**: Direct links to realtor profiles and portfolios
- **Virtual Tour Detection**: Automatic extraction of 3D tours and 360° views

#### Perfect for Professionals

- **Investment firms** - Instant access to new opportunities with complete data
- **Property managers** - Monitor portfolio expansions with contact details
- **Real estate agents** - Track market activity with competitor insights

### 🔌 Professional Integrations

#### CRM Integration

```javascript
// Sync with your CRM system
const newProperties = await getNewProperties();
newProperties.forEach(async property => {
  await crm.createLead({
    name: property.contact.name,
    phone: property.contact.phone_number,
    property: property.title,
    value: property.purchase_price || property.rent_total
  });
});
```

#### Investment Analysis

```python
import pandas as pd
from apify_client import ApifyClient

## Analyze investment opportunities
client = ApifyClient("your_token")
run = client.actor('immoscout24-api-pro').call({
    "startUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen"]
})

## Convert to DataFrame for analysis
properties = client.dataset(run['defaultDatasetId']).list_items().items
df = pd.DataFrame(properties)

## Calculate investment metrics
df['price_per_sqm'] = df['purchase_price'] / df['size'].astype(float)
df['rental_yield'] = (df['rent_total'] * 12) / df['purchase_price'] * 100

## Find best opportunities
best_investments = df[
    (df['rental_yield'] > 4) &
    (df['year_constructed'] > 1990) &
    (df['condition'] == 'well_maintained')
].sort_values('rental_yield', ascending=False)
```

### 🔧 Advanced Usage Examples

#### JavaScript Integration

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

const client = new ApifyApi({ token: 'your_apify_token' });

const run = await client.actor('immoscout24-api-pro').call({
    startUrls: [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen"
    ],
    monitorMode: true,
    telegramUserId: "123456789"
}, {
    memory: 2048 // Use 2GB for large batches
});

const dataset = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Extracted data from ${dataset.items.length} properties`);
```

#### Python Integration

```python
from apify_client import ApifyClient

client = ApifyClient("your_apify_token")

run = client.actor('immoscout24-api-pro').call(
    run_input={
        "startUrls": [
            "https://www.immobilienscout24.de/Suche/de/bayern/muenchen/wohnung-mieten"
        ],
        "monitorMode": True,
        "telegramUserId": "123456789"
    },
    memory_mbytes=2048
)

dataset_items = client.dataset(run['defaultDatasetId']).list_items().items
print(f"Extracted data from {len(dataset_items)} properties")
```

### 📞 Support

Questions, custom fields or bulk setups: max@mapa.slmail.me, or open an issue on the Actor page. Pro users get a reply within 24 hours on working days.

### ❓ Frequently Asked Questions

#### How reliable is the scraper?

The scraper is continuously updated to adapt to site changes, with a success rate above 99% for valid URLs.

#### What happens if a listing is no longer available?

The scraper will handle unavailable listings gracefully while continuing to process other URLs in your list.

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

There is no per-run limit. A single run returns every listing your search matches, whether that is 50 or 200,000. Your **Maximum cost per run** setting controls how much a run may spend: when that budget is reached the run stops and every listing collected up to that point stays in your dataset. Depending on exactly where the budget lands, the run either finishes normally or is marked as aborted with the message "Aborted automatically after reaching the maximum cost of the run". Either way your data is not lost. Raise **Maximum cost per run** to collect more.

#### Can I use this data commercially?

Yes, the data extracted can be used for commercial purposes. However, we recommend reviewing ImmoScout24's terms of service regarding data usage.

#### What's the difference between Pro and Lite?

- **Pro**: Comprehensive property data, all available contact information, detailed descriptions, investment data
- **Lite**: Fast monitoring, basic data, real-time alerts, cost-effective for simple monitoring

#### Do I need proxies?

No. Network access is handled for you, there is nothing to configure.

### 🔗 Related Professional Tools

Maximize your real estate operations with our complete toolkit:

#### 🤖 ImmoScout24 Apply Bot

- **What it does**: Automatically submits rental applications to property listings
- **Perfect for**: Converting detected listings into submitted applications
- **Pricing**: $10/month (currently FREE during launch)
- **Integration**: Complete the automation pipeline from detection to application

***

**Ready to transform your real estate operations?**

[**Start Free Trial →**](https://console.apify.com/actors/s609dyAJSrju54QSh) | [**View Pricing →**](#transparent-pricing) | [**Compare with Lite →**](https://console.apify.com/actors/mwBC2oe2vWbDfbeVb)

*Join other real estate professionals already using ImmoScout24 API Pro to gain competitive advantage in the German property market.*

# Actor input Schema

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

List of ImmoScout24 search URLs to scrape. Only links from immobilienscout24.de work here, links from other property portals are skipped.

## `monitorMode` (type: `boolean`):

Enable monitor mode to only return new listings since the last run

## `pageLimit` (type: `integer`):

Maximum number of pages to scrape (0 = all available pages, each page has ~20-25 listings). Leave at 0 to export every listing your search matches; your 'Maximum cost per run' setting controls the spend. Counted from the start page below.

## `startPage` (type: `integer`):

Page to start from, for resuming a run that hit its cost limit or splitting a large search across runs. Example: start page 5 with a page limit of 10 returns pages 5-14. A <code>pagenumber</code> in a search URL overrides this for that URL. Note: results are re-ranked between runs, so a few listings may repeat or be missed at the seam.

## `excludeNewBuildProjects` (type: `boolean`):

Skip new-build developer projects and their individual units, returning only standard resale and rental listings

## `telegramUserId` (type: `string`):

Optional: your numeric Telegram user ID, for alerts in monitor mode. Send /start to @userinfobot in Telegram and it replies with the number, for example 123456789. This is not your @username: Telegram cannot deliver to a username, so a name here means no alerts. Also send /start to @immoscout24_api_bot once, or Telegram will not let it message you.

## `telegramNotificationLimit` (type: `integer`):

Maximum number of Telegram notifications per run (prevents spam)

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?exclusioncriteria=swapflat&pricetype=rentpermonth&sorting=2",
    "https://www.immobilienscout24.de/Suche/radius/haus-kaufen?centerofsearchaddress=M%C3%BCnchen;;;;;;&geocoordinates=48.13912;11.58022;20.0"
  ],
  "monitorMode": false,
  "pageLimit": 0,
  "startPage": 1,
  "excludeNewBuildProjects": false,
  "telegramNotificationLimit": 10
}
```

# Actor output Schema

## `listings` (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 = {
    "startUrls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?exclusioncriteria=swapflat&pricetype=rentpermonth&sorting=2",
        "https://www.immobilienscout24.de/Suche/radius/haus-kaufen?centerofsearchaddress=M%C3%BCnchen;;;;;;&geocoordinates=48.13912;11.58022;20.0"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/immoscout24-api-pro").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 = { "startUrls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?exclusioncriteria=swapflat&pricetype=rentpermonth&sorting=2",
        "https://www.immobilienscout24.de/Suche/radius/haus-kaufen?centerofsearchaddress=M%C3%BCnchen;;;;;;&geocoordinates=48.13912;11.58022;20.0",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("clearpath/immoscout24-api-pro").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 '{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?exclusioncriteria=swapflat&pricetype=rentpermonth&sorting=2",
    "https://www.immobilienscout24.de/Suche/radius/haus-kaufen?centerofsearchaddress=M%C3%BCnchen;;;;;;&geocoordinates=48.13912;11.58022;20.0"
  ]
}' |
apify call clearpath/immoscout24-api-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpath/immoscout24-api-pro"
        }
    }
}
```

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/s609dyAJSrju54QSh/builds/vVXnbWHPixSADv8B2/openapi.json
