XING Jobs Scraper API - Germany, Austria, Switzerland avatar

XING Jobs Scraper API - Germany, Austria, Switzerland

Pricing

from $0.51 / 1,000 job returneds

Go to Apify Store
XING Jobs Scraper API - Germany, Austria, Switzerland

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

Dami's Studio

Maintained by Community

Actor stats

1

Bookmarked

20

Total users

10

Monthly active users

3 days ago

Last modified

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:

FieldPresent
title, companyName, jobUrl, city, countryCode100%
employmentType, careerLevel, industry, discipline100%
postedAt, refreshedAt, activeUntil100%
workplaceType / remoteOptions100%
region95%
companyLogo89%
companySize, companyUrl~68%
applyUrl63%
jobCode58%
zipCode36%
street26%

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 issalaryIsEstimate
A figure the employer publishedfalse
XING's own estimate for that roletrue
Nothingnull

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

InputWhat it does
location + radiusA city, plus a radius in km. A country name works too, but read "Searching by country" below first
restrictToCountryOn by default. Only bites when location names a country — see below
remoteOptionremote, hybrid or onsite
employmentTypefull-time, part-time, contractor, intern, temporary, seasonal, voluntary. Pass the English value even though the output comes back German (Vollzeit, Teilzeit, and so on)
careerLevelstudent, entry-level, experienced, manager, director, executive
postedWithinday, 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
salaryMinMinimum yearly salary in EUR
resultLanguagede 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:

locationWhat came backOverlap with searching with no location at all
Deutschland57 DE / 3 AT60 of 60 — the same postings, in the same order
Österreich57 DE / 3 AT60 of 60
Schweiz57 DE / 3 AT60 of 60
Berlin60 DE1 of 60
Wien60 AT1 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. Basel with 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, Deutschland is 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 bare DE / AT / CH. Names of neighbouring countries are recognised too.
  • Set restrictToCountry: false to 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

EventPrice
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.