# ImmobilienScout24 Scraper — Germany Property Data & API (`sian.agency/immobilienscout24-property-scraper`) Actor

ImmobilienScout24.de scraper & real estate data API for Germany's #1 property portal. Sale & rent listings: price, Kaltmiete/Warmmiete, Nebenkosten, size, rooms, address, GPS, photos, agent & energy class — clean JSON/CSV. Fast overview or full detail. No API key.

- **URL**: https://apify.com/sian.agency/immobilienscout24-property-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Real estate, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 overview 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/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

## ImmobilienScout24 Scraper — Germany Property Data & API 🏠

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Immowelt Scraper](https://img.shields.io/badge/Store-Immowelt%20Scraper-F50537)](https://apify.com/sian.agency/immowelt-property-scraper?fpr=sian) [![Immobiliare Scraper](https://img.shields.io/badge/Store-Immobiliare%20Scraper-1AE392)](https://apify.com/sian.agency/immobiliare-property-scraper?fpr=sian) [![Idealista Scraper](https://img.shields.io/badge/Store-Idealista%20Scraper-E60023)](https://apify.com/sian.agency/idealista-property-scraper?fpr=sian)

#### 🎉 Every ImmobilienScout24 listing — price, Warmmiete, GPS, photos & agent — in clean JSON, no account or API key
##### For analysts, agents and developers building a German real-estate data pipeline

---

### 📋 Overview

**Pull live listings from ImmobilienScout24 — Germany's #1 property portal — into a clean, structured dataset.** Search any city for rent or sale, and get back price, Kaltmiete/Warmmiete, Nebenkosten, size, rooms, address, GPS coordinates, photos, energy class and agent details — ready for Excel, a database or your own API.

**Why professionals choose this scraper:**
- ✅ **Germany's #1 portal, fully covered**: apartments & houses, rent & sale, every city — the deepest German listing source.
- ⚡ **Overview mode is fast & complete**: 20 fully-populated listings per page — price, GPS, rooms, area, photos and agent included, with no per-listing fetches.
- 🎯 **45 structured fields**: price, Warmmiete, Nebenkosten, energy class, build year, condition, equipment, district, lat/lng and more.
- 💶 **Pay only per result**: per-listing pricing with a free trial — no monthly subscription, no API key.
- 💱 **Built-in extras**: live EUR→USD conversion, price-per-m², and a thumbnail on every row.
- 🔗 **Paste any search URL**: build a search on ImmobilienScout24 with all your filters and paste the link — every filter is honored.

---

### ✨ Features

- 🏙️ **Search by city or URL**: pick contract + type + city, or paste a full ImmobilienScout24 search-results URL.
- ⚡ **Overview mode**: cheap, high-volume listing extraction straight from the page's embedded data.
- 🔍 **Detail mode**: enrich each listing with Warmmiete, Nebenkosten, heating type, condition, full equipment list and description.
- 📍 **GPS coordinates**: latitude/longitude on every overview listing — map them instantly.
- 💶 **Filters**: price range, living-area range, room count and sort order (newest, price asc/desc).
- 💱 **Dual currency**: every price also in USD at the run's live FX rate.
- 📊 **Price per m²**: computed automatically for fast comparables.
- 🖼️ **All photos**: full gallery URLs plus a cover thumbnail per row.
- 📤 **Export anywhere**: JSON, CSV or Excel straight from the dataset.

---

### 🎬 Quick Start

Pick a scrape mode, tell it a city (or paste a search URL), and run. Results stream into the dataset as they're found. Start in Overview mode — it already includes price, geo and photos.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~immobilienscout24-property-scraper/runs?token=YOUR_TOKEN \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byQuery","city":"Berlin","contract":"rent","propertyType":"apartment","maxResults":100}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose how to search

Pick **By query** (city + contract + type) or **By search URL** (paste a link from immobilienscout24.de).

#### Step 2: Pick a mode and filters

**Overview** for fast, cheap, complete listings — or **Detail** for the extra fields. Add price/area/room filters if you like.

#### Step 3: Run and export

Click **Start**. Watch listings fill the dataset, then export to JSON, CSV or Excel.

**That's it! In a couple of minutes, you'll have:**

- A clean table of German property listings
- Price, size, rooms, address, GPS and agent for each
- A ready-to-use file or API feed

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| scrapeMode | string | No | `overview` (fast & cheap) or `detail` (full fields). Default `overview`. |
| searchMode | string | No | `byQuery` or `bySearchUrl`. Default `byQuery`. |
| city | string | No | City to search (byQuery), e.g. `Berlin`, `Muenchen`. |
| contract | string | No | `rent` or `sale` (byQuery). |
| propertyType | string | No | `apartment` or `house` (byQuery). |
| region | string | No | Optional region/state slug, e.g. `bayern` for Munich. |
| searchUrls | array | No | ImmobilienScout24 search-results URLs (bySearchUrl). |
| maxResults | integer | No | Max listings this run. FREE: 25, PAID: unlimited. |
| maxPages | integer | No | Optional cap on search pages (20 listings each). |
| priceMin / priceMax | integer | No | Price range filter (byQuery). |
| areaMin / areaMax | integer | No | Living-area (m²) range filter (byQuery). |
| roomsMin / roomsMax | integer | No | Room-count range filter (byQuery). |
| sorting | string | No | Sort code: `2` price asc, `2-` price desc, `9` newest. |

**Example — by query:**

```json
{
  "scrapeMode": "overview",
  "searchMode": "byQuery",
  "city": "Hamburg",
  "contract": "sale",
  "propertyType": "apartment",
  "priceMin": 200000,
  "priceMax": 600000,
  "maxResults": 200
}
```

**Example — by search URL:**

```json
{
  "scrapeMode": "detail",
  "searchMode": "bySearchUrl",
  "searchUrls": ["https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten?sorting=9"],
  "maxResults": 50
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **45+ fields** including:

| Field | Type | Description |
|-------|------|-------------|
| id | string | ImmobilienScout24 scoutId (stable join key) |
| url | string | Canonical /expose/<scoutId> listing URL |
| propertyTitle | string | Listing title |
| contract | string | rent or sale |
| property\_type | string | apartment, house, garage, plot, investment |
| price | integer | Kaltmiete (rent) or Kaufpreis (sale), EUR |
| price\_usd | integer | Price converted to USD (live FX) |
| price\_per\_sqm | integer | Price ÷ living area |
| total\_rent | integer | Warmmiete (rent incl. utilities) |
| extra\_costs | integer | Nebenkosten (service charge) |
| area\_sqm | number | Living area in m² |
| rooms | number | Number of rooms |
| address / district / city / zip | string | Location fields |
| latitude / longitude | number | GPS coordinates (overview) |
| energy\_class | string | Energy efficiency class A+ … H |
| agent\_name | string | Realtor company / provider |
| images | array | All photo URLs |

**Example:**

```json
{
  "id": "121008146",
  "url": "https://www.immobilienscout24.de/expose/121008146",
  "propertyTitle": "Home & Co – Easy Living | Fully Furnished All-Inclusive Apartment",
  "contract": "rent",
  "property_type": "apartment",
  "price": 779,
  "price_usd": 841,
  "currency": "EUR",
  "total_rent": 979,
  "area_sqm": 16,
  "rooms": 1,
  "address": "Breite Straße 42 B",
  "city": "Berlin",
  "zip": "14199",
  "district": "Schmargendorf (Wilmersdorf)",
  "latitude": 52.47302,
  "longitude": 13.29512,
  "energy_class": "F",
  "agent_name": "Home & Co Management GmbH",
  "image_count": 12
}
```

***

### 💼 Use Cases & Examples

#### 1. Market research & rent comparables

**Analysts tracking rents and prices across German cities.**
**Input:** City + contract + price/area filters. **Output:** Price, €/m², Warmmiete per listing. **Use:** Build a city-by-city rent index.

#### 2. Lead generation for estate agents

**Agents sourcing private sellers and competitor listings.**
**Input:** A city search in Detail mode. **Output:** Agent name, private-vs-agency flag, contact context. **Use:** Build a prospecting list.

#### 3. Investment & rental-yield analysis

**Investors screening for yield.**
**Input:** Sale search with price band. **Output:** Kaufpreis, €/m², area, location. **Use:** Rank neighbourhoods by yield potential.

#### 4. Relocation & home search

**People moving to a new German city.**
**Input:** City + rooms + budget. **Output:** A clean shortlist with GPS and photos. **Use:** Map and compare options fast.

#### 5. Real-estate data API / product feed

**Developers powering an app or portal.**
**Input:** A set of search URLs on a schedule. **Output:** A fresh structured feed. **Use:** Keep your product's listings current.

#### 6. PropTech & academic datasets

**Researchers studying the German housing market.**
**Input:** Broad city searches. **Output:** Structured listings with energy class and build year. **Use:** Quantitative housing analysis.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/immobilienscout24-property-scraper').call({
  scrapeMode: 'overview', searchMode: 'byQuery', city: 'Berlin', contract: 'rent', maxResults: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/immobilienscout24-property-scraper').call(
    run_input={'scrapeMode': 'overview', 'searchMode': 'byQuery', 'city': 'Berlin', 'contract': 'rent', 'maxResults': 100}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~immobilienscout24-property-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"scrapeMode":"overview","searchMode":"byQuery","city":"Berlin","contract":"rent","maxResults":100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: Schedule or webhook
2. **HTTP Request**: Call the actor API
3. **Process**: Handle the JSON results
4. **Action**: Save to a sheet/DB, notify, or transform

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 listings** per run — full feature access, same quality
- No credit card required
- Perfect for testing and small projects

#### PAID Tier (Production Ready)

- **Unlimited** listings per run
- Pay-per-result: only charged for listings actually delivered
- No monthly subscription, no API key

💶 **Fair, transparent per-result pricing** — start cheap with Overview, upgrade to Detail only when you need the extra fields.

🔗 [View current pricing](https://apify.com/sian.agency/immobilienscout24-property-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many listings can I extract?**
A: FREE tier: 25 per run. PAID tier: unlimited.

**Q: What's the difference between Overview and Detail mode?**
A: Overview is fast and cheap and already includes price, GPS, rooms, area, photos and agent. Detail adds Warmmiete, Nebenkosten, heating, condition, equipment and the full description.

**Q: Can I use my own ImmobilienScout24 search filters?**
A: Yes — build any search on the site and paste the URL in `bySearchUrl` mode; every filter is honored.

**Q: Do detail pages include GPS coordinates?**
A: GPS is included on every Overview listing. Detail mode inherits coordinates from the matching overview entry.

**Q: What output formats are available?**
A: JSON, CSV and Excel — export directly from the Apify dataset.

**Q: Why does a single query stop around 7,700 results?**
A: The portal caps each query's pagination. To go beyond, split by city, price or area bands.

**Q: Is this legal?**
A: Yes — only publicly available data is extracted. See the legal note below.

***

### 🐛 Troubleshooting

**No results returned**

- Check the city spelling (umlauts auto-convert: München → muenchen).
- For `bySearchUrl`, confirm the URL is a real immobilienscout24.de `/Suche/...` results page.

**Fewer results than maxResults**

- The query may have fewer total listings, or hit the per-query pagination cap — split by filters.

**Run is slower than expected**

- Detail mode fetches each listing page; use Overview when you don't need the extra fields.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

> **Trademark notice:** ImmobilienScout24® and ImmoScout24® are trademarks of their respective owners. This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by ImmobilienScout24 or Immobilien Scout GmbH. All product and company names are used for identification purposes only.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's repository
- Check [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `scrapeMode` (type: `string`):

⚡ **OVERVIEW** — fast & cheap. Pulls 20 fully-populated listings per search page straight from the embedded result-list data (price, rooms, area, address, zip, district, GPS, energy class, agent, photos). Nearly the full schema, no per-listing fetches.

🔍 **DETAIL** — full fields per listing (Warmmiete, Nebenkosten, heating type, condition, complete equipment flags, agent vs. private, full description, hi-res photos). Slower and priced higher per result.

**TIP:** Start with Overview — it already includes price, geo and photos. Upgrade to Detail only when you need the extra fields.

## `searchMode` (type: `string`):

🧭 How to tell the scraper what to fetch:

- **By query** — pick contract (rent/sale), property type and a city, then narrow with the filters below.
- **By search URL** — paste an immobilienscout24.de search-results URL; every on-page filter in the URL is honored.

## `contract` (type: `string`):

🏷️ **Rent** (mieten) or **Sale** (kaufen). Applies to By query searches.

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

🏠 Filter By query searches by typology.

## `city` (type: `string`):

🏙️ City to search, e.g. `Berlin`, `München`, `Hamburg`, `Köln`, `Frankfurt`. German umlauts are auto-converted (München → muenchen) and the correct federal state is resolved automatically for major cities. Applies to By query searches.

**TIP:** For a precise district/region search, use **Search by URL** — build any search on immobilienscout24.de and paste the URL.

## `region` (type: `string`):

🗺️ Optional region/state slug override, e.g. `bayern`. Normally you can leave this empty — the correct federal state is resolved automatically from the city. Set it only for a smaller town the auto-map doesn't know.

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

🔗 immobilienscout24.de search-results URLs to scrape. Used when **Search by = By search URL**.

**TIP:** Build any search on immobilienscout24.de (set your filters, sort order, region), then copy the URL from the address bar — every on-page filter is honored.

**BULK EDIT:** Click "Bulk edit" to paste many URLs, one per line.

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

🔢 Maximum listings to extract this run.

- **FREE tier:** capped at 25 listings per run.
- **PAID tier:** unlimited — set as high as you need.

Note: ImmobilienScout24's pager caps a single query at ~7,700 results. For more, split by city/price/area bands.

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

📄 Optional hard cap on how many search-result pages to walk per query (each page = 20 listings). Leave empty to let Max results decide.

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

💶 Optional. Minimum price filter (By query mode). Kaltmiete for rent, Kaufpreis for sale.

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

💶 Optional. Maximum price filter (By query mode).

## `roomsMin` (type: `integer`):

🚪 Optional. Minimum number of rooms (By query mode).

## `roomsMax` (type: `integer`):

🚪 Optional. Maximum number of rooms (By query mode).

## `areaMin` (type: `integer`):

📐 Optional. Minimum living area in m² (By query mode).

## `areaMax` (type: `integer`):

📐 Optional. Maximum living area in m² (By query mode).

## `sorting` (type: `string`):

↕️ Optional ImmobilienScout24 sort code: `2` = price ascending, `2-` = price descending, `9` = most recent. Leave empty for the site default.

## Actor input object example

```json
{
  "scrapeMode": "overview",
  "searchMode": "byQuery",
  "contract": "rent",
  "propertyType": "apartment",
  "city": "Berlin",
  "region": "bayern",
  "searchUrls": [
    "https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mieten"
  ],
  "maxResults": 100,
  "sorting": "9"
}
```

# Actor output Schema

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

All extracted immobilienscout24.de listings with price, size, rooms, address, GPS, agent and energy data.

## `scrapingSummary` (type: `string`):

HTML summary of the run — mode, listings extracted, pages fetched, sample.

# 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 = {
    "city": "Berlin"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/immobilienscout24-property-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 = { "city": "Berlin" }

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/immobilienscout24-property-scraper").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 '{
  "city": "Berlin"
}' |
apify call sian.agency/immobilienscout24-property-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/immobilienscout24-property-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ImmobilienScout24 Scraper — Germany Property Data & API",
        "description": "ImmobilienScout24.de scraper & real estate data API for Germany's #1 property portal. Sale & rent listings: price, Kaltmiete/Warmmiete, Nebenkosten, size, rooms, address, GPS, photos, agent & energy class — clean JSON/CSV. Fast overview or full detail. No API key.",
        "version": "1.0",
        "x-build-id": "WmpF0eW0Qp8qFymWR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~immobilienscout24-property-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-immobilienscout24-property-scraper",
                "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/sian.agency~immobilienscout24-property-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-immobilienscout24-property-scraper",
                "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/sian.agency~immobilienscout24-property-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-immobilienscout24-property-scraper",
                "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",
                "properties": {
                    "scrapeMode": {
                        "title": "⚡ Scrape mode",
                        "enum": [
                            "overview",
                            "detail"
                        ],
                        "type": "string",
                        "description": "⚡ **OVERVIEW** — fast & cheap. Pulls 20 fully-populated listings per search page straight from the embedded result-list data (price, rooms, area, address, zip, district, GPS, energy class, agent, photos). Nearly the full schema, no per-listing fetches.\n\n🔍 **DETAIL** — full fields per listing (Warmmiete, Nebenkosten, heating type, condition, complete equipment flags, agent vs. private, full description, hi-res photos). Slower and priced higher per result.\n\n**TIP:** Start with Overview — it already includes price, geo and photos. Upgrade to Detail only when you need the extra fields.",
                        "default": "overview"
                    },
                    "searchMode": {
                        "title": "🧭 Search by",
                        "enum": [
                            "byQuery",
                            "bySearchUrl"
                        ],
                        "type": "string",
                        "description": "🧭 How to tell the scraper what to fetch:\n\n- **By query** — pick contract (rent/sale), property type and a city, then narrow with the filters below.\n- **By search URL** — paste an immobilienscout24.de search-results URL; every on-page filter in the URL is honored.",
                        "default": "byQuery"
                    },
                    "contract": {
                        "title": "🏷️ Contract",
                        "enum": [
                            "rent",
                            "sale"
                        ],
                        "type": "string",
                        "description": "🏷️ **Rent** (mieten) or **Sale** (kaufen). Applies to By query searches.",
                        "default": "rent"
                    },
                    "propertyType": {
                        "title": "🏠 Property type",
                        "enum": [
                            "apartment",
                            "house"
                        ],
                        "type": "string",
                        "description": "🏠 Filter By query searches by typology.",
                        "default": "apartment"
                    },
                    "city": {
                        "title": "🏙️ City",
                        "type": "string",
                        "description": "🏙️ City to search, e.g. `Berlin`, `München`, `Hamburg`, `Köln`, `Frankfurt`. German umlauts are auto-converted (München → muenchen) and the correct federal state is resolved automatically for major cities. Applies to By query searches.\n\n**TIP:** For a precise district/region search, use **Search by URL** — build any search on immobilienscout24.de and paste the URL."
                    },
                    "region": {
                        "title": "🗺️ Region / state (optional)",
                        "type": "string",
                        "description": "🗺️ Optional region/state slug override, e.g. `bayern`. Normally you can leave this empty — the correct federal state is resolved automatically from the city. Set it only for a smaller town the auto-map doesn't know."
                    },
                    "searchUrls": {
                        "title": "🔗 Search URLs",
                        "type": "array",
                        "description": "🔗 immobilienscout24.de search-results URLs to scrape. Used when **Search by = By search URL**.\n\n**TIP:** Build any search on immobilienscout24.de (set your filters, sort order, region), then copy the URL from the address bar — every on-page filter is honored.\n\n**BULK EDIT:** Click \"Bulk edit\" to paste many URLs, one per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "🔢 Max results",
                        "minimum": 1,
                        "type": "integer",
                        "description": "🔢 Maximum listings to extract this run.\n\n- **FREE tier:** capped at 25 listings per run.\n- **PAID tier:** unlimited — set as high as you need.\n\nNote: ImmobilienScout24's pager caps a single query at ~7,700 results. For more, split by city/price/area bands.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "📄 Max search pages (optional)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "📄 Optional hard cap on how many search-result pages to walk per query (each page = 20 listings). Leave empty to let Max results decide."
                    },
                    "priceMin": {
                        "title": "💶 Min price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💶 Optional. Minimum price filter (By query mode). Kaltmiete for rent, Kaufpreis for sale."
                    },
                    "priceMax": {
                        "title": "💶 Max price (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "💶 Optional. Maximum price filter (By query mode)."
                    },
                    "roomsMin": {
                        "title": "🚪 Min rooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "🚪 Optional. Minimum number of rooms (By query mode)."
                    },
                    "roomsMax": {
                        "title": "🚪 Max rooms",
                        "minimum": 0,
                        "type": "integer",
                        "description": "🚪 Optional. Maximum number of rooms (By query mode)."
                    },
                    "areaMin": {
                        "title": "📐 Min living area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "📐 Optional. Minimum living area in m² (By query mode)."
                    },
                    "areaMax": {
                        "title": "📐 Max living area (m²)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "📐 Optional. Maximum living area in m² (By query mode)."
                    },
                    "sorting": {
                        "title": "↕️ Sort order (optional)",
                        "type": "string",
                        "description": "↕️ Optional ImmobilienScout24 sort code: `2` = price ascending, `2-` = price descending, `9` = most recent. Leave empty for the site default."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
