# ImmoScout24 Scraper - Germany and Austria (`phantom_coder/immoscout24-scraper`) Actor

Scrape ImmoScout24 listings from immobilienscout24.de and immobilienscout24.at: prices, rent costs, areas, energy data, coordinates, images, and seller contacts. Search by URL or location, with monitoring mode for new listings.

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

## Pricing

from $0.90 / 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.
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

Scrape ImmoScout24 listings in Germany and Austria - prices, rent costs, living space, energy data, coordinates, images, and seller contacts - from a search URL or a city name. No ImmoScout24 account or API key required.

### Who is this for

- **Property investors** comparing purchase prices, price per m², and energy classes across cities and districts before they make an offer.
- **Real estate agencies and proptech teams** tracking competitors' listings and finding which agencies are active in a postcode, with phone numbers and imprint emails.
- **Relocation services and apartment hunters** getting new rentals soon after they appear, by running the Actor every hour in monitoring mode.
- **Market researchers and analysts** building rent and price datasets for Germany and Austria with exact coordinates for mapping.
- **Mortgage brokers and energy consultants** finding listings with poor energy classes (for example `energyEfficiencyClass` F, G, or H) as renovation and financing leads.

### Why it's different

- **One flat record per listing.** Every field is a top-level column (only lists like `images` and the `allAttributes` lookup stay nested), so the output opens cleanly in Excel or Google Sheets and maps directly in Make, Zapier, and n8n. You get `coldRent: 362`, `warmRent: 569`, `latitude: 52.52485`, not a nested API blob you have to unpack.
- **Full Austrian searches.** immobilienscout24.at shows at most 100 pages per search. When a search has more results, the Actor splits it into price bands automatically (outside monitoring mode, which only needs the newest listings). A test on all rentals in Vienna returned 3,884 of 3,896 listings, against the 2,500 a single search can show.
- **Monitoring with no extra fee.** Turn on monitoring mode, and later runs only return listings that weren't in the search before. You pay only for new listings, not for checking the old ones.
- **Agency contacts from the imprint.** For German listings, the Actor reads the agency's legal imprint, which usually contains an email address and phone number, even when the listing hides the phone.
- **Germany and Austria in one run.** Mix immobilienscout24.de and immobilienscout24.at URLs in the same input. Each listing has a `country` field.

### What you get

- Prices: cold rent, warm rent, service charge, heating costs, purchase price, price per m², deposit, commission, and homeowners' association (HOA) fee, known as Hausgeld
- Size: living space, usable area, plot area, rooms, bedrooms, bathrooms, floor, and number of floors
- Location: street, house number, postcode, city, district, quarter, state, and coordinates with a precision flag
- Building: year built, last refurbishment, condition, interior quality, heating type, and energy sources
- Energy certificate: certificate type, energy class, energy consumption, heating demand (Heizwärmebedarf, HWB), and total energy efficiency factor (fGEE, Austria)
- Features: balcony, garden, cellar, elevator, built-in kitchen, step-free access, parking, pets, and more
- Full description, equipment, location, and other text sections
- Every listing image URL
- Seller: private or commercial, contact name, company, phone numbers, agency website, ImmoScout24 profile, and imprint
- Publish and update dates (Austria), or the relative age shown on the site (Germany)
- ImmoScout24's fair-price rating and the local market price range per m² (Germany)

### How to use

<ol>
<li>Open <a href="https://www.immobilienscout24.de">immobilienscout24.de</a> or <a href="https://www.immobilienscout24.at">immobilienscout24.at</a> and run a search with the filters you want: location, price, rooms, size, and so on.</li>
<li>Copy the URL from your browser's address bar.</li>
<li>Paste it into <b>Start URLs</b>. Add as many search or listing URLs as you like.</li>
<li>Or skip the URL and fill in <b>Location</b>, <b>Country</b>, <b>Rent or buy</b>, and the price, room, and size filters.</li>
<li>Set <b>Max listings</b> to how many listings you want in total.</li>
<li>Click <b>Start</b>. Download the results as JSON, CSV, or Excel, or read them through the API.</li>
</ol>

> ⚠️ **0 results in monitoring mode is normal.** It means no listings were published since the last run. The first run with monitoring mode saves listings up to **Max listings** and records the rest of the search as the starting point, without charging for it.

### Input configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | - | Search or listing URLs from immobilienscout24.de or immobilienscout24.at. Region, radius, and shape searches are supported. |
| `location` | string | - | City, district, or region for the simple search, for example `München` or `Graz`. In Austria you can also use a state (`Tirol`) or a 4-digit postcode (`8010`). |
| `country` | string | `DE` | Site for the simple search: `DE` or `AT`. |
| `transferType` | string | `rent` | `rent` or `buy`, for the simple search. |
| `propertyType` | string | `apartment` | `apartment` or `house`, for the simple search. |
| `minPrice`, `maxPrice` | integer | - | Monthly rent or purchase price in euros, for the simple search. |
| `minRooms`, `maxRooms` | integer | - | Number of rooms, for the simple search. |
| `minLivingSpace`, `maxLivingSpace` | integer | - | Living space in m², for the simple search. |
| `maxItems` | integer | `100` | Maximum listings saved in the run, across all URLs. Set to `0` for no limit. |
| `includeDetails` | boolean | `true` | Load each listing's detail page. Turn off for a faster run with only search result data. |
| `monitoringMode` | boolean | `false` | Only save listings that weren't in the same search on previous runs. |
| `monitoringName` | string | - | Optional name for a separate list of seen listings, for example when two schedules watch the same search for different people. |
| `includeRawData` | boolean | `false` | Add the original ImmoScout24 responses in a `raw` field. |
| `maxConcurrency` | integer | `10` | How many detail pages to load at the same time. |
| `proxyConfiguration` | object | no proxy | Not needed in most cases. Enable Apify Proxy if the log reports blocked requests. |

Example input:

```json
{
    "startUrls": [
        { "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?price=-1500.0&numberofrooms=2.0-" },
        { "url": "https://www.immobilienscout24.at/regional/wien/wien/wohnung-kaufen" }
    ],
    "location": "Hamburg",
    "country": "DE",
    "transferType": "buy",
    "propertyType": "house",
    "maxPrice": 900000,
    "maxItems": 500,
    "includeDetails": true,
    "monitoringMode": false
}
```

### Output

Each listing is one flat record. Fields without data are `null` or empty (`[]` or `{}`). The examples below are shortened.

#### German listing

```json
{
    "id": "168052908",
    "url": "https://www.immobilienscout24.de/expose/168052908",
    "country": "DE",
    "title": "Naturverbunden wohnen in kompakter 2-Zimmer-Gartenwohnung mit WBS-140-Förderung",
    "transferType": "RENT",
    "propertyType": "apartment",
    "propertySubtype": "ground_floor",
    "isProject": true,
    "isNewBuilding": true,
    "price": 362,
    "coldRent": 362,
    "warmRent": 569,
    "pricePerSqm": 7,
    "currency": "EUR",
    "livingSpace": 51.7,
    "rooms": 2,
    "floor": 0,
    "street": "Hellersdorfer Straße",
    "houseNumber": "91",
    "postcode": "12619",
    "city": "Berlin",
    "district": "Marzahn Hellersdorf",
    "quarter": "Hellersdorf",
    "state": "Berlin",
    "address": "Hellersdorfer Straße 91, 12619 Hellersdorf, Berlin",
    "isAddressVisible": true,
    "latitude": 52.52485,
    "longitude": 13.58695,
    "coordinatePrecision": "exact",
    "yearBuilt": 2025,
    "condition": "first_time_use",
    "heatingType": "district_heating",
    "energySources": "Fernwärme",
    "energyCertificateType": "Bedarfsausweis",
    "energyEfficiencyClass": "B",
    "energyConsumption": 59.9,
    "features": ["wbs_required"],
    "availableFrom": "16.10.2026",
    "description": "Die Wohnung wird ausschließlich an einen 2-Personen-Haushalt vermietet...",
    "images": ["https://pictures.immobilienscout24.de/listings/...jpg"],
    "imageCount": 10,
    "isPrivateSeller": false,
    "contactName": "Vermietungsteam Neubau",
    "contactCompany": "Example Wohnungsbau AG",
    "contactPhone": null,
    "agencyProfileUrl": "https://www.immobilienscout24.de/anbieter/...",
    "agencyEmail": "info@example-wohnungsbau.de",
    "agencyPhone": "030 1234567",
    "publishedAt": null,
    "publishedText": "vor einem Monat",
    "fairPriceRating": null,
    "marketPricePerSqmMin": 6.2,
    "marketPricePerSqmMax": 10.2,
    "detailsScraped": true,
    "searchUrl": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten",
    "scrapedAt": "2026-10-21T17:42:40.029Z"
}
```

#### Austrian listing

```json
{
    "id": "6abf58305659d16f8b12f960",
    "url": "https://www.immobilienscout24.at/expose/6abf58305659d16f8b12f960",
    "country": "AT",
    "title": "Neubau 3-Zimmer-Wohnung mit großem Balkon Alte Donau",
    "transferType": "RENT",
    "propertyType": "apartment",
    "propertySubtype": "floor_apartment",
    "isNewBuilding": true,
    "price": 1750,
    "warmRent": 1750,
    "pricePerSqm": 24.31,
    "deposit": "5.250",
    "livingSpace": 72,
    "rooms": 3,
    "bathrooms": 1,
    "postcode": "1210",
    "city": "Wien",
    "latitude": 48.24604,
    "longitude": 16.42027,
    "coordinatePrecision": "exact",
    "heatingType": "floor_heating",
    "energySources": "district_heating",
    "energyEfficiencyClass": "B",
    "heatingDemand": 23.9,
    "totalEnergyEfficiencyFactor": 0.74,
    "features": ["balcony", "cellar", "guest_toilet", "fitted_kitchen", "lift"],
    "balcony": true,
    "lift": true,
    "availableFrom": "1.10.2026",
    "imageCount": 14,
    "isPrivateSeller": true,
    "contactFirstName": "Anna",
    "contactLastName": null,
    "contactCompany": null,
    "publishedAt": "2026-10-02T07:07:28.000Z",
    "updatedAt": "2026-10-02T11:49:18.560Z",
    "detailsScraped": true
}
```

#### Listing that couldn't be loaded

Listings removed from ImmoScout24 are skipped and not charged. The log shows how many were skipped. If the detail page of a listing found through a search fails after several retries, the Actor saves what the search results showed, charged as a normal listing, and marks it:

```json
{
    "id": "171975800",
    "title": "2-Zimmer-Wohnung in Pankow",
    "price": 800,
    "livingSpace": 71,
    "rooms": 2,
    "description": null,
    "detailsScraped": false
}
```

### Understanding the data

- **`price`** is the main price shown on the listing: cold rent (Kaltmiete) for German rentals, the total monthly rent for Austrian rentals, and the purchase price for sales. The other price fields break it down where the listing provides the numbers.
- **`coordinatePrecision`** tells you how far to trust the location:

| `isAddressVisible` | `coordinatePrecision` | Typical meaning |
|---|---|---|
| `true` | `exact` | Coordinates of the building. |
| `false` | `approximate` | The seller hid the address. Coordinates are the center of the postcode area (Germany) or ImmoScout24's area estimate (Austria). |
| `false` | `null` | No location data beyond postcode and city. |

- **`isPrivateSeller`** is `true` for listings posted by private owners. Private sellers on ImmoScout24 usually don't publish a phone number, so `contactPhone` is often `null` for them.
- **Text values in German.** For German listings, `energySources`, `energyCertificateType`, `availableFrom`, `deposit`, `commission`, and `publishedText` are kept exactly as shown on the site, usually in German. Fields like `condition` and `heatingType`, and all Austrian codes, use ImmoScout24's English codes.
- **Feature and type codes differ by country.** Germany uses codes like `built_in_kitchen`, and Austria uses ImmoScout24's own codes like `fitted_kitchen`. German features without a code are kept as the label shown on the site. Use the boolean fields (`builtInKitchen`, `balcony`, and so on) to compare across countries.
- **`allAttributes`** holds every attribute row from a German listing page (label and value), for anything not mapped to its own field.

### Common use cases

- **Price per m² by district.** Scrape a city with `includeDetails` on and `maxItems` set to `0`, group by `district`, and average `pricePerSqm`. All Berlin rentals (about 4,500 listings) cost about $7 on the Free plan.
- **New rental alerts.** Schedule a search every hour with `monitoringMode: true` and connect the dataset to Slack or email. A city with 50 new listings a day costs about $2.25 a month on the Free plan.
- **Renovation leads.** Filter purchase listings for `energyEfficiencyClass` in `F`, `G`, or `H` and `yearBuilt < 1980` to find properties that need energy upgrades.
- **Agency prospecting.** Filter `isPrivateSeller: false`, group by `contactCompany`, and count listings to see which agencies dominate a postcode. Use `agencyEmail` and `agencyPhone` for outreach.
- **Investment screening.** For purchase listings, compare `pricePerSqm` against `marketPricePerSqmMin` and `marketPricePerSqmMax` to find listings priced below the local range.

### FAQ

**Do I need an ImmoScout24 account?**
No. The Actor reads public listing data and works without an account, login, or API key.

**Why am I getting 0 results?**
Check that your search URL shows results when you open it in a browser. In monitoring mode, 0 results means nothing new was published since the last run. For the simple search, try the city name as ImmoScout24 spells it, for example `München` instead of `Munich`.

**Does it work for Switzerland (immoscout24.ch)?**
Not yet. immoscout24.ch is a separate site with a different setup. The Actor supports Germany and Austria.

**Do I need a proxy?**
Usually not. Test runs of several thousand listings worked without one. If the log reports blocked requests, enable Apify Proxy in the input.

**How does monitoring decide what's new?**
The Actor remembers every listing it has seen for each search, up to the newest 50,000. The first run saves listings up to **Max listings** and records the rest of the search as the starting point, without charging for it. With **Max listings** set to `0`, the first run saves and charges the whole search. If the first run stops early, for example at the run timeout, the next run finishes recording the starting point without charging for it. Later runs return only listings that weren't there before. Listing URLs in **Start URLs** are saved once, not on every run. The memory is stored in your account in a key-value store called `immoscout24-monitoring`, one record per search. Changing the search URL or filters starts a new search. Use **Monitoring name** to keep separate lists for the same search.

**Why is `publishedAt` empty for German listings?**
immobilienscout24.de doesn't publish exact dates. Use `publishedText` (for example "vor 12 Tagen", meaning 12 days ago) or monitoring mode to track new listings.

### Limitations

1. Germany (immobilienscout24.de) and Austria (immobilienscout24.at) only. Switzerland isn't supported.
2. Exact publish and update dates are available for Austria only.
3. Very large Austrian searches are split into price bands, so listings with "price on request" can be missed. In a test on all Vienna rentals, 12 of 3,896 listings were missed.
4. Phone numbers appear only when the seller publishes them. Seller email addresses aren't published by ImmoScout24. German agency emails come from the agency's public imprint.
5. Price history and days on market aren't included. Use monitoring mode and keep your own history to track price changes.
6. Simple search supports apartments and houses. For land, garages, commercial property, and other types, paste a search URL.
7. German commercial property (offices, retail, hospitality, industrial, and special purpose) is supported for rent only. For commercial property for sale, use investment property search URLs (`anlageobjekte`).

### Pricing

This Actor uses pay-per-event pricing. You pay a tiny fee when a run starts and a fixed price per listing saved:

| Event | Free | Starter | Scale | Business | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Actor start (per run, per GB of memory) | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
| Listing (per 1,000) | $1.50 | $1.30 | $1.10 | $0.90 | $0.90 | $0.90 |

The price per listing is the same with or without full details. Removed listings aren't charged, and in monitoring mode you pay only for new listings.

**Typical costs on the Free plan:**

- 100 listings: $0.15
- All ~4,500 rentals in Berlin: about $7
- Hourly monitoring of one city with 50 new listings a day: about $2.25 a month

You can set a maximum cost per run in the run options. The Actor stops when it reaches it.

### Output field reference

| Field | Description |
|---|---|
| `id` | ImmoScout24 listing ID (Scout-ID in Germany, 24-character ID in Austria) |
| `url` | Listing page URL |
| `country` | `DE` or `AT` |
| `title` | Listing headline |
| `transferType` | `RENT` or `BUY` (`null` for German commercial types that can be either) |
| `propertyType` | Germany: `apartment`, `house`, `land`, `garage`, `room`, `short_term_rental`, `commercial`, `investment`, or `auction`. Austria: ImmoScout24's type, for example `apartment` or `house` |
| `propertySubtype` | More specific type, for example `roof_storey`, `maisonette`, or `single_family_house`. German listings without one show ImmoScout24's search type, for example `housebuy` |
| `isProject` | Listing is part of a new-build project |
| `isNewBuilding` | New building or first occupancy |
| `price` | Main price shown on the listing (see "Understanding the data") |
| `coldRent` | Rent without service charges (Kaltmiete), in euros |
| `warmRent` | Total rent including service charges (Warmmiete or Gesamtmiete), in euros |
| `serviceCharge` | Monthly service charges (Nebenkosten or Betriebskosten), in euros |
| `heatingCosts` | Monthly heating costs, in euros |
| `purchasePrice` | Purchase price, in euros |
| `pricePerSqm` | Price per m² as calculated by ImmoScout24 |
| `deposit` | Deposit as entered by the seller |
| `commission` | Buyer's commission as entered by the seller |
| `hoaFee` | Monthly homeowners' association fee (Hausgeld), in euros |
| `currency` | Always `EUR` |
| `livingSpace` | Living space in m² |
| `usableArea` | Usable area in m² |
| `plotArea` | Plot area in m² |
| `rooms` | Number of rooms |
| `bedrooms` | Number of bedrooms |
| `bathrooms` | Number of bathrooms |
| `floor` | Floor of the apartment (0 = ground floor) |
| `numberOfFloors` | Floors in the building |
| `street`, `houseNumber` | Street address, when the seller shows it |
| `postcode`, `city`, `district`, `quarter`, `state` | Location names (`quarter` is Germany only) |
| `address` | Address as one line |
| `isAddressVisible` | The seller shows the full address |
| `latitude`, `longitude` | Coordinates |
| `coordinatePrecision` | `exact`, `approximate`, or `null` (see "Understanding the data") |
| `yearBuilt` | Year of construction |
| `lastRefurbished` | Year of the last refurbishment |
| `condition` | Condition code, for example `first_time_use`, `well_kept`, or `refurbished` |
| `interiorQuality` | Interior quality code, for example `normal`, `sophisticated`, or `luxury` (Germany) |
| `heatingType` | Heating type |
| `energySources` | Main energy sources |
| `energyCertificateType` | Energy certificate type, for example `Bedarfsausweis` or `Verbrauchsausweis` (Germany) |
| `energyEfficiencyClass` | Energy class (A+ to H in Germany, HWB class in Austria) |
| `energyConsumption` | Final energy consumption or demand in kWh/(m²·a) |
| `heatingDemand` | Heating demand (HWB) in kWh/(m²·a), Austria |
| `totalEnergyEfficiencyFactor` | Total energy efficiency factor (fGEE), Austria |
| `features` | List of feature codes, for example `balcony`, `cellar`, or `lift` (codes differ by country, see "Understanding the data") |
| `balcony`, `garden`, `cellar`, `lift`, `builtInKitchen`, `stepFreeAccess` | Feature flags (`true`, `false`, or `null` if unknown) |
| `petsAllowed` | Pets policy as given by the seller |
| `parkingSpaces` | Number of parking spaces |
| `isRented` | The property is currently rented out (for sales) |
| `availableFrom` | Move-in date as entered by the seller |
| `description` | Main description |
| `equipmentDescription` | Equipment and fittings section |
| `locationDescription` | Location section |
| `otherDescription` | Other text sections |
| `imageUrl` | First image URL |
| `images` | All image URLs |
| `imageCount` | Number of images |
| `isPrivateSeller` | `true` for private sellers, `false` for agencies and companies |
| `contactName` | Contact person or team |
| `contactFirstName`, `contactLastName` | Contact name parts (Austria) |
| `contactCompany` | Agency or company name |
| `contactPhone` | First published phone number |
| `contactPhones` | All published phone numbers |
| `contactAddress` | Agency address |
| `agencyWebsite` | Agency website |
| `agencyProfileUrl` | Agency profile on ImmoScout24 (Germany) |
| `agencyLogoUrl` | Agency logo URL |
| `agencyImprint` | Agency's legal imprint text (Germany) |
| `agencyEmail` | Email address from the imprint (Germany) |
| `agencyPhone` | Phone number from the imprint, when no phone is listed (Germany) |
| `publishedAt` | Publish date and time (Austria) |
| `updatedAt` | Last update date and time (Austria) |
| `publishedText` | Relative age shown on the site, for example "vor 12 Tagen" (Germany) |
| `fairPriceRating` | ImmoScout24's price rating, for example `FAIR_OFFER` (Germany) |
| `marketPricePerSqmMin`, `marketPricePerSqmMax` | Local price range per m² for similar listings (Germany) |
| `allAttributes` | Every attribute row from the listing page, label to value (Germany) |
| `detailsScraped` | `true` if the detail page was loaded |
| `searchUrl` | Website URL of the search that found the listing (`null` for German location searches and for listing URLs) |
| `scrapedAt` | When the listing was scraped |
| `raw` | Original ImmoScout24 responses, only with `includeRawData` |

### Support

Questions or issues? Open a ticket in the **Issues** tab on the Actor page.

# Actor input Schema

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

Search or listing URLs from immobilienscout24.de or immobilienscout24.at. Run a search on the website, then copy the URL from the address bar. Listing URLs (<code>…/expose/…</code>) scrape a single listing.

## `location` (type: `string`):

City, district, or region, for example <code>München</code>, <code>Hamburg Altona</code>, or <code>Graz</code>. In Austria you can also use a state (<code>Tirol</code>) or a 4-digit postcode (<code>8010</code>).

## `country` (type: `string`):

Search immobilienscout24.de or immobilienscout24.at.

## `transferType` (type: `string`):

Properties to rent or to buy.

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

Apartments or houses. For other property types, paste a search URL.

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

Minimum monthly rent or purchase price, in euros.

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

Maximum monthly rent or purchase price, in euros.

## `minRooms` (type: `integer`):

Minimum number of rooms.

## `maxRooms` (type: `integer`):

Maximum number of rooms.

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

Minimum living space, in m².

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

Maximum living space, in m².

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

Maximum number of listings to save in this run, across all URLs. Set to <code>0</code> for no limit.

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

Load each listing page for descriptions, all images, costs, energy data, features, and seller contacts. Turn off for a faster run with only search result data (price, area, rooms, address, and first image). The price per listing is the same either way.

## `monitoringMode` (type: `boolean`):

Only save listings that weren't in the search on previous runs, so you pay only for new listings. The first run saves listings up to <b>Max listings</b> and records the rest of the search as the starting point. Schedule the Actor to get new listings every hour or day.

## `monitoringName` (type: `string`):

Optional. Keeps a separate list of seen listings, for example when two schedules watch the same search for different people. Leave empty to share one list per search.

## `includeRawData` (type: `boolean`):

Add the original ImmoScout24 responses in a <code>raw</code> field, for fields not in the standard output. Makes results much larger.

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

How many listing detail pages to load at the same time.

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

Not needed in most cases. Enable Apify Proxy only if the log reports blocked requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
    }
  ],
  "country": "DE",
  "transferType": "rent",
  "propertyType": "apartment",
  "maxItems": 100,
  "includeDetails": true,
  "monitoringMode": false,
  "includeRawData": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
        }
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

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

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

```

## MCP server setup

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