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

Pricing

from $3.00 / 1,000 results

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

Jobs.ch Scraper - Swiss Job Board Data Extraction

Scrapes job listings from jobs.ch, Switzerland's largest job board powered by JobCloud.

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

Jobs.ch Job Scraper

Scrapes job listings from jobs.ch, Switzerland's largest job board powered by JobCloud.

Three Scraping Modes

This scraper supports three distinct modes for different use cases:

ModeInputOutputUse Case
SEARCH MODESearch query + filtersBasic or full job dataNew job discovery, market analysis
SEARCH + DETAILS MODEincludeJobDetails: true (default)Full job data with descriptionsComplete data collection in one run
DIRECT URLS MODEdirectUrls: [...]Full job data + job_statusStill-alive checks, re-scraping specific jobs

Features

  • API-based scraping - Uses the official Jobs.ch search API for fast, reliable data extraction
  • Multi-language support - Search in German, French, or English
  • Location filtering - Filter by city, canton, or region across all of Switzerland
  • Canton-specific search - Target specific Swiss cantons (ZH, BE, AG, etc.)
  • Employment type filter - Filter by permanent, temporary, or freelance positions
  • Workload filter - Filter by Pensum percentage (e.g., 40-60% for part-time)
  • Nationwide coverage - Access jobs from all Swiss cantons and regions
  • Comprehensive job data - Extracts title, company, location, salary, workload, contact details, and more
  • LLM-powered contact extraction - Optional AI-powered extraction of contact person details using Groq or OpenRouter
  • HR company filtering - Filter out recruitment agencies to get direct employer postings, or filter to only show HR agencies
  • Standardized output - Returns data in the JobListing schema format
  • Rate-limited - Respectful 2-second delays between API requests
  • Proxy support - Built-in proxy rotation for reliability

Input

FieldTypeDescriptionDefault
directUrlsarrayDirect job URLs to scrape (skips search mode)[]
searchQuerystringJob title, skills, or keywords to search for"" (all jobs)
locationstringCity, canton, or region name (e.g., "Zürich", "Bern", "Basel")"" (all Switzerland)
cantonstringFilter by specific canton (e.g., "ZH", "BE", "AG")"" (all cantons)
languagestringSearch language: de, fr, or ende
maxResultsintegerMaximum number of job listings to scrape500
employmentTypestringFilter by type: permanent, temporary, freelance"" (all)
workloadMinintegerMinimum workload/Pensum percentage (0-100)-
workloadMaxintegerMaximum workload/Pensum percentage (0-100)-
includeJobDetailsbooleanFetch full job descriptionstrue
companyFilterstringFilter by company type: all, exclude-hr, only-hrall
llmApiKeystringAPI key for LLM contact extraction (optional, secret)-
llmModelstringLLM model for contact extractionnone
proxyConfigurationobjectApify proxy settingsResidential

Mode 1: SEARCH MODE (Fast)

Search for jobs using keywords and filters:

  • Use case: Discover new jobs, market analysis, broad searches
  • Speed: Fast - API-based search
  • Output: Job data from search results + optional detail pages
{
"searchQuery": "Software Engineer",
"location": "Zürich",
"maxResults": 200
}

Mode 2: SEARCH + DETAILS MODE (Complete Data)

Default mode with includeJobDetails: true:

  • Use case: Complete data collection in one run
  • Speed: Moderate - visits detail pages for each job
  • Output: Full descriptions, requirements, contact details
{
"searchQuery": "Data Scientist",
"canton": "ZH",
"maxResults": 100,
"includeJobDetails": true
}

Mode 3: DIRECT URLS MODE (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
{
"directUrls": [
"https://www.jobs.ch/de/stellenangebote/detail/b475b944-eab5-4d69-b251-a325bd272d62/",
"https://www.jobs.ch/fr/offres-emplois/detail/a123b456-cd78-9012-efab-345678901234/",
"https://www.jobs.ch/en/vacancies/detail/c789d012-ef34-5678-90ab-cdef12345678/"
]
}

Direct URLs mode workflow:

  1. Provide array of Jobs.ch job detail URLs
  2. Scraper visits each URL directly
  3. Detects if job is still online or has been removed
  4. Extracts full job data if available
  5. Returns job_status field indicating availability

Language Support

Jobs.ch is a multilingual platform. Choose your preferred search language:

LanguageCodeDescription
GermandeDefault - most listings in German-speaking regions
FrenchfrListings in French-speaking regions (Romandie)
EnglishenInternational positions and English-language listings

Note: The language parameter sets the UI language but jobs are shown in all languages based on your search criteria.

Canton Filter

Target specific Swiss cantons for regional job searches:

CantonCodeMajor Cities
ZürichZHZürich, Winterthur
BernBEBern, Biel/Bienne
AargauAGAarau, Baden
GenevaGEGeneva
VaudVDLausanne, Montreux
Basel-StadtBSBasel
St. GallenSGSt. Gallen
TicinoTILugano, Bellinzona

See full list of 26 cantons in the input schema.

Employment Type

Filter jobs by contract type:

TypeDescription
permanentPermanent/unlimited contracts (Festanstellung)
temporaryTemporary/fixed-term contracts (Temporär)
freelanceFreelance/contract work (Freiberuflich)

Workload Filter (Pensum)

Filter jobs by workload percentage:

ExampleDescription
workloadMin: 80Jobs with at least 80% workload (typically full-time)
workloadMax: 60Part-time jobs up to 60%
workloadMin: 40, workloadMax: 60Part-time jobs between 40-60%

This is useful for finding specific part-time or full-time positions.

HR Company Filtering

Filter jobs by company type:

OptionDescription
allInclude all companies (default)
exclude-hrRemove HR/recruitment agencies (e.g., Adecco, Randstad, Manpower)
only-hrShow only HR/recruitment agency postings

The filter detects HR companies by matching company names against common patterns.

LLM Data Extraction (Optional)

The scraper can optionally use an LLM to extract structured data from job postings, including requirements, benefits, and contact details.

Supported LLM Providers:

  • Groq - Use API keys starting with gsk_ (recommended: fast and free tier available)
  • OpenRouter - Use API keys starting with sk-or-

Available Models:

Model IDProviderDescription
llama-3.1-8b-instantGroqFast, lightweight (default)
mistral-small-3.1-24b-instructOpenRouterMore capable, higher quality

The LLM extracts:

  • requirements - Array of job requirements/qualifications
  • company_benefits - Array of company benefits/perks
  • contact_phone - Contact phone number
  • contact_email - Contact email address
  • contact_salutation - "Herr" or "Frau"
  • contact_firstname - First name of contact person
  • contact_lastname - Last name of contact person

Example Input

Basic Search (All IT Jobs in Zürich)

{
"searchQuery": "Software Engineer",
"location": "Zürich",
"maxResults": 200
}

Canton-Specific Search (All Jobs in Canton Bern)

{
"searchQuery": "",
"canton": "BE",
"maxResults": 500
}

Part-Time Jobs in Basel (40-60%)

{
"searchQuery": "Buchhaltung",
"location": "Basel",
"workloadMin": 40,
"workloadMax": 60,
"maxResults": 50
}
{
"searchQuery": "Infirmier",
"canton": "VD",
"language": "fr",
"maxResults": 100
}

Direct Employer Postings Only (No HR Agencies)

{
"searchQuery": "Marketing Manager",
"location": "Zürich",
"companyFilter": "exclude-hr",
"maxResults": 100
}

With LLM Contact Extraction

{
"searchQuery": "Elektriker",
"canton": "AG",
"maxResults": 100,
"llmApiKey": "gsk_your_groq_api_key_here",
"llmModel": "llama-3.1-8b-instant"
}

Direct URLs - Still Alive Check

{
"directUrls": [
"https://www.jobs.ch/de/stellenangebote/detail/b475b944-eab5-4d69-b251-a325bd272d62/",
"https://www.jobs.ch/de/stellenangebote/detail/a123b456-cd78-9012-efab-345678901234/"
]
}

Output

Each job listing follows the standardized JobListing schema:

{
"id": "b475b944-eab5-4d69-b251-a325bd272d62",
"title": "Diplomierte Pflegefachperson",
"company": "Clienia Schlössli AG",
"location": "Oetwil am See",
"work_address": "Schlösslistrasse 8, 8618 Oetwil am See",
"canton": "ZH",
"job_status": "online",
"top_listing": null,
"employment_type": "full-time",
"workload_min": 80,
"workload_max": 90,
"remote_option": null,
"salary_text": null,
"description_snippet": "Für unseren Bereich in der Kinder- und Jugendpsychiatrie...",
"description_full": "Full job description text...",
"requirements": ["Erfahrung im Bereich der Kinder- und Jugendpsychiatrie", "Offene, kommunikative Persönlichkeit"],
"posted_at": "2025-12-10T15:36:17.000Z",
"expires_at": null,
"source_url": "https://www.jobs.ch/de/stellenangebote/detail/b475b944-eab5-4d69-b251-a325bd272d62/",
"source_platform": "jobs.ch",
"contact_salutation": "Frau",
"contact_firstname": "Irene",
"contact_lastname": "Walczewski",
"contact_email": null,
"contact_phone": "+41 44 929 83 73",
"contact_raw": "Irene Walczewski",
"apply_url": null,
"apply_email": null,
"company_url": "https://www.jobs.ch/de/firmen/23141-clienia-schlossli-ag/",
"company_website": "https://www.clienia.ch/de/",
"company_industry": "Health care / Social services",
"company_employee_count": "501 - 1000 employees",
"company_job_count": 21,
"company_jobs_url": "https://www.jobs.ch/de/firmen/23141-clienia-schlossli-ag/stellenangebote/",
"company_description": null,
"company_rating": 2.5,
"company_review_count": 8,
"company_reviews_url": "https://www.jobs.ch/de/firmen/23141-clienia-schlossli-ag/bewertungen/",
"company_social_urls": null,
"company_benefits": ["5 Wochen Ferien", "Attraktive Arbeitszeitformen", "Förderung von Fort- und Weiterbildungen"],
"scraped_at": "2025-12-11T14:16:53.609Z"
}

Output Fields

FieldDescription
idUnique job posting ID
titleJob title
companyCompany name
locationCity/location name
work_addressFull work address (street, postal code, city)
cantonSwiss canton code (ZH, BE, AG, etc.)
job_statusJob availability: online, offline, expired, unknown (Direct URLs mode only)
top_listingBoolean - if job is a paid promotion (Direct URLs: always null)
employment_typepermanent, temporary, freelance, full-time, part-time
workload_minMinimum workload percentage (Pensum)
workload_maxMaximum workload percentage (Pensum)
remote_optionremote, hybrid, onsite, or null
salary_textSalary as displayed (if available)
description_snippetFirst 500 characters of description
description_fullComplete job description
requirementsArray of job requirements (LLM-extracted if enabled)
posted_atPublication date
expires_atExpiration date (if available)
source_urlLink to job posting (language-specific URL)
source_platformAlways "jobs.ch"
contact_salutation"Herr" or "Frau"
contact_firstnameContact person first name
contact_lastnameContact person last name
contact_emailContact email address
contact_phoneContact phone number
contact_rawRaw contact text
apply_urlExternal application URL
apply_emailApplication email address
company_urlCompany profile URL on jobs.ch
company_websiteCompany's external website
company_industryCompany industry/sector
company_employee_countEmployee count range (e.g., "501 - 1000 employees")
company_job_countNumber of open positions at company
company_jobs_urlURL to company's job listings
company_ratingCompany rating (0-5 stars)
company_review_countNumber of company reviews
company_reviews_urlURL to company reviews page
company_benefitsArray of company benefits (LLM-extracted if enabled)
scraped_atTimestamp when the job was scraped

Notes on job_status field:

  • Only populated in Direct URLs mode (Mode 3)
  • In Search modes (Mode 1 & 2), this field is null since jobs from search results are assumed to be online
  • Values:
    • online - Job is currently available
    • offline - Job page returns 404 or "not found"
    • expired - Job explicitly marked as expired
    • unknown - Unable to determine status

Usage

Via Apify Console

  1. Go to the actor page
  2. Configure input parameters
  3. Click "Start"
  4. Download results from the Dataset tab (JSON, CSV, Excel)

Via API

curl -X POST "https://api.apify.com/v2/acts/santamaria~jobs-ch-scraper/runs" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"searchQuery": "Data Scientist",
"canton": "ZH",
"maxResults": 100
}'

Via Apify SDK (Node.js)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('santamaria/jobs-ch-scraper').call({
searchQuery: 'Marketing Manager',
location: 'Zürich',
employmentType: 'permanent',
maxResults: 150,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Found ${items.length} jobs`);

Coverage

Jobs.ch is Switzerland's largest job board, covering all 26 cantons:

German-Speaking Regions

  • Zürich (ZH), Bern (BE), Luzern (LU), Aargau (AG)
  • St. Gallen (SG), Basel (BS/BL), Thurgau (TG)
  • Solothurn (SO), Schaffhausen (SH), Graubünden (GR)

French-Speaking Regions (Romandie)

  • Geneva (GE), Vaud (VD), Fribourg (FR)
  • Neuchâtel (NE), Valais (VS), Jura (JU)

Italian-Speaking Region

  • Ticino (TI)

Performance

  • Speed: ~100-300 jobs/minute (limited by respectful rate limiting)
  • Cost: ~0.01-0.03 CU per 500 jobs
  • Reliability: Built-in retry logic and error handling

Data Source

This actor scrapes data from Switzerland's largest job board:

  • Website: jobs.ch
  • API: JobCloud job search API
  • Coverage: All of Switzerland (26 cantons)
  • Platform: Powered by JobCloud

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. Still-alive monitoring: Check if previously scraped jobs are still active (Direct URLs mode)
  5. Post-deduplication enrichment: Scrape basic data first, then fetch details for new jobs only
  6. Career research: Analyze salary ranges and requirements
  7. Recruitment sourcing: Find candidates via company postings

This actor accesses publicly available job listings through the API. Please ensure your use case complies with jobs.ch terms of service.


Part of the Santamaria Job Scrapers Suite - Professional-grade job data for the DACH region and beyond.

Need help with integration, aggregation, or custom scraping solutions? Contact us at contact@alessandrosantamaria.com