XING Jobs Scraper
Scrape XING jobs in Germany, Austria and Switzerland by keyword, city, remote or hybrid.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchQueries,location,radius(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Inputs
| Field | What it does | Type |
|---|---|---|
searchQueries | One or more job searches, exactly as you would type them into XING. German or English both work. Each keyword is walked separately, so ["Softwareentwickler", "Data Analyst"] runs two searches. | array |
location | City, region or country in the DACH area, for example "Berlin", "Wien" or "Zürich". Leave empty to search all of XING. | string |
radius | Search radius around the location, in kilometres. Only used when a location is set. | integer |
remoteOption | Restrict to fully remote, hybrid (home office part of the week) or on-site postings. | string |
employmentType | Restrict to one contract type. The labels in brackets are XING's own German wording. | string |
careerLevel | Restrict to XING's seniority band for the role. | string |
postedWithin | Only postings XING refreshed inside this window. Every row also carries the exact posted date, so you can filter afterwards too. | string |
salaryMin | Only postings at or above this yearly salary. XING applies this to the figure it holds for the posting, which is often its own estimate rather than an employer-published number. | integer |
startUrls | Paste XING URLs instead of building a search. Works with a single posting (https://www.xing.com/jobs/berlin-data-analyst-155853218) and with a search page (https://www.xing.com/jobs/search?keywords=data%20analyst&location=Berlin). | array |
includeDescription | Adds the complete posting text as HTML and as plain text. It comes from the same request, so this costs no extra time and no extra charge - it only makes the rows larger. | boolean |
resultLanguage | Language for XING's own labels (employment type, career level, industry). The posting text itself is always in whatever language the employer wrote it. | string |
maxItems | Stop after this many postings. XING serves at most ~1,000 results per individual search, so use several keywords or locations to go beyond that. | integer |
What you get
A structured dataset — each result includes fields like:
titlecompanyNamecitycountryCodeworkplaceTypeemploymentTypecareerLevelsalaryTextsalaryIsEstimatepostedAtjobUrljobIdExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Job Market Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
ZipRecruiter Scraper
Scrape ZipRecruiter jobs by keyword, city, remote, employment type, salary or posting age.
LinkedIn Company Employees Scraper
Scrape LinkedIn company employees without a login or cookies. Company URL or name in; employee name, headline, job title, location and profile URL out.
Indeed Jobs Scraper
Scrape Indeed jobs by keyword and location across 11 countries. Get title, company, salary, remote flag, posted date, and apply URL as structured data.
Glassdoor Company Reviews Scraper
Scrape Glassdoor company reviews and ratings by company name or URL. Get pros, cons, recommend rate and CEO approval as rows for analysis.
StepStone Jobs Scraper
Scrape StepStone jobs across Germany, Austria, UK, NL and Belgium by keyword and location. Get company, salary, posted date, remote flag and apply links.
Remotive Jobs Scraper
Scrape remote jobs from Remotive by keyword and category. Get title, company, location, salary, tags and clean descriptions. No login or key.
Where this tool sits
- Categories
- Job Market Scrapers
XING Jobs Scraper API — Germany, Austria & Switzerland
Pulls job postings off XING (xing.com), the professional network used across the German-speaking market. Give it a keyword, a city, or a XING search URL. You get structured rows back: title, company, full address, employment type, career level, remote/hybrid/on-site, the exact timestamp the posting went live, the apply link, and the salary when XING has one.
No login. No cookies to paste. No browser, so a 300-posting run finishes in about 28 seconds.
---
What one row looks like
Real output from a live run:
{
"jobId": "156657850.09f9ef",
"title": "Founding Software Engineer (m/w/d)",
"companyName": "Mathe Buddy",
"jobUrl": "https://www.xing.com/jobs/geislingen-steige-founding-software-engineer-156657850",
"applyUrl": "https://api.relaxx.center/r/c6d0f2b4e7af4f719e3c9e635ed1c626?pid=2616477",
"city": "Geislingen an der Steige",
"region": "Baden-Württemberg",
"zipCode": "73312",
"street": "Bahnhofstraße 27",
"country": "Deutschland",
"countryCode": "DE",
"employmentType": "Vollzeit",
"careerLevel": "Mit Berufserfahrung",
"industry": "Schulen, Kindergärten",
"discipline": "IT und Softwareentwicklung",
"remoteOptions": ["NON_REMOTE"],
"workplaceType": "On-site",
"isRemote": false,
"isHybrid": false,
"isOnsite": true,
"salaryMin": 70000,
"salaryMax": 95000,
"salaryCurrency": "EUR",
"salaryIsEstimate": false,
"postedAt": "2026-07-23T16:18:26Z",
"refreshedAt": "2026-08-07T16:18:26Z",
"activeUntil": "2026-09-21T16:18:28Z",
"postingLanguage": "de"
}
Two more from the same runs:
Softwareentwickler:in (m/w/d)— agmadata GmbH — Garrel — Vollzeit — EUR 50,000–75,000 (employer
figure) — on-site — posted 2026-07-30
Java Web-/ Softwareentwickler (m/w/d)— Statistisches Landesamt Rheinland-Pfalz — Bad Ems —
Vollzeit — EUR 45,500–54,500 (XING estimate) — hybrid — posted 2026-07-27
---
Field coverage — measured, not promised
Across 365 unique postings from six live runs:
| Field | Present |
|---|---|
title, companyName, jobUrl, city, countryCode | 100% |
employmentType, careerLevel, industry, discipline | 100% |
postedAt, refreshedAt, activeUntil | 100% |
workplaceType / remoteOptions | 100% |
region | 95% |
companyLogo | 89% |
companySize, companyUrl | ~68% |
applyUrl | 63% |
jobCode | 58% |
zipCode | 36% |
street | 26% |
About salary — read this before you rely on it
XING publishes three different things, and this actor keeps them apart:
| What | salaryIsEstimate |
|---|---|
| A salary the employer published | false |
| XING's own estimate for that role | true |
| Nothing at all | null |
The split moves with the search, a lot. Across 365 German-heavy postings it was 15% employer-published, 73% XING estimate, 12% blank. On a mixed DE/AT/CH sample of 296 it was 26% / 52% / 22%. On 164 Vienna postings it was 10% / 28% / 62% — Austrian ads carry far less salary data than German ones. So: roughly one posting in five carries a real employer number, most of the rest carry XING's guess, and in Austria most carry nothing.
A XING scraper that puts a salary on nearly every row is handing you the estimate without saying so. Check salaryIsEstimate before you show a figure to anyone.
---
How to use it
By keyword and city
{
"searchQueries": ["Softwareentwickler", "Data Analyst"],
"location": "Berlin",
"radius": 30,
"remoteOption": "hybrid",
"postedWithin": "week",
"maxItems": 200
}
By pasted URL — a whole search page, or a single posting:
{
"startUrls": [
{ "url": "https://www.xing.com/jobs/search?keywords=data%20analyst&location=Berlin" },
{ "url": "https://www.xing.com/jobs/berlin-senior-software-engineer-155853218" }
]
}
With the posting text — set includeDescription: true. It arrives in the same request, so it costs no extra time and no extra charge. You get descriptionHtml and descriptionText. Measured coverage: about 1 posting in 4 carries text XING holds itself. The other three quarters are ads XING syndicates from an employer's own site, and XING does not store the body — for those, applyUrl is the link to the full ad.
---
Filters
| Input | What it does |
|---|---|
location + radius | City or region, plus a radius in km |
remoteOption | remote, hybrid or onsite |
employmentType | Vollzeit, Teilzeit, Selbstständig, Studierende, Aushilfe, Saisonarbeit, Ehrenamt |
careerLevel | Student through executive |
postedWithin | Last 24 hours / week / month — this is XING's own refresh window, so a posting first published in June can appear in "last week" if the employer bumped it. postedAt always holds the true first-published timestamp |
salaryMin | Minimum yearly salary in EUR |
resultLanguage | de or en for XING's own labels |
---
What this does not do
- It does not go past ~1,000 postings per individual search. That is XING's ceiling, not one we
added — asking XING for result number 1,000 returns an error. Split the work across several keywords or cities; each search gets its own 1,000-row budget.
- It does not return the full text for every posting. See the note above: roughly a quarter.
- It does not return recruiter or applicant contact details. XING does not publish them.
- It does not scrape XING member profiles or company pages. Jobs only.
- It does not log in, so postings XING shows only to signed-in members are not in the output.
- It does not invent a salary. No figure from XING means
null, not a guess. - It is not a live feed. It reads what XING shows at the moment you run it.
---
Cost
Pay per event, whole price on the table:
| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Job returned | $0.51 per 1,000 postings |
100 postings ≈ $0.052. 1,000 postings ≈ $0.51.
Nothing is charged for a run that returns no postings, for the sample row an empty run emits, or for a request that fails. Those rows are marked _sample or _diagnostic and carry charged: false.
---
FAQ
Is there an official XING jobs API? XING retired its public developer API for outside developers years ago. This actor talks to the same public, logged-out endpoint that xing.com's own job search page uses, so there is no key and no account to manage.
Do I need a XING account or cookies? No. Nothing signs in and nothing is kept between runs.
Which countries does XING cover? Germany, Austria and Switzerland, with the odd posting from a neighbour like Luxembourg. The mix in your output follows your search — a plain German keyword run came back 95% German, while adding "location": "Wien" returned mostly Austrian postings. XING is not a useful source outside the DACH region.
Are postings in German or English? Mostly German — 345 of 365 in our runs. postingLanguage tells you per posting. XING's own labels (employmentType, careerLevel, industry) follow the resultLanguage setting.
How accurate is the posted date? It is XING's own timestamp, to the second, in ISO 8601 — not a parsed "vor 3 Tagen". postedAt is when the posting first went live, refreshedAt is the last time it was bumped, and activeUntil is when XING will take it down.
Can I tell remote jobs from hybrid ones? Yes. workplaceType is Remote, Hybrid or On-site, backed by isRemote / isHybrid / isOnsite booleans and the raw remoteOptions array from XING. Present on 100% of rows. In our runs: 48% on-site, 39% hybrid, 13% remote.
Does every job have a salary? No — see the salary section. About one in five carries an employer-published figure; most of the rest carry XING's own estimate, flagged by salaryIsEstimate.
Can I get the full job description? For about a quarter of postings, yes — set includeDescription: true. For the rest, XING only holds a link to the employer's ad, which you get as applyUrl.
How do I get more than 1,000 results? Run several keywords, or the same keyword against several cities. Each search has its own ceiling.
What happens if XING blocks the run? Nothing is charged. The dataset gets a row marked _diagnostic with an errorCode and a plain explanation.
Can I schedule it? Yes — it is a normal Apify actor. Pair a Schedule with postedWithin: "day" for a daily feed of fresh DACH postings.
Can I use my own proxies? Yes, via proxyConfiguration. You should not need to: XING serves a reduced job board to some countries, and the actor already routes through addresses that get the full board.
---
Output fields
jobId, globalId, title, jobUrl, applyUrl, companyName, companyId, companyUrl, companyLogo, companySize, city, region, zipCode, street, country, countryCode, locations, employmentType, careerLevel, industry, discipline, remoteOptions, workplaceType, isRemote, isHybrid, isOnsite, salaryMin, salaryMax, salaryMedian, salaryCurrency, salaryIsEstimate, salaryText, postedAt, refreshedAt, activeUntil, isPaidListing, isTopJob, appliesOffXing, jobCode, keywords, postingLanguage, descriptionHtml, descriptionText, searchQuery, searchLocation, page, position, scrapedAt.