# 🇦🇹 willhaben Scraper - Austrian Marketplace Listings (`benthepythondev/willhaben-scraper`) Actor

willhaben Scraper to extract classified listings from willhaben.at, Austria's largest marketplace. Get title, price, location, postcode, district, description, images, seller type (private or dealer) and URL by keyword. For price research, market analysis, reselling and lead generation in Austria.

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

## Pricing

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

## 🇦🇹 willhaben Scraper — Austrian Marketplace Listings & Prices

Extract **classified listings from willhaben.at**, Austria's largest online
marketplace. Search any keyword — `iphone`, `sofa`, `fahrrad`, `playstation 5` — and
get clean, structured listings with **price, location, seller type, all photos and
geo-coordinates** on every result. It's the live Austrian resale market as data:
real prices, private vs. dealer sellers and full descriptions, without manual browsing.
Export to JSON/CSV/Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🇦🇹 What is the willhaben Scraper?

It turns any willhaben.at keyword search into a structured dataset. Give it a search
term (and a result/page cap) and it returns every matching listing with title, price,
location, photos and seller type. The scraper reads willhaben's embedded
`__NEXT_DATA__` JSON directly — not fragile HTML — so the output stays clean and
reliable, and it rotates residential proxy sessions with automatic retries to keep
runs flowing. Resellers, price researchers and analysts get the full Austrian market
in a spreadsheet instead of scrolling page after page.

#### What data does it extract?

- **Title** and full **description** (listing body text)
- **Price** (numeric) and **price_display** (formatted, e.g. `€ 330`)
- **Location**, **postcode**, **district**, **state** and **country**
- **Latitude & longitude** geo-coordinates
- **is_private** flag — private seller vs. commercial dealer
- **published** date
- **image** (primary) and **images** (all listing photos)
- **id**, listing **url**, **search_query** and **scraped_at** timestamp

### ⬇️ Input

Search willhaben by keyword and cap how much to pull:

| Field | Description |
|-------|-------------|
| `searchQuery` | Keyword to search, e.g. `iphone`, `fahrrad`, `sofa`, `playstation 5` |
| `maxResults` | Maximum listings to return (1–10000) |
| `maxPages` | Maximum result pages to scrape (~30 listings per page) |
| `useApifyProxy` | Route through Apify residential proxy — recommended to avoid blocks |

#### Example input

```json
{
  "searchQuery": "playstation 5",
  "maxResults": 100,
  "maxPages": 5,
  "useApifyProxy": true
}
```

### ⬆️ Output

Every listing is one clean row (view as a **table**, or export **JSON / CSV / Excel**):

```json
{
  "id": "1799245307",
  "title": "PlayStation 5 Digital Edition",
  "price": 330.0,
  "price_display": "€ 330",
  "description": "Verkaufe meine PS5 Digital Edition, neuwertig, mit Controller...",
  "location": "Salzburg",
  "postcode": "5020",
  "district": "Salzburg",
  "state": "Salzburg",
  "country": "Österreich",
  "latitude": 47.8095,
  "longitude": 13.0550,
  "is_private": true,
  "published": "2026-06-25",
  "image": "https://cache.willhaben.at/mmo/7/179/924/5307_1276834630.jpg",
  "images": ["https://cache.willhaben.at/mmo/7/179/924/5307_1276834630.jpg"],
  "url": "https://www.willhaben.at/iad/kaufen-und-verkaufen/d/...",
  "search_query": "playstation 5",
  "scraped_at": "2026-06-26T15:30:00.000Z"
}
```

### 💡 Use cases

- **💰 Reselling & arbitrage:** spot underpriced private-seller listings and flip them for a margin.
- **📊 Price research:** see real market prices for any product across Austria and benchmark your own listings.
- **📈 Market analysis:** track supply, pricing and regional trends over time by running on a schedule.
- **🎯 Lead generation:** find commercial sellers and dealers by keyword and region using the `is_private` flag.

### ❓ FAQ

**How do I scrape willhaben listings?** Enter a keyword in `searchQuery`, set
`maxResults` and `maxPages`, then Run. You get structured listings with title, price,
location, seller type, photos and geo-coordinates.

**What data do I get per listing?** Title, description, numeric price and formatted
price, location/postcode/district/state/country, latitude/longitude, private-vs-dealer
flag, publish date, all images and the listing URL.

**Can I tell private sellers from dealers?** Yes — the `is_private` field is `true` for
private sellers and `false` for commercial dealers, so you can filter for either.

**Do I get all the listing photos?** Yes — `image` is the primary photo and `images`
contains every photo URL for the listing.

**Do I need an API key?** No. The scraper reads public willhaben data — just give it a
search keyword. You only need an Apify account to run it.

**Should I use the Apify proxy?** Yes, keep `useApifyProxy` on (residential). The
scraper rotates proxy sessions and retries automatically for reliable access.

**How many listings can it return?** Up to your `maxResults` cap (max 10000); it
paginates automatically (~30 listings per page) up to `maxPages`.

**Can I search any product category?** Yes — any keyword works across willhaben's
marketplace, from electronics and furniture to bikes, fashion and more.

**Can I run it on a schedule or via API?** Yes — schedule recurring runs in Apify, call
it via the API/SDK, or connect it to Make, Zapier or n8n.

**Is scraping willhaben legal?** It extracts publicly available listing data. Use it
responsibly and in line with willhaben's terms and applicable law (including GDPR), and
use the data only for lawful purposes.

### 🔗 You might also like

- **[Kleinanzeigen Scraper](https://apify.com/benthepythondev/kleinanzeigen-scraper)** — Germany's largest classifieds marketplace
- **[Immowelt Scraper](https://apify.com/benthepythondev/immowelt-scraper)** — German property listings & prices
- **[local.ch Scraper](https://apify.com/benthepythondev/business-contact-scraper)** — Swiss business contacts & B2B leads

***

**Keywords:** willhaben scraper, willhaben.at scraper, Austrian marketplace, classifieds scraper Austria, price research Austria, reselling arbitrage, second-hand listings, marketplace data, willhaben API, private seller listings, product price tracking, Austria classifieds data, market analysis.

### Workflow and data quality

For best results, run this actor as part of a repeatable data pipeline rather than a one-off scrape. Start with a focused input, export the dataset to CSV or JSON, and keep a stable unique field such as URL, ID, domain, package name or title as your deduplication key. Schedule the same task daily or weekly when you need monitoring, then compare each new dataset with the previous run to identify fresh records, removed records and changed fields.

The output is designed to be practical for business workflows: spreadsheets, dashboards, enrichment steps, alerts, CRM imports and lightweight internal APIs. Null values mean the source did not provide that field, not that the actor guessed. For larger projects, combine this actor with related Apify scrapers and use the shared URL/company/domain fields to build a richer dataset without manual copy-paste work.

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword to search on willhaben (e.g. 'iphone', 'fahrrad', 'sofa', 'playstation 5').

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

Maximum number of listings to return.

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

Maximum result pages to scrape (~30 listings per page).

## `useApifyProxy` (type: `boolean`):

Route through Apify residential proxy. Recommended to avoid blocks.

## Actor input object example

```json
{
  "searchQuery": "iphone",
  "maxResults": 3,
  "maxPages": 1,
  "useApifyProxy": false
}
```

# 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 = {
    "searchQuery": "iphone",
    "maxResults": 3,
    "maxPages": 1,
    "useApifyProxy": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/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 = {
    "searchQuery": "iphone",
    "maxResults": 3,
    "maxPages": 1,
    "useApifyProxy": False,
}

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/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 '{
  "searchQuery": "iphone",
  "maxResults": 3,
  "maxPages": 1,
  "useApifyProxy": false
}' |
apify call benthepythondev/willhaben-scraper --silent --output-dataset

```

## MCP server setup

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