# willhaben Scraper: Marketplace, Cars & Real Estate (Austria) (`euroscrape/willhaben-scraper`) Actor

willhaben.at scraper for Austria: marketplace listings, used cars and motorbikes, flats and houses for rent or sale, by keyword, any willhaben search URL or section. Car specs, m², rooms and price per m², deal score and price drop alerts.

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

## Pricing

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

## willhaben Scraper: Marketplace, Cars & Real Estate (Austria)

**Get willhaben.at listings as clean data: the marketplace, used cars and motorbikes, flats and houses for rent or sale, with price per m², deal scores and alerts on new listings and price drops.** Type a search, paste any willhaben search URL with its filters, or browse a whole section: the Actor reads willhaben's public result pages, up to 90 listings per page, without a browser.

- 🔎 **Search your way**: plain text (`"iphone 13"`, `"golf"`), any willhaben search URL (every filter you set on the site is kept), or listing URLs to follow.
- 🗂️ **Three big sections**: Marktplatz, used cars and motorbikes, and real estate (flats and houses, rent or buy).
- 🚗 **Cars**: make, model, version, year, km, fuel, gearbox, kW and hp, body type, seats, warranty.
- 🏠 **Real estate**: property type, m², rooms, floor, monthly rent, **price per m²**, outdoor area, virtual tour.
- 🔔 **Price drop alerts**: schedule it with a monitor name, get only new listings and price drops on Telegram, Discord, Slack or a webhook.

### ✨ Why this Actor

| | |
|---|---|
| 🧩 **All of willhaben in one Actor** | Marketplace, vehicles and real estate with the same clean fields, plus structured car and home details where they apply. |
| 🔗 **Any search URL works** | Set your filters on willhaben (make, model, equipment, area, rooms, district…), copy the URL, paste it: every filter is kept, the Actor only pages through. |
| 🏠 **Price per m², compared** | Every home has its price per m²; the deal score compares it with the most similar listings of the same search. Real run, 26 Oct 2026: 3-room flats for rent in Vienna, median 1,723 € a month and 19.68 €/m². |
| 💸 **Deal score on every listing** | Each price compared with its closest look-alikes; the free summary gives the total on willhaben, median and quartile prices, share of business sellers and the 5 best deals. |
| 🔒 **Privacy-friendly** | Never the street of a private seller; coordinates rounded to ~1 km; emails and phone numbers hidden in descriptions. |
| ⚡ **Fast and cheap** | 90 listings per page, no browser. From **$0.20 per 1,000 listings**. |

### 🎯 Use cases

- **Flat hunters and agents**: new flats in Vienna or Graz under your rent and price per m², the minute they are listed.
- **Car buyers and dealers**: every Golf, Octavia or Model 3 under your price and km in your state, with price drops.
- **Resellers**: underpriced phones, consoles, LEGO or bikes with PayLivery shipping.
- **Market studies**: rents and prices per m² by district, car prices by model and year.

### 🚀 Examples

**3-room flats for rent in Vienna** (real run, 26 Oct 2026: 5,027 flats for rent in Vienna on willhaben; on the first 8 with 3+ rooms, median 1,723 € a month and 19.68 €/m²):

```json
{ "section": "flatsForRent", "state": "wien", "minRooms": 3, "maxItemsPerSearch": 100 }
```

**Volkswagen Golf from 2016** (real run: 3,701 results on willhaben):

```json
{ "searches": ["golf"], "section": "cars", "carMinYear": 2016, "maxItemsPerSearch": 100 }
```

**iPhone 13 in Vienna** (real run: 1,538 results on willhaben, 29 off-topic results dropped to keep 8 real iPhone 13s, median 210 €):

```json
{ "searches": ["iphone 13"], "state": "wien", "maxItemsPerSearch": 50 }
```

**A search URL copied from willhaben** (LEGO under 100 € in Styria):

```json
{ "searches": ["https://www.willhaben.at/iad/kaufen-und-verkaufen/marktplatz?keyword=lego&areaId=6&PRICE_TO=100"] }
```

**New flats and price drops on Telegram, every hour** (schedule the Actor; the first run is the baseline):

```json
{
  "section": "flatsForRent",
  "state": "wien",
  "priceMax": 1200,
  "minAreaSqm": 50,
  "monitorName": "wien-wohnung",
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

### 📦 Output

A flat for rent (real data of 26 Oct 2026):

```json
{
  "type": "listing",
  "title": "ALTBAUWOHNUNG NAHE INNENSTADT. - 93,76 m² Wiener Wohnkultur mit vier Zimmern…",
  "price": 1850,
  "vertical": "real_estate",
  "location": "Wien, 02. Bezirk, Leopoldstadt",
  "sellerType": "business",
  "property": { "propertyType": "Wohnung", "sizeSqm": 94, "rooms": 3, "floor": "3", "pricePerSqm": 19.68, "monthlyRent": 1850 },
  "url": "https://www.willhaben.at/iad/immobilien/d/mietwohnungen/wien/wien-1020-leopoldstadt/altbauwohnung-nahe-innenstadt-93-76-m-wiener-wohnkultur-mit-vier-zimmern-fischgraetparkett-und-zwei-badezimmern-zwischen-city-und-prater-1581637827/"
}
```

A car:

```json
{
  "title": "VW Golf Rabbit TSI",
  "price": 25980,
  "vertical": "vehicles",
  "condition": "used",
  "location": "Braunau am Inn",
  "sellerType": "business",
  "vehicle": { "make": "VW", "model": "Golf", "version": "Golf Rabbit TSI", "year": 2026, "mileageKm": 208, "fuel": "gasoline", "gearbox": "manual", "powerKw": 85, "powerHp": 116, "seats": 5, "warranty": true }
}
```

Every listing also has its postcode, district, state, publication, change and end dates, photos, PayLivery shipping flag and deal score. One free `summary` row per search adds the total on willhaben, median and quartile prices, median price per m² for homes, share of business sellers, top districts and the 5 best deals.

Dataset views: **Listings**, **Vehicles**, **Real estate** and **Deals**. Export as JSON, CSV, Excel or XML.

### 💰 Pricing

| Event | Price |
|---|---|
| Run start | $0.003 |
| Listing | $0.0002 (**$0.20 per 1,000 listings**) |
| Summary rows, deleted listings | free |

A monitoring run that finds nothing new costs only the run start. Apify subscribers get 10 to 30% off.

### ❓ FAQ

**Why does a car cost 297 €?** Dealers sometimes post the monthly payment of a lease or a rent-to-own offer as the price. Those listings get `looksLikeMonthlyPayment: true` and are kept out of the market price, the deal scores and the summary (real run, 27 Oct 2026: two Golf offers at 297 € and 413 € a month on Wallapop near Madrid, same filter). Spare parts, empty boxes and repair services ("Cambio pantalla iPhone 13") are flagged as `looksLikeAccessory` the same way. Token prices (1 €, or under a tenth of the search median: "price to discuss") get `looksLikePlaceholderPrice: true` and are left out of the same figures.

**Which filters can I use?** The common ones are inputs (section, state, price, year and km for cars, area, rooms and price per m² for homes, seller type). For anything else (car make and equipment, district, energy class…), set it on willhaben and paste the URL: all its filters are kept.

**Can I browse a whole section without text?** Yes: leave Searches empty and pick a section and a state, e.g. all flats for rent in Vienna.

**Why fewer results than on the website?** Titles are checked against your text search, so cases and other models are dropped and counted in the summary. Turn off "Only listings whose title matches the search" to get everything.

**How is the deal score computed?** For each listing, the Actor finds the most similar titles in the same search and takes their weighted median, on the price per m² for homes and on the price otherwise. If the look-alikes are too few or too spread out, no score is given rather than a wrong one.

**Is it legal?** The Actor reads public result pages at a moderate pace and collects no personal data about private sellers (no name, no street). You are responsible for how you use the data under the GDPR and willhaben's terms.

### 🔌 API, AI agents and integrations

- **API**: one call runs the Actor and returns the results, `POST https://api.apify.com/v2/acts/euroscrape~willhaben-scraper/run-sync-get-dataset-items` (see the API tab for Python, JavaScript and cURL).
- **AI agents (MCP)**: add `https://mcp.apify.com?tools=euroscrape/willhaben-scraper` to Claude, Cursor, VS Code or any MCP client, and the Actor becomes a tool your agent can call.
- **No-code automation**: start runs and pass the results on with Apify's integrations for n8n, Make and Zapier, or with a webhook when a run ends.
- **Exports**: every result set downloads as JSON, CSV, Excel or XML, and can be sent to Google Sheets.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a filter or a field? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [Wallapop Scraper: Listings, Price Alerts & Deals (Spain, Italy)](https://apify.com/euroscrape/wallapop-scraper): Wallapop in Spain, Italy and Portugal, cars included, around a town with distance, deal scores and alerts.
- [Marktplaats Scraper: Listings, Bids & Price Alerts (+ 2dehands)](https://apify.com/euroscrape/marktplaats-scraper): the Netherlands and Belgium (2dehands / 2ememain), with bids, views, deal scores and alerts.
- [Subito.it Scraper: Listings, Cars, Real Estate & Price Alerts](https://apify.com/euroscrape/subito-scraper): all of Italy, cars and homes with price per m², deal scores and alerts.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search across the top second-hand marketplace of 18 European countries (willhaben, Kleinanzeigen, Marktplaats, Subito, Wallapop…), resale margins and cheapest country.
- [AutoScout24 Scraper: Used Cars in 8 Countries, Deals & Alerts](https://apify.com/euroscrape/autoscout24-scraper): used-car listings from 8 European countries including Austria, cross-country price comparison and alerts.
- [Vinted Scraper: Prices, Brands, Sizes & Price Drop Alerts](https://apify.com/euroscrape/vinted-scraper): Vinted listings from 20+ countries with deal scores, sold tracking and alerts.

# Actor input Schema

## `searches` (type: `array`):

What to look for: plain text ("iphone 13", "golf", "fahrrad"), any willhaben search URL copied from the site with your filters (all of them are kept), or a listing URL to follow it. Leave empty to browse a whole section (e.g. all flats for rent in Vienna).

## `section` (type: `string`):

Where text searches look. Pasted URLs keep their own section.

## `state` (type: `string`):

Optional. Leave empty for all of Austria.

## `maxItemsPerSearch` (type: `integer`):

You pay per listing delivered. Up to 1,000 per search.

## `order` (type: `string`):

Order of the site's results: it decides which listings are read first.

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

Optional.

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

Optional (monthly rent for rentals).

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

Private sellers, businesses (dealers, agencies, shops) or both.

## `carMinYear` (type: `integer`):

Optional, cars and motorbikes.

## `carMaxKm` (type: `integer`):

Optional, cars and motorbikes.

## `minAreaSqm` (type: `integer`):

Optional, real estate.

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

Optional, real estate.

## `maxPricePerSqm` (type: `integer`):

Optional, real estate (monthly rent per m² for rentals).

## `strictMatching` (type: `boolean`):

On: the title must contain the model numbers and the words of your search (willhaben also returns cases, chargers, other models).

## `excludeAccessoriesAndBroken` (type: `boolean`):

Off: they are kept and flagged (looksLikeAccessory, looksBroken, isWantedAd). On: they are left out.

## `dealAnalysis` (type: `boolean`):

Compares each listing with the most similar ones of the same search (price per m² for homes): marketMedianPrice, priceVsMarketPct and a dealScore from 0 to 100.

## `minDealScore` (type: `integer`):

Optional, e.g. 65 keeps listings priced ~15% or more below their market.

## `includeSummary` (type: `boolean`):

One extra free row per search: total on willhaben, median and quartile prices, median price per m² for homes, share of business sellers, top districts, best 5 deals.

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

Name this search and schedule the Actor (e.g. every hour): each run then returns only NEW listings and PRICE DROPS since the previous run, and alerts you. The first run is the baseline.

## `alertOnPriceDropPct` (type: `integer`):

Monitoring: a listing comes back when its price falls by at least this percentage.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Incoming webhook URL.

## `webhookUrl` (type: `string`):

Receives one POST per run with the new listings and price drops (Make, Zapier, n8n…).

## `maxNotifications` (type: `integer`):

Extra items are summarized in one message.

## Actor input object example

```json
{
  "searches": [
    "iphone 13"
  ],
  "section": "marketplace",
  "maxItemsPerSearch": 100,
  "order": "newest",
  "sellerType": "any",
  "strictMatching": true,
  "excludeAccessoriesAndBroken": false,
  "dealAnalysis": true,
  "includeSummary": true,
  "alertOnPriceDropPct": 5,
  "maxNotifications": 30
}
```

# Actor output Schema

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

willhaben listings with price, place, seller type and deal score.

## `cars` (type: `string`):

Cars and motorbikes with make, model, year, km, fuel, gearbox and power.

## `homes` (type: `string`):

Flats and houses with m², rooms and price per m².

## `deals` (type: `string`):

Listings compared with their market price.

## `runSummary` (type: `string`):

Counters for this run (items found, output, errors).

# 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 = {
    "searches": [
        "iphone 13"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/willhaben-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 = { "searches": ["iphone 13"] }

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/willhaben-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 '{
  "searches": [
    "iphone 13"
  ]
}' |
apify call euroscrape/willhaben-scraper --silent --output-dataset

```

## MCP server setup

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