jobs.ch Jobs Scraper (Switzerland: jobup, jobscout24, job-room) avatar

jobs.ch Jobs Scraper (Switzerland: jobup, jobscout24, job-room)

Pricing

$3.00 / 1,000 job listings

Go to Apify Store
jobs.ch Jobs Scraper (Switzerland: jobup, jobscout24, job-room)

jobs.ch Jobs Scraper (Switzerland: jobup, jobscout24, job-room)

Search jobs.ch, jobup.ch, JobScout24.ch and the Swiss federal job-room.ch platform in one query with a unified output schema.

Pricing

$3.00 / 1,000 job listings

Rating

0.0

(0)

Developer

WebAlpine Studio

WebAlpine Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Share

What does the jobs.ch Jobs Scraper do?

Swiss Jobs Scraper searches four major Swiss job boards in one run: jobs.ch, jobup.ch, JobScout24.ch and the Swiss federal job platform job-room.ch. You enter a keyword and an optional location, and you get back one flat dataset with the same fields for every site: title, company, place, canton, workload, employment type, publication date, description and a link to the original ad.

It uses the sites' public search pages and JSON endpoints over plain HTTP, no browser, so a run with 100 results typically finishes in under a minute. Run it from the Apify Console, schedule it, or call it through the Apify API and connect the results to Google Sheets, Slack, Make, Zapier or your own code.

Why this actor

  • Public data only: the public JSON search APIs of jobs.ch and jobup.ch, the official federal job-room.ch API of the SECO, and the public JobScout24 result pages.
  • No login, no cookies, no browser and no proxy. Plain HTTP with polite delays, so runs are fast and stable.
  • Structured, flat fields with the same schema for all four boards: title, company, place, canton, workload, employment type, date, description and URL.

Why use Swiss Jobs Scraper?

Anyone who wants a full picture of the Swiss job market has to check several sites, each with its own layout, filters and language. This Actor merges them into one dataset so you can:

  • Track new openings for a role, skill or company across all four boards and get alerted through scheduled runs and webhooks.
  • Build salary, skill or hiring trend research on top of a clean, deduplicated dataset instead of copying listings by hand.
  • Feed job data into a recruiting CRM, a dashboard or a custom job board for a region or industry.
  • Compare how the same search looks on the German speaking (jobs.ch, JobScout24) and French speaking (jobup.ch) boards and on the official federal platform.

How to use Swiss Jobs Scraper

  1. Open the Actor page and go to the Input tab.
  2. Enter a search query, for example a job title or skill such as "python", "pflegefachfrau" or "comptable".
  3. Optionally enter a location such as "Zürich", "Bern" or "Genève". You can also enter a two letter canton code such as "BE" or "ZH".
  4. Pick which of the four sources to search, or leave all four selected.
  5. Set the maximum number of items and decide whether to fetch full descriptions.
  6. Click Start. Results appear in the Output tab as they are collected and can be exported when the run finishes.

Input

FieldTypeDescription
querystringRequired. Keyword(s) to search for.
locationstringOptional place, region or canton code to filter results by. Each site applies its own location matching, see the FAQ.
sourcesarrayWhich job boards to search. Defaults to all four.
fetchDetailsbooleanWhen true, fetches every job's detail page or detail endpoint to get the full plain text description, plus the canton (jobs.ch, jobup.ch) and the exact publication date (JobScout24). Slower, one extra request per job. Default false.
maxItemsintegerMaximum number of records to return in total, spread evenly across the selected sources. If one source has fewer results, the remaining budget goes to the others. Default 100, maximum 5000.

Example input:

{
"query": "python",
"location": "Bern",
"sources": ["jobs.ch", "jobup.ch", "jobscout24.ch", "job-room.ch"],
"fetchDetails": false,
"maxItems": 100
}

Output

Each dataset item is a flat JSON record with the same fields for all four sources. This is a real record from a run with fetchDetails enabled, description shortened:

{
"source": "jobs.ch",
"job_id": "384bbefd-1193-4545-b36f-72cdbd1ffa94",
"url": "https://www.jobs.ch/de/stellenangebote/detail/384bbefd-1193-4545-b36f-72cdbd1ffa94/",
"title": "Senior Fullstack Engineer (C#, Angular, Python) (a)",
"company": "ERNI Schweiz AG",
"location": "Zürich",
"canton": "ZH",
"workload": "100%",
"employment_type": "permanent",
"published_at": "2026-06-25T15:20:58+02:00",
"description": "Wir sind ERNI. Seit 1994 beraten und unterstützen wir Unternehmen in den Bereichen Innovation und Technologie mit dem Ziel, ihre Leistungsfähigkeit nachhaltig zu steigern und den Weg in eine digitale Zukunft zu ebnen.\n\nWas Dich erwartet:\n\nEntwicklung moderner Fullstack-Anwendungen mit C# im Backend und Angular im Frontend ...",
"language": null,
"scraped_at": "2026-09-22T20:33:55.857353+00:00"
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Data table

FieldDescription
sourceWhich job board the record came from: jobs.ch, jobup.ch, jobscout24.ch or job-room.ch.
job_idThe job's identifier on its source site.
urlPublic link to the job posting on the source site.
titleJob title, plain text.
companyEmployer or agency name, null if the ad is anonymous.
locationCity or place exactly as given by the source, for example "Zürich" or "Bern, Fribourg, Neuchâtel".
cantonTwo letter canton code. Always set for job-room.ch and for jobs.ch and jobup.ch when fetchDetails is on. Otherwise derived from the place name or postcode with a built in table of Swiss towns, for example "Zürich" or "8004 Zürich" become ZH. Null when the place is unknown or lists several cantons.
workloadWorkload range such as "100%" or "80-100%".
employment_typeOne or more of permanent, temporary, freelance, internship, side_job, apprenticeship (jobs.ch, jobup.ch), permanent or temporary (job-room.ch), null for JobScout24.
published_atPublication date in ISO 8601. Always set for jobs.ch, jobup.ch and job-room.ch. For JobScout24 the listing only shows a relative age such as "2 W", so this is null unless fetchDetails is on.
descriptionPlain text. Without fetchDetails it is the short preview the site shows in its search results (jobs.ch, jobup.ch, job-room.ch) or null (JobScout24). With fetchDetails it is the full ad text.
languageISO language code of the ad. Only job-room.ch exposes it, the other sources leave it null.
scraped_atWhen this Actor fetched the record, ISO 8601 UTC.

Records are deduplicated by URL. jobs.ch and jobup.ch belong to the same company and often list the same ad, so an ad that appears on both is returned once, under whichever source ran first.

Pricing

This Actor uses pay per result. You pay USD 0.003 per job record, which is USD 3.00 per 1,000 results. There is no charge per run or per request, and a run that returns no results produces no result charges.

ResultsPrice
100USD 0.30
1,000USD 3.00
10,000USD 30.00

A daily alert with 50 new jobs costs USD 0.15 per run, about USD 4.50 per month. Set maxItems to cap the cost of a run.

This Actor only reads publicly available job listings and the public search endpoints the sites use for their own pages. It does not log in, does not bypass any paywall or bot protection and keeps a polite delay between requests. Job ads can contain personal data such as the name or e-mail address of a recruiter. What you do with the scraped data, including storing or processing such personal data, is your own responsibility. Review the terms of use of each source site before large scale or commercial use.

FAQ

How does the location filter work? Each site applies its own matching. jobs.ch, jobup.ch and JobScout24 receive the location as a search parameter and return jobs in and around that place, so a search for "Bern" can include nearby towns such as Zollikofen. job-room.ch is filtered by canton code when you enter one (for example "BE"), otherwise by a case insensitive match on the city name.

Why are some fields null? The Actor does not invent values. If a source does not expose a value it stays null: JobScout24 has no employment type or language in its listings, and jobs.ch and jobup.ch do not expose the ad language. The one derived field is canton: when a source gives only a place name, the Actor looks the town or postcode up in a table of Swiss towns and leaves the canton null if the place is unknown or ambiguous.

Why is the description so short? Without fetchDetails the description is the short preview or search snippet the site itself shows in its result list. Turn on fetchDetails to get the full ad text at the cost of one extra request per job.

How many results can I get? maxItems is capped at 5000 per run. The sites themselves usually return a few hundred to a few thousand results for a keyword, and the Actor stops when a source has no more pages.

Does the Actor use a browser or proxies? No. It uses plain HTTP requests without proxies. The sites have not blocked this at normal volumes, but if a source starts returning errors the run logs a warning for that source and continues with the others.

Something looks wrong or a site changed its layout. What do I do? Open an issue on the Actor's Issues tab with the input you used and what you expected. Job board layouts and endpoints change occasionally and the Actor will be updated.

Changelog

  • 0.2: README with concrete pricing. canton is now also filled for jobs.ch, jobup.ch and JobScout24 records without fetchDetails, derived from the place name or postcode through a built in lookup table (for example "Zürich" becomes ZH). Places that are unknown or span several cantons stay null.
  • 0.1: Initial release covering jobs.ch, jobup.ch, JobScout24.ch and job-room.ch, with employment type labels, deduplication across jobs.ch and jobup.ch, and optional full descriptions for all four sources.