# XING Jobs Scraper - German Job Postings Data (`studio-amba/xing-jobs-scraper`) Actor

Scrape job postings from XING Jobs (xing.com/jobs), the job board of the German-speaking professional network. Search by keyword and location. Extract titles, companies, locations, salaries, career levels, full descriptions, and apply links. No login or cookies required.

- **URL**: https://apify.com/studio-amba/xing-jobs-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 1 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 result scrapeds

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 Jobs Scraper — German Job Postings

Scrape job postings from [XING Jobs](https://www.xing.com/jobs), the job board of the German-speaking professional network (Germany, Austria, Switzerland). Search by keyword and location, and get structured job data including salaries, career levels, and full job descriptions. No login or cookies required.

### Why use this actor?

- **Salary data on most postings** — XING publishes employer salary ranges and its own salary estimates. Both are extracted as structured numbers (min / max / median / currency).
- **Full job descriptions included** — every result carries the complete description as both plain text and HTML, without visiting each posting individually.
- **DACH coverage** — XING is one of the largest job platforms for Germany, Austria, and Switzerland, with a strong base of direct employer postings.
- **No login, no cookies** — the actor only reads the public, logged-out job search. You never risk an account and never handle credentials.
- **Rich metadata** — career level, discipline, industry, remote options, kununu employer rating, apply links, posting and expiry dates.

### How to scrape XING Jobs data

1. Open the actor on the Apify platform.
2. Enter a **Search Query** — a German keyword works best (e.g. `entwickler`, `vertrieb`, `projektmanager`, `pflege`).
3. Optionally set a **Location** (e.g. `Berlin`, `München`, `Hamburg`, `Wien`, `Zürich`).
4. Set **Max Results** to the number of postings you need.
5. Click **Start** and wait for the run to finish.
6. Download the dataset as JSON, CSV, or Excel from the **Storage** tab.

The actor talks directly to XING's public job search API, so runs are fast and cheap: one request fetches 20 postings including their full descriptions.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchQuery` | string | `entwickler` | Job search keyword, ideally in German. |
| `location` | string | — | City or region (e.g. `Berlin`, `München`, `Wien`). Empty = everywhere. |
| `maxResults` | integer | `50` | Maximum number of job postings to scrape (up to 3000 per query). |
| `proxyConfiguration` | object | Apify residential | Proxy settings. Residential proxies recommended. |

Example input:

```json
{
    "searchQuery": "entwickler",
    "location": "Berlin",
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Output

| Field | Type | Example | Description |
|-------|------|---------|-------------|
| `jobTitle` | string | `Full-Stack Entwickler (m/w/d)` | Job position title. |
| `company` | string | `TELiAS GmbH` | Hiring company name. |
| `companyRating` | number | `4.2` | kununu employer rating (1–5), when available. |
| `companyLogoUrl` | string | `https://www.xing.com/imagecache/...` | Company logo URL. |
| `location` / `city` | string | `Köln` | Job location city. |
| `employmentType` | string | `Vollzeit` | Employment type label. |
| `careerLevel` | string | `Mit Berufserfahrung` | Career level label. |
| `discipline` | string | `IT und Softwareentwicklung` | Job discipline / function. |
| `industry` | string | `Internet, IT` | Industry of the hiring company. |
| `remoteOptions` | array | `["PARTLY_REMOTE"]` | Remote work options. |
| `salary` | string | `EUR 40259 - EUR 58482` | Human-readable salary range. |
| `salaryMin` / `salaryMax` | integer | `40259` / `58482` | Yearly salary bounds. |
| `salaryMedian` | integer | `51500` | Median (on XING salary estimates). |
| `salaryCurrency` | string | `EUR` | Salary currency. |
| `salaryIsEstimate` | boolean | `false` | Whether the salary is a XING estimate. |
| `descriptionText` | string | `Seit 2003 helfen wir...` | Full description as plain text. |
| `descriptionHtml` | string | `<p>Seit 2003...</p>` | Full description as HTML. |
| `keywords` | array | `["softwareentwicklung", ...]` | Keywords attached to the posting. |
| `applyUrl` | string | `https://bms.personalwerk.de/...` | External apply link, when present. |
| `postedDate` | string | `2026-05-19T10:05:22Z` | When the posting was activated. |
| `refreshedDate` | string | `2026-07-03T10:05:22Z` | When it was last refreshed. |
| `activeUntil` | string | `2026-07-18T10:05:24Z` | When the posting expires. |
| `offerId` | string | `154445249.df8fc5` | XING internal posting ID. |
| `url` | string | `https://www.xing.com/jobs/koeln-...` | Full posting URL. |
| `scrapedAt` | string | `2026-07-10T09:00:00.000Z` | Scrape timestamp. |

### Example output

```json
{
    "jobTitle": "Full-Stack Entwickler (m/w/d) in Vollzeit",
    "company": "TELiAS GmbH",
    "companyRating": null,
    "location": "Köln",
    "city": "Köln",
    "employmentType": "Vollzeit",
    "careerLevel": "Mit Berufserfahrung",
    "discipline": "IT und Softwareentwicklung",
    "industry": "Sonstige Branchen",
    "remoteOptions": ["PARTLY_REMOTE"],
    "salary": "EUR 40259 - EUR 58482",
    "salaryMin": 40259,
    "salaryMax": 58482,
    "salaryMedian": null,
    "salaryCurrency": "EUR",
    "salaryIsEstimate": false,
    "descriptionText": "Seit 2003 helfen wir Unternehmen, flexibler zu arbeiten...",
    "applyUrl": null,
    "postedDate": "2026-05-19T10:05:22Z",
    "activeUntil": "2026-07-18T10:05:24Z",
    "offerId": "154445249.df8fc5",
    "url": "https://www.xing.com/jobs/koeln-full-stack-entwickler-vollzeit-154445249",
    "scrapedAt": "2026-07-10T09:00:00.000Z"
}
```

### Salary data

XING postings carry one of two salary shapes, and the actor normalizes both:

- **Employer-published ranges** (`salaryIsEstimate: false`) — the range the company attached to the posting.
- **XING salary estimates** (`salaryIsEstimate: true`) — XING's own market estimate, including a `salaryMedian`.

### Cost estimate

The actor uses XING's public search API directly (no browser), so runs are light: roughly 1 request per 20 results plus minimal compute. A 100-result run typically finishes in well under a minute.

### Limitations / known issues

- The public search returns up to 20 postings per request; the actor paginates automatically up to 3000 results per query. Narrow with `location` or more specific keywords for deeper coverage.
- XING does not expose a total match count on the public search, so the actor paginates until results run out or `maxResults` is reached.
- The public search is semantic: once exact matches run out, closely related roles may appear in the results.
- German keywords return the best results — the platform is DACH-focused.

### Related scrapers

Looking for other European job boards? Check out these actors:

- **StepStone Scraper** — Germany's biggest job board
- **HelloWork Scraper** — France's leading general job board
- **Welcome to the Jungle Scraper** — French tech and startup jobs
- **IrishJobs Scraper** — Ireland's leading job board
- **jobup.ch Scraper** — Swiss job market

### Disclaimer

This actor only accesses publicly available data from XING's logged-out job search, without logging in or bypassing any access controls. Use the data responsibly and in accordance with applicable laws and XING's terms of service.

# Actor input Schema

## `searchQuery` (type: `string`):

Job search keyword, ideally in German (e.g. 'entwickler', 'vertrieb', 'projektmanager', 'buchhalter'). Leave empty to use the default 'entwickler'.

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

City or region to search in (e.g. 'Berlin', 'München', 'Hamburg', 'Wien', 'Zürich'). Leave empty to search everywhere.

## `maxResults` (type: `integer`):

Maximum number of job postings to scrape.

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

Proxy settings. Residential proxies recommended for reliable access.

## Actor input object example

```json
{
  "searchQuery": "entwickler",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "entwickler",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/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 = {
    "searchQuery": "entwickler",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/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 '{
  "searchQuery": "entwickler",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/xing-jobs-scraper --silent --output-dataset

```

## MCP server setup

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