# Immowelt Scraper (`ribtools/immowelt-scraper`) Actor

Scrape Immowelt.de and Immowelt.at property listings (apartments, houses, plots, offices, parking, new builds) from any search, ad, project or agency URL: cold and warm rent, prices, areas, energy class, agency contacts.

- **URL**: https://apify.com/ribtools/immowelt-scraper.md
- **Developed by:** [RibTools](https://apify.com/ribtools) (community)
- **Categories:** Real estate, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 property data 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/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

Extract property listings from **Immowelt**, one of Germany's largest real-estate portals, and from its Austrian edition immowelt.at. Each listing comes with price, cold and warm rent, area, rooms, floor, energy class, location and agency, for sale or rent. Optional add-ons fetch the full ad details and the agency's office contacts.

### What is Immowelt Scraper?

**Immowelt Scraper** collects listings from [immowelt.de](https://www.immowelt.de/) and [immowelt.at](https://www.immowelt.at/): apartments, houses, plots, offices, parking spaces and new-build projects. You paste the URLs you would open in your browser and get structured data for each listing:

- property type, sale or rent, price in euros and price per m²
- for rentals: cold rent (Kaltmiete) as the headline price, plus the warm rent (Warmmiete)
- living area and plot area, rooms (half rooms included, e.g. 2.5), floor, availability date
- building condition and energy efficiency class
- federal state, city, district, postal code (PLZ) and street (when the ad publishes its address, as immowelt shows it)
- the agency's trading name, id and immowelt profile, photos and floor plans, listing and update dates

Two optional add-ons go further. **Ad details** adds the full description, map coordinates, features, the energy certificate, year built, heating and the cost breakdown (Nebenkosten, Heizkosten, Warmmiete, Kaution, Hausgeld, Provision). **Agency contact** adds the agency's office phone numbers, office address and website.

### What can this Actor do?

- **Every property type**: apartments, houses, plots, offices, parking, new builds, for sale and for rent
- **Every entry point**: searches with any filters (location, price, area, rooms, sort, page), SEO search pages, single ads, new-build projects and agency pages
- **Germany and Austria**: immowelt.de and immowelt.at URLs in the same run
- **Automatic pagination**: 30 listings per page, up to the 10,000 results immowelt shows per search
- **No duplicates**: each listing is returned (and charged) once per run
- **Premium proxies included**: German residential proxies built in at no additional cost
- **Structured output**: JSON, CSV and Excel; API access and scheduled runs

### What data can Immowelt Scraper extract?

| Field | Description | Example |
| ----- | ----------- | ------- |
| **ID** | Immowelt online ID and the ad's URL id | 26T5KB29UCB3 |
| **Title** | Ad headline | Modernes Wohnen im Herzen Berlins |
| **Property type** | apartment, house, plot, office, parking, ... and the subtype | apartment |
| **Transaction** | Sale or rent | rent |
| **Price** | Purchase price or cold rent in euros, what it is, warm rent, price per m² | 1299, Kaltmiete, 1499, 26.95 |
| **Area / rooms / floor** | Living and plot area in m², rooms, floor (0 = ground floor) | 48.2, 2, 1 |
| **Condition / energy** | Building state and energy class | MINT_CONDITION, B |
| **Location** | Federal state, city, district, PLZ, street | Berlin, Kreuzberg, 10179 |
| **Agency** | Seller type, agency name, id and profile | agency, STRATEGIS AG |
| **Media** | Photo and floor plan URLs | |
| **Dates** | Listed and last updated | 2026-10-13T13:02:31.563Z |
| **Details** (add-on) | Description, coordinates, features, energy certificate, costs | See below |
| **Agency contact** (add-on) | Office phones, office address, website | See below |

### How to scrape Immowelt

1. **Set up your search on immowelt** (location, buy or rent, property type, filters) and copy the URL from the browser
2. **Paste it into Start URLs**, along with any ad, project or agency URLs
3. **Turn on add-ons** if you need details or agency contacts
4. **Run** and download the results as JSON, CSV or Excel

Proxies are included automatically — no setup required.

#### Compatible URL examples

- **Filtered search**: `https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08DE8634`
- **With price, sort and page**: `https://www.immowelt.de/classified-search?distributionTypes=Buy&estateTypes=House,Apartment&locations=AD08DE8634&priceMax=500000&order=DateDesc&page=2`
- **SEO search page**: `https://www.immowelt.de/suche/mieten/wohnung/berlin/berlin-10115/ad08de8634`
- **Older list links**: `https://www.immowelt.de/liste/berlin/wohnungen/mieten`
- **Austria**: `https://www.immowelt.at/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=...`
- **Single ad**: `https://www.immowelt.de/expose/d7234819-4f97-4f62-ae2c-bb2f4a2fc475`, `https://www.immowelt.de/expose/26T5KB29UCB3` (any case) or `https://www.immowelt.de/wl-cdp/26T5KB29UCB3`
- **New-build project (all its units)**: `https://www.immowelt.de/projekte/expose/k24n932`
- **Agency (its whole inventory, sale and rent)**: `https://www.immowelt.de/profil/9e54973f13ffde498cb2190efc8b9890`

A search URL is run exactly as you copied it, with every filter and sort. The new-build landing page (`/projekte/suche`) has no results of its own: run a search from it and paste that URL instead.

### How much does it cost to scrape Immowelt?

Immowelt Scraper uses **pay-per-result** pricing: you pay only for listings it extracts.

- **Base extraction**: one charge per listing
- **Ad details add-on**: one additional charge per listing with details
- **Agency contact add-on**: one additional charge per listing that returns at least one agency phone number; never for private owners

### Input configuration

#### Start URLs

Any immowelt.de or immowelt.at search, SEO search, ad (`/expose/...`), project (`/projekte/expose/...`) or agency (`/profil/...`) URL.

#### Maximum items

How many listings to scrape (each is a charged result). Leave empty for every result; immowelt itself shows at most 10,000 per search, so split very large searches by location or price.

#### Ad details add-on

Adds the full description, map coordinates (only when the ad publishes its address), features, energy certificate type and consumption, year built, heating and energy source, and the cost breakdown as immowelt labels it.

#### Agency contact add-on

Adds the agency's office phone numbers, office address, website, immowelt profile and partner badge.

### Output example

```json
{
  "type": "property",
  "id": "26T5KB29UCB3",
  "uuid": "d7234819-4f97-4f62-ae2c-bb2f4a2fc475",
  "url": "https://www.immowelt.de/expose/d7234819-4f97-4f62-ae2c-bb2f4a2fc475",
  "title": "Modernes Wohnen im Herzen Berlins - Stilvolle 2-Zimmer-Wohnung mit Balkon und Einbauküche",
  "property_type": "apartment",
  "property_subtype": null,
  "listing_label": "Wohnung zur Miete",
  "transaction": "rent",
  "price": 1299,
  "currency": "EUR",
  "price_label": "Kaltmiete",
  "warm_rent": 1499,
  "price_per_m2": 26.95,
  "area_m2": 48.2,
  "terrain_area_m2": null,
  "rooms": 2.0,
  "floor": 1,
  "availability": "frei ab 01.12.2026",
  "condition": "MINT_CONDITION",
  "energy_class": "B",
  "country": "DE",
  "region": "Berlin",
  "city": "Berlin",
  "neighborhood": "Kreuzberg",
  "postal_code": "10179",
  "street": "Stallschreiberstraße 23",
  "seller_type": "agency",
  "seller_id": "1107086",
  "seller_name": "STRATEGIS AG",
  "seller_url": "https://www.immowelt.de/profil/9e54973f13ffde498cb2190efc8b9890",
  "reference_number": "222840",
  "is_new_build": false,
  "is_new": true,
  "badges": [],
  "photos": ["https://mms.immowelt.de/b/d/a/0/bda01f83-60ee-409a-8722-1039583b0f66.jpg"],
  "floorplans": ["https://mms.immowelt.de/3/5/9/f/359ffe6d-0413-4728-9239-fb606a2c4a79.png"],
  "listed_at": "2026-10-13T13:02:31.563Z",
  "updated_at": "2026-10-15T18:48:36.28Z",
  "details": {
    "description": "Helle Wohnung mit Balkon.\nEinbauküche vorhanden.",
    "latitude": 52.5075458541591,
    "longitude": 13.4073928659083,
    "features": ["Personenaufzug", "Einbauküche", "Bad mit Dusche", "Keller", "Balkon"],
    "costs": {
      "Kaltmiete": "1.299 €",
      "Nebenkosten": "200 €",
      "Heizkosten": "in Warmmiete enthalten",
      "Warmmiete": "1.499 €",
      "Kaution": "3 Nettokaltmieten"
    },
    "bedrooms": 1,
    "bathrooms": 1,
    "year_built": 2019,
    "heating": "Fußbodenheizung",
    "energy_source": "Fernwärme",
    "energy_certificate": "Bedarfsausweis",
    "energy_consumption": "63 kWh/(m²·a)"
  },
  "seller": {
    "id": "1107086",
    "name": "STRATEGIS AG",
    "phones": ["030 12345678"],
    "address": "Leipziger Straße 51, 10117 Berlin",
    "website": "https://www.strategis.eu/",
    "profile_url": "https://www.immowelt.de/profil/9e54973f13ffde498cb2190efc8b9890",
    "badge": "Platin Partner"
  }
}
```

### Use cases and applications

- **Rent and price research**: cold and warm rents, purchase prices and price per m² by state, city, district and PLZ
- **Property valuation**: comparables by area, rooms, floor, condition, energy class and year built
- **New-build tracking**: every unit of a project with its price and availability
- **Agency monitoring and lead generation**: an agency's whole inventory, or agencies' office contacts across a market

### Integrations and API access

- **Zapier** and **Make**: automate workflows ([Zapier](https://docs.apify.com/platform/integrations/zapier), [Make](https://www.make.com/en/integrations/apify))
- **Google Sheets**: export directly for analysis
- **REST API and Python/Node.js clients**: [run the Actor and read the dataset](https://docs.apify.com/academy/api/run-actor-and-retrieve-data-via-api)

### FAQ and Support

#### Do I need to configure a proxy?

No. German residential proxies are included at no extra cost.

#### Why are there no names or phones for private owners or agents?

To protect individuals' privacy under the EU's GDPR, the scraper returns business contact data only: the agency's trading name, office phones and office address. Private owners come back as `seller_type: "private"` with no name and no phone, and are never charged for the agency contact add-on. Individual agents' names are never returned as fields. What immowelt shows openly on the ad page is returned as shown: the street and map coordinates when the ad publishes its address (private ads included; otherwise only district, city and PLZ), and ad texts, which sometimes include an agent's contact.

#### What do `price`, `price_label` and `warm_rent` mean?

`price` is the headline price immowelt shows: the purchase price, or for rentals the cold rent (Kaltmiete; for offices often "Nettomiete zzgl. NK"), which `price_label` names. `warm_rent` is the warm rent when the ad gives one. `price` is empty for "price on request" ads.

#### Why does a search stop at 10,000 listings?

Immowelt itself shows at most 10,000 results per search. Split a larger search by location, price or property type.

#### What if some URLs don't work?

The scraper accepts the URL forms listed above and skips any other URL, telling you so in the run log.

#### Need help or have feedback?

Use the Issues tab for bug reports, feature requests and custom solutions.

### Auf Deutsch

**Immowelt Scraper** liest Immobilienanzeigen von [immowelt.de](https://www.immowelt.de/) und [immowelt.at](https://www.immowelt.at/): Wohnungen, Häuser, Grundstücke, Büros, Stellplätze und Neubauprojekte, zum Kauf und zur Miete. Jede Anzeige enthält Kaufpreis oder Kaltmiete und Warmmiete, Preis pro m², Wohn- und Grundstücksfläche, Zimmer (auch halbe), Etage, Verfügbarkeit, Zustand, Energieeffizienzklasse, Bundesland, Stadt, Stadtteil, PLZ und den Anbieter.

**Unterstützte URLs:** Suchergebnisse mit allen Filtern (`/classified-search?...`, `/suche/...`, ältere `/liste/...`-Links), einzelne Exposés (`/expose/...`), Neubauprojekte (`/projekte/expose/...`) und Anbieterprofile (`/profil/...`).

**Zusatzoptionen:** Exposé-Details (Beschreibung, Koordinaten bei veröffentlichter Adresse, Ausstattung, Energieausweis, Baujahr, Heizung, Kosten wie Nebenkosten, Kaution, Hausgeld, Provision) und Anbieterkontakt (Bürotelefon, Büroadresse, Website des Maklers). Gemäß DSGVO Kontaktdaten nur von Firmen: Privatanbieter erscheinen als `seller_type: "private"` ohne Name und Telefon; Straße und Koordinaten nur, wenn die Anzeige die Adresse veröffentlicht.

Proxys inklusive, keine Einrichtung nötig.

# Changelog

This Actor's version history is a separate document: https://apify.com/ribtools/immowelt-scraper/changelog.md

# Actor input Schema

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

Paste any immowelt.de or immowelt.at URL: a search with your filters (https://www.immowelt.de/classified-search?distributionTypes=Rent\&estateTypes=Apartment\&locations=AD08DE8634, including page and sort), an SEO search page (/suche/mieten/wohnung/berlin/...), a single ad (/expose/...), a new-build project (/projekte/expose/...) or an agency page (/profil/...). Set up the search on immowelt and copy the URL from the browser.

## `maxRequests` (type: `integer`):

How many listings to scrape before stopping. Leave empty for every result (immowelt shows at most 10,000 per search).

## `detailsAddon` (type: `boolean`):

Also fetch each ad's details: full description, map coordinates (when the address is published), features, energy certificate, year built, heating, and the cost breakdown (Nebenkosten, Warmmiete, Kaution, Hausgeld, Provision). Charged per item with details.

## `sellerDataAddon` (type: `boolean`):

Also return the agency's contact data: trading name, office phone numbers, office address, website and immowelt profile. Private owners never get contact data. Charged per item with an agency phone.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08DE8634"
    }
  ],
  "maxRequests": 10,
  "detailsAddon": false,
  "sellerDataAddon": false
}
```

# Actor output Schema

## `items` (type: `string`):

All scraped 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 = {
    "startUrls": [
        {
            "url": "https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08DE8634"
        }
    ],
    "maxRequests": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("ribtools/immowelt-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 = {
    "startUrls": [{ "url": "https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08DE8634" }],
    "maxRequests": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("ribtools/immowelt-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 '{
  "startUrls": [
    {
      "url": "https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=Apartment&locations=AD08DE8634"
    }
  ],
  "maxRequests": 10
}' |
apify call ribtools/immowelt-scraper --silent --output-dataset

```

## MCP server setup

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