# willhaben Auto Scraper - Cars & Motorbikes (`aidnurs/willhaben-auto-scraper`) Actor

Scrape willhaben.at used cars, motorbikes, vans and campers (Austria). Make, model, price, year, mileage, kW/hp, fuel, gearbox, equipment, dealer, location; optional description and warranty. Only-new mode, duplicates free, private sellers protected.

- **URL**: https://apify.com/aidnurs/willhaben-auto-scraper.md
- **Developed by:** [Nursultan Imanov](https://apify.com/aidnurs) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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 Auto scraper and willhaben cars API

**willhaben Auto Scraper** extracts used car, motorbike, van and caravan listings from [willhaben.at](https://www.willhaben.at/iad/gebrauchtwagen), Austria's largest vehicle marketplace with more than 160,000 cars. Type a make and model (`VW Golf`, `BMW 3er`, `KTM`), pick a federal state or district, or paste a search URL from your browser, and get clean, structured data: **make, model, version, price, first registration, mileage, kW and hp, fuel, gearbox, body type, colour, equipment, warranty, dealer, postcode, district, coordinates, publish date and photos**. Turn on details for the **full description, complete equipment list, registration month, drive, doors, warranty duration, service book, Pickerl date, WLTP range and CO₂**.

Use it as a **willhaben cars API** for used car price research, dealer stock monitoring, lead lists of car dealers, valuation models, or your own alerts for new cars that match your search anywhere in Austria.

### Why use this willhaben Auto scraper?

- 🚗 **Simple form, no URL needed.** Vehicle type, make and model as you would type them (`Volkswagen`, `Mercedes C-Klasse`, `3er`), Bundesland and districts (`Graz-Umgebung`, `1070`, `Mödling`). Or paste any willhaben search URL, it is accepted as is.
- 🎯 **All the filters you need:** price, first registration year, mileage, power, fuel, gearbox, private or dealer, keywords. A max price, max mileage or min year sorts the search by that field and stops early, so narrow searches stay fast and cheap.
- 🔢 **Numbers ready for analysis:** price, mileage, year, kW and hp, battery capacity, seats as numbers, not text.
- 🔔 **Only new listings since the last run.** Schedule the Actor and get just the cars you have not seen. Already-seen listings are free.
- 🔁 **No duplicates charged.** Every listing appears once per run.
- 🏍️ **Cars, motorbikes, vans and caravans** in one Actor, with the same output fields.
- 📋 **Optional details:** full description, every equipment item, first registration month, drive, doors, warranty duration, service book, Pickerl valid until, WLTP range, CO₂, financing and trade-in, dealer website and address.
- 🛡️ **GDPR-friendly by default.** Private sellers' names, phones, streets and profile IDs are not saved, their coordinates are rounded to about 1 km, and phone numbers and personal e-mails in descriptions are masked. Turn on *Include personal data* only if you have a legal basis.
- ⚡ **Fast.** Pure HTTP, 200 listings per request.

### How much does it cost to scrape willhaben cars?

You pay only for listings saved to the dataset (pay per result): **$1.50 per 1,000 listings**, plus **$1.00 per 1,000 listings** for *Include details*. Duplicates, already-seen listings in monitoring mode and empty searches cost nothing, and listings whose detail page could not be loaded are not charged for details. Cap spending with *Max listings* and the run's maximum cost.

### How to scrape willhaben Auto & Motor

1. Choose a **Vehicle type**, for example *Cars (Gebrauchtwagen)*.
2. Type a **Make** and, optionally, a **Model** (`VW` + `Golf`, `BMW` + `X5`, `Mercedes` + `C-Klasse`).
3. Choose a **Federal state** and, optionally, **Districts** (`Graz`, `1100`, `Baden`).
4. Optionally set **Min/Max price**, **First registration from/until**, **Max mileage**, **Min power**, **Fuel**, **Gearbox**, **Seller** and **Keywords**.
5. Set **Max listings** and click **Start**.
6. Download the results as JSON, CSV, Excel or HTML, or get them via the Apify API.

Prefer the website's filters? Set up the search on willhaben.at, copy the URL from the address bar and paste it into **Search URLs**.

### Input example

```json
{
  "vehicleType": "car",
  "make": "VW",
  "model": "Golf",
  "state": "wien",
  "priceMax": 15000,
  "yearMin": 2015,
  "mileageMax": 150000,
  "fuel": "diesel",
  "gearbox": "manual",
  "sellerType": "all",
  "maxItems": 200,
  "includeDetails": true,
  "onlyNew": false
}
```

### Output example

```json
{
  "id": "2072515058",
  "url": "https://www.willhaben.at/iad/gebrauchtwagen/d/auto/subaru-brz-2-4-final-edition-nr-04-von-30-2072515058/",
  "vehicleType": "car",
  "title": "Subaru BRZ 2.4 Final Edition Nr. 04 von 30",
  "make": "Subaru",
  "model": "BRZ",
  "version": "BRZ 2.4 Final Edition Nr. 04 von 30",
  "price": 39990,
  "priceText": "€ 39.990",
  "firstRegistrationYear": 2023,
  "mileage": 16000,
  "fuel": "Benzin",
  "powerKw": 172,
  "powerHp": 234,
  "gearbox": "Schaltgetriebe",
  "body": "Sportwagen / Coupé",
  "color": "Blau",
  "condition": "Gebrauchtwagen",
  "engineVolumeCcm": 2387,
  "seats": 4,
  "previousOwners": 1,
  "warranty": true,
  "inspectionValid": true,
  "equipment": ["2-Zonen-Klimaautomatik", "3-Zonen-Klimaautomatik", "ABS", "Alufelgen", "Android Auto", "Apple CarPlay", "..."],
  "street": "Ginzkeystraße 28",
  "postcode": "4600",
  "city": "Wels",
  "district": "Wels",
  "state": "Oberösterreich",
  "country": "Österreich",
  "latitude": 48.17658,
  "longitude": 14.0572,
  "coordinatesApproximate": false,
  "sellerType": "dealer",
  "dealerName": "KFZ-Grossholzer e.U.",
  "dealerId": "1000346",
  "publishedAt": "2026-10-12T21:25:44Z",
  "updatedAt": "2026-10-12T21:25:52Z",
  "isBumped": false,
  "isSponsored": false,
  "teaser": "## Wir bieten hier einen Subaru BRZ 2.4 D-4S Final Edition Nr. 04 von 30 an ## TOP FAHRZEUG ZUSTAND WERKS-GARANTIE BIS 12.2028 STI STYLING KID FINANZIERUNGS-AKT ...",
  "images": ["https://cache.willhaben.at/mmo/8/207/251/5058_1399411659.jpg", "https://cache.willhaben.at/mmo/8/207/251/5058_-1952056983.jpg", "https://cache.willhaben.at/mmo/8/207/251/5058_-1639466732.jpg", "https://cache.willhaben.at/mmo/8/207/251/5058_-1974568270.jpg", "https://cache.willhaben.at/mmo/8/207/251/5058_891211262.jpg", "https://cache.willhaben.at/mmo/8/207/251/5058_488726347.jpg", "..."],
  "description": "## Wir bieten hier einen Subaru BRZ 2.4 D-4S Final Edition Nr. 04 von 30 an ##\nTOP FAHRZEUG ZUSTAND\n\nWERKS-GARANTIE BIS 12.2028\n\nSTI STYLING KID\n\nFINANZIERUNGS- ...",
  "firstRegistrationMonth": 12,
  "firstRegistration": "2023-12",
  "doors": 2,
  "wheelDrive": "Hinterrad",
  "colorName": "Blau",
  "cylinders": 4,
  "co2Emissions": 200,
  "warrantyDuration": "2 Jahre / 100.000 km",
  "defectsLiability": true,
  "serviceBook": true,
  "inspectionValidUntil": "12.2026",
  "priceTotal": 39990,
  "financingAvailable": false,
  "tradeInAccepted": false,
  "leasingInfo": "Für detailliertere Auskünfte kontaktiere bitte direkt den Händler.",
  "firstPublishedAt": "2026-10-12T23:25:44+0200",
  "changedAt": "2026-10-12T23:30:50+0200",
  "imageCount": 42,
  "dealerStreet": "Ginzkeystraße 28",
  "dealerPostcode": "4600",
  "dealerCity": "Wels",
  "detailsScraped": true,
  "source": "willhaben.at",
  "searchUrl": "https://www.willhaben.at/iad/gebrauchtwagen/auto/gebrauchtwagenboerse?sort=1&rows=200&page=1",
  "scrapedAt": "2026-10-12T21:32:06Z"
}
```

### Fields you get

| Field | Description |
|---|---|
| `id`, `url`, `title`, `images` | willhaben listing ID, link, title, photo URLs |
| `vehicleType`, `make`, `model`, `version` | car, motorbike, van or camper; make, model and version as published |
| `price`, `priceText`, `oldPrice`, `priceReducedAt` | Price in EUR, as shown, and price drops |
| `firstRegistrationYear`, `mileage`, `condition` | Erstzulassung year, kilometres, used / new / demo / classic ... |
| `powerKw`, `powerHp`, `fuel`, `gearbox`, `engineVolumeCcm`, `batteryCapacityKwh` | Engine and drivetrain |
| `body`, `color`, `seats`, `berths` | Body type (Limousine, SUV, Naked Bike, Kastenwagen ...), colour, seats, berths in caravans |
| `previousOwners`, `warranty`, `inspectionValid`, `equipment` | Owners, warranty, Pickerl §57a, equipment items |
| `street`, `postcode`, `city`, `district`, `state`, `country` | Location (street only for dealers, or with personal data on) |
| `latitude`, `longitude`, `coordinatesApproximate` | Exact for dealers, rounded to ~1 km for private sellers |
| `sellerType`, `dealerName`, `dealerId` | Private seller or dealer; dealer name and willhaben ID |
| `publishedAt`, `updatedAt`, `isBumped`, `isSponsored`, `teaser` | Last (re)publish and update time, pushed-up flag, paid top-ad flag (still matches your search), first lines of the description |
| **With details:** `description`, `equipment` | Full description and complete equipment list (incl. Serviceheft, MwSt. ausweisbar) |
| `firstRegistration`, `firstRegistrationMonth`, `doors`, `wheelDrive`, `colorName`, `cylinders` | Vehicle data |
| `warrantyDuration`, `defectsLiability`, `serviceBook`, `inspectionValidUntil` | Warranty, Gewährleistung, service book, Pickerl valid until |
| `wltpRangeKm`, `co2Emissions`, `maxTotalWeightKg` | EV range, CO₂, total weight for vans |
| `priceTotal`, `priceWithBonus`, `financingAvailable`, `tradeInAccepted`, `leasingInfo` | Price details and financing |
| `dealerWebsite`, `dealerStreet`, `dealerPostcode`, `dealerCity`, `dealerReference` | Dealer company data and stock number |
| **With personal data:** `contactName`, `contactPhone`, `contactPhones`, `dealerPhone` | Contact person and phones where published |

### FAQ

**Is it legal to scrape willhaben.at?**
This Actor collects only publicly available vehicle listings, the same pages any visitor sees. It never logs in, never uses accounts or cookies of real users, and never solves or bypasses CAPTCHAs. It requests only pages that willhaben's robots.txt leaves open to crawlers; filters it may not send are applied by the Actor itself.

**Personal data is off by default.** For private sellers the output has no name, no phone, no street and no profile ID, house numbers in their texts are masked, and coordinates are rounded to about 1 km. Phone numbers and personal e-mails inside descriptions are masked (role mailboxes like `office@` stay), and dealers' contact persons and phone numbers are not saved. Names that an advertiser writes into the free text of a description can still appear as published.

If you turn on **Include personal data**, you get everything the site shows publicly, including the contact person's name and phone where available, the street and exact coordinates. Personal data is protected by the GDPR in the EU and by similar laws elsewhere. Only enable it if you have a legal basis (for example, a documented legitimate interest), keep only what you need, and do not use it for unsolicited marketing. If you are unsure, consult a lawyer.

You are responsible for how you use the data and for complying with applicable laws and willhaben.at's terms. This Actor is not affiliated with or endorsed by willhaben.at. Read more: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Found something that should not be here? Open an issue on the Actor's Issues tab and we will look at it promptly.

**Can I filter by model, price, year or mileage like on the website?**
Yes. Known car models (about 1,000, from `Golf` to `C-Klasse`) use willhaben's own model pages; other models and motorbike models are matched in model, version and title. Price, year, mileage, power, gearbox and private/dealer filters are applied by the Actor. With a max price, max mileage or min year the search is sorted by that field and stops as soon as listings leave the range.

**Can I paste a URL from willhaben.at?**
Yes. Paste any Auto & Motor search URL. Parameters that crawlers may not send (make and model ids, price, mileage, year, power, gearbox, body type, condition, private/dealer, keyword, last 48 hours) are removed from the request and applied as filters by the Actor, and a single make or model moves the search to willhaben's open make or model page, so you get the listings you saw.

**How do I get only new listings every day?**
Turn on *Only new listings since last run*, save the task and add a schedule. Use a different *Monitoring key* for each saved search. The run stops as soon as it reaches listings older than the previous run.

**Do I need a proxy?**
No. The Actor starts without a proxy and switches to an Austrian residential proxy by itself if willhaben rate-limits it, at no extra cost to you.

**Something broke or a field is missing?**
Open an issue on the Issues tab. We usually respond within 24 hours.

# Actor input Schema

## `vehicleType` (type: `string`):

What to search for. Ignored when Search URLs are given.

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

Optional. Brand name as you would type it: "VW" or "Volkswagen", "Mercedes", "BMW", "Škoda", "KTM", "Hymer". Leave empty for all makes.

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

Optional, needs a make. "Golf", "3er", "C-Klasse", "ID.3". Known car models use willhaben's model page; anything else ("Golf GTI", motorbike models) is matched in model, version and title.

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

Bundesland. Leave empty for all of Austria.

## `districts` (type: `array`):

Optional. One or more districts: a name ("Graz-Umgebung", "Mödling", "Neubau"), a Vienna postcode ("1070"), any other 4-digit postcode ("8010", filtered by postcode), or a willhaben areaId. Leave empty for the whole federal state.

## `keywords` (type: `string`):

Optional. Words that must appear in make, model, version, title, equipment or the first lines of the description. Commas mean OR, spaces mean AND, a minus excludes: "standheizung, sitzheizung", "gti dsg", "-unfallwagen" (a minus word also drops longer words that start with it: -unfall would drop "unfallfrei"). Umlauts work either way.

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

Minimum price.

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

Maximum price. With a max price the Actor sorts by price (cheapest first) and stops early, so it stays fast and cheap.

## `yearMin` (type: `integer`):

Erstzulassung from this year. New cars without a registration count as this year.

## `yearMax` (type: `integer`):

Erstzulassung up to this year.

## `mileageMax` (type: `integer`):

Maximum kilometres.

## `powerMin` (type: `integer`):

Minimum engine power in kW (1 kW = 1.36 hp). 100 kW = 136 hp.

## `fuel` (type: `string`):

Fuel type.

## `gearbox` (type: `string`):

Manual or automatic (automatic includes semi-automatic and direct drive).

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

Private sellers, dealers or both.

## `sortBy` (type: `string`):

Order of results. Newest first is used automatically for 'Only new listings'. With a max price, max mileage or min year and 'Newest first', the Actor sorts by that field itself to stop early.

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

Maximum number of listings to save. You only pay for listings saved to the dataset.

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

Open every listing to add the full description, complete equipment list, first registration month, doors, drive, warranty duration, service book, Pickerl valid until, CO₂, WLTP range, financing and the dealer's website and address. Charged as an extra event per listing; about 10× slower.

## `includePersonalData` (type: `boolean`):

Off by default: for private sellers the output has no name, no phone, no street and no profile ID, house numbers in their texts are masked, and their coordinates are rounded to about 1 km. Phone numbers and personal e-mails inside descriptions are masked (\[phone removed], \[email removed]; role mailboxes like office@ stay). Contact persons and phone numbers of dealers are not saved.<br><br>Turn it on to get everything the site shows publicly: the contact name and phone of private sellers and the dealer's phone (contact fields need 'Include details'), the street, exact coordinates and unmasked descriptions.<br><br>⚠️ This returns personal data. You're responsible for having a legal basis to collect and use it under privacy laws (e.g. GDPR).

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

Paste willhaben Auto & Motor search URLs straight from your browser (https://www.willhaben.at/iad/gebrauchtwagen/...). When given, the search fields above are ignored, but Keywords and the filters still apply. Filters that willhaben's robots.txt does not allow crawlers to send (make and model ids, price, mileage, year, power, gearbox, body type, condition, private/dealer, keyword, last 48 hours) are removed from the request and applied by the Actor itself, so you get the same listings you saw.

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

Remember listing IDs between runs and return only listings you have not received yet. Ideal for scheduled runs and alerts. Already-seen listings are never charged; the run stops as soon as it reaches listings older than the previous run.

## `stateKey` (type: `string`):

Name of the memory used by 'Only new listings'. Use a different key for each saved search.

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

Leave as is. The Actor runs without a proxy and switches to an Austrian residential proxy by itself if willhaben rate-limits it, at no extra cost to you. Only custom proxy URLs (your own proxies) are used from this field.

## Actor input object example

```json
{
  "vehicleType": "car",
  "make": "VW",
  "state": "",
  "fuel": "",
  "gearbox": "",
  "sellerType": "all",
  "sortBy": "newest",
  "maxItems": 20,
  "includeDetails": false,
  "includePersonalData": false,
  "onlyNew": false,
  "stateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `listings` (type: `string`):

Scraped vehicle listings (table view).

## `listingsFull` (type: `string`):

All fields, including details when enabled.

# 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 = {
    "vehicleType": "car",
    "make": "VW",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aidnurs/willhaben-auto-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 = {
    "vehicleType": "car",
    "make": "VW",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("aidnurs/willhaben-auto-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 '{
  "vehicleType": "car",
  "make": "VW",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call aidnurs/willhaben-auto-scraper --silent --output-dataset

```

## MCP server setup

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