How to scrape European job boards for multi-market recruiting
Key Takeaways
Why not just scrape Indeed's German or Swiss edition instead of four separate local boards? Indeed operates in these countries, but local boards carry listings Indeed doesn't fully mirror — Xing specifically dominates DACH professional networking with 22M+ members, and JustJoin.it is the board Polish tech candidates and recruiters actually use day to day, independent of whatever Indeed's local penetration looks like.
Do all four boards use the same language for filters and fields?
No — Jobware.de's employment-type values are in German (vollzeit, teilzeit, werkstudent), while Xing, Jobs.ch, and JustJoin.it largely normalize their own output to English field values regardless of the posting's original language. Check each actor's own enum values before building a cross-board filter.
Is canton/state-level filtering reliable across all four?
Jobs.ch has the strictest implementation — each selected canton gets its own result quota, and every job is confirmed to actually be in that canton before being returned. Jobware.de derives a canton-equivalent German state code from the job's postal code as a best-effort field rather than a filtered guarantee.
Four Markets, Four Boards
| Country | Board | Actor | Notable filter |
|---|---|---|---|
| Germany, Austria, Switzerland (DACH) | Xing Jobs Scraper | discipline (professional field) | |
| Germany | Jobware.de | Jobware.de Job Scraper | German-language employmentType enum |
| Switzerland | Jobs.ch | Jobs.ch Scraper | Strict per-canton result quotas |
| Poland | JustJoin.it | JustJoin.it Jobs Scraper | Tech-specific category (react, python, devops) |
Xing: The DACH Professional Network
The Xing Jobs Scraper covers Xing's ~1 million active postings across Germany, Austria, and Switzerland — roles that often don't surface on English-language boards at all:
{
"title": "Data Analyst (m/w/d)",
"company": "Example GmbH",
"location": "Berlin",
"salary": "EUR 47,500 - EUR 55,000",
"discipline": "IT",
"remote": "hybrid",
"date_posted": "2026-10-14"
}
enrichedScraping: true (the default) fetches each job's detail page for the full description and career-level data at a higher per-result cost; set it false for a fast, cheap SERP-only pass when you only need title, company, and salary.
Jobware.de: German-Language, HTTP-Only
The Jobware.de Job Scraper is HTTP-only — no browser rendering — and talks directly to Jobware's internal search API:
{
"title": "Softwareentwickler (m/w/d)",
"company": "Beispiel AG",
"canton": "BE",
"employment_type": "full-time",
"remote_option": "hybrid",
"apply_email": "jobs@beispiel.example",
"contact_firstname": "Anna",
"contact_lastname": "Müller"
}
Note the input/output language mismatch: employmentType as an input filter takes German values (vollzeit, teilzeit, werkstudent, praktikum, ausbildung), but the output field employment_type is normalized to English (full-time, part-time, …). apply_email and named contact_firstname/contact_lastname are extracted directly from the posting when Jobware exposes them — useful for direct outreach without going through an application portal.
Jobs.ch: Strict Canton Filtering
The Jobs.ch Scraper covers all 26 Swiss cantons across German, French, and English postings:
{
"title": "Software Engineer",
"company": "Beispiel SA",
"location": "Zürich",
"canton": "ZH",
"employment_type": "permanent",
"workload_min": 80,
"workload_max": 100,
"company_rating": 4.2
}
Unlike Jobware's best-effort canton derivation, Jobs.ch gives each requested canton its own result quota and confirms every returned job is actually located there — meaningful in a country where German, French, and Italian-speaking cantons have genuinely different labor markets, and a loose location match would blend results that shouldn't be compared together. companyFilter: "exclude-hr" drops recruitment-agency postings to surface only direct employers.
JustJoin.it: Polish Tech, Skills-First
The JustJoin.it Jobs Scraper is scoped specifically to tech roles, with category values like react, python, or ux rather than a generic industry field:
{
"title": "Senior React Developer",
"company": "Example Sp. z o.o.",
"category": "react",
"workplace_type": "remote",
"experience": "senior",
"required_skills": ["React", "TypeScript", "Redux"],
"salary": "18000-24000 PLN"
}
employment_types distinguishes B2B contracts from permanent employment — a meaningful distinction in the Polish tech market, where B2B (self-employed contractor) arrangements are extremely common and typically carry different effective pay than a comparable permanent salary line.
Combining Into One Cross-Market Feed
async function scrapeEuropeanMarkets(keyword) {
const [xing, jobware, jobsch, justjoin] = await Promise.all([
runActor("xing-jobs-scraper", { keyword, results_wanted: 50 }),
runActor("jobware-de-scraper", { searchQueries: [keyword], maxResultsPerQuery: 50 }),
runActor("jobs-ch-scraper", { searchQueries: [keyword], maxResultsPerQuery: 50 }),
runActor("justjoin-jobs-scraper", { keywords: keyword, maxItems: 50 }),
]);
return { xing, jobware, jobsch, justjoin };
}
Feed the combined list through the Data Cleaner to normalize the German/English field-language mismatch before merging — the same normalize-then-dedupe pattern used for US job boards and the general job-aggregation workflow.
FAQ
Do any of these four require a login or local phone number to use? No — all four read public job search and detail pages without an account on the underlying board.
Which board should you start with for a general DACH-region tech search? Xing for breadth (professional network, all industries, 22M+ members) plus JustJoin.it if the search extends into Poland's tech market specifically — the two together cover most of Central European tech recruiting without needing all four boards for every search.
Browse ParseBird's Jobs category for the rest of the 45+ job board sources in the catalog.