XING Jobs Scraper API - Germany, Austria, Switzerland
Pricing
from $0.50 / 1,000 jobs
XING Jobs Scraper API - Germany, Austria, Switzerland
Scrape XING jobs in Germany, Austria and Switzerland. Each row has the title, company, full address, employment type, career level, remote, hybrid or on-site, posting and expiry dates, the apply link, and the salary when XING shows one, with estimates flagged. $0.51 per 1,000 postings.
Pricing
from $0.50 / 1,000 jobs
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
2
Bookmarked
61
Total users
23
Monthly active users
a day ago
Last modified
Categories
Share
Scrape XING job postings across Germany, Austria and Switzerland, one row per posting: title, company, full address, employment type, career level, whether it is remote, hybrid or on-site, when it went up, when it expires, the salary when XING shows one, and the link that actually applies.
One thing to get right before your first run. XING's location box resolves places, not countries, so
typing "Deutschland" does not filter anything: XING hands back its whole Germany, Austria and
Switzerland ranking. This actor then keeps only the postings XING itself labels German, which is
what restrictToCountry does, and the ones it drops are not charged.
Salaries are the other half of the honest version. XING publishes a figure on some postings and
estimates one on others, so read salaryIsEstimate before you put a number in front of anyone.
| Input | Job keywords, or XING search and posting URLs |
| Output | One row per posting: title, company, address, employment type, career level, workplace type, salary with an estimate flag, dates, apply link |
| Ceiling | About 1,000 postings per search, up to 10,000 per run across several searches |
| Account needed | None |
| Price | $0.51 per 1,000 postings on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 9,800 |
🔍 What XING Jobs Scraper does
It runs the search you describe, walks the results page by page, and writes a row for each posting with everything XING attaches to it: the company and its page, company size, the full address down to the postcode, XING's own industry and discipline labels, the seniority band, and the keywords XING tagged the posting with.
Filters are XING's own, applied during the search rather than by throwing rows away afterwards: workplace type, contract type, career level and how recently it was refreshed.
The salary floor is the exception. The actor checks the salary on each posting itself and leaves out
the ones under your number. Those are not charged, and the search reads further down XING's list to
fill maxItems.
Several keywords in one run are walked as separate searches.
📋 What data you get from each XING posting
| What you get | Field |
|---|---|
| The posting and its stable ID | jobId, globalId, title, jobUrl, jobCode |
| Where an application goes | applyUrl, appliesOffXing |
| The company | companyName, companyId, companyUrl, companyLogo, companySize |
| The address, down to the postcode | street, zipCode, city, region, country, countryCode, locations |
| Contract, seniority and field | employmentType, careerLevel, industry, discipline |
| Remote, hybrid or on-site | workplaceType, remoteOptions, isRemote, isHybrid, isOnsite |
| Salary, and whether XING estimated it | salaryMin, salaryMax, salaryMedian, salaryCurrency, salaryText, salaryIsEstimate |
| When it went up, was refreshed, and stops | postedAt, refreshedAt, activeUntil |
| Paid or promoted listing | isPaidListing, isTopJob |
| XING's tags and the posting language | keywords, postingLanguage |
| The full posting text, when you ask for it | descriptionHtml, descriptionText |
| The search that found it, and its rank | searchQuery, searchLocation, page, position, scrapedAt |
▶️ How to scrape XING jobs
- Open XING Jobs Scraper and click Try for free.
- Put your terms into Job keywords, one per line. German terms find more than English ones on XING.
- Set Location to a city, and a Radius if you want the surrounding area.
- Set Maximum postings. Fifty is a sensible first run.
- Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.
Start it with no keyword, URL or filter and you get one sample row, which is not charged.
💰 How much does it cost to scrape XING jobs?
$0.51 per 1,000 postings, which is $0.00051 each on the Free plan. Paid plans pay a little less: $0.505 on Starter, $0.50 on Scale and $0.495 on Business. On the free plan, the $5 Apify gives you each month covers about 9,800 postings.
You pay per posting row. Nothing else in the dataset is billed: not the sample row, not a diagnostic, and not a posting the country filter or the salary floor dropped. Turning on the full description costs nothing extra, because it arrives with the same request.
📥 What you give it
{"searchQueries": ["Softwareentwickler", "Data Analyst"],"location": "Berlin","radius": 30,"remoteOption": "hybrid","postedWithin": "week","maxItems": 200}
| Field | Default | What it is |
|---|---|---|
searchQueries | none, the form opens with Softwareentwickler | One or more searches, German or English. Each is walked separately. |
location | none | A DACH city such as Berlin, Wien or Zürich. Leave it out to search all of XING. |
radius | none | Kilometres around the city, 1 to 200. Cities only. |
restrictToCountry | true | Applies when the location names a country. Keeps only the postings XING labels with that country. Dropped postings are not charged and do not count against maxItems. |
remoteOption | any | remote, hybrid or onsite. |
employmentType | any | full-time, part-time, contractor, intern, temporary, seasonal, voluntary. |
careerLevel | any | student, entry-level, experienced, manager, director, executive. |
postedWithin | any | day, week or month, counted from when XING last refreshed the posting. Every row also carries its exact dates, so you can cut it again later. |
salaryMin | none | Yearly floor. A posting stays when the top of its salary range reaches your number, so a range of 52,500 to 72,000 clears 70,000. The number is compared as it stands in the posting's own currency: euros for Germany and Austria, Swiss francs for Switzerland. Postings under the floor are left out, and so are postings with no salary shown. None of them is charged. Many figures are XING's own estimate, so read salaryIsEstimate. Searches only, not a posting pasted by link. |
startUrls | none | Paste XING URLs instead of building a search. A single posting works, and so does a search page. |
includeDescription | false | Adds the posting body as HTML and as plain text. It rides along with the same request, so it costs no extra time and no extra charge. |
resultLanguage | de | Language of XING's own labels. The posting text stays in whatever language the employer wrote. |
maxItems | 50 | Stop after this many postings, 1 to 10,000. |
proxyConfiguration | none | Optional. Only if you have servers of your own to use. |
📤 What you get back
A real row from a run on 27 September 2026, a posting with a salary XING estimated. The keyword list is cut short:
{"jobId": "157862413.8545de","globalId": "surn:x-xing:jobs:posting:157862413.8545de","title": "Softwareentwickler (m/w/d) Funktionale Sicherheit – Schwerpunkt Engineering-Software und -Tools","jobUrl": "https://www.xing.com/jobs/verl-softwareentwickler-funktionale-sicherheit-schwerpunkt-engineering-software-tools-157862413","applyUrl": "https://api.relaxx.center/r/ec199609b8d5419c853df5955130386d?pid=2639671&mpid=1511115&prid=1099155&tid=30&utm_source=xing.com","companyName": "Beckhoff Automation GmbH & Co. KG","companyId": null,"companyUrl": null,"companyLogo": null,"companySize": null,"city": "Verl","region": "Nordrhein-Westfalen","zipCode": "33415","street": "Hülshorstweg 20","country": "Deutschland","countryCode": "DE","locations": ["Verl, Nordrhein-Westfalen, DE"],"employmentType": "Vollzeit","careerLevel": "Mit Berufserfahrung","industry": "Computer-Software","discipline": "IT und Softwareentwicklung","remoteOptions": ["NON_REMOTE"],"workplaceType": "On-site","isRemote": false,"isHybrid": false,"isOnsite": true,"salaryMin": 54500,"salaryMax": 75000,"salaryMedian": 65000,"salaryCurrency": "EUR","salaryIsEstimate": true,"salaryText": "EUR 54500 - 75000","postedAt": "2026-09-14T11:11:36Z","refreshedAt": "2026-09-14T11:11:36Z","activeUntil": "2026-11-13T11:20:51Z","isPaidListing": true,"isTopJob": false,"appliesOffXing": false,"jobCode": "Raven51-2639671","keywords": ["engineering", "informatik", "softwareentwickler", "automation", "iec", "..."],"postingLanguage": "de","descriptionHtml": null,"descriptionText": null,"searchQuery": "Softwareentwickler","searchLocation": null,"page": 1,"position": 4,"scrapedAt": "2026-09-27T14:25:47.491Z"}
| Field | How to read it |
|---|---|
jobId | Stable across runs, and the same shape whether the row came from a search or a pasted posting URL. Use it to dedupe. |
applyUrl | Where an application actually goes. Often the employer's own site or a job board rather than XING. |
appliesOffXing | XING's own flag. It can read false while applyUrl points elsewhere, as in the row above, so trust the link. |
salaryMin, salaryMax, salaryMedian, salaryIsEstimate | Null when XING shows no salary. salaryIsEstimate is true when the figure is XING's estimate rather than the employer's, as here. |
companyId, companyUrl, companyLogo, companySize | Can be null, as in the row above. companyName is always there. |
workplaceType, isRemote, isHybrid, isOnsite | The same fact as a label and as three booleans, so filtering is easy either way. |
employmentType, careerLevel, industry, discipline | XING's own labels, in the language you set. |
postedAt, refreshedAt, activeUntil | When it went up, when it was last refreshed, and when it stops. activeUntil is the one for pruning an old dataset. |
descriptionHtml, descriptionText | Only with includeDescription on. Null when XING holds no body text for the posting. |
🧾 Reading the output
Job rows carry a jobId. Anything without one is a note, and notes are never charged.
| Row | How to spot it | Charged |
|---|---|---|
| A posting | jobId is set | yes |
| The sample row | _sample is true | no |
| A diagnostic | errorCode is set | no |
| Code | What it means |
|---|---|
BAD_URL | Not a XING job or search address. |
JOB_NOT_FOUND | That posting is gone. Listings expire, and activeUntil is why. |
NO_RESULTS | The search ran and XING had nothing for it. |
NO_RESULTS_IN_COUNTRY | XING returned postings, but none carried the country you asked for. Widen it, or turn restrictToCountry off. |
NO_RESULTS_FOR_SALARY | XING returned postings, but none shows a salary that reaches your salaryMin. Lower it, or leave it empty. |
GEO_RESTRICTED | XING held back the posting details on that request. Run it again. |
HTTP_ERROR | XING answered badly. Usually worth one re-run. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The jobs delivered before that are complete and charged. Give the run more time, or ask for fewer jobs, to get the rest. |
A note never fails the run, except one: when the time limit stopped the run before any job came back, the run ends
as failed, with a TIME_LIMIT row saying so.
💡 What people use it for
- A daily pull of new DACH postings for a handful of roles, deduped on
jobId. - Recruiters watching which companies are hiring in a city, and at what seniority.
- Salary work:
salaryMedianwithsalaryIsEstimatekept beside it, so estimates and published figures never get mixed. - Market research on remote and hybrid share by industry, which the three booleans make easy.
From a job search to the companies behind it:
- Run this for
Softwareentwicklerwithlocationset toMünchenand aradiusof 30, and list thecompanyNamevalues. - Look those companies up in North Data Scraper for the register number and legal form.
- Paste the same names into Career Site Jobs Scraper to see every other role they have open on their own careers page.
🚧 What it does not do
- Germany, Austria and Switzerland only. XING is a DACH site.
- About 1,000 postings per search. Use several keywords or cities to go past it.
- No description where XING has none. If XING holds no body text for a posting,
descriptionTextstays null. - A country name in the location is not a filter at XING. It is handled here instead, and naming
a country anywhere in the location, including
Basel, Schweiz, turns that filter on. Use the bare city if you want cross-border results. - No candidate or recruiter contact details. Public postings only, nothing behind a sign-in.
- Salaries are often XING's estimate, not the employer's number.
- A row is a snapshot. Postings expire, and
activeUntiltells you when. - It is not an official XING tool. Dami's Studio is independent and is not affiliated with or endorsed by XING, or by any other company named on this page.
🧭 Which jobs scraper do you need?
| If you want | Use |
|---|---|
| XING postings across Germany, Austria and Switzerland | This one |
| The hiring company's register record and published financials | North Data Scraper |
| Every open role on one company's careers page | Career Site Jobs Scraper |
❓ Questions people ask
Do I need a XING account to scrape jobs?
No. Nothing to paste, nothing that expires.
Should I search XING in German or English?
Both work, and German finds more. Softwareentwickler and Software Developer return different
sets, so run the pair.
Why is the salary empty on most rows?
XING only shows one where it has it. Where it does, check salaryIsEstimate before quoting the
figure.
Does the minimum salary drop postings that show no salary?
Yes. With a minimum salary set, a posting with no salary figure is left out and not charged, since there is nothing to compare. Leave the field empty and filter on the salary columns yourself if you want those postings too.
Can I paste a single XING job link?
Yes, into XING URLs. Search pages work there too, so you can build the search in your browser and paste the address.
How do I get more than 1,000 results?
Split the search. Several keywords, or the same keyword across several cities, each with its own
searchQuery on the row.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/xing-jobs-scraper. Either way the run
happens on your Apify account at the same price.
Is scraping XING jobs legal?
These are public pages. Postings often name a contact person, which is personal data under GDPR, so have a reason for holding it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the keywords, the location and the run ID. If a
diagnostic row landed, its errorCode usually names the reason already.