# 🏠 Kleinanzeigen Immobilien Scraper - German Real Estate (`benthepythondev/kleinanzeigen-immobilien-scraper`) Actor

Scrape rental & for-sale property listings from Kleinanzeigen (Germany). Parses rooms, m², Kaltmiete/Warmmiete, deposit, type & more into clean fields. Filter by location, rooms, size & price.

- **URL**: https://apify.com/benthepythondev/kleinanzeigen-immobilien-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Real estate, Lead generation, Business
- **Stats:** 6 total users, 3 monthly users, 97.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 properties

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 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

## 🏠 Kleinanzeigen Immobilien Scraper — German Real Estate Listings, Structured

Scrape **rental and for-sale property listings from Kleinanzeigen** (formerly eBay Kleinanzeigen), Germany's largest classifieds site and a top source of **private-landlord and direct-from-owner** real estate. Unlike a generic listings scraper, this one is built for property: it parses the German real-estate attributes — **Zimmer (rooms), Wohnfläche (m²), Kaltmiete, Warmmiete, Kaution, Baujahr, Wohnungstyp** — into clean, structured fields ready for analysis. Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🏠 What is the Kleinanzeigen Immobilien Scraper?

It turns any Kleinanzeigen real-estate search into a structured dataset. Pick an **offer type** (apartments or houses, rent or buy), a **location** (a German postal code or a city name like `berlin`), and optional filters for rooms, size or price — then Run. The Actor walks the result pages, opens each listing to read the detail attributes, and returns every matching property with rooms, living space, cold/warm rent or purchase price, deposit, property type and more. City names are auto-resolved to the correct Kleinanzeigen location, and it runs through a residential German proxy by default for reliable access.

#### What data does it extract?

- **Title & description**, plus the full listing **description** from the detail page
- **Offer type** (rent/buy apartment or house) and **property type** (Wohnungstyp/Haustyp)
- **Rooms** (Zimmer) and **living space** in m² (Wohnfläche), plus **plot size** where given
- **Kaltmiete, Warmmiete, deposit (Kaution) and extra costs (Nebenkosten)** for rentals
- **Purchase price** for sale listings, plus a parsed **price** and **price type** (fixed / negotiable / on request)
- **Floor, year built (Baujahr), availability, heating and energy class** when present
- **City, postal code (PLZ)** and **posting date**
- **Listing URL, image URL** (and all gallery images), plus **seller name** and a **scrape timestamp**

### ⬇️ Input

Run it with simple fields, or paste exact search URLs for precise control:

| Field | Type | Description |
|-------|------|-------------|
| `offerType` | enum | `rent-apartment`, `buy-apartment`, `rent-house`, `buy-house`, or `all` |
| `locationCode` | string | German PLZ (e.g. `10115`) or city slug (e.g. `berlin`); empty = all of Germany |
| `radiusKm` | integer | Search radius around the location (0–200 km) |
| `keyword` | string | Optional keyword to narrow results (e.g. `balkon`, `altbau`) |
| `startUrls` | array | Paste exact Kleinanzeigen real-estate search URLs (overrides the fields above) |
| `minRooms` | integer | Keep only listings with at least this many rooms |
| `minSqm` | integer | Keep only listings with at least this living area (m²) |
| `maxPrice` | integer | Keep only listings at or below this price (rent or purchase) |
| `fetchDetails` | boolean | Open each listing for full attributes (default true, recommended) |
| `maxResults` | integer | Maximum listings to return (1–5000, default 100) |
| `proxyConfiguration` | object | Residential DE proxy (strongly recommended — datacenter IPs are blocked) |

#### Example input

```json
{
  "offerType": "rent-apartment",
  "locationCode": "berlin",
  "radiusKm": 10,
  "minRooms": 2,
  "maxPrice": 1500,
  "fetchDetails": true,
  "maxResults": 100
}
```

### ⬆️ Output

Every property is one clean row (view as a **table**, or export **JSON / CSV / Excel**):

```json
{
  "ad_id": "2891234567",
  "title": "Helle 3-Zimmer-Wohnung mit Balkon",
  "offer_type": "rent-apartment",
  "rooms": 3,
  "living_space_sqm": 78,
  "cold_rent_eur": 1200,
  "warm_rent_eur": 1450,
  "deposit_eur": 3600,
  "extra_costs_eur": 250,
  "purchase_price_eur": null,
  "property_type": "Etagenwohnung",
  "floor": "3",
  "year_built": "1998",
  "available_from": "01.08.2026",
  "heating": "Zentralheizung",
  "energy_class": "C",
  "city": "Berlin",
  "plz": "10115",
  "price_type": "FIXED",
  "url": "https://www.kleinanzeigen.de/s-anzeige/...",
  "image_url": "https://img.kleinanzeigen.de/...",
  "scraped_at": "2026-06-23T20:00:00Z"
}
```

### 💡 Use cases

- **🎯 Real-estate lead generation:** find private landlords and owners selling directly in a region, before they reach an agent.
- **📊 Rent & price analysis:** track asking rents and purchase prices by city or PLZ over time.
- **💰 Property investors:** surface deals across apartments and houses and benchmark yields.
- **🏗️ Proptech & relocation tools:** power a search product with clean, structured German listings.

### ❓ FAQ

**Which site does it cover?** Kleinanzeigen.de (Germany), the Immobilien (real estate) section — both rentals and for-sale apartments and houses.

**Do I need an API key?** No. There's no login or token. A residential German proxy is configured by default for reliable access, since Kleinanzeigen blocks datacenter IPs.

**Can I target a specific city or postal code?** Yes — set `locationCode` to a PLZ or city name and an optional `radiusKm`. City names are auto-resolved to the right Kleinanzeigen area. For full control, paste exact search URLs in `startUrls`.

**What real-estate fields do I get?** Rooms, living space (m²), plot size, cold/warm rent, deposit, extra costs, purchase price, property type, floor, year built, availability, heating and energy class — whenever the listing provides them.

**Why are some fields empty?** Private sellers fill in different fields, and not every listing states (for example) the energy class or year built. The Actor parses both the structured attributes and the title/description text to recover as much as possible, but missing values are returned as `null`.

**Should I keep "Fetch detail pages" on?** Yes for full data — the rich real-estate attributes live on each listing's detail page. Turning it off is faster and cheaper but returns only the basics (title, price, location, image).

**How many listings can it return?** Up to your `maxResults` cap (max 5000); it paginates automatically through the result pages.

**Can I run it on a schedule or via API?** Yes — schedule recurring runs in Apify, call it via the API/SDK, or connect it to Make, Zapier or n8n.

**Is scraping Kleinanzeigen legal?** It extracts publicly available listing data. Use it responsibly and in line with applicable laws and Kleinanzeigen's terms.

### Support and reviews

If a successful run gives you useful property data, please leave an honest review on the [Actor review page](https://apify.com/benthepythondev/kleinanzeigen-immobilien-scraper/reviews). Reviews help other buyers judge the output. For missing fields, blocked searches or failed runs, open an issue on the Actor page and include the run ID and search URL so the exact case can be reproduced.

For recurring monitoring, import the free [daily Kleinanzeigen property alert n8n template](https://gist.github.com/benthepythondev00/e28968a940fe4195ffb5a997fe309503#file-kleinanzeigen-property-alerts-json). It runs this Actor on a schedule and emails a price-sorted digest without embedding an Apify token in the workflow file.

### 🔗 You might also like

- **[Kleinanzeigen Scraper](https://apify.com/benthepythondev/kleinanzeigen-scraper)** — any Kleinanzeigen category, all-purpose
- **[Kleinanzeigen Autos Scraper](https://apify.com/benthepythondev/kleinanzeigen-autos-scraper)** — German used-car listings
- **[Kleinanzeigen Jobs Scraper](https://apify.com/benthepythondev/kleinanzeigen-jobs-scraper)** — local German job ads

***

**Keywords:** Kleinanzeigen scraper, Kleinanzeigen Immobilien, German real estate scraper, Immobilien scraper, Mietwohnung scraper, Wohnung mieten data, German property listings, real estate leads Germany, DACH real estate data, eBay Kleinanzeigen real estate, Kaltmiete Warmmiete, rent price analysis, private landlord leads.

# Actor input Schema

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

What kind of real-estate listings to scrape.

## `locationCode` (type: `string`):

German postal code (e.g. 10115) or city slug (e.g. berlin). Leave empty for all of Germany.

## `radiusKm` (type: `integer`):

Search radius around the location.

## `keyword` (type: `string`):

Optional keyword to narrow results (e.g. 'balkon', 'altbau').

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

Paste exact kleinanzeigen.de real-estate search URLs (overrides the fields above). This is the most reliable way to target a specific city — search on kleinanzeigen.de and copy the URL.

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

Only keep listings with at least this many rooms.

## `minSqm` (type: `integer`):

Only keep listings with at least this living area.

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

Only keep listings at or below this price (rent or purchase).

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

Open each listing to extract rooms, m², Kaltmiete/Warmmiete, deposit, etc. (recommended).

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

Maximum number of listings to return.

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

Residential DE proxy is strongly recommended (Kleinanzeigen blocks datacenter IPs).

## Actor input object example

```json
{
  "offerType": "rent-apartment",
  "locationCode": "berlin",
  "radiusKm": 0,
  "startUrls": [
    "https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331"
  ],
  "fetchDetails": true,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `results` (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 = {
    "offerType": "rent-apartment",
    "locationCode": "berlin",
    "startUrls": [
        "https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331"
    ],
    "fetchDetails": true,
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/kleinanzeigen-immobilien-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 = {
    "offerType": "rent-apartment",
    "locationCode": "berlin",
    "startUrls": ["https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331"],
    "fetchDetails": True,
    "maxResults": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/kleinanzeigen-immobilien-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 '{
  "offerType": "rent-apartment",
  "locationCode": "berlin",
  "startUrls": [
    "https://www.kleinanzeigen.de/s-wohnung-mieten/berlin/c203l3331"
  ],
  "fetchDetails": true,
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call benthepythondev/kleinanzeigen-immobilien-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/CLqZYBSXxsj0qpdw4/builds/IspjEzCDR60Zvv2TY/openapi.json
