Willhaben Scraper

Austria's classifieds,
as a spreadsheet.

Give it a willhaben.at search or category URL - or a single listing URL - and get the listings back as rows: the title, the price, the location down to the postcode, the seller, the photos and the listing link. Thirty columns, one row per listing, in the order willhaben returned them.

one-time 500 free rows$0.002 per row after30 columnsCSV · XLSX · JSON
How it works

A search URL in,
its listings out.

The input is the page you would have browsed - a category, a filtered search, or one listing you already have the link to.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Willhaben Scraper.
  3. STEP 3Paste willhaben.at search, category or listing URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query, or leave it at zero to take everything.
  5. STEP 5Choose your output format.
  6. STEP 6Click Get Data.

One row per listing, each tagged with the query it came from - so a run across a dozen searches still reconciles back to your input list.

Why teams use it

A whole category,
in one file.

Search page or single listing

Paste a category or filtered-search URL and get its listings; paste one listing URL and get that listing. Both go one per line, and both can arrive as a CSV, XLSX, TXT or Parquet upload instead of being typed.

The dealer behind the listing

When a listing belongs to a registered dealer, a block of columns comes with it - the company name, a link to the dealer's own willhaben page, eight address fields and a phone number. Nine of those company columns fill on exactly the same rows, and so does the phone. Private listings leave the block empty, and the data dictionary marks which columns those are.

One control, set before the run

A cap on the rows per query, chosen before the job starts, or left at zero to take everything a search returns. There is no sort option on this scraper - listings come back in willhaben's own order, and the JSON records that order as a rank.

What you get back

Thirty columns,
one row per listing.

Each row carries the listing as willhaben shows it: the identifier and link, the title and description, the price and its currency, where the item is, the photos, and - for dealer listings - the company behind it.

The column list below is the header row of real run exports, corroborated by the column array the run UI renders; the two agree exactly. What it deliberately leaves out is row counts: how much comes back depends on the search you point it at, the limit you set and when you run it, so the notes describe what each column holds rather than how full it happened to be on the day we looked.

Data dictionary

Thirty columns in the file,
thirty-one in the JSON.

Taken from the header row of real runs. These notes say what each column holds and which ones come back empty - not how many rows you will get, because that depends on the search you point it at, the per-query limit you set and when you run it.

query
The search, category or listing URL you submitted, repeated on every row that came from it.
id
willhaben’s numeric listing id, as a string of digits. It is also the last segment of listing_url.
author_title
Not a seller name. On a dealer listing it repeats the company name. On a private listing it carries willhaben’s seller-type and warranty badges instead - values such as Privat, Privat, Garantie, Gewährleistung and Gewährleistung, Garantie - and it is sometimes empty.
author_member_since
Never carried a value in any run we made. The column exists in the header row and arrived empty every time.
author_location
The place shown against the seller. In our runs it matched location.
company_name
The registered dealer’s company name. Present only on dealer listings - an empty cell means the advert was placed privately.
company_link
URL of the dealer’s own page on willhaben - a /iad/haendler/ path. Fills with the rest of the company block.
company_address_country
The dealer’s country - Österreich on the Austrian dealers we saw. Fills with the company block.
company_address_postalName
The postal town of the dealer’s address. Fills with the company block.
company_address_street
Street and number of the dealer’s address. Fills with the company block.
company_address_municipality
The dealer’s municipality. Fills with the company block.
company_address_postCode
The dealer’s post code. Note the capital C - it is postCode here and postcode for the listing, and they are different columns.
company_address_state
Never carried a value in any run we made, including on dealer listings that had a full address otherwise. Use state for the listing’s province.
company_address_region
The dealer’s region. Fills with the company block.
company_address_countryId
willhaben’s internal country identifier. It came back as the string -141 - negative, and a string, not a number.
listing_url
Link to the listing’s own page. This column was called url before 2026-07-02.
price
The asking price as a bare string of digits - no thousands separator and no currency symbol.
title
The listing headline.
description
The listing text.
images
All of the photo URLs in one string, joined by a semicolon and a space - not a JSON array, so split on "; " before you use it. How many arrive depends on the listing. This column was called image, and held a single URL, before 2026-07-02.
phone
The dealer’s phone number. Fills and empties with the company block.
currency
The currency of price - EUR on the Austrian listings we saw.
location
The place the item is in.
postcode
The listing’s post code.
state
The Austrian province, in German - Niederösterreich, Steiermark, Wien, Oberösterreich, Salzburg, Kärnten, Tirol, Burgenland or Vorarlberg.
condition
The listing’s condition, in German. In the used-car category we ran it came back as Gebrauchtwagen, Neuwagen or Unfallwagen. Another category will have another vocabulary.
mileage
Vehicle mileage as a bare string of digits. Present on car listings; not verified for a non-vehicle listing.
year
Vehicle year as a string of digits. Present on car listings, though not on every one; not verified for a non-vehicle listing.
fuel
Fuel type, in German - values we saw include Diesel, Benzin, Elektro, Hybrid Elektro/Benzin and Hybrid Elektro/Diesel.
gearbox
Transmission, in German - Automatik or Schaltgetriebe.
position
1-based rank within the query, in willhaben’s own order. JSON only - the CSV and XLSX exports stop at thirty columns. It is also the one field that is a real JSON number; every other value is a string.

Four things to know before you write code against this. Every value is a string except position, which is a JSON integer - so price, mileage, year and postcode all need parsing before you sort or compare them. images is one string holding several URLs joined by "; ", not a list. author_member_since and company_address_state never carried a value in any run we made, so do not build a field around them. And the German vocabularies above come from a used-car category - condition, fuel and gearbox read differently on furniture or property, and the vehicle columns only apply where the category has them. Run the free tier over your own search URLs and read the first file you get.

Run controls

Set on the job,
not in the spreadsheet.

This scraper has one control besides the query box - a cap on the rows per query. The rest of what you decide up front is how you hand over the URLs.

Search or category URL Single listing URL Limit per query Paste one per line CSV upload XLSX upload TXT upload Parquet upload
Common workflows

Three jobs people
most often run here.

A few examples of how teams use Austrian classified listings to answer a question they actually have.

Pricing

Price a category, not a listing

Pull a filtered search and read the whole set at once. Asking prices sit next to the attributes that explain them, and the postcode and province columns let you see how the same item is priced across the country rather than in one town.

Retail · Trade
Dealers

Build a dealer list out of a search

Dealer listings carry the company name, a full address and a phone number, plus a link to that dealer's own willhaben page. One category run turns into a contactable list instead of thirty open tabs.

Sales
Market research

Watch what is actually on offer

Re-run a search over time and compare files. Because every row carries a stable listing id and a rank, you can tell what is new, what has gone and what moved up the page - without keeping the site open.

Research
Pricing

Pay only for the listings
you actually pull.

No subscription, no minimum, no recurring bill. Your first 500 rows are on us - after that, pay-as-you-go at the same flat rate as every other scraper here.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. Per-query limits, file upload and every export format included.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 listings. The pre-flight estimator shows the row count and credit cost before a run starts - no surprise bills, no compute units to translate.

Most popular
Volume

Custom · high volume

Volume pricing, dedicated workers and an SLA for continuous monitoring or very large historical pulls. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

One market,
every listing site.

The legal bit

Is it legal to scrape
willhaben listings?

Short answer: the listings are public classified adverts - and the thing to plan around is that some rows describe identifiable people.

willhaben listings are published to be browsed. The title, the price, the location, the photos and the condition are shown to anyone who opens the search, signed in or not. Collecting publicly visible classified adverts for market research is long-established practice, and nothing here touches a login or a paywall.

Two of these columns deserve care rather than a footnote. Dealer rows carry a company name, a street address and a phone number - business contact data, but contact data all the same, so a marketing list built from it sits under the GDPR and Austrian law like any other. And a private seller's advert is personal data even when no name is attached to it, because a listing plus a postcode plus a photo can identify someone. Aggregate market analysis is ordinary use; profiling an individual seller is not what this is for.

The reference documentation for this scraper notes that willhaben blocks datacenter IP addresses and that live results need a residential proxy. Our own runs are mixed on that point and we have not established the cause, so we report it as their note rather than as our finding. willhaben's terms also restrict automated access, so this is a terms question as well as a legal one. We run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public listing data only
No logins, no accounts touched
Dealer rows carry name, address, phone!
Your IP is never used - ours rotate
Exports auto-delete (30 days)
Check willhaben's own terms before scaling.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

How do I scrape willhaben listings?+
Using the Willhaben Scraper:
  1. Sign in to the platform.
  2. Open the Willhaben Scraper.
  3. Paste willhaben.at search, category or listing URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. Set a limit per query, or leave it at zero to take everything.
  5. Choose your output format.
  6. Click Get Data.
What comes back for each listing?+
Thirty columns: the query, the listing id and its URL, the title and description, the price and currency, the location, postcode and province, the condition, four vehicle attributes, all of the photo URLs, and - on dealer listings - the company name, a link to the dealer's page, eight address fields and a phone number. The JSON adds a thirty-first, position, which the CSV and XLSX exports omit.
Why are the company columns empty on so many rows?+
Because those listings were not placed by a registered dealer. Nine of the ten company_ columns fill together or not at all, and phone fills with them - a row either carries the whole dealer block or none of it. An empty block means a private advert, not a failed collection. The tenth company column, company_address_state, never carried a value in any run we made.
Are any columns always empty?+
Two of them were, in everything we ran. author_member_since and company_address_state never carried a value - including, for the second one, on dealer listings that had a full address otherwise. The columns exist in the header row, so your file will have them; do not build a field around either. Use state for the listing's province.
How do I read the images column?+
As one string, not a list. All of a listing's photo URLs arrive joined by a semicolon and a space, so split on "; " to get them. How many you get depends on the listing. Before 2026-07-02 this column was called image and held a single URL.
Did the columns change recently?+
Yes, on 2026-07-02. Runs before that day exported fifteen CSV columns; runs after it export the thirty described here. Two names were replaced rather than added to: url became listing_url, and image became images. If you are holding a file from June, its header is different - that is the change, not a fault in either file.
Do the values come back in German?+
Yes for the descriptive fields. condition, fuel, gearbox and state all come back in German - Gebrauchtwagen, Diesel, Automatik, Oberösterreich and so on - and the province names are the Austrian Bundesländer. Nothing is translated on the way out.
How much does it cost?+
The first 500 rows are free and one-time, with no credit card. After that it is $0.002 per row - about $2 per 1,000 listings - which is the same flat rate as every other scraper on the platform. The estimator shows the cost of a run before it starts.

Your first 500 listings,
on the house.

500 one-time free rows on every new account - no expiry. After that it is $0.002 per row, pay-as-you-go - no card on file until you say so.

Activates instantly · no card required

Scrape willhaben.at classified listings at scale

Livescraper's Willhaben Scraper turns a list of willhaben.at URLs into listing data. You submit search URLs, category URLs or single listing URLs - typed one per line, or uploaded as a CSV, XLSX, TXT or Parquet file - cap the rows per query if you want to, and download the result as a clean CSV, Excel or JSON file. One row per listing, thirty columns.

Each row carries the listing as willhaben shows it: the numeric id and the link, the title and description, the asking price and its currency, the town, postcode and Austrian province, the condition, the vehicle attributes where the category has them, and every photo URL. Listings placed by a registered dealer add a company name, a link to the dealer's own willhaben page, eight address fields and a phone number. The JSON carries one extra field, position, recording willhaben's own ordering.

Trade and retail teams price a whole category at once rather than a listing at a time, using the postcode and province columns to see how the same item is priced across the country. Sales teams turn a category run into a contactable dealer list. Researchers re-run a search over time and diff the files, which works because every row carries a stable listing id and a rank.

Two properties are worth knowing before you start. Every value comes back as a string except position, so parse before you sort - and images is a single string holding several URLs joined by a semicolon and a space, not an array. This page publishes no row counts on purpose: how much a run returns depends on the search, the per-query limit and the day, so the column notes describe what each field holds rather than quoting a number that will not match yours. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat.