# XING Jobs Scraper: Germany, Austria & Switzerland + Salary (`precious_bathmat/xing-job-scraper`) Actor

Scrape XING jobs in Germany, Austria and Switzerland: title, employer, city, salary range or XING salary estimate, career level, remote or hybrid, full description and apply link. Plus a salary and top-employer report per search. Past XING's 1,000-result limit. No login.

- **URL**: https://apify.com/precious_bathmat/xing-job-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

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

## XING Jobs Scraper: Germany, Austria & Switzerland + Salary

Scrape **XING jobs** across **Germany, Austria and Switzerland** with the **salary** on almost every job: the employer's own range where they give one, XING's salary estimate where they do not. Each job comes with the **employer, city, career level, employment type, remote or hybrid option, discipline, industry, company size, full description and apply link**.

On top, every search gets a **salary and employer report**: median salary and quartiles by career level and remote option, the top hiring companies, cities, industries and how fresh the ads are.

- **Salary on more than 8 of 10 jobs**: employer ranges and XING estimates, with the period (year, month, hour) worked out and a yearly equivalent for comparisons
- **Past XING's 1,000-result limit**: big searches are split by employment type, career level and remote option automatically
- **Keyword × city searches** in one run: "SAP Berater" in Berlin, München, Hamburg, Wien and Zürich
- **Filters**: remote, hybrid or on-site, employment type, career level, radius, posting age
- **Employer list** with job counts, size, industry and XING company page: a hiring-signal lead list
- **English labels** (or German), **no login, no API key**

### What does this XING scraper do?

```
"SAP Berater" in München: 463 jobs on XING, 300 collected
 Median salary €84,000 (€79,000-92,500) · 72% remote or hybrid
 Top employer adesso business consulting AG, 61 jobs
"Software Engineer" in Zürich: median CHF 109,500
```

1. Add **job titles or keywords** and, optionally, **cities**.
2. Every keyword is searched in every city through XING's own job search, page by page, split into slices when a search has more than 1,000 results.
3. You get **one row per job**, **one report per search** and an **employer CSV**.

```mermaid
flowchart LR
    A[Keywords × cities] --> B[XING job search]
    B -->|over 1,000 results| C[Split by type,<br/>level, remote]
    B --> D[Jobs with salary,<br/>level, remote, description]
    C --> D
    D --> E[Salary and<br/>employer report]
    D --> F[Employer list]
```

### Who is it for?

- **Recruiters and staffing agencies** finding companies that are hiring right now, with the role, level and pay
- **HR and compensation teams** benchmarking salaries by city, level and remote option in the DACH region
- **Job seekers and career coaches** seeing what a role really pays in Berlin, Wien or Zürich
- **B2B sales teams** using hiring as a buying signal (an SAP team growing, a hospital hiring nurses)
- **Labour market researchers** tracking demand per city and discipline

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `title`, `company`, `url`, `applyUrl` | The job and where to apply |
| `city`, `region`, `postcode`, `country`, `otherLocations` | Where |
| `remote` | Fully remote, Hybrid or On-site |
| `employmentType`, `careerLevel` | Full-time, part-time, freelance...; entry level to senior executive |
| `discipline`, `industry` | XING's job field and the employer's industry |
| `salaryMin`, `salaryMax`, `salaryMedian`, `salaryCurrency` | Pay as published |
| `salarySource`, `salaryPeriod`, `salaryYearlyMedian` | Employer range, employer figure or XING estimate; per year, month or hour; yearly equivalent |
| `postedAt`, `refreshedAt`, `activeUntil`, `daysOnline` | Freshness |
| `companySize`, `companyIndustry`, `companyCity`, `companyXingUrl`, `companyId` | About the employer |
| `description`, `language`, `isPromoted` | The full job ad as text; its language; paid placement |

**Reports** (`REPORTS`, one per search): XING's total, jobs collected, **median salary and 25th/75th percentile** in EUR and CHF, **by career level** and **by remote option**, share of employer-stated salaries, **top 25 employers** with their median salary, top cities, countries, disciplines, industries, company sizes, share of English-language ads, jobs posted in the last 7 and 30 days.

`EMPLOYERS_CSV` lists every hiring company with its number of jobs, size, industry, cities, five job titles and XING page. `JOBS_CSV` has all jobs without descriptions.

### Example: 9 October 2026

**4 job titles × 5 cities = 20 searches, 5,113 jobs from 1,823 employers in 83 seconds.**

| Search | On XING | Median yearly salary | 25th-75th percentile | Remote or hybrid |
|---|---|---|---|---|
| Software Engineer, München | 629 | €72,500 | €65,000-80,000 | 43% |
| Software Engineer, Berlin | 684 | €69,000 | €60,500-77,500 | 51% |
| Software Engineer, Wien | 166 | €60,750 | €56,250-67,375 | 52% |
| Software Engineer, Zürich | 349 | CHF 109,500 | | 61% |
| SAP Berater, Hamburg | 690 | €85,000 | €79,000-92,500 | 78% |
| SAP Berater, München | 463 | €84,000 | €79,000-92,500 | 72% |
| Buchhaltung, München | 849 | €53,000 | €47,500-62,250 | 44% |
| Buchhaltung, Berlin | 964 | €45,500 | €41,000-54,000 | 56% |
| Pflegefachkraft, München | 769 | €46,000 | €44,000-49,500 | 0% |
| Pflegefachkraft, Zürich | 567 | CHF 97,500 | | 1% |

- **Salary on 4,256 of 5,113 jobs (83%).** Employers state their own range on about half of the SAP consulting jobs, but on almost no nursing jobs, where XING's estimate fills the gap.
- **Many Austrian employers state monthly pay** (40 jobs here): those figures are marked `salaryPeriod: month` and counted as 14 salaries a year in the reports, as is usual in Austria; monthly pay elsewhere counts 12 times.
- A few employers hide their name on XING ("confidencial"); the job is still listed.

### Pricing

**$0.001 per job**, plus **$0.02 per search report** (only for searches that found jobs; switch reports off if you do not need them).

- 1,000 jobs from 5 searches: **$1.10**
- The run above: 5,113 jobs and 20 reports, **$5.51**

### Good to know

- **Cities, not countries**: use city names ("München", "Wien", "Zürich"), with a radius for the surrounding area. Leave the city empty to search all of Germany, Austria and Switzerland.
- **More than 1,000 results**: XING shows at most 1,000 results per search; the scraper splits such searches into slices automatically. Jobs XING files without an employment type or career level can fall outside those slices.
- **Jobs only for signed-in members**: XING keeps a share of jobs for logged-in members in some regions. They are counted in the report (`jobsHiddenFromPublic`) but cannot be read.
- **Description** costs nothing extra; switch it off for smaller files.
- **Personal data**: jobs and companies only. Recruiters' names and contact people are not collected as fields (they can appear inside the ad text as written by the employer).
- No login, no API key, no proxies needed.

### Input

| Field | Meaning |
|---|---|
| **Job titles or keywords** | One search per line, German or English |
| **Cities** | Optional, one per line |
| **Radius around the city (km)** | 0 = the city only |
| **Maximum jobs per search** | 1 to 50,000 (default 200) |
| **Remote work**, **Employment type**, **Career level** | Optional filters |
| **Posted within (days)** | 0 = any age |
| **Include the full job description** | On by default |
| **Language of labels** | English (default) or German |
| **Salary and employer report** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. Schedule it weekly with **Posted within 7 days** for a feed of new jobs, or send `EMPLOYERS_CSV` to your CRM as a list of companies that are hiring.

# Actor input Schema

## `keywords` (type: `array`):

One search per line, in German or English: "Software Engineer", "Buchhaltung", "Pflegefachkraft", "SAP Berater". Each keyword is searched in each city below.

## `locations` (type: `array`):

Optional. One city per line: "Berlin", "München", "Hamburg", "Wien", "Zürich". Leave empty to search all of Germany, Austria and Switzerland. Use cities, not countries or states.

## `radiusKm` (type: `integer`):

0 = the city only. 20 or 50 also covers commuter towns.

## `maxJobsPerSearch` (type: `integer`):

Per keyword and city. Searches with more than 1,000 results on XING are split automatically by employment type, career level and remote option, so you can collect several thousand.

## `remote` (type: `array`):

Optional. Only jobs with these options.

## `employmentTypes` (type: `array`):

Optional. Only jobs of these types.

## `careerLevels` (type: `array`):

Optional. Only jobs at these levels.

## `postedWithinDays` (type: `integer`):

0 = any age. 7 keeps only jobs posted in the last week.

## `includeDescription` (type: `boolean`):

The whole job ad as text. Costs nothing extra; turn off for smaller files.

## `language` (type: `string`):

Language for discipline, industry and company size labels. Job ads stay in the language they were written in.

## `includeReport` (type: `boolean`):

One report per search: median salary and quartiles by career level and remote option, top employers, cities, disciplines, industries and posting freshness.

## Actor input object example

```json
{
  "keywords": [
    "Software Engineer",
    "Buchhaltung"
  ],
  "locations": [
    "Berlin",
    "München"
  ],
  "radiusKm": 0,
  "maxJobsPerSearch": 200,
  "postedWithinDays": 0,
  "includeDescription": true,
  "language": "en",
  "includeReport": true
}
```

# Actor output Schema

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

One row per job: employer, city, salary, career level, remote option, description and links.

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

One report per search: salary quartiles by level and remote option, top employers, cities and more.

## `employers` (type: `string`):

Every hiring company with its number of open jobs, size, industry, cities and XING page.

## `csv` (type: `string`):

All jobs as flat CSV without descriptions.

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

Counts and notes.

# 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 = {
    "keywords": [
        "Software Engineer",
        "Buchhaltung"
    ],
    "locations": [
        "Berlin",
        "München"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/xing-job-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 = {
    "keywords": [
        "Software Engineer",
        "Buchhaltung",
    ],
    "locations": [
        "Berlin",
        "München",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/xing-job-scraper").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 '{
  "keywords": [
    "Software Engineer",
    "Buchhaltung"
  ],
  "locations": [
    "Berlin",
    "München"
  ]
}' |
apify call precious_bathmat/xing-job-scraper --silent --output-dataset

```

## MCP server setup

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

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/ngbyVJrmAnLWHyFJL/builds/3fWdd1zZvaIWJq3qX/openapi.json
