# ImmoScout24 Listing Watcher (`kawsar/immoscout24-listing-watcher`) Actor

ImmoScout24 listing scraper that pulls price, area, rooms, images, and descriptions from each expose page, so analysts and agents get clean property data without copying listings by hand.

- **URL**: https://apify.com/kawsar/immoscout24-listing-watcher.md
- **Developed by:** [Kawsar](https://apify.com/kawsar) (community)
- **Categories:** Real estate, Automation, Developer tools
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.90 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Listing Watcher: scrape property listings from Germany's largest real estate portal

ImmoScout24 Listing Watcher collects property listings from search result pages on immobilienscout24.de. Give it one or more search URLs and it pages through results automatically, returning price, area, location, images, and contact details for every listing it finds.

### Use cases

- Track rental prices across multiple German cities or states without copying data by hand
- Monitor office space availability in specific regions for real estate research
- Build a property database for market comparison, price analysis, or investment decisions
- Feed listing data into Google Sheets, CRMs, or downstream analysis tools
- Alert yourself when new listings appear in a target area using Apify's scheduler and webhooks
- Aggregate listings from several property types or cities into a single dataset in one run

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchUrls` | array | required | One or more ImmoScout24 search result URLs |
| `maxItems` | integer | 50 | Max listings to collect across all URLs (max 1,000) |
| `requestTimeoutSecs` | integer | 30 | Per-request timeout in seconds |

#### How to get a search URL

1. Go to immobilienscout24.de and run a search
2. Apply your filters (city, property type, price range, size, etc.)
3. Copy the URL from your browser's address bar
4. Paste it into `searchUrls`

You can add as many search URLs as you need. The actor works through them in order until the total listing count reaches `maxItems`.

#### Example input

```json
{
    "searchUrls": [
        "https://www.immobilienscout24.de/Suche/de/bayern/buero-praxis",
        "https://www.immobilienscout24.de/Suche/de/berlin/wohnung-mieten"
    ],
    "maxItems": 200
}
````

### What data does this actor collect?

Each listing result contains:

```json
{
    "listingId": "168447935",
    "listingUrl": "https://www.immobilienscout24.de/expose/168447935",
    "listingTitle": "Service-Büros für 10 Personen in Design Offices Macherei",
    "realEstateType": "Office",
    "price": 3000.0,
    "currency": "EUR",
    "priceInterval": "MONTH",
    "marketingType": "RENT",
    "pricePerSqm": 48.0,
    "area": 100.0,
    "city": "München",
    "district": "Berg am Laim",
    "zipCode": "81637",
    "addressText": "Echarding, München",
    "contactName": "IWG Management GmbH",
    "contactPhone": "030 7262171130",
    "isPrivateListing": false,
    "hasCourtage": false,
    "images": ["https://pictures.immobilienscout24.de/listings/xxx.jpg/ORIG/legacy_thumbnail/800x600/format/webp/quality/50"],
    "tags": ["Provisionsfrei*", "Aufzug"],
    "listedDate": "2026-06-10T21:47:37.000+02:00",
    "lastModified": "2026-06-10T21:47:50.729+02:00",
    "searchUrl": "https://www.immobilienscout24.de/Suche/de/bayern/buero-praxis",
    "scrapedAt": "2026-06-11T10:30:00+00:00",
    "error": null
}
```

| Field | Type | Description |
|-------|------|-------------|
| `listingId` | string | Unique listing ID from ImmoScout24 |
| `listingUrl` | string | Direct link to the listing detail page |
| `listingTitle` | string | Property headline from the search result |
| `realEstateType` | string | Property category (Office, Apartment, House, etc.) |
| `price` | number | Monthly rent or purchase price |
| `currency` | string | Currency code (EUR) |
| `priceInterval` | string | Price period: MONTH for monthly rent |
| `marketingType` | string | RENT or BUY |
| `pricePerSqm` | number | Price per square meter |
| `area` | number | Floor space in square meters |
| `city` | string | City name |
| `district` | string | District or neighborhood |
| `zipCode` | string | Postal code |
| `addressText` | string | Full address as displayed on the listing |
| `contactName` | string | Agent company or owner name |
| `contactPhone` | string | Contact phone number |
| `isPrivateListing` | boolean | True for private sellers, false for agencies |
| `hasCourtage` | boolean | True if a brokerage commission applies |
| `images` | array | Direct photo URLs at 800x600 resolution |
| `tags` | array | Feature tags shown on the listing (e.g. Provisionsfrei, Aufzug) |
| `listedDate` | string | ISO date when the listing was first published |
| `lastModified` | string | ISO date of the most recent update |
| `searchUrl` | string | Search URL that produced this listing |
| `scrapedAt` | string | ISO timestamp of when the data was collected |
| `error` | string | Error message if scraping failed, null otherwise |

### How it works

1. Add one or more ImmoScout24 search URLs in `searchUrls`
2. The actor fetches each page and reads the listing data
3. All listings on the page are collected and structured into clean records
4. Pagination runs automatically until `maxItems` is reached or all pages are done
5. Results land in the Apify dataset, ready to download as JSON or CSV

### Output formats

Once the run finishes, download results from the Apify dataset in:

- **JSON** for programmatic use or API consumption
- **CSV** for Excel, Google Sheets, or any spreadsheet tool
- **JSONL** for data pipelines and streaming processing
- **XML** for legacy system integrations

Use Apify's dataset export or connect directly via the Apify API.

### Scheduling and monitoring

Run this actor on a schedule to track price changes, new listings, and sold-out units over time.

1. Open the actor in your Apify Console
2. Click **Schedule** to set a recurring interval (daily, weekly, or custom)
3. Add a webhook to notify your app, Slack channel, or Google Sheet when new data arrives
4. Compare datasets across runs to spot market trends or price drops

### FAQ

**Which URLs work with this actor?**
Any ImmoScout24 search result URL from your browser. Run a search, apply filters, and copy the address bar URL. Examples: `/Suche/de/berlin/wohnung-mieten`, `/Suche/de/hamburg/buero-praxis`, `/Suche/de/muenchen/haus-kaufen`.

**How many listings can I collect per run?**
Up to 1,000 per run using `maxItems`. Each search page returns around 20 listings. For larger datasets, raise `maxItems` or split across multiple runs.

**Can I search multiple cities at once?**
Yes. Add one URL per city or property type to `searchUrls`. The actor works through them in order until the total reaches `maxItems`.

**What types of properties can I scrape?**
All property types available on ImmoScout24: apartments for rent, apartments for sale, houses, office space, commercial properties, parking, land, and more. The type is determined by the search URL you provide.

**What happens if a page fails?**
The actor logs a warning and continues with the next page. Any listings already collected from successful pages are still saved.

**Can I collect listings from grouped results?**
Yes. ImmoScout24 sometimes groups multiple units under a single complex (a building with several available offices, for example). The actor collects each individual unit separately so every available option appears in your dataset.

**Can I run this on a schedule to monitor listings?**
Yes. Use Apify's built-in scheduler and connect it to webhooks or integrations to push updates to a spreadsheet or alert system whenever new listings appear.

**Are images included?**
Yes. The `images` field contains direct photo URLs at 800x600 resolution for every listing that has photos.

### Integrations

Connect ImmoScout24 Listing Watcher with other apps using [Apify integrations](https://apify.com/integrations). Works with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger actions when results are ready.

# Actor input Schema

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

One or more ImmoScout24 search URLs. Copy the URL from your browser after running a search on immobilienscout24.de. Example: https://www.immobilienscout24.de/Suche/de/berlin/wohnung-mieten

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

Maximum total number of listings to collect across all search URLs.

## `requestTimeoutSecs` (type: `integer`):

Per-request timeout in seconds. Increase if you get timeout errors on slow connections.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.immobilienscout24.de/Suche/de/bayern/buero-praxis",
    "https://www.immobilienscout24.de/Suche/de/berlin/wohnung-mieten"
  ],
  "maxItems": 50,
  "requestTimeoutSecs": 30
}
```

# 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/bayern/buero-praxis"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kawsar/immoscout24-listing-watcher").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/bayern/buero-praxis"] }

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

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/bayern/buero-praxis"
  ]
}' |
apify call kawsar/immoscout24-listing-watcher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kawsar/immoscout24-listing-watcher",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ImmoScout24 Listing Watcher",
        "description": "ImmoScout24 listing scraper that pulls price, area, rooms, images, and descriptions from each expose page, so analysts and agents get clean property data without copying listings by hand.",
        "version": "0.0",
        "x-build-id": "mQsu4kY2Owb16xpl9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kawsar~immoscout24-listing-watcher/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kawsar-immoscout24-listing-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kawsar~immoscout24-listing-watcher/runs": {
            "post": {
                "operationId": "runs-sync-kawsar-immoscout24-listing-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kawsar~immoscout24-listing-watcher/run-sync": {
            "post": {
                "operationId": "run-sync-kawsar-immoscout24-listing-watcher",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "searchUrls"
                ],
                "properties": {
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "One or more ImmoScout24 search URLs. Copy the URL from your browser after running a search on immobilienscout24.de. Example: https://www.immobilienscout24.de/Suche/de/berlin/wohnung-mieten",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max listings",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum total number of listings to collect across all search URLs.",
                        "default": 50
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Per-request timeout in seconds. Increase if you get timeout errors on slow connections.",
                        "default": 30
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
