# Wunderflats Scraper - Furnished Apartments & Rents (`normdata/wunderflats-scraper`) Actor

Scrape Wunderflats furnished apartments in Germany, Vienna, Zurich, Paris and 7 more cities: rent, size, rooms, beds, map position, photos. Add deposit, cleaning fee, min stay, amenities, energy class, booking requests and landlord response time. 18 filters, every listing, only new ones on schedule.

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

## Pricing

from $10.00 / 1,000 listings

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

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🏠 Wunderflats Scraper - Furnished Apartments & Rents

Extract furnished and unfurnished rental listings from **Wunderflats**, a leading platform for furnished mid-term apartments in Germany, with about 12,800 places across **Germany** plus **Vienna, Zurich, Geneva, Paris, Brussels, Luxembourg, Milan, Madrid, Barcelona and Lisbon**. For each listing you get the **monthly rent, property type, size, rooms, single and double beds, max people, floor, street, city, map position, availability date, photos, the site's collections (business stays, student housing, family homes, luxury...), students only and multiple units**. Turn on **listing details** to also get **the deposit, final cleaning fee, base rent and utilities, minimum and maximum stay, last day free, booking requests, landlord response time, pets and smoking rules, furnishing, energy class and consumption, year built, cleaning, parking, gym and concierge services, 10 amenities as yes/no, postal code, country, districts, floor plan and the full description**. Search with **18 filters** in one city, several, all of Germany or the whole site, or paste links, and run it on a schedule to get **only new listings**.

### 🎯 Who uses it?

#### 📊 Rental market analysts and proptech teams

Track furnished rents by city, size, rooms and property type across Germany, with base rent and utilities split out for unfurnished homes.

#### 🏢 Landlords, property managers and serviced apartment operators

Benchmark your rent, deposit, cleaning fee and minimum stay against the places next door, and see which listings get the most booking requests.

#### 🧳 Relocation agencies and HR teams

Build shortlists of furnished apartments for new hires and project staff, free by a given date, with city registration possible, desk, Wi-Fi and washing machine.

#### 🤝 B2B sales teams

Find landlords with many listings and fast replies, by city, using the landlord ID and response time.

### ✨ What it does

- **The whole site.** Pick regions (91 cities and areas, or All of Germany), or leave it empty for every listing on Wunderflats. Big searches are split by price automatically, so you are not stuck at the site's 66 pages per search.
- **Furnished and unfurnished.** Furnished mid-term stays, unfurnished open-ended homes, or both.
- **18 filters.** Rent range, rooms, size, people, single and double beds, 10 amenities, pets allowed, smoking allowed, no deposit, free by a date, the site's collections, hide students only, property types and rental type.
- **Listing details add-on:** reads each listing page for the full costs, stay limits, demand and landlord data, rules, energy and services.
- **Or paste links.** Searches copied from the site (with their filters) and listing pages. Filters are not used with links.
- **Monitoring:** run it on a schedule with **Only new listings**, and each run saves only the listings you haven't received yet.

### 🏆 Why this scraper

- **The only Wunderflats scraper on the Apify Store** (October 2026).
- **Demand you can see.** Booking requests per listing, open requests and how fast the landlord replies, with listing details.
- **The real cost.** Rent, deposit and final cleaning fee, and for unfurnished homes the base rent and utilities.
- **Clean, flat, typed data.** Prices, sizes and counts are numbers, dates are ISO, yes/no fields are true or false, site codes are readable words in English. 84 fields, one row per listing.
- **Steady.** 1,000 listings in about 1.5 minutes, the whole site in about 15 minutes. With listing details, about 25 listings a minute.
- **Nothing to set up.** No proxy, no login.

### 📦 What data you get

| Field | Description |
| --- | --- |
| `imageUrl` | Main photo. |
| `title` | Listing title (in English when the landlord gave one). |
| `propertyType`, `rentalType` | Entire apartment, Private room, Shared room, House, Studio, Duplex or Semi-detached house; Furnished, mid-term or Unfurnished, open-ended. |
| `rent`, `currency` | Monthly rent and currency (EUR, or CHF in Switzerland). |
| `coldRent`, `utilities` | *(Listing details)* Unfurnished listings: rent without utilities, and the utilities. |
| `deposit`, `cleaningFee` | *(Listing details)* Security deposit (0 = none) and final cleaning fee. |
| `minStayMonths`, `maxStayMonths` | *(Listing details)* Shortest and longest stay in months (empty longest = no limit). |
| `areaM2`, `rooms`, `beds`, `singleBeds`, `doubleBeds`, `maxTenants`, `floor` | Size in square meters, rooms, beds (single and double), people it fits, floor. |
| `locationInBuilding`, `furnishing`, `condition` | *(Listing details)* Where the place is in the building, furnishing standard and condition. |
| `energyClass`, `energyKwhM2`, `energyCertificate`, `energySource`, `heating`, `yearBuilt` | *(Listing details)* Energy class, kWh per m² a year, certificate type, energy source, heating, year built. |
| `cleaningService`, `parking`, `gym`, `concierge` | *(Listing details)* Cleaning service, parking, gym and concierge: No, Included in the rent, At extra charge (parking: on the property or on the street). |
| `petsAllowed`, `petConditions`, `smokingAllowed`, `smokingConditions` | *(Listing details)* Pets and smoking: Yes, No or With conditions, and the conditions. |
| `description`, `houseRules`, `additionalInfo` | *(Listing details)* Full description, house rules and extra information (in English when there is one). |
| `street` | Street (no house number). |
| `postalCode`, `country` | *(Listing details)* Postal code and country (region pages also hold towns across the border). |
| `city`, `region` | City, and the site region it was found in. |
| `latitude`, `longitude` | Map position. |
| `bookingRequests`, `openRequests`, `landlordResponseHours` | *(Listing details)* Booking requests on the listing and how many are still open (demand signal), landlord average response time in hours. |
| `photoCount` | Number of photos. |
| `unitsInGroup` | *(Listing details)* Similar units the landlord offers under this listing (1 = a single unit). |
| `landlordId` | *(Listing details)* Wunderflats landlord ID. |
| `groupId`, `id` | Wunderflats group and listing IDs (a group = several similar units of one landlord). |
| `studentsOnly`, `multipleUnits`, `elevator` | Rented to students only; one of several similar units; has an elevator (when the card says). |
| `wifi`, `washingMachine`, `dryer`, `dishwasher`, `tv`, `airConditioning`, `balcony`, `terrace`, `desk`, `wheelchairAccessible` | *(Listing details)* Wi-Fi, washing machine, dryer, dishwasher, TV, A/C, balcony, terrace, desk, wheelchair accessible. |
| `registrationPossible`, `landlordIdVerified`, `landlordPhoneVerified`, `landlordEmailVerified` | *(Listing details)* Official address registration possible; landlord ID, phone and email checked by Wunderflats. |
| `url` | Link to the listing. |
| `floorPlanUrl` | *(Listing details)* Floor plan file, when there is one. |
| `categories` | The site's collections the listing is in, like Business stays, Serviced apartments or Student housing. |
| `roomBeds` | Each room and its beds, like "Bedroom: 1 double bed". |
| `amenities` | *(Listing details)* Every amenity the landlord ticked, like "Dishwasher" or "Washing machine (in the building)". |
| `districts` | *(Listing details)* Districts of the address. |
| `photos` | Photo links. |
| `availableFrom` | First day you can move in. |
| `availableUntil` | *(Listing details)* Last day it can be rented (empty = open). |
| `listedAt`, `updatedAt` | *(Listing details)* When the listing first went online and was last updated. |
| `scrapedAt` | When this row was saved. |
| `error` | Only present when a row failed. The fields that loaded are still there. |

Fields marked *Listing details* only appear when that add-on is on.

#### Example row (trimmed)

```json
{
  "imageUrl": "https://listingimages.wunderflats.com/n3r21F4XoKSGI9jCaInED-large.jpg",
  "title": "Furnished 3R apartm. w. loggia, parking, excellent infrastructure (Germering)",
  "propertyType": "Entire apartment",
  "rentalType": "Furnished, mid-term",
  "rent": 2650,
  "currency": "EUR",
  "deposit": 4000,
  "cleaningFee": 300,
  "minStayMonths": 1,
  "areaM2": 74,
  "rooms": 3,
  "beds": 2,
  "singleBeds": 0,
  "doubleBeds": 2,
  "maxTenants": 4,
  "floor": 4,
  "locationInBuilding": "4th floor (out of 11)",
  "furnishing": "Medium",
  "condition": "Renovated",
  "energyKwhM2": 138,
  "energyCertificate": "Demand certificate",
  "energySource": "Gas",
  "heating": "Gas heating",
  "yearBuilt": 1980,
  "cleaningService": "No",
  "parking": "Yes",
  "gym": "No",
  "concierge": "No",
  "petsAllowed": "No",
  "smokingAllowed": "No",
  "description": "This renovated and beautifully furnished apartment is a comfortable and stylish place for young professionals, a young family or retired couple. It offers two bedrooms equipped ...",
  "houseRules": "Please obey to the community rules as hung out in the building for all residents of the apartment complex.",
  "street": "Kurfürstenstraße",
  "postalCode": "82110",
  "country": "Germany",
  "city": "Germering",
  "region": "Munich",
  "latitude": 48.134072,
  "longitude": 11.377108,
  "bookingRequests": 0,
  "openRequests": 0,
  "landlordResponseHours": 7.5,
  "photoCount": 21,
  "unitsInGroup": 1,
  "landlordId": "630cf6eec3fe9f558b7e7455",
  "groupId": "4Mxo5AX1Hn9nqtKj9moIX",
  "id": "630cf86658410d091de2059e",
  "studentsOnly": false,
  "multipleUnits": false,
  "elevator": true,
  "wifi": true,
  "washingMachine": true,
  "dryer": false,
  "dishwasher": true,
  "tv": false,
  "airConditioning": false,
  "balcony": true,
  "terrace": false,
  "desk": true,
  "wheelchairAccessible": false,
  "registrationPossible": true,
  "landlordIdVerified": true,
  "landlordPhoneVerified": true,
  "landlordEmailVerified": true,
  "url": "https://wunderflats.com/en/furnished-apartment/furnished-3r-apartm-w-loggia-parking-excellent-infrastructure-germering/630cf86658410d091de2059e",
  "floorPlanUrl": "https://wunderflats.com/api/file/download/6313a3a0c263d4815f67905a",
  "categories": ["Business stays", "Family homes", "Tech studio"],
  "roomBeds": ["Bedroom: 1 double bed", "Living room: no beds", "Bedroom: 1 double bed"],
  "amenities": ["Elevator", "Balcony", "Vacuum cleaner"],
  "districts": ["Germering"],
  "photos": [
    "https://listingimages.wunderflats.com/k-tt-r35AEnFji-pHQPff-large.jpg",
    "https://listingimages.wunderflats.com/BkdTvO_LUuWV_fhIt44if-large.jpg",
    "https://listingimages.wunderflats.com/_UpWLb4YqZFqLOW_39Ztl-large.jpg"
  ],
  "availableFrom": "2026-07-01",
  "listedAt": "2022-09-16T10:20:38.095Z",
  "updatedAt": "2026-10-15T21:48:13.433Z",
  "scrapedAt": "2026-10-19T14:41:12.427Z"
}
```

### 💡 Use cases

**2 to 3 room furnished apartments in Berlin between 1,500 and 2,500 EUR, free by December:**

```json
{
  "regions": ["berlin"],
  "propertyTypes": ["entireApartment"],
  "minPrice": 1500,
  "maxPrice": 2500,
  "minRooms": 2,
  "maxRooms": 3,
  "availableBy": "2026-12-01"
}
```

**Pet-friendly places with a washing machine and a dishwasher in Munich and Hamburg, with deposit and minimum stay:**

```json
{
  "regions": ["munich", "hamburg"],
  "amenities": ["washingMachine", "dishwasher"],
  "petsAllowed": true,
  "includeDetails": true
}
```

**Every unfurnished, open-ended home in Germany, with base rent and utilities:**

```json
{
  "regions": ["germany"],
  "rentalType": "unlimited",
  "includeDetails": true
}
```

**The whole site (about 12,800 listings):**

```json
{}
```

**New listings in Frankfurt every day (schedule this run):**

```json
{
  "regions": ["frankfurt"],
  "onlyNew": true,
  "monitorName": "frankfurt-daily"
}
```

**Links (filters are not used):**

```json
{
  "startUrls": [
    { "url": "https://wunderflats.com/en/furnished-apartments/berlin?maxPrice=1500" },
    { "url": "https://wunderflats.com/en/furnished-apartment/bright-studio/6acf5aeeca4e2f22a168f225" }
  ]
}
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum results** | Always first, caps the whole run. Empty means no limit. |
| **What to scrape** | Regions, rental type, property types and listing details (deposit, fees, min stay, amenities, energy, demand). |
| **Filters** | Minimum monthly rent, maximum monthly rent, minimum rooms, maximum rooms, minimum size (m²), maximum size (m²), minimum people, minimum single beds, minimum double beds, amenities, only pets allowed, only smoking allowed, only no deposit, free by, site's collections and hide students only. |
| **Monitoring** | Only new listings and monitor name. |
| **Links** | Links instead of the fields above. Filters are ignored with links. |

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per listing saved to your dataset. The price depends on your Apify plan tier:

| Plan | Per listing | Per 1,000 listings |
| --- | --- | --- |
| Free | $0.015 | $15 |
| Bronze | $0.013 | $13 |
| Silver | $0.0115 | $11.50 |
| Gold | $0.010 | $10 |

**Listing details add-on:** when **Listing details** is on, each listing whose page was read adds one more charge:

| Plan | Per listing | Per 1,000 listings |
| --- | --- | --- |
| Free | $0.009 | $9 |
| Bronze | $0.008 | $8 |
| Silver | $0.007 | $7 |
| Gold | $0.006 | $6 |

Listings whose page could not be read pay only the base price, and listings left out by filters are free. New Apify accounts start with $5 in free credit. On the Free plan, a run saves up to 10 listings.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the Wunderflats Scraper.
3. Pick regions (or keep it empty for the whole site), add filters, then click **Start**.
4. Export the results as CSV, Excel, JSON or XML from the Dataset tab.

### 🤖 Use with AI agents (MCP)

Connect the [Apify MCP server](https://mcp.apify.com) to Claude, ChatGPT, Cursor or any MCP client, then ask in plain words, for example: *"Get every furnished 2-room apartment in Munich under 2,000 EUR on Wunderflats, with the deposit and minimum stay"*. The agent runs this Actor and reads the results.

### 🔧 Troubleshooting

- **The log shows more listings than were saved.** The count in the log is the site's. Size, people, free by, collections and hide students only are checked by the Actor after reading, so fewer listings are kept.
- **A region has towns from another country.** Regions include the towns around the city, like on the site. Luxembourg also has Arlon (Belgium) and Saarburg (Germany). With listing details, `country` tells you the real country.
- **Several apartments appear as one listing.** Like on the site, alike units in one building are shown once (`multipleUnits` is true). With listing details, `unitsInGroup` says how many there are.
- **Some fields are empty.** Landlords fill in floors, energy data and stay limits themselves, so some leave them out. `maxStayMonths` and `availableUntil` are empty when there is no limit.
- **Only no deposit skips unfurnished homes.** Unfurnished listings do not say whether they need a deposit.
- **It is not instant.** The site allows about 30 pages a minute, so the Actor reads them one at a time.

### ❓ FAQ

**How many listings are there?** About 12,800 as of October 2026: about 11,100 in Germany, the rest in Vienna, Paris, Brussels, Milan, Madrid, Zurich, Barcelona, Luxembourg, Geneva and Lisbon.

**Which currency are prices in?** In the listing currency (`currency`): EUR, or CHF in Switzerland. The rent filters use the same currency.

**Can I pick several regions or types?** Yes. Any listing matching one of the values you pick is kept, and duplicates are removed.

**Do I need a proxy?** No.

### 🛡️ Limits & responsible use

This Actor collects rental listings that Wunderflats publishes on its website and keeps a moderate pace. It does not collect landlord names or contact details. Use the data in line with Wunderflats' terms and data protection law (GDPR).

### 📧 Contact

Questions, bugs or a field you need: norm.data.scrapers@gmail.com

### 🧪 Local development

```bash
bun install
bun scripts/gen-schemas.mjs
sh test/run.sh first '{"maxItems":10,"regions":["berlin"]}'
```

# Actor input Schema

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

Stop after this many listings in total. Leave empty for no limit. The Apify Free plan is always capped at 10.

## `regions` (type: `array`):

The site's cities and regions (each one also has the towns around it). Empty = every listing on the site.

## `rentalType` (type: `string`):

Empty = furnished, mid-term (what the site shows first).

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

Empty = every type. Studio, Duplex and Semi-detached house are only offered unfurnished.

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

Also read each listing page for the deposit, final cleaning fee, base rent and utilities (unfurnished), minimum and maximum stay, last day free, every amenity, Wi-Fi, washing machine, dishwasher and more as yes/no, pets and smoking rules, furnishing and condition, energy class, kWh per m², heating and year built, cleaning, parking, gym and concierge, the full description, house rules, postal code, districts, booking requests, landlord response time, landlord checks, floor plan, listed and updated dates. Slower: about 25 listings a minute. Charged per listing as an add-on.

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

In the listing currency (EUR, or CHF in Switzerland).

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

In the listing currency (EUR, or CHF in Switzerland).

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

Rooms in the place.

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

Rooms in the place.

## `minSizeM2` (type: `integer`):

Size of the place in square meters.

## `maxSizeM2` (type: `integer`):

Size of the place in square meters.

## `minTenants` (type: `integer`):

Keep places for at least this many people.

## `minSingleBeds` (type: `integer`):

Single beds in the place.

## `minDoubleBeds` (type: `integer`):

Double beds in the place.

## `amenities` (type: `array`):

Keep listings with all of these.

## `petsAllowed` (type: `boolean`):

Keep listings that allow pets.

## `smokingAllowed` (type: `boolean`):

Keep listings that allow smoking.

## `noDepositOnly` (type: `boolean`):

Keep furnished listings with no security deposit.

## `availableBy` (type: `string`):

Keep listings you can move into on or before this date, like 2027-02-01 or "2 months" from today.

## `categories` (type: `array`):

Keep listings in one of these collections.

## `hideStudentsOnly` (type: `boolean`):

Leave out listings rented to students only.

## `onlyNew` (type: `boolean`):

Skip listings saved by earlier runs with the same monitor name.

## `monitorName` (type: `string`):

Runs with the same name share their history. Use a different name for each schedule.

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

Searches copied from the site, with their filters (https://wunderflats.com/en/furnished-apartments/berlin?maxPrice=1500) or listing pages (https://wunderflats.com/en/furnished-apartment/bright-studio/6acf5aeeca4e2f22a168f225).

## Actor input object example

```json
{
  "maxItems": 10,
  "regions": [
    "berlin"
  ]
}
```

# 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 = {
    "maxItems": 10,
    "regions": [
        "berlin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/wunderflats-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 = {
    "maxItems": 10,
    "regions": ["berlin"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/wunderflats-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 '{
  "maxItems": 10,
  "regions": [
    "berlin"
  ]
}' |
apify call normdata/wunderflats-scraper --silent --output-dataset

```

## MCP server setup

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