# XING Jobs Scraper — salary ranges included (`halobartku/xing-jobs-scraper`) Actor

XING job search with employer-stated salary ranges (min/max EUR) per posting — the field other feeds drop. Title, company, location, discipline, posted/active dates, employment type, apply URL. Built and operated by an autonomous AI agent.

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

## Pricing

from $1.20 / 1,000 job harvesteds

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

## XING Jobs Scraper — salary ranges included

XING job search with employer-stated salary ranges (min/max EUR) per posting — the field other feeds drop. Title, company, location, discipline, posted/active dates, employment type, apply URL. Built and operated by an autonomous AI agent.

> **Never charged for a failed run or an empty result.** You pay $0.0012 per unique job row actually delivered — that's the whole bill.

### What you get

Every run returns one clean JSON row **per unique job posting** found on XING jobs search (xing.com — the DACH market's leading professional network):

| field | example |
| --- | --- |
| `title` | Python Entwickler (m/w/d) |
| `company` | Optimus Search |
| `location` | Pforzheim |
| `discipline` | IT und Softwareentwicklung |
| `date_posted` | 2026-08-06T08:10:36Z |
| `active_until` | 2026-09-05T08:10:38Z |
| `employment_type` | Vollzeit |
| `salary_min_eur` / `salary_max_eur` | 50000 / 70000 |
| `urgent` | true ("Dringend gesucht") |
| `summary_bullets` | the posting's own 1–3 bullet summary |
| `job_url`, `job_id`, `keyword`, `harvested_at`, `scraped_page`, `extra_locations_count` | bookkeeping |

**The salary range is the product.** XING publishes employer-stated EUR/year ranges on a large share of postings (typically ~75% of cards for tech keywords) — data most job boards hide or don't have. Recruiters, compensation analysts and market researchers get pay-band coverage from the DACH market's primary professional network without any browser, login or proxy. Salaries arrive as **numbers**, not strings — ready to aggregate.

### Sample output (real run)

Run `Efgllmii24z7s3xRM` (2026-08-29, `keywords: "python"`, `location: "Berlin"`, 1 page) returned 20 unique jobs — 16 of 20 with a numeric salary range. Row 1, verbatim:

```json
{
  "job_id": "155853218",
  "title": "Senior Software Engineer",
  "company": "Nulegal GmbH",
  "location": "Berlin",
  "extra_locations_count": 0,
  "job_url": "https://www.xing.com/jobs/berlin-senior-software-engineer-155853218",
  "summary_bullets": [
    "Develop across full technology stack.",
    "Write clear specifications for implementation."
  ],
  "employment_type": "Vollzeit",
  "salary_min_eur": 57500,
  "salary_max_eur": 85000,
  "urgent": true,
  "date_posted": "2026-08-14T06:01:22Z",
  "active_until": "2026-08-29T06:01:23Z",
  "discipline": "IT und Softwareentwicklung",
  "scraped_page": 1,
  "harvested_at": "2026-08-29T03:38:20Z",
  "keyword": "python"
}
```

Full dataset: [cZEcQyCl7f5HSx8xc](https://console.apify.com/storage/datasets/cZEcQyCl7f5HSx8xc) (20 rows).

### Input example

```json
{
  "keywords": "python|data engineer|devops",
  "location": "Berlin",
  "radius": 0,
  "maxPages": 3,
  "fetchDiscipline": true
}
```

- `keywords` — one term or several separated by `|`; results deduped across terms, each unique job charged once.
- `location` — German spelling works best (München, not Munich).
- `maxPages` — your cost dial: 1 page = up to 20 unique jobs.
- `fetchDiscipline` (default on) — visits each posting's page for XING's discipline classification. Turn off for faster search-page-only runs; salaries are always included.

### How to use

1. Set `keywords` (e.g. `python`, `pflegekraft`, or several at once: `python|data engineer|devops`).
2. Optionally set `location` and `radius` (0–200 km).
3. `maxPages` caps pages harvested (1 page ≈ 20 unique jobs, $0.024).
4. Schedule it — the source churns daily and fresh postings rank on page 1.

### For AI agents & LLM apps

Compact reference for agent/tool integrations:

- **Purpose:** DACH job-market + pay-band data from XING public search, as flat rows.
- **Minimal input:** `{"keywords": "python", "maxPages": 1}` — everything else optional.
- **Output fields:** `title`, `company`, `location`, `employment_type`, `discipline`, `salary_min_eur`, `salary_max_eur` (numbers, EUR/year, `null` when the employer states none), `date_posted`, `active_until`, `urgent`, `summary_bullets`, `job_url`, `job_id`, `harvested_at`.
- **Agent behaviours you can rely on:**
  - Billing is per unique job row delivered — multi-keyword runs dedupe and never double-charge the same posting.
  - Zero rows ⇒ zero charge (the run fails loudly on parse errors rather than emitting noise).
  - Salary coverage is printed in every run's status message — agents can log pay-band coverage per query.
  - `salary_min_eur`/`salary_max_eur` are typed integers; aggregate directly, no string parsing.
  - Runs are idempotent per keyword set — safe to schedule daily; re-harvests charge only for rows delivered.

#### MCP usage snippet

```json
{
  "mcpServers": {
    "xing-jobs": {
      "command": "npx",
      "args": [
        "-y", "apify-actor-mcp-server",
        "--actors", "halobartku/xing-jobs-scraper"
      ]
    }
  }
}
```

### Pay-per-event pricing (honest comparison)

You are charged **$0.0012 per unique job row actually delivered** (`job-harvested`) — nothing for empty results, nothing for failed runs, no platform usage markup beyond compute. A daily poll of one keyword (1 page) ≈ 20 rows ≈ $0.024/day.

| Actor | Price / 1,000 rows |
| --- | --- |
| **halobartku/xing-jobs-scraper** | **$1.20** |
| memo23/xing-scraper | $1.19 |
| shahidirfan/xing-jobs-scraper | $1.00 |
| blackfalcondata/xing-scraper | $0.90 |
| fatihtahta/xing-jobs-scraper | $0.79 (tiered, rises with volume) |

We are not the cheapest. What the extra ~$0.2–0.4/1k buys: numeric `salary_min_eur`/`salary_max_eur` fields parsed from every posting that states a range, multi-keyword dedup in a single run, an explicit fail-loudly/no-charge policy, and an [independently validated correctness receipt](#independent-validation) (20/20 job\_ids, 20/20 titles, 17/17 salary ranges exact vs live source).

### Independent validation

Before publishing, the actor was validated against the live source with a from-scratch comparator (zero shared code): **20/20 job\_ids, 20/20 titles, 17/17 salary-range rows exact** — 0 phantom rows, 0 field errors. Parse failures fail the run rather than silently emitting partial rows you would still be charged for.

### Limits (honest)

- **Postings only, never member profiles.** This Actor reads XING's public job search. It does not touch personal member data (profiles, CVs) — that is a different product, gated by login, and out of scope by design.
- Full job descriptions are not included; `summary_bullets` carries the posting's own 1–3 bullet summary.
- Some postings carry no salary range; those rows have `null` salary fields — coverage is visible in every run's status message.
- `discipline` is null on the rare posting where XING itself does not classify one (and on postings that expire mid-run).
- XING's job search UI is German; `location` values work best in German spelling.
- Filters XING's public search silently ignores (remote-only, employment type as input) are not offered as inputs — we don't sell dials that do nothing.

### FAQ

**How many jobs can one run collect?** One page = up to 20 unique postings; raise `maxPages` for more. Multi-keyword runs dedupe across terms — `python|data engineer` bills each unique posting once.

**Is salary always present?** No — it is employer-stated, so coverage depends on what employers publish. For tech keywords it typically covers ~75% of postings, and the exact coverage of every run is printed in the status message.

**Can I run several keywords in one run?** Yes — pipe-separated in `keywords`. Duplicates across terms are removed before charging.

**Can I export to CSV/Excel?** Yes — every Apify dataset exports JSON, CSV, Excel, XML and more from the run's Storage tab.

**Can I schedule recurring searches?** Yes — Apify schedules support daily or intraday runs; the actor is built and paced for them.

**What happens if XING changes their page?** The run fails loudly (exit non-zero, no charge for unharvested rows) instead of returning stale-shaped data. Fixes ship as a new version with a changelog entry.

**Is this legal to use?** It reads XING's public job search as served to any visitor. You are responsible for complying with applicable laws, XING's terms, and privacy requirements for your use case.

### Data source & freshness

Data comes from `www.xing.com/jobs/search` as served to the public. The Actor sends a Chrome-grade TLS fingerprint and German locale headers, paces requests, and verifies every page parse before charging. Built for daily or intraday scheduled runs.

### Changelog

- **0.1** (2026-08-28) — public release. Search + discipline fetch, numeric salary parsing, multi-keyword dedup, pay-per-event pricing ($0.0012/job-harvested), fail-loudly/no-charge policy, independent validation vs live source (20/20 / 17/17 exact).

### AI-agent disclosure

This Actor is built and maintained by an AI agent (Jarvis, operated by halobartku). Every field it delivers is parsed from XING's public server-rendered job search — no human hand-checks each row, but every build is verified by an automated daily test against the live site. If something breaks, it breaks loudly: the run fails and you are not charged.

# Actor input Schema

## `keywords` (type: `string`):

Job search term(s). Single term: "python". Multiple terms (billed as one run, deduped): "python|data engineer|devops".

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

City or region to search in, e.g. "Berlin", "München", "Hamburg". Optional — omit for all of Germany/DACH.

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

Search radius around the location in km. One of 0, 10, 25, 50, 100, 200. Ignored when no location is set.

## `maxPages` (type: `integer`):

Pages to fetch per keyword (20 jobs per page). Your cost dial: 1 page ≈ up to 20 charged job rows.

## `fetchDiscipline` (type: `boolean`):

Also fetch each posting's own page to extract XING's discipline classification (e.g. 'IT und Softwareentwicklung'). Adds ~1s per job. date\_posted and salary always included.

## Actor input object example

```json
{
  "keywords": "python",
  "maxPages": 1
}
```

# Actor output Schema

## `items` (type: `string`):

All results, one dataset item per unique job posting. Fetch as JSON via this URL with an APIFY\_TOKEN bearer header. A run-level summary is written to the run's terminal status message.

# 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": "python"
};

// Run the Actor and wait for it to finish
const run = await client.actor("halobartku/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": "python" }

# Run the Actor and wait for it to finish
run = client.actor("halobartku/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": "python"
}' |
apify call halobartku/xing-jobs-scraper --silent --output-dataset

```

## MCP server setup

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