# Immowelt.de Property Scraper (`solidcode/immowelt-de-scraper`) Actor

\[💰 $0.8 / 1K] Extract German property listings from Immowelt.de — price, €/m², rooms, living and plot area, address, energy class, photos, and agent contacts. Filter by location, sale/rent, property type, price, size, rooms, and year built.

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

## Pricing

from $0.80 / 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/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

## Immowelt.de Property Scraper

Pull German property listings from Immowelt.de at scale — asking price, €/m², rooms, living and plot area, address, energy class, photo galleries, floor plans and agent contacts, for sale and for rent across all 16 federal states. Built for German estate agents, property investors, PropTech teams and relocation specialists who need a clean, filterable Immowelt dataset without hand-crafting search links or copying listings one page at a time.

### Why This Scraper?

- **A real search builder, not just a URL box** — 4 transaction types (For Sale, For Rent, Auction, Foreclosure Auction), 7 property types, 4 project types, 5 numeric range filters (price, living area, plot size, rooms, year built) and 6 sort orders, all as plain dropdowns and number boxes.
- **Location is a true geographic filter, not a text match** — type a city, district, postcode or federal state and you get that exact place. `Prenzlauer Berg` returns only the listings inside that quarter, around 450 of them rather than Berlin's 12,000, and postcode `80995` narrows München from roughly 3,900 listings to about 130. Type a place Immowelt does not have and the run stops and says so, instead of quietly searching the whole country and billing you for it.
- **AI scene labels on the photos** — Immowelt classifies images as `LIVING_ROOM`, `KITCHEN`, `BEDROOM`, `HOUSE_FACADE`, `SWIMMING_POOL` and more. About seven photos in ten carry a label, and every label ships in `images[].category` — so you can pull just the kitchen shots across thousands of listings. No other Immowelt dataset carries it.
- **German energy data, structured** — efficiency class A+ to H on every search row, plus certificate type (Verbrauchsausweis / Bedarfsausweis), consumption in kWh/(m²·a) and heating system (e.g. Zentralheizung) when you turn on full detail.
- **57 curated fields per listing — no filler** — every column is real listing data. No analytics or tracking passthrough padded in to inflate a field count.
- **Agent and agency contacts on every row** — agency name, named contact person, phone, postal address, website, Immowelt profile URL, star rating and review count, plus an `isPrivateOwner` flag that separates private sellers from brokers.
- **Investment maths ready out of the box** — `pricePerSqm` sits next to `price`, `livingArea` and `plotArea`, so yield and €/m² screening work directly on the dataset with no post-processing.
- **Up to 50,000 listings per run, on one shared budget** — `maxResults` caps the whole run rather than each search, so a list of 20 links cannot quietly cost you 20 times what you set, and a run with no limit stops at 50,000 instead of running away.
- **Nine extra fields on demand** — the optional detail option opens each property's own page for map coordinates, the complete description (search results stop at roughly 200 characters), year built, heating type, energy certificate type, energy consumption, the full amenities list and the commission fee. Off by default, so most runs never pay for it.

### Use Cases

**Market Research & Analysis**

- Track asking prices and €/m² by city, district or postcode over time
- Compare apartment and house inventory across Berlin, München, Hamburg and beyond
- Measure how many listings a price band actually holds — a Berlin buy search returns around 12,000 listings, of which roughly 1,800 sit in the €300k–€400k band
- Monitor new-build supply by filtering to `New_Build` project types

**Investment & Portfolio Screening**

- Screen for yield candidates by combining a price ceiling with a living-area floor
- Filter by year built to separate Altbau stock from post-2015 construction
- Pull energy class and consumption figures to flag properties facing renovation obligations
- Map candidates with coordinates and shortlist by district

**Lead Generation**

- Build broker and agency contact lists with phone, website and Immowelt profile
- Find private sellers with the `isPrivateOwner` flag for direct outreach
- Rank agencies in a target city by listing volume, rating and review count
- Spot new listings the day they appear with newest-first sorting

**Relocation & Corporate Housing**

- Pull rental inventory for a specific district and rent ceiling for arriving staff
- Compare monthly rents across neighbourhoods before signing a relocation package
- Filter by room count and living area to match family size
- Collect photo galleries and floor plans for shortlists sent to relocating employees

**PropTech & Data Products**

- Feed a valuation or comparables model with fresh German listing data
- Power a property search app or market dashboard with structured inventory
- Enrich an existing CRM with current pricing, energy class and agent contacts
- Build alerting on price changes and new inventory in watched postcodes

### Getting Started

#### Apartments for Sale in Berlin

The simplest run — a city and a property type:

```json
{
    "location": "Berlin",
    "transactionType": "Buy",
    "propertyTypes": ["Apartment"],
    "maxResults": 50
}
```

#### Rentals in One District, Newest First

```json
{
    "location": "Prenzlauer Berg",
    "transactionType": "Rent",
    "propertyTypes": ["Apartment"],
    "priceMax": 2000,
    "roomsMin": 3,
    "sortBy": "DateDesc",
    "maxResults": 200
}
```

#### Investment Screening with Full Detail

```json
{
    "location": "München",
    "transactionType": "Buy",
    "propertyTypes": ["House", "Apartment"],
    "projectTypes": ["Investment", "New_Build"],
    "priceMin": 300000,
    "priceMax": 800000,
    "livingAreaMin": 80,
    "constructionYearMin": 2015,
    "sortBy": "PriceAsc",
    "maxResults": 500,
    "includeDetails": true
}
```

#### Paste Immowelt URLs

Search links and single listing links can be mixed in one run:

```json
{
    "startUrls": [
        "https://www.immowelt.de/classified-search?distributionTypes=Rent&estateTypes=House&locations=AD08DE1113",
        "https://www.immowelt.de/expose/1215b46c-9e03-4081-bc72-67209544ff9f"
    ],
    "maxResults": 100
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | Immowelt search URLs or single listing URLs. Any filters already in a search URL are kept. When you provide URLs here, the search filters below are ignored. |

#### Build a Search

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `location` | string | `"Berlin"` | Where to search: a city, district, postcode or federal state (`Berlin`, `München`, `Prenzlauer Berg`, `80331`, `Bayern`). Leave empty to search all of Germany. |
| `transactionType` | select | `"Buy"` | For Sale, For Rent, Auction or Foreclosure Auction. |
| `propertyTypes` | select\[] | `["Apartment"]` | One or more of: Apartment / Flat, House, Land / Plot, Office & Commercial, Garage / Parking, Senior Living, Other. Empty includes every type. |
| `projectTypes` | select\[] | `[]` | Existing property, New build, Off-plan / planned or Investment property. Empty includes all of them. |
| `keywords` | string | `""` | A word that must appear in the listing text, e.g. `Villa`, `Altbau`, `Balkon`, `Penthouse`. This searches the listing text — it is not a location filter. |

#### Price, Size & Age

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `priceMin` | integer | — | Lowest price in euros. For rentals this is the monthly rent. |
| `priceMax` | integer | — | Highest price in euros. For rentals this is the monthly rent. |
| `livingAreaMin` | integer | — | Smallest living area in square metres. |
| `livingAreaMax` | integer | — | Largest living area in square metres. |
| `roomsMin` | integer | — | Fewest rooms. |
| `roomsMax` | integer | — | Most rooms. |
| `plotAreaMin` | integer | — | Smallest plot in square metres. Applies to houses and land. |
| `plotAreaMax` | integer | — | Largest plot in square metres. Applies to houses and land. |
| `constructionYearMin` | integer | — | Earliest year of construction, e.g. `1990`. |
| `constructionYearMax` | integer | — | Latest year of construction, e.g. `2020`. |

#### Options

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | select | `"Default"` | Immowelt default, Newest first, Price: low to high, Price: high to low, Size: small to large, or Size: large to small. |
| `maxResults` | integer | `50` | Maximum listings to return across all URLs and searches combined — a limit for the whole run, not for each search. Set to `0` to collect everything the searches find. Either way a single run returns at most 50,000 listings; a higher number is collected up to that limit and the log says so. A page is always finished once it starts, so you may get a few results more than you asked for — never fewer. |
| `includeDetails` | boolean | `false` | Opens each property's own page to add nine extra fields: coordinates, the complete description, year built, heating type, energy certificate type and consumption, the full amenities list and the commission fee. Added to the first 10,000 listings in a run; the rest are still collected and saved from the search results at no extra charge. Billed separately — see Pricing. |

### Output

One row per property. Here is a representative listing with full detail turned on (photo array trimmed):

```json
{
    "id": "26R7BBLZXRYA",
    "legacyId": "b45d8fcd-cca6-4ca2-880f-365ae50ec493",
    "url": "https://www.immowelt.de/expose/b45d8fcd-cca6-4ca2-880f-365ae50ec493",
    "title": "Wohnung zum Kauf",
    "headline": "Wunderschöne, traumhaft ruhige und zentrale 2-Zimmer Wohnung in Berlin Mitte",
    "description": "Willkommen in Berlin Mitte! Mittendrin aber trotzdem ruhig und gepflegt präsentiert sich diese schöne Altbauwohnung im Seitenflügel eines sanierten Gründerzeit-Altbaus...",
    "descriptionIsTruncated": false,
    "status": "Published",
    "transactionType": "BUY",
    "propertyType": "APARTMENT",
    "price": 349000,
    "priceFormatted": "349.000 €",
    "currency": "EUR",
    "pricePerSqm": 6634.98,
    "hasBrokerageFee": false,
    "brokerageFee": "3,57 % inkl. geltender MwSt. auf den Kaufpreis",
    "livingArea": 52,
    "plotArea": null,
    "rooms": 2,
    "floor": "3. Geschoss",
    "constructionYear": 1903,
    "condition": "WELL_KEPT",
    "features": ["frei ab sofort", "Einbauküche", "Badewanne", "Keller", "Fenster: Kunststoff"],
    "address": "Wöhlertstraße 11",
    "isAddressPublished": true,
    "city": "Mitte",
    "district": "Mitte",
    "zipCode": "10115",
    "region": "Berlin",
    "country": "DEU",
    "latitude": 52.53698792580476,
    "longitude": 13.37929794999749,
    "geoIds": ["AD09DE475", "AD08DE8634", "AD06DE326", "AD04DE11", "AD02DE1"],
    "energyClass": "C",
    "energyCertificateType": "Verbrauchsausweis",
    "energyConsumption": 88.0,
    "heatingType": "Zentralheizung",
    "images": [
        {
            "url": "https://mms.immowelt.de/a/8/7/0/a8705267-10f6-4ba3-8e68-7b1869265eea.png",
            "description": "Wohnzimmer mit Loungesessel vor dem Fenster",
            "category": "LIVING_ROOM"
        }
    ],
    "imageCount": 14,
    "floorPlans": ["https://mms.immowelt.de/7/c/1/2/7c12f0a1-grundriss.png"],
    "has3DTour": false,
    "isNewListing": true,
    "providerType": "AGENCY",
    "isPrivateOwner": false,
    "agencyName": "Engel & Völkers Berlin-Mitte",
    "contactName": "Frau Marinela Gagulic",
    "agencyAddress": "Kurfürstendamm 61, 10707 Berlin",
    "agencyPhone": "+49 30 1234567",
    "agencyWebsite": "https://www.engelvoelkers.com/de-de/berlin-mitte/",
    "agencyProfileUrl": "https://www.immowelt.de/profil/engel-voelkers-berlin-mitte",
    "agencyRating": 4.8,
    "agencyReviewCount": 126,
    "searchUrl": "https://www.immowelt.de/classified-search?locations=AD08DE8634&distributionTypes=Buy&estateTypes=Apartment",
    "createdAt": "2026-07-30T06:58:54.5Z",
    "updatedAt": "2026-07-30T07:00:30.16Z",
    "scrapedAt": "2026-07-31T09:14:02Z"
}
```

Fields marked **†** are only filled when `includeDetails` is on.

#### Core & Classification

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Immowelt listing id, e.g. `26R7BBLZXRYA` |
| `legacyId` | string | The identifier used in the listing URL |
| `url` | string | Direct link to the listing on Immowelt |
| `title` | string | Listing title, e.g. `Wohnung zum Kauf` |
| `headline` | string | Marketing headline written by the seller |
| `description` **†** | string | Full listing text. Without the detail option this is Immowelt's ~200-character preview |
| `descriptionIsTruncated` | boolean | `true` when only the preview text was available |
| `status` | string | Listing status, e.g. `Published` |
| `propertyType` | string | `APARTMENT`, `HOUSE`, `PLOT`, `OFFICE`, … |
| `propertySubType` | string | Finer category where Immowelt states one |
| `isNewListing` | boolean | Flagged as new by Immowelt |
| `createdAt` | string | ISO 8601 first-published timestamp |
| `updatedAt` | string | ISO 8601 last-updated timestamp |

#### Price & Commission

| Field | Type | Description |
|-------|------|-------------|
| `transactionType` | string | `BUY` or `RENT` |
| `price` | integer | Numeric price in euros — monthly rent for rentals |
| `priceFormatted` | string | Display price as shown on Immowelt, e.g. `349.000 €` |
| `currency` | string | Always `EUR` |
| `pricePerSqm` | number | Price per square metre |
| `hasBrokerageFee` | boolean | Whether a broker commission applies |
| `brokerageFee` **†** | string | The commission text or percentage |

#### Size, Layout & Condition

| Field | Type | Description |
|-------|------|-------------|
| `livingArea` | integer | Living area in square metres |
| `plotArea` | integer | Plot size in square metres (houses and land) |
| `rooms` | number | Room count |
| `floor` | string | Storey, e.g. `3. Geschoss` |
| `constructionYear` **†** | integer | Year the property was built |
| `condition` | string | Building condition, e.g. `WELL_KEPT`, `FULLY_RENOVATED`, `MINT_CONDITION` |
| `features` **†** | string\[] | Full amenities list — fitted kitchen, cellar, flooring, windows, availability |

#### Address & Location

| Field | Type | Description |
|-------|------|-------------|
| `address` | string | Street address, only when the seller published it |
| `isAddressPublished` | boolean | Whether the exact address is public |
| `city` | string | City — in Berlin and Hamburg this is the borough (`Mitte`, `Altona`); `region` carries the city name |
| `district` | string | District or quarter |
| `zipCode` | string | Postcode |
| `region` | string | Federal state, in Immowelt's English spelling (`Bavaria`, `Lower Saxony`; `Berlin` and `Hamburg` read the same either way) |
| `country` | string | Always `DEU` |
| `latitude` **†** | number | Latitude, when the address is published |
| `longitude` **†** | number | Longitude, when the address is published |
| `geoIds` | string\[] | Immowelt place ids for this listing — reusable as a `location` input |

#### Energy

| Field | Type | Description |
|-------|------|-------------|
| `energyClass` | string | Efficiency class A+ to H |
| `energyCertificateType` **†** | string | `Verbrauchsausweis` or `Bedarfsausweis` |
| `energyConsumption` **†** | number | Energy figure in kWh/(m²·a) |
| `heatingType` **†** | string | Heating system, e.g. `Zentralheizung` |

#### Photos & Floor Plans

| Field | Type | Description |
|-------|------|-------------|
| `images` | object\[] | `{ url, description, category }` — `category` is Immowelt's AI scene label |
| `imageCount` | integer | Number of photos |
| `floorPlans` | string\[] | Floor-plan image URLs |
| `has3DTour` | boolean | Whether a 3D virtual tour is offered |

#### Seller & Agency Contact

| Field | Type | Description |
|-------|------|-------------|
| `providerType` | string | Seller type, e.g. `AGENCY` |
| `isPrivateOwner` | boolean | Listed by a private owner rather than an agency |
| `agencyName` | string | Agency name |
| `contactName` | string | Named contact person for the listing |
| `agencyAddress` | string | Agency postal address |
| `agencyPhone` | string | Agency phone number |
| `agencyWebsite` | string | Agency website |
| `agencyProfileUrl` | string | Immowelt agency profile URL |
| `agencyRating` | number | Average rating on Immowelt |
| `agencyReviewCount` | integer | Number of reviews |

#### Run Provenance

| Field | Type | Description |
|-------|------|-------------|
| `searchUrl` | string | The Immowelt search this row came from — open it to reproduce the query |
| `scrapedAt` | string | ISO 8601 collection timestamp |

### Tips for Best Results

- **Start with 20–50 results.** Check the columns match what you need, then raise `maxResults`. A page always finishes once it starts, so small caps can overshoot slightly — never come up short.
- **Pick the tightest area that still covers your target.** `location` accepts a city, a district, a postcode or a federal state, and the run log always names the place it actually searched. A handful of postcodes have no entry of their own on Immowelt and fall back to the surrounding city — the log tells you when that happens, so you are never guessing.
- **Reproduce an exact search by pasting its URL.** Build the filters you want on immowelt.de, copy the address bar into `startUrls`, and every filter in that link is honoured. Handy for searches with combinations the form does not offer.
- **`keywords` searches the listing text, not the map.** `Penthouse` cuts a Berlin buy search of roughly 12,000 listings down to under 500. Use it for `Altbau`, `Balkon`, `Villa` and similar terms — and use `location` for geography.
- **Group Berlin and Hamburg on `region`, not `city`.** Both are city-states, so `city` carries the borough (`Mitte`, `Pankow`, `Altona`) while `region` carries `Berlin` or `Hamburg`. Everywhere else `city` is the city, as you would expect.
- **Turn on full detail for underwriting, leave it off for monitoring.** Year built, heating, energy certificate and consumption, amenities and coordinates are what valuation and mapping work needs. A daily price-and-inventory watch does not, and runs cheaper without them.
- **Use Newest first for daily monitoring.** `sortBy: "DateDesc"` with a small `maxResults` is the cheapest way to catch new inventory the day it appears.
- **Expect seconds, occasionally minutes.** A 100-listing run usually finishes in well under a minute, but when Immowelt is under load the same run can take two to three minutes. Nothing is lost either way — the run simply takes longer, and you pay per result, not per second.
- **Expect some blanks by design.** Sellers can hide the exact street address, and coordinates only come with a published address. Rentals advertised as *Mietkosten auf Anfrage* carry no numeric price, `plotArea` is empty for apartments, and `pricePerSqm` is a sale-price measure — Immowelt does not publish it on rental listings, so that column is empty on a rental run.

### Pricing

**From $0.80 per 1,000 results** — an undercut on the going rate for Immowelt data, with the expensive part optional instead of baked in. Bronze, Silver and Gold subscribers pay progressively less; the table below shows total cost at each discount tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.095 | $0.090 | $0.085 | $0.080 |
| 1,000 | $0.95 | $0.90 | $0.85 | $0.80 |
| 10,000 | $9.50 | $9.00 | $8.50 | $8.00 |
| 100,000 | $95.00 | $90.00 | $85.00 | $80.00 |

A "result" is one property row in your dataset, with price, size, rooms, address, energy class, photos and agent contacts.

#### Optional Full Listing Details

Charged only for listings that were successfully enriched with the nine extra fields. Failed enrichments are never billed.

| Enriched listings | No discount | Bronze | Silver | Gold |
|-------------------|-------------|--------|--------|------|
| 1,000 | $4.75 | $4.50 | $4.25 | $4.00 |

Detail enrichment is off by default, so most runs only pay the per-result price. When you switch it on, the two charges add up: 1,000 listings with detail enrichment on costs $0.80 + $4.00 = **$4.80** at the Gold tier, or $0.95 + $4.75 = **$5.70** with no discount.

No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This Actor is designed for legitimate property market research, investment analysis, valuation work and business lead generation. You are responsible for complying with applicable laws — including the GDPR when handling agent and seller contact details — and with Immowelt's Terms of Service. Do not use collected data for spam, harassment, or any illegal purpose, and be mindful of German and EU fair housing and anti-discrimination rules when working with property and location data.

# Actor input Schema

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

Paste one or more Immowelt search URLs (e.g. https://www.immowelt.de/classified-search?distributionTypes=Buy\&estateTypes=Apartment\&locations=AD08DE8634) or single listing URLs (e.g. https://www.immowelt.de/expose/...). Any filters already in a search URL are kept. When you provide URLs here, the search filters below are ignored.

## `location` (type: `string`):

Where to search: a city, district, postcode, or federal state (e.g. 'Berlin', 'München', 'Prenzlauer Berg', '80331', 'Bayern'). Leave empty to search all of Germany. If Immowelt has no place by that name the run stops and tells you, rather than searching somewhere you didn't ask for. You can also paste an Immowelt location code such as AD08DE8634 if you have one.

## `transactionType` (type: `string`):

Whether to find properties for sale or for rent.

## `propertyTypes` (type: `array`):

Which kinds of property to include. Select one or more, or leave empty to include every type.

## `projectTypes` (type: `array`):

Narrow results to new builds, off-plan developments, existing properties, or investment properties. Leave empty to include all of them.

## `keywords` (type: `string`):

Optional word that must appear in the listing, e.g. 'Villa', 'Altbau', 'Balkon', 'Penthouse'. This searches the listing text — it is not a location filter.

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

Lowest price to include, in euros. For rentals this is the monthly rent. Leave empty for no minimum.

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

Highest price to include, in euros. For rentals this is the monthly rent. Leave empty for no maximum.

## `livingAreaMin` (type: `integer`):

Smallest living area to include, in square metres. Leave empty for no minimum.

## `livingAreaMax` (type: `integer`):

Largest living area to include, in square metres. Leave empty for no maximum.

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

Fewest rooms to include. Leave empty for no minimum.

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

Most rooms to include. Leave empty for no maximum.

## `plotAreaMin` (type: `integer`):

Smallest plot to include, in square metres. Applies to houses and land. Leave empty for no minimum.

## `plotAreaMax` (type: `integer`):

Largest plot to include, in square metres. Applies to houses and land. Leave empty for no maximum.

## `constructionYearMin` (type: `integer`):

Earliest year of construction, e.g. 1990. Leave empty for no minimum.

## `constructionYearMax` (type: `integer`):

Latest year of construction, e.g. 2020. Leave empty for no maximum.

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

The order in which listings are collected. Newest first is the most useful setting for monitoring a market.

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

Maximum number of listings to return across all URLs and searches combined — this is a limit for the whole run, not for each search. Set to 0 to collect everything the searches find. Either way a single run returns at most 50,000 listings; if you enter a higher number the run collects up to that limit and says so in the log. A page is always finished once it starts, so you may get a few results more than you asked for — never fewer. Tip: start with 20–50 to check the results, then increase.

## `includeDetails` (type: `boolean`):

Opens each property's own page to add nine extra fields: map coordinates, the complete description (search results only show the first ~200 characters), year built, heating type, energy certificate type and consumption figures, the full amenities list, and the commission/brokerage fee. Charged extra for every listing that is successfully enriched — see the pricing tab. The extra details are added to the first 10,000 listings in a run; anything beyond that is still collected and saved with its search-result data, at no extra charge. Leave it off for a fast, cheaper run with the ~49 fields shown in search results (price, €/m², rooms, area, address, energy class, floor, photos, floor plans and agent contacts).

## Actor input object example

```json
{
  "startUrls": [],
  "location": "Berlin",
  "transactionType": "Buy",
  "propertyTypes": [
    "Apartment"
  ],
  "projectTypes": [],
  "sortBy": "Default",
  "maxResults": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

Table of scraped property listings with key fields.

## `detail` (type: `string`):

Full per-listing detail including pricing, size, energy rating, location, photos, and agency contacts.

# 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": [],
    "location": "Berlin",
    "transactionType": "Buy",
    "propertyTypes": [
        "Apartment"
    ],
    "projectTypes": [],
    "keywords": "",
    "sortBy": "Default",
    "maxResults": 50,
    "includeDetails": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/immowelt-de-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": [],
    "location": "Berlin",
    "transactionType": "Buy",
    "propertyTypes": ["Apartment"],
    "projectTypes": [],
    "keywords": "",
    "sortBy": "Default",
    "maxResults": 50,
    "includeDetails": False,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/immowelt-de-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 '{
  "startUrls": [],
  "location": "Berlin",
  "transactionType": "Buy",
  "propertyTypes": [
    "Apartment"
  ],
  "projectTypes": [],
  "keywords": "",
  "sortBy": "Default",
  "maxResults": 50,
  "includeDetails": false
}' |
apify call solidcode/immowelt-de-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/v7EUBVScl7rtSDYwH/builds/o0e7fcc2cL2DbRjRD/openapi.json
