# ImmobilienScout24 Scraper (`tacps126/immobilienscout24-scraper`) Actor

Scrape ImmobilienScout24 (ImmoScout24) apartments and houses for rent or sale anywhere in Germany: price, warm rent, m², rooms, price per m², address with coordinates, energy class, features, agent, photos and dates. Fast, filters, new-listing alerts. From $1 per 1,000 listings.

- **URL**: https://apify.com/tacps126/immobilienscout24-scraper.md
- **Developed by:** [Tapaswai Ashok Choudhary](https://apify.com/tacps126) (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.80 / 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

## ImmobilienScout24 Scraper

Get property listings from **ImmobilienScout24 (ImmoScout24)**, Germany's largest real-estate portal, as a clean, spreadsheet-ready dataset. Apartments and houses for rent or sale anywhere in Germany. Each listing includes the price or cold rent, **total (warm) rent**, living area, rooms, **price per m²**, full address with **GPS coordinates**, energy class, construction year, features (balcony, lift, fitted kitchen, cellar, garden…), agent or private landlord, photos and publish/update dates. Export to JSON, CSV or Excel, send to Google Sheets, or call it as an API.

**Built for** property investors and buy-to-let analysts, estate agents and property managers watching the market, relocation services, proptech and rental-price research, and anyone who wants new listings the moment they appear.

### Why this scraper

- **Fast.** In our tests, 1,100+ listings came back in about 20 seconds. After the first page loads, results are read directly instead of opening a browser for every page.
- **Plain-word locations.** Type `Berlin`, `München Schwabing` or `Köln`. The Actor finds the right ImmoScout24 area for you. Or paste any ImmoScout24 search URL with the filters you set on the site.
- **Analysis-ready fields.** Price per m² is computed for you, warm rent sits next to cold rent, features come as simple English names, and coordinates are included whenever the listing shows its address.
- **Filters.** Price, living area and rooms, newest first, and private landlords vs. agents. Skipped listings are never charged.
- **New-listing alerts.** Schedule it with *Only new listings* and each run returns only listings you haven't received yet, so you pay only for new ones.
- **Resilient.** When ImmoScout24 shows its robot check, the Actor gets past it on a fresh connection automatically. Results are saved as each search finishes, and a moved run resumes without charging twice.

### How to use it

1. Add **Locations** (e.g. `Berlin`, `Hamburg Altona`) and choose **Property type** (apartment or house) and **Rent or buy**.
2. Optionally set **price**, **area** and **rooms** filters and **Sort by: Newest first**.
3. Press **Start**. Download results from the **Output** tab, or connect an integration.

#### Example input

```json
{
  "locations": ["Berlin", "München"],
  "propertyType": "apartment",
  "offerType": "rent",
  "maxPrice": 1500,
  "minRooms": 2,
  "sort": "newest",
  "maxItems": 500
}
```

### What you get

| Field | Description |
|-------|-------------|
| `title`, `url`, `id` | Listing headline, link to the exposé, ImmoScout24 id |
| `offerType`, `propertyType` | `rent` / `sale`; `apartment` / `house` |
| `price` | `{amount, currency, period}`: cold rent per month or purchase price |
| `totalRent` | Warm rent (cold rent + service charges) when listed |
| `livingArea`, `plotArea`, `rooms`, `pricePerSqm` | Size and price per m² |
| `address` | `{street, houseNumber, postcode, city, district, country, text}` |
| `latitude`, `longitude` | Coordinates (when the listing shows its address) |
| `constructionYear`, `energyClass` | Building age and energy efficiency class |
| `features` | `balcony`, `lift`, `fittedKitchen`, `cellar`, `guestToilet`, `garden`, `stepFree`, `parking`… |
| `privateOffer`, `agentCompany`, `agentName`, `agentLogo` | Who's offering it |
| `images`, `imageCount`, `hasFloorplan`, `hasVirtualTour` | Photos (high-resolution links) |
| `projectName`, `promoted`, `isNew` | New-build project, premium placement, "new" badge |
| `publishedAt`, `createdAt`, `updatedAt` | Dates from ImmoScout24 |

Example (shortened):

```json
{
  "title": "Wohnen mit Herz – wie geschaffen für zwei",
  "offerType": "rent",
  "propertyType": "apartment",
  "price": { "amount": 594.78, "currency": "EUR", "period": "month" },
  "totalRent": 800.94,
  "livingArea": 51.72,
  "rooms": 2,
  "pricePerSqm": 11.5,
  "address": { "street": "Hellersdorfer Straße", "houseNumber": "91B", "postcode": "12619", "city": "Berlin", "district": "Kaulsdorf (Hellersdorf)", "country": "DE" },
  "latitude": 52.52485,
  "longitude": 13.58695,
  "energyClass": "B",
  "features": ["balcony", "cellar", "lift"],
  "agentCompany": "GESOBAU AG",
  "imageCount": 10,
  "url": "https://www.immobilienscout24.de/expose/168986388",
  "publishedAt": "2026-07-01T13:55:14.933+02:00"
}
```

### Pricing

Pay per result: about **$1 per 1,000 listings** (lower on higher Apify plans) plus a tiny start fee. Duplicates, skipped listings and (with *Only new listings*) already-delivered listings are free. See the **Pricing** tab for exact rates, and set a maximum charge per run to cap spend.

On Apify's **free plan** each run returns up to 200 listings, enough to try it out. Any paid Apify plan removes the limit.

### FAQ

**How many listings can I get?** As many as the search has. Raise *Max pages per search* (about 20 listings per page, more when new-build projects list several units).

**Why do some listings have no coordinates?** Some landlords hide the exact address until you contact them; those listings come with postcode, city and district only.

**Is it legal?** The Actor collects publicly listed property ads. You're responsible for how you use the data, including contact names, under GDPR and the other laws that apply to you.

### Support

Found a problem or need a field that isn't there yet? Open an issue on the **Issues** tab with your input and what you expected. Requests decide what gets built next.

# Actor input Schema

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

Cities, districts or regions in Germany, in plain words (e.g. `Berlin`, `München Schwabing`, `Köln`), one per line.

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

What kind of property.

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

Listings for rent or for sale.

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

Or paste ImmoScout24 search result pages from your browser, with any filters you set there. Each is crawled as given.

## `minPrice` (type: `number`):

Lowest price or monthly cold rent.

## `maxPrice` (type: `number`):

Highest price or monthly cold rent.

## `minArea` (type: `number`):

Min living area (m²).

## `maxArea` (type: `number`):

Max living area (m²).

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

Min rooms.

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

Max rooms.

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

Order of results.

## `seller` (type: `string`):

Keep listings from everyone, only private sellers, or only agents. Skipped listings are never charged.

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

Maximum number of listings to return in total.

## `maxPagesPerSearch` (type: `integer`):

Result pages to read for each location or search URL (about 20 listings per page, more when new-build projects group their units).

## `onlyNew` (type: `boolean`):

Return only listings that no earlier run with the same input has delivered. Ideal for alerts — you pay only for new listings.

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

Optional name for the “only new” history, so several monitors can run side by side.

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

German residential proxy is used by default — ImmoScout24 blocks cloud IPs.

## `tenantId` (type: `string`):

Optional label used to keep separate histories for different clients or teams.

## `debug` (type: `boolean`):

Save extra diagnostics with the run.

## Actor input object example

```json
{
  "locations": [
    "Berlin"
  ],
  "propertyType": "apartment",
  "offerType": "rent",
  "sort": "default",
  "seller": "all",
  "maxItems": 200,
  "maxPagesPerSearch": 10,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  },
  "debug": false
}
```

# Actor output Schema

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

The produced items (default dataset items).

# 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": [
        "Berlin"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tacps126/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 = {
    "locations": ["Berlin"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("tacps126/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 '{
  "locations": [
    "Berlin"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call tacps126/immobilienscout24-scraper --silent --output-dataset

```

## MCP server setup

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