# XING Jobs Scraper - Search Jobs in Germany (`confidential_gnat/xing-jobs-scraper`) Actor

Scrapes job listings from XING Jobs (xing.com/jobs): title, company, location, employment type, salary, posted date, full description and apply link. Search by keyword, location, search URL or job URL.

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

## Pricing

from $0.80 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 - Search Jobs in Germany by Keyword & Location

**Scrape job listings from XING Jobs (xing.com/jobs)**: title, company, city, employment type, salary, posted date, full job description and apply link. Export the results as **JSON, CSV or Excel**, or call the actor as an **API**. Type a keyword and a city or paste a XING search URL, press Start, and get clean **XING job data**. Repeat runs skip jobs you already scraped, so you never pay twice for the same job.

**Target website:** [xing.com/jobs](https://www.xing.com/jobs)

### ✨ Features of this XING jobs scraper

- **Job listing extraction** — title, company, city, employment type, salary, posted and refreshed dates, apply link and job summary.
- **Full job details** — complete description (HTML and plain text), industry, company page and logo, full address and validity date for every job.
- **Pagination support** — keeps paging through search results until Max items is reached.
- **Keyword, location and URL input** — search by keyword and city, paste a XING search URL, or pass single job URLs.
- **Incremental runs, no repeat charges** — with a cache project name, jobs you already scraped are skipped on every later run, so scheduled runs return only new jobs and you never pay for the same job twice.
- **Proxy support** — optional Apify Proxy, off by default.
- **No browser required** — plain HTTP requests keep runs fast and cheap.

### 🚀 How to scrape XING jobs in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account — includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a keyword, search URL or job URL is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 XING jobs scraper pricing

This actor uses **pay-per-result** billing: you pay for each job saved to the dataset.

- New Apify accounts include **$5 of free monthly credit**.
- The actor uses plain HTTP requests, so it costs significantly less to run than browser-based scrapers.
- The proxy is disabled by default; leaving it off keeps runs cheapest.
- Jobs skipped by the cache are not charged. Reuse the same **Cache project name** across runs and the same jobs are never scraped (or billed) again, so repeated and scheduled runs cost only for genuinely new jobs.

### 🔧 XING jobs scraper input configuration

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Search keywords (`keywords`) | array | — | `["python"]` (prefill) | Job titles or skills to search for. Each keyword is searched separately. |
| Location (`location`) | string | — | — | City or region, for example `Berlin`. Leave empty to search all of Germany. Applies to keyword searches. |
| Search or job URLs (`startUrls`) | array | — | — | XING search URLs or single job URLs. The keywords and location in a search URL are used. |
| Scrape full job description (`scrapeDetails`) | boolean | — | `true` | Open every job page for the description, industry, company page, full address and validity date. Turn off for faster runs with the search summary only. |
| Cache project name (`cacheProjectName`) | string | — | — | Use the same name on each run to get only new jobs. Cached jobs are skipped, not charged and not counted towards Max items. Records get `changeType: new`. |
| Max items per search (`maxItems`) | integer | — | `5` | Maximum unique jobs saved for each keyword or search URL. |
| Max concurrency (`maxConcurrency`) | integer | — | `5` | How many requests run in parallel. |
| Proxy configuration (`proxyConfiguration`) | object | — | no proxy | Works without a proxy. Enable Apify Proxy only if you get blocked. |

**Supported URL types:**

- Search: `https://www.xing.com/jobs/search?keywords=python&location=Berlin`
- Job: `https://www.xing.com/jobs/hannover-software-engineer-157943309`

### 📦 XING jobs scraper output data

Each job is saved as one dataset item with the fields `id`, `url`, `title`, `companyName`, `companyLogoUrl`, `companyProfileUrl`, `industry`, `location`, `city`, `region`, `postalCode`, `country`, `employmentType`, `salaryText`, `salaryMin`, `salaryMax`, `salaryMedian`, `salaryCurrency`, `salaryType`, `postedAt`, `refreshedAt`, `validThrough`, `applyUrl`, `externalApplication`, `summary`, `descriptionHtml`, `description`, `scrapedAt` and, when caching is on, `changeType`. The dataset has **1 view**, **Overview**, a table of the id, title, company, city, employment type, salary, dates and job URL. Download it as JSON, HTML, CSV or Excel.

**Output at a glance:**

| Job | Company | City | Type | Salary | Posted |
| --- | ------- | ---- | ---- | ------ | ------ |
| [Software Engineer – Data Processing & Backend (m](https://www.xing.com/jobs/berlin-software-engineer-data-processing-backend-155714841) | empit | Berlin | Full-time | 50500 - 73000 EUR | 2026-06-25 |
| [(Senior) Full Stack Python Developer – Fokus Tra](https://www.xing.com/jobs/berlin-senior-full-stack-python-developer-fokus-transaction-advisory-tech-157734751) | Ebner Stolz Mönning Bachem Wirtschaftsprüfer Steuerberater Rechtsanwälte Partnerschaft mbB | Berlin | Full-time | 63500 - 86000 EUR | 2026-09-08 |

**Sample output (raw JSON):**

```json
[
    {
        "id": "155714841",
        "url": "https://www.xing.com/jobs/berlin-software-engineer-data-processing-backend-155714841",
        "title": "Software Engineer – Data Processing & Backend (m/w/d)",
        "companyName": "empit",
        "companyLogoUrl": "https://www.xing.com/imagecache/public/scaled_original_image/eyJ1dWlkI...",
        "companyProfileUrl": "https://www.xing.com/pages/empitgmbh",
        "industry": "Environmental protection",
        "location": "Berlin",
        "city": "Berlin",
        "region": "Land Berlin",
        "postalCode": null,
        "country": "DE",
        "employmentType": "Full-time",
        "salaryText": "50500 - 73000 EUR",
        "salaryMin": 50500,
        "salaryMax": 73000,
        "salaryMedian": 62000,
        "salaryCurrency": "EUR",
        "salaryType": "estimate",
        "postedAt": "2026-06-25T06:15:22Z",
        "refreshedAt": "2026-06-25T06:15:22Z",
        "validThrough": "2026-12-24T21:09:58Z",
        "applyUrl": "https://empit.jobs.personio.com/job/2610488?language=de&utm_source=xing.com",
        "externalApplication": false,
        "summary": null,
        "descriptionHtml": "<DIV><DIV><H2>Deine Mission</H2><DIV><UL><LI><STRONG>Datenverarbeitung & Signalanalyse:</STRONG> Du entwickelst und pflegst Backend-Systeme, die rohe Messdaten...",
        "description": "Deine Mission\n- Datenverarbeitung & Signalanalyse: Du entwickelst und pflegst Backend-Systeme, die rohe Messdaten aus unseren CMI-Inspektionen aufnehmen, transf...",
        "scrapedAt": "2026-10-12T17:01:31.051Z",
        "changeType": "new"
    },
    {
        "id": "157734751",
        "url": "https://www.xing.com/jobs/berlin-senior-full-stack-python-developer-fokus-transaction-advisory-tech-157734751",
        "title": "(Senior) Full Stack Python Developer – Fokus Transaction Advisory Tech (m/w/d)",
        "companyName": "Ebner Stolz Mönning Bachem Wirtschaftsprüfer Steuerberater Rechtsanwälte Partnerschaft mbB",
        "companyLogoUrl": "https://www.xing.com/imagecache/public/scaled_original_image/eyJ1dWlkI...",
        "companyProfileUrl": "https://www.xing.com/pages/rsmebnerstolz",
        "industry": "Auditing, tax and law",
        "location": "Berlin",
        "city": "Berlin",
        "region": "Land Berlin",
        "postalCode": null,
        "country": "DE",
        "employmentType": "Full-time",
        "salaryText": "63500 - 86000 EUR",
        "salaryMin": 63500,
        "salaryMax": 86000,
        "salaryMedian": 74000,
        "salaryCurrency": "EUR",
        "salaryType": "estimate",
        "postedAt": "2026-09-08T22:33:20Z",
        "refreshedAt": "2026-09-08T22:33:20Z",
        "validThrough": "2027-03-10T13:27:56Z",
        "applyUrl": "https://www.ebnerstolz.de/de/karriere/stellenangebote/senior-full-stack-python-developer-f",
        "externalApplication": false,
        "summary": null,
        "descriptionHtml": "<DIV><DIV><H3>Zur Gestaltung des digitalen Wandels in der <B>Transaktionsberatung</B> suchen wir dich<B> ab sofort in Berlin oder Stuttgart </B>als Verstärkung!...",
        "description": "Zur Gestaltung des digitalen Wandels in der Transaktionsberatung suchen wir dich ab sofort in Berlin oder Stuttgart als Verstärkung!\n(Senior) Full Stack Python...",
        "scrapedAt": "2026-10-12T17:01:31.051Z",
        "changeType": "new"
    }
]
```

`salaryType` is `estimate` when the figure is XING's own salary estimate, `range` for a range given by the employer and `fixed` for a single amount. Jobs without any salary information have empty salary fields.

### 🐍 How to scrape XING with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/xing-jobs-scraper").call(run_input={
    "keywords": ["python"],
    "location": "Berlin",
    "maxItems": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/xing-jobs-scraper').call({
    keywords: ['python'],
    location: 'Berlin',
    maxItems: 10,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** — start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~xing-jobs-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["python"], "location": "Berlin", "maxItems": 10}'
```

### 💡 What you can use XING jobs data for

- Job market research: which skills, salaries and employment types are in demand in German cities
- Recruiting and sourcing: spot companies that are hiring for a role and reach out first
- Salary benchmarking with XING's salary estimates and employer-given ranges
- Job aggregators and alerts that list new German postings every day
- Lead generation by finding companies that are growing a team

Recruiters, HR analysts, job boards, researchers and sales teams in the German-speaking market typically use this data.

### ⚠️ Limitations & known issues

- **Hidden results** — XING hides roughly a third to a half of the search results from visitors who are not logged in. The actor returns every job it can read and skips the hidden ones, so a page of 20 results can yield fewer jobs.
- **Search depth** — XING returns at most about 1,000 results per search; use more specific keywords or locations to go deeper.
- **Login-required pages** — The actor cannot access content behind authentication.
- **Salary** — Only jobs that show a salary or a XING salary estimate have salary fields.
- **Layout changes** — XING can change its site, which may affect some fields until the actor is updated.

### ❓ Frequently asked questions

#### Can I scrape XING legally?

The actor only collects job postings that are already publicly visible on xing.com, without logging in or accessing private profiles. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for complying with XING's Terms of Service and applicable laws such as GDPR if you handle personal data.

#### What data does the XING scraper return?

Every job has its title, company, city, employment type, salary information when shown, dates and apply link. With full job description turned on, you also get the complete description (HTML and plain text), industry, company page and logo, region, country and validity date.

#### How many jobs can I scrape from one XING search?

`maxItems` limits the number of jobs **per keyword or search URL**, not for the whole run. XING returns at most about 1,000 results per search, and some results are hidden from logged-out visitors.

#### Do I need a proxy to scrape xing.com?

No. The actor works without a proxy by default, which keeps runs cheapest. Turn on Apify Proxy only if you get blocked on very large runs.

#### How do I scrape XING with Python?

Use the Python example above: call the actor with `ApifyClient`, then iterate over the dataset items of the finished run.

#### Can I run this XING scraper on a schedule and avoid paying for repeat jobs?

Yes. Use Apify Schedules and set the same **Cache project name** on every scheduled run. The actor skips jobs it already saved, so each run returns, and charges for, only new jobs, marked with `changeType: new`.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why do I get fewer jobs than Max items?

XING hides a share of its results from visitors who are not logged in, and a search is capped at about 1,000 results. The actor reads every visible job and keeps paging until it reaches Max items or the results run out.

### 🔗 Other actors you may find useful

| Actor | Description |
| ----- | ----------- |
| [💼 Dice Jobs Scraper](https://apify.com/confidential_gnat/dice-jobs-scraper) | Scrapes tech job listings from Dice by keyword, search URL or job URL. |
| [💼 HiringCafe Jobs Scraper](https://apify.com/confidential_gnat/hiringcafe-jobs-scraper) | Scrapes job listings from HiringCafe by keyword, search URL or job URL. |
| [🇩🇪 German Imprint (Impressum) Scraper](https://apify.com/confidential_gnat/german-imprint-scraper) | Extracts decision makers, address and register data from German Impressum pages. |
| [📧 Decision Maker Email Finder](https://apify.com/confidential_gnat/decision-maker-email-finder) | Finds founders, executives and department heads at any company website. |
| [🏢 BBB Business Info and Emails Scraper](https://apify.com/confidential_gnat/bbb-business-scraper) | Scrapes Better Business Bureau businesses: contacts, rating and reviews. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/xing-jobs-scraper/issues/open) or reach out via the [Apify Community Forum](https://community.apify.com/).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Job titles or skills to search for, for example python, data engineer. Each keyword is searched separately.

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

City or region to search in, for example Berlin or Hamburg. Leave empty to search all of Germany. Applies to keyword searches.

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

XING search URLs (for example https://www.xing.com/jobs/search?keywords=python\&location=Berlin) or single job URLs (for example https://www.xing.com/jobs/hannover-software-engineer-157943309).

## `scrapeDetails` (type: `boolean`):

Open every job page to get the full description, industry, company page, full address and validity date. Turn off for faster runs with the search summary only. Job URLs always include the details.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only new jobs. Jobs already scraped under this name are skipped and not charged, and they do not count towards Max items. Each record gets changeType: new.

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

Maximum unique jobs saved for each keyword or search URL.

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

This website works without a proxy. Enable Apify Proxy only if you get blocked.

## Actor input object example

```json
{
  "keywords": [
    "python"
  ],
  "startUrls": [],
  "scrapeDetails": true,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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"
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/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"],
    "maxItems": 5,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/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"
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call confidential_gnat/xing-jobs-scraper --silent --output-dataset

```

## MCP server setup

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