# XING Jobs Scraper - Germany, Austria & Switzerland Jobs (`cirkit/xing-jobs-scraper`) Actor

Scrape XING job ads across Germany, Austria and Switzerland: salary band, career level, discipline, remote policy, postcode, street, company size and full description. No login. $0.70 per 1,000 jobs.

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

## Pricing

$0.70 / 1,000 job listings

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?

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

### What is XING Jobs Scraper?

**XING Jobs Scraper** lets you extract every public job ad on XING across Germany, Austria and Switzerland, helping you build DACH recruitment pipelines, benchmark salaries by city and seniority, and generate lists of companies that are actively hiring.

XING is the professional network that German-speaking Europe actually uses, and its job board carries pay data that almost no other job site publishes. This scraper returns it.

- 💶 **Benchmark salaries that nobody else publishes:** every ad comes back with a minimum, maximum and median in euros or francs, and a flag telling you whether the employer advertised the number or XING estimated it. 90% of ads carry a salary band.
- 🎯 **Build a DACH candidate and client pipeline:** filter by city and radius, employment type, career level and remote policy, then export straight to CSV, Excel or your ATS.
- 🏢 **Find companies that are hiring right now:** each row carries the employer's XING company page, headcount band, industry and head office city, so a job feed doubles as a B2B prospect list.
- 🌍 **See the real remote market:** XING tags every ad full remote, hybrid or on-site, so you can size the German remote market instead of guessing from job titles.
- 📍 **Get street-level location:** city, federal state, postcode and street where the employer published it, not just "Berlin, Germany".
- ⚡ **No login, no cookies, no session to paste.** XING has no public jobs API and its own site shows you 20 ads at a time. This actor reads up to about 1,000 per search in a single run, at roughly 240 rows per 30 seconds.

### What data does XING Jobs Scraper extract?

Every row is one job ad.

- 🏷 Job title, XING job URL and slug (`title`, `jobUrl`, `slug`)
- 🆔 Numeric job ID and XING's internal hashed ID (`jobId`, `jobHashId`)
- 🏢 Company name, XING company page, headcount band, industry and head office city (`companyName`, `companyXingUrl`, `companySize`, `companyIndustry`, `companyCity`)
- 🖼 Company logo URL (`companyLogoUrl`)
- 📍 City, federal state or canton, postcode, street, country and ISO country code (`city`, `region`, `zipCode`, `street`, `country`, `countryCode`)
- 🗺 Additional cities when one ad covers several offices (`additionalCities`)
- 💶 Salary minimum, maximum, median and currency (`salaryMin`, `salaryMax`, `salaryMedian`, `salaryCurrency`)
- ✅ Whether the pay came from the employer or from XING's own model (`salaryIsEstimated`, `hasSalary`)
- 🧑‍💼 Employment type, career level and professional discipline (`employmentType`, `careerLevel`, `discipline`)
- 🏭 Job industry (`industry`)
- 🏡 Remote policy, full remote, hybrid or on-site (`remotePolicy`, `remoteOptions`)
- 📄 Full job description as HTML and as clean plain text (`descriptionHtml`, `descriptionText`)
- 🧠 XING's own summary of the ad plus its bulleted responsibilities and qualifications (`summary`, `responsibilities`, `qualifications`)
- 🔧 Skill and keyword tags XING assigned to the ad (`skills`)
- 📅 Posted date, last refreshed date and expiry date (`postedAt`, `refreshedAt`, `expiresAt`)
- 🚩 Whether the ad is promoted, a XING top job, or applies on an external site (`isPromoted`, `isTopJob`, `appliesOffsite`)
- 🗣 Language the ad is written in (`adLanguage`)
- 🔎 The search keyword, city and source URL that produced the row (`searchKeywords`, `searchLocation`, `sourceUrl`, `resultPosition`)

### How to use XING Jobs Scraper

1. Click **Try for free** and open the actor.
2. Type your keywords, one per line. German and English both work, so `Softwareentwickler` and `software engineer` both return results.
3. Add the DACH cities you care about and a radius in kilometres.
4. Set **Max results**. You are charged per job row, so this is your budget control.
5. Click **Start**, then download the results as CSV, JSON, Excel or XML, or pull them from the Apify API.

Already built the search you want on xing.com? Copy the address bar into **XING search URLs** instead and the keyword, city, radius, employment type, career level, remote policy and sort order all carry over.

### Input

```json
{
  "keywords": ["software engineer", "Softwareentwickler"],
  "locations": ["Berlin", "Munich"],
  "radius": 20,
  "maxItems": 500,
  "sortBy": "date",
  "employmentTypes": ["full-time"],
  "careerLevels": ["professional/experienced"],
  "remoteOptions": ["remote", "hybrid"],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Every keyword is combined with every city, so two keywords and two cities is four searches. Leave both empty to browse all of XING.

### Output

One record, trimmed:

```json
{
  "jobId": "157369813",
  "title": "Senior Software Engineer",
  "jobUrl": "https://www.xing.com/jobs/berlin-senior-software-engineer-157369813",
  "companyName": "Capmo.com",
  "companySize": "51-200 employees",
  "companyIndustry": "Software",
  "companyXingUrl": "https://www.xing.com/pages/capmo",
  "city": "Berlin",
  "region": "Land Berlin",
  "zipCode": "10178",
  "street": "Neue Schoenhauser Str. 3-5",
  "countryCode": "DE",
  "employmentType": "Full-time",
  "careerLevel": "Professional/Experienced",
  "discipline": "IT and software development",
  "industry": "Software",
  "remotePolicy": "Hybrid",
  "salaryMin": 85000,
  "salaryMax": 115000,
  "salaryCurrency": "EUR",
  "salaryIsEstimated": false,
  "hasSalary": true,
  "skills": ["typescript", "node", "javascript"],
  "postedAt": "2026-08-21T11:29:44Z",
  "expiresAt": "2026-10-20T11:29:46Z",
  "descriptionText": "...",
  "summary": "Capmo.com is seeking a Backend Engineer in Berlin ...",
  "responsibilities": ["Design scalable backend services with Node.js.", "..."],
  "qualifications": ["6+ years of software engineering experience.", "..."]
}
```

The dataset ships with three ready-made table views so you do not have to hide 50 columns by hand:

- **Overview**: title, company, location, postcode, salary band, employment type, career level, remote policy, industry, posted date and link.
- **Salaries**: the pay side on its own, with the estimate flag next to it.
- **Companies**: the hiring employers with industry, headcount, head office and XING page.

### How much does it cost to scrape XING jobs?

One flat price per job row. No start fee, no per-request charge, no surprise line items.

| Job rows | Cost |
|---|---|
| 1,000 | $0.70 |
| 10,000 | $7.00 |
| 100,000 | $70.00 |

The cheapest other XING scraper on the Store charges $1.00 per 1,000 rows **plus** a $0.50 fee every time the run starts, so a daily 1,000-row run costs $45.00 a month there and $21.00 a month here. Apify's free tier includes $5 of platform credit each month, which is about 7,000 XING jobs.

### Measured coverage

Measured on 2026-09-14 across 240 job ads pulled from live DACH searches.

| Field | Present |
|---|---|
| Job ID, title, URL, company name | 100% |
| City, federal state, country | 100% |
| Employment type, career level, discipline, industry | 100% |
| Remote policy | 100% |
| Skill tags | 100% |
| Posted, refreshed and expiry dates | 100% |
| Salary band (`hasSalary`) | 90% |
| Salary median | 73% |
| Full description text | 84% |
| Company industry | 76% |
| Company headcount band | 67% |
| Postcode | 22% |
| Street address | 13% |

Of the ads that carry pay, roughly 4 in 5 are XING's own salary estimate and 1 in 5 is a band the employer published. `salaryIsEstimated` tells you which is which on every row, so you never have to guess.

### Limits

- **About 1,000 results per individual search.** XING stops serving results past roughly the 1,000th row, whatever the result count on the page suggests. To go deeper, split the search: narrow the city, shrink the radius, or add an employment type or career level filter.
- **Postcode and street are sparse.** XING only publishes them when the employer filled them in, which is about 1 in 5 ads. City, state and country are always there.
- **Descriptions are missing on about 1 in 6 ads.** Those are postings pushed in from an external applicant tracking system, where XING links out instead of hosting the body text. `appliesOffsite` flags them.
- **A misspelled city does not error.** XING resolves locations loosely and quietly falls back to a wider search rather than returning nothing, so check the `Cities:` line in the run log if the results look off.
- **DACH only.** XING is a German, Austrian and Swiss network. It is not the tool for jobs outside those three countries.
- **No candidate profiles.** This actor reads job ads. It does not touch personal profiles, contacts or anything behind a login.

### FAQ

#### Is it legal to scrape XING jobs?

XING Jobs Scraper reads only job advertisements that XING publishes publicly to anyone with a browser, with no login and no cookies. It collects no candidate profiles and no personal data. Scraping public data is broadly lawful in the EU and the US, but how you store and use the results is your responsibility, particularly under GDPR if you combine it with personal data. If you are unsure, take legal advice.

#### Does XING have a public jobs API?

No. XING retired its public developer API, so scraping the public job board is the only way to get this data programmatically. That is exactly what this actor does.

#### Can I use XING Jobs Scraper as an API?

Yes. Every actor on Apify is an API. Start a run, poll it and read the dataset over REST, or use the official clients. See the [Apify API docs](https://docs.apify.com/api/v2).

#### Can I use this in Python?

Yes, with `apify-client`:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("cirkit/xing-jobs-scraper").call(run_input={
    "keywords": ["software engineer"],
    "locations": ["Berlin"],
    "maxItems": 500,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["companyName"], job["salaryMin"], job["salaryMax"])
```

#### Can I integrate XING Jobs Scraper with other apps?

Yes. Apify ships native integrations for Zapier, Make, Google Sheets, Slack, Airbyte, GitHub and Google Drive, plus webhooks that fire when a run finishes, so new job ads can land in your CRM or ATS without anyone touching a button.

#### How do I schedule XING Jobs Scraper to run automatically?

Open the actor, go to **Schedules**, and set a cron expression. Set **Sort by** to *Date posted (newest first)* and **Max results** to a modest number, and a daily run gives you a clean feed of new DACH job ads.

#### Why did I get fewer results than expected?

Three usual causes. XING caps one search at roughly 1,000 results, so a broad keyword hits a ceiling. Your **Max results** cap may be lower than you think, since it applies across every keyword and city combined. Or a filter is narrower than intended, for example *Full remote* plus *Senior executive* in a small city is genuinely a handful of ads.

#### Can I search in English or does it have to be German?

Both work. XING's search is semantic, so `software engineer` returns German-language ads for the same role. Searching the German term as well usually widens the result set, and running both keywords costs you nothing extra because duplicate ads are removed before you are charged.

#### What is the difference between salaryMin and salaryMedian?

`salaryMin` and `salaryMax` are the ends of the band. `salaryMedian` is XING's midpoint estimate and only appears on ads where XING modelled the pay rather than the employer publishing a range. Use `salaryIsEstimated` to separate the two populations before you benchmark anything.

#### Can I get a field that is not listed?

If XING shows it publicly on the job ad, it can probably be added. Open an issue on the actor and describe the field.

#### Does it cover Austria and Switzerland?

Yes. Search Vienna, Graz, Zurich, Basel or Geneva the same way you search German cities. Swiss ads come back in CHF and the `countryCode` field tells you which market each row belongs to.

### You might also like

- [SEEK Job Scraper](https://apify.com/cirkit/seek-jobs-scraper) for Australia and New Zealand
- [Indeed Jobs Scraper](https://apify.com/cirkit/indeed-jobs-scraper) for global job listings
- [Glassdoor Company Scraper](https://apify.com/cirkit/glassdoor-company-scraper) for employer reviews and ratings
- [Workday Jobs Scraper](https://apify.com/cirkit/workday-jobs-scraper) for corporate career sites
- [Wellfound Jobs Scraper](https://apify.com/cirkit/wellfound-jobs-scraper) for startup roles

### Changelog

- **0.1** (2026-09-14): first release. Keyword, city and radius search across Germany, Austria and Switzerland, employment type, career level and remote policy filters, pasted XING search URLs, salary bands, company profiles and full descriptions.

# Actor input Schema

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

What to search for, one term per line, for example "software engineer", "Vertrieb", "Pflegefachkraft". German and English both work. Every keyword is combined with every city below. Leave empty to get every job in the cities you list.

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

DACH cities, one per line, for example "Berlin", "Munich", "Hamburg", "Vienna", "Zurich". XING matches loosely, so "Koln" and "Cologne" both resolve. Leave empty to search all of XING.

## `radius` (type: `integer`):

How far around each city to search, in kilometres. XING's own options are 5, 10, 20, 50 and 100. Leave empty for XING's default.

## `maxItems` (type: `integer`):

Hard cap on the total number of job rows across every search. Set to 0 for no limit. You are charged per row, so this is also your budget control. Note that XING itself serves at most about 1,000 jobs per individual search.

## `sortBy` (type: `string`):

XING's own sort order. Relevance is XING's default ranking. Date puts the newest ads first, which is what you want when running this on a schedule.

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

Restrict to these employment types. Leave empty for all.

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

Restrict to these seniority levels. Leave empty for all.

## `remoteOptions` (type: `array`):

Restrict to fully remote, hybrid or on-site ads. Leave empty for all.

## `startUrls` (type: `array`):

Paste XING jobs search URLs, one per line, for example https://www.xing.com/jobs/search?keywords=developer\&location=Berlin\&radius=20 . Build the search you want on XING, copy the address bar, and the keyword, city, radius, employment type, career level, remote policy and sort order in it are all honoured.

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

Apify Proxy settings. The default datacenter pool works against XING and is the cheapest option; residential proxies are not needed here.

## Actor input object example

```json
{
  "keywords": [
    "software engineer"
  ],
  "locations": [
    "Berlin"
  ],
  "radius": 20,
  "maxItems": 100,
  "sortBy": "relevance",
  "employmentTypes": [],
  "careerLevels": [],
  "remoteOptions": [],
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Everything this run collected as the Overview table: title, company, location, postcode, salary band, employment type, career level, remote policy, industry, posting date and link.

## `salaries` (type: `string`):

The pay side on its own: minimum, maximum and median with the currency, plus whether the number came from the employer or from XING's own estimate.

## `companies` (type: `string`):

The hiring companies: name, industry, headcount band, head office city and XING company page, next to the role they are hiring for.

## `jobsCsv` (type: `string`):

The full result set as CSV, ready for a spreadsheet, an ATS import or a BI tool.

## `consoleRun` (type: `string`):

The Apify Console page for this run, including the live log.

# 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"
    ],
    "locations": [
        "Berlin"
    ],
    "radius": 20,
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cirkit/xing-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 = {
    "keywords": ["software engineer"],
    "locations": ["Berlin"],
    "radius": 20,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cirkit/xing-jobs-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"
  ],
  "locations": [
    "Berlin"
  ],
  "radius": 20,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cirkit/xing-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cirkit/xing-jobs-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/8VdJvuMm6LaP4EUo8/builds/hQ3Hi4UYv3tQ9DeKg/openapi.json
