# XING Jobs Scraper — DACH Jobs, Salaries & Full Descriptions (`yugenox/xing-jobs-scraper`) Actor

Scrape XING job ads in Germany, Austria and Switzerland by keyword, city or company: title, company, address, salary estimate, employment type, career level, remote/hybrid, full description, keywords and the employer's apply URL. No login.

- **URL**: https://apify.com/yugenox/xing-jobs-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** Jobs, Automation
- **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: DACH jobs, salaries and full descriptions

Scrape job ads from **XING**, the leading professional network in Germany, Austria and Switzerland, by keyword, city or employer. Every job comes with the **title, company, full address, salary range, employment type, career level, discipline, industry, remote / hybrid / on-site, posted and expiry dates, the full description** and, where the employer uses its own application page, the **apply URL**. No login, no cookies, no XING account.

### What you get

| | |
|---|---|
| **Job** | Title, XING job URL, posted, last refreshed and expiry dates, paid / Top Job flags, XING keywords, language of the ad |
| **Company** | Name, XING company page, logo, company size, industry, headquarters city and country |
| **Location** | City, region, postal code and street (when the employer gives them), country, all workplaces |
| **Work** | Employment type (full-time, part-time, freelance, student …), career level, discipline, industry, remote / hybrid / on-site |
| **Salary** | Minimum, maximum and median per year with currency, and whether it is XING's estimate |
| **Description** | The full job ad as plain text and as HTML |
| **Apply** | Apply on XING or on the employer's site, with the employer's apply URL |

### How to use it

1. Enter one or more **keywords**, e.g. `Data Analyst`, `Python Entwickler`, `Pflegefachkraft`, `Projektmanager`.
2. Optionally enter a **location** such as `Berlin`, `München`, `Hamburg`, `Wien` or `Zürich` (add more under **More locations**). XING searches 20 km around it. Leave it empty to search everywhere.
3. Or list **companies** to get their open jobs.
4. Set **Max jobs** and any filters, then run.

Each keyword is searched in each location. **Max jobs** is the total for the run, shared fairly between your searches.

#### Input examples

Data analysts in Berlin and Hamburg:

```json
{
  "keywords": ["Data Analyst"],
  "locations": ["Berlin", "Hamburg"],
  "maxItems": 200
}
```

Remote or hybrid Python jobs, full-time, posted in the last 7 days:

```json
{
  "keywords": ["Python Entwickler"],
  "remote": ["FULL_REMOTE", "PARTLY_REMOTE"],
  "employmentType": ["FULL_TIME"],
  "postedWithinDays": 7,
  "maxItems": 50
}
```

All open jobs of an employer, with German labels:

```json
{
  "companies": ["Aareal Bank"],
  "language": "de",
  "maxItems": 100
}
```

A fast list without job pages (no description, address or remote options):

```json
{
  "keywords": ["Projektmanager"],
  "location": "München",
  "includeDetails": false,
  "maxItems": 500
}
```

You can also paste XING URLs into **XING URLs**: job URLs (`xing.com/jobs/hamburg-ki-engineer-158030277`) or jobs pages such as `xing.com/jobs/t-data-analyst`, `xing.com/jobs/jobs-in-berlin`, `xing.com/jobs/data-analyst-jobs-in-hamburg` or `xing.com/jobs/c-aareal-bank`.

### Output example

```json
{
  "site": "xing",
  "jobId": "158255755",
  "title": "Data Analyst & AI Expert (d/m/w)",
  "company": "DEKRA Arbeit GmbH",
  "companyUrl": "https://www.xing.com/pages/dekraarbeitgruppe",
  "companySize": "501-1,000 employees",
  "companyIndustry": "HR services and consulting",
  "location": "Hamburg, Freie und Hansestadt Hamburg, DE",
  "city": "Hamburg",
  "region": "Freie und Hansestadt Hamburg",
  "country": "Germany",
  "countryCode": "DE",
  "workplaceType": "On-site",
  "remoteOptions": ["NON_REMOTE"],
  "employmentType": "Full-time",
  "employmentTypeCode": "FULL_TIME",
  "careerLevel": "Professional/Experienced",
  "discipline": "Analysis and statistics",
  "salaryMin": 49500,
  "salaryMax": 59000,
  "salaryMedian": 50500,
  "salaryCurrency": "EUR",
  "salaryPeriod": "year",
  "salaryIsEstimate": true,
  "description": "Was Sie mitbringen sollten\n\nSie sind auf der Suche nach mehr als nur einem Job …",
  "language": "de",
  "keywords": ["informatik", "wirtschaftsinformatik", "data", "analyst", "visualisierung"],
  "postedAt": "2026-10-01T08:56:05.000Z",
  "refreshedAt": "2026-10-01T08:56:05.000Z",
  "expiresAt": "2027-04-01T23:50:41.000Z",
  "applyType": "External",
  "applyUrl": "https://www.dekra-arbeit.de/stellenmarkt/data-analyst-ai-expert-(d-m-w)-job-in-hamburg/…",
  "url": "https://www.xing.com/jobs/hamburg-data-analyst-ai-expert-158255755",
  "searchKeyword": "Data Analyst",
  "searchLocation": "Hamburg",
  "position": 2,
  "detailsFetched": true,
  "scrapedAt": "2026-10-01T22:24:35.127Z"
}
```

Every row has the same columns; a value the ad doesn't state is `null`.

### Use cases

- **Recruiting and sourcing**: see which companies in the DACH region are hiring for a role, where and at what level.
- **Salary benchmarking**: compare XING's salary ranges by title, city, career level and industry.
- **Labour-market research**: track hiring volume by discipline, region or employer over time.
- **Lead generation for HR services**: find companies that are actively hiring (company size and industry included).
- **Job alerts and job boards**: schedule a daily run with **Posted or refreshed within (days)** = 1.

### FAQ

**Do I need a XING account, cookies or a login?** No. The scraper reads the same public job pages any visitor sees. It never logs in and needs nothing from you except a search.

**Why are some search results missing?** XING lists some jobs that it doesn't show to logged-out visitors (or that are no longer online). Those are skipped and never charged, and the run's status message tells you how many there were. Location-only searches have the most of them, so add a keyword for the fullest results.

**How many jobs can I get?** XING shows up to 2,000 results per search. Set **Max jobs** to 0 to get everything your searches find; split very large searches by city or keyword.

**Why was my location skipped?** If XING doesn't recognise a place, it ignores it and returns jobs from everywhere. The scraper detects this, skips that search, doesn't charge for it and says so in the status message. Use a city name, e.g. `Berlin`, `München`, `Wien`.

**Why does a company search say jobs from other employers were left out?** XING's company pages also show similar jobs from other employers after the company's own. The scraper keeps only the company you asked for and doesn't charge for the rest.

**How fast is it?** Usually a few jobs per second with job details (one job page each), and faster without them.

**Which proxy should I use?** Keep the default (Apify Proxy, datacenter). It comes with every Apify plan, including the free one. If XING refuses datacenter IPs for a while, the run switches to residential proxies when your account has them, and carries on without them when it doesn't.

**What does a run cost?** You pay per job saved (the job page details are included), a small fee per search and a small fee per run. See the Pricing tab. Jobs that are hidden, filtered out or from other employers are never charged.

**Is it legal to scrape XING?** This Actor only collects publicly available data: job ads that anyone can see on XING without an account, such as the job title, employer, location, salary range and description. Collecting publicly available data is generally legal, but you're responsible for how you use it. Job ads describe roles, not people, but an ad can name a contact person; the scraper removes personal e-mail addresses and phone numbers, and the name written next to them, from descriptions. It never reads member profiles. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as XING's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from pages XING shows to any visitor without logging in. It never uses a login, never touches member profiles, messages or applications, and follows XING's robots.txt (it reads XING's public jobs pages, not the search or API paths robots.txt reserves).

*This Actor is not affiliated with, endorsed by or sponsored by XING or New Work SE. XING is a trademark of its owner.*

# Actor input Schema

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

Job titles or skills, e.g. "Python Entwickler", "Data Analyst", "Pflegefachkraft", "Projektmanager". Each keyword is searched separately (and in each location).

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

A city, e.g. "Berlin", "München", "Hamburg", "Wien", "Zürich" (XING searches 20 km around it). Leave empty to search everywhere. A place XING doesn't recognise is skipped (and not charged) instead of returning jobs from everywhere.

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

Run the same keywords in several cities, e.g. "Köln", "Frankfurt am Main".

## `companies` (type: `array`):

All open jobs of these employers on XING, e.g. "Aareal Bank", "Deutsche Bahn".

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

Maximum number of jobs for the whole run, shared fairly between your searches (a search that finds fewer leaves its share to the others). 0 = everything (XING shows up to 2,000 results per search).

## `includeDetails` (type: `boolean`):

Open every job page for the full description, address, country, remote/hybrid, career level, discipline, industry, company size and the employer's apply URL. Included in the price. Turn off for a faster list with title, company, city, employment type and salary only.

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

Language of XING's labels (employment type, career level, discipline, industry, country). The job ads themselves stay in the language the employer wrote them in.

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

Optional: XING job URLs (they end in a number, e.g. xing.com/jobs/hamburg-ki-engineer-158030277) or XING jobs pages such as xing.com/jobs/t-data-analyst, xing.com/jobs/jobs-in-berlin, xing.com/jobs/c-aareal-bank. A xing.com/jobs/search?keywords=…\&location=… URL is turned into the matching jobs page.

## `employmentType` (type: `array`):

Only these employment types. Empty = all.

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

Only jobs with these work arrangements. Empty = all. Uses the job page (details are turned on automatically).

## `careerLevel` (type: `array`):

Only these career levels. Empty = all. Uses the job page (details are turned on automatically).

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

Only jobs XING lists as posted or refreshed in the last N days. Empty = any time.

## `minSalary` (type: `integer`):

Only jobs whose salary range (XING's estimate or the employer's figure) reaches at least this much per year, in the job's currency. Jobs without a salary are left out when this is set.

## `maxConcurrency` (type: `integer`):

How many job pages to read at the same time.

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

Apify Proxy (datacenter) is the default and comes with every Apify plan. If XING refuses datacenter IPs for a while, the run switches to residential proxies when your account has them.

## Actor input object example

```json
{
  "keywords": [
    "Data Analyst"
  ],
  "location": "Berlin",
  "maxItems": 20,
  "includeDetails": true,
  "language": "en",
  "maxConcurrency": 4,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped jobs.

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, counts, requests and proxy use.

# 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": [
        "Data Analyst"
    ],
    "location": "Berlin",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/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": ["Data Analyst"],
    "location": "Berlin",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/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/rPLx7jV7Zt1ZAxNc9/builds/V9ynGG5S0RIJAIyed/openapi.json
