willhaben Scraper: Immobilien, Cars, Jobs & Ads avatar

willhaben Scraper: Immobilien, Cars, Jobs & Ads

Pricing

from $0.85 / 1,000 listings

Go to Apify Store
willhaben Scraper: Immobilien, Cars, Jobs & Ads

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

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

  1. Open the Input tab and pick the Sections: marktplatz, immobilien, auto, jobs (several at once if you like).
  2. Narrow them: Property types such as mietwohnungen or haus-kaufen, Vehicle types, Marktplatz categories (Fahrräder / Radsport), Keywords (fahrrad, 3 zimmer balkon, golf 7), States (Wien, Steiermark) and Districts (Graz, 1030 or Wien 3).
  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.
  4. 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)

FieldWhat it isFilled on (measured)
adId, adUuid, url, title, section, subSectionwillhaben's ad id, the ad's link and title, the section and sub section (Wohnung mieten, Gebrauchtwagen)every row
descriptionSnippet, descriptionCompletethe text the search shows (cut at about 257 characters with "..."), and whether it is the whole descriptionevery 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 markdownevery row with a full record (60 of 60, 10 of 10, 8 of 8)
price, priceText, currencyprice 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, priceReducedAtthe earlier price of a reduced ad and the day it was reduced45 of 600 fahrrad
pricePerSquareMeterprice per m220 of 20 rentals, 56 of 60 flats for sale
postcode, location, district, state, countrywhere the ad ispostcode 600 of 600, district 573 of 600, state 599 of 600 fahrrad; every Immobilien row
municipalitythe municipalitywith a full record (60 of 60)
latitude, longitude, coordinatesRoundedthe ad's map point; rounded to 2 decimals (about 1 km) on a private seller's ad with personal data off597 of 600 fahrrad, every Immobilien row
distanceKmthe distance from your Latitude and Longitude10 of 10 with a point given (run Ad3n04nDYOD3nQ6b1); empty without one
streetthe ad's street: business sellers' ads, private ones only with Include personal data146 of the 210 business ads of fahrrad, 0 of the 390 private ones
publishedAt, isBumpedthe last time the ad was published or bumped, and whether it was bumpedevery row; bumped 54 of 60 flats for sale
firstPublishedAt, createdAtthe first publication and the creation timewith a full record (60 of 60)
changedAt, endsAtlast change and the end of the ad's run time600 of 600 Marktplatz search rows; with a full record on every section
isTopAd, statuswillhaben's top ad and the status (active, reserved)every row; reserved 2 of 90 houses
sellerTypeprivate or businessevery row (210 business of 600 fahrrad, 17 of 20 rentals)
sellerId, sellerNamethe seller's number (ORGID) and name: business sellers always, private ones with personal data on210 of 600 fahrrad, 17 of 20 rentals (the business sellers)
sellerMemberSince, sellerActiveAdssince when the seller is on willhaben and how many ads they haveevery row with a full record
sellerPhone, sellerAddress, sellerWebsite, sellerProfileUrl, sellerLogoUrl, sellerOpeningHours, sellerEmaila business seller's contact data from the full recordphone 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, thumbnailUrlphoto links (never downloaded)597 of 600 fahrrad, every Immobilien row
floorPlans, attachmentsfloor plan and attachment links of the full recordfloor plans 1 of 60 flats for sale
categoryIds, categoryPath, teaserwillhaben's category ids and names, the short facts the search showscategory names 600 of 600 fahrrad; Immobilien search rows carry ids only, the names come with a full record
attributesevery willhaben attribute of the row (personal ones behind the switch)every row
propertyType, livingAreaM2, rooms, usableAreaM2, floor, outdoorAreas, outdoorAreaM2, projectId, virtualTourUrlImmobilienrooms 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, ownershipTypeImmobilien money facts of the full recordnet 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, featuresenergy figures and the building, from the full recordHWB 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, conditionAuto & Motor10 of 10 cars; motorbike search rows 10 of 10 (fuel 9)
firstRegistrationYear, firstRegistrationMonth, transmission, owners, seats, doors, colour, warranty, drive, equipmentmore car facts10 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, conditionReporttrade in, financing, a condition reportevery vehicle row
condition, delivery, itemAttributes, buyerProtectionMarktplatz: condition (Neu), handover, every attribute of the ad page, PayLiverycondition, handover and attributes 8 of 8 with a full record; buyer protection every Marktplatz row

Jobs

FieldWhat it isFilled on (measured)
jobId, jobUuid, url, titlewillhaben's job id, the job's link, its titleevery row
companyName, companyId, companyJobsUrl, companyLogoUrlthe employer and its willhaben employer page270 of 270 (logo 264)
location, locations, state, countrywhere the job islocation 270 of 270; state and country 159 of 270 (a town below district level gets none)
salary, salaryPeriod, salaryPeriodText, overpaythe single amount willhaben shows, its period (month, year, hour), willhaben's wording, the overpay flagsalary 257 of 270 (225 a month, 21 an hour, 11 a year); overpay true on 124
employmentModes, employmentTime, positionVollzeit, Teilzeit ...; from when; the position level270, 269 and 270 of 270
publishedAt, lastReorderAt, lastModifiedAt, createdAtfirst publication, the last reorder and change, creation (Vienna times as UTC)270 of 270
isTopJob, isBrandNew, internalApplicationwillhaben's paid top job, brand new, apply on willhabenevery row; top jobs 12 of 270
descriptionthe job text: on search rows only for top jobs12 of 270 search rows; 5 of 5 with a full record
companyVatId, companyIndustry, companyEmployeesFrom, companyEmployeesTo, companyFoundingYear, companyWebsite, companyAddress, companyActiveAds, companyTypecompany facts of the full recordVAT id, website, address 5 of 5; industry, size, founding year 4 of 5
expiresAt, applyUrl, externalApplicationend date and the apply link5 of 5 with a full record
contactName, contactEmail, contactPhone, contactSalutationthe job's contact persononly 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:

EventFree planBronzeSilverGold
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

SettingWhat it does
sectionsmarktplatz, immobilien, auto, jobs: each searched on its own, once per keyword. Left empty, the section comes from the section settings you give, else Marktplatz.
keywordsSearch words, each its own search (up to 200, 100 characters each).
propertyTypesImmobilien: all, mietwohnungen, eigentumswohnung, haus-mieten, haus-kaufen, grundstuecke, neubauprojekte, gewerbe-mieten, gewerbe-kaufen, ferien-mieten, ferien-kaufen, sonstige, each its own search.
vehicleTypesAuto & Motor: cars, motorbikes, commercial, caravans (default cars; with sellers all four).
marktplatzCategoriesA Marktplatz category by its willhaben name or id: a top category (Sport / Sportgeräte) or one of its sub categories (Fahrräder / Radsport).
states, districtsThe 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, radiusKmA 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, sellerTypePrice (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, postedBeforewillhaben'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, newBuildOnlyImmobilien filters as willhaben names them (Dachgeschoßwohnung, Balkon, Einbauküche ...).
makes, models, minYear, maxYear, minMileageKm, maxMileageKm, minPowerKw, maxPowerKw, fuelTypes, transmissions, bodyTypes, vehicleConditionsAuto & Motor filters (VW, Golf, Diesel, Automatik, Kombi / Family Van, Jahreswagen ...).
marktplatzCondition, delivery, buyerProtectionOnlyMarktplatz: condition (Neu, Gebraucht ...), pickup or shipping, PayLivery only.
jobFields, employmentTypes, positionLevels, employerTypeJobs: fields of work and their sub fields, Vollzeit, Teilzeit ..., position levels, direct employers or staffing agencies.
minSalary, maxSalary, salaryPeriodJobs: 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.
attributeFiltersAny other filter of the search's own willhaben filter list by its German label or id: {"Farbe": ["Schwarz"], "Anzahl der Sitze": {"min": 7}}.
sortLeft 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, excludeAdIdsWhole 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.
searchUrlswillhaben search links of any section (/iad/... and /jobs/suche), read with all their filters (up to 200).
sellerIdsA seller's number (ORGID) or a private seller's profile link: the seller's ads in Marktplatz, Immobilien and Auto & Motor (up to 200).
employerUrlsEmployer pages (https://www.willhaben.at/jobs/firma/<name>/<id>): all open jobs of each (up to 200).
adUrlsAd 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, maxRowsPerSearchPaid rows per run (default 100), rows per search, pages per search, rows read per search (a monitor's window, 200 by default).
includeDetails, includePersonalData, includeRawDataFull records (billed as Listing details), the personal data switch, willhaben's own objects.
descriptionFormat, descriptionMaxLength, compactOutput, excludeEmptyFields, extractContacts, phoneExtractionModeDescription 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, skipRepostsThe monitor (below).
telegramBotToken, telegramChatId, slackWebhookUrl, discordWebhookUrl, whatsappAccessToken, whatsappPhoneNumberId, whatsappTo, webhookUrl, webhookSecret, webhookHeaders, notificationLimit, notifyOnlyChangesFree notifications of the rows a run delivered (below).
failIfIncomplete, maxFailedRequestsPercent, proxyConfiguration, requestsPerSecond, maxConcurrency, maxRequestRetriesFail 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; salary is 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, lat and lon is 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 ApifyClient
client = 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