XING Jobs Scraper - Salary Ranges & Direct Apply URLs avatar

XING Jobs Scraper - Salary Ranges & Direct Apply URLs

Pricing

from $1.20 / 1,000 job scrapeds

Go to Apify Store
XING Jobs Scraper - Salary Ranges & Direct Apply URLs

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

WebData Labs

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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, salaryMedian and salaryMax.
  • Sales teams selling to companies that are growing. A company posting five engineering roles this month is a buying signal, and companyWebsite gives 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:

TaskWhat it returnsInput
Python developer jobs in Berlin164 jobs, 123 with a salary range{"searchQueries": ["python developer"], "location": "Berlin"}
Sales manager jobs in Munich200 jobs within 30 km{"searchQueries": ["sales manager"], "location": "Muenchen", "radius": 30}
Part-time jobs in Hamburg200 part-time jobs, no keyword needed{"location": "Hamburg", "employmentType": ["PART_TIME"]}
Management jobs with salary ranges200 manager, director and executive roles{"searchQueries": ["manager"], "location": "Berlin", "careerLevel": ["MANAGER", "DIRECTOR", "EXECUTIVE"]}
Werkstudent and internship jobs200 student roles across DACH{"searchQueries": ["werkstudent"], "employmentType": ["INTERN"]}
Jobs in Vienna, Austria60 jobs, all in Vienna{"searchQueries": ["data engineer"], "location": "Wien"}
Jobs in Zurich, Switzerland68 jobs, all in Zurich{"searchQueries": ["controller"], "location": "Zurich"}
New jobs since your last runOnly listings you have not been given before{"searchQueries": ["python developer"], "location": "Berlin", "onlyNewJobs": true}

Other inputs that work:

What you wantInput
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: 50 gives you 50 genuinely new jobs, not 50 rows of which most are filtered out.

📥 Input

FieldTypeDefaultWhat it does
startUrlsarrayemptyXING job search URLs pasted from your browser. Keywords, location, radius and employment type are read from each one.
searchQueriesarray["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.
locationstring"Berlin"City or region. Applies to every keyword. Leave empty to search all of DACH.
radiusinteger20Kilometres around the location.
employmentTypearrayemptyFULL_TIME, PART_TIME, CONTRACTOR, INTERN, SEASONAL, TEMPORARY, VOLUNTARY. Empty means all.
careerLevelarrayemptySTUDENT, ENTRY, EXPERIENCED, MANAGER, DIRECTOR, EXECUTIVE. Empty means all.
maxResultsinteger200Stop 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.
includeDescriptionbooleantrueFetch the full description, industry, career level and keywords. Free.
onlyNewJobsbooleanfalseReturn 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

FieldTypeDescription
jobIdstringXING's own job id. Stable, and what monitoring mode remembers.
titlestringJob title, as posted.
companyNamestringHiring company.
companyXingUrlstringThe company's XING page.
companyWebsitestringThe employer's own website, when XING carries it.
citystringPrimary city of the role.
employmentTypestringGerman label as XING stores it, for example Vollzeit.
careerLevelstringSeniority label, for example Mit Berufserfahrung. Needs includeDescription.
industrystringEmployer's industry. Needs includeDescription.
salaryCurrencystringCurrency of the salary fields, usually EUR.
salaryMinnumberBottom of the salary range, per year.
salaryMediannumberMidpoint. Present on estimated salaries, absent on plain ranges.
salaryMaxnumberTop of the salary range, per year.
applyUrlstringThe employer's own apply URL. Null when the listing applies through XING.
applyTypestringEXTERNAL_URL, XING or XING_CUSTOM. Tells you why applyUrl is null.
xingUrlstringThe listing on XING.
refreshedAtstringWhen XING last refreshed the listing. Sort on this for newest first.
activeUntilstringWhen the listing expires.
isPaidListingbooleanWhether the employer paid to promote it.
isTopJobbooleanWhether XING flags it as a top job.
redirectsToThirdPartybooleanWhether applying leaves XING.
keywordsarrayXING's own keyword tags. Needs includeDescription.
tagsarrayXING's own phrase tags. Needs includeDescription.
descriptionHtmlstringFull description as HTML. Needs includeDescription.
descriptionTextstringThe same description as clean plain text.
searchQuerystringWhich of your keywords produced this row.
scrapedAtstringUTC 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?

JobsCost
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 developer in Berlin returned 505 jobs and then ran out. To get more, use more specific keywords or more cities rather than a larger maxResults.
  • 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.
  • applyUrl is null on roughly 4 of 10 listings. Those apply through XING itself rather than an employer career page, which applyType tells you explicitly. It is not a parsing miss, and xingUrl always 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 refreshedAt for 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.

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.

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