JobScout24.ch Scraper - Swiss Job Board Data Extraction avatar
JobScout24.ch Scraper - Swiss Job Board Data Extraction

Pricing

from $3.00 / 1,000 results

Go to Apify Store
JobScout24.ch Scraper - Swiss Job Board Data Extraction

JobScout24.ch Scraper - Swiss Job Board Data Extraction

Scrapes job listings from JobScout24.ch, a major Swiss job portal. Filter by region, category (IT, finance, healthcare, etc.), and employment type. Includes optional LLM-powered contact extraction.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Alessandro Santamaria

Alessandro Santamaria

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

JobScout24.ch Job Scraper

Scrapes job listings from JobScout24.ch - major Swiss job board with 108,615+ jobs online. Extract jobs from 11 Swiss regions, 24+ career categories with comprehensive filters.

Three Scraping Modes

This scraper supports three distinct modes for different use cases:

ModeInputOutputUse Case
SERP OnlyincludeJobDetails: falseBasic job data (title, company, location, URL)Mass collection, deduplication, cost-efficient
SERP + DetailsincludeJobDetails: true (default)Full job data with descriptionsComplete data in one run
Direct URLsdirectUrls: [...]Full job data + job_statusStill-alive checks, re-scraping specific jobs

Features

  • Comprehensive Swiss coverage: 108,615+ active job listings
  • Regional targeting: 11 Swiss regions including Zürich, Bern, Basel, Romandie, Tessin, and more
  • Category filtering: 24+ career categories from IT to Healthcare
  • Employment type filtering: Full-time, part-time, temporary, apprenticeships, internships
  • Three scraping modes: SERP only, SERP + details, or direct URL scraping
  • Job status detection: Track if jobs are still online, offline, or expired
  • Anti-bot bypass: Uses Playwright with residential proxies for reliable scraping
  • Rich data extraction: Title, company, location, salary, workload, description, requirements, benefits
  • Standardized output: Consistent JobListing schema across all job scrapers

Input

ParameterTypeDefaultDescription
directUrlsarray[]Direct job URLs to scrape (skips search mode)
searchQuerystring""Job title, keywords, or company name
regionstring""Swiss region (see supported regions below)
categorystring""Job category (IT, Engineering, Finance, etc.)
employmentTypestring""Employment type filter
maxResultsinteger100Maximum number of jobs to scrape (1-1000)
includeJobDetailsbooleantrueFetch full job descriptions (slower but more data)
llmApiKeystring""API key for LLM extraction of contact details (Groq or OpenRouter)
llmModelstring"none"LLM model for contact extraction (none, llama-3.1-8b-instant, mistral-small-3.1-24b-instruct)
proxyConfigurationobjectResidentialApify proxy settings

Mode 1: SERP Only (Fast & Cost-Efficient)

Set includeJobDetails: false to scrape only search results without visiting detail pages:

  • Fastest mode - Only scrapes search result pages
  • Most cost-efficient - Minimal compute and proxy usage
  • Basic data - Title, company, location, URL, salary snippet
  • Use case - Mass job collection for deduplication against existing database

Mode 2: SERP + Details (Full Data)

Default mode with includeJobDetails: true:

  • Two-phase scraping - First collects from SERP, then visits each detail page
  • Complete data - Full descriptions, requirements, benefits, apply URLs
  • Use case - Initial comprehensive scraping of new jobs

Mode 3: Direct URLs (Still Alive Checks)

When directUrls is provided, the scraper operates in direct mode:

  • Skips search phase - Goes directly to provided job URLs
  • Job status detection - Returns online, offline, expired, or unknown
  • Full data extraction - Same as detail page scraping
  • Use case - Periodic "still alive" checks, re-scraping specific jobs after deduplication

LLM Extraction (Optional)

Enable LLM-powered extraction to get structured contact information from job descriptions:

  • Contact details: First name, last name, email, phone, salutation (Herr/Frau)
  • Enhanced requirements: Better structured list of job requirements
  • Benefits extraction: Company benefits/perks from description text

Supported LLM providers:

  • Groq (fast, recommended): Use API key starting with gsk_
  • OpenRouter: Use API key starting with sk-or-

Supported Regions

  • Zürich - Greater Zürich area
  • Bern - Canton Bern and surroundings
  • Basel - Basel-Stadt and Basel-Landschaft
  • Aargau - Canton Aargau
  • Ostschweiz - Eastern Switzerland (St. Gallen, Thurgau, Appenzell)
  • Zentralschweiz - Central Switzerland (Luzern, Zug, Schwyz)
  • Romandie - French-speaking Switzerland (Geneva, Lausanne, Fribourg, Neuchâtel)
  • Tessin - Italian-speaking Switzerland
  • Graubünden - Canton Graubünden
  • Wallis - Canton Wallis/Valais
  • Remote - Remote work positions

Supported Categories

  • IT / Software Development
  • Engineering / Technical
  • Finance / Banking / Insurance
  • Sales
  • Marketing / Communication
  • Human Resources
  • Healthcare / Medical
  • Education / Training
  • Hospitality / Tourism
  • Construction / Architecture
  • Logistics / Supply Chain
  • Administration / Office
  • Management / Executive
  • Legal / Law
  • Customer Service
  • And 10+ more categories

Employment Types

  • Full-time (Vollzeit) - 100% positions
  • Part-time (Teilzeit) - Flexible workload
  • Temporary - Contract/temporary positions
  • Apprenticeship (Lehrstelle) - Swiss apprenticeship programs
  • Internship (Praktikum) - Internship opportunities

Output

Each job listing includes:

{
"id": "job123456",
"title": "Senior Software Engineer",
"job_status": "online",
"company": "Swiss Tech AG",
"location": "Zürich, ZH",
"canton": "ZH",
"employment_type": "full-time",
"workload_min": 80,
"workload_max": 100,
"remote_option": "hybrid",
"salary_text": "CHF 100'000 - 130'000 per year",
"description_snippet": "We are looking for...",
"description_full": "Full job description with all details...",
"requirements": [
"5+ years of experience in software development",
"Proficiency in Python and TypeScript",
"Experience with cloud platforms (AWS/Azure)"
],
"posted_at": "2025-12-04T10:00:00.000Z",
"expires_at": "2026-01-04T23:59:59.000Z",
"source_url": "https://www.jobscout24.ch/en/job/job123456/",
"source_platform": "jobscout24.ch",
"contact_salutation": "Herr",
"contact_firstname": "Max",
"contact_lastname": "Müller",
"contact_email": "max.mueller@swisstech.ch",
"contact_phone": "+41 44 123 45 67",
"contact_position": "Head of HR",
"contact_raw": null,
"apply_url": "https://careers.swisstech.ch/apply/123456",
"apply_email": "jobs@swisstech.ch",
"company_url": "https://www.jobscout24.ch/en/company/swiss-tech-ag/1234/",
"company_description": "Leading Swiss technology company...",
"company_rating": 4.5,
"company_review_count": 23,
"company_social_urls": null,
"company_benefits": [
"Flexible working hours",
"Home office options",
"Professional development budget"
],
"scraped_at": "2025-12-05T12:00:00.000Z"
}

Notes:

  • Contact fields (contact_firstname, contact_lastname, contact_email, contact_phone, contact_salutation, contact_position) - Only populated when LLM extraction is enabled.
  • Requirements & benefits - Only extracted via LLM when enabled; otherwise empty arrays/null.
  • Company rating/reviews - Extracted from company profile cards on detail pages (Modes 2 & 3 only).
  • job_status - Indicates job availability: online, offline, expired, or unknown. Most useful in Direct URL mode (Mode 3).
  • company_social_urls - Reserved for future use; currently always null.
  • apply_url - External application URL from "Apply online" button (not the JobScout24 page URL).

Example Usage

Mode 1: SERP Only - Mass Collection for Deduplication

{
"searchQuery": "Developer",
"region": "zurich",
"category": "it",
"maxResults": 500,
"includeJobDetails": false
}

Returns basic job data quickly for comparison with existing database. After deduplication, use Mode 3 to scrape full details of new jobs only.

Mode 2: SERP + Details - Full Data Extraction

{
"searchQuery": "Software Engineer",
"region": "zurich",
"category": "it",
"maxResults": 50
}

Default mode - collects complete job data including descriptions, requirements, and apply URLs.

Mode 3: Direct URLs - Still Alive Checks

{
"directUrls": [
"https://www.jobscout24.ch/en/job/ea400c30-5c34-43a1-bbb1-a2302093906a/",
"https://www.jobscout24.ch/de/job/backend-entwickler/87654321/",
"https://www.jobscout24.ch/en/job/devops-engineer/11223344/"
]
}

Use this mode for:

  • Still alive checks - Verify if previously scraped jobs are still online
  • Post-deduplication enrichment - After SERP-only scraping, fetch full details for new jobs only
  • Re-scraping specific jobs - Update data for specific job URLs

Output includes job_status field: online, offline, expired, or unknown.

More Search Examples

Part-time Marketing in Romandie:

{
"searchQuery": "Marketing",
"region": "romandie",
"employmentType": "part-time",
"maxResults": 100
}

Remote IT Jobs:

{
"searchQuery": "Developer",
"region": "remote",
"category": "it",
"maxResults": 200
}

Apprenticeships in Basel:

{
"searchQuery": "",
"region": "basel",
"employmentType": "apprenticeship",
"maxResults": 50
}

How It Works

  1. Search Phase: Crawls JobScout24.ch search results pages, collecting job cards with basic info (title, company, location, salary snippet, workload)
  2. Detail Phase (optional): Visits each job's detail page to extract:
    • Full job description
    • Detailed requirements list
    • Company benefits
    • Contact information
    • Apply URL/email
    • Expiration date
  3. Data Mapping: Maps Swiss-specific fields:
    • Canton extraction from location
    • Workload percentage (e.g., "80-100%")
    • Swiss employment types (Vollzeit, Teilzeit, Lehrstelle)
    • CHF salary parsing
  4. Validation: Each job is validated against the JobListing schema before saving
  5. Pagination: Automatically follows pagination to collect up to maxResults jobs

Technical Details

Dynamic Content Loading

JobScout24.ch uses:

  • Tealium tracking (utag): Dynamic content loading system
  • JavaScript rendering: Requires Playwright for proper extraction
  • Lazy loading: Job cards load as you scroll/paginate

Scraping Approach

  1. Wait for job listings container to load
  2. Handle cookie consent dialogs
  3. Extract job cards using multiple selector strategies
  4. Parse Swiss-specific data formats:
    • Canton abbreviations (ZH, BE, GE, etc.)
    • Workload percentages
    • Swiss date formats
    • CHF salary notations
  5. Follow pagination links
  6. Visit detail pages for complete data

Proxy Recommendations

JobScout24.ch may have anti-bot protection. For best results:

  • Use Residential proxies (recommended)
  • Avoid Datacenter proxies (may be blocked)
  • Keep maxResults reasonable (<500 per run)
  • Add delays between runs if scraping frequently

Local Development

# Navigate to actor directory
cd actors/jobs/jobscout24-ch
# Install dependencies
npm install
# Build TypeScript
npm run build
# Run locally with Apify CLI
apify run --purge
# Push to Apify (do NOT run yet - testing only)
# apify push

Data Quality Notes

  • 108,615+ jobs: Large job inventory across all regions
  • Swiss-specific fields: Canton, workload percentage, Swiss employment types
  • Multilingual: Jobs in German, French, Italian
  • Regular updates: Job postings updated daily
  • Standardized schema: Compatible with other job board scrapers

Regional Coverage Statistics

Based on typical distribution:

  • Zürich region: ~30% of jobs (largest market)
  • Romandie (Geneva, Lausanne): ~25%
  • Basel region: ~12%
  • Bern region: ~10%
  • Other regions: ~23%

Common Use Cases

  1. Job market analysis: Track hiring trends by region/category
  2. Competitive intelligence: Monitor competitors' hiring
  3. Job aggregation: Build job search platforms
  4. Career research: Analyze salary ranges and requirements
  5. Recruitment sourcing: Find candidates via company postings
  6. Market research: Study Swiss employment landscape

Limitations

  • JobScout24.ch's page structure may change; selectors may need updates
  • Some jobs may require login to see full details
  • Rate limiting applies - avoid aggressive scraping
  • Respects robots.txt and terms of service

Version History

  • v1.0.5 (2025-12-12): Direct URL mode for still alive checks

    • Added directUrls input parameter for direct job page scraping
    • Added job_status field (online/offline/expired/unknown) for job availability tracking
    • Skip search phase when direct URLs are provided
    • Performance improvements for direct URL mode
  • v1.0.4 (2025-12-12): Search & extraction improvements

    • Fixed search query not filtering results (now uses path-based URLs)
    • Extract actual apply URL from "Apply online" button (external ATS links)
    • Extract company rating and review count from company profile cards
    • Extract workload (min/max) from property tags element
    • Added LLM extraction option for contact details (requires API key)
    • Contact data now only extracted when LLM is enabled (matching jobs-ch behavior)
  • v1.0.3 (2025-12-11): Date normalization

    • Normalize date formats to valid ISO datetime
  • v1.0.2 (2025-12-10): JSON-LD extraction

    • Extract job data from JSON-LD structured data
  • v1.0.0 (2025-12-05): Initial release

    • 11 Swiss regions supported
    • 24+ career categories
    • Employment type filtering
    • Full job detail extraction
    • Standardized JobListing schema output