Xing Jobs Scraper – Pay Per Job, No Browser
Pricing
from $0.70 / 1,000 jobs
Xing Jobs Scraper – Pay Per Job, No Browser
Scrapes Xing job offers (Germany, Austria, Switzerland) over plain HTTP. Input: keywords plus optional location, employment, career level, remote and date filters. Output: jobId, title, company, location, salary, apply URL per job and, with fetchDetails, the full description. $1 per 1,000 jobs.
Pricing
from $0.70 / 1,000 jobs
Rating
0.0
(0)
Developer
Ivan Alexeev
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Security
Limited permissionsShare
What does Xing Jobs Scraper do?
It collects job offers from the Xing job search (xing.com/jobs), the job board of Germany, Austria and Switzerland, for the keywords you give it, optionally limited to a city and radius, an employment type, a career level, a remote option or a posting period. For each offer you get:
- Title, company, logo, location (first city plus every city of a multi-location posting)
- Employment type (Vollzeit, Teilzeit, …) and the salary: Xing's estimate with median, or the range or single amount the employer stated
- Apply URL when the application runs on the employer's site, and flags for external, paid, prioritized and top-job listings
- With Fetch job pages on: the full description (plain text and HTML), posting date, career level, remote options, industry, discipline, zip code, region, country, keywords, qualifications and language
- A stable numeric
jobIdand the search metadata: keyword, position, total results and whether that total is exact
It is made for recruiters watching a market, job boards and aggregators that need DACH offers, salary researchers, and anyone who wants a daily CSV of new postings for a few search terms.
Why this Xing scraper?
- No browser. Xing renders its search and job pages on the server, so the scraper reads them with plain HTTP requests. A run of 10 jobs with full details takes a few seconds on 256 MB of memory.
- Datacenter proxy by default. The pages are served to Apify's default datacenter pool, which keeps the platform cost per job near zero. Residential proxy stays available as an option.
- Pay per job, nothing else. You pay for jobs written to the dataset plus one actor-start event of $0.00005 per run. Failed requests, duplicates and empty searches cost nothing.
- Honest failures. If every search fails the run fails, so a scheduled job can't quietly return nothing. Pages without the expected markup are saved as
DEBUG_*.htmlin the run's key-value store.
How to use it
| Input | Description |
|---|---|
keywords | Job searches, one search per entry, up to 100. Example: ["python", "data engineer"]. |
location | Optional city or region as free text, e.g. "Berlin", "Wien", "Zürich". |
radius | Kilometres around the location (0–200). Used only with a location. |
maxItemsPerSearch | Unique jobs per keyword (1–1,000). Xing shows at most 1,000 results per search. |
fetchDetails | Open every job page for the description and the other detail fields. Default on. |
sincePeriod | Only jobs posted or refreshed in the last 24 hours or the last week. |
employmentType | One of Xing's employment types: Vollzeit, Teilzeit, Selbstständig, Studierende, Saisonarbeit, Aushilfe, Ehrenamt. |
careerLevel | Student/Praktikant, Berufseinsteiger, Mit Berufserfahrung, Manager, Direktor, Geschäftsführer. |
remoteOption | Remote (100 %), Teilweise remote or Vor Ort. |
sort | relevance (Xing's ranking) or date (newest first). |
maxConcurrency, maxRetries | Parallel requests (1–5) and attempts per page (1–3). |
proxyConfiguration | Apify Proxy, datacenter pool by default. |
{"keywords": ["python", "data engineer"],"location": "Berlin","radius": 50,"maxItemsPerSearch": 100,"fetchDetails": true,"sincePeriod": "LAST_WEEK"}
Each filter takes a single value per run; Xing accepts only one. To combine, say, Vollzeit and Teilzeit, run two tasks.
Output fields
| Field | Type | Notes |
|---|---|---|
jobId, xingId | integer, string | Numeric posting id (stable across runs) and Xing's own id such as 158550928.e8b783 |
url, title, companyName | string | Always filled |
companyUrl, logoUrl | string or null | Company page on Xing (most postings have none) and logo |
location, locations | string or null, array | First city and every city of the posting |
employmentType | string or null | German label as on the site, e.g. Vollzeit |
salary | object or null | {type, currency, min, max, median}; type is estimate (Xing's estimate, has median), range or single (employer-stated). Null when Xing shows no salary |
applyUrl, applicationType | string or null, string | External application URL, only for UrlApplication postings; otherwise the application runs on Xing |
isExternalListing, isPaidListing, isPrioritized, isTopJob | boolean | Listing flags from the search result |
refreshedAt, activeUntil | string | ISO 8601 timestamps |
keyResponsibilities | array | Xing's summary bullets, empty when the site has none |
postedAt | string or null | Posting date (activatedAt); job page only |
careerLevel, industry, discipline | string or null | German labels; job page only |
remoteOptions | array | FULL_REMOTE, PARTLY_REMOTE, NON_REMOTE; job page only |
country, zipCode, region | string or null | Country code such as DE, AT, CH; job page only |
keywords, qualifications, language | array, array, string | Job page only |
description, descriptionHtml | string or null | Full description as text (sections separated by blank lines, lists as - bullets) and as HTML; job page only |
detailError | string or null | Set when the job page could not be fetched or parsed; the card fields above are still filled |
keyword, position, totalResults, totalIsExact | string, integer, integer, boolean | Search metadata: the keyword, the job's rank in that search (1 = first), Xing's result count and whether it is exact |
scrapedAt | string | ISO 8601 UTC |
{"keyword": "python","position": 1,"totalResults": 426,"totalIsExact": true,"jobId": 156675213,"url": "https://www.xing.com/jobs/berlin-python-developer-financial-services-all-genders-156675213","title": "Python Developer Financial Services (all genders)","companyName": "Exxeta","location": "Berlin","employmentType": "Vollzeit","salary": {"type": "estimate", "currency": "EUR", "min": 59000, "max": 86000, "median": 76000},"applyUrl": "https://career.exxeta.com/Python-Developer-Financial-Services-all-genders-de-j1018.html","postedAt": "2026-09-17T05:36:36Z","careerLevel": "Mit Berufserfahrung","remoteOptions": ["NON_REMOTE"],"industry": "Beratung, Consulting","description": "Standorte: Karlsruhe, Berlin, …\nDein Herz schlägt für die Softwareentwicklung …","scrapedAt": "2026-10-30T14:20:21Z"}
How much does it cost to scrape Xing jobs?
You pay per job written to the dataset. Platform usage (compute and the datacenter proxy) is included in that price; without a browser it amounts to a few cents per thousand jobs anyway.
| Plan | Price per 1,000 jobs |
|---|---|
| Free | $1.00 |
| Starter (Bronze) | $0.90 |
| Scale (Silver) | $0.80 |
| Business (Gold) and above | $0.70 |
Each run also charges $0.00005 for the actor start. Example: 1,000 jobs with full details on the free plan cost $1.00 for the jobs plus $0.00005 for the start; the few cents of platform usage for the roughly 1,050 requests are already covered. Set a maximum total charge on the run and the scraper stops once it is used up: it checks the remaining budget before every search page and every job page.
Use the data in Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_API_TOKEN>")run = client.actor("murmuring_headlamp/xing-jobs-fast").call(run_input={"keywords": ["data engineer"], "location": "Berlin", "maxItemsPerSearch": 100})jobs = client.dataset(run["defaultDatasetId"]).list_items().items
FAQ
I searched for something rare and still got 20 jobs. Why? Xing's search is semantic: when nothing matches well it pads the list with related offers and reports the total as "at least 1,000". Check totalIsExact: true means Xing counted real matches, false means you are looking at fallback results.
Why does the fully remote filter ignore my location? The site drops the location from a fully remote search; the results cover all of Germany, Austria and Switzerland. Use partly remote or on site if the city matters.
Why do I get at most 1,000 jobs per keyword? Xing serves 50 pages of 20 results and refuses deeper offsets. Split broad searches by city, employment type or posting period to get more.
Why is applyUrl empty for many jobs? It is filled only when the application runs on an external site (applicationType is UrlApplication). For the others candidates apply through Xing, and the job url is the place to send them.
Is the salary real? type: "estimate" is Xing's own estimate for the role and region, with a median. range and single are what the employer wrote into the posting.
Why are the labels German? Employment type, career level, industry and discipline come exactly as Xing shows them (Vollzeit, Mit Berufserfahrung, …), so they match the site's filters. remoteOptions and country are codes.
A job page failed. The item keeps its search card fields and detailError says why (for example an offer removed between the search and the fetch). Such items are still charged, since the job was found.
Is it legal? The scraper reads public job offers, does not log in and collects no candidate data. It is not affiliated with XING or New Work SE. Respect the site's terms and robots rules, and you are responsible for how you use the results.
Related actors
- Google Jobs Scraper: job postings aggregated by Google, any country.
This Actor is not affiliated with XING or New Work SE.