ParseForge Scrapers

XING Jobs Scraper - German Job Listings & Salary Data API

parseforge/xing-scraper

JobsLead generationDeveloper tools

Extract public XING job postings across the DACH market: title, company, location, employment type, career level, industry and XING's own structured salary estimate with minimum, median and maximum.

Run this scraper See the API call
Total users
2
Monthly active
1
Total runs
11
Bookmarked
0
Rating
Not rated yet
Last modified
6 days ago

Overview

ParseForge

XING Jobs Scraper - German Job Listings & Salary Data API

Scrape public job postings from XING, the professional network of the DACH region, and get back 43 flat fields per job: including XING's own salary band with minimum, median and maximum, the employer's company size and industry, the career level, the discipline, and the full advert body. No login, no API key, no cookies. Export to CSV, JSON, Excel, or XML.

XING has no public jobs API. Its search endpoint answers anonymous callers but hands back a walled UnauthorizedJob for every hit: an id and nothing else. This Actor takes the surface XING does publish for search engines, roughly 650,000 live postings, and resolves each one to its complete public payload.

Who uses it What they scrape XING for
Salary benchmarking and comp teams A modelled salary band on ~85% of postings, broken into min, median and max, with city, discipline and career level attached
Recruiters and staffing agencies Fresh DACH vacancies with the employer named, the company size, and whether you can apply on XING or get bounced to a careers site
Job boards and aggregators A daily German-market feed in one fixed schema, deduplicated by a stable numeric job id
Labour-market researchers Volume by city, discipline, industry and seniority across Germany, Austria and Switzerland
Sales teams selling to HR Companies actively hiring, with headcount bracket, industry and their XING company page

What it does

This Actor collects XING job postings by keyword, by city, or by exact URL, and returns each one as a flat row.

🇩🇪 The DACH market, not just Germany. Postings carry an ISO country code: DE, AT or CH, and a filter to keep only the ones you want.

💶 Salary as three numbers, not a string. salaryMin, salaryMedian and salaryMax come back as integers with a currency, plus a salaryIsEstimate flag telling you whether XING modelled the band or the employer typed it.

🏢 The employer, not just its name. companySize as a headcount bracket, companyIndustry, the XING company page URL, and a stable companyId you can join on across runs.

📍 Location split into columns. City, region, country, country code, street and postal code as separate fields: plus XING's internal cityId, which is stable across spellings.

🗂️ XING's own taxonomy. discipline from XING's list of 17 job families, industry from its list of around 55, and careerLevel from six seniority bands.

📝 The advert body, HTML or plain text. Optional, like the salary band, the employer profile and the full address: each is a checkbox that is off until you want it, and billed only then.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with XING data

📊 Benchmark German salaries by role and city.

Pull every IT posting in München with a salary band and read the median directly: no scraping salary text out of prose, no currency parsing.

🎯 Track who is hiring, and how hard.

postedAt, refreshedAt and daysOnline on every row show which vacancies keep getting refreshed, the ones an employer is struggling to fill.

📈 Build a DACH labour-market panel.

Run it on a schedule and key on jobId. New ids are new vacancies; ids that vanish are filled or expired.

🧠 Feed a recruiting or matching product.

keywords, discipline, careerLevel and remoteOptions give you the structured signals a matching model needs, without an NLP pass over the advert.

Why choose this scraper

What you get
Salary in three numbers salaryMin, salaryMedian, salaryMax and a currency, on roughly 85% of postings. The median is the field competitors do not return. Optional, so you only pay for it when you want it.
Predictable bill One per-row price by default. Every extra data block is a checkbox that is off until you tick it, so a run cannot surprise you with charges you did not ask for.
43 fields per job Every field XING publishes to anonymous callers, verified against the live endpoint rather than guessed.
No proxy, no login XING answers plain requests. The Actor runs proxy-free by default, so a run costs you nothing in proxy traffic.
16 filters that cut the bill Keyword, city, salary range, employment type, career level, discipline, industry, country, language, remote option, posting age and direct-apply. Filtered rows are never written and never charged.
Company beyond the name companyId, companySize, companyIndustry and the XING company page, when the employer has one.
Direct-apply flag directApply and redirectsToThirdPartyUrl tell you whether the posting is a real XING vacancy or an aggregator bounce.
Honest empties A field XING does not publish for a job is absent, never a guessed value and never a null.
Stable join key jobId is XING's own numeric id and survives title edits and refreshes.
Four export formats CSV, JSON, Excel, and XML, from the dashboard or the API.

How it compares

The competitor columns below reflect what each Actor's own public listing states, not a test run of it.

Feature ParseForge shahidirfan memo23 fatihtahta solidcode
Salary minimum and maximum Yes Not stated Not stated Yes Yes
Salary median Yes No No No No
Company size and industry Yes Not stated Company pages, billed separately Yes Not stated
Discipline and career level XING's own taxonomy, filterable Not stated Filterable Not stated Not stated
Filter before you pay 16 filters, rejected rows unbilled Not stated Keyword, location, discipline Not stated Keyword and city
Fetch an exact posting by URL Yes, URL, slug or bare id Not stated Yes, any xing.com URL Not stated Not stated
Profiles and company pages No, jobs only Yes Yes No No
Runs without a proxy Yes Not stated Not stated Not stated Not stated
Base price per result $0.005 $0.001 $0.00119 $0.00079 $0.001

If you need XING profiles or company pages as well as jobs, memo23's actor covers all three. Come here when the job data itself is the product: particularly if you need the salary median or want to filter hard before paying.

What a job looks like

Every posting returns as one flat JSON row. Here is a real record, unedited apart from a shortened description:

{
  "jobId": "157336394",
  "jobHashId": "157336394.b53792",
  "slug": "herford-software-entwickler-microsoft-dynamics-365-business-central-157336394",
  "url": "https://www.xing.com/jobs/herford-software-entwickler-microsoft-dynamics-365-business-central-157336394",
  "title": "Software-Entwickler*in Microsoft Dynamics 365 Business Central",
  "company": "ATEGRAM GmbH",
  "companyId": "2021241.c27f57",
  "companyUrl": "https://www.xing.com/pages/ategram-gmbh",
  "companySize": "51-200 Mitarbeitende",
  "companyIndustry": "Großhandel",
  "city": "Herford",
  "region": "Nordrhein-Westfalen",
  "country": "Deutschland",
  "countryCode": "DE",
  "street": "Mindener Str. 9",
  "zipCode": "32049",
  "cityId": 2906121,
  "salaryCurrency": "EUR",
  "salaryMin": 54500,
  "salaryMax": 68500,
  "salaryMedian": 62500,
  "salaryIsEstimate": true,
  "employmentType": "Teilzeit",
  "careerLevel": "Mit Berufserfahrung",
  "industry": "Großhandel",
  "discipline": "IT und Softwareentwicklung",
  "remoteOptions": ["NON_REMOTE"],
  "isRemote": false,
  "language": "de",
  "keywords": ["softwareentwickler", "projektleitung", "wirtschaftsinformatik"],
  "jobCode": "10001-1003559130-S",
  "applicationType": "JobXingApplication",
  "directApply": true,
  "redirectsToThirdPartyUrl": false,
  "isPaidListing": false,
  "isTopJob": false,
  "postedAt": "2026-08-20T00:19:07Z",
  "refreshedAt": "2026-08-20T00:19:07Z",
  "activeUntil": "2027-08-20T00:20:35Z",
  "daysOnline": 0,
  "description": "<P>Zur Verstärkung unseres Teams suchen wir …</P>",
  "descriptionFormat": "html",
  "scrapedAt": "2026-08-20T13:38:10.863Z"
}

Configure the run

Setting What it does
keyword / keywords Job title, skill or keyword. Matched against the posting title, XING's own keyword tags, and the URL slug. A job matching any keyword is kept.
city / cities City name. Umlauts are handled in both spellings, so München, Munchen and muenchen all match.
jobUrls Exact postings to fetch, skipping discovery. Accepts a full URL, a bare slug, or the numeric job id.
maxItems Ceiling on rows written. Not a target, a narrow filter returns fewer.
maxSitemapShards How deep discovery may dig, 1 to 13. It stops as soon as it has enough, so a broad run reads one shard.

| descriptionFormat | html keeps XING's markup, text flattens it to readable plain text. | | sortBy | Discovery order (fastest), newest first, highest salary first, or title A–Z. | | proxyConfiguration | Off by default. XING answers plain requests; enable only if your runs start getting rate-limited. |

Narrow the run with filters

Every filter runs before the row is written, so rows you filter out are never charged.

Filter What it keeps
salaryMin / salaryMax Postings whose band overlaps the range you gave. Postings with no band are dropped by these.
onlyWithSalary Only postings carrying a salary band at all.
employmentTypes Vollzeit, Teilzeit, Studierende, Aushilfe, Selbstständig, Praktikum.
careerLevels Six seniority bands, from Berufseinsteiger·in to Geschäftsführer·in.
disciplines XING's 17 job families. Matched as a substring, so IT finds IT und Softwareentwicklung.
industries Free text against XING's ~55 industry labels, for example Software, Gesundheit, Automobil.
countries DE, AT, CH.
languages German or English adverts.
remoteOptions On site, hybrid, or fully remote.
postedWithinDays Postings activated in the last N days.
onlyDirectEmployer Drops postings that bounce the applicant to an external careers site.

Why discovery works the way it does

XING's search API answers without a login, but every result comes back as UnauthorizedJob, the posting id and nothing else. Measured 20/08/2026: zero of ten search hits resolved to a readable job.

The sitemap XING publishes for search engines is a different story. It carries roughly 650,000 postings across 13 shards, and the jobs on it resolve to their full public payload. Around 15% sit behind the login wall anyway, they are skipped, logged, and never charged.

That is why the keyword and city filters are matched against the slug during discovery: it lets the Actor throw away non-matching postings before spending a request on them.

Pricing

This Actor is pay per event, and a run left at its defaults has exactly one per-row price. Every optional data block is off by default: if you do not tick it, you do not receive it and you are not charged for it. Nothing is billed for rows a filter rejected.

Event Price When it fires
result-item $0.005 One job row. Covers the title, employer name, city and country, employment type, career level, industry, discipline, keywords, dates and apply flags.
sitemap-scan $0.003 One sitemap shard read. A broad run reads one; only a narrow filter reaches more.
apify-actor-start $0.02 Once when the run starts, per GB of memory.

Optional, and off unless you ask for them:

Event Price Switched on by
salary-data $0.001 includeSalary: minimum, median and maximum with a currency. ~85% of postings carry one.
company-data $0.0006 includeCompanyProfile: company id, XING page, headcount bracket, industry. ~67% carry them.
location-detail $0.0004 includeLocationDetail: street, postal code, region, city id.
description-text $0.0006 includeDescription, the full advert body. ~91% carry one.

A default run costs $0.005 per job, or $5.00 per 1,000. With all four optional blocks switched on it is $0.0076 per job, or $7.60 per 1,000.

The salary filters are the exception worth knowing about: salaryMin and salaryMax work whether or not includeSalary is on. You can filter to the jobs that pay over €70,000 without buying the salary column.

Free users

Apify free-plan runs are capped at 100 jobs per run. Everything else works the same: all 43 fields, all 16 filters, and every optional block available to tick. Upgrade your Apify plan to lift the cap.

Run it

  1. Open the Actor in Apify Console and set a keyword, a city, or both.
  2. Set maxItems to the number of jobs you want.
  3. Click Start, then export the dataset as CSV, JSON, Excel, or XML.

Or from the API:

curl -X POST "https://api.apify.com/v2/acts/parseforge~xing-scraper/runs?token=YOUR_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"keyword":"entwickler","city":"Berlin","salaryMin":55000,"maxItems":100}'

Use with AI agents (MCP)

The Actor is exposed over Apify's MCP server, so an agent can call it as a tool:

https://mcp.apify.com/sse?actors=parseforge/xing-scraper

Ask things like "find Berlin software jobs on XING paying over 70,000 euros" and the agent fills the input itself.

Troubleshooting

No jobs came back.

The filters are ANDed. A keyword plus a city plus a salary floor plus a discipline can genuinely match nothing in the shards read. Drop one filter at a time, and raise maxSitemapShards if it is not already 13.

Fewer rows than maxItems.

maxItems is a ceiling. Discovery stops when the shard budget is exhausted, and roughly 15% of sitemap postings are login-walled by XING. The log prints exactly how many were walled, expired, or filtered.

Why is street, zipCode or jobCode empty?

XING only carries them when the employer filled them in: measured at 53%, 57% and 61% of postings. An absent field is the source's real state, not a parsing failure.

Why is companyId missing on some rows?

About a third of employers post without a XING company page. company still holds the name they published.

Why are salaries "estimates"?

XING models a band for most postings from role, location and seniority. salaryIsEstimate is true in that case. It is XING's own figure, published on its own pages.

Why is the run slow with a narrow filter?

Each sitemap shard is a 1 MB download holding 50,000 URLs. A filter matching almost nothing forces the Actor through more of them. Widen the filter or lower maxSitemapShards.

A field stopped filling.

XING changed its GraphQL schema. Email us with your run ID so we can update the query.

FAQ

Question Answer
Do I need a XING account or API key? No. XING has no public jobs API. This reads public data only, so there is nothing to register or authenticate.
Does it cover Austria and Switzerland? Yes. Postings carry an ISO country code and countries filters on it, though the market is overwhelmingly German.
Does it scrape XING profiles or company pages? No. This Actor is jobs only.
Are the salaries real or estimated? Mostly estimated: XING models a band and publishes it on the posting. salaryIsEstimate marks which.
Can I fetch one specific posting? Yes. Put its URL, slug or numeric id in jobUrls.
How current is the data? The sitemap is rebuilt daily and the Actor reads the newest shard first. postedAt and daysOnline are on every row.
How many jobs are reachable? Around 650,000 across the 13 shards, of which roughly 85% resolve to a full public payload.
How many rows per run? Free plan: 100. Paid: up to 100,000, bounded by how many postings match your filters and by the run timeout.
Does it need a proxy? No. It runs proxy-free by default.
Is this an official XING product? No. It is unofficial and reads only publicly available XING data.

Related actors

  • Bayt Scraper: Middle East job listings across 18 markets.
  • InfoJobs Scraper: Spanish job board listings with salary and contract data.
  • D&B Scraper: company profiles, DUNS numbers, revenue and key principals.

Browse the full ParseForge collection for more scrapers.

🆘 Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by XING, New Work SE, or its owners. It collects only publicly available XING data: job postings published for search engines, and no personal profiles. You are responsible for using the data in compliance with XING's terms and applicable laws, including GDPR. Job postings are corporate publications; do not use this data to identify, profile, or target individuals.

Input

FieldTypeWhat it doesDefault
keyword string Job title, skill or keyword. Matched against the posting title and XING's own keyword list. Leave empty to take every job in the scanned sitemap shards. entwickler
keywords array Run several keyword filters in one go. A job matching any of them is kept. ["entwickler","pflegekraft"]
city string German, Austrian or Swiss city name, for example Berlin, Hamburg, Wien or Zürich. not set
cities array Several cities in one run. A job in any of them is kept. []
jobUrls array Specific XING job URLs or slugs to fetch, skipping discovery entirely. Accepts https://www.xing.com/jobs/, a bare slug, or the numeric job id. []
maxItems integer Maximum number of jobs written to the dataset. A ceiling, not a target, a narrow filter returns fewer. 100
maxSitemapShards integer Upper bound on how deep discovery digs. XING publishes its jobs across 13 sitemap shards of 50,000 URLs each, oldest first, and this Actor reads them newest-first. It stops as soon as it has enough candidates, so a broad run touches one shard and only a narrow filter reaches the full 13. Each shard actually read is one sitemap-scan event. 13
salaryMin integer Keep only jobs whose salary range reaches at least this figure. Jobs with no salary published are dropped by this filter. not set
salaryMax integer Keep only jobs whose salary range starts at or below this figure. not set
onlyWithSalary boolean Drop postings where XING publishes no salary figures. Around 85 percent of postings carry one. false
employmentTypes array Keep only these employment types. XING labels these in German on every posting, whatever language the ad is written in. []
careerLevels array Keep only these seniority levels. []
remoteOptions array Keep only jobs offering these working arrangements. []
disciplines array Keep only these job families. Matched as a substring, so "IT" also finds "IT und Softwareentwicklung". []
industries array Keep only jobs in industries whose XING label contains any of these strings, for example "Software", "Gesundheit" or "Automobil". XING uses around 55 German industry labels. []
countries array Keep only jobs in these countries. XING is the DACH network, so postings are overwhelmingly German. []
languages array Keep only postings written in these languages. []
postedWithinDays integer Keep only jobs activated in the last N days. Sitemap shards are ordered oldest to newest, so pair a tight window with a low shard count. not set
onlyDirectEmployer boolean Drop postings that hand the applicant off to an external site, keeping only jobs you can apply to on XING itself. false
includeSalary boolean Adds XING's salary estimate: minimum, median and maximum with a currency: to every job that publishes one. Billed per row that actually carries a band, around 85% of postings. Off by default so a run costs only the base row price. The salaryMin and salaryMax filters work whether or not this is on. false
includeCompanyProfile boolean Adds the XING company id, company page URL, headcount bracket and industry. Billed per row that carries them, around 67% of postings. The employer's name is always included and costs nothing extra. false
includeLocationDetail boolean Adds street, postal code, federal state or canton, and XING's internal city id. Billed per row that carries them. City, country and country code are always included. false
includeDescription boolean Adds the full advert body. Billed per row that carries one, around 91% of postings. Leaving it off also makes the run noticeably faster, because XING does not have to send the body. false
descriptionFormat string (2 options) Only applies when the description is switched on. HTML keeps XING's markup; plain text flattens it. html
sortBy string (4 options) Sorting collects candidates before writing, so the run takes longer than the default streaming order. none
proxyConfiguration object Optional. XING answers plain requests, so this Actor runs without a proxy by default and costs you nothing in proxy traffic. Enable it only if your runs start getting rate-limited. {"useApifyProxy":false}

Pricing

from $4.45 per 1,000 results

Charged forWhat it isPrice each
result One job row: title, employer, city and country, employment type, career level, industry, discipline, keywords, dates and apply flags. Everything a run needs to be useful, with no separate charge. $0.00445 to $0.005
Sitemap scan One XING job sitemap shard of 50,000 URLs read during discovery. A broad run reads one; only a narrow filter reaches more. $0.00267 to $0.003
Salary band (optional) Off by default. Minimum, median and maximum salary with a currency, charged only for a row that carries a band. $0.00089 to $0.001
Employer profile (optional) Off by default. Company id, XING company page, headcount bracket and industry, charged only for a row that carries them. $0.000534 to $0.0006
Full address (optional) Off by default. Street, postal code, region and city id, charged only for a row that carries them. $0.000356 to $0.0004
Job description (optional) Off by default. Full advert body as HTML or plain text, charged only for a row that carries one. $0.000534 to $0.0006
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.0178 to $0.02

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

API

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST · run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~xing-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "helloWorld": 123
  }'

Examples

Input that runs as-is.

input.json
{
  "helloWorld": 123
}

Reviews

No reviews yet. Be the first.

Issues

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

Related scrapers

Run XING Jobs Scraper - German Job Listings & Salary Data API on Apify All scrapers