# ImmobilienScout24 Scraper - Listings, Prices, Agents & Phones (`scrapersdelight/immobilienscout24-scraper`) Actor

Scrape immobilienscout24.de and .at rentals and sales by search URL, place or radius: cold and warm rent, price per m², size, rooms, address, GPS, energy class, agent and phone. Optional details add the description, Impressum e-mails and purchase costs. No login, no browser.

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

## Pricing

$0.10 / 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 does ImmobilienScout24 Scraper do?

**ImmobilienScout24 Scraper** turns immobilienscout24.de and immobilienscout24.at searches into clean property data: every apartment, house, plot, flat-share room, short stay or garage for rent or for sale, with cold and warm rent or purchase price, price per m², living space, rooms, full address and GPS, energy class, equipment, the agent or landlord with their phone number, photos and listing dates. Switch on listing details to add the full description, every attribute, the provider's Impressum phones and e-mails, the purchase-cost breakdown and the site's local price range.

Also known as: ImmoScout24 scraper, IS24 scraper, ImmobilienScout24 API, Immobilien Scout scraper, German rental listings scraper.

- 🏠 **Rent and buy, every property type** — apartments, houses, plots, WG rooms, Wohnen auf Zeit and garages, in Germany and Austria.
- 🔎 **Three ways in** — paste any search URL with your filters, type place names ("München Schwabing"), or give a point and a radius.
- 📞 **Contact on the row** — agent or landlord name, company and phone straight from the search results; details add Impressum phones and e-mails.
- 💶 **Buyer numbers** — warm rent, price per m², Grunderwerbsteuer, notary and land-registry costs, broker commission, and where the price sits in the local price range.
- 🆕 **MieterPlus early-access listings included** and flagged, with a filter to keep or drop them.
- 🔁 **Monitoring** — deliver only new or re-priced listings on a schedule, with listings removed since the last run.
- 🔌 JSON, CSV, Excel, API, webhooks, Make, Zapier, n8n and MCP. No login, no cookies, no browser.

### What data can you get from ImmobilienScout24?

<table>
<tr><td>🆔 Listing id (Scout-ID) + URL</td><td>💰 Price, cold rent, warm rent</td><td>📐 Price per m², living space, plot area</td></tr>
<tr><td>🛏️ Rooms, bedrooms*, bathrooms*</td><td>🏗️ Construction year, condition*</td><td>⚡ Energy class, certificate, demand*</td></tr>
<tr><td>📍 Street, house number, postcode, city, district</td><td>🌐 Latitude + longitude</td><td>🧰 Balcony, kitchen, garden, cellar, lift</td></tr>
<tr><td>👤 Agent / landlord name + company</td><td>📞 Phone + mobile from the search</td><td>✉️ Impressum phones + e-mails*</td></tr>
<tr><td>🧾 Purchase costs: tax, notary, land registry*</td><td>📊 Local price range per m² + position*</td><td>🏷️ Fair-price rating, tags, commission</td></tr>
<tr><td>🆕 MieterPlus early access + until when</td><td>🏢 New-build project + its units</td><td>🖼️ Photos, floor plan / video / 3D tour flags</td></tr>
<tr><td>📅 Created, published, modified, days online</td><td>📝 Description, equipment and location text*</td><td>🔁 NEW / PRICE_CHANGED + earlier price (monitor)</td></tr>
</table>

\* with **Include listing details** on (or for a listing URL / id input).

### How to scrape ImmobilienScout24 with ImmobilienScout24 Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) — the free plan includes monthly credit.
2. Open **ImmobilienScout24 Scraper** and paste a search URL from immobilienscout24.de (or type a place name).
3. Set **Max results** and any filters; turn on **Include listing details** if you need descriptions, e-mails or purchase costs.
4. Click **Start**.
5. Download the dataset as JSON, CSV or Excel, or read it through the API.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| `startUrls` | array | immobilienscout24.de search URLs (`/Suche/...`) with any filters set on the site, listing URLs (`/expose/<id>`) or bare ids, and immobilienscout24.at search (`/regional/...`) or listing URLs. |
| `locations` | array | Place names resolved by ImmobilienScout24's own place lookup ("Berlin", "Hamburg-Altona"), or a geo path like `de/berlin/berlin`. |
| `latitude`, `longitude`, `radiusKm` | number | Radius search around a point, 1-100 km. Default radius 5. |
| `offerType`, `propertyType` | select | Rent or buy; apartment, house, plot, short stay, WG room, garage. Default rent + apartment. |
| `minPrice` … `maxConstructionYear` | number | Price (cold or warm rent via `priceType`), rooms, living space, construction year. |
| `energyClasses`, `equipment`, `apartmentTypes`, `houseTypes`, `heatingTypes` | select | The site's own filters (balcony, kitchen, lift, garden, cellar, guest toilet, step-free, parking…). |
| `minFloor`, `maxFloor`, `keyword`, `newBuildOnly`, `excludeProjectUnits`, `commissionFreeOnly`, `excludeRentedOut`, `petsAllowed`, `minInternetSpeedMbps` | various | More site filters, applied by ImmobilienScout24 itself. |
| `sort` | select | Newest first (default), standard, price, size or rooms up/down. |
| `sellerType`, `withPhoneOnly`, `withEmailOnly`, `postalCodes`, `earlyAccess`, `minPlotArea`, `maxPlotArea`, `postedWithinDays`, `postedAfter`, `titleIncludes`, `titleExcludes` | various | Checked on every listing before it is delivered or charged. |
| `includeDetails` | boolean | Adds the listing details (one extra request per listing). Default off. |
| `monitorMode`, `monitorStoreName`, `resetMonitorState`, `webhookUrl` | various | Only new or re-priced listings; a JSON POST with them at the end of the run. |
| `maxResults` | integer | Total cap across searches. Default 100, 0 = no cap. |
| `maxResultsPerSearch`, `startPage`, `compact` | various | Per-search cap, resume from a page, core fields only. |
| `searchSurface` | select | `auto` (default), `web` or `app` — see below. |
| `maxConcurrency`, `proxyConfiguration` | various | Parallel detail requests (default 5); optional own proxy. Leave the proxy empty. |

#### Input JSON

```json
{
  "startUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500.0&numberofrooms=2.0-"],
  "locations": ["München Schwabing"],
  "offerType": "rent",
  "propertyType": "apartment",
  "maxResults": 500,
  "includeDetails": true,
  "monitorMode": false
}
```

#### Paste a search URL when you already filtered on the site

Set every filter on immobilienscout24.de, copy the address bar and paste it. The actor keeps every parameter and walks all pages of that search; paging and page size are its job, so `pagenumber` in the URL is ignored (use **Start page** to resume).

#### Pick the search source only if you need to

The website search is the complete one: it lists MieterPlus early-access rentals and carries the agent's phone on each result. In our 2026-10-16 measurements the website listed 5,072 Hamburg rental apartments where the ImmoScout24 app search listed 922 (Berlin 12,812 vs 4,396; Munich purchases 5,041 vs 4,749). **Auto** reads the website search and, when the website asks the run's connection for human verification, carries on with the app search (that check is never answered). **App** is faster for very large runs; **Web** never switches.

### ⬆️ Output

A search row (website search, Hamburg, 2026-10-16), excerpt:

```json
{
  "id": "171840170",
  "url": "https://www.immobilienscout24.de/expose/171840170",
  "title": "Erdgeschoss in Hamburg",
  "offerType": "rent",
  "price": 1137.2,
  "coldRent": 1137.2,
  "warmRent": 1393.2,
  "pricePerSqm": 17.72,
  "livingSpace": 64.16,
  "rooms": 2,
  "energyEfficiencyClass": "A",
  "balcony": true,
  "builtInKitchen": true,
  "street": "Holsteiner Chaussee",
  "houseNumber": "193",
  "postcode": "22457",
  "city": "Hamburg",
  "district": "Schnelsen",
  "latitude": 53.62547,
  "longitude": 9.90895,
  "contactCompany": "DGIM Deutsche Gesellschaft für Immobilienmanagement mbH",
  "contactPhone": "030 25925613",
  "fairPriceRating": "FAIR_OFFER",
  "isPlusExclusive": false
}
```

With **Include listing details** (purchase, Munich), excerpt of the added fields:

```json
{
  "id": "171842094",
  "price": 895000,
  "floor": "2 von 3",
  "bedrooms": 3,
  "condition": "Gepflegt",
  "heatingType": "Fernwärme",
  "purchaseAdditionalCosts": 70526,
  "purchaseTotalCosts": 965526,
  "landTransferTax": 31325,
  "notaryCosts": 13425,
  "landRegistryCosts": 4475,
  "brokerCommissionRate": 2.38,
  "areaPricePerSqmMin": 6750,
  "areaPricePerSqmMax": 14950,
  "pricePositionInArea": 0.23,
  "agentCompany": "KENSINGTON Finest Properties International München Süd-Ost",
  "agentPhones": ["0173 3573007", "+49 173 3573007"],
  "agentEmails": ["muenchensuedost@kensington-international.com", "…"],
  "detailsFetched": true
}
```

#### Fields and measured fill

Share of rows with a value, from local runs on 2026-10-16: website search (Hamburg rent, 100 rows; Cologne rent, 1,000 rows), app search (Hamburg rent, 100), and with details (Hamburg rent via the app, 100; Munich purchase via the website, 40). A missing value is `null`, never a made-up zero.

| Field | Website search | App search | With details |
|---|---|---|---|
| `id`, `url`, `title`, `price`, `livingSpace`, `rooms`, `postcode`, `city`, `district` | 100% | 100% | 100% |
| `warmRent` (rentals) | 100% | — | 100% |
| `street` + `houseNumber`, `latitude` / `longitude` | 62-75% | 75-80% | 33-75% (the provider hides some addresses) |
| `constructionYear` | 66-82% | — | 82-96% |
| `energyEfficiencyClass` | 30-47% | 47% | 52-75% |
| `balcony`, `builtInKitchen`, `garden` | 100% | — | 100% |
| `contactName` | 98-100% | — | 100% |
| `contactCompany` | 57-62% | — | 62-91% |
| `contactPhone` (search result) | 23-28% rent, 52% purchase | — | — |
| `agentPhones` / `agentEmails` (Impressum) | — | — | 62-95% / 62-91% |
| `createdAt`, `publishedAt`, `daysOnMarket` | 91-100% | `publishedLabel` 100% | as the search |
| `isPlusExclusive`, `tags`, `fairPriceRating` | 100%, 84-96%, 25-56% | — | as the search |
| `description`, `floor`, `heatingType` | — | — | 99-100%, 79-91%, 79-82% |
| `serviceCharge`, `deposit` (rentals) | — | — | 99%, 98% |
| Purchase costs (`landTransferTax`, `notaryCosts`…) (purchases) | — | — | 95% |
| `areaPricePerSqmMin/Max`, `pricePositionInArea` (purchases) | — | — | 85% |
| `mainImageUrl`, `imageUrls` | 93-99% | 99% | 99-100% |

`RUN_SUMMARY` in the key-value store lists, per search, the site's total, pages read, the search source used, coverage, and why the search stopped.

### Use cases

- 🏢 **Property managers and agencies** — find new landlords and private sellers with a phone number, every morning.
- 📈 **Investors** — price per m², purchase costs and the local price range for every flat in a district.
- 🧮 **Rent analysts** — cold vs warm rent, size and equipment across a whole city.
- 🔔 **Flat hunters** — monitor mode on a schedule: only new and re-priced listings, straight to Slack or e-mail.
- 🗺️ **Proptech and research** — GPS, energy class and construction year for mapping and models.
- 🤖 **AI agents** — compact rows over MCP: "two-room flats under €1,200 warm in Leipzig posted this week".

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

Pay per result, no start fee: **$0.0001 per listing** ($0.10 per 1,000). Listing details are included in that price. Filtered, duplicate, unchanged (monitor mode) and unreachable listings are never charged.

| Run | Listings | Cost |
|---|---|---|
| Demo (prefill) | 20 | $0.002 |
| Typical search | 100 | $0.01 |
| A city district | 1,000 | $0.10 |
| A whole city | 10,000 | $1.00 |

Apify's free plan credit covers thousands of listings a month.

### Integrations, API, scheduling & MCP

- **Schedule** the actor daily with **Only new or re-priced listings** on; add a **Webhook URL** to get the new ones as one JSON POST.
- **Make**, **Zapier**, **n8n**, **Google Sheets**, **Slack** and **Airtable** from the Integrations tab.
- **API**: run it from [Python](https://apify.com/scrapersdelight/immobilienscout24-scraper/api/python) or [JavaScript](https://apify.com/scrapersdelight/immobilienscout24-scraper/api/javascript) with `apify-client`, then read the dataset.
- **MCP**: connect it to Claude, ChatGPT or Cursor through the [MCP tab](https://apify.com/scrapersdelight/immobilienscout24-scraper/api/mcp); turn on **Compact rows** for shorter answers.

### More property scrapers

<table>
<tr><td>🇪🇸 <a href="https://apify.com/scrapersdelight/idealista-scraper"><b>Idealista Scraper</b></a><br>Spain, Italy and Portugal listings.</td><td>🇪🇸 <a href="https://apify.com/scrapersdelight/fotocasa-scraper"><b>Fotocasa Scraper</b></a><br>Spanish listings and agents.</td><td>🇬🇧 <a href="https://apify.com/scrapersdelight/rightmove-scraper"><b>Rightmove Scraper</b></a><br>UK listings and agents.</td></tr>
<tr><td>🌍 <a href="https://apify.com/scrapersdelight/kyero-property-scraper"><b>Kyero Property Scraper</b></a><br>Spanish property + agent contacts.</td><td>🇦🇺 <a href="https://apify.com/scrapersdelight/realestate-com-au-scraper"><b>Realestate.com.au Scraper</b></a><br>Australian buy, rent and sold.</td><td>🇦🇺 <a href="https://apify.com/scrapersdelight/domain-com-au-scraper"><b>Domain.com.au Scraper</b></a><br>Listings, sold prices and agents.</td></tr>
</table>

See every actor on our [profile](https://apify.com/scrapersdelight).

### Limits & empty runs

- The website search is read at about **20 pages (400 listings) a minute** — it asks a connection for human verification when it reads faster. 1,000 listings took about 3 minutes; the app search did 1,000 in about a minute.
- When the website asks for human verification it is never answered. In **Auto** the app search carries on (fewer big-city rentals, no phone in the search row); in **Web** the run stops with what it has.
- Listing details come from ImmobilienScout24's listing data: one extra request per listing, 5 in parallel; 100 listings with details took about 11 seconds longer than without.
- immobilienscout24.at searches read up to 100 pages (1,500 listings) per search; immoscout24.ch is a separate Swiss site and is not supported.
- A search with no matches ends with **0 rows and nothing charged**.

### ❓ FAQ

#### How much does ImmobilienScout24 Scraper cost?

$0.0001 per delivered listing, details included, no start fee. 1,000 listings cost $0.10.

#### How many listings can ImmobilienScout24 Scraper return?

Every listing of a search: a Berlin rental search had 12,812 on 2026-10-16. Set **Max results** to 0 for no cap; the website search runs at about 400 listings a minute.

#### Does ImmobilienScout24 Scraper return agent phone numbers and e-mails?

The search row carries the phone the agent publishes (23-52% of listings in our runs). With **Include listing details** you also get the phones and e-mails from the provider's Impressum (62-95%). **With a phone number only** and **With an e-mail address only** keep just those listings.

#### Can ImmobilienScout24 Scraper get MieterPlus early-access listings?

Yes. The website search lists them with `isPlusExclusive: true` and `plusExclusiveUntil`; **MieterPlus early access** keeps only them or leaves them out.

#### Can I schedule ImmobilienScout24 Scraper to watch a city?

Yes. Turn on **Only new or re-priced listings**, schedule the run daily, and add a webhook. Unchanged listings are skipped and not charged; `RUN_SUMMARY` lists the ones removed since the last run.

#### Does ImmobilienScout24 Scraper work for Austria?

Yes: paste immobilienscout24.at search (`/regional/...`) or listing URLs. Rows carry `country: "AT"`.

#### Can I use ImmobilienScout24 Scraper with the Apify API or an MCP server?

Yes — see the API tab for Python and JavaScript, and the MCP tab for Claude, ChatGPT and Cursor.

#### Do I need an ImmobilienScout24 account or API key?

No. The actor reads public search results and listing data; no login, no cookies, no API key.

#### Why did my ImmobilienScout24 Scraper run return no results?

The search had no matches (check the URL in a browser), a filter removed every listing (`RUN_SUMMARY` → `counters.filteredOut`), or the place name was not found by the site's place lookup (the run log says so).

#### Your feedback

Something missing or wrong? Open an issue on the [Issues tab](https://apify.com/scrapersdelight/immobilienscout24-scraper/issues/open) — we read every one.

# Actor input Schema

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

immobilienscout24.de search URLs (/Suche/...) with any filters set on the site, listing URLs (/expose/<id>) or bare listing ids, and immobilienscout24.at search (/regional/...) or listing URLs. e.g. "https://www.immobilienscout24.de/Suche/de/bayern/muenchen/wohnung-kaufen?price=-500000.0"

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

City, district or quarter names, resolved by ImmobilienScout24's own place lookup and searched with the filters below. e.g. "Berlin", "München Schwabing", "Hamburg-Altona". A geo path like "de/berlin/berlin" also works.

## `latitude` (type: `number`):

Centre of a radius search (with longitude and radius), e.g. 52.52. Uses the filters below.

## `longitude` (type: `number`):

Centre of a radius search, e.g. 13.405.

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

Radius around the latitude/longitude, 1-100 km.

## `offerType` (type: `string`):

Rent or buy listings.

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

What kind of property to search for.

## `minPrice` (type: `integer`):

Lower price bound. Rent searches filter on cold rent unless "Price means" is warm rent.

## `maxPrice` (type: `integer`):

Upper price bound, e.g. 1200 for rent or 500000 for buy.

## `priceType` (type: `string`):

For rent searches: whether the price bounds apply to cold or warm rent.

## `minRooms` (type: `number`):

e.g. 2 or 2.5.

## `maxRooms` (type: `number`):

Upper bound on rooms.

## `minLivingSpace` (type: `integer`):

e.g. 50.

## `maxLivingSpace` (type: `integer`):

Upper bound on living space.

## `minConstructionYear` (type: `integer`):

e.g. 2000.

## `maxConstructionYear` (type: `integer`):

e.g. 1950 for pre-war buildings.

## `energyClasses` (type: `array`):

Only listings in these classes. Empty = any.

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

Only listings with all of these. Empty = any.

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

Apartment searches only. Empty = any.

## `houseTypes` (type: `array`):

House searches only. Empty = any.

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

Only listings with one of these heating types. Empty = any.

## `minFloor` (type: `integer`):

Apartments: lowest floor, 0 = ground floor.

## `maxFloor` (type: `integer`):

Apartments: highest floor.

## `keyword` (type: `string`):

ImmobilienScout24's own full-text search, e.g. "altbau" or "altbau balkon".

## `newBuildOnly` (type: `boolean`):

Only new-build (Neubau) listings.

## `excludeProjectUnits` (type: `boolean`):

Leave out the individual units of developer projects (grouped listings).

## `commissionFreeOnly` (type: `boolean`):

Only listings without a buyer's or tenant's commission (provisionsfrei).

## `excludeRentedOut` (type: `boolean`):

Purchases only: leave out properties that are currently let.

## `petsAllowed` (type: `boolean`):

Rentals only: only listings that allow pets.

## `minInternetSpeedMbps` (type: `integer`):

Only listings where at least this speed is available at the address, e.g. 100.

## `sort` (type: `string`):

Result order. Applies to pasted URLs that carry no sorting of their own too. "Newest first" lets "Posted within" stop early.

## `sellerType` (type: `string`):

Private offers vs agencies (the listing's own private-offer flag).

## `withPhoneOnly` (type: `boolean`):

Only listings that carry a contact phone (search phone fields, or the provider's Impressum phones when details are on).

## `withEmailOnly` (type: `boolean`):

Only listings whose provider publishes an e-mail address in the listing's Impressum. Reads listing details (switched on automatically).

## `postalCodes` (type: `array`):

Keep listings whose postcode starts with one of these, e.g. "10115" or a prefix like "80" (Munich area). Empty = any.

## `earlyAccess` (type: `string`):

Listings ImmobilienScout24 shows MieterPlus subscribers first (flagged on website search rows). The app search never carries them.

## `minPlotArea` (type: `integer`):

Checked on each listing (the site's search has no plot filter); listings that state no plot area are left out.

## `maxPlotArea` (type: `integer`):

Upper bound on plot area, checked on each listing.

## `postedWithinDays` (type: `integer`):

Only listings published in the last N days. 0 = any age. Pairs with "Newest first" and a daily schedule.

## `postedAfter` (type: `string`):

Only listings published on or after this date (YYYY-MM-DD). Combines with "Posted within": the later of the two applies.

## `titleIncludes` (type: `array`):

Keep listings whose title contains one of these words, e.g. "Altbau", "provisionsfrei".

## `titleExcludes` (type: `array`):

Drop listings whose title contains one of these words, e.g. "Tausch", "WBS".

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

Adds the full description, every attribute (floor, bedrooms, bathrooms, available from, heating, energy certificate, service charge, deposit, commission), the provider's Impressum with its phone numbers and e-mails, rating, and the full photo set.

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

Delivers only listings not delivered by an earlier run, or whose price changed (changeType NEW / PRICE_CHANGED). Unchanged listings are skipped and not charged. Pairs with a daily schedule.

## `webhookUrl` (type: `string`):

Optional. One JSON POST at the end of the run with the listings it delivered (in monitor mode: the new and re-priced ones), e.g. a Make, Zapier or n8n hook.

## `monitorStoreName` (type: `string`):

Name of the key-value store that remembers delivered listings. Use one name per watch list. Empty = "immobilienscout24-monitor-state".

## `resetMonitorState` (type: `boolean`):

Forget what earlier runs delivered; every listing counts as new on this run.

## `maxResults` (type: `integer`):

Maximum listings in total across all searches. 0 = no cap (a Berlin rental search holds ~12,800). Large web searches are paced by the site (~400 listings a minute).

## `maxResultsPerSearch` (type: `integer`):

Cap per search URL / place. 0 = no cap per search.

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

Resume a large search: begin at this result page (20 listings a page on .de, 15 on .at). 1 = from the start.

## `compact` (type: `boolean`):

Core fields only (id, link, price, size, rooms, address, coordinates, contact, dates) - trimmed for spreadsheets and LLM pipelines.

## `searchSurface` (type: `string`):

Where .de searches are read. The website search is the complete one. When the website asks the run's connection for human verification (never answered), Auto continues the same search on the ImmoScout24 app API, which lists fewer big-city rentals (RUN_SUMMARY shows both totals). Listing details always come from the app's listing data.

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

Parallel listing-detail requests (1-10).

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

Optional. Leave empty: the actor uses its own route ladder (direct first, then a residential proxy only when needed). Your own proxy URLs are used first when given.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
  ],
  "locations": [],
  "radiusKm": 5,
  "offerType": "rent",
  "propertyType": "apartment",
  "priceType": "coldRent",
  "energyClasses": [],
  "equipment": [],
  "apartmentTypes": [],
  "houseTypes": [],
  "heatingTypes": [],
  "keyword": "",
  "newBuildOnly": false,
  "excludeProjectUnits": false,
  "commissionFreeOnly": false,
  "excludeRentedOut": false,
  "petsAllowed": false,
  "sort": "newest",
  "sellerType": "any",
  "withPhoneOnly": false,
  "withEmailOnly": false,
  "postalCodes": [],
  "earlyAccess": "any",
  "postedWithinDays": 0,
  "postedAfter": "",
  "titleIncludes": [],
  "titleExcludes": [],
  "includeDetails": false,
  "monitorMode": false,
  "webhookUrl": "",
  "monitorStoreName": "",
  "resetMonitorState": false,
  "maxResults": 20,
  "maxResultsPerSearch": 0,
  "startPage": 1,
  "compact": false,
  "searchSurface": "auto",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/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 = {
    "startUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/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 '{
  "startUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
  ],
  "maxResults": 20
}' |
apify call scrapersdelight/immobilienscout24-scraper --silent --output-dataset

```

## MCP server setup

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