# Willhaben Cars Scraper — Austrian Used Car Listings (`studio-amba/willhaben-cars-scraper`) Actor

Scrape used car listings from willhaben.at — Austria's largest car marketplace with 150,000+ active ads. Get make, model, price, mileage, fuel type, power, transmission, dealer, and location data via API, JSON, or CSV.

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

## Pricing

from $2.00 / 1,000 result scrapeds

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/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

## Willhaben Cars Scraper

Scrape used car listings from willhaben.at — Austria's largest classifieds portal, with over 150,000 active used car ads. No login or cookies required.

### Why use this actor?

Car dealers, price comparison sites, and automotive market researchers need reliable Austrian used-car data. This actor extracts structured listing data from willhaben's car marketplace including price, mileage, fuel type, power, transmission, dealer info, and photos — ready for pricing analysis, inventory monitoring, or lead generation.

Willhaben is a Next.js SSR application. This actor extracts data directly from the embedded `__NEXT_DATA__` JSON, which means fast and reliable scraping without a browser — just pure HTTP requests with CheerioCrawler.

### How to scrape willhaben.at car listings

1. Go to the [Willhaben Cars Scraper](https://apify.com/studio-amba/willhaben-cars-scraper) page on Apify Store.
2. Click "Try for free" to open the actor in Apify Console.
3. Optionally set a make (e.g. `vw`, `bmw`, `audi`) and model (e.g. `golf`) to filter the catalogue, or a free-text search query.
4. Set your maximum results.
5. Click "Start" and wait for the run to complete.
6. Download your data as JSON, CSV, or Excel from the Dataset tab.

You can also call this actor via the [Apify API](https://docs.apify.com/api/v2) to integrate willhaben car data into your own applications and workflows.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Free-text keyword filter (German). Empty by default, which internally falls back to a broad nationwide query. |
| `make` | String | No | Car make, e.g. `vw`, `bmw`, `audi`, `mercedes-benz`. Matched against willhaben's own make listing pages. |
| `model` | String | No | Model within the selected make, e.g. `golf` for VW. Only applied when `make` is also set. |
| `maxResults` | Integer | No | Maximum number of car listings to return (default: 100) |
| `proxyConfiguration` | Object | No | Proxy settings — Residential proxy required, see Limitations below |

#### Make and model filtering

Make/model filtering works by building the same URL path willhaben's own site navigation uses:

- No make: `https://www.willhaben.at/iad/gebrauchtwagen/auto/gebrauchtwagenboerse`
- Make only: `https://www.willhaben.at/iad/gebrauchtwagen/auto/vw-gebrauchtwagen/`
- Make + model: `https://www.willhaben.at/iad/gebrauchtwagen/auto/vw-gebrauchtwagen/golf/`

The make/model slug is derived from the input text (lowercased, diacritics stripped, spaces and slashes turned into hyphens), which matches how willhaben names these pages — e.g. `Citroën` becomes `citroen`, `Mercedes-Benz` stays `mercedes-benz`.

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `listingTitle` | String | `"VW Golf Rabbit TSI"` |
| `make` | String | `"VW"` |
| `model` | String | `"Golf"` |
| `price` | Number | `26350` |
| `currency` | String | `"EUR"` |
| `year` | Number | `2021` (first registration year) |
| `mileageKm` | Number | `95700` |
| `fuelType` | String | `"Diesel"`, `"Benzin"`, `"Hybrid Elektro/Benzin"` |
| `powerKw` | Number | `110` |
| `transmission` | String | `"Manual"` or `"Automatic"` |
| `carType` | String | `"SUV / Geländewagen"`, `"Kombi / Family Van"` |
| `dealerName` | String or null | `"Herbert Seidl Autohaus GmbH"` — null for private sellers |
| `location` | String | `"Wien, 11. Bezirk, Simmering"` |
| `imageUrl` | String | Primary listing photo URL |
| `url` | String | Full listing URL on willhaben.at |
| `scrapedAt` | String | `"2026-07-13T01:08:31.348Z"` |

### Example output

```json
{
    "listingTitle": "VW Passat Variant BUSINESS 2,0 TDI DSG *MATRIX-LED...",
    "make": "VW",
    "model": "Passat",
    "price": 23880,
    "currency": "EUR",
    "year": 2023,
    "mileageKm": 107300,
    "fuelType": "Diesel",
    "powerKw": 110,
    "transmission": "Automatic",
    "carType": "Kombi / Family Van",
    "dealerName": "Herbert Seidl Autohaus GmbH",
    "location": "Gleisdorf",
    "imageUrl": "https://cache.willhaben.at/mmo/2/140/712/4642_1218046630.jpg",
    "url": "https://www.willhaben.at/iad/gebrauchtwagen/d/auto/vw-passat-variant-business-2-0-tdi-dsg-matrix-led-1407124642/",
    "scrapedAt": "2026-07-13T01:08:31.348Z"
}
```

### Cost estimate

This actor uses CheerioCrawler (HTTP-only, no browser) and fetches up to 200 listings per request, so it's very efficient. Expect approximately **0.01-0.02 compute units per 20 results** with Residential proxy. At standard Apify pricing, that's roughly **$0.01-0.02 per 20 listings**.

### Limitations

- **Residential proxy required.** willhaben.at has no CAPTCHA or bot-detection challenge, but it does hard-block Apify's shared datacenter proxy pool with a flat 403 at the network level. The default proxy configuration uses Apify's Residential proxy group, which resolves this reliably.
- Data is scraped from the public website and may change without notice if willhaben updates their page structure.
- Model filtering depends on willhaben's own slug naming for less common models — if a model slug doesn't match, the actor falls back to returning all listings for the make.
- Full listing descriptions may be truncated in search results — the full text is available on individual listing pages.
- Dealer name is null for private-seller listings by design (there's no organisation to report).

### Use cases

- **Price benchmarking** — track average asking prices by make, model, and mileage bracket across the Austrian used car market.
- **Dealer inventory monitoring** — watch a specific dealer's stock and pricing changes over time.
- **Lead generation** — surface newly listed cars matching a buyer's criteria (make, model, price range).
- **Market research** — analyze fuel type mix, transmission trends, and pricing by region.
- **Import/export sourcing** — find undervalued used cars in the Austrian market for cross-border resale.

### Related scrapers

Willhaben also runs a large real-estate vertical and a jobs vertical, both of which use a different underlying data shape than cars:

- [Willhaben Scraper](https://apify.com/studio-amba/willhaben-scraper) — Austrian real estate listings (apartments, houses, rent and sale).
- [Willhaben Jobs Scraper](https://apify.com/studio-amba/willhaben-jobs-scraper) — Austrian job listings with titles, companies, and salaries.

For car listings beyond Austria, see the [AutoScout24 Scraper](https://apify.com/studio-amba/autoscout24-scraper), which covers the pan-European AutoScout24 marketplace.

### Support

Hit a bug or a missing field? Open an issue on the Actor page — we respond fast and ship fixes within 24 hours. Every published scraper in the Studio Amba catalog is monitored daily; broken runs trigger an automatic heal cycle.

# Actor input Schema

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

Free-text keyword filter (German), e.g. 'Diesel', 'Automatik'. Leave empty for a broad, nationwide result set.

## `make` (type: `string`):

Filter by car make, e.g. 'vw', 'bmw', 'audi'. Uses willhaben's make listing page (case-insensitive, matches the make name).

## `model` (type: `string`):

Filter by model within the selected make, e.g. 'golf' for VW. Only used when Make is also set.

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

Maximum number of car listings to return.

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

Proxy settings. willhaben.at has no anti-bot challenge, but blocks Apify's shared datacenter proxy pool at the network level — Residential proxies are required for reliable access (verified live 2026-07-13).

## Actor input object example

```json
{
  "make": "vw",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": "",
    "make": "vw",
    "model": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/willhaben-cars-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": "",
    "make": "vw",
    "model": "",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/willhaben-cars-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 '{
  "searchQuery": "",
  "make": "vw",
  "model": "",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/willhaben-cars-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/addcevFCmdlaOnTz8/builds/bke56KhmShzuFy8M5/openapi.json
