Willhaben Scraper — Marktplatz, Autos, Immobilien & Jobs avatar

Willhaben Scraper — Marktplatz, Autos, Immobilien & Jobs

Pricing

$0.60 / 1,000 results

Go to Apify Store
Willhaben Scraper — Marktplatz, Autos, Immobilien & Jobs

Willhaben Scraper — Marktplatz, Autos, Immobilien & Jobs

Scrape willhaben.at, Austria's biggest marketplace: Marktplatz, Autos, Immobilien & Jobs. Search by keyword or willhaben URL, look up ads by ID, or monitor listings for new ads and price drop. No browser, 100 listings per request.

Pricing

$0.60 / 1,000 results

Rating

0.0

(0)

Developer

Luca Haid

Luca Haid

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

willhaben-scraper

The fastest willhaben.at scraper on the Apify Store — and the best price among production-grade competitors ($0.60/1k vs $0.89–1.00+ elsewhere; the handful of $0.05/1k listings are abandoned bait listings with 1–3 users). Search classifieds, look up ads by ID, and monitor listings for price drops, in one actor. Austria's biggest marketplace (kleinanzeigen.at's Austrian counterpart): ~95k+ marktplatz ads, 20k+ immo listings, cars, jobs.

Why the price is low (and why that's not a red flag)

This actorTypical browser-based scrapers
Requests per 100 listings130–300
Traffic per listing~0.7 KB~300 KB–1 MB
Proxy cost per 1k rows~$0.005~$2–8
Browsernoneyes

We read the same JSON the willhaben mobile app consumes (ad-search.willhaben.at, 100 rows per request) and fall back automatically to the JSON embedded in willhaben.at web pages. No browser, no selector scraping — the data is a plain JSON document that would break willhaben's own frontend if it changed. That's why our low price is sustainable, not a race to the bottom.

Features

  • Search — keyword and/or any willhaben.at search URL (all categories: marktplatz, immobilien, cars, jobs, …). Category URLs are automatically upgraded to the fast mobile-API path including all filter parameters already set in the URL (price, rooms, area, state, category tree …).
  • Filters — native priceMin/priceMax, sellerType (private/commercial), sortBy (newest / priceAsc / priceDesc), plus free passthrough of any willhaben filter param via searchUrl.
  • Ad lookup by ID — one request per ad, full detail including all listing attributes.
  • Price-drop monitor — scheduled runs report only changes since the last run: new, priceDropped, priceIncreased, updated (title/body edited), reappeared (relisted within 30 days), delisted. Zero-change runs exit cleanly (schedule-friendly).
  • Vertical attributes — cars: mileage, year, fuel, transmission, owners, dealer flag. Immobilien (search and detail level): rooms, living area, €/m², floor + surface, building type, property type, ownership, energy HWB + class, rent net/gross, operating + additional costs, free area (balcony/garden) type and size.
  • Lead-gen option — includeSellerData opt-in adds seller identity (name, company, address, coordinates, org ID, type), contact attributes on detail lookups (phone, website, contact person), enrichSellerProfile adds profile + public trust signals (star rating, rating count, reply time, member since — per unique seller), and sellerContactFromDetails pulls contact data into search runs (up to 10 detail fetches).
  • Agents (MCP / Actor-as-tool) — small input, typed output, budget-stop via pay-per-event; a $5 prepaid budget buys ~5,800 rows.

GDPR

Listings data only. Ad ID, title, description, price, listing attributes, district/postcode location, image URLs, listing URL. No seller names, no phone numbers, no emails, no street addresses, no coordinates, no profile URLs — these fields are stripped at the parser level and can never reach the dataset. Commercial-vs-private is a boolean flag only.

Input

FieldTypeDefaultDescription
modeselectsearchsearch (keyword/URL), ids (ad IDs), monitor (diff since last run)
keywordstring—Free-text search, e.g. fahrrad 28 zoll
verticalselectmarktplatzmarktplatz, immobilien, fahrzeuge (used cars), jobs (web platform with salary/company data)
categoryinteger—Numeric willhaben category id → API-only numeric search: 3+2 = used cars, 2+131 = rentals, 1+1 = jobs
searchUrlstring—Any https://www.willhaben.at/iad/... search URL — fastest path, gets the API upgrade automatically
adIdsarray—Mode ids: ad IDs (positive integers)
maxItemsinteger30Max rows (cap 500)
maxPagesinteger1Max pages (cap 10; 100 rows/page via API, 30 via web fallback)
priceMin / priceMaxinteger—Price range filter (EUR)
sellerTypeselectallall, private, commercial
sortByselectrelevancerelevance, newest, priceAsc, priceDesc
changesOnlybooleantrueMonitor: emit only changes
includeSellerDatabooleanfalseGDPR opt-in: add seller name/company/address/coordinates/orgId/sellerType (see below)
enrichSellerProfilebooleanfalseNeeds includeSellerData: + profile fields and public trust signals (rating, ratings count, reply time) — 2 req per unique seller, cap 20/run
sellerContactFromDetailsbooleanfalseNeeds includeSellerData: search/monitor runs fetch up to 10 detail pages to extract public contact attrs (phone, website)
apiToken / visitorIdstringbuilt-inMobile-API credentials override (only if runs start falling back to the web path)

Seller data (opt-in, GDPR)

By default this actor outputs listings data only — safe for EU deployments, no personal data beyond the listing itself.

Set includeSellerData: true to also receive what the public listing payload carries per ad: sellerName, orgName, address, coordinates, orgId, orgUuid, sellerType (private/commercial); detail/ID lookups on commercial ads add sellerPhone and sellerWebsite (the seller's own public contact attributes). Add enrichSellerProfile: true for sellerProfileName, sellerMemberSince, sellerStreet/District/Location/ImageUrl, sellerProfileUrl and the seller's public trust signals: sellerRating, sellerRatings, sellerReplyTime (2 extra requests per unique seller, cap 20/run). In search runs, sellerContactFromDetails: true additionally fetches up to 10 detail pages to fill phone/website.

This is personal data under GDPR. The actor gives you the technical access; your use case determines your lawful basis (legitimate interest for B2B dealer contact data is common; mass-harvesting private sellers' data is not). If you run this for lead generation, document your basis.

Jobs note: the jobs platform (karriere stack) is a separate willhaben product — job searches run on the web path (1 request per 30 listings) and ignore category; job IDs don't work in ids mode.

Not included: private sellers' phone numbers — willhaben gates those behind a logged-in session (per-ad reveal endpoint), which this actor does not automate. Commercial sellers' public contact attributes (phone/website on their own listing detail page) are included with the opt-in.

Output (dataset)

{
"adId": "1257485200",
"title": "Kalkhoff Damenfahrrad 28 Zoll 24 Gang",
"body": "Fahrrad von Kalkhoff. Zustand lt Fotos. …",
"priceAmount": 250,
"priceDisplay": "€ 250",
"location": "Wien, 10. Bezirk, Favoriten",
"district": "Favoriten",
"state": "Wien",
"postcode": "1100",
"country": "Österreich",
"isPrivateSeller": true,
"p2pEnabled": true,
"isBumped": null,
"vertical": "marktplatz",
"images": ["https://cache.willhaben.at/mmo/0/125/748/5200_-1589485132_hoved.jpg"],
"url": "https://www.willhaben.at/kaufen-und-verkaufen/d/kalkhoff-damenfahrrad-…-1257485200/",
"published": "2026-10-19T20:56:58Z",
"lastUpdated": "2026-10-19T20:56:58Z",
"endDate": null,
"scrapedAt": "2026-10-20T07:12:xx.xxxZ",
"change": "priceDropped",
"previousPrice": 280
}

change / previousPrice / firstSeen appear in monitor mode only.

All sections: oldPrice/oldPriceDisplay/priceReductionDate (price drops visible in search), teaser, categoryIds, adTypeId, disposed, weeklyBump, activeUntil.

Car rows add: make, model, modelSpecification, vehicleType, condition, equipment, warranty(+Duration), exteriorColour, doors, seats, wheelDrive, engineVolume/Cylinders/Effect, consumption, co2, emissionStandard, batteryCapacity/wltpRange (EV), leasing* (rate/duration/residual/advance), motorPriceTotal/motorBonus*, conditionReport, defectsLiability.

Job rows add: company, companyId, companyLogoUrl, position, salary + salaryTimeFrame, employmentModes, employmentTime, topJob, brandNew, isExpired, internalApplication.

Immo rows add: rooms, livingAreaSqm, usableAreaSqm, grossAreaSqm, totalAreaSqm, pricePerSqm, floor, floorSurface, buildingType(+Condition), constructionYear, propertyType, ownershipType, heatingType, energyHwb/energyFgee(+classes)/energyEeb, rentNet, rentGross, operatingCostsNet, additionalCostsNet, deposit, commissionFee, availableFrom/Now, virtualTourUrl, freeAreaSqm/Type, project/unit fields (projectId, unitTitle, priceSuggestion…).

Attachments (Expose PDFs): immo rows carry an attachments array (name + URL, up to 10) — populated from the INFOLINK/URL/INFOLINK/NAME attribute pairs that agencies use to attach Expose PDFs (verified live: 7 PDFs on a neubauprojekt; works on search and detail rows). Detail lookups auto-detect the section from the ad's verticalId, so immo IDs return the full immo field set. 3D tours populate virtualTourUrl.

Complete coverage: every attribute we don't map to a typed field still lands in each row's attributes object (name → value) — nothing is lost. Seller-sensitive attributes are excluded from attributes unless includeSellerData is on. Set includeRawAttributes: false for lean rows. Coverage audited 2026-10-20 across marktplatz/zu-verschenken/immobilien-kauf/-miete/gebrauchtwagen (100-row attribute unions + sampled detail pages; tool: tools/attribute-audit.mjs).

Usage examples

  • LKW driver jobs with salary: {"mode": "search", "vertical": "jobs", "keyword": "lkw", "maxItems": 50}
  • Cheapest iPhones: {"mode": "search", "keyword": "iphone", "maxItems": 50}
  • Used cars ≥€3k, cheapest first: {"mode": "search", "vertical": "fahrzeuge", "category": 2, "keyword": "golf", "priceMin": 3000, "sortBy": "priceAsc", "maxItems": 100}
  • Price-watch a bike model (schedule hourly): {"mode": "monitor", "keyword": "pucky fahrrad", "maxItems": 100}
  • Cars in a specific category (paste the URL from your browser): {"mode": "search", "searchUrl": "https://www.willhaben.at/iad/kaufen-und-verkaufen/marktplatz/fahrraeder-radsport/fahrraeder-4552", "maxItems": 200}
  • One ad by ID: {"mode": "ids", "adIds": [1257485200]}

Pricing

Pay per event, one charge per result row.

  • Launch price: $0.60 per 1,000 results for early users.
  • After the launch period the price rises to $0.85 per 1,000 results. Apify notifies users 14 days before any price increase.

Even at $0.85 it's the cheapest willhaben scraper on the Store (next: $0.89–1.00/1k).

One more thing

If this actor saves you money or time, a short Store review genuinely helps a small developer compete with the big shops here. Thank you!

Public listings data via the mobile app's public search API and the public website, no login, no sold/profile/personal data. Rate-limited politely (500 ms between requests). Scraping may be against willhaben's Terms of Service; use for price research, market analysis and personal deal-watching. Don't resell personal data — this actor doesn't output any (see GDPR above).