# ImmoScout24 Scraper: Listings & Price Changes (`kaleidoscopelabs/immobilienscout24-scraper`) Actor

Scrape ImmobilienScout24 (ImmoScout24) real estate listings across Germany: rent and sale, with price, rent, size, rooms and address. Monitor a search for new listings, price changes and removed ones, and add details like Hausgeld, rental income and commission. Flats, houses, land, offices.

- **URL**: https://apify.com/kaleidoscopelabs/immobilienscout24-scraper.md
- **Developed by:** [Kaleidoscope Labs](https://apify.com/kaleidoscopelabs) (community)
- **Categories:** Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What can ImmoScout24 Scraper do?

**Scrape ImmobilienScout24 listings from any search: the flats, houses, plots or offices it shows, as data, with prices, costs and details, and monitor the search for new listings, price changes and removed ones.**

- 🏠 **Listings:** the listings of the ImmobilienScout24 searches you paste, for rent and for sale, anywhere in Germany: price, total rent, price per m², living space, rooms, address, map point, publication dates, the listing company and pictures.
- 📋 **Details:** costs (service charge, heating, deposit, Hausgeld, rental income, commission), availability, floor, bedrooms and bathrooms, condition, energy certificate, parking, features such as a lift or a WBS requirement, documents and the lister's descriptions.
- 🔔 **Monitor:** run it on a schedule and each run stores only what is new since the last one, or also what changed (with the old and new value) and what was removed.
- 🧾 **Every record says what it lacks:** details not asked for, a listing page gone, or a value in a form the Actor does not read is named in `missing`, with the reason; a field the listing leaves empty is left out.

Run it from Apify Console, through the API, on a schedule, or from an AI agent. The prefilled input stores 20 Berlin flats with their details in about 11 seconds, so you can see the output before a larger run.

| You want to know | Use | What it costs |
|---|---|---|
| What a search holds right now | Paste the search, What to store: All listings | $1.50 per 1,000 listings, plus $0.008 per search |
| The costs, deposit and details of each listing | Include details ($) | $2.50 per 1,000 listings instead |
| Only new listings, every morning | What to store: New listings, and a daily schedule | $0.008 per search a run, plus the new listings |
| Price drops and listings taken offline | What to store: New, changed and removed listings | the same; removed listings are free |

### What data can you get from ImmobilienScout24?

| Data | Each listing | With Include details |
|---|---|---|
| ID, link, property type, title, the search it came from and its place in it | ✓ | ✓ |
| Published, created and last changed dates | ✓ | ✓ |
| Price, total rent, price per m², the site's price rating | ✓ | ✓ |
| Living space or net floor space, rooms, construction year, energy class | ✓ | ✓ |
| Balcony, fitted kitchen, garden, floor plan, commission, the listing's tags | ✓ | ✓ |
| Address (street and number only where the listing shows them), postcode, city, quarter, map point and whether it is exact | ✓ | ✓ |
| Private or company listing, the company's name, the listing's tier, a new-build project | ✓ | ✓ |
| Pictures: the original and a 1106×830 preview | ✓ | ✓ |
| Service charge, heating costs, deposit (as written, with the amount or number of rents), Hausgeld, rental income, parking price, commission | | ✓ |
| Available from (as written, with the date or "now"), floor of floors, bedrooms, bathrooms, usable space, plot area | | ✓ |
| Condition, interior quality, last refurbished, heating, energy sources, energy certificate (type, value, the building year it gives) | | ✓ |
| Features: cellar, lift, step-free, guest toilet, let, flat share, WBS required, listed building, swap flat | | ✓ |
| Whether the offer is still active (`deactivated`) | | ✓ |
| Land: development, building rules, recommended use, site coverage and floor area ratios | | ✓ |
| Short-term living: what is let, rental period, maximum persons, all-in rent | | ✓ |
| Documents (PDF floor plans, energy certificates) and links (virtual tours) | | ✓ |
| The lister's descriptions, as published | | ✓ |
| The contact person, company and address | | with Include contact |

How often a detail is filled depends on the listing. Measured on 2026-10-28 with Include details on:

| Search | Detail | Filled |
|---|---|---|
| Berlin flats for rent, 2+ rooms, up to €1,500 | service charge | 20 of 20 |
| Berlin flats for rent, 2+ rooms, up to €1,500 | available from | 17 of 20 |
| Leipzig flats for sale up to €130,000 | Hausgeld | 24 of 50 |
| Leipzig flats for sale up to €130,000 | rental income (the flat is let) | 11 of 50 |
| Krefeld multi-family houses for sale | rental income | 23 of 50 |
| Cologne building plots | development status | 20 of 30 |
| Münster offices for rent | service charge | 24 of 50 |

### How to use ImmoScout24 Scraper

1. Create a free Apify account, or sign in.
2. On www.immobilienscout24.de, run your search with its filters and sorting, then copy the address bar. It starts with `https://www.immobilienscout24.de/Suche/`.
3. Open ImmoScout24 Scraper, paste the address into Search URLs (one per line), and choose how many listings to store from each search.
4. Turn on Include details if you need the costs and details, and choose What to store if you want a monitor.
5. Click Start. The listings appear in the Output tab as they are stored; download them as JSON, CSV or Excel, or read them through the API.

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

ImmoScout24 Scraper is priced per event, with no usage fees on top:

| Event | Price | When |
|---|---|---|
| Listing | $1.50 per 1,000 | each listing stored without details |
| Listing with details | $2.50 per 1,000 | each listing stored with its details |
| Search read | $0.008 each | each search a run reads, whatever it stores |

The platform also charges $0.00005 when a run starts, per GB of memory. Removed listings, listings a monitor finds unchanged, and listings that could not be read are not charged. The prefilled input (20 flats with details from one search) costs $0.058.

| Listings stored from one search | Without details | With details |
|---|---|---|
| 100 | $0.16 | $0.26 |
| 1,000 | $1.51 | $2.51 |
| 10,000 | $15.01 | $25.01 |

- **A month of daily monitoring of one search:** the first run stores the listings within Listings per search as new. Each later run costs $0.008 for the search, plus the new listings. In our test of Berlin's rentals on 2026-10-28, 78 new listings appeared among the newest 3,000 in 9.5 hours; at about 200 new listings a day (Listings per search set above that, say 300), a month of mornings costs about $9.24 without details. When every listing within Listings per search is new, the run warns that more may be past it. A search that gets 5 new listings a day costs about $0.47 a month.
- **An empty monitor run** (nothing new) costs $0.008 per search.

Apify's free plan credit of $5 a month covers about 3,300 listings, or 2,000 with details. Set a maximum total charge in the run options to cap a run: the Actor stops before it.

### Input recipes

Each recipe is a complete input, run on 2026-10-28 with the result shown.

#### Every listing of a rental search

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500.0&numberofrooms=2.0-&sorting=2"],
  "listingsPerSearch": 100,
  "includeDetails": false
}
```

100 listings in 11 seconds.

#### Only new flats, every morning

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500.0&numberofrooms=2.0-&sorting=2"],
  "listingsPerSearch": 100,
  "mode": "new",
  "monitorName": "berlin-2-rooms",
  "includeDetails": false
}
```

The first run stored the 100 newest listings as new (8 seconds); a run of the same monitor 47 minutes after an earlier one stored the 6 listings published since. Schedule it daily: each later run stores only the listings it has not seen before. Sort the search by newest first (`sorting=2`), so that the first results are the new ones.

#### Flats for sale with Hausgeld and rental income, for an investor's screen

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/wohnung-kaufen?price=-130000.0&sorting=2"],
  "listingsPerSearch": 50,
  "includeDetails": true
}
```

50 listings with details in 21 seconds: Hausgeld on 24, a rental income on 11 (the flats that are let), the commission on all 50, commission-free on 18.

#### Price drops and removed listings of a whole search

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/haus-mieten?sorting=2"],
  "listingsPerSearch": 0,
  "mode": "changes",
  "monitorName": "berlin-houses",
  "includeDetails": false
}
```

The first run stored all 217 houses as new (21 seconds). From the next run on, it stores only what is new, what changed (with `changedFields` and `previous`) and what was taken offline. On the same search, later runs that day found 5 houses taken offline, each confirmed by its page, and one house whose rooms changed.

#### Multi-family houses around a city, with details

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/radius/mehrfamilienhaus-kaufen?centerofsearchaddress=Krefeld;;;;;&geocoordinates=51.33962;6.58615;10.0&sorting=2"],
  "listingsPerSearch": 50,
  "includeDetails": true
}
```

50 of the 141 listings within 10 km with details: a rental income on 23, the plot area on all, the energy certificate on 41.

#### Offices to let

```json
{
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/nordrhein-westfalen/muenster/buero-mieten?sorting=2"],
  "listingsPerSearch": 50,
  "includeDetails": true
}
```

50 of 188 offices with details in 21 seconds: available from on 46, the service charge on 24, air conditioning on 13.

### Output example

One record of the prefilled input (2026-10-28), with its descriptions shortened (marked …), one of its pictures, and its energy certificate's document left out:

```json
{
  "id": "169757421",
  "url": "https://www.immobilienscout24.de/expose/169757421",
  "type": "ApartmentRent",
  "title": "Zentrale Lage zwischen S Greifswalder Straße und S Prenzlauer Allee",
  "searchUrl": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500&numberofrooms=2.0-&sorting=2",
  "position": 18,
  "publishedAt": "2026-10-28T15:27:53.000+01:00",
  "createdAt": "2026-10-28T15:27:53.000+01:00",
  "modifiedAt": "2026-10-28T15:27:51.908+01:00",
  "price": { "value": 1257.14, "currency": "EUR", "interval": "MONTH" },
  "totalRent": { "value": 1595.14, "currency": "EUR", "interval": "MONTH" },
  "pricePerSqm": 17.04,
  "livingSpace": 73.78,
  "rooms": 3,
  "constructionYear": 2017,
  "energyClass": "B",
  "balcony": true,
  "builtInKitchen": false,
  "garden": false,
  "hasFloorplan": true,
  "tags": ["Balkon/Terrasse", "Keller", "Aufzug", "Stufenlos"],
  "address": {
    "street": "Gubitzstr.",
    "houseNumber": "50a",
    "postcode": "10409",
    "city": "Berlin",
    "quarter": "Prenzlauer Berg (Prenzlauer Berg)"
  },
  "lat": 52.54357,
  "lon": 13.43163,
  "locationPrecision": "exact",
  "privateOffer": false,
  "company": "Gewobag Wohnungsbau-Aktiengesellschaft Berlin",
  "listingType": "M",
  "deactivated": false,
  "pictures": [
    {
      "url": "https://pictures.immobilienscout24.de/listings/f0786881-2fc0-4ca8-ab81-c98cc8214b20-2069439062.jpg",
      "preview": "https://pictures.immobilienscout24.de/listings/f0786881-2fc0-4ca8-ab81-c98cc8214b20-2069439062.jpg/ORIG/resize/1106x830%3E/format/webp/quality/73"
    }
  ],
  "details": {
    "descriptions": {
      "object": "Für die angebotene Wohnung werden neue Mieter gesucht. Sie liegt zentral zwischen zwei S-Bahnhöfen. Viele Dinge des alltäglichen Bedarfs sin…",
      "furnishing": "Badewanne, Breitbandkabelanschluss, Fliesenboden, Parkett, Fernheizung/Zentralheizung, Fern-/Zentralwarmwasserversorgung, Steinboden, Schall…",
      "location": "Das Grundstück liegt mitten im Prenzlauer Berg, nördlich des S-Bahn-Rings. Anders als die Kieze innerhalb des S-Bahn-Rings wurde dieser Teil…",
      "other": "Hinweis zu Ihrem Schutz: Wir vermieten provisionsfrei gemäß § 2 WoVermG. Personen, die im Auftrag der Gewobag tätig sind, dürfen keine Provi…"
    },
    "costs": {
      "serviceCharge": 204,
      "heatingCosts": 134,
      "heatingInServiceCharge": false,
      "deposit": "3771,42  €",
      "depositAmount": 3771.42
    },
    "availableFrom": "01.10.2026",
    "availableFromDate": "2026-10-01",
    "flatType": "Etagenwohnung",
    "floor": "4 von 7",
    "floorNumber": 4,
    "numberOfFloors": 7,
    "petsAllowed": "Ja",
    "heatingType": "Fernwärme",
    "energySources": "Fernwärme",
    "energy": {
      "certificate": "liegt vor",
      "type": "Bedarfsausweis",
      "demand": 64,
      "unit": "kWh/(m²·a)",
      "constructionYear": 2017
    },
    "features": { "cellar": true, "lift": true, "stepFree": true }
  },
  "missing": []
}
```

A monitor's changed listing also carries `change` ("changed"), `changedFields` (for example `["price"]`), `previous` (the earlier price, total rent, size, rooms, title and last change date) and `priceHistory` (the prices the monitor has seen it at, at most 20). A new listing carries `change` "new" and no `previous`; a removed one carries `change` "removed", its link and its last known values.

### Monitoring: new, changed and removed listings

Give a search a monitor with What to store: New listings, or New, changed and removed listings, and schedule the run. The Actor remembers each search in a key-value store of your account named `immobilienscout24-monitor` (about 200 bytes a listing; it counts toward your storage), one record per search and Monitor name. Delete a record to start that monitor afresh.

- **New:** a listing the monitor has not seen before among the search's first results, up to Listings per search. With details, a new listing whose page already says it is no longer active is not delivered as new (nor charged).
- **Changed:** a listing counts as changed when its price, total rent, living space, rooms or title changes; each changed record lists what changed, with the old and new value. Other fields, such as the availability date, are not compared.
- **Removed:** a listing taken offline, reported once two runs in a row that read the whole search did not find it and its page says it is gone. A listing that only stopped matching the search's filters is not reported. A run reads a search whole when Listings per search is 0 or at least the search's size; the closing message says in how many searches removals were checked, and `RUN_SUMMARY` counts per search the listings whose removal a later run decides.
- **Start from now:** with it on, a monitor's first run records the current listings without storing them, so later runs deliver only what comes after.
- With Include details on, only new and changed listings have their details read: an unchanged listing costs nothing.

### Integrations and API

- **Make, Zapier, n8n:** send a monitor's new listings on when a run finishes; the Slack and e-mail integrations post the run's closing message ("Stored 3 new and 1 changed listings from 1 search").
- **Google Sheets, webhooks, the Apify API and clients** for JavaScript and Python.
- **AI agents:** through Apify's MCP server, an agent can call the Actor as a tool.

Run a recipe and get its records in one call (with your Apify API key in the APIFY_TOKEN variable):

```bash
curl -X POST "https://api.apify.com/v2/acts/kaleidoscopelabs~immobilienscout24-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"searchUrls": ["https://www.immobilienscout24.de/Suche/de/sachsen/leipzig/wohnung-kaufen?price=-130000.0&sorting=2"], "listingsPerSearch": 20, "includeDetails": true}'
```

#### Building on this Actor

- **Output stability:** fields are added, never renamed or removed without a new major version, and every change is in the changelog.
- **What a run's end means:** a finished run read every search it was given, or says how many search pages and listings it could not read, in its closing message and in the `RUN_SUMMARY` record (`complete`, `failedSearchPages`, `failedListings`). A run that could not reach the site fails instead of succeeding empty. An input the Actor cannot read ends SUCCEEDED with nothing read or charged: the closing message says what to correct, and `RUN_SUMMARY` has `inputError` (null on a normal run).
- **Cost per call:** the three events above; removed, unchanged and unread listings are not charged; your maximum charge holds.
- **Errors:**

| `missing` reason | Meaning |
|---|---|
| notRequested (group details) | Include details was off |
| gone (group details) | The listing's page was gone when its details were read; the record is as its search showed it |
| unexpectedValue | The site gave a value, or the listing's page, in a form the Actor does not read; the field is left empty |
| notGiven (group price) | The listing gives no price (price on request); `price` is absent |

| `RUN_SUMMARY` `inputError` | Meaning |
|---|---|
| noSearch | No search URL was given |
| invalidSearch | A line is not an ImmobilienScout24 search URL |
| noSuchSearch | ImmobilienScout24 answers that the search does not exist |
| invalidSetting | A setting is out of range, or Include contact is on without Include details |

### For AI agents

Connect an MCP client (Claude, Cursor and others) to `https://mcp.apify.com?tools=kaleidoscopelabs/immobilienscout24-scraper` with your Apify API key, then ask, for example:

- "List the 20 newest 2-room flats for rent in Berlin under €1,500, with their service charge and when they are available."

- "Which flats for sale in Leipzig under €130,000 are let, and at what rental income?"

- **Minimal input:** `{"searchUrls": ["<a search URL from www.immobilienscout24.de>"]}` stores up to 100 listings of that search with their details. Set `"includeDetails": false` for the search's own fields only, at $1.50 per 1,000.

- **Fields to read:** `title`, `price.value`, `totalRent.value`, `livingSpace`, `rooms`, `address.city`, `address.quarter`, `url`; with details, `details.costs`, `details.availableFrom`, `details.floor`. In a monitor, `change`, `changedFields` and `previous`.

- **What to know:**
  - Search URLs are copied from the site's address bar; the Actor does not take a city or a price as fields.
  - An empty dataset with `inputError` in `RUN_SUMMARY` is a wrong input, not "no listings".
  - A monitor's later runs store only what is new or changed: an empty dataset there means nothing new (or changed) since the last run.
  - A listing two of your searches find is stored once, under one of them.
  - `missing` lists what the Actor did not or could not read, and why; a field the listing leaves empty is left out.

### Tips

- **Try it cheap:** the prefilled input stores 20 listings with details for $0.058; raise Listings per search once the output looks right.
- **Sort by newest first** for a monitor of new listings: its first results are then the new ones.
- **Removals need a whole read:** set Listings per search to 0 (or above the search's size) in a changes monitor, so the Actor can tell a removed listing from one further down the list.
- **Split very large searches:** all of Germany's flats for sale were 112,875 listings on 2026-10-28; a search per city or district is quicker and is a monitor you can read.
- **One schedule per monitor:** two runs of the same monitor at once both deliver what is new. Use a Monitor name per schedule for two monitors on one search.

### FAQ

#### Is it legal to scrape ImmobilienScout24?

The Actor reads only the public pages that every visitor sees without signing in. Whether you may use the data depends on your purpose, on the law that applies to you and on ImmobilienScout24's terms, so check them before you build on the results. When in doubt, ask a lawyer.

#### Does it collect personal data?

Mostly not: the data is about properties. But the lister's descriptions are their text as published, and some of them name a contact person or give a phone number or an e-mail address (about 7% of the 262 listings, mostly rentals, we read with details on 2026-10-28; 21 of 50 in our test of Leipzig's flats for sale). The `company` field can be a person's name for a one-person business. The contact person and the company's address are off by default and only written with Include contact. If you store or process personal data, you need a lawful basis for it under the GDPR or the laws that apply to you. Runs and their storage are on Apify's platform in the United States (AWS us-east-1).

#### Why does a listing have no street?

The lister chose to hide the address: the record then has the postcode, city and quarter, and a map point of the area, with `locationPrecision` "approximate". The Actor never adds an address the listing does not show.

#### Why did I get fewer listings than the search shows?

Listings per search caps each search (100 unless you change it; 0 is every listing). A listing that two of your searches find is stored once. A result with too little to store (no ID, or neither title nor price) is left out, and the run log says how many. In a monitor, only new or changed listings are stored.

#### Why does the output differ from what I see on the site?

The site's list moves as listings are published, changed and taken offline, and the same search can show a little differently between visits. Open the record's `url` to see the listing as it is now.

#### Something went wrong: what should I check?

Check that each line is a search URL copied from the address bar (`https://www.immobilienscout24.de/Suche/…`), not a single listing's link. The run's last message says how it ended:

| The run's last message says | What it means |
|---|---|
| Done … Stored N listings | It read everything you asked for |
| … up to the run's maximum cost | It stopped at your maximum charge; what it stored is kept and charged |
| … the search does not exist. Check the URL … | The site has no such search: copy it again from the address bar |
| The input's own message, such as "Search URLs: … is not an ImmobilienScout24 search" | Nothing was read or charged: correct the input as it says |
| … did not answer the run … / … did not return the search … | Usually temporary: run it again later |
| … in a form this Actor does not read yet | The site changed its pages: report it with the Ref, and we fix it |

### Limits and what this Actor does not do

- It takes search URLs; it does not search by city, price or rooms as fields. Run the search on the site and paste its address.
- It reads ImmobilienScout24 in Germany (www.immobilienscout24.de), not its Austrian or Swiss sites.
- ImmobilienScout24 can keep listings in its search results for a while after the offer ends: on a whole Berlin rental search, about one in eight listed results was already offline (2026-10-28). With details, each record says so (`deactivated`) and `RUN_SUMMARY` counts them per search; without details the Actor cannot tell.
- It reads what any visitor sees without signing in: listings shown only to paying members are stored as the search shows them, with `paywallUntil` set.
- Details are what the listing's page gives; not every listing gives every field, and a field a listing leaves empty is left out of its record.
- Removals are reported only for searches read whole; price history starts with the monitor's first run.
- Our largest test read all of Germany's flats for sale (112,875 listings, 2026-10-28) with details: it stored 109,953 listings in 83 minutes before we stopped it. Listings move between pages while a large search is read, so a few can be missed or met twice; each is stored once. If ImmobilienScout24's pages ever end before a search's last result, the run says so: split such a search by region, price or rooms.

### Support and feedback

Open an issue on the Issues tab for a bug or a feature you need; we answer within 24 hours. If the Actor saves you time, bookmark it and leave a review in Apify Store: it helps others find it.

### Other Actors

| Actor | What it gives |
|---|---|
| [Google Ads Transparency Scraper & Monitor](https://apify.com/kaleidoscopelabs/google-ads-transparency-data) | A company's or a website's Google ads, with their text, countries and EU impressions; monitor competitors' new ads |
| [YouTube Transcript Scraper](https://apify.com/kaleidoscopelabs/youtube-transcript-scraper) | Transcripts, captions and subtitles of YouTube videos, channels and playlists, in any language |

*ImmoScout24 Scraper is an independent tool, not affiliated with or endorsed by Immobilien Scout GmbH, the operator of ImmoScout24.*

# Changelog

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

# Actor input Schema

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

ImmobilienScout24 searches as your browser shows them, one URL per line: run a search on www.immobilienscout24.de, set its filters and sorting, then copy the address bar. Each URL starts with https://www.immobilienscout24.de/Suche/.

## `listingsPerSearch` (type: `integer`):

How many of each search's first results the run stores: 100 stores the listings among its first 100 results. 0 stores every listing a search holds. A result with too little to store, or a listing two of your searches find (stored once, for one of them), leaves its place empty, so a search can end with fewer.

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

All stores each search's listings on every run. New stores only the listings this monitor has not seen before among each search's first results (up to Listings per search): sort your search by newest first, so that an older listing moving up the results is not taken for a new one. Changes also stores changed listings, with what they were before and their price history, and listings taken offline (gone from the search, and their page says so): checked only when a run reads the whole search. A listing counts as changed when its price, total rent, living space, rooms or title changes; each changed record lists what changed, with the old and new value. Other fields, such as the availability date, are not compared. A monitor's first run stores the current listings as new, unless Start from now is on.

## `startFromNow` (type: `boolean`):

On a monitor's first run, record the searches' current listings without storing them, so that later runs deliver only what comes after. Off: the first run stores the current listings.

## `monitorName` (type: `string`):

Keeps this monitor's memory apart from another's on the same search: two schedules on one search with different names (such as weekly-report) each receive every new listing. Leave empty if one monitor watches each search; do not run one monitor twice at the same time.

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

Read each stored listing's page too, charged as a listing with details: costs (service charge, deposit, house money, rental income), availability, floors, bedrooms and bathrooms, condition, energy certificate, parking, features, documents, and the lister's descriptions as published. A listing with details is charged as a listing with details. With a monitor, only new and changed listings are read.

## `includeContact` (type: `boolean`):

Add the lister's contact person, company and address to each listing, as its contact field. This is personal data: turn it on only if you have a lawful reason to process it. Needs Include details.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500&numberofrooms=2.0-&sorting=2"
  ],
  "listingsPerSearch": 20,
  "mode": "all",
  "startFromNow": false,
  "includeDetails": true,
  "includeContact": false
}
```

# Actor output Schema

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

The listings in the run's default dataset: in a monitor, the new, changed and removed ones.

## `summary` (type: `string`):

What the run did: each search's size, what it stored, whether it is complete, a monitor's new, changed and removed listings, an input error, and the Ref to quote in an issue.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchUrls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500&numberofrooms=2.0-&sorting=2"
    ],
    "listingsPerSearch": 20,
    "mode": "all"
};

// Run the Actor and wait for it to finish
const run = await client.actor("kaleidoscopelabs/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 = {
    "searchUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500&numberofrooms=2.0-&sorting=2"],
    "listingsPerSearch": 20,
    "mode": "all",
}

# Run the Actor and wait for it to finish
run = client.actor("kaleidoscopelabs/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 '{
  "searchUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500&numberofrooms=2.0-&sorting=2"
  ],
  "listingsPerSearch": 20,
  "mode": "all"
}' |
apify call kaleidoscopelabs/immobilienscout24-scraper --silent --output-dataset

```

## MCP server setup

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