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

Scrapes property listings from immowelt.de, one of Germany's largest real-estate portals. Collects sale and rental listings from search pages and full details from individual listing pages: address, rooms, living space, prices, energy data, features, photos, and agency contact data.

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

## Pricing

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

![banner](https://anyx.solutions/banners/immowelt-scraper.png)

## Immowelt Scraper

**Sale and rental property listings from immowelt.de — search results and full listing details as clean JSON.**

Scrapes property listings from immowelt.de, one of Germany's largest real-estate portals. Point it
at any immowelt search — a city, a district, a radius, with whatever filters you set on the site —
and get every matching listing back with its address, rooms, living space, floor, price, price per
square metre, photos, and energy class. Add listing URLs to pull the full detail record: the
description, the complete feature list, energy certificate, price breakdown, and the agency's
contact data. Built for real-estate market analysis, price monitoring, lead generation, and
portfolio research across Germany.

### ⚡ Quick start

```json
{
  "startUrls": [
    {
      "url": "https://www.immowelt.de/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08DE6345"
    }
  ],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                                                                                     | Description                                                                                                                                                                       |
| -------------------- | ------- | -------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | yes      | —                                                                                           | immowelt URLs to scrape. Search pages (`/classified-search?...`, with any filters applied) and listing pages (`/expose/<id>`, or `/projekte/expose/<id>` for new-build projects). |
| `maxItems`           | integer | no       | `5`                                                                                         | Maximum number of listings to return per start URL.                                                                                                                               |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "DE" }` | Proxy settings. immowelt is protected by DataDome and only answers German visitors, so German residential proxies are used by default.                                            |

### 📤 Output

Every listing is one dataset row. The `itemType` field tells the two shapes apart: `search` for a
card from a results page and `property` for a full listing page. Both carry the listing `id` and its
public `url`; the nested objects hold the listing data exactly as immowelt publishes it, so every
attribute the site shows is available.

#### Fields

| Field             | Type   | Description                                                                                                                             |
| ----------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------- |
| `itemType`        | string | `search` or `property`.                                                                                                                 |
| `id`              | string | immowelt listing ID.                                                                                                                    |
| `url`             | string | Public listing URL, e.g. `https://www.immowelt.de/expose/051d32c7-0350-4114-a701-6a08aa414c20`.                                         |
| `brand`           | string | Portal the listing belongs to, e.g. `immowelt`.                                                                                         |
| `status`          | string | Search only. Publication status, e.g. `Published`.                                                                                      |
| `type`            | string | Search only. Seller type, e.g. `PROFESSIONAL`.                                                                                          |
| `portal`          | string | Search only. Portal the card was served from.                                                                                           |
| `display`         | string | Search only. Card kind on the results page.                                                                                             |
| `energyClass`     | string | Search only. Energy efficiency class, when the lister set one.                                                                          |
| `metadata`        | object | Search only. Creation and update timestamps, and the legacy listing ID.                                                                 |
| `location`        | object | Search only. City, postal code, and district.                                                                                           |
| `hardFacts`       | object | Search only. Title, key facts (rooms, living space, floor), and price with price per m².                                                |
| `gallery`         | object | Search only. Photos with captions.                                                                                                      |
| `tracking`        | object | Search only. Listing attributes in machine-readable form: property type, price, rooms, area, postal code.                               |
| `provider`        | object | Search only. The agency or private seller behind the listing.                                                                           |
| `cardProvider`    | object | Search only. The seller as shown on the card, with logo.                                                                                |
| `mainDescription` | object | Search only. Headline and opening description.                                                                                          |
| `rawData`         | object | Search only. Raw listing attributes: price, rooms, surface, property and distribution type, seller location.                            |
| `tags`            | object | Listing flags: exclusive, 3D tour, brokerage fee, new listing.                                                                          |
| `newBuild`        | object | Search only. New-build project data, when the card belongs to one.                                                                      |
| `title`           | string | Property only. Listing title.                                                                                                           |
| `sections`        | object | Property only. The full listing: `location`, `hardFacts`, `price`, `features`, `energy`, `description`, `areaDescription`, `key` (IDs). |
| `contactSections` | object | Property only. The agency's contact card: name, logo, and phone numbers.                                                                |

<details><summary>Example output</summary>

```json
{
  "itemType": "search",
  "id": "26W841LYHJ6R",
  "url": "https://www.immowelt.de/expose/051d32c7-0350-4114-a701-6a08aa414c20",
  "brand": "immowelt",
  "status": "Published",
  "type": "PROFESSIONAL",
  "location": {
    "address": {
      "country": "DEU",
      "city": "München",
      "zipCode": "80636",
      "district": "Neuhausen-Nymphenburg"
    }
  },
  "hardFacts": {
    "title": "Wohnung zum Kauf",
    "keyfacts": ["3 Zimmer", "95,3 m²", "1. Geschoss"],
    "price": {
      "formatted": "1.050.000 €",
      "additionalInformation": "11.014 €/m²"
    }
  },
  "energyClass": null
}
```

</details>

### 💡 Use cases

- **Market analysis** — track asking prices and rents by city, district, or postal code over time.
- **Price monitoring** — watch specific listings or searches and spot price reductions as they happen.
- **Lead generation** — collect agency names and contact data from active listings in a region.
- **Portfolio research** — compare rooms, living space, and price per square metre across comparable properties.

### ❓ FAQ

- **Do I need a proxy?** Yes. immowelt is protected by DataDome and blocks visitors from outside Germany, so the Actor uses Apify German residential proxies by default. Other settings are likely to be blocked.
- **Can I use my own search filters?** Yes — set them on immowelt.de and paste the resulting URL as a start URL. Buy and rent searches are both supported.
- **How many results can I get?** `maxItems` caps results per start URL, and the Actor pages through the search automatically. Add more start URLs to widen coverage.
- **What is the difference between `search` and `property` items?** A search item is a card from a results page, with the key facts and price. A property item is the full record from the listing page, with the description, feature list, energy data, price breakdown, and agency contact card under `sections` and `contactSections`.
- **Why did a run return fewer items than expected?** The site may have changed its layout or tightened its protection, or a listing may have expired. Open an issue and we will update the Actor.

### 🔗 More scrapers by Anyx

- [Homegate Scraper](https://apify.com/anyxsolutions/homegate-scraper)
- [ImmobilienScout24 Scraper](https://apify.com/anyxsolutions/immobilienscout24-scraper)
- [Kleinanzeigen Scraper](https://apify.com/anyxsolutions/kleinanzeigen)
- [Autoscout24 Scraper](https://apify.com/anyxsolutions/autoscout24-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [immowelt.de](https://www.immowelt.de/)

# Actor input Schema

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

immowelt URLs to scrape. Search pages (for example https://www.immowelt.de/classified-search?distributionTypes=Buy\&estateTypes=Apartment\&locations=AD08DE6345, with any filters applied) and listing pages (https://www.immowelt.de/expose/051d32c7-0350-4114-a701-6a08aa414c20, or /projekte/expose/... for new-build projects) are both supported.

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

Maximum number of listings to return per start URL. A search page carries about 30 listings, so the default finishes in a single request.

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

Apify proxy settings. immowelt is protected by DataDome and only answers German visitors, so German residential proxies are used by default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.immowelt.de/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08DE6345"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "DE"
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://www.immowelt.de/classified-search?distributionTypes=Buy&estateTypes=Apartment&locations=AD08DE6345"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/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=Buy&estateTypes=Apartment&locations=AD08DE6345" }] }

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/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=Buy&estateTypes=Apartment&locations=AD08DE6345"
    }
  ]
}' |
apify call anyxsolutions/immowelt-scraper --silent --output-dataset

```

## MCP server setup

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