Web Scraping Layers for AI & Automation

back to blog

How to scrape European job boards for multi-market recruiting

ParseBird·05 Sep 2026

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

CountryBoardActorNotable filter
Germany, Austria, Switzerland (DACH)XingXing Jobs Scraperdiscipline (professional field)
GermanyJobware.deJobware.de Job ScraperGerman-language employmentType enum
SwitzerlandJobs.chJobs.ch ScraperStrict per-canton result quotas
PolandJustJoin.itJustJoin.it Jobs ScraperTech-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.