# German Job Market Tracker: Salaries & Hiring Companies (`precious_bathmat/german-job-market-tracker`) Actor

What a role pays and who is hiring across Germany, Austria and Switzerland: jobs advertised, salary ranges with employer-published figures kept apart from XING's estimates, the employers posting most, the cities hiring and how fresh the adverts are. From XING; no login.

- **URL**: https://apify.com/precious\_bathmat/german-job-market-tracker.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 role market reports

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## German Job Market Tracker: Salaries & Hiring Companies

**What does this role pay in Germany, and who is hiring for it?** Enter the roles you care about and get one market report each: how many jobs are advertised, the salary range, which employers are posting most, which cities are hiring, and how fresh the adverts are.

Data comes from **XING**, the job board of the German-speaking world (Germany, Austria, Switzerland). No login, no API key.

### What does this do?

The other XING Actors hand you job rows. This one measures the market behind them — and gives you the rows as well.

```mermaid
flowchart LR
    A[Roles you name] --> B[XING job search]
    B --> C[Jobs advertised,<br/>XING's own count]
    B --> D[The newest adverts,<br/>read in full]
    C --> E[One report per role]
    D --> E
    D --> F[Every advert as a row]
```

### Who is it for?

| You are | You use it to |
|---|---|
| **Recruiters and staffing agencies** | See which employers are posting the most for a role, and what the going rate is before you pitch |
| **HR and compensation teams** | Benchmark an offer against the live market in a city, not against last year's survey |
| **Job seekers** | Find out what a role really pays in Berlin against Munich, and who is hiring right now |
| **Market researchers** | Track hiring volume, salaries and employer mix across the German-speaking market |
| **Sales teams selling to HR** | Spot the companies in a hiring spree, which is when HR budgets open |

### What data do you get?

One row per role:

| Field | Meaning |
|---|---|
| `jobsOnMarket`, `jobsOnMarketIsAtLeast` | How many adverts match, from XING's own count. XING stops counting at 1,000, and the flag says when the number is "or more" |
| `medianSalary`, `lowerQuartileSalary`, `upperQuartileSalary` | The middle of the market and the middle half, in the market's own currency |
| `employerStated` / `xingEstimated` | The same figures worked out **separately** for adverts where the employer published a salary and for the ones XING estimated |
| `estimatedSharePercent`, `jobsWithSalary` | How much of the salary picture is XING's estimate rather than a published figure |
| `topCompanies`, `companyPostingMostJobs`, `hiringCompanies` | The employers advertising most for this role, with counts and shares |
| `topCities` | The cities the adverts name, biggest first |
| `employmentTypes` | Vollzeit, Teilzeit, Selbstständig and the rest, with shares |
| `postedLast7Days`, `medianDaysSincePosted`, `expiringWithin14Days` | How live the market is |
| `promotedJobs`, `viaThirdPartyJobs` | Paid listings, and adverts that redirect to another site |
| `commonWords`, `jobsWithResponsibilities` | The words that come up most in XING's summary of what the job involves |
| `careerLevelsOffered`, `remoteOptionsOffered`, `industriesHiring` | The filters XING offers for this search, when it publishes them |

With **Also return every advert as a row** on (the default), a second table holds each advert: title, employer, city, employment type, salary and where the figure came from, key responsibilities, posting date, age and a link.

### Example: six roles across the whole German-speaking market

Run from Apify's servers on 20 September 2026, 100 adverts read per role, 14 seconds for all six:

| Role | Advertised | Median salary | Middle half | Employer-stated vs XING estimate | Top employer |
|---|---|---|---|---|---|
| data scientist | 1,000+ | €67,750 | €61,500–73,500 | €60,000 vs €68,500 | DIS AG Germany |
| software engineer | 1,000+ | €65,500 | €60,000–72,500 | €75,000 vs €64,750 | Helsing |
| projektmanager | 1,000+ | €62,000 | €53,500–67,750 | €65,000 vs €61,500 | Workwise GmbH |
| controller | 1,000+ | €58,500 | €52,500–64,500 | €66,227 vs €57,000 | Actief Personalmanagement |
| vertrieb | 1,000+ | €55,250 | €45,375–64,625 | €52,500 vs €58,000 | Workwise GmbH |
| pflegefachkraft | 1,000+ | €43,000 | €41,500–50,100 | €50,100 vs €42,000 | Workwise GmbH |

The two salary columns are worth reading twice. For most of these roles the employers who **publish** a salary are offering **more** than XING estimates for the market — €75,000 against €64,750 for software engineers, €66,227 against €57,000 for controllers. Only for data scientists and sales roles is it the other way round. An average over both numbers would have hidden that completely, which is why this Actor keeps them apart.

### Things worth knowing

- **Two kinds of salary, never mixed silently.** XING shows an employer's own range when the advert has one, and its own estimate when it does not. Every figure carries `salarySource`, and the report gives `employerStated` and `xingEstimated` separately as well as the combined median. `estimatedSharePercent` tells you how much of it is guesswork — in the run above, between 49% and 94% depending on the role.
- **XING counts to 1,000 and stops.** A broad search says "1,000" with `jobsOnMarketIsAtLeast: true`. Add a city to get an exact number: "software engineer" in Berlin returns 656.
- **The sample is the newest adverts**, 100 by default and up to 500. The market count comes from XING and covers everything.
- **German and English both work** as search words. "Vertrieb" and "sales" return different markets, so use the word your candidates would.
- **Austria and Switzerland are included** when no city is given, and Swiss adverts quote CHF — `salaryCurrencies` lists every currency in the sample.
- **Some employers are agencies.** Staffing firms (Workwise, DIS AG, Actief) often top the employer list; that is a real feature of the market, not a fault in the data, and the `topCompanies` list lets you see it.
- **Salaries are yearly gross** figures as XING publishes them.

### Popular salary reports

Ready-made runs you can open and start, or copy as a starting point:

- [Software Developer Salaries in Germany: Live Market](https://apify.com/precious_bathmat/german-job-market-tracker/examples/software-developer-salary-germany)
- [Data Science Salaries in Germany: Jobs and Employers](https://apify.com/precious_bathmat/german-job-market-tracker/examples/data-jobs-salary-germany)
- [Berlin Tech Salaries: Jobs, Pay and Who Is Hiring](https://apify.com/precious_bathmat/german-job-market-tracker/examples/it-jobs-berlin-salary)
- [Munich Tech Salaries: Jobs, Pay and Who Is Hiring](https://apify.com/precious_bathmat/german-job-market-tracker/examples/it-jobs-munich-salary)
- [Hamburg Tech Salaries: Jobs, Pay and Who Is Hiring](https://apify.com/precious_bathmat/german-job-market-tracker/examples/it-jobs-hamburg-salary)
- [Finance and Accounting Salaries in Germany](https://apify.com/precious_bathmat/german-job-market-tracker/examples/finance-jobs-salary-germany)
- [Sales Salaries in Germany: Vertrieb and Account Managers](https://apify.com/precious_bathmat/german-job-market-tracker/examples/sales-jobs-salary-germany)
- [Healthcare Salaries in Germany: Pflege and Therapy Jobs](https://apify.com/precious_bathmat/german-job-market-tracker/examples/healthcare-jobs-salary-germany)
- [Engineering Salaries in Germany: Ingenieur Jobs and Pay](https://apify.com/precious_bathmat/german-job-market-tracker/examples/engineering-jobs-salary-germany)
- [Marketing Salaries in Germany: Jobs, Pay and Employers](https://apify.com/precious_bathmat/german-job-market-tracker/examples/marketing-jobs-salary-germany)
- [Logistics Salaries in Germany: Jobs, Pay and Employers](https://apify.com/precious_bathmat/german-job-market-tracker/examples/logistics-jobs-salary-germany)
- [HR Salaries in Germany: Recruiter and Personalreferent Pay](https://apify.com/precious_bathmat/german-job-market-tracker/examples/hr-jobs-salary-germany)
- [Project Management Salaries in Germany and Austria](https://apify.com/precious_bathmat/german-job-market-tracker/examples/project-management-jobs-germany)
- [Vienna Salaries: What Jobs Pay in Austria Right Now](https://apify.com/precious_bathmat/german-job-market-tracker/examples/jobs-salary-vienna)
- [Zurich Salaries: What Jobs Pay in Switzerland Now](https://apify.com/precious_bathmat/german-job-market-tracker/examples/jobs-salary-zurich)

### Pricing

**$0.02 per role report** plus **$0.0005 per advert row** ($0.50 per 1,000 adverts). Market counts, salary figures, employer and city lists are included in the report price. A role with no adverts costs nothing.

Six roles with 100 adverts each cost $0.42. Compute is tiny: that run used $0.001 of platform usage at 256 MB.

### Input

| Setting | What it does |
|---|---|
| **Roles** | One job title or keyword per line, German or English |
| **City or region** | Berlin, München, Hamburg, Wien, Zürich… or empty for the whole market |
| **Adverts to read per role** | 20 to 500, newest first |
| **Also return every advert as a row** | The second table with each advert |

### Integrations

Runs on a schedule and connects to Google Sheets, Slack, Zapier, Make or your own code through the Apify API. Results export as JSON, CSV or Excel. A weekly run builds a salary and hiring history by itself.

### Is it legal?

This Actor reads the same public job adverts any visitor sees on XING, and keeps the employer details published with them. It stores no personal data and needs no account.

# Actor input Schema

## `roles` (type: `array`):

One job title or keyword per line, in German or English: "software engineer", "Controller", "Pflegefachkraft".

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

A city as XING writes it: Berlin, München, Hamburg, Wien, Zürich. Leave empty for the whole German-speaking market.

## `maxJobsPerRole` (type: `integer`):

How many of the newest adverts to read for the salary, employer and city figures. The number of jobs advertised comes from XING's own count and does not depend on this.

## `includeJobs` (type: `boolean`):

A second table with each advert read: title, employer, city, employment type, salary and its source, key responsibilities and a link. Charged per advert; turn it off to pay for the reports only.

## Actor input object example

```json
{
  "roles": [
    "Vertriebsmitarbeiter",
    "Projektmanager"
  ],
  "location": "Berlin",
  "maxJobsPerRole": 100,
  "includeJobs": true
}
```

# Actor output Schema

## `reports` (type: `string`):

Jobs advertised, salary ranges, top employers and cities for each role.

## `jobs` (type: `string`):

Every advert read, when that option is on.

## `summary` (type: `string`):

What was found per role and anything skipped.

# 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 = {
    "roles": [
        "software engineer",
        "data scientist",
        "controller"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/german-job-market-tracker").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 = { "roles": [
        "software engineer",
        "data scientist",
        "controller",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/german-job-market-tracker").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "roles": [
    "software engineer",
    "data scientist",
    "controller"
  ]
}' |
apify call precious_bathmat/german-job-market-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/german-job-market-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

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