# ImmobilienScout24.de Scraper - Properties, Prices & Agents (`abotapi/immoscout24-scraper`) Actor

$0.9💰/1K for Gold discount. Extract property listings from immobilienscout24.de, Germany's #1 real estate platform with 9,000+ active listings per city. Get fully-detailed listings including price, GPS coordinates, amenities, images, agent contacts, and more.

- **URL**: https://apify.com/abotapi/immoscout24-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Real estate, Agents, Lead generation
- **Features:** Limited permissions
- **Stats:** 53 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.90 / 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: Property Listings, Prices & Coordinates for Germany

ImmobilienScout24 Scraper turns immobilienscout24.de into structured data. Type a city, town or district name, or paste any search link, and get price, full address, GPS coordinates, rooms, living space, construction year, amenities, images, energy data and agent contact for every listing. Turn on listing details for the full description, rent breakdown, purchase side costs, energy certificate and 100+ more attributes. Residential and commercial, buy or rent, with recurring change tracking for scheduled runs. Export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **Type a place name, nothing else.** München, Munich, Köln, Prenzlauer Berg or Titisee-Neustadt: names are looked up on the site's own location search, the state is optional, and towns inside a district work too.
- **Every link the site makes.** City, district, state-wide and nationwide searches, every residential and commercial category, radius and drawn-area map searches, single listings by link or by number, and start-from-page links.
- **Up to 150+ fields per listing.** 60+ fields from the search page alone; with listing details on, the description texts, rent and purchase cost breakdown, energy certificate, floor, condition, heating, market price comparison, documents and agent details.
- **The site's own filters and sorts.** Price, rooms, living space, construction year, floor, amenities, apartment and house types, energy class, heating, pets, publish date, radius, commission free and 9 sort orders.
- **Residential and commercial.** Apartments, houses, plots, garages, shared rooms, temporary housing, house-building offers, offices, retail, hospitality, industrial halls, commercial plots, investment properties and compulsory auctions.
- **Recurring change tracking.** Scheduled runs return only new, updated and reappeared listings, with the changed fields and the price change in EUR and percent.
- **Ready-made output views.** Overview, details, map, changes, costs and agents tabs, plus a run summary.

### Use Cases

- **Real estate investors and analysts:** build a pricing dataset across cities and districts and compare price per square meter, price factors and rental yields.
- **Relocation and rental platforms:** feed current buy or rent listings for a city into your own site, app or newsletter.
- **Proptech and market research teams:** track new listings, price cuts and removed listings over time with scheduled incremental runs.
- **Commercial property teams:** monitor offices, retail units, halls and commercial plots with their areas, rents and conditions.
- **Agencies and brokers:** collect competing listings with agent and company contacts for market comparison and outreach lists.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `title` | `"Lichtdurchflutete 3-Zimmer-Wohnung mit Balkon"` |
| `priceDisplay` / `priceValue` | `"450.000 €"` / `450000` |
| `addressFull` / `postcode` / `city` / `quarter` | `"Musterstraße 12, Mitte, Berlin"` / `"10115"` / `"Berlin"` / `"Mitte"` |
| `latitude` / `longitude` | `52.5320` / `13.3850` |
| `rooms` / `livingSpace` / `plotArea` | `3` / `85.5` / `null` (m²) |
| `constructionYear` / `condition` / `floor` | `2024` / `"first_time_use"` / `2` |
| `balcony` / `lift` / `garden` / `cellar` | amenity flags |
| `energyEfficiencyClass` / `energyValue` / `heatingType` | `"B"` / `62.4` / `"central_heating"` |
| `baseRent` / `serviceCharge` / `heatingCosts` / `deposit` | rent breakdown in EUR (rentals, with details on) |
| `commissionAmount` / `notaryCosts` / `landTransferTax` / `totalPurchaseCosts` | purchase side costs in EUR (sales, with details on) |
| `pricePerSqm` / `priceRating` / `priceInfo` | `5294.12` / `"GOOD_OFFER"` / the site's market comparison |
| `description` / `locationDescription` / `furnishingDescription` | full listing texts (details on) |
| `images` / `imageCount` / `floorplanUrl` | photo URLs / `12` / floorplan image |
| `documents` / `virtualTourUrl` | brochures and floor plans as PDF links / 3D tour link |
| `contactName` / `contactPhone` / `contactCompany` | `"Meier"` / `"030 1234567"` / `"Beispiel Immobilien GmbH"` |
| `agentProfileUrl` / `agentRating` / `agentAddress` | agent profile, star rating and office address (details on) |
| `projectName` / `projectUrl` | new development name and link, when the listing belongs to a project |
| `mainFloorSpace` / `hallHeight` / `annualRent` / `priceFactor` | commercial and investment figures, when the listing has them |
| `datePublished` / `dateModified` | ISO 8601 timestamps |
| `changeType` / `changedFields` | `"UPDATED"` / `["priceValue"]` (incremental mode) |
| `previousPrice` / `priceChange` / `priceChangePct` | `475000` / `-25000` / `-5.26` (incremental mode, price changes) |
| `searchUrl` / `scrapedAt` | the search that found the listing / when it was read |

### How to Use

1. Pick a **mode**: `location` (type place names and set filters) or `url` (paste immobilienscout24.de links).
2. In location mode, type one or more place names; pick the state only to choose between places with the same name. Set any filters and the sort order. In url mode, paste links instead.
3. Turn on **Include listing details** if you need the full description, cost breakdown and energy data, set **Max Pages** and **Max Listings**, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search by place name, filtered:**

```json
{
  "mode": "location",
  "locations": [{ "city": "Munich" }, { "city": "Prenzlauer Berg" }],
  "listingType": "buy",
  "propertyType": "apartment",
  "priceMax": 600000,
  "roomsMin": 2,
  "apartmentTypes": ["penthouse", "maisonette"],
  "equipment": ["balcony", "lift"],
  "energyEfficiencyClasses": ["a_plus", "a", "b"],
  "sortBy": "newest",
  "maxListings": 200
}
```

**Rentals with full details and costs:**

```json
{
  "mode": "location",
  "locations": [{ "state": "sachsen", "city": "Leipzig" }],
  "listingType": "rent",
  "propertyType": "apartment",
  "petsAllowed": ["yes"],
  "publishedAfter": "2026-10-01",
  "includeDetails": true,
  "maxListings": 200
}
```

**Paste links: a map search, a commercial search and one listing:**

```json
{
  "mode": "url",
  "urls": [
    "https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0",
    "https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/buero-mieten",
    "166798088"
  ],
  "maxListings": 100
}
```

**Daily monitoring of one search (only new and changed listings):**

```json
{
  "mode": "location",
  "locations": [{ "city": "Hamburg" }],
  "listingType": "rent",
  "propertyType": "house",
  "buildingTypes": ["singlefamilyhouse", "terracehouse"],
  "incrementalMode": true,
  "emitExpired": true,
  "maxListings": 1000
}
```

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/immoscout24-scraper").call(run_input={
    "mode": "location",
    "locations": [{"city": "Berlin"}],
    "listingType": "buy",
    "maxListings": 200,
})
for listing in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(listing["title"], listing["priceDisplay"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/immoscout24-scraper').call({
    mode: 'location',
    locations: [{ city: 'Berlin' }],
    listingType: 'buy',
    maxListings: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Output views and run summary

The **Output** tab has six views of the same dataset: **Overview** (price, size, address), **Details** (description, condition, energy, floor), **Map** (coordinates), **Changes** (incremental rows with changed fields and price changes), **Costs** (rent breakdown and purchase side costs) and **Agents** (agent and company contacts). Each run also stores a summary under the `OUTPUT` key of its key-value store: listings collected, whether a cap was hit, detail-page counts and incremental change counts.

#### Splitting a large search across runs

If a URL contains `pagenumber=N`, scraping starts from page N and walks forward for `maxPages` pages (or until `maxListings` is reached, 40 by default). To continue an interrupted full walk in a new run, paste the earlier run ID into **Resume from a previous run**: listings that run already saved are skipped.

#### URL mode: every shape supported

Paste any immobilienscout24.de link into `urls`. Every search family below has a real example in the input's prefilled list (**Search mode = URL**):

**What runs by default:** the input form shows a prefilled example list covering these shapes so you can see each format, but if you leave `urls` untouched in URL mode only the first entry (the Berlin apartments-for-sale search) is the default and is scraped. Edit the list to the links you want; every link you keep is scraped.

| Shape | Example | Notes |
|---|---|---|
| City | `/Suche/de/berlin/berlin/wohnung-kaufen` | state / city / category |
| District or quarter | `/Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten` | adds the district segment |
| State-wide | `/Suche/de/bayern/wohnung-kaufen` | every city in the state |
| Nationwide | `/Suche/de/wohnung-kaufen` | no state or city segment |
| Start from a page | `/Suche/de/berlin/berlin/haus-mieten?pagenumber=2` | starts at page 2, walks forward for Max Pages |
| Radius map search | `/Suche/radius/wohnung-mieten?centerofsearchaddress=...&geocoordinates=lat;lng;km` | the circle you set on the site's map |
| Drawn-area map search | `/Suche/shape/wohnung-mieten?shape=...` | the area you drew on the site's map |
| Residential categories | `grundstueck-kaufen`, `wg-zimmer`, `wohnen-auf-zeit`, `garage-mieten`, `neubauwohnung-kaufen`, `haus-bauen` | rent-only and buy-only categories are labelled correctly |
| Commercial and investment | `buero-mieten`, `einzelhandel-kaufen`, `gastronomie-mieten`, `hallenproduktion-mieten`, `gewerbegrundstuecke-kaufen`, `anlageimmobilie`, `zwangsversteigerung` | same search format, commercial fields filled in |
| Commission free | `/Suche/de/berlin/berlin/provisionsfreie-wohnung-kaufen` | same as the `noCommission` input (sales only) |
| Single listing | `/expose/<id>`, or just the number, e.g. `166798088` | one row, no pagination |
| Bare host / `http://` / `&amp;` | `immobilienscout24.de/Suche/...` | normalized automatically |

Skipped with a clear warning, never a silent empty result: agent and company profile pages (`/anbieter/...`, `/profil/...`), overview and information pages (region overviews, price atlas, new-build portal, guides, the home page) and the Austrian or Swiss sites. A misspelled or outdated search link gets its own warning too.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each listing, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `location` | `location` to search by place name, or `url` for pasted links. |
| `locations` | array | Berlin (used when empty) | Places to search: city, town, district or quarter names. `state` is optional and only chooses between places with the same name. A name that cannot be found is reported and skipped. |
| `listingType` | string | `buy` | `buy` or `rent`. Location mode only. |
| `propertyType` | string | `apartment` | `apartment`, `house`, `land`, `garage`, `flatShareRoom`, `shortTermAccommodation`, `houseBuild`, `office`, `retail`, `gastronomy`, `industry`, `tradeSite`, `investment` or `compulsoryAuction`. Buy-only and rent-only types set the listing type automatically. |
| `priceMin` | integer | (none) | Minimum price in EUR. |
| `priceMax` | integer | (none) | Maximum price in EUR. |
| `roomsMin` | integer | (none) | Minimum number of rooms. |
| `roomsMax` | integer | (none) | Maximum number of rooms. |
| `livingSpaceMin` | integer | (none) | Minimum living area in m². |
| `livingSpaceMax` | integer | (none) | Maximum living area in m². |
| `constructionYearMin` | integer | (none) | Earliest construction year. |
| `constructionYearMax` | integer | (none) | Latest construction year. |
| `equipment` | array | (none) | Required amenities, all must be present: `balcony`, `builtinkitchen`, `garden`, `lift`, `cellar`, `guesttoilet`, `barrierfree`, `parking`. |
| `apartmentTypes` | array | (none) | Apartments only: `apartment`, `groundfloor`, `raisedgroundfloor`, `halfbasement`, `roofstorey`, `loft`, `maisonette`, `penthouse`, `terracedflat`, `other`. |
| `buildingTypes` | array | (none) | Houses only: `singlefamilyhouse`, `multifamilyhouse`, `semidetachedhouse`, `terracehouse`, `bungalow`, `villa`, `farmhouse`, `specialrealestate`, `otherrealestate`. |
| `noCommission` | boolean | `false` | Commission-free listings only. Sales only: the site has no commission-free filter for rentals, so it is ignored there (the log says so). |
| `energyEfficiencyClasses` | array | (none) | Energy certificate classes `a_plus` to `h`. |
| `heatingTypes` | array | (none) | `central`, `selfContainedCentral` or `stove`. |
| `petsAllowed` | array | (none) | Rentals only: `yes` or `negotiable`. |
| `floorMin` | integer | (none) | Lowest floor (0 = ground floor). |
| `floorMax` | integer | (none) | Highest floor. |
| `publishedAfter` | string | (none) | Only listings first published on or after this date, e.g. `2026-10-01`. |
| `radiusKm` | integer | (none) | Radius search in km around `radiusCenter`. |
| `radiusCenter` | string | (none) | Radius centre as `"latitude, longitude"`, e.g. `"52.52, 13.405"`. |
| `sortBy` | string | `default` | `default`, `newest`, `priceAsc`, `priceDesc`, `roomsDesc`, `roomsAsc`, `livingSpaceDesc`, `livingSpaceAsc` or `projectsFirst`. |
| `urls` | array | Berlin apartments-for-sale search (one link; the form's prefilled example list shows all shapes) | Links for url mode (see the shapes table above). Location-mode fields are ignored in url mode. |
| `includeDetails` | boolean | `false` | Also load each listing's details: description texts, rent and purchase cost breakdown, energy certificate, floor, condition, documents, agent details and every other attribute the listing states. One extra request per listing. |
| `excludeNewBuildProjects` | boolean | `false` | Hide listings that belong to new-build developer projects, in both modes. |
| `maxPages` | integer | (none, up to 500 pages) | Maximum pages per location or URL (about 20 listings per page). Leave empty to read every page; the result count is capped by `maxListings`. |
| `maxListings` | integer | `40` | Maximum total listings to collect across all searches. **`0` = unlimited** (every page of every search, up to thousands of listings, billed per listing). |

**Behaviour change:** `maxPages` no longer defaults to 2. A run now stops at `maxListings` = 40 by default (the same size as the old 2-page default, about 20 listings per page). Set `maxListings` to a higher number, or `0` for unlimited, to collect more.
| `proxy` | object | German residential (used when empty) | Connection settings. |
| `resumeFromRunId` | string | (none) | A previous run ID or dataset ID: listings it already saved are skipped. |
| `incrementalMode` | boolean | `false` | Recurring change tracking: later runs of the same search return only `NEW`, `UPDATED` and `REAPPEARED` listings. |
| `stateKey` | string | (none) | Optional name for an incremental campaign; by default the key is derived from the search inputs. |
| `emitUnchanged` | boolean | `false` | Incremental mode: also return unchanged listings, marked `UNCHANGED`. |
| `emitExpired` | boolean | `false` | Incremental mode: also return listings that disappeared, marked `EXPIRED`, after a run that scanned the whole search. **Default off (decision, S10c full-scan 2026-10-06):** EXPIRED rows are billed dataset items like any other row, so a user who turns on incremental mode without reading every option should not be surprise-billed for rows they did not ask for, the same reasoning `emitUnchanged` already uses one row above. Turn it on explicitly for monitoring setups that want disappearance tracking (see the "Daily monitoring" example above, which sets it). |
| `ignoreFieldsForChanges` | array | (none) | Incremental mode: extra field names to ignore when deciding whether a listing changed (`scrapedAt`, `isNew`, `priceInfo` and `financeMonthlyRate` are always ignored). |
| `mcpConnectors` | array | (none) | Optional: send a summary of each listing to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which listing pages are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. Does not affect the dataset. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "id": "123456789",
  "url": "https://www.immobilienscout24.de/expose/123456789",
  "listingType": "rent",
  "propertyType": "apartment",
  "title": "Helle 3-Zimmer-Wohnung mit Balkon",
  "addressFull": "Musterstraße 12, 04109 Leipzig, Zentrum",
  "street": "Musterstraße",
  "houseNumber": "12",
  "postcode": "04109",
  "city": "Leipzig",
  "quarter": "Zentrum",
  "state": "Sachsen",
  "latitude": 51.3397,
  "longitude": 12.3731,
  "priceValue": 980,
  "priceCurrency": "EUR",
  "priceDisplay": "980 €",
  "totalRent": 1180,
  "rooms": 3,
  "livingSpace": 82.5,
  "constructionYear": 1910,
  "balcony": true,
  "builtInKitchen": true,
  "lift": false,
  "energyEfficiencyClass": "C",
  "imageCount": 14,
  "images": ["https://pictures.immobilienscout24.de/listings/example-800x600.jpg"],
  "contactName": "Meier",
  "contactCompany": "Beispiel Immobilien GmbH",
  "datePublished": "2026-10-01T10:00:00.000+02:00",
  "detailsFetched": true,
  "description": "Schöne Altbauwohnung mit hohen Decken ...",
  "floor": 2,
  "condition": "well_kept",
  "heatingType": "central_heating",
  "baseRent": 980,
  "serviceCharge": 200,
  "deposit": 2940,
  "pricePerSqm": 11.88,
  "agentProfileUrl": "https://www.immobilienscout24.de/anbieter/example",
  "searchUrl": "https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/wohnung-mieten",
  "changeType": "UPDATED",
  "changedFields": ["priceValue", "totalRent"],
  "firstSeenAt": "2026-09-20T06:00:00.000Z",
  "lastSeenAt": "2026-10-06T06:00:00.000Z",
  "previousPrice": 1020,
  "priceChange": -40,
  "priceChangePct": -3.92,
  "scrapedAt": "2026-10-06T06:00:00.000Z"
}
```

### Plan Requirement

The default connection is a German residential proxy and works without any setup on plans that include residential proxies. On a plan without residential proxy access, the run continues over a backup connection and says so in the log; if no page can be loaded at all, the run fails with a message explaining why. You can also supply your own proxy URLs under the proxy setting.

### FAQ

#### How much does it cost?

You pay per listing returned plus a small start fee per run; the **Pricing** tab shows the current rates. Listing details are not charged extra, they only make the run slower. Use **Max Pages** and **Max Listings** to cap the size, and therefore the cost, of any run; Max Listings defaults to 40, and `0` removes the cap. In incremental mode, unchanged listings are not returned (or billed) unless you turn on **Emit unchanged listings**.

#### Is it legal to scrape immobilienscout24.de?

This actor collects only publicly available listing data. You are responsible for how you use it: follow immobilienscout24.de's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Agent and company contact details returned by this actor are business contact information published on the listing, not private personal data.

#### Can I get only new or changed listings on a schedule?

Yes. Turn on **Incremental changes for scheduled runs** (in the "🔁 Resume & recurring updates" section) and schedule the actor from the **Schedules** tab. The first run returns every matching listing as `NEW`; later runs of the same search return only `NEW`, `UPDATED` and `REAPPEARED` listings. Updated rows name the changed fields, and a price change comes with `previousPrice`, `priceChange` and `priceChangePct`. Turn on **Emit expired listings** to also get listings that disappeared (only after a run that scanned the whole search). **Ignore fields when detecting changes** excludes any field you find noisy.

#### Why did I get fewer listings than my Max Listings setting?

`maxPages` limits how many pages are read per location or URL, and each page holds about 20 listings, regardless of `maxListings`. Remember `maxListings` itself defaults to 40; raise it (or set `0` for unlimited) to collect more. Raise `maxPages` (or add more locations) to reach a higher `maxListings` value. Listings already returned for an earlier location in the same run are not repeated.

#### Why did my run fail instead of returning an empty dataset?

A run fails only when no page could be loaded at all: the proxy refused the connection for your account, your plan has no residential proxy access and the backup connection could not load the pages either, or the requests kept failing. The failure message says which one. A search that loads but matches no listings, or a misspelled place or link, finishes successfully with a warning that names the problem, so "no matching listings" is never confused with "the connection did not work".

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push listing summaries into Notion, Linear or Airtable.

### 🔗 Want more real estate data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏠 <a href="https://apify.com/abotapi/immowelt-de-scraper"><b>Immowelt.de Scraper</b></a><br>Scrape detailed property listings from Immowelt.de into clean structured data. Extract...</td><td>🏠 <a href="https://apify.com/abotapi/fundainbusiness-nl-commercial-property-scraper"><b>Funda in Business Scraper</b></a><br>Scrape Funda in Business commercial listings: offices, retail, industrial, catering and...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/seloger-france-scraper"><b>SeLoger Scraper</b></a><br>Scrape SeLoger.com properties for sale and rent. Search by location with price, room and...</td><td>🏠 <a href="https://apify.com/abotapi/commercialguru-sg-scraper"><b>CommercialGuru SG Property Listings &amp; Agent Contacts Scraper</b></a><br>Scrape commercialguru.com.sg Singapore listings at scale. Extract prices, PSF, floor...</td></tr>
<tr><td>🏠 <a href="https://apify.com/abotapi/domclick-scraper"><b>Domclick RU Property Scraper</b></a><br>Extract property listings from domclick.ru, one of Russia’s largest real estate portals...</td><td>🏠 <a href="https://apify.com/abotapi/otodom-pl-scraper"><b>Otodom.pl Scraper</b></a><br>Scrape Otodom.pl properties for sale and rent, including apartments, houses, plots...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/immoscout24-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Location mode = pick state + city + filters below. URL mode = paste any immobilienscout24.de search URL already refined in a browser (recommended for complex filters).

## `locations` (type: `array`):

Places to search. Type a city, town, district or quarter NAME (e.g. München, Munich, Köln, Frankfurt, Prenzlauer Berg, Titisee-Neustadt): it is looked up on ImmobilienScout24's own location search, so no ids or URL slugs are needed. The state is optional: pick it only to choose between places with the same name (e.g. Neustadt). A name that cannot be found is reported in the log and skipped.

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

Buy or rent. Location mode only.

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

Type of property to search, residential or commercial. Building plots, house-building offers, investment properties and compulsory auctions exist only for sale; flat-share rooms and short-term furnished housing only for rent — for those the matching listing type is used automatically.

## `priceMin` (type: `integer`):

Minimum price in EUR

## `priceMax` (type: `integer`):

Maximum price in EUR

## `roomsMin` (type: `integer`):

Minimum number of rooms

## `roomsMax` (type: `integer`):

Maximum number of rooms

## `livingSpaceMin` (type: `integer`):

Minimum living area in square meters

## `livingSpaceMax` (type: `integer`):

Maximum living area in square meters

## `constructionYearMin` (type: `integer`):

Earliest construction year

## `constructionYearMax` (type: `integer`):

Latest construction year

## `equipment` (type: `array`):

Required amenities (all must be present)

## `apartmentTypes` (type: `array`):

Apartments only (Property type = Apartment): only these apartment types, e.g. penthouse or maisonette. Leave empty for no filter. Ignored for other property types (the log says so).

## `buildingTypes` (type: `array`):

Houses only (Property type = House): only these house types, e.g. single-family house or villa. Leave empty for no filter. Ignored for other property types (the log says so).

## `noCommission` (type: `boolean`):

Only return provisionsfreie listings (no buyer's agent commission). Available for properties FOR SALE only: this site has no commission-free filter for rentals, so the option is ignored on rent searches.

## `energyEfficiencyClasses` (type: `array`):

Only listings whose energy certificate shows one of these classes. Leave empty for no filter.

## `heatingTypes` (type: `array`):

Only listings with one of these heating types. Leave empty for no filter.

## `petsAllowed` (type: `array`):

Rentals only: only listings that allow pets (yes) or allow them by arrangement (negotiable). Leave empty for no filter.

## `floorMin` (type: `integer`):

Lowest floor the apartment may be on (0 = ground floor). Leave empty for no limit.

## `floorMax` (type: `integer`):

Highest floor the apartment may be on. Leave empty for no limit.

## `publishedAfter` (type: `string`):

Only listings first published on or after this date (for example 2026-10-01). Leave empty for no filter.

## `radiusKm` (type: `integer`):

Search a circle of this many km around Radius centre, instead of the city area. Needs Radius centre.

## `radiusCenter` (type: `string`):

Centre of the radius search as "latitude, longitude", for example "52.5200, 13.4050" for central Berlin. The first location's city name is used as its label.

## `sortBy` (type: `string`):

Result ordering

## `urls` (type: `array`):

Full immobilienscout24.de links with your own filters. Supported: city, district/quarter, state-wide and nationwide searches, every category (apartments, houses, plots, garages, shared rooms, temporary housing, offices and other commercial), map searches (radius /Suche/radius/... and drawn area /Suche/shape/...), pagenumber=N start pages, and a single listing page (/expose/<id>, or just its number, e.g. 166798088). A link without https:// works too. Overview pages (region overviews, price atlas, guides, the home page), agent profiles and the Austrian/Swiss sites are skipped with a warning. If a URL contains pagenumber=N, scraping starts from page N and walks forward. Tip: open immobilienscout24.de in your browser, apply filters, then paste the resulting URL here. In URL mode, all the Location-mode fields above are ignored.

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

Also load each listing's full details: description texts, floor, condition, heating and energy certificate, rent breakdown (base rent, service and heating costs, deposit, Hausgeld), purchase side costs (commission, notary, land transfer tax, land registry), price per m², usable area, bedrooms, bathrooms, pets, parking, availability, virtual tour link, agent details and every other attribute the listing states. Slower: one extra request per listing.

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

Hide listings that belong to new-build developer projects. Works in both modes (it is added to pasted search URLs too).

## `maxPages` (type: `integer`):

Maximum pages to scrape per location (20 listings per page). Leave empty to read every page; use Max Listings to cap the result count.

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

Maximum total listings to collect across all searches. Defaults to 40; set 0 for unlimited (every page, which can be thousands of listings per search).

## `proxy` (type: `object`):

Proxy settings. German residential proxy recommended for best results.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a full-catalogue walk across separate runs. Listings already collected there (matched by listing id) are skipped, so this run only saves the new ones. Leave empty for a normal fresh run. For recurring monitoring of the same search instead, use Incremental mode below.

## `incrementalMode` (type: `boolean`):

Turn this on for daily/weekly recurring monitoring of the same search. The first run returns all matching listings as NEW. Later runs return only NEW, UPDATED, and REAPPEARED listings by default. Turn on "Emit unchanged listings" or "Emit expired listings" only when you also want those rows returned (and billed). State is kept separately per search (location/URLs, filters, sort); use State key below to name or deliberately share a monitoring campaign.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to let the actor derive a key automatically from the search inputs above.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return listings that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have, so leave it off unless you specifically want the full snapshot every run.

## `emitExpired` (type: `boolean`):

Off by default. Turn on to also return listings that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked search, not when Max Pages/Max Listings capped it, a block stopped it early, or a pasted URL/Resume started mid-walk.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Field names to exclude from change detection in addition to the defaults (scrapedAt, isNew, priceInfo, financeMonthlyRate — already ignored because they change independently of the listing itself). Use this if another field in your setup turns out to be noisy.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON — the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "location",
  "locations": [
    {
      "state": "berlin",
      "city": "Berlin"
    }
  ],
  "listingType": "buy",
  "propertyType": "apartment",
  "noCommission": false,
  "sortBy": "default",
  "urls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten",
    "https://www.immobilienscout24.de/Suche/de/bayern/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/haus-mieten?pagenumber=2",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/grundstueck-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wg-zimmer",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnen-auf-zeit",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/garage-mieten",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/buero-mieten",
    "https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0",
    "https://www.immobilienscout24.de/Suche/shape/wohnung-mieten?shape=owr_I_htpA%3F_yF~%7BB%3F%3F~xF_%7CB%3F",
    "https://www.immobilienscout24.de/expose/166798088"
  ],
  "includeDetails": false,
  "excludeNewBuildProjects": false,
  "maxListings": 40,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `details` (type: `string`):

No description

## `geo` (type: `string`):

No description

## `changes` (type: `string`):

No description

## `costs` (type: `string`):

No description

## `agents` (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 = {
    "locations": [
        {
            "state": "berlin",
            "city": "Berlin"
        }
    ],
    "urls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten",
        "https://www.immobilienscout24.de/Suche/de/bayern/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/haus-mieten?pagenumber=2",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/grundstueck-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wg-zimmer",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnen-auf-zeit",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/garage-mieten",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/buero-mieten",
        "https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0",
        "https://www.immobilienscout24.de/Suche/shape/wohnung-mieten?shape=owr_I_htpA%3F_yF~%7BB%3F%3F~xF_%7CB%3F",
        "https://www.immobilienscout24.de/expose/166798088"
    ],
    "maxListings": 40,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/immoscout24-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 = {
    "locations": [{
            "state": "berlin",
            "city": "Berlin",
        }],
    "urls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten",
        "https://www.immobilienscout24.de/Suche/de/bayern/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/wohnung-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/haus-mieten?pagenumber=2",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/grundstueck-kaufen",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wg-zimmer",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnen-auf-zeit",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/garage-mieten",
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/buero-mieten",
        "https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0",
        "https://www.immobilienscout24.de/Suche/shape/wohnung-mieten?shape=owr_I_htpA%3F_yF~%7BB%3F%3F~xF_%7CB%3F",
        "https://www.immobilienscout24.de/expose/166798088",
    ],
    "maxListings": 40,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/immoscout24-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 '{
  "locations": [
    {
      "state": "berlin",
      "city": "Berlin"
    }
  ],
  "urls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/charlottenburg-wilmersdorf/wohnung-mieten",
    "https://www.immobilienscout24.de/Suche/de/bayern/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/wohnung-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/haus-mieten?pagenumber=2",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/grundstueck-kaufen",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wg-zimmer",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnen-auf-zeit",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/garage-mieten",
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/buero-mieten",
    "https://www.immobilienscout24.de/Suche/radius/wohnung-mieten?centerofsearchaddress=Berlin;;;;;&geocoordinates=52.52;13.405;2.0",
    "https://www.immobilienscout24.de/Suche/shape/wohnung-mieten?shape=owr_I_htpA%3F_yF~%7BB%3F%3F~xF_%7CB%3F",
    "https://www.immobilienscout24.de/expose/166798088"
  ],
  "maxListings": 40,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false
}' |
apify call abotapi/immoscout24-scraper --silent --output-dataset

```

## MCP server setup

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