# Willhaben.at Scraper — Austria Real Estate, Cars, Marketplace (`yadroo/willhaben-at`) Actor

Willhaben.at scraper for analysts, dealers and AI agents: Austrian real estate (rent/buy, houses, plots, commercial), cars, motorbikes, vans and marketplace goods.

- **URL**: https://apify.com/yadroo/willhaben-at.md
- **Developed by:** [Samat Makatov](https://apify.com/yadroo) (community)
- **Categories:** Real estate, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 result items

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.at Scraper — Austria Real Estate, Cars & Marketplace

Structured listings from **willhaben.at**, Austria's largest classifieds site: flats and houses for rent or sale, plots, commercial property, holiday homes, used cars, motorbikes, vans, caravans and marketplace goods. Every search comes with willhaben's own filters (region down to Vienna districts, price, rooms, m², make/model, year, mileage, fuel, PayLivery, private/dealer…), price per m², publish time and coordinates. `detail: true` adds full description, all photos, seller details and the complete attribute sheet. A `facets` mode returns live hit counts per filter value, useful for market sizing.

Plain HTTP against the site's embedded page data. No proxies, no browser, no API key.

### Use cases

- **Rental market reports**: all Vienna flats for rent, broken down by district with median `pricePerSqm`, refreshed weekly.
- **Deal alerts for buyers & agents**: `sinceHours: 24` on a daily schedule with your price, rooms and district. Only new ads come back.
- **Used-car dealer sourcing**: private-seller cars by make/model/year/mileage (`sellerType: "private"`), sorted by price, with first registration and equipment from detail pages.
- **Price tracking for resellers**: marketplace items such as `"iphone 15"` with `payliveryOnly`, condition and category filters, to track the going price of a product.
- **Supply / competition analysis**: `mode: "facets"` gives the number of ads per make, fuel, district, property type or price band in one request.
- **Lead lists for B2B**: dealer and agency ads (`sellerType: "dealer"`) with company name, website and published phone number (`detail: true`).

### Input

All fields are optional. Filters that don't apply to the chosen vertical are ignored, and a warning is logged.

| Field | Type | Default | Allowed values / notes |
|---|---|---|---|
| `category` | string | `mietwohnungen` | `mietwohnungen`, `eigentumswohnung`, `haus-kaufen`, `haus-mieten`, `grundstuecke`, `gewerbeimmobilien-kaufen`, `gewerbeimmobilien-mieten`, `ferienimmobilien-kaufen`, `ferienimmobilien-mieten`, `auto`, `motorrad`, `nutzfahrzeuge`, `wohnwagen`, `marktplatz`. v0.1 paths (`immobilien/mietwohnungen`, `gebrauchtwagen/auto/gebrauchtwagenboerse`…) still work. |
| `mode` | string | `search` | `search` (listings), `facets` (filter values + hit counts), `categories` (marketplace category ids) |
| `region` | string | `wien` | Bundesland slug, district/city name, Vienna district (`wien-7`, `1070`, `Neubau`) or numeric areaId. Empty = all Austria. See **Reference**. |
| `areas` | string\[] | `[]` | More districts/cities/areaIds, OR-combined with `region`. |
| `keyword` | string | – | Free text. |
| `priceFrom` / `priceTo` | integer | – | € (monthly rent for rental verticals). |
| `sellerType` | string | `all` | `all`, `private`, `dealer`. Server-side for vehicles & marketplace, client-side for real estate. |
| `roomsFrom` / `roomsTo` | integer | – | Real estate. |
| `livingAreaFrom` / `livingAreaTo` | integer | – | m², flats/houses/holiday homes. |
| `plotAreaFrom` / `plotAreaTo` | integer | – | m², houses/plots. |
| `propertyTypes` | string\[] | `[]` | See **Reference → Property types**. |
| `features` | string\[] | `[]` | `storage`, `accessible`, `carport`, `kitchen`, `lift`, `garage`, `cellar`, `parking`, `furnished`, `cabling` (or the German labels). |
| `outdoorAreas` | string\[] | `[]` | `balcony`, `roof-terrace`, `garden`, `loggia`, `terrace`, `winter-garden`. |
| `availableNow` / `newBuildOnly` | boolean | `false` | Real estate. |
| `make` / `model` | string | – | Vehicles. Matched against willhaben's live make/model list; an unknown value fails and the error lists the valid names. |
| `yearFrom` / `yearTo` | integer | – | First registration year. |
| `mileageFrom` / `mileageTo` | integer | – | km. |
| `powerKwFrom` / `powerKwTo` | integer | – | kW. |
| `fuel` | string\[] | `[]` | `petrol`, `diesel`, `electric`, `gas`, `hybrid`, `hybrid-diesel`, `hydrogen`. |
| `transmission` | string | – | `automatic`, `manual`. |
| `wheelDrive` | string | – | `awd`, `fwd`, `rwd`. |
| `bodyTypes` | string\[] | `[]` | Cars: `cabrio`, `compact`, `minibus`, `kombi`, `sedan`, `microcar`, `coupe`, `suv`. |
| `vehicleCondition` | string\[] | `[]` | `used`, `one-year`, `new`, `classic`, `pre-registered`, `accident`, `demo`. |
| `colors` | string\[] | `[]` | `black`, `white`, `grey`, `silver`, `blue`, `red`, `green`, `brown`, `beige`, `yellow`, `gold`, `orange`, `bronze`, `purple`, `other`. |
| `equipment` | string\[] | `[]` | willhaben labels, e.g. `Anhängerkupplung`, `Navigationssystem` (see `mode: "facets"`). |
| `warrantyOnly` / `inspectionOnly` | boolean | `false` | Vehicles with warranty / §57a report. |
| `marketCategory` | string | – | Marketplace top-level name (see **Reference**) or any numeric ATTRIBUTE\_TREE id. |
| `itemCondition` | string\[] | `[]` | `new`, `like-new`, `refurbished`, `used`, `defective`, `display`. |
| `handover` | string | – | `pickup`, `shipping`. |
| `payliveryOnly` | boolean | `false` | Only ads with willhaben PayLivery. |
| `sort` | string | `newest` | `newest`, `relevance`, `price_asc`, `price_desc`, `area_asc`/`area_desc` (real estate), `mileage_asc`/`mileage_desc`, `year_desc`/`year_asc`, `model` (vehicles). |
| `sinceHours` | integer | – | Keep ads published in the last N hours (server day filter + exact client check). |
| `maxItems` | integer | `50` | 1–5000. Up to 100 ads per request. |
| `maxPages` | integer | `20` | Safety cap. |
| `detail` | boolean | `false` | Open each ad page (+1 request per ad). |
| `includeTopAds` | boolean | `false` | Keep paid top ads (willhaben injects them even when they don't match the filters). |
| `dedupe` | boolean | `true` | Drop repeated ids. |
| `fields` | string\[] | `[]` | Output only these fields. |
| `extraParams` | object | `{}` | Raw willhaben URL parameters, e.g. `{"NO_OF_DOORS_FROM": 4}`. |

### Reference

#### Regions (`region`, `areas`)

| Bundesland | Slug | areaId | Districts / cities (name → areaId) |
|---|---|---|---|
| Wien | `wien` | 900 | 1.–23. Bezirk → 117223–117245 (`wien-1` … `wien-23`, or postcode `1010` … `1230`, or name `Innere Stadt`, `Leopoldstadt`, `Landstraße`, `Wieden`, `Margareten`, `Mariahilf`, `Neubau`, `Josefstadt`, `Alsergrund`, `Favoriten`, `Simmering`, `Meidling`, `Hietzing`, `Penzing`, `Rudolfsheim-Fünfhaus`, `Ottakring`, `Hernals`, `Währing`, `Döbling`, `Brigittenau`, `Floridsdorf`, `Donaustadt`, `Liesing`) |
| Niederösterreich | `niederoesterreich` | 3 | Amstetten 305, Baden 306, Bruck an der Leitha 307, Gänserndorf 308, Gmünd 309, Hollabrunn 310, Horn 311, Korneuburg 312, Krems an der Donau 301, Krems Land 313, Lilienfeld 314, Melk 315, Mistelbach 316, Mödling 317, Neunkirchen 318, Sankt Pölten 302, Sankt Pölten Land 319, Scheibbs 320, Tulln 321, Waidhofen an der Thaya 322, Waidhofen an der Ybbs 303, Wiener Neustadt 304, Wiener Neustadt Land 323, Zwettl 325 |
| Oberösterreich | `oberoesterreich` | 4 | Braunau am Inn 404, Eferding 405, Freistadt 406, Gmunden 407, Grieskirchen 408, Kirchdorf an der Krems 409, Linz 401, Linz Land 410, Perg 411, Ried im Innkreis 412, Rohrbach 413, Schärding 414, Steyr 402, Steyr-Land 415, Urfahr-Umgebung 416, Vöcklabruck 417, Wels 403, Wels-Land 418 |
| Steiermark | `steiermark` | 6 | Bruck-Mürzzuschlag 621, Deutschlandsberg 603, Graz 601, Graz-Umgebung 606, Hartberg-Fürstenfeld 622, Leibnitz 610, Leoben 611, Liezen 612, Murau 614, Murtal 620, Südoststeiermark 623, Voitsberg 616, Weiz 617 |
| Tirol | `tirol` | 7 | Imst 702, Innsbruck 701, Innsbruck-Land 703, Kitzbühel 704, Kufstein 705, Landeck 706, Lienz 707, Reutte 708, Schwaz 709 |
| Salzburg | `salzburg` | 5 | Hallein 502, Salzburg Stadt 501, Salzburg-Umgebung 503, Sankt Johann im Pongau 504, Tamsweg 505, Zell am See 506 |
| Kärnten | `kaernten` | 2 | Feldkirchen 210, Hermagor 203, Klagenfurt 201, Klagenfurt Land 204, Sankt Veit an der Glan 205, Spittal an der Drau 206, Villach 202, Villach Land 207, Völkermarkt 208, Wolfsberg 209 |
| Vorarlberg | `vorarlberg` | 8 | Bludenz 801, Bregenz 802, Dornbirn 803, Feldkirch 804 |
| Burgenland | `burgenland` | 1 | Eisenstadt 101, Eisenstadt-Umgebung 103, Güssing 104, Jennersdorf 105, Mattersburg 106, Neusiedl am See 107, Oberpullendorf 108, Oberwart 109, Rust 102 |
| Abroad | `ausland` | 22000 | – |

#### Property types (`propertyTypes`)

| Group | Values (German label → alias) |
|---|---|
| Flats | Wohnung (`flat`), Dachgeschoßwohnung (`attic`), Erdgeschoßwohnung (`ground-floor`), Garconniere (`studio-flat`), Genossenschaftswohnung (`cooperative`), Loft/Studio (`loft`), Maisonette (`duplex`), Penthousewohnung (`penthouse`), Rohdachboden (`raw-attic`), Zimmer/WG (`room`) |
| Houses | Einfamilienhaus (`detached`), Doppelhaushälfte (`semi-detached`), Reihenhaus (`terraced`), Mehrfamilienhaus (`multi-family`), Villa, Bungalow, Bauernhaus (`farmhouse`), Landhaus (`country-house`), Almhütte/Berghütte (`chalet`), Gartenhaus, Genossenschaftshaus, Rohbau (`shell`), Schloss/Burg/Chalet (`castle`) |
| Plots | Grundstück (`plot`), Baugrundstück (`building-plot`), Gewerbegrundstück, Industriegrundstück, Kleingarten (`allotment`), Land-/Forstwirtschaft (`agricultural`) |
| Commercial | Büro/Ordination (`office`), Geschäfts-/Ladenlokal (`shop`), Gastronomie (`restaurant`), Hotel/Pension (`hotel`), Lagerhalle (`warehouse`), Werkstatt (`workshop`), Zinshaus (`investment-building`), Ausstellungsfläche (`showroom`), Jagd-/Forstwirtschaft, Teich-/Fischwirtschaft |

#### Marketplace categories (`marketCategory`)

| Name (alias) | ATTRIBUTE\_TREE id |
|---|---|
| Antiquitäten / Kunst (`antiques`) | 6941 |
| Baby / Kind (`baby`) | 3928 |
| Beauty / Gesundheit / Wellness (`beauty`) | 3076 |
| Boote / Yachten / Jetskis (`boats`) | 5007823 |
| Bücher / Filme / Musik (`books`) | 387 |
| Computer / Software (`computer`) | 5824 |
| Dienstleistungen (`services`) | 537 |
| Freizeit / Instrumente / Kulinarik (`leisure`) | 6462 |
| Games / Konsolen (`games`) | 2785 |
| Haus / Garten / Werkstatt (`home`) | 3541 |
| Kameras / TV / Multimedia (`cameras`) | 6808 |
| KFZ-Zubehör / Motorradteile (`car-parts`) | 6142 |
| Mode / Accessoires (`fashion`) | 3275 |
| Smartphones / Telefonie (`smartphones`) | 2691 |
| Spielen / Spielzeug (`toys`) | 5136 |
| Sport / Sportgeräte (`sport`) | 4390 |
| Tiere / Tierbedarf (`pets`) | 4915 |
| Uhren / Schmuck (`watches`) | 2409 |
| Wohnen / Haushalt / Gastronomie (`furniture`) | 5387 |

For sub-categories, run `{"category": "marktplatz", "mode": "categories", "marketCategory": "smartphones"}`.

### Examples

**Vienna rental market snapshot (2–3 rooms, 50–90 m², balcony)**

```json
{ "category": "mietwohnungen", "region": "wien", "roomsFrom": 2, "roomsTo": 3, "livingAreaFrom": 50, "livingAreaTo": 90, "outdoorAreas": ["balcony"], "maxItems": 500 }
```

**Daily alert: new houses for sale around Graz under €600k**

```json
{ "category": "haus-kaufen", "region": "Graz-Umgebung", "areas": ["Graz"], "priceTo": 600000, "sinceHours": 24, "sort": "newest", "detail": true }
```

**Dealer sourcing: private-seller VW Golf diesels from 2018, cheapest first**

```json
{ "category": "auto", "region": "", "make": "VW", "model": "Golf", "fuel": ["diesel"], "yearFrom": 2018, "mileageTo": 150000, "sellerType": "private", "sort": "price_asc", "maxItems": 200 }
```

**Reseller price check: iPhone 15 like-new with PayLivery**

```json
{ "category": "marktplatz", "region": "", "keyword": "iphone 15", "marketCategory": "smartphones", "itemCondition": ["like-new"], "payliveryOnly": true, "maxItems": 100, "fields": ["title", "price", "location", "publishedAt", "url"] }
```

**Market sizing: how many flats for sale per district and property type in Graz**

```json
{ "category": "eigentumswohnung", "region": "Graz", "mode": "facets" }
```

### Output

Example item (`category: "mietwohnungen"`, trimmed):

```json
{
  "id": "819411514",
  "url": "https://www.willhaben.at/iad/immobilien/d/mietwohnungen/wien/wien-1160-ottakring/freundliche-hausbewohner-...-819411514/",
  "title": "freundliche Hausbewohner, schöner Innenhofgarten, ...",
  "price": 1290,
  "currency": "EUR",
  "priceDisplay": "€ 1.290",
  "location": "Wien, 16. Bezirk, Ottakring",
  "postcode": "1160",
  "state": "Wien",
  "areaId": 117238,
  "latitude": 48.21965,
  "longitude": 16.31933,
  "isPrivate": true,
  "sellerType": "private",
  "publishedAt": "2026-09-13T10:03:17.000Z",
  "isBumped": true,
  "vertical": "mietwohnungen",
  "kind": "estate",
  "propertyType": "Wohnung",
  "rooms": 3,
  "livingArea": 68,
  "floor": "3",
  "features": ["Keller"],
  "pricePerSqm": 18.97,
  "images": ["https://cache.willhaben.at/mmo/..."],
  "imagesCount": 17,
  "attributes": { "…": "full raw attribute map" },
  "searchTotal": 4781,
  "searchUrl": "https://www.willhaben.at/iad/immobilien/mietwohnungen/mietwohnung-angebote?rows=40&page=1&areaId=900",
  "fetchedAt": "2026-09-13T08:13:06.759Z"
}
```

| Field | Kinds | Description |
|---|---|---|
| `id`, `url`, `title`, `description` | all | willhaben ad id (stable), ad URL, heading, teaser text |
| `price`, `currency`, `priceDisplay`, `oldPrice` | all | Price in € (monthly rent for rentals), displayed price, previous price if reduced |
| `location`, `postcode`, `state`, `district`, `country`, `areaId`, `latitude`, `longitude` | all | Location |
| `sellerName`, `sellerId`, `isPrivate`, `sellerType` | all | `private` / `dealer` |
| `publishedAt`, `changedAt`, `isBumped`, `isTopAd` | all | ISO timestamps; bumped = re-pushed to the top |
| `vertical`, `kind`, `categoryLabel` | all | `estate`, `motor`, `market` |
| `propertyType`, `propertyTypeId`, `rooms`, `livingArea`, `usableArea`, `plotArea`, `floor`, `outdoorArea`, `outdoorAreaSize`, `features`, `pricePerSqm`, `isNewBuildProject` | estate | `pricePerSqm` comes from willhaben or is computed as price / living area |
| `make`, `model`, `modelSpec`, `mileage`, `year`, `fuel`, `transmission`, `powerKw`, `bodyType`, `condition`, `color`, `warranty`, `owners`, `seats`, `equipment`, `pricePerKm`, `isDealerAd` | motor | |
| `categoryIds`, `paylivery`, `teaser`, `expiresAt` | market | |
| `images`, `imagesCount`, `attributes`, `searchTotal`, `searchUrl`, `fetchedAt` | all | |
| `descriptionFull`, `firstPublishedAt`, `expiresAt`, `street`, `municipality`, `province`, `sellerRegisteredAt`, `sellerActiveAds`, `companyName`, `website`, `phone`, `details`, `shippingOptions`, `rentPerMonth`, `additionalCosts`, `deposit`, `availableFrom`, `buildingCondition`, `firstRegistration`, `detailAttributes`, `detailFetched`, `detailError` | `detail: true` | Only fields the ad actually publishes are filled |

Rows from `mode: "facets"` / `"categories"` have `navigatorId`, `navigatorLabel`, `param`, `label`, `value`, `hits`, `selected`, `howToUse` (which input to put the value into), `rowsFound`, `searchUrl`, `fetchedAt`.

### Use it from code / agents

**Apify API (curl)**

```bash
curl -X POST "https://api.apify.com/v2/acts/yadroo~willhaben-at/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"category":"auto","make":"BMW","yearFrom":2020,"sellerType":"private","maxItems":50}'
```

**JavaScript (`apify-client`)**

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yadroo/willhaben-at').call({ category: 'mietwohnungen', region: 'wien-7', maxItems: 100 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python (`apify-client`)**

```python
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yadroo/willhaben-at").call(run_input={"category": "marktplatz", "keyword": "rennrad", "priceTo": 800})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**AI agents (MCP)**: add `https://mcp.apify.com?actors=yadroo/willhaben-at` to Claude, Cursor or any MCP client. The input schema descriptions are written so an agent can fill filters from a plain-language request.

### Pricing

Pay per event: **$0.005 per run start + $0.0015 per ad** in the dataset.

- 50 ads (default): $0.08
- 500 ads for a market snapshot: $0.755
- `mode: "facets"`: the rows are filter values, charged like ads (a Graz flats-for-sale facet run returned 77 rows, about $0.12).

`detail: true` doesn't change the price per item. It takes longer, about 1 s per ad.

### Limits & FAQ

- **Rate**: about 1 search page per second and 1 detail page per second. A 500-ad run takes about 10 s without detail pages.
- **Freshness**: live data at request time. `publishedAt` is willhaben's last publish time; bumped ads show the bump time (`isBumped: true`).
- **Top ads**: paid top ads can ignore your filters, so they are dropped unless `includeTopAds: true`.
- **Real-estate seller type**: willhaben has no private/agency filter for real estate. The actor filters after fetching, so you may need more pages.
- **Blocks & errors**: HTTP 429/5xx are retried with backoff. If willhaben serves a 403 or challenge page on search, the run fails with a clear error. If only detail pages get blocked, the run keeps the list data and marks items with `detailError`.
- **Unknown values** (make, model, region, fuel…) fail early with the list of valid values instead of returning an unfiltered search.
- **Roadmap**: price-drop tracking across runs (compare `oldPrice` / previous dataset), dealer inventory mode.

***

Made by **Yadroo**. Sibling actors: [Otodom.pl (Poland real estate)](https://apify.com/yadroo/otodom-pl) · [Kleinanzeigen.de (Germany classifieds)](https://apify.com/yadroo/kleinanzeigen-de) · [AutoScout24 cars](https://apify.com/yadroo/autoscout24-cars) · [Marktplaats.nl](https://apify.com/yadroo/marktplaats-nl) · [Rightmove UK](https://apify.com/yadroo/rightmove-uk) · [Krisha.kz](https://apify.com/yadroo/krisha-kz)

# Actor input Schema

## `category` (type: `string`):

willhaben.at search vertical. Real estate: mietwohnungen, eigentumswohnung, haus-kaufen, haus-mieten, grundstuecke, gewerbeimmobilien-kaufen/-mieten, ferienimmobilien-kaufen/-mieten. Vehicles: auto, motorrad, nutzfahrzeuge, wohnwagen. General goods: marktplatz. Legacy path values of v0.1 still work.

## `mode` (type: `string`):

search = listings; facets = one row per filter value (label, URL value, hits) for the current search, useful to discover make/model/equipment ids or to count supply; categories = marktplatz ATTRIBUTE\_TREE ids.

## `region` (type: `string`):

Bundesland slug (wien, niederoesterreich, oberoesterreich, steiermark, tirol, salzburg, kaernten, vorarlberg, burgenland, ausland), a district/city name ("Graz", "Linz", "Innsbruck", "Mödling"), a Vienna district ("wien-7", "1070", "Neubau") or a numeric areaId. Empty = all Austria. Full list: README → Reference.

## `areas` (type: `array`):

More districts/cities/areaIds searched together with region (OR), e.g. \["wien-2","wien-20","Klosterneuburg"].

## `keyword` (type: `string`):

Free-text search, e.g. "golf 7 tdi", "iphone 15", "altbau".

## `priceFrom` (type: `integer`):

Minimum price (monthly rent for rental verticals).

## `priceTo` (type: `integer`):

Maximum price (monthly rent for rental verticals).

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

Vehicles & marktplatz: server-side filter. Real estate: applied client-side (the site has no such filter).

## `roomsFrom` (type: `integer`):

Real estate: minimum number of rooms (site buckets 1,2,3,4,5,6–9,10+).

## `roomsTo` (type: `integer`):

Real estate: maximum number of rooms.

## `livingAreaFrom` (type: `integer`):

Flats/houses/holiday homes.

## `livingAreaTo` (type: `integer`):

Flats/houses/holiday homes.

## `plotAreaFrom` (type: `integer`):

Houses, flats with garden, plots.

## `plotAreaTo` (type: `integer`):

Houses, flats with garden, plots.

## `propertyTypes` (type: `array`):

Names or ids, e.g. \["Penthouse","Maisonette","Dachgeschoßwohnung"], \["Einfamilienhaus","Reihenhaus"], \["Baugrundstück"], \["Büro/Ordination","Lagerhalle"]. English aliases work (penthouse, detached, office, warehouse). Full list: README.

## `features` (type: `array`):

Any of: Abstellraum (storage), Barrierefrei (accessible), Carport, Einbauküche (kitchen), Fahrstuhl (lift), Garage, Keller (cellar), Parkplatz (parking), Möbliert (furnished), Verkabelung.

## `outdoorAreas` (type: `array`):

Any of: Balkon (balcony), Dachterrasse (roof-terrace), Garten (garden), Loggia, Terrasse (terrace), Wintergarten.

## `availableNow` (type: `boolean`):

Only objects available right away.

## `newBuildOnly` (type: `boolean`):

Only Neubauprojekte.

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

Brand as shown on willhaben, e.g. "VW", "BMW", "Mercedes-Benz", "Škoda" (case/diacritics-insensitive). Unknown makes fail with the valid list.

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

Model of the chosen make, e.g. "Golf", "3er-Reihe", "Octavia". Requires make.

## `yearFrom` (type: `integer`):

e.g. 2018

## `yearTo` (type: `integer`):

e.g. 2022

## `mileageFrom` (type: `integer`):

No description

## `mileageTo` (type: `integer`):

No description

## `powerKwFrom` (type: `integer`):

No description

## `powerKwTo` (type: `integer`):

No description

## `fuel` (type: `array`):

Any of: petrol (Benzin), diesel, electric (Elektro), gas (LPG/CNG), hybrid (Elektro/Benzin), hybrid-diesel, hydrogen.

## `transmission` (type: `string`):

Gearbox.

## `wheelDrive` (type: `string`):

Drive type.

## `bodyTypes` (type: `array`):

Cars: cabrio, compact, minibus, kombi, sedan (Limousine), microcar, coupe, suv. Other vehicle verticals: labels from mode "facets".

## `vehicleCondition` (type: `array`):

Cars: used (Gebrauchtwagen), one-year (Jahreswagen), new (Neuwagen), classic (Oldtimer), pre-registered (Tageszulassung), accident (Unfallwagen), demo (Vorführwagen).

## `colors` (type: `array`):

e.g. black, white, grey, silver, blue, red (German labels work too).

## `equipment` (type: `array`):

Labels as on willhaben, e.g. "Anhängerkupplung", "Navigationssystem", "Sitzheizung vorne", "Rückfahrkamera" (see mode "facets").

## `warrantyOnly` (type: `boolean`):

No description

## `inspectionOnly` (type: `boolean`):

No description

## `marketCategory` (type: `string`):

Top-level name/alias (smartphones, computer, furniture, fashion, sport, toys, games, cameras, car-parts, books, baby, pets, watches, antiques, home, beauty, services, boats, leisure) or any numeric ATTRIBUTE\_TREE id (mode "categories" lists sub-categories).

## `itemCondition` (type: `array`):

Any of: new, like-new (Neuwertig), refurbished (Generalüberholt), used, defective, display (Ausstellungsstück).

## `handover` (type: `string`):

How the item is handed over.

## `payliveryOnly` (type: `boolean`):

Only ads with willhaben PayLivery (buy online with payment + shipping protection).

## `sort` (type: `string`):

Sort order. Orders not offered for the vertical fall back to newest with a warning.

## `sinceHours` (type: `integer`):

Only ads published in the last N hours. Sent to the site as a day filter and re-checked on the exact publish time — ideal for scheduled alerts (e.g. 24 on a daily schedule).

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

Stop after this many ads. Up to 100 ads per page request.

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

Safety cap on search pages.

## `detail` (type: `boolean`):

+1 request per ad: full description, all images, exact address parts, seller name/registration date/active ads, company name, website, phone (if published), detail attributes, equipment, shipping options, rent breakdown (Miete, Betriebskosten, Kaution), first registration. If willhaben blocks detail pages the run keeps list data and marks items with detailError.

## `includeTopAds` (type: `boolean`):

willhaben injects paid "top ads" that often ignore your filters. By default they are dropped.

## `dedupe` (type: `boolean`):

Drop repeated ad ids across pages.

## `fields` (type: `array`):

Keep only these fields per item (e.g. \["id","title","price","pricePerSqm","location","url"]). Empty = all fields.

## `extraParams` (type: `object`):

Any other willhaben search parameter copied from a willhaben URL, e.g. {"NO\_OF\_DOORS\_FROM": 4, "BATTERY\_CAPACITY\_FROM": 60}. Arrays repeat the parameter.

## Actor input object example

```json
{
  "category": "mietwohnungen",
  "mode": "search",
  "region": "wien",
  "areas": [],
  "sellerType": "all",
  "propertyTypes": [],
  "features": [],
  "outdoorAreas": [],
  "availableNow": false,
  "newBuildOnly": false,
  "fuel": [],
  "bodyTypes": [],
  "vehicleCondition": [],
  "colors": [],
  "equipment": [],
  "warrantyOnly": false,
  "inspectionOnly": false,
  "itemCondition": [],
  "payliveryOnly": false,
  "sort": "newest",
  "maxItems": 50,
  "maxPages": 20,
  "detail": false,
  "includeTopAds": false,
  "dedupe": true,
  "fields": [],
  "extraParams": {}
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `overview` (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 = {
    "areas": [],
    "propertyTypes": [],
    "features": [],
    "outdoorAreas": [],
    "fuel": [],
    "bodyTypes": [],
    "vehicleCondition": [],
    "colors": [],
    "equipment": [],
    "itemCondition": [],
    "fields": [],
    "extraParams": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("yadroo/willhaben-at").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 = {
    "areas": [],
    "propertyTypes": [],
    "features": [],
    "outdoorAreas": [],
    "fuel": [],
    "bodyTypes": [],
    "vehicleCondition": [],
    "colors": [],
    "equipment": [],
    "itemCondition": [],
    "fields": [],
    "extraParams": {},
}

# Run the Actor and wait for it to finish
run = client.actor("yadroo/willhaben-at").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 '{
  "areas": [],
  "propertyTypes": [],
  "features": [],
  "outdoorAreas": [],
  "fuel": [],
  "bodyTypes": [],
  "vehicleCondition": [],
  "colors": [],
  "equipment": [],
  "itemCondition": [],
  "fields": [],
  "extraParams": {}
}' |
apify call yadroo/willhaben-at --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yadroo/willhaben-at"
        }
    }
}
```

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/ajRYuQ53XJlukOhrp/builds/IX9PNcqjrCUnpaU8W/openapi.json
