willhaben Scraper: Immobilien, Cars, Jobs & Ads
Pricing
from $0.85 / 1,000 listings
willhaben Scraper: Immobilien, Cars, Jobs & Ads
willhaben.at Marktplatz, Immobilien, Auto & Motor and Jobs in one run by keyword, filter, search link, seller, employer or ad link, no login. Rows hold price, m2, rooms, make, mileage, salary; full records add costs, energy class, car equipment, VAT id. New ad alerts, pay per row, JSON, CSV, API.
Pricing
from $0.85 / 1,000 listings
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
willhaben Scraper: Immobilien, Cars, Jobs & Ads
willhaben scraper for willhaben.at, Austria's classifieds site: search all four sections in one run, Marktplatz (19 top and 184 sub categories), Immobilien (all 12 property kinds, rent and buy), Auto & Motor (cars, motorbikes, vans and trucks, caravans and motorhomes) and Jobs, by keyword, by willhaben's own filters, by a pasted willhaben search link, by seller, by employer page or by ad and job link. Each ad or job is one row with its price or salary, place, map point, seller type, photos and the section's facts (living area, rooms, make, mileage, fuel, employment type). Turn on full records for the whole description, every attribute, the rent and running costs, energy figures, car equipment, the seller's or company's facts and the job's apply link. No login, no cookies, no captcha. A monitor delivers only what it never delivered before, with price changes and removals if you like, and can send it to Telegram, Slack, Discord, WhatsApp or your own webhook.
Who uses it: flat hunters and property investors watching new Vienna, Graz or Salzburg listings, car dealers following private car ads, resellers watching Marktplatz bargains, recruiters and salary analysts reading Austrian job ads, and teams feeding willhaben data into their own sheets, apps or AI agents.
Quick start
- Open the Input tab and pick the Sections:
marktplatz,immobilien,auto,jobs(several at once if you like). - Narrow them: Property types such as
mietwohnungenorhaus-kaufen, Vehicle types, Marktplatz categories (Fahrräder / Radsport), Keywords (fahrrad,3 zimmer balkon,golf 7), States (Wien,Steiermark) and Districts (Graz,1030orWien 3). - Or paste willhaben links: search pages into Search links (
https://www.willhaben.at/iad/gebrauchtwagen/auto/gebrauchtwagenboerse?PRICE_TO=5000), seller numbers into Sellers, employer pages into Employer pages, ad and job links into Ad and job links. - Add filters (price, living area, rooms, make, model, year, mileage, fuel, job field, employment type, salary ...), set Maximum rows and click Start. Download the rows as JSON, CSV or Excel, or read them through the Apify API.
The prefilled input reads 20 Vienna rentals: measured, 4 seconds and 2 requests (run IrGNo2zqp4g2Y8oTO). To receive new ads only, give the run a Monitor name and schedule it (daily or more often).
What you get
One row per ad or job (type: "listing"), one coverage row per search (type: "search"), free status rows for anything that could
not be delivered (type: "status"), a run summary (type: "summary"), and in a monitor with Track changes a row per ad that
disappeared (type: "removed"). The dataset view Ads and jobs keeps the most useful columns.
Fill rates below are counted on platform runs of 2026-10-20 (the private test build before the Codex review; the released build's runs of the same day on the real actor show the same fill). Search rows: 600 Marktplatz ads for fahrrad (run
yyjFRNX6lIbm1tZI8), 20 Vienna rentals (the prefill, run IrGNo2zqp4g2Y8oTO), 90 houses for rent in Burgenland (run
Dk4xVVKRZd2YO8U57), 10 dealer motorbikes (run hngm2O2Afeh5ql12t) and 270 jobs (run XY8bh00sWvV4Zb4z2). Rows with full records: 60
Vienna flats for sale (run b05yRSWKrccbckTHY), 10 rentals in Vienna 3 (run FzGmMWOJ2sfLfM5Mo), 10 diesel Golfs (run
Jj2jrM94lHNISSI1x: 9 private and a dealer's paid first slot, which the released build leaves out: run TZFqMLlp80aa8dsiV, 10 private), 8 new phones (run
hRKxRCUlb7faPbA9D) and 5 full time jobs in Vienna (run ZtV5UJQcuqleOkIl6).
Ads (Marktplatz, Immobilien, Auto & Motor)
| Field | What it is | Filled on (measured) |
|---|---|---|
adId, adUuid, url, title, section, subSection | willhaben's ad id, the ad's link and title, the section and sub section (Wohnung mieten, Gebrauchtwagen) | every row |
descriptionSnippet, descriptionComplete | the text the search shows (cut at about 257 characters with "..."), and whether it is the whole description | every search row; complete on 0 of the 20 rentals |
description (with descriptionText, descriptionMarkdown in format all) | the whole description, as HTML (the default), text or markdown | every row with a full record (60 of 60, 10 of 10, 8 of 8) |
price, priceText, currency | price in euros (for rentals the rent) and as willhaben writes it (€ 596,57) | 600 of 600 fahrrad, 20 of 20 rentals, 58 of 60 flats for sale |
oldPrice, priceReducedAt | the earlier price of a reduced ad and the day it was reduced | 45 of 600 fahrrad |
pricePerSquareMeter | price per m2 | 20 of 20 rentals, 56 of 60 flats for sale |
postcode, location, district, state, country | where the ad is | postcode 600 of 600, district 573 of 600, state 599 of 600 fahrrad; every Immobilien row |
municipality | the municipality | with a full record (60 of 60) |
latitude, longitude, coordinatesRounded | the ad's map point; rounded to 2 decimals (about 1 km) on a private seller's ad with personal data off | 597 of 600 fahrrad, every Immobilien row |
distanceKm | the distance from your Latitude and Longitude | 10 of 10 with a point given (run Ad3n04nDYOD3nQ6b1); empty without one |
street | the ad's street: business sellers' ads, private ones only with Include personal data | 146 of the 210 business ads of fahrrad, 0 of the 390 private ones |
publishedAt, isBumped | the last time the ad was published or bumped, and whether it was bumped | every row; bumped 54 of 60 flats for sale |
firstPublishedAt, createdAt | the first publication and the creation time | with a full record (60 of 60) |
changedAt, endsAt | last change and the end of the ad's run time | 600 of 600 Marktplatz search rows; with a full record on every section |
isTopAd, status | willhaben's top ad and the status (active, reserved) | every row; reserved 2 of 90 houses |
sellerType | private or business | every row (210 business of 600 fahrrad, 17 of 20 rentals) |
sellerId, sellerName | the seller's number (ORGID) and name: business sellers always, private ones with personal data on | 210 of 600 fahrrad, 17 of 20 rentals (the business sellers) |
sellerMemberSince, sellerActiveAds | since when the seller is on willhaben and how many ads they have | every row with a full record |
sellerPhone, sellerAddress, sellerWebsite, sellerProfileUrl, sellerLogoUrl, sellerOpeningHours, sellerEmail | a business seller's contact data from the full record | phone and address 58 of the 58 business flats for sale, website 56; opening hours 1 of 1 car dealer; e-mail on none of the measured rows |
images, imageCount, mainImageUrl, thumbnailUrl | photo links (never downloaded) | 597 of 600 fahrrad, every Immobilien row |
floorPlans, attachments | floor plan and attachment links of the full record | floor plans 1 of 60 flats for sale |
categoryIds, categoryPath, teaser | willhaben's category ids and names, the short facts the search shows | category names 600 of 600 fahrrad; Immobilien search rows carry ids only, the names come with a full record |
attributes | every willhaben attribute of the row (personal ones behind the switch) | every row |
propertyType, livingAreaM2, rooms, usableAreaM2, floor, outdoorAreas, outdoorAreaM2, projectId, virtualTourUrl | Immobilien | rooms 20 of 20 rentals and 90 of 90 houses; living area 20 of 20 and 88 of 90; outdoor areas 15 of 20 and 76 of 90 |
rentNetPerMonth, additionalCostsNet, totalMonthlyCost, vatPerMonth, commissionText, availableFrom, rentalTerm, ownershipType | Immobilien money facts of the full record | net rent and total cost 7 of 10 rentals, commission text 8 of 10 rentals and 47 of 60 flats for sale, available from 8 of 10 |
energyHwb, energyHwbClass, energyFgee, energyFgeeClass, constructionYear, buildingCondition, heating, features | energy figures and the building, from the full record | HWB 10 of 10 rentals and 50 of 60 flats for sale, construction year 42 of 60, heating 40 of 60, features 57 of 60 |
make, model, modelSpecification, mileageKm, powerKw, fuel, bodyType, condition | Auto & Motor | 10 of 10 cars; motorbike search rows 10 of 10 (fuel 9) |
firstRegistrationYear, firstRegistrationMonth, transmission, owners, seats, doors, colour, warranty, drive, equipment | more car facts | 10 of 10 cars with a full record (owners 9); colour is willhaben's colour code (14); motorbike search rows carry no year and no transmission |
tradeInPossible, financingPossible, conditionReport | trade in, financing, a condition report | every vehicle row |
condition, delivery, itemAttributes, buyerProtection | Marktplatz: condition (Neu), handover, every attribute of the ad page, PayLivery | condition, handover and attributes 8 of 8 with a full record; buyer protection every Marktplatz row |
Jobs
| Field | What it is | Filled on (measured) |
|---|---|---|
jobId, jobUuid, url, title | willhaben's job id, the job's link, its title | every row |
companyName, companyId, companyJobsUrl, companyLogoUrl | the employer and its willhaben employer page | 270 of 270 (logo 264) |
location, locations, state, country | where the job is | location 270 of 270; state and country 159 of 270 (a town below district level gets none) |
salary, salaryPeriod, salaryPeriodText, overpay | the single amount willhaben shows, its period (month, year, hour), willhaben's wording, the overpay flag | salary 257 of 270 (225 a month, 21 an hour, 11 a year); overpay true on 124 |
employmentModes, employmentTime, position | Vollzeit, Teilzeit ...; from when; the position level | 270, 269 and 270 of 270 |
publishedAt, lastReorderAt, lastModifiedAt, createdAt | first publication, the last reorder and change, creation (Vienna times as UTC) | 270 of 270 |
isTopJob, isBrandNew, internalApplication | willhaben's paid top job, brand new, apply on willhaben | every row; top jobs 12 of 270 |
description | the job text: on search rows only for top jobs | 12 of 270 search rows; 5 of 5 with a full record |
companyVatId, companyIndustry, companyEmployeesFrom, companyEmployeesTo, companyFoundingYear, companyWebsite, companyAddress, companyActiveAds, companyType | company facts of the full record | VAT id, website, address 5 of 5; industry, size, founding year 4 of 5 |
expiresAt, applyUrl, externalApplication | end date and the apply link | 5 of 5 with a full record |
contactName, contactEmail, contactPhone, contactSalutation | the job's contact person | only with Include personal data |
On every row
detailsIncluded (whether the full record was read), source (search, link, employer), searchKey, searchLabel,
positionInSearch, contentHash (a short hash of title, price and text, to tell a changed row from an unchanged one), change
(monitor runs with Track changes), possibleRepostOf and isRepost (with Mark reposts), monitorName, deliveryId,
actorRunId, actorTaskId, scrapedAt. With Extract contacts from texts: emails, phoneNumbers, websites,
socialProfiles. With Include raw data: raw (willhaben's own search row and full record).
A search row (shortened; a private seller, personal data off, run IrGNo2zqp4g2Y8oTO):
{"type": "listing", "section": "immobilien", "subSection": "Wohnung mieten","adId": "1207135601","url": "https://www.willhaben.at/iad/immobilien/d/mietwohnungen/wien/wien-1150-rudolfsheim-fuenfhaus/nachmieter-gesucht-moderne-1-zimmer-wohnung-nahe-schoenbrunn-32-m-vollmoeblierte-uebernahme-moeglich-1207135601/","title": "Nachmieter gesucht | Moderne 1-Zimmer-Wohnung nahe Schönbrunn | 32 m² | Vollmöblierte Übernahme möglich","price": 596.57, "priceText": "€ 596,57", "pricePerSquareMeter": 18.64,"postcode": "1150", "location": "Wien, 15. Bezirk, Rudolfsheim-Fünfhaus", "state": "Wien","latitude": 48.19, "longitude": 16.32, "coordinatesRounded": true,"publishedAt": "2026-10-20T20:27:18.321Z", "isBumped": false, "status": "active","sellerType": "private", "sellerId": null, "sellerName": null, "imageCount": 7,"propertyType": "Wohnung", "livingAreaM2": 32, "rooms": 1, "floor": "1","detailsIncluded": false, "source": "search", "searchLabel": "in Wohnung mieten"}
A car with its full record (shortened; a private seller, personal data off, run Jj2jrM94lHNISSI1x):
{"type": "listing", "section": "auto", "subSection": "Gebrauchtwagen", "adId": "1312174365","title": "VW Golf Variant Comfortline 1.6 TDI BlueMotion DSG Kombi / Family Van","price": 6800, "postcode": "6179", "location": "Ranggen", "district": "Innsbruck-Land", "state": "Tirol","sellerType": "private", "sellerName": null, "sellerMemberSince": "2022-06-07T22:00:00.000Z","firstPublishedAt": "2026-10-06T19:00:14.000Z", "publishedAt": "2026-10-20T19:00:08.000Z","make": "VW", "model": "Golf", "modelSpecification": "Variant Comfortline 1.6 TDI BlueMotion DSG","firstRegistrationYear": 2015, "mileageKm": 24900, "fuel": "Diesel", "transmission": "Automatik", "powerKw": 77,"bodyType": "Kombi / Family Van", "condition": "Gebrauchtwagen", "owners": 3, "warranty": false,"equipment": ["Regensensor", "Freisprecheinrichtung", "Nichtraucherfahrzeug", "Mittelarmlehne"],"detailsIncluded": true}
A job with its full record (shortened, run ZtV5UJQcuqleOkIl6):
{"type": "listing", "section": "jobs", "jobId": "13282518","url": "https://www.willhaben.at/jobs/job/kuechenleitung-m-w-d/13282518","title": "Küchenleitung (m/w/d)", "companyName": "Mömax Österreich GmbH", "companyVatId": "ATU63841588","location": "Wien, 21. Bezirk, Floridsdorf", "state": "Wien","salary": 3500, "salaryPeriod": "month", "salaryPeriodText": "monatlich", "overpay": false,"employmentModes": ["Vollzeit"], "employmentTime": "ab sofort", "position": "Gruppen-/Teamleitung","publishedAt": "2026-10-20T08:31:04.000Z", "expiresAt": "2027-10-19", "externalApplication": true,"contactName": null, "detailsIncluded": true}
The coverage row of each search says which filters were sent (filtersSent), how many ads willhaben counts for it
(adsOnWillhaben), how many pages and rows were read, how many ads were met and delivered, how many were left out and by which
filter (filteredOutBy), how many a monitor already knew (knownToMonitor), whether the search was read to its end (complete) and
why it stopped (stoppedBy). From a real run (houses for rent in Burgenland up to 1,200 euros, the first run of a monitor, run
Dk4xVVKRZd2YO8U57):
{ "type": "search", "searchLabel": "in Haus mieten", "section": "immobilien", "sort": "newest first (last published or bumped)","filtersSent": ["areaId=1", "PRICE_TO=1200"], "adsOnWillhaben": 90, "pagesRead": 1, "rowsRead": 90, "distinctAdsMet": 90,"adsBeyondReach": 0, "adsDelivered": 90, "alreadyDelivered": 0, "knownToMonitor": 0, "changesDelivered": 0, "filteredOut": 0,"filteredOutBy": {}, "removedOrGone": 0, "detailsFailed": 0, "newAdsMayLieBeyond": false, "complete": true, "stoppedBy": "end" }
How much does it cost to scrape willhaben?
You pay per event, with Apify's store discounts by plan:
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Listing (one ad or job row) | $0.99 per 1,000 | $0.99 per 1,000 | $0.98 per 1,000 | $0.845 per 1,000 |
| Listing details (a full record read and merged into a row) | $3.50 per 1,000 | $3.20 per 1,000 | $2.90 per 1,000 | $2.50 per 1,000 |
| Results page (monitor runs only, one search page of up to 200 ads or 90 jobs) | $4.20 per 1,000 | $3.80 per 1,000 | $3.50 per 1,000 | $3.00 per 1,000 |
| Actor start (once per run) | $0.0075 | $0.0075 | $0.0075 | $0.0075 |
Platinum and Diamond plans pay the Gold price. The Actor start is a flat fee per run, with no plan discount.
The Store pricing card shows these prices per 1,000 events: "$0.99 / 1,000" on the Listing row means one ad or job row costs $0.00099, less than a tenth of a cent.
- Listing is charged once per ad or job delivered as a row, from a search, a seller, an employer page or a link. In a monitor with Track changes it is also charged per row delivered again because it changed or came back, and per removed row; with Deliver unchanged ads too, per unchanged row.
- Listing details is charged per delivered row whose full record was read and merged: with Include details on, and on every ad and job link row (a link is always read with its full record, so it pays Listing plus Listing details). A removed or unknown record is free.
- Results page is charged only in a monitor run (Monitor name set): one per search page read, whatever it held, so a monitor pays for checking even on a day with nothing new. A read that failed or that willhaben did not apply is free. Runs without a monitor never pay it.
- Never billed: repeats in the run, rows left out by a filter, ads a monitor already delivered, removed or unknown links, invalid input, coverage rows, status rows, the summary and every notification.
- Example on the Bronze plan: 1,000 search rows cost $0.0075 (start) + 1,000 listings ($0.99) = $0.9975. The Free plan pays the same; the Silver plan $0.9875, the Gold plan $0.8525.
- Example with full records on the Gold plan: 100 flats cost $0.0075 + 100 listings ($0.0845) + 100 listing details ($0.25) = $0.342.
- Example of 50 ad links on the Gold plan: $0.0075 + 50 listings ($0.04225) + 50 listing details ($0.125) = $0.17475.
- Example of a daily monitor run on the Gold plan whose search holds fewer than 200 ads, 20 of them new: start ($0.0075) + 1 results page ($0.003) + 20 listings ($0.0169) = $0.0274. A day with nothing new: $0.0105 (measured: the second run of the monitor above, run 7jlCBiHLhjunC48z2, charged 1 start and 1 Results page and delivered 0 rows, the 90 known houses free).
- The prefilled run of 20 Vienna rentals costs $0.0075 + 20 listings ($0.0198) = $0.0273 on the Free plan.
- A run without a monitor that delivers nothing (a keyword with no ads, a filter no ad passes) pays only the start: $0.0075.
Input
| Setting | What it does |
|---|---|
sections | marktplatz, immobilien, auto, jobs: each searched on its own, once per keyword. Left empty, the section comes from the section settings you give, else Marktplatz. |
keywords | Search words, each its own search (up to 200, 100 characters each). |
propertyTypes | Immobilien: all, mietwohnungen, eigentumswohnung, haus-mieten, haus-kaufen, grundstuecke, neubauprojekte, gewerbe-mieten, gewerbe-kaufen, ferien-mieten, ferien-kaufen, sonstige, each its own search. |
vehicleTypes | Auto & Motor: cars, motorbikes, commercial, caravans (default cars; with sellers all four). |
marktplatzCategories | A Marktplatz category by its willhaben name or id: a top category (Sport / Sportgeräte) or one of its sub categories (Fahrräder / Radsport). |
states, districts | The nine states and andere Länder; districts and the towns that are districts (Graz, St. Pölten, Graz-Umgebung), Vienna's districts as 1030, Wien 3 or Landstraße. Case, umlauts written out and hyphens do not matter. |
latitude, longitude, radiusKm | A point in Austria and a radius of 1 to 300 km: ads farther away or without a map point are left out free (with no sort chosen, ad searches then read nearest first); job searches send the radius to willhaben. |
minPrice, maxPrice, sellerType | Price (for rentals the rent) in euros; private or business sellers (at willhaben on Marktplatz and Auto & Motor, checked row by row on Immobilien). |
postedWithinDays, postedAfter, postedBefore | willhaben's own window (1 to 365 days; jobs 1, 3 or 7), and dates (YYYY-MM-DD, Vienna time) checked on every row. |
minLivingArea, maxLivingArea, minPlotArea, maxPlotArea, rooms, objectTypes, outdoorAreas, propertyFeatures, availableNow, newBuildOnly | Immobilien filters as willhaben names them (Dachgeschoßwohnung, Balkon, Einbauküche ...). |
makes, models, minYear, maxYear, minMileageKm, maxMileageKm, minPowerKw, maxPowerKw, fuelTypes, transmissions, bodyTypes, vehicleConditions | Auto & Motor filters (VW, Golf, Diesel, Automatik, Kombi / Family Van, Jahreswagen ...). |
marktplatzCondition, delivery, buyerProtectionOnly | Marktplatz: condition (Neu, Gebraucht ...), pickup or shipping, PayLivery only. |
jobFields, employmentTypes, positionLevels, employerType | Jobs: fields of work and their sub fields, Vollzeit, Teilzeit ..., position levels, direct employers or staffing agencies. |
minSalary, maxSalary, salaryPeriod | Jobs: a salary range checked on every job row, per month (default), year or hour; monthly and yearly pay compared at 14 salaries a year. Jobs without a salary are left out free. |
attributeFilters | Any other filter of the search's own willhaben filter list by its German label or id: {"Farbe": ["Schwarz"], "Anzahl der Sitze": {"min": 7}}. |
sort | Left empty: newest first (nearest first with a radius; a pasted link keeps its own order). Or newest, relevance, priceLow, priceHigh, nearest, areaLow, areaHigh, mileageLow, mileageHigh, yearNew, yearOld; jobs newest or relevance. |
includeKeywords, requireAllKeywords, excludeKeywords, titleOnly, excludeAdIds | Whole words the title or description must hold (one or all) or must not hold, in the title only if you like; ad or job ids you already have. Checked on every row. |
searchUrls | willhaben search links of any section (/iad/... and /jobs/suche), read with all their filters (up to 200). |
sellerIds | A seller's number (ORGID) or a private seller's profile link: the seller's ads in Marktplatz, Immobilien and Auto & Motor (up to 200). |
employerUrls | Employer pages (https://www.willhaben.at/jobs/firma/<name>/<id>): all open jobs of each (up to 200). |
adUrls | Ad links, ad ids or job links (up to 5,000), each read with its full record. A removed or unknown one is free and gets a status row, up to the run's budget of free rows (20 plus one per billed event); past it the summary counts them. |
maxItems, maxItemsPerSearch, maxPagesPerSearch, maxRowsPerSearch | Paid rows per run (default 100), rows per search, pages per search, rows read per search (a monitor's window, 200 by default). |
includeDetails, includePersonalData, includeRawData | Full records (billed as Listing details), the personal data switch, willhaben's own objects. |
descriptionFormat, descriptionMaxLength, compactOutput, excludeEmptyFields, extractContacts, phoneExtractionMode | Description as html (default), text, markdown or all; a length cut; core fields only; empty fields left out; e-mails, phones, websites and social profiles found in the texts, phones strict or lenient. |
monitorName, resetMonitor, trackChanges, emitUnchanged, markReposts, skipReposts | The monitor (below). |
telegramBotToken, telegramChatId, slackWebhookUrl, discordWebhookUrl, whatsappAccessToken, whatsappPhoneNumberId, whatsappTo, webhookUrl, webhookSecret, webhookHeaders, notificationLimit, notifyOnlyChanges | Free notifications of the rows a run delivered (below). |
failIfIncomplete, maxFailedRequestsPercent, proxyConfiguration, requestsPerSecond, maxConcurrency, maxRequestRetries | Fail the run when a search is incomplete or too many reads failed; your own proxy links; the pace of each of the two exits (0.2 to 2 requests a second, default 1), requests in flight (1 to 4, default 2), retries of a failed answer (0 to 5, default 2). |
A run reads at most 200 searches (sections times their types times keywords, plus search links, sellers and employer pages).
Every filter is checked
willhaben ignores a filter it does not know without saying so and answers the whole search. So every filter this Actor sends must come back in willhaben's own answer; when one does not, the search delivers nothing and a free row names the filter. A filter value the search's own filter list does not offer (a make, a district, a category) is a free row that lists the values it does offer, and the search delivers nothing: an unknown value never widens a search. Every range and the seller type sent are checked again on every row and on the full record. willhaben's paid first slot (a dealer's or agency's ad on top of the first page, which can ignore the filters sent) is left out free; when that ad does match your search, it is delivered at its own place in the list.
Depth and order
Ad searches read pages of up to 200 ads, jobs pages of 90. willhaben serves at most 199,800 ads of one search (999 pages); newest
first, the default, reads past it by willhaben's own date ranges, every ad once. Other orders end at the 199,800 ads, and the
coverage row counts the ads beyond (adsBeyondReach). Newest first follows willhaben's publish or bump time, so an older ad that
was bumped today stands among today's ads (isBumped).
Full records
With Include details on, each delivered row's full record is read and merged: the whole description, every attribute, the seller's member since date and ad count, a business seller's phone, address, website and opening hours, the ad's municipality, property costs and energy figures, floor plans, car equipment, Marktplatz item attributes, and for jobs the company facts (VAT id, industry, size, founding year), the end date and the apply link. It is billed as Listing details, per row whose record was read and merged. Ad and job links are always delivered with their record.
Monitor: only new ads, with price changes and alerts
Give the run a Monitor name and schedule it. Each run reads the newest 200 rows of every search (Rows read per search),
pays a Results page per page read (one page of up to 200 ads for an ad search, up to three pages of 90 for a jobs search), and delivers only the ads
and jobs this monitor never delivered before; each is delivered and billed once per monitor, and the ones it knows are free. With
Track changes, a known ad comes again when its price changed (priceChanged, with the previous and the first seen price and a
price history), its title, images or place changed (updated) or it came back (reappeared), and when a run read every search to
its end, each tracked ad it no longer met is a removed row (held back when more than half and more than 5 are missing at once).
Mark reposts marks a new ad whose title, price and seller match one the monitor delivered (possibleRepostOf); Skip reposts
leaves them out free. Reset the monitor starts it empty. One monitor name belongs to one set of settings: a run with other
settings under the same name delivers nothing and says why. A monitor remembers up to 60,000 ads and jobs.
Notifications are free and list the rows the run delivered, in a monitor run or any other: Telegram through your own bot (one
message per row, up to Rows per message rows, default 10, at most 30, then a line naming the rest), one Slack, Discord or
WhatsApp Cloud API message listing up to that many rows, and a webhook that receives up to 1,000 rows per run in JSON batches of
100, signed with HMAC SHA-256 (header x-signature-sha256) when you give a secret, with up to 10 headers of your own. Notify only
new and changed leaves unchanged rows out. A failed notification never fails the run.
Personal data
With Include personal data off (the default), a private seller's ad has its seller id, seller name and street null, its map point rounded to about 1 km and the distance in whole kilometres, and those attributes are left out of
attributes; the contact person's name of any ad (a business's included) and a job's contact person (name, e-mail, phone) are
null (contactName, contactEmail, contactPhone, contactSalutation); contacts found in the texts of private ads and job ads
(Extract contacts from texts) are null, and so are the raw copies of a private ad and of a job (raw). Turning the switch on adds
all of these, the exact map point and the distance to 10 m. Contacts found in a business ad's own text (an agent's work e-mail or
mobile number) are business contact details and are delivered with the switch off. A seller whose kind is not known is treated
as private. A business seller's data (dealers, agencies, shops: name, phone, address, website, opening hours) is business data and
always delivered. Titles and descriptions are delivered exactly as willhaben serves them, so an ad's own text can name a person or
give a phone number. You are responsible for a lawful use of personal data, GDPR included.
How long a run takes
Searches go through Apify's datacenter proxy on one sticky session; willhaben's www pages (full records, job searches, employer pages) through one Apify residential session in Austria, included in the price. Each of the two exits keeps its pace (Requests per second, default 1, with 2 in flight). Measured on the platform:
- Search rows are fast: 600 Marktplatz rows in 8 seconds (5 requests), 270 jobs in 7 seconds (3 pages of 90), the 20 row prefill in 4 seconds.
- Full records take about a second each at the default pace: 60 flats for sale with their records in 74 seconds, 10 cars in 22 seconds, 5 jobs in 9 seconds. So 1,000 rows with full records take about 20 minutes.
- 5 ad links (3 ads, 2 unknown ids) took 13 seconds; a monitor's second run with nothing new took 5 seconds.
When willhaben refuses a request, the Actor pauses and asks once more on the same address; a second refusal in a row stops that source with a free status row. It never switches to fresh addresses to get past a refusal (only a broken proxy connection draws a new session, at most twice a run per exit). What was delivered stays delivered, and every search or link not reached is free and counted (a status row each, up to the run's budget of free rows).
What this Actor does NOT do
- No other sites. Only willhaben.at.
- No login and no account data. No saved searches (Suchagent), favourites or messages are read; nothing is posted, no message or contact form is sent.
- No hidden phone numbers. A business seller's phone comes from the full record when willhaben shows it; private sellers show none, and nothing behind a click or a login is read.
- No photo downloads. Photo links only.
- No salary range for jobs. willhaben shows one amount per job;
salaryis that amount, with no maximum. - No radius filter at willhaben for ads. The radius is checked on each row from the ad's map point, which can be the centre of its place rather than its address (in a 3 km search around Stephansplatz all 10 measured rows stood 0.01 km from it), and a private seller's point is rounded to about 1 km with personal data off.
- No view counts. willhaben shows none in the data this Actor reads.
- No pasted links sorted by distance. A willhaben link with its own
sort=2,latandlonis refused with a free row; set Latitude, Longitude and Radius instead (with no sort chosen, the search is then read nearest first). - No Notion connector input. Apify's own integrations send a run's dataset to Notion, Google Sheets and others, and the free webhook, Slack, Discord, Telegram and WhatsApp alerts cover the same destinations.
- No unpaid crawling. A run stops with a status row when its unpaid work (pages whose rows were all filtered out or already delivered, removed or unknown links, the reads that check a search's filters) passes a small budget (USD 0.0012 plus a share of every billed event): narrow the search or loosen the filters checked on each row.
API and integrations
Run it and get the rows in one call (replace YOUR_TOKEN):
curl -X POST "https://api.apify.com/v2/acts/automation_craft~willhaben-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"sections": ["immobilien"], "propertyTypes": ["eigentumswohnung"], "districts": ["Graz"], "minLivingArea": 50, "maxPrice": 400000, "maxItems": 100}'
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('automation_craft/willhaben-scraper').call({ sections: ['auto'], makes: ['VW'], models: ['Golf'], fuelTypes: ['Diesel'], sellerType: 'private', minYear: 2015, includeDetails: true, maxItems: 50 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((x) => x.type === 'listing'));
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation_craft/willhaben-scraper").call(run_input={"sections": ["jobs"], "keywords": ["koch"], "states": ["Wien"], "monitorName": "koch-wien", "includeDetails": True})jobs = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "listing"]
The Actor also runs from n8n, Make and Zapier through their Apify integrations, from AI agents through Apify's MCP server, and on a schedule in the Apify Console.
FAQ
How can I scrape willhaben listings?
Pick a section (Marktplatz, Immobilien, Auto & Motor or Jobs), type keywords or paste a willhaben search link, set Maximum rows and start the run: no code, no login and no proxy setup. Each ad or job comes as one row with its price or salary, place, seller type and the section's own facts, as JSON, CSV or Excel or through the Apify API.
Is there a willhaben API?
willhaben documents no public API for its ads and jobs. This Actor works as one: call it through the Apify API with sections,
keywords, filters, search links, sellers, employer pages or ad links and read the rows back as JSON, in one call with
run-sync-get-dataset-items.
How do I get alerts for new willhaben ads?
Give the run a Monitor name and schedule it: each run delivers only the ads and jobs this monitor never delivered before and can send them to Telegram, Slack, Discord, WhatsApp or your own webhook at no extra charge, with no willhaben account. A monitor run pays a Results page per search page it checks, so a day with nothing new costs the start fee plus those reads.
Can I export willhaben property listings to Excel?
Yes. Download the run's dataset as Excel, CSV, JSON or XML from the Output tab or the API. Rental and sale rows carry price, price per m2, living area, rooms, postcode and district; with Include details also net rent, running costs, commission text and the energy figures (HWB, fGEE).
Do willhaben job rows include the salary?
Yes, when willhaben shows one: the job row carries the single amount willhaben shows (salary), its period (month, year or hour)
and the overpay flag; 257 of 270 measured job rows had a salary. Minimum salary and Maximum salary are checked on every job
row, monthly and yearly pay compared at 14 salaries a year.
Why does this Actor run with limited permissions?
It needs nothing more: it writes only to its own run's dataset and key-value store, and a monitor keeps its memory in a named key-value store it creates itself. Limited permissions keep your other Apify data out of its reach.
Changelog
- 0.1 (2026-10-21): first release: Marktplatz, Immobilien, Auto & Motor and Jobs in one run; keywords, the site's filters checked against its own answer, search links, sellers, employer pages, ad and job links; every range and the seller type checked on each row; newest first past 199,800 ads; full records; a monitor with change tracking, removals, reposts and free notifications; private sellers' data behind the personal data switch.
More data tools by Automation Craft
- Kleinanzeigen Scraper & API: Ads, Prices, Places
- Marktplaats Scraper: Ads, Cars, Sellers & Alerts
- Leboncoin Scraper: Ads, Prices, Real Estate & Cars
- Immowelt Scraper: Rents, Prices and Energy Data
- Kijiji Scraper: Listings, Cars, Rentals & Prices
- Craigslist Scraper: Listings, Prices & Alerts
- OfferUp Scraper: Local Listings, Prices, Sellers
- Mercari US Scraper: Listings, Sold Prices
- AutoScout24 Scraper: EU Car Listings & Prices
- Mobile.de Scraper: Cars, Prices, Dealers & Ratings