XING Jobs Scraper - Salary Ranges & Direct Apply URLs
Pricing
from $1.20 / 1,000 job scrapeds
XING Jobs Scraper - Salary Ranges & Direct Apply URLs
Scrape XING job listings with salary ranges (min, median, max), the employer's own apply URL, full job descriptions, company details and career-level filters. Covers Germany, Austria and Switzerland. No login, no API key.
Pricing
from $1.20 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
WebData Labs
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
XING Jobs Scraper - salary ranges and direct apply URLs
Scrape job listings from XING, the largest professional network in the German-speaking market, and get back a clean row per job with the salary range, the employer's own apply URL, and the full job description.
No login. No API key. No cookies. Full descriptions are included at no extra charge.
$1.50 per 1,000 jobs. No Actor start fee.
✅ What you get / ❌ what this isn't
✅ Salary range on most listings: minimum, median and maximum, as numbers, not a string ✅ The employer's own career-site apply URL, not a XING page, wherever XING has one ✅ Full job description as both HTML and clean plain text ✅ Company name, XING company page and, where XING has it, the employer's website ✅ Filters for city, radius, employment type and career level ✅ Monitoring mode that returns only jobs you have not already been given ✅ Runs on 256 MB, pure HTTP, no browser
❌ Not a CV or candidate scraper. Public job listings only ❌ Not a XING profile, contact or messaging tool ❌ Not an apply bot. It returns where to apply, it does not apply
🔎 Why use this Actor
Most XING scrapers hand you a job card: title, company, city, link. The two fields that make the data worth having are the ones they leave out or charge extra for.
Salary. XING publishes a salary estimate on the large majority of its listings, and this Actor returns it as salaryMin, salaryMedian and salaryMax in real numbers with a currency, so you can sort, filter and average it. Measured on a sample of 60 Berlin developer jobs: 48 carried a salary range.
Where to actually apply. For listings that apply off-site, applyUrl is the employer's own career page, not the XING listing. That is the field a recruiting tool, a jobs aggregator or a lead-generation workflow needs.
Descriptions at no surcharge. Several Actors in this niche bill an "enriched" row at four to five times the base rate to add the description. Here it is on by default and costs the same.
🗂️ Coverage
XING is the professional network of the DACH region, so this Actor covers job listings in:
- Germany
- Austria
- Switzerland
Employment types you can filter by:
- Full-time (Vollzeit)
- Part-time (Teilzeit)
- Freelance / self-employed (Selbststaendig)
- Student / intern (Studierende)
- Seasonal (Saisonarbeit)
- Temporary help (Aushilfe)
- Voluntary (Ehrenamt)
Career levels you can filter by:
- Student / intern
- Entry level
- Experienced professional
- Manager
- Director / VP
- Executive / CEO
👥 Who it's for
- Recruiters and staffing agencies tracking which companies are hiring for a role, at what salary, in which city.
- Job boards and aggregators that need a DACH feed with apply URLs that point at the employer.
- Compensation analysts building salary benchmarks by role, city and seniority from
salaryMin,salaryMedianandsalaryMax. - Sales teams selling to companies that are growing. A company posting five engineering roles this month is a buying signal, and
companyWebsitegives you the domain to enrich. - Market researchers measuring hiring demand across German industries over time.
📚 Example tasks
Ready-to-run task pages, each one already tested against the live source:
| Task | What it returns | Input |
|---|---|---|
| Python developer jobs in Berlin | 164 jobs, 123 with a salary range | {"searchQueries": ["python developer"], "location": "Berlin"} |
| Sales manager jobs in Munich | 200 jobs within 30 km | {"searchQueries": ["sales manager"], "location": "Muenchen", "radius": 30} |
| Part-time jobs in Hamburg | 200 part-time jobs, no keyword needed | {"location": "Hamburg", "employmentType": ["PART_TIME"]} |
| Management jobs with salary ranges | 200 manager, director and executive roles | {"searchQueries": ["manager"], "location": "Berlin", "careerLevel": ["MANAGER", "DIRECTOR", "EXECUTIVE"]} |
| Werkstudent and internship jobs | 200 student roles across DACH | {"searchQueries": ["werkstudent"], "employmentType": ["INTERN"]} |
| Jobs in Vienna, Austria | 60 jobs, all in Vienna | {"searchQueries": ["data engineer"], "location": "Wien"} |
| Jobs in Zurich, Switzerland | 68 jobs, all in Zurich | {"searchQueries": ["controller"], "location": "Zurich"} |
| New jobs since your last run | Only listings you have not been given before | {"searchQueries": ["python developer"], "location": "Berlin", "onlyNewJobs": true} |
Other inputs that work:
| What you want | Input |
|---|---|
| Several roles in one run | {"searchQueries": ["backend developer", "devops engineer", "data engineer"], "location": "Berlin", "maxResults": 600} |
| Paste a XING search URL | {"startUrls": ["https://www.xing.com/jobs/search?keywords=produktmanager&location=Koeln"]} |
⚙️ How it works
Give it either a list of keywords with a location, or paste XING search URLs straight from your browser. Both work, and explicit fields override anything read from a URL.
Each keyword is searched separately and paginated until XING stops returning new jobs. Every job is pushed to the dataset as soon as it is parsed, so a run you stop early still keeps everything it found.
🔁 Monitoring: only jobs you have not seen before
Set onlyNewJobs to true and schedule the run. The Actor remembers every job id it has delivered and returns only listings that are new since the last run, so a daily monitor does not re-deliver, and does not re-bill, the same postings.
Two things worth knowing:
- The memory belongs to the task, so run it as a saved task and keep using that task. A one-off run from the Actor page has a different history.
- The Actor still pages past the jobs it already knows, so a monitoring run with
maxResults: 50gives you 50 genuinely new jobs, not 50 rows of which most are filtered out.
📥 Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | array | empty | XING job search URLs pasted from your browser. Keywords, location, radius and employment type are read from each one. |
searchQueries | array | ["python developer"] | One keyword search per line. Each is crawled separately. Leave it empty and set a location or a filter to browse everything that matches, for example every part-time job in Hamburg. |
location | string | "Berlin" | City or region. Applies to every keyword. Leave empty to search all of DACH. |
radius | integer | 20 | Kilometres around the location. |
employmentType | array | empty | FULL_TIME, PART_TIME, CONTRACTOR, INTERN, SEASONAL, TEMPORARY, VOLUNTARY. Empty means all. |
careerLevel | array | empty | STUDENT, ENTRY, EXPERIENCED, MANAGER, DIRECTOR, EXECUTIVE. Empty means all. |
maxResults | integer | 200 | Stop after this many jobs across all searches. It is a total budget spent keyword by keyword, so with several keywords give it room for all of them. |
includeDescription | boolean | true | Fetch the full description, industry, career level and keywords. Free. |
onlyNewJobs | boolean | false | Return only jobs not delivered by a previous run of the same task. |
Accepted input aliases
Input copied from another Actor's docs runs here without editing. urls and url are accepted for startUrls, queries and keywords for searchQueries, and maxItems and maxJobs for maxResults.
There is nothing to configure about proxies, concurrency or retries. Those are handled internally and are included in the price.
📤 Output
One row per job listing.
{"jobId": "156675213.cbf7ea","title": "Python Developer Financial Services (all genders)","companyName": "Exxeta","companyXingUrl": "https://www.xing.com/pages/exxetaag","companyWebsite": null,"city": "Berlin","employmentType": "Vollzeit","careerLevel": "Mit Berufserfahrung","industry": "Beratung, Consulting","salaryCurrency": "EUR","salaryMin": 59000,"salaryMedian": 69500,"salaryMax": 83500,"applyUrl": "https://career.exxeta.com/Python-Developer-Financial-Services-all-genders-de-j1018.html?utm_source=xing.com","applyType": "EXTERNAL_URL","xingUrl": "https://www.xing.com/jobs/berlin-python-developer-financial-services-all-genders-156675213","refreshedAt": "2026-08-29T05:27:29Z","activeUntil": "2027-01-22T21:35:50Z","isPaidListing": false,"isTopJob": false,"redirectsToThirdParty": false,"keywords": ["python", "developer", "financial", "services"],"tags": ["python developer", "financial services"],"descriptionHtml": "<DIV><H2>Standorte: ...","descriptionText": "Standorte: Karlsruhe, Berlin, ...","searchQuery": "python developer","scrapedAt": "2026-09-05T11:59:20Z"}
Output fields
| Field | Type | Description |
|---|---|---|
jobId | string | XING's own job id. Stable, and what monitoring mode remembers. |
title | string | Job title, as posted. |
companyName | string | Hiring company. |
companyXingUrl | string | The company's XING page. |
companyWebsite | string | The employer's own website, when XING carries it. |
city | string | Primary city of the role. |
employmentType | string | German label as XING stores it, for example Vollzeit. |
careerLevel | string | Seniority label, for example Mit Berufserfahrung. Needs includeDescription. |
industry | string | Employer's industry. Needs includeDescription. |
salaryCurrency | string | Currency of the salary fields, usually EUR. |
salaryMin | number | Bottom of the salary range, per year. |
salaryMedian | number | Midpoint. Present on estimated salaries, absent on plain ranges. |
salaryMax | number | Top of the salary range, per year. |
applyUrl | string | The employer's own apply URL. Null when the listing applies through XING. |
applyType | string | EXTERNAL_URL, XING or XING_CUSTOM. Tells you why applyUrl is null. |
xingUrl | string | The listing on XING. |
refreshedAt | string | When XING last refreshed the listing. Sort on this for newest first. |
activeUntil | string | When the listing expires. |
isPaidListing | boolean | Whether the employer paid to promote it. |
isTopJob | boolean | Whether XING flags it as a top job. |
redirectsToThirdParty | boolean | Whether applying leaves XING. |
keywords | array | XING's own keyword tags. Needs includeDescription. |
tags | array | XING's own phrase tags. Needs includeDescription. |
descriptionHtml | string | Full description as HTML. Needs includeDescription. |
descriptionText | string | The same description as clean plain text. |
searchQuery | string | Which of your keywords produced this row. |
scrapedAt | string | UTC timestamp of the row. |
The run summary in OUTPUT reports how many jobs each search returned and why its pagination stopped.
💵 How much does it cost to scrape XING jobs?
| Jobs | Cost |
|---|---|
| 100 | $0.15 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |
$0.0015 per job, and nothing else. There is no Actor start fee, so a run that returns nothing costs nothing, and full descriptions are included rather than billed as a separate enrichment event.
⚠️ Limits and caveats
Honest numbers, measured 5 September 2026, so you do not spend a run discovering them.
- XING serves roughly 500 to 1,000 jobs per search. It stops returning results past a certain depth, so a broad keyword gives you a slice of the market, not all of it. A search for
developerin Berlin returned 505 jobs and then ran out. To get more, use more specific keywords or more cities rather than a largermaxResults. - XING reports no result count. The source does not say how many jobs match, so the Actor cannot show "x of y" progress and cannot know the size of a search in advance. It pages until nothing new comes back.
applyUrlis null on roughly 4 of 10 listings. Those apply through XING itself rather than an employer career page, whichapplyTypetells you explicitly. It is not a parsing miss, andxingUrlalways works as a fallback.- Salary is XING's estimate on most listings, not a number the employer typed. Some listings carry a plain range with no median, and some carry none at all, in which case all four salary fields are null.
- Results come back in XING's relevance order. XING accepts a "sort by date" instruction and then ignores it, so this Actor does not pretend to offer one. Sort the dataset on
refreshedAtfor newest first. - Narrow filter combinations legitimately return zero jobs. Part-time plus manager level plus a specific city is often genuinely empty on XING. The run finishes cleanly and tells you to widen the filters.
- Location is a strong weight, not a hard filter. Measured over 60 rows per city: 45 of 60 for Hamburg, 54 of 60 for Cologne, 60 of 60 for Zurich. A handful of nationwide or remote listings come back with any city search.
- Titles, employment types and career levels are German, because that is how XING stores them. Descriptions are in whatever language the employer posted.
🔁 Run it on the Apify platform
Set a schedule, use monitoring mode, and pull results with the Apify API, the JavaScript client or the Python client. The dataset is available as JSON, CSV, Excel and XML.
🤖 Use with AI agents via MCP
This Actor is available over Apify's MCP server, so an agent can call it as a tool.
Claude Code
$claude mcp add apify --transport http https://mcp.apify.com --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"
Cursor or Claude Desktop
{"mcpServers": {"apify": {"url": "https://mcp.apify.com","headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }}}}
Then ask for what you want in words, for example: "find part-time marketing jobs in Hamburg on XING and give me the ones paying over 50,000 EUR". The agent fills searchQueries, location and employmentType itself, which is why this Actor keeps structured inputs alongside URL input.
🔗 Use this Actor in n8n
Add the Apify node, pick Run Actor, choose webdata_labs/xing-jobs-scraper, and paste your input JSON. Chain Get Dataset Items after it to pull the rows into your workflow. A common pattern is a daily schedule with onlyNewJobs: true feeding new listings into a spreadsheet or CRM.
⚖️ Is it legal to scrape XING?
This Actor reads only public job listings that XING serves to logged-out visitors. It does not log in, does not touch member profiles, and does not collect personal data.
Job listings are business information, not personal data, so GDPR concerns that apply to profile scraping do not apply here. You are still responsible for how you use the output, including any onward processing of contact details an employer chose to publish inside a job description. If you plan to republish listings, check XING's terms and your own legal position first.
🧩 Related Actors
- We Work Remotely Jobs Scraper - remote-only postings, every live listing rather than the truncated search page.
- ATS Jobs Scraper - pull the same roles straight from Greenhouse, Lever, Ashby and Workday boards, with no job-board middleman.
- Company Career Page Jobs API - read jobs off a company's own careers page when it is not on any board.
- Indeed Jobs Scraper - the largest general job board, for volume rather than niche.
- Buyer Fit Brief API - score a finished lead list against your ideal customer profile.
❓ FAQ
Does it need a XING login or cookies?
No. It reads only what XING serves to logged-out visitors. There is nothing to authenticate and no credential field.
Why do some jobs have no apply URL?
Because those listings are applied to through XING itself rather than an employer career page. applyType says which kind each row is, and xingUrl always points at the listing.
How many jobs can I get for one keyword?
Roughly 500 to 1,000. XING stops serving results past a certain depth. Add more keywords or more cities to go wider.
Can I sort by newest?
Sort the dataset on refreshedAt. XING accepts a sort-by-date instruction and ignores it, so no Actor can honestly promise a source-side newest-first ordering on this source.
Are the salary numbers real?
They are XING's own published figures for the listing, which for most postings is an estimate rather than a number the employer entered. Treat salaryMedian as a market estimate, not an offer.
Does including descriptions cost extra?
No. Descriptions, industry, career level and keywords are included at the same per-job price.
Does it work for Austria and Switzerland?
Yes. Set location to a city such as Wien or Zurich. XING covers the whole German-speaking market.
How does monitoring mode remember what it has seen?
It stores the job ids it has delivered in a named store that belongs to the task, so a scheduled task keeps its history across runs. Run it as a saved task rather than as one-off runs from the Actor page.
Why did my run return zero jobs?
Almost always a filter combination with no matches, for example one employment type plus one career level plus a small city. The run log says so and finishes cleanly. Widen the radius or drop a filter.
Is it charged if a run finds nothing?
No. The only charge is per job returned, and there is no start fee.
📝 Changelog
0.1 - 5 September 2026. First release. Search by keyword or pasted XING URL, filters for city, radius, employment type and career level, salary range, employer apply URL, full descriptions, and monitoring mode.
🛠️ Support
Found a bug or a field you need? Open an issue on the Actor's Issues tab. Bug reports with the run id get fixed fastest.
⭐ Rate this Actor
If it saved you time, a rating on the Store helps other people find it.