# ImmoScout24 Scraper (`parsebird/immoscout24-scraper`) Actor

Scrape ImmobilienScout24 (immobilienscout24.de) property listings by city or search URL: price, rooms, living space, address, coordinates, amenities, agent, and images. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/immoscout24-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.69 / 1,000 property 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### ImmoScout24 Scraper

ImmoScout24 Scraper extracts structured property data from **[ImmobilienScout24](https://www.immobilienscout24.de/)** (ImmoScout24), Germany's largest real estate portal. Search by city or paste a search URL, and get clean listing records with price, rooms, living space, address, coordinates, amenities, agent contacts, and full image galleries.

<table><tr>
<td style="border-left:4px solid #009EE0;padding:12px 16px;font-weight:600">
Pick a city (or paste an ImmoScout24 search URL) and collect every listing with 50+ fields per property — price, m², rooms, floor, construction year, condition, heating, energy class, amenities, latitude/longitude, agent name and phone, and up to 30+ photos — ready for JSON, CSV, or Excel.
</td>
</tr></table>

##### Copy to your AI assistant

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

```
Actor: parsebird/immoscout24-scraper (ImmoScout24 Scraper on Apify).
Purpose: scrape property listings from ImmobilienScout24 (immobilienscout24.de).
Call it with the Apify API / ApifyClient. Input JSON:
{
  "mode": "location",                       // "location" or "url"
  "locations": [{ "state": "berlin", "city": "Berlin" }],  // state slug + city name
  "listingType": "buy",                     // "buy" or "rent"
  "propertyType": "apartment",              // "apartment" or "house"
  "priceMin": 200000, "priceMax": 600000,
  "roomsMin": 2, "livingSpaceMin": 60,
  "equipment": ["balcony", "lift"],         // balcony, builtinkitchen, garden, lift, cellar, guesttoilet, barrierfree
  "sortBy": "newest",                       // default, newest, priceAsc, priceDesc
  "maxPages": 10,                           // ~20 listings per page
  "maxListings": 200                        // total cap; billed row count
}
// URL mode: { "mode": "url", "urls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-500000&pagenumber=3"], "maxPages": 20 }
Output: one dataset item per listing with id, url, listingType, propertyType, title, addressFull, street,
postcode, city, quarter, latitude, longitude, priceValue, priceDisplay, baseRent, totalRent, rooms, bedrooms,
bathrooms, livingSpace, plotArea, floor, constructionYear, condition, heatingType, energyEfficiencyClass,
balcony, lift, garden, cellar, builtinKitchen, guestToilet, barrierFree, hasCourtage, isNew, imageCount,
images, floorplanUrl, contactName, contactCompany, contactPhone, descriptionText, tags, scrapedAt.
Pricing: pay-per-result, $0.99 per 1,000 listings. API docs: https://apify.com/parsebird/immoscout24-scraper/api
```

### What does ImmoScout24 Scraper do?

The **ImmoScout24 Scraper** turns an ImmobilienScout24 search into a dataset. You either describe the search (city, buy/rent, filters) or hand it a search URL you built on the site.

- 🏙️ **Location search** — pick one of the 16 German federal states and type any city or town name; the scraper resolves it to the right ImmoScout24 region.
- 🔗 **URL mode** — paste any `immobilienscout24.de/Suche/...` URL with your own filters. A `pagenumber=N` in the URL is used as the starting page, so you can resume or split large searches across runs.
- 🎛️ **Filters** — price, number of rooms, living space, construction year, required amenities (balcony, lift, garden, cellar, fitted kitchen, guest toilet, barrier-free), commission-free listings, and sort order.
- 🏠 **Buy or rent, apartments or houses** — every ImmoScout24 residential category.
- 📞 **Agent contacts** — agent name, company, phone number, and profile URL.
- 🖼️ **Full media** — every listing photo in high resolution, plus floorplan and energy-certificate PDFs when published.
- 📍 **Coordinates** — latitude and longitude when ImmoScout24 publishes the exact address.
- ⚡ **List-only mode** — turn off detail fetching for a faster, cheaper run when you only need the core fields.
- 📄 **Export anywhere** — JSON, CSV, Excel, or XML, plus the [Apify API](https://docs.apify.com/api/v2), scheduling, and [integrations](https://docs.apify.com/platform/integrations) with Make, Zapier, Google Sheets, and more.

### What data can you extract from ImmoScout24?

| Field | Description |
|-------|-------------|
| `id` / `url` | ImmoScout24 expose id and listing URL |
| `listingType` / `propertyType` | buy or rent; apartment or house |
| `title` | Listing headline |
| `addressFull` / `street` / `postcode` / `city` / `quarter` | Address breakdown |
| `latitude` / `longitude` | Coordinates when the full address is published |
| `priceValue` / `priceDisplay` / `priceCurrency` | Purchase price or base rent |
| `baseRent` / `totalRent` / `serviceCharge` | Rent breakdown (rentals) |
| `rooms` / `bedrooms` / `bathrooms` | Room counts |
| `livingSpace` / `plotArea` | Living area and plot size in m² |
| `floor` / `numberOfFloors` | Floor and building height |
| `constructionYear` / `lastRefurbishment` | Age of the building |
| `condition` / `interiorQuality` / `heatingType` / `energyEfficiencyClass` | Building details |
| `balcony` / `lift` / `garden` / `cellar` / `builtinKitchen` / `guestToilet` / `barrierFree` | Amenities |
| `hasCourtage` / `commissionInfo` | Buyer's commission |
| `isNew` / `isRented` / `isProject` / `isPrivate` | Listing flags |
| `imageCount` / `images` / `floorplanUrl` / `energyCertificateUrl` | Media |
| `contactName` / `contactCompany` / `contactPhone` / `agentProfileUrl` | Agent contact |
| `descriptionText` / `locationText` / `furnishingText` | Free-text sections |
| `tags` | Highlight tags (Provisionsfrei, Balkon/Terrasse, Aufzug, …) |
| `publishedRelative` / `scrapedAt` | When the listing went online (relative) and when it was scraped |

See the full [output schema and API reference](https://apify.com/parsebird/immoscout24-scraper/api).

### How to scrape ImmoScout24

1. Decide whether to search by **location** or by **URL**.
2. For location search: set `state` (e.g. `berlin`, `bayern`, `nordrhein-westfalen`) and `city` (e.g. `Berlin`, `München`, `Köln`), then pick `listingType`, `propertyType`, and any filters.
3. For URL search: open [ImmobilienScout24](https://www.immobilienscout24.de/), build your search with filters, and copy the URL from the address bar into the `urls` field.
4. Set **Max pages per search** and **Max listings** to control volume and cost.
5. Click **Start** and download the results as JSON, CSV, or Excel.

#### Input examples

Search by location with filters:

```json
{
  "locations": [{ "state": "berlin", "city": "Berlin" }],
  "listingType": "buy",
  "propertyType": "apartment",
  "priceMin": 200000,
  "priceMax": 600000,
  "roomsMin": 2,
  "livingSpaceMin": 60,
  "equipment": ["balcony", "lift"],
  "sortBy": "newest",
  "maxPages": 10
}
```

Multiple cities:

```json
{
  "locations": [
    { "state": "berlin", "city": "Berlin" },
    { "state": "bayern", "city": "München" },
    { "state": "hamburg", "city": "Hamburg" }
  ],
  "maxPages": 50
}
```

Direct URL with forward-walk pagination (scrapes pages 3 → 22):

```json
{
  "mode": "url",
  "urls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-500000&livingspace=50.0-&pagenumber=3"
  ],
  "maxPages": 20
}
```

### Output example

```json
{
  "id": "170670937",
  "url": "https://www.immobilienscout24.de/expose/170670937",
  "listingType": "buy",
  "propertyType": "apartment",
  "title": "Helle 3-Zimmer-Wohnung mit Balkon",
  "addressFull": "Sybelstraße 56, 10629 Berlin, Charlottenburg",
  "street": "Sybelstraße",
  "postcode": "10629",
  "city": "Berlin",
  "quarter": "Charlottenburg",
  "latitude": 52.50186,
  "longitude": 13.30649,
  "priceValue": 450000,
  "priceCurrency": "EUR",
  "priceDisplay": "450.000 €",
  "rooms": 3,
  "livingSpace": 85.5,
  "constructionYear": 1964,
  "balcony": true,
  "lift": true,
  "garden": false,
  "hasCourtage": false,
  "imageCount": 24,
  "images": ["https://pictures.immobilienscout24.de/listings/..."],
  "floorplanUrl": "https://d2qfnj9mv71tll.cloudfront.net/...pdf",
  "contactName": "Maximilian Verowski",
  "contactCompany": "Beispiel Immobilien GmbH",
  "contactPhone": "+49 30 86319244",
  "tags": ["Provisionsfrei", "Balkon/Terrasse", "Aufzug"],
  "isNew": false,
  "publishedRelative": "an hour ago",
  "scrapedAt": "2026-03-25T12:00:00.000Z"
}
```

Download results in JSON, CSV, Excel, or XML from the **Storage** tab or the Apify API.

### Use cases

- **Market analysis** — track asking prices, rent levels, and price per m² by city or quarter.
- **Lead generation** — build lists of agents and phone numbers for a target region.
- **New-listing monitoring** — schedule runs with `sortBy: newest` and detect new listings and price changes.
- **Investment research** — compare buy and rent markets across German cities.
- **Data enrichment** — feed structured listing data into CRMs, dashboards, and valuation models.

### How it works

1. In location mode, each city name is resolved to an ImmoScout24 region id. In URL mode, the search URL is parsed into the same search parameters and any `pagenumber` becomes the first page.
2. The scraper reads the search results page by page until it hits `maxPages`, `maxListings`, or the last page.
3. For each listing it (optionally) opens the detail page to add amenities, agent contact, the full photo gallery, floorplan, and description.
4. Requests go through Apify Proxy (German residential by default) with retries and light concurrency.

### Pricing

This actor uses the **pay-per-result** pricing model.

| Event | Price per 1,000 |
|-------|-----------------|
| Listing scraped | **$0.99** |

You are billed once per unique listing saved to the dataset. Scraping 1,000 listings costs about **$0.99** plus Apify platform and proxy usage. Set `maxListings` to cap your spend. New Apify accounts include monthly free platform credits.

### FAQ

**Location or URL mode — which should I use?**
Use **location mode** for a simple city search. Use **URL mode** when you have already built a detailed search on ImmobilienScout24 and want to keep exactly those filters, or when you want to resume a large search from a specific page.

**Why are latitude/longitude and street sometimes empty?**
ImmobilienScout24 only publishes the exact address (and therefore precise coordinates) for a subset of listings. When the address is approximate, those fields are left empty and `addressFull` contains the postcode, city, and quarter only.

**How many listings can I get from one search?**
ImmobilienScout24 paginates in pages of about 20 listings. Very large searches are capped by the site after a few hundred pages — split a big search into narrower ones (by price band, quarter, or property type) for full coverage.

**Does `noCommission` work for rentals?**
No. ImmobilienScout24 offers a commission-free filter only for for-sale searches, so the option is ignored (with a warning) when `listingType` is `rent`.

**How fresh is the data?**
Every run fetches live data. Use [Apify Scheduler](https://docs.apify.com/platform/schedule) to monitor a market over time.

**Can I call this actor from my own code?**
Yes. Use the [Apify API](https://apify.com/parsebird/immoscout24-scraper/api) or the official clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/immoscout24-scraper").call(run_input={
    "locations": [{"state": "berlin", "city": "Berlin"}],
    "listingType": "buy",
    "propertyType": "apartment",
    "maxPages": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["priceDisplay"], item["url"])
```

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/immoscout24-scraper').call({
    locations: [{ state: 'berlin', city: 'Berlin' }],
    listingType: 'buy',
    propertyType: 'apartment',
    maxPages: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Something looks wrong — how do I report it?**
Open an issue on the actor's **Issues** tab. Feedback and feature requests are welcome.

### Other real estate scrapers

- [Immobiliare.it Scraper](https://apify.com/parsebird/immobiliare-it-scraper) — Italy's largest real estate portal
- [Subito.it Scraper](https://apify.com/parsebird/subito-it-scraper) — Italian property classifieds
- [Homegate.ch Scraper](https://apify.com/parsebird/homegate-ch-scraper) — Swiss real estate marketplace
- Browse the full [ParseBird actor catalogue](https://apify.com/parsebird) for more scrapers.

### Is it legal to scrape ImmoScout24?

Scraping publicly available data is legal in most jurisdictions, including Germany and the EU, when it does not involve logging in, bypassing access controls, or collecting personal data without a lawful basis. This actor only accesses pages that any visitor can see without an account and does not collect private personal information. You are responsible for how you use the data, including compliance with the [GDPR](https://gdpr.eu/), ImmobilienScout24's terms of service, and applicable local laws. When in doubt, consult a lawyer. See Apify's guide to the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

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

Search by location (city + state) or scrape ImmoScout24 search URLs directly.

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

List of { "state": <state slug>, "city": <city name> } objects. State slugs: baden-wuerttemberg, bayern, berlin, brandenburg, bremen, hamburg, hessen, mecklenburg-vorpommern, niedersachsen, nordrhein-westfalen, rheinland-pfalz, saarland, sachsen, sachsen-anhalt, schleswig-holstein, thueringen.

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

ImmoScout24 search URLs (url mode). Your filters in the URL are kept. A pagenumber=N in the URL is used as the first page to scrape.

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

Buy or rent (location mode).

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

Apartment or house (location mode).

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

Lower price bound in EUR.

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

Upper price bound in EUR.

## `roomsMin` (type: `number`):

Minimum number of rooms.

## `roomsMax` (type: `number`):

Maximum number of rooms.

## `livingSpaceMin` (type: `number`):

Minimum living area in m².

## `livingSpaceMax` (type: `number`):

Maximum living area in m².

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

Earliest construction year.

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

Latest construction year.

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

Only listings that have all selected amenities.

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

For-sale searches only. ImmoScout24 has no commission-free filter for rentals; it is ignored (with a warning) when listing type is rent.

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

Result ordering. 'Newest first' is the most useful for monitoring.

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

About 20 listings per page.

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

Total cap on listings saved across all searches. Leave empty for no limit. This is the billed row count.

## `fetchDetails` (type: `boolean`):

Open each listing to add amenities, agent contact, full image gallery, and description. Turn off for a faster, list-only run.

## `requestDelay` (type: `integer`):

Delay between API requests, in milliseconds.

## `maxRetries` (type: `integer`):

Retries per request on errors.

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

German residential proxies are recommended.

## Actor input object example

```json
{
  "mode": "location",
  "locations": [
    {
      "state": "berlin",
      "city": "Berlin"
    }
  ],
  "urls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-600000.0"
  ],
  "listingType": "buy",
  "propertyType": "apartment",
  "noCommission": false,
  "sortBy": "default",
  "maxPages": 2,
  "maxListings": 40,
  "fetchDetails": true,
  "requestDelay": 300,
  "maxRetries": 4,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "locations": [
        {
            "state": "berlin",
            "city": "Berlin"
        }
    ],
    "urls": [
        "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-600000.0"
    ],
    "maxPages": 2,
    "maxListings": 40,
    "requestDelay": 300,
    "maxRetries": 4,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/immoscout24-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": [{
            "state": "berlin",
            "city": "Berlin",
        }],
    "urls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-600000.0"],
    "maxPages": 2,
    "maxListings": 40,
    "requestDelay": 300,
    "maxRetries": 4,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/immoscout24-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    {
      "state": "berlin",
      "city": "Berlin"
    }
  ],
  "urls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen?price=-600000.0"
  ],
  "maxPages": 2,
  "maxListings": 40,
  "requestDelay": 300,
  "maxRetries": 4,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call parsebird/immoscout24-scraper --silent --output-dataset

```

## MCP server setup

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