# Willhaben Jobs Scraper — Austrian Job Listings & Salaries (`studio-amba/willhaben-jobs-scraper`) Actor

Scrape job listings from the willhaben.at jobs vertical — Austria's largest classifieds portal. Get titles, companies, locations, salaries, and full descriptions for every open position.

- **URL**: https://apify.com/studio-amba/willhaben-jobs-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Willhaben Jobs Scraper

Scrape job listings from the willhaben.at jobs vertical — Austria's largest classifieds portal with over 9 million monthly visitors. No login or cookies required.

### How to scrape Willhaben jobs data

1. Go to the [Willhaben Jobs Scraper](https://apify.com/studio-amba/willhaben-jobs-scraper) page on Apify Store.
2. Click "Try for free" to open the actor in Apify Console.
3. Set your search keyword in German (e.g. `buchhalter`, `verkauf`, `software entwickler`).
4. Optionally add a location (e.g. `Wien`, `Graz`) to narrow results to a city or region.
5. Click "Start" and wait for the run to complete.
6. Download your data as JSON, CSV, or Excel from the Dataset tab.

You can also call this actor via the [Apify API](https://docs.apify.com/api/v2) to integrate Willhaben jobs data into your own applications and workflows.

### Why use this actor?

Willhaben is Austria's #1 classifieds site and its jobs vertical is one of the country's largest job boards, alongside karriere.at and StepStone Austria. Recruitment agencies, HR tech companies, and labor market researchers use this data to track Austrian hiring demand, benchmark salaries, and build region-wide job feeds.

Willhaben's jobs listings are a **different data shape** than the real-estate listings on willhaben.at — the real-estate vertical uses `searchResult.advertSummaryList`, while jobs use `jobsSearchResultRoot.data.entries[]`. If you also need Austrian real estate data, see the companion [Willhaben Scraper](https://apify.com/studio-amba/willhaben-scraper) — same site, different vertical, separate actor because the underlying JSON shape and fields don't overlap.

This actor extracts data directly from the embedded Next.js `__NEXT_DATA__` JSON, which means fast and reliable scraping without a browser — just plain HTTP requests with CheerioCrawler.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Search keyword in German (e.g. `buchhalter`, `verkauf`). Default: `buchhalter` |
| `location` | String | No | City or region to narrow results (e.g. `Wien`, `Graz`, `Linz`) |
| `maxResults` | Integer | No | Maximum number of job listings to return (default: 100) |
| `proxyConfiguration` | Object | No | Proxy settings — Austrian residential proxies recommended (see note below) |

#### Why residential proxies

Willhaben's search endpoint returns a 403 to plain Apify datacenter proxies (verified during testing) but works reliably over Austrian residential IPs, which is why the default proxy configuration uses `RESIDENTIAL` with `apifyProxyCountry: "AT"`.

#### A note on descriptions

Only "topJob" (paid, pinned) listings ship their full description directly in Willhaben's search results. Every regular listing needs one extra request to its own detail page to fill in the full text — this actor does that automatically for every job, so the `description` field is always populated. It means roughly two requests per result rather than one, which is normal for this site and already accounted for in the actor's default timeouts.

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `title` | String | `"Buchhalter:in (m/w/d) fuer Industrieunternehmen"` |
| `company` | String | `"DIS AG"` |
| `location` | String | `"Feldbach"` |
| `salary` | String | `"44800 EUR (jaehrlich)"` (only when disclosed) |
| `employmentType` | String | `"Vollzeit"` or `"Teilzeit"` |
| `postedDate` | String | `"2026-06-15T15:46:22.445"` |
| `url` | String | Full job listing URL on willhaben.at |
| `description` | String | Full job description text |
| `scrapedAt` | String | `"2026-07-13T00:24:55.196Z"` |

### Example output

```json
{
    "title": "Buchhalter:in (m/w/d) fuer Industrieunternehmen",
    "company": "DIS AG",
    "location": "Feldbach",
    "salary": "44800 EUR (jaehrlich)",
    "employmentType": "Vollzeit",
    "postedDate": "2026-06-15T15:46:22.445",
    "url": "https://www.willhaben.at/jobs/job/buchhalter-in-m-w-d-fuer-industrieunternehmen/13225581",
    "description": "Buchhalter:in (m/w/d) fuer Industrieunternehmen. Sind Sie auf der Suche nach einer anspruchsvollen Position im Bereich Buchhaltung?...",
    "scrapedAt": "2026-07-13T00:24:55.196Z"
}
```

### Cost estimate

This actor uses CheerioCrawler (HTTP-only, no browser), making it cheap to run despite the two-requests-per-result pattern. Expect approximately **1-2 compute units per 100 results**.

### Tips for best results

- **Use native German keywords** — Willhaben is an Austrian site. Search for `buchhalter` instead of `accountant`.
- **Add a location for regional searches** — appending a city or region to the keyword (e.g. `verkauf Graz`) narrows results reliably.
- **Residential proxies are the default for a reason** — plain datacenter IPs get a 403 on this endpoint.
- **Empty input works** — running with no input at all defaults to searching for `buchhalter` positions nationwide.

### Limitations

- Data is scraped from the public website and may change without notice if Willhaben updates their page structure.
- Salary is only present when the employer chose to disclose it — many listings omit it, which is normal for the Austrian market, not a scraping gap.
- Every regular listing costs one extra detail-page request to retrieve its full description — large `maxResults` values take proportionally longer than a single-request-per-item scraper.

### Use cases

- **Labor market research** — track hiring demand and salary disclosure trends across Austrian regions.
- **Salary benchmarking** — aggregate disclosed salary ranges by role, region, and employment type.
- **Recruitment agency sourcing** — feed one of Austria's largest job boards into a candidate-matching pipeline.
- **Job aggregator feeds** — combine Willhaben postings with StepStone Austria or karriere.at for a complete Austrian job feed.

### Related scrapers

This actor is part of Studio Amba's European jobs fleet. Also see:

- **Willhaben Scraper** — the real-estate vertical of the same site (apartments, houses)
- **StepStone Scraper** — stepstone.at, Austria's other major job board
- **Jobware Scraper** — jobware.de, a leading German-language job board

### Support

Hit a bug or a missing field? Open an issue on the Actor page — we respond fast and ship fixes within 24 hours. Every published scraper in the Studio Amba catalog is monitored daily; broken runs trigger an automatic heal cycle.

# Actor input Schema

## `searchQuery` (type: `string`):

Search for jobs by keyword in German (e.g., 'buchhalter', 'verkauf', 'software entwickler').

## `location` (type: `string`):

Filter by city or region (e.g., 'Wien', 'Graz', 'Linz'). Appended to the search keyword — willhaben's search matches location terms against job location and text.

## `maxResults` (type: `integer`):

Maximum number of job listings to return. Almost every listing needs one extra detail-page request to fill in its full description (only pinned listings ship it in the search results), so large values take proportionally longer.

## `proxyConfiguration` (type: `object`):

Proxy settings. Austrian residential proxies recommended — willhaben blocks plain datacenter IPs on this endpoint.

## Actor input object example

```json
{
  "searchQuery": "buchhalter",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "buchhalter",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "AT"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/willhaben-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQuery": "buchhalter",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "AT",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/willhaben-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQuery": "buchhalter",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "AT"
  }
}' |
apify call studio-amba/willhaben-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=studio-amba/willhaben-jobs-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Eup1068XyqdbZD7yp/builds/o7HcncVLQmp1olp5V/openapi.json
