XING Jobs Scraper API - Germany, Austria, Switzerland
Pricing
from $0.51 / 1,000 job returneds
XING Jobs Scraper API - Germany, Austria, Switzerland
XING's job board runs across Germany, Austria and Switzerland, and every row here carries company, employment type, career level, remote/hybrid/on-site, the exact posted timestamp and the apply link. Salary when XING has one, flagged if it's an estimate. $0.51 per 1,000 jobs.
Pricing
from $0.51 / 1,000 job returneds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
1
Bookmarked
20
Total users
10
Monthly active users
3 days ago
Last modified
Categories
Share
XING Jobs Scraper — Germany, Austria & Switzerland
Pulls job postings off XING, the German-language professional network. Give it a keyword, a city, or a XING search URL. You get back rows with the title, company, full street address, employment type, career level, whether it's remote, hybrid or on-site, the exact timestamp the posting went live, the apply link, and a salary when XING holds one.
There's no login and nothing to paste. It talks to the same logged-out endpoint xing.com's own job search uses, and it never launches a browser, so runs are short: 300 postings came back in 28 seconds on one run here, 795 in 63 seconds on another. It moves around with how fast XING answers on the day, so treat those as the shape of it rather than a guarantee.
What one row looks like
Straight out of a live run:
{"jobId": "157262065.ede857","title": "Softwareentwickler m/w/d gesucht in Friedenau","companyName": "PerZukunft Arbeitsvermittlung GmbH&Co.KG","jobUrl": "https://www.xing.com/jobs/berlin-softwareentwickler-gesucht-friedenau-157262065","companyUrl": "https://www.xing.com/pages/perzukunft","city": "Berlin","region": "Land Berlin","zipCode": "12163","street": "Schildhornstraße 92","country": "Deutschland","countryCode": "DE","employmentType": "Vollzeit","careerLevel": "Mit Berufserfahrung","industry": "Personaldienstleistungen und -beratung","discipline": "IT und Softwareentwicklung","workplaceType": "On-site","isRemote": false,"isHybrid": false,"isOnsite": true,"salaryMin": null,"salaryIsEstimate": null,"postedAt": "2026-08-16T00:20:35Z","refreshedAt": "2026-08-16T00:20:35Z","activeUntil": "2027-08-16T00:22:05Z","jobCode": "12016-10005083393-S","postingLanguage": "de"}
Which fields you can count on
Measured across 365 unique postings from six runs, not estimated:
| 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% |
Anything XING doesn't hold comes back null. Nothing is filled in with a guess.
Read this before you use the salary
XING shows three different things in the same place, and the rows keep them apart:
| What it is | salaryIsEstimate |
|---|---|
| A figure the employer published | false |
| XING's own estimate for that role | true |
| Nothing | null |
The mix moves a lot with the search. 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%, because Austrian ads carry far less salary data than German ones.
So roughly one posting in five carries a real employer number. Check salaryIsEstimate before you
put a figure in front of 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, either 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" }]}
Set includeDescription: true and you also get descriptionHtml and descriptionText. It arrives
in the same request, so it costs no extra time and no extra charge. It only shows up for about one
posting in four, though. The other three quarters are ads XING syndicates from an employer's own
site, and XING doesn't store the body for those — applyUrl is your link to the full ad.
Filters
| Input | What it does |
|---|---|
location + radius | A city, plus a radius in km. A country name works too, but read "Searching by country" below first |
restrictToCountry | On by default. Only bites when location names a country — see below |
remoteOption | remote, hybrid or onsite |
employmentType | full-time, part-time, contractor, intern, temporary, seasonal, voluntary. Pass the English value even though the output comes back German (Vollzeit, Teilzeit, and so on) |
careerLevel | student, entry-level, experienced, manager, director, executive |
postedWithin | day, week or month. This is XING's refresh window, so a posting first published in June shows up 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 only |
Searching by country
XING's location box resolves places, not countries. Type a city and it works exactly as you'd expect. Type a country and XING accepts it, ignores it, and hands back its whole Germany + Austria
- Switzerland ranking without saying so.
That is measured, not inferred. Same keyword, 60 postings per variant, straight off the live endpoint:
location | What came back | Overlap with searching with no location at all |
|---|---|---|
Deutschland | 57 DE / 3 AT | 60 of 60 — the same postings, in the same order |
Österreich | 57 DE / 3 AT | 60 of 60 |
Schweiz | 57 DE / 3 AT | 60 of 60 |
Berlin | 60 DE | 1 of 60 |
Wien | 60 AT | 1 of 60 |
A city changes the answer completely; a country changes nothing. So a search for "Deutschland" was quietly returning Swiss and Austrian postings, and a search for "Österreich" was returning a list that was 95% German.
What this actor does about it. XING labels every posting with its own country, and that is
what countryCode in each row is. When your location names a country, the actor keeps the
postings XING itself places in that country and skips the rest. Skipped postings are never
charged, and the run keeps reading further down XING’s ranking until it has the number you asked
for, so maxItems: 50 still returns 50. The run log and the run status both say how many were
skipped.
Details worth knowing:
- Cities are never filtered.
Baselwith a 50 km radius returned 68 Swiss and 9 German postings, and it still does — that is a real cross-border commute, not a leak. Berlin, Deutschlandis a city search. XING resolves the city, so the country filter has nothing left to remove.- A posting in several places survives if any one of its locations is in your country.
- German and English both work:
Deutschland/Germany,Österreich/Austria,Schweiz/Switzerland, plus a bareDE/AT/CH. Names of neighbouring countries are recognised too. - Set
restrictToCountry: falseto switch the whole thing off and get everything XING returns. - A country search is shallower than a city search. XING caps any one search at ~1,000
postings; when the country name is ignored, your country’s share of those 1,000 is all there is
to filter. For Austria or Switzerland especially, several city searches (
Wien,Graz,Linz) go far deeper than one country search. The run warns you when it hits that ceiling.
Two other fixes were tried on the live endpoint and rejected. XING’s GraphQL input does have a
filter.country field, but its ids are scrambled and the vocabulary that would decode them is
null for every logged-out consumer — XING’s own /jobs/schweiz page doesn’t use it either.
Putting the country into the keywords does make XING attach a real location filter, which is
what its landing pages do, but measured on "DevOps Engineer" + remote + last week it returned 12
postings (10 DE, 2 CH) where the same search returned 61 (56 DE, 5 CH): it loses four fifths of
the genuine German jobs and still leaks Swiss ones.
What it won't do
- It stops at about 1,000 postings per individual search. That's XING's ceiling, not one we added — ask for result 1,000 and XING returns an error. Split the work across several keywords or cities; each search gets its own budget.
- It won't give you the full text of every posting. Roughly a quarter, as above.
- No recruiter or applicant contact details. XING doesn't publish them.
- Jobs only. It doesn't touch member profiles or company pages.
- It doesn't log in, so anything XING shows only to signed-in members isn't in the output.
- It's not a live feed. You get what XING is showing at the moment you run it.
Cost
| Event | Price |
|---|---|
| Actor start | $0.001 per run |
| Job returned | $0.00051, so $0.51 per 1,000 postings |
100 postings is about $0.052. 1,000 is about $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 failed. Those rows carry charged: false and are marked _sample or _diagnostic.
FAQ
Is there an official XING jobs API? XING retired its public developer API for outside developers years ago. This reads the same public, logged-out endpoint the job search page uses, so there's 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, plus the occasional posting from a neighbour like Luxembourg. Your
mix follows your search: a plain German keyword run came back 95% German, while adding
"location": "Wien" returned mostly Austrian postings. Outside the DACH region XING isn't much use.
If you want one country only, see Searching by country — XING ignores a
country name in its location box, so this actor filters on the country XING reports per posting.
German or English postings?
Mostly German — 345 of 365 in our runs. postingLanguage tells you per posting. XING's own labels
follow resultLanguage.
How accurate is the posted date?
It's XING's own timestamp, to the second, in ISO 8601, not a parsed "vor 3 Tagen". postedAt is when
it first went live, refreshedAt is the last bump, activeUntil is when XING takes it down.
Can I tell remote from hybrid?
Yes. workplaceType is Remote, Hybrid or On-site, backed by isRemote / isHybrid /
isOnsite and the raw remoteOptions array. Present on every row. Our runs came out 48% on-site,
39% hybrid, 13% remote.
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 if XING blocks the run?
Nothing is charged. You get a row marked _diagnostic with an errorCode and a plain explanation.
Can I use my own proxies?
Yes, via proxyConfiguration. You shouldn't need to. XING serves a reduced job board to some
countries and the actor already routes through addresses that get the full one.
Every output field
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.