willhaben APIwillhaben.at ↗
Access listings from willhaben.at across marketplace, real estate, cars, and jobs. Search, filter, and retrieve full listing details via 7 structured endpoints.
What is the willhaben API?
The willhaben.at API exposes 7 endpoints covering Austria's largest classifieds platform, returning structured data across four verticals: general marketplace goods, real estate (for sale and rent), cars, and jobs. The get_listing_detail endpoint retrieves full listing data including images, address details, attributes, and description for any listing ID obtained from the search endpoints.
curl -X GET 'https://api.parse.bot/scraper/b057ca07-cf56-40aa-b5bc-e52eddc5501c/search_marketplace?page=1&rows=5&keyword=laptop&category=537&price_to=500&price_from=10' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace willhaben-at-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Willhaben API — search Austrian classifieds across marketplace, real estate, cars, and jobs."""
from parse_apis.willhaben_api import Willhaben, ListingNotFound
client = Willhaben()
# Search the marketplace for affordable items
for listing in client.listings.search(keyword="fahrrad", price_to=500, limit=3):
print(listing.title, listing.price_display, listing.location)
# Get full details for a specific listing
item = client.listings.search(keyword="laptop", limit=1).first()
if item:
detail = client.listings.get(id=item.id)
print(detail.title, detail.published)
# Search flats for sale in Vienna (zip prefix '1')
for flat in client.realestatelistings.search_flats(zip_prefix="1", price_to=400000, limit=3):
print(flat.title, flat.price_display, flat.postcode)
# Search cars with a price range
for car in client.carlistings.search(keyword="audi", price_from=10000, price_to=30000, limit=3):
print(car.title, car.price_display, car.state)
# Search job listings
job = client.joblistings.search(keyword="developer", limit=1).first()
if job:
print(job.title, job.salary, job.salary_time_frame)
# Handle a listing that doesn't exist
try:
client.listings.get(id="9999999999")
except ListingNotFound as exc:
print(f"Listing not found: {exc.ad_id}")
print("exercised: listings.search / listings.get / realestatelistings.search_flats / carlistings.search / joblistings.search")
Search for items in the general marketplace (Marktplatz). Returns paginated listing results with title, price, location, and attributes. Supports keyword search, category filtering, and price range. Results are ordered by recency (bumped/promoted listings first).
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| rows | integer | Number of results per page. |
| keyword | string | Search keyword (e.g. 'laptop', 'bicycle', 'sofa'). |
| category | string | Category filter. |
| price_to | integer | Maximum price filter in euros. |
| price_from | integer | Minimum price filter in euros. |
{
"type": "object",
"fields": {
"page": "integer, current page number",
"rows": "integer, results per page requested",
"results": "array of listing objects with id, title, price, price_display, location, postcode, district, state, published, thumbnail, is_private, url, and attributes",
"total_results": "integer, number of results returned on this page"
},
"sample": {
"data": {
"page": 1,
"rows": 5,
"results": [
{
"id": "1872400799",
"url": "https://www.willhaben.at/iad/kaufen-und-verkaufen/d/guenstig-umzug-1872400799/",
"price": "25",
"state": "Wien",
"title": "Günstig Umzug",
"district": "Wien",
"location": "Wien, 07. Bezirk, Neubau",
"postcode": "1070",
"published": "2026-06-11T03:38:00Z",
"thumbnail": "https://cache.willhaben.at/mmo/9/187/240/0799_2068044911_hoved.jpg",
"attributes": {
"PRICE": "25",
"HEADING": "Günstig Umzug"
},
"is_private": false,
"vertical_id": 5,
"price_display": "€ 25"
}
],
"total_results": 5
},
"status": "success"
}
}About the willhaben API
Search Endpoints by Vertical
The API covers four distinct listing categories. search_marketplace accepts keyword, category, price_from, and price_to filters and returns paginated arrays of listing objects including title, price, price_display, location, postcode, district, state, published, and thumbnail. Real estate is split across three endpoints: search_real_estate_for_sale_flats and search_real_estate_for_sale_houses both accept area_from/area_to (in m²) and zip_prefix for postal code filtering — useful for narrowing to Vienna (zip_prefix: '1') or other Austrian regions. search_real_estate_for_rent filters by price range only and returns the same listing shape.
Cars and Jobs
search_cars accepts keyword (e.g. 'bmw', 'audi a4'), price_from, and price_to, returning vehicle listings with standard location and price fields. search_jobs accepts a keyword parameter and returns job-specific fields including company, salary, salaryTimeFrame, jobLocations, employmentModes, and employmentType — fields not present in the other listing types.
Listing Detail
get_listing_detail takes a numeric ad_id string obtained from any search result and returns the full listing record. Response fields include attributes (a structured name/value pair list), description, publishedDate, advertImageList (an array of image URLs), and advertAddressDetails covering address, postCode, district, and municipality. This endpoint works across all verticals — marketplace, real estate, and cars.
Pagination
All search endpoints share a consistent pagination model: pass page (integer) and rows (results per page) as inputs. Each response echoes back page, rows, and total_results (count of results on the current page). Note that total_results reflects the current page count, not a grand total across all pages.
The willhaben API is a managed, monitored endpoint for willhaben.at — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when willhaben.at changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official willhaben.at API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor Austrian apartment rental prices by filtering
search_real_estate_for_rentbyprice_from/price_toover time. - Build a cross-category price tracker using
search_marketplacewithkeywordandprice_toto watch specific items. - Aggregate used car listings by make/model with
search_carsand enrich each result usingget_listing_detailfor full attributes. - Track new job postings in a specific field by polling
search_jobswith akeywordlike 'developer' or 'buchhalter'. - Compare flat sale prices by area using
search_real_estate_for_sale_flatswitharea_from,area_to, andzip_prefix. - Retrieve seller contact details and full image galleries for specific listings using
get_listing_detailwith anad_id. - Identify house listings in a Vienna postal code range using
search_real_estate_for_sale_houseswithzip_prefix: '1'.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does willhaben.at have an official public developer API?+
What does `get_listing_detail` return that the search endpoints don't?+
get_listing_detail returns the full description text, a structured attributes object with name/value pairs (e.g. condition, category-specific specs), all listing images via advertImageList, and granular address data through advertAddressDetails including municipality. Search endpoints return summary fields only: title, price, location, postcode, thumbnail, and a few others.Does `total_results` tell me how many total listings match my search across all pages?+
total_results field reflects the count of results returned on the current page, not the grand total across all matching listings. To paginate through results, increment the page parameter and stop when a response returns fewer results than the rows value requested.Can I filter car listings by make, model, mileage, or year?+
search_cars supports keyword, price_from, and price_to only. Structured filters for make, model, mileage, or registration year are not exposed as dedicated parameters. You can fork the API on Parse and revise it to add those filters as additional endpoint parameters.