# Willhaben Scraper \[$0.85💰] | Austrian Property · Cars (`ahmed_jasarevic/willhaben-scraper`) Actor

Extract Austrian classifieds from Willhaben.at with titles, prices, locations, descriptions, images, and seller details. Covers real estate, vehicles, marketplace, and jobs. Perfect for market research, lead generation, and price analysis.

- **URL**: https://apify.com/ahmed\_jasarevic/willhaben-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Real estate, Automation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## Willhaben Scraper — Austrian Classifieds & Marketplace Data

Extract structured listing data from Willhaben.at — Austria's largest classifieds platform. Get titles, prices, locations, descriptions, images, seller details and listing URLs across real estate, vehicles, marketplace, and jobs verticals.

### Main Use Cases

- **Austrian property market research** — Track Vienna, Graz, Linz, Salzburg real estate prices and trends
- **Used car price analysis** — Monitor Austrian vehicle market with mileage, year, fuel, and transmission data
- **Lead generation** — Collect seller and agency contact details for sales outreach
- **Marketplace arbitrage** — Find underpriced items for resale opportunities
- **Job market intelligence** — Analyze Austrian employment trends and salary data
- **Competitor monitoring** — Track new listings and price changes across all verticals

### How It Works

This Actor uses Willhaben's internal APIs with TLS fingerprint rotation to emulate real browser traffic. It processes multiple search URLs and site filters in a single run, producing per-listing structured records with vertical-specific attributes. No browser rendering needed — pure HTTP for maximum speed and reliability.

### Extract Austrian Real Estate Listings For Market Research

The Actor extracts comprehensive data across all Willhaben verticals:

#### Real Estate (Immobilien)

- **Pricing**: Price, price per m², currency, rental fees
- **Property details**: Area in m², rooms, floor, property type, building type
- **Location**: Address, postcode, district, state, GPS coordinates
- **Agent/Agency**: Names, contact details, company information
- **Features**: Balcony, cellar, garage, terrace, heating, utilities

#### Vehicles (Gebrauchtwagen)

- **Pricing**: Price, price display, currency
- **Vehicle details**: Brand, model, year, mileage, fuel type, transmission
- **Condition**: First registration, inspection status, accident history
- **Seller**: Private vs. dealer, location, contact information

#### Marketplace (Marktplatz)

- **Pricing**: Price, price display, currency
- **Product details**: Category, condition, brand, model
- **Seller**: Private vs. commercial, location, contact details

#### Jobs

- **Salary**: Annual/monthly salary, salary display, currency
- **Position**: Job title, employment type, working hours
- **Company**: Employer name, location, industry
- **Details**: Contract type, start date, description

### Build Business Databases Without Official API Access

Willhaben has no official public data API. This Actor acts as an unofficial API alternative, reading the site's internal APIs and returning clean, structured listings. No API key, no login required — just configure your search parameters and extract data.

### Input Parameters

#### Start URLs (`startUrls`)

One or more Willhaben search URLs:

- **Real Estate**: `https://www.willhaben.at/iad/immobilien/mietwohnungen/...`
- **Vehicles**: `https://www.willhaben.at/iad/gebrauchtwagen/...`
- **Marketplace**: `https://www.willhaben.at/iad/kaufen-und-verkaufen/...`
- **Jobs**: `https://www.willhaben.at/jobs/suche?...`
- Filters from the URL are applied automatically

#### Results per Page (`rowsPerPage`)

Number of results to fetch per API call (max 30, default 30)

#### Maximum Pages (`maxPages`)

Maximum number of pages to scrape (default 10)

#### Maximum Items (`maxItems`)

Maximum total number of listings to scrape (default 300)

#### Proxy Configuration (`proxyConfiguration`)

Enable Apify Proxy (residential recommended) if you get blocked or rate-limited

### Output Fields

Each listing includes:

| Field | Description |
|-------|-------------|
| `id` | Unique listing identifier |
| `title` | Listing headline |
| `url` | Direct listing URL |
| `price` | Price in EUR |
| `priceDisplay` | Formatted price (e.g., € 330) |
| `location` | City or region |
| `postcode` | Postal code |
| `district` | District name |
| `state` | Austrian state |
| `country` | Country (Austria) |
| `lat` | GPS latitude |
| `lng` | GPS longitude |
| `description` | Full listing description |
| `images` | Array of image URLs |
| `imageCount` | Number of images |
| `advertiser` | Seller type (private/commercial) |
| `sellerName` | Seller name |
| `publishedAt` | Publication date |
| `lastUpdated` | Last update date |
| `vertical` | Category (real estate/vehicles/marketplace/jobs) |
| `propertyType` | Real estate type (apartment/house) |
| `rooms` | Number of rooms |
| `areaSqm` | Area in square meters |
| `pricePerSqm` | Price per square meter |

### Example Input

```json
{
  "startUrls": [
    {
      "url": "https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5&PRICE_FROM=150&PRICE_TO=1300"
    }
  ],
  "rowsPerPage": 30,
  "maxPages": 10,
  "maxItems": 300,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Example Output

```json
{
  "id": "12345678",
  "title": "Wohnung in Wien 1010 - Innere Stadt",
  "url": "https://www.willhaben.at/iad/immobilien/mietwohnungen/wien-1010-innere-stadt/wohnung-in-wien-1010-innere-stadt-12345678",
  "price": 850,
  "priceDisplay": "€ 850",
  "location": "Wien",
  "postcode": "1010",
  "district": "Innere Stadt",
  "state": "Wien",
  "country": "Austria",
  "lat": 48.2082,
  "lng": 16.3738,
  "description": "Wunderschöne Wohnung im Herzen Wiens...",
  "images": ["https://example.com/photo1.jpg"],
  "imageCount": 5,
  "advertiser": "private",
  "sellerName": "Max Mustermann",
  "publishedAt": "2026-08-20",
  "lastUpdated": "2026-08-25",
  "vertical": "immobilien",
  "propertyType": "apartment",
  "rooms": 2,
  "areaSqm": 65,
  "pricePerSqm": 13.08
}
```

### Integrations & Automation

#### Schedule Regular Monitoring

- **Daily runs** for price change detection and new listing alerts
- **Weekly runs** for market trend analysis and competitor monitoring
- **Monthly runs** for comprehensive market reports and database updates

#### Export Formats

- **JSON** — For API integration and data processing
- **CSV** — For spreadsheet analysis and reporting
- **Excel** — For business presentations and sharing

#### API Integration

Connect to your existing systems:

- **CRM import** — Feed lead data directly into sales pipelines
- **Database storage** — Build historical property databases
- **Analytics platforms** — Connect to Tableau, Power BI, or custom dashboards
- **Webhooks** — Trigger notifications when new listings appear

### Related Actors

#### Alternative Austrian Scrapers

- [Willhaben All Scraper (Black Falcon Data)](https://apify.com/blackfalcondata/willhaben-all-scraper) — Full-featured with incremental mode and change classification
- [Willhaben Scraper (Logiover)](https://apify.com/logiover/willhaben-at-scraper) — Multi-vertical with email/phone extraction
- [Willhaben Scraper (Studio Amba)](https://apify.com/studio-amba/willhaben-scraper) — Real estate focused with German keyword optimization

#### European Classifieds Suite

- [Kleinanzeigen Scraper](https://apify.com/benthepythondev/kleinanzeigen-scraper) — Germany's largest classifieds marketplace
- [Leboncoin Scraper](https://apify.com/logiover/leboncoin-scraper) — France's largest classifieds
- [Marktplaats Scraper](https://apify.com/logiover/marktplaats-nl-scraper) — Netherlands classifieds
- [Immowelt Scraper](https://apify.com/benthepythondev/immowelt-scraper) — German property listings & prices

### FAQ

#### Why use this actor instead of the official API?

Willhaben has no official public data API for bulk extraction. This Actor reads the site's internal APIs, providing structured data without requiring API keys, login credentials, or browser automation. It's faster and more reliable than manual scraping or unofficial API reverse-engineering.

#### What are alternatives to this data source?

- **Willhaben.at** — Official website (manual browsing only)
- **Statistics Austria** — Official government statistics
- **OeNB (Austrian National Bank)** — Financial and real estate data
- **Indicata** — Used car market analysis

#### How do I get Vienna apartment price data?

Use the search URL: `https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5` and paste it into the `startUrls` field. For specific districts, add district parameters to the URL. The output includes price per m² for easy comparison across neighborhoods.

#### Can I track price changes over time?

Yes. Run the Actor on a schedule (daily or weekly) and compare outputs. The `lastUpdated` field indicates when listings were updated, and the `price` field shows current pricing. For automated tracking, store results in a database and query for price deltas.

#### Is scraping Willhaben.at legal?

This Actor extracts only publicly available listing data that any visitor can see on willhaben.at. Use the data responsibly and in compliance with applicable laws and Willhaben's terms in your jurisdiction. The Actor does not access private user data or bypass authentication.

#### How much data can I get per run?

Thousands of listings depending on your filters. The Actor paginates automatically up to your `maxItems` limit. Set `maxItems` to `0` for unlimited extraction across all available pages.

# Actor input Schema

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

Willhaben search URLs. Supported verticals: Immobilien (/iad/immobilien/...), Auto & Motor (/iad/gebrauchtwagen/...), Marktplatz (/iad/kaufen-und-verkaufen/...) and Jobs (/jobs/suche?...). Filters from the URL are applied automatically.

## `rowsPerPage` (type: `integer`):

Number of results to fetch per API call. Max 30.

## `maxPages` (type: `integer`):

Maximum number of pages to scrape. Each page has up to 'rowsPerPage' results.

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

Maximum total number of listings to scrape. Stops early if reached.

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

Proxy settings. Enable Apify Proxy (residential recommended) if you get blocked or rate-limited.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5&PRICE_FROM=150&PRICE_TO=1300"
    }
  ],
  "rowsPerPage": 30,
  "maxPages": 10,
  "maxItems": 300,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (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.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5&PRICE_FROM=150&PRICE_TO=1300"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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 = { "startUrls": [{ "url": "https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5&PRICE_FROM=150&PRICE_TO=1300" }] }

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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 '{
  "startUrls": [
    {
      "url": "https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?areaId=5&PRICE_FROM=150&PRICE_TO=1300"
    }
  ]
}' |
apify call ahmed_jasarevic/willhaben-scraper --silent --output-dataset

```

## MCP server setup

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