# 🏆 XING Job Scraper (DACH) ⚡ Advanced Data, Best Value 🏆 (`claygenius/best-cheapest-xing-job-scraper`) Actor

Scrape jobs from XING (Germany, Austria, Switzerland) — title, company, city, employment type, salary range, direct apply URL and logo. HTTP-only, fast and cheap, clean jobs-only output.

- **URL**: https://apify.com/claygenius/best-cheapest-xing-job-scraper.md
- **Developed by:** [Muhammad Shamshad Aslam](https://apify.com/claygenius) (community)
- **Categories:** AI, Automation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

## XING Job Scraper 🇩🇪🇦🇹🇨🇭 — Jobs across the DACH region

Scrape job listings from [XING](https://www.xing.com/jobs) — the leading professional network in **Germany, Austria and Switzerland**. Every job comes with company, city, employment type, **salary range (min/max/median)**, the **direct employer apply URL** and the company logo. HTTP-only — fast, with a low cost per result, no browser, no login.

### Input

Two ways to search — paste XING search URLs **(Option 1)** or use a keyword + filters **(Option 2)**. URLs take precedence.

| Field | Type | Description |
|---|---|---|
| `keyword` | string | Job title or skill, e.g. `java`, `produktmanager`, `pflegekraft`. |
| `location` | string | City or region, e.g. `Berlin`, `München`, `Wien`. Empty = all DACH. |
| `radius` | integer | Radius around the location in km. `0` = no radius filter. |
| `datePosted` | select | Any time / Past 24 hours / Last week / Last month. |
| `remoteOption` | multi-select | Full Remote / Hybrid / On-site. |
| `employmentType` | multi-select | Full-time, Part-time, Intern, Contractor, Volunteer, Temp, Seasonal. |
| `careerLevel` | multi-select | Student → Senior Executive. |
| `salaryMin` / `salaryMax` | integer | Annual salary band in EUR. |
| `fetchJobDetails` | boolean | Visit each job page for the full description, discipline, industry, career level, skills, language, remote options **and employer business details** (industry, size, city, company page URL). |
| `fetchCompanyDetails` | boolean | Also visit each employer's company *About us* page for founded year, employee count/size, website and about text. **Business data only — no contact persons or employee lists.** Cached per company. |
| `fetchEmployees` | boolean | Collect the staff each employer lists publicly on its XING company page — name, current role, profile URL, photo — plus the company's true headcount. **Personal data**, see the note below. |
| `searchUrls` | array | Paste XING job-search URLs (with any filters). Overrides the keyword + filters. |
| `maxItems` | integer | Cap on results. Empty (or `0`) = scrape **all**. |
| `proxyConfig` | object | Optional. Some XING jobs are geo-restricted to Germany — a DE proxy gives the most complete results. |

### Output

One clean item per job:

```json
{
  "id": "155730561.9e044b",
  "title": "Java Full Stack Entwickler (all genders)",
  "url": "https://www.xing.com/jobs/berlin-java-full-stack-entwickler-155730561",
  "summary": "Short teaser line, when XING supplies one",
  "company_name": "Accenture Dienstleistungen GmbH",
  "company_logo": "https://images.xing.com/…",
  "city": "Berlin",
  "locations": ["Berlin"],
  "employment_type": "Vollzeit",
  "salary_min": 55500,
  "salary_max": 78000,
  "salary_median": 66750,
  "salary_currency": "EUR",
  "apply_url": "https://www.accenture.com/de-de/careers/jobdetails?id=…",
  "redirects_to_third_party": true,
  "is_paid": false,
  "is_top_job": false,
  "refreshed_at": "2026-07-07T15:33:49Z",
  "active_until": "2026-08-06T00:00:00Z",
  "search_query": "java",
  "source": "xing.com",
  "scraped_at": "2026-07-19T09:00:00.000Z",

  "full_description": "…",
  "discipline": "IT und Softwareentwicklung",
  "industry": "IT-Dienstleister",
  "career_level": "Berufseinsteiger·in",
  "skills": ["software", "engineer", "informatik"],
  "language": "de",
  "remote_options": ["NON_REMOTE"],
  "job_code": null,

  "company_industry": "IT-Dienstleister",
  "company_size": "51-200 Mitarbeitende",
  "company_city": "Eschborn",
  "company_country": "Deutschland",
  "company_page_url": "https://www.xing.com/pages/dps",

  "company_founded": "1983",
  "company_employees": ">500 employees",
  "company_size_range": "501-1000",
  "company_website": "http://www.dps.de",
  "company_about": "DPS – IT for finance and retail …"
}
```

> **`fetchJobDetails`** adds the block from `full_description` down through `company_page_url` — full job content plus employer business details (`company_industry`, `company_size`, `company_city`, `company_country`, `company_page_url`).
>
> **`fetchCompanyDetails`** adds the final block (`company_founded`, `company_employees`, `company_size_range`, `company_website`, `company_about`) from each employer's *About us* page — cached per company. `company_founded` / `company_employees` are best-effort (XING renders those facts inconsistently).
>
> `fetchJobDetails` and `fetchCompanyDetails` return employer **business** data only — no personal data.
>
> **`fetchEmployees`** (off by default) adds `employees_total`, `employees_source_url` and an `employees` array of the staff the employer lists publicly on its XING company page:
>
> ```json
> "employees_total": 127,
> "employees_source_url": "https://www.xing.com/pages/betasystemssoftwareag/employees",
> "employees": [
>   {
>     "employee_id": "5717736.a710e9",
>     "name": "Sven Anhoff",
>     "first_name": "Sven",
>     "last_name": "Anhoff",
>     "current_role": "Product Manager UX, Chief Product Designer",
>     "roles": ["Product Manager UX, Chief Product Designer", "Product Owner, Product Design Lead"],
>     "profile_url": "https://www.xing.com/profile/Sven_Anhoff",
>     "photo_url": "https://profile-images.xing.com/images/…"
>   }
> ]
> ```
>
> **Scope and limits — read before using:**
>
> - XING serves logged-out visitors a **single window of roughly 30-40 identifiable profiles per company** and withholds the rest — this is a first-page view, not a full roster, and the count does not scale with company size (Accenture returns 38 of its 15,150 staff). `employees_total` reports the real headcount so you can see the gap.
> - **No email addresses or phone numbers.** XING publishes neither, and this actor does not guess or synthesise them.
> - `gender` is present in XING's payload but is deliberately **not** collected — it is a protected attribute under the AGG and creates discrimination exposure in a hiring workflow.
> - This is **personal data** under the GDPR. Use it only where you have a lawful basis, and note that Art. 14 generally requires you to notify people whose data you collected from a source other than themselves. `employees_source_url` and `scraped_at` are included so you can evidence provenance.

### Why this scraper

- **Structured salary on every job** — min / max / median in EUR, straight from XING's estimate (no second request)
- **Direct apply URL** — the employer's own application link, not just the XING page
- **Clean jobs-only dataset** — one consistent row shape, ready for analytics (no mixed job/company/profile rows to untangle)
- **Full coverage** — leave Max Items empty to walk the entire result set, deduplicated by job id
- **Fast & efficient** — pure HTTP, parses XING's server-rendered data; no headless browser burning compute, so your cost per result stays low

### Use cases

- **Recruiting & sourcing** — monitor DACH openings by role, city and employment type, with salary bands
- **Salary benchmarking** — the salary range on every listing makes market-rate analysis trivial
- **Job boards & aggregators** — feed clean, structured German-market listings into your platform
- **Market research** — hiring volume and compensation trends across Germany, Austria and Switzerland

### Notes

- Data comes from XING's server-rendered pages — no account, login or API key needed. The actor only ever reads what XING serves to an anonymous visitor.
- Some listings are geo-restricted to Germany; enable a DE proxy for the most complete results.
- By default this actor scrapes **jobs and employer business** data only. Personal data is collected solely when you switch on `fetchEmployees`, and is limited to what employers list publicly on their own company pages.

# Actor input Schema

## `searchUrls` (type: `array`):

Paste XING job-search URLs (e.g. https://www.xing.com/jobs/search?keywords=java\&location=berlin\&radius=20). When set, the keyword + filters below are ignored.

## `keyword` (type: `string`):

Job title or skill, e.g. 'java', 'produktmanager', 'pflegekraft'.

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

City or region, e.g. 'Berlin', 'München', 'Wien'. Leave empty for all DACH.

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

Radius around the location in km. 0 = no radius filter.

## `datePosted` (type: `string`):

Only jobs posted within this window.

## `remoteOption` (type: `array`):

Remote / hybrid / on-site.

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

Full-time, part-time, etc.

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

Seniority level.

## `salaryMin` (type: `integer`):

Minimum annual salary in EUR. 0 = no minimum.

## `salaryMax` (type: `integer`):

Maximum annual salary in EUR. 0 = no maximum.

## `fetchJobDetails` (type: `boolean`):

Visit each job page for the full description, discipline, industry, career level, skill keywords, language and remote options (slower but far richer).

## `fetchCompanyDetails` (type: `boolean`):

Also visit each employer's company 'About us' page for business details — founded year, employee count/size, website and about text. Business data only (no contact persons or employee lists). Results are cached per company.

## `fetchEmployees` (type: `boolean`):

Also collect the staff each employer lists publicly on its XING company page — name, current role, XING profile URL and photo, plus the company's true headcount. XING shows at most 30 profiles per company to logged-out visitors, so this is a first-page view, not a full roster. No email addresses or phone numbers (XING publishes none, and none are guessed). Personal data — use only where you have a lawful basis.

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

Maximum number of jobs to scrape. Leave empty (or 0) to scrape ALL results.

## `proxyConfig` (type: `object`):

Optional. Some XING jobs are geo-restricted to Germany — use a DE proxy for the most complete results.

## Actor input object example

```json
{
  "searchUrls": [],
  "keyword": "java",
  "radius": 0,
  "datePosted": "",
  "remoteOption": [],
  "employmentType": [],
  "careerLevel": [],
  "salaryMin": 0,
  "salaryMax": 0,
  "fetchJobDetails": false,
  "fetchCompanyDetails": false,
  "fetchEmployees": false,
  "maxItems": 50,
  "proxyConfig": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped jobs: title, company, city, employment type, salary range, apply URL and logo.

# 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 = {
    "searchUrls": [],
    "keyword": "java",
    "location": "",
    "maxItems": 50,
    "proxyConfig": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("claygenius/best-cheapest-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 = {
    "searchUrls": [],
    "keyword": "java",
    "location": "",
    "maxItems": 50,
    "proxyConfig": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("claygenius/best-cheapest-xing-job-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 '{
  "searchUrls": [],
  "keyword": "java",
  "location": "",
  "maxItems": 50,
  "proxyConfig": {
    "useApifyProxy": false
  }
}' |
apify call claygenius/best-cheapest-xing-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=claygenius/best-cheapest-xing-job-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/lXLeW96fqelSHdsHI/builds/Yh3hHs7kZ03oehpuq/openapi.json
