# Immowelt Scraper — German Property Listings & Prices, No Phones (`highbrow_fame/immowelt-properties`) Actor

German property listings from immowelt, to rent or for sale: price, cold and warm rent, living area, rooms, floor, city, district, postcode, energy class and seller type. No phones.

- **URL**: https://apify.com/highbrow\_fame/immowelt-properties.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 property delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Immowelt Scraper — German Property Listings & Prices, No Phones

Get property listings from immowelt.de, one of Germany's biggest property portals: flats and houses to rent or for sale, with price, cold and warm rent, price per m², living and plot area, rooms, floor, availability, condition, energy class, city, district, postcode and state, seller type and the agency's company name. Paste your immowelt search links — or just type a place.

**Why this one**

- 🔗 **Your search, as you set it up.** Set every filter you like on immowelt.de and paste the link. Or type a place here — Köln, Prenzlauer Berg, Bayern, 80331 — and choose rent or sale, apartment or house, price, living area, rooms, private owners or agencies, and the order. Your price, area and room limits are kept: immowelt itself let 2 of 1,000 Bavarian flats over a €1,000 limit through in a live test, and those are left out.
- ⚡ **Fast.** A live test run read four searches — flats to rent across Germany, houses for sale in Köln, and flats for sale in Frankfurt and Prenzlauer Berg with 2+ rooms, 50+ m² and up to €700,000 — 3,069 properties in 87 seconds.
- 🔒 **Private owners stay anonymous.** No name, no phone, no street for private owners — only their town, postcode and district. Agencies are named by their company, never by the contact person. Phone numbers, e-mail addresses and contact persons' names written into titles and descriptions are replaced with `[phone removed]` / `[e-mail removed]` / `[name removed]`.
- 💸 **You pay only for properties delivered.** A link that is not an immowelt search, or a place immowelt does not know, comes back as a free record with the reason.

### What you get

For every property:

| Field | What it is |
|---|---|
| `price`, `currency`, `coldRent`, `warmRent`, `pricePerSqm` | the asking price or the cold rent (EUR); for rentals also the warm rent, for sales the price per m² |
| `transaction`, `propertyType`, `propertySubType`, `typeLabel`, `title` | rent or sale; APARTMENT or HOUSE, the subtype when given (PENTHOUSE, SEMIDETACHED\_HOUSE, …) and immowelt's own label ("Wohnung zum Kauf") |
| `livingAreaSqm`, `plotAreaSqm`, `rooms`, `floor`, `buildingFloors` | size and layout (floor 0 = ground floor) |
| `availableFrom`, `condition`, `energyClass` | a date or "immediately"; WELL\_KEPT, FIRST\_TIME\_USE, …; A\_PLUS to H |
| `city`, `district`, `postcode`, `municipality`, `state`, `street` | where it is — `city` as immowelt shows it (the borough in Berlin, Frankfurt and Dresden), `municipality` and `state` for the whole city and the federal state (in English: Munich, Bavaria); `street` only when the agency publishes it, never for private owners |
| `sellerType`, `agency` | private or agency (a few are "business"), and the company name (none for private owners) |
| `highlights`, `isNew`, `newBuildProject` | "provisionsfrei", "Tauschwohnung", "nur mit Wohnberechtigungsschein", …; new-build project link |
| `hasFloorPlan`, `hasVirtualTour`, `hasVideo`, `imageCount`, `image` | media |
| `description` | the start of the ad text, as immowelt shows it on the results page (up to about 500 characters) |
| `firstListed`, `updatedAt` | listing dates |
| `url`, `listingId` | the listing |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

#### Example

A real record from a live run — Dresden, flats for sale, newest first, 25 September 2026:

```json
{
  "input": "Dresden",
  "place": "Dresden, Sachsen",
  "listingId": "26SJ599LCRGB",
  "url": "https://www.immowelt.de/expose/0eebeeb3-4dd2-4e05-bd6e-0ae13b835323",
  "title": "Wunderschöne 4-Raum Wohnung *Provisionsfrei*",
  "typeLabel": "Wohnung zum Kauf",
  "transaction": "sale",
  "propertyType": "APARTMENT",
  "price": 350000,
  "currency": "EUR",
  "pricePerSqm": 3520.42,
  "livingAreaSqm": 99.42,
  "rooms": 4,
  "floor": 2,
  "buildingFloors": 3,
  "availableFrom": "immediately",
  "energyClass": "D",
  "city": "Ortsamtsbereich Cotta",
  "postcode": "01157",
  "district": "Cotta",
  "municipality": "Dresden",
  "state": "Saxony",
  "street": "Zöllmener Straße 33",
  "sellerType": "agency",
  "agency": "imvent Hausverwaltung GmbH",
  "highlights": ["provisionsfrei"],
  "hasFloorPlan": true,
  "description": "Diese großzügige 4-Zimmer-Wohnung mit offener Wohnküche befindet sich in einem 1959 erbauten Mehrfamilienhaus in der Zöllmener Straße 33 in Dresden-Cotta. Auf einer Wohnfläche von 99,42 Quadratmetern...",
  "firstListed": "2026-09-16T08:06:58.168Z",
  "imageCount": 11,
  "image": "https://mms.immowelt.de/5/b/6/a/5b6a7d69-c31d-438b-aa12-c2e9e9f2f302.jpg",
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from immowelt.de, one per line — or type **Places** and choose the filters.
2. Set **Max listings per search**.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new listings in an area, type the place, set **Sort** to **Newest first**, save your input as a task and schedule it daily.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per property delivered** — see the price on this page. Links that are not immowelt searches and places immowelt does not know are free.

### FAQ

**How many properties per search?** As many as immowelt shows, up to its own limit of 10,000 per search. A live run read 9,996 of the 63,758 flats to rent across Germany in under 10 minutes; split such a search by state, city or price to get them all.

**Can I get only private owners?** Yes: set **Offered by** to **Private owners** (for the places you type), or tick the private filter on immowelt.de before copying the link. A live run read all 153 houses that private owners offer to rent in Bavaria, plus those in Leipzig and Munich 80331, in 25 seconds — none with a name or a street.

**Why is `city` sometimes "Pankow" or "Süd"?** That is how immowelt names places in Berlin, Frankfurt and Dresden: the borough. `municipality` and `postcode` say which city it is.

**Why a residential proxy?** immowelt's bot check turns down datacenter addresses. The input comes set to Apify's German residential proxy; keep it that way.

**Why no phone numbers or contact names?** They are personal data. Every listing has its `url`; buyers and tenants contact the seller on immowelt.

**Is this affiliated with immowelt?** No. This is an independent tool that reads public immowelt listings.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

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

Set up a search on immowelt.de with all the filters you want and paste the address of the results page. One per line.

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

Or search here without a link: cities, districts, federal states or postcodes (Köln, Prenzlauer Berg, Bayern, 80331). The filters below apply.

## `transaction` (type: `string`):

For the places above.

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

For the places above.

## `minPrice` (type: `integer`):

Optional. For rent: the cold rent per month.

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

Optional. For rent: the cold rent per month.

## `minArea` (type: `integer`):

Optional.

## `maxArea` (type: `integer`):

Optional.

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

Optional.

## `maxRooms` (type: `integer`):

Optional.

## `sellerType` (type: `string`):

Optional.

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

For the places above.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many listings. immowelt shows at most 10,000 per search.

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

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

immowelt's bot check turns down datacenter addresses, so keep the residential proxy; German addresses get through most often. The first try of a run goes out directly; after a refusal every request uses the proxy.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634"
  ],
  "transaction": "rent",
  "propertyType": "apartment",
  "sellerType": "any",
  "sortBy": "default",
  "maxListingsPerSearch": 30,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

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

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "DE"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/immowelt-properties").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.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "DE",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/immowelt-properties").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 '{
  "searchUrls": [
    "https://www.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}' |
apify call highbrow_fame/immowelt-properties --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/immowelt-properties"
        }
    }
}
```

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/U6oAZhxRSLTC21gLz/builds/HgXiKho1QcmYOIab6/openapi.json
