jobs.ch Scraper: Stellenanzeigen als Tabelle exportieren
Du suchst Stellenanzeigen von jobs.ch und willst sie in Excel oder in eine eigene Auswertung bekommen? Der Jobs.ch Scraper holt die Anzeigen zu deinen Suchbegriffen und deinem Ort und liefert sie als Tabelle: Titel, Arbeitgeber, Ort, Kanton, Pensum, Datum und Link zur Anzeige. Ohne Code, in wenigen Minuten.
In diesem Tutorial
Das bekommst du
jobs.ch bietet keine Export-Funktion für Stellenanzeigen. Der jobs.ch-Scraper holt die Anzeigen zu deinen Suchbegriffen und legt sie als Tabelle ab, die du als CSV, Excel oder JSON herunterladen kannst. Er findet Stellen in der ganzen Schweiz, auch in französischer und italienischer Sprache. Jede Zeile ist eine Anzeige, hier gekürzt und mit erfundenen Beispielwerten zur Veranschaulichung der Struktur:
{
"id": "...",
"title": "...",
"company_name": "...",
"location": "...",
"canton": "ZH",
"employment_type": "...",
"workload_min": 60,
"workload_max": 100,
"posted_at": "...",
"source_url": "https://www.jobs.ch/...",
"source_platform": "jobs.ch",
"search_query": "..."
}Die Werte hängen von der einzelnen Anzeige ab. Ein echter Lauf mit Zahlen steht weiter unten im Beispiel.
Alle Felder im Überblick
So sind die Felder laut Ausgabe-Schema des Actors aufgebaut. Ohne includeJobDetails fehlen die Felder, die nur auf der Detailseite stehen (zum Beispiel der volle Anzeigentext und die Anforderungen).
| Feld | Typ | Inhalt |
|---|---|---|
id | Text | Eindeutige Anzeigen-ID |
title | Text | Titel der Anzeige |
company_name | Text | Arbeitgeber (das ältere Feld company ist veraltet) |
location / canton | Text | Ort und Kanton als Kürzel (ZH, BE, AG ...) |
employment_type | Text | Beschäftigungsart, zum Beispiel permanent, temporary, freelance, full-time oder part-time |
workload_min / workload_max | Zahl | Pensum in Prozent |
remote_option | Text | remote, hybrid oder onsite, falls vorhanden |
salary_min / salary_max / salary_currency / salary_period | Zahl / Text | Gehalt, falls die Anzeige eines nennt |
description_snippet / description_full | Text | Kurzbeschreibung und voller Anzeigentext |
requirements | Liste | Genannte Anforderungen |
posted_at / expires_at | Text | Veröffentlichungs- und Ablaufdatum |
contact_firstname, contact_lastname, contact_email, contact_phone, contact_position | Text | Kontaktperson, falls die Anzeige eine nennt |
apply_url / apply_email | Text | Bewerbungslink und Bewerbungs-E-Mail, falls angegeben |
company_profile_url / company_jobs_url / company_job_count | Text / Zahl | Firmenprofil auf jobs.ch, Link zu allen Stellen des Arbeitgebers und deren Anzahl |
company_website, company_industry, company_size, company_rating | Text / Zahl | Firmendaten aus dem Profil, laut Schema gefüllt bei includeCompanyDetails |
company_benefits | Liste | Benefits des Arbeitgebers, falls auf jobs.ch genannt |
source_url / source_platform | Text | Link zur Originalanzeige und Plattform (jobs.ch) |
search_query / scraped_at | Text | Suchbegriff, der die Anzeige gefunden hat, und Zeitpunkt des Abrufs |
Beispiel: Pflegefachpersonen in Zürich
Wir haben die Suche einmal lokal laufen lassen (21.10.2026): Suchbegriff „Pflegefachperson“, Ort Zürich, Anzeigen der letzten 30 Tage, klassische Suche, Personalvermittler ausgeblendet. Das Ergebnis:
- 426 Stellen in der Tabelle.
- 382 davon mit Pflege-Titel. Das ist ein Filter, den wir nach dem Lauf auf die Tabelle gelegt haben: Titel mit Pflege, FaGe, Fachfrau/Fachmann Gesundheit, HF, Spitex, Pflegehelfer oder Pflegeassistenz.
- Die Stellen kommen von 102 Arbeitgebern.
- Der grösste Arbeitgeber ist das Universitätsspital Zürich mit 64 Stellen.
- 332 Stellen gibt es auch in Teilzeit (
workload_minunter 100).
Das war der Input:
{
"searchQueries": ["Pflegefachperson"],
"locations": ["Zürich"],
"language": "de",
"maxResultsPerQuery": 2000,
"sortBy": "newest",
"publicationDate": "30",
"searchMode": "classic",
"companyFilter": "exclude-hr",
"includeJobDetails": true
}locations: Ort oder Region, zum Beispiel Zürich, Bern oder Basel.publicationDate: Alter der Anzeigen in Stufen: 1, 3, 7 oder 30 Tage. Hier „30“ für die letzten 30 Tage.searchMode:classicsucht nach dem genauen Stichwort.semantic(Standard) sucht KI-gestützt und erkennt Synonyme.companyFilter:exclude-hrblendet Personalvermittler und Recruiting-Agenturen aus (zum Beispiel Adecco, Randstad, Manpower).only-hrzeigt nur sie,allalle. Der Actor erkennt Vermittler an Wörtern im Firmennamen wie Personal, Recruiting, Zeitarbeit oder Stellen.maxResultsPerQuery: Obergrenze pro Suchbegriff. 2000 liegt weit über den 426 Treffern, die Grenze griff also nicht.sortBy:newestsortiert die neuesten Anzeigen nach oben.
exclude-hr prüft nur den Firmennamen. Prüfe die Arbeitgeberliste kurz, bevor du sie weitergibst.Die Kosten dieses Laufs findest du im Abschnitt Kosten.
Die Auswertung nach Arbeitgebern und Teilzeit kannst du in Excel machen. Oder du lässt Claude das über den Apify-MCP-Server erledigen (mehr dazu in den weiterführenden Links). Ein Prompt dafür:
Nutze den Actor santamaria-automations/jobs-ch-scraper mit diesem Input:
{"searchQueries": ["Pflegefachperson"], "locations": ["Zürich"],
"language": "de", "maxResultsPerQuery": 2000, "sortBy": "newest",
"publicationDate": "30", "searchMode": "classic",
"companyFilter": "exclude-hr", "includeJobDetails": true}
Gruppiere die Stellen nach company_name und zähle sie.
Zähle zusätzlich pro Arbeitgeber, wie viele Stellen in Teilzeit möglich sind
(workload_min unter 100). Zeige die 10 grössten Arbeitgeber als Tabelle.
Sag mir vor dem Start, was der Lauf kostet, und warte auf mein OK.Apify-Konto anlegen
- Öffne die Seite des jobs.ch-Scrapers auf Apify.
- Klicke auf Try for free und registriere dich mit Google oder E-Mail.
- Du landest in der Apify Console im Tab Input des Actors. Für kleine Läufe reicht das monatliche Gratis-Guthaben des Free-Plans.
Suche und Ort eintragen
Im Feld searchQueries trägst du ein oder mehrere Suchbegriffe ein. Jeder Begriff läuft als eigene Suche, doppelte Anzeigen werden über alle Begriffe hinweg entfernt. Den Ort gibst du bei locations an, Kantone bei cantons. Ein kleiner Testlauf sieht so aus:
{
"searchQueries": ["Pflegefachperson"],
"locations": ["Zürich"],
"maxResultsPerQuery": 20,
"sortBy": "newest",
"includeJobDetails": true
}maxResultsPerQuery: Obergrenze pro Suchbegriff (Standard 10, 0 heisst unbegrenzt).maxResults: Obergrenze über alle Suchbegriffe zusammen (0 heisst unbegrenzt).sortBy:newestsortiert nach Datum, die neuesten zuerst.relevance(Standard) nutzt die Reihenfolge von jobs.ch.includeJobDetails:true(Standard) holt zusätzlich die Detailseite jeder Anzeige.falseist schneller und günstiger, liefert aber weniger Felder.
maxResultsPerQuery auf 10 bis 30. So siehst du in kurzer Zeit, ob die Treffer zu deinem Suchbegriff passen, und zahlst nur wenige Cent.Actor starten und Ergebnis ansehen
Klicke unten auf Save and Run. Auf der Lauf-Seite siehst du im Tab Log den Fortschritt, im Tab Dataset die Ergebnisse als Tabelle. Mehrere Suchbegriffe in einem Lauf sehen so aus:
{
"searchQueries": ["Pflegefachperson", "Pflegefachfrau", "Pflegefachmann"],
"locations": ["Zürich"],
"maxResultsPerQuery": 50,
"includeJobDetails": false
}Daten exportieren
- Öffne im Lauf den Tab Dataset.
- Klicke auf Export.
- Wähle das Format: CSV, Excel, JSON und weitere stehen zur Auswahl. Mit der Feld-Auswahl exportierst du nur die Spalten, die du brauchst, zum Beispiel
title,company_name,location,workload_minundsource_url.
Welche Filter es gibt
Der Actor filtert bei der Suche nach diesen Angaben:
- Suchbegriff (
searchQueries), Ort (locations) und Kanton (cantons). - Beschäftigungsart (
employmentType): permanent, temporary oder freelance. - Pensum (
workloadMinundworkloadMax), zum Beispiel 40 bis 60 Prozent. - Alter der Anzeige (
postedWithinDays): nur Anzeigen der letzten N Tage. - Arbeitgeber-Typ (
companyFilter): alle, ohne Personalvermittler oder nur Personalvermittler. - Titel (
titleFilter): kommagetrennte Begriffe, zum Beispiel „Pflege, Fachfrau“. Behalten wird, wessen Titel einen Begriff enthält. Aussortierte Anzeigen werden vor dem Abruf der Detailseite entfernt, du zahlst dafür keine Details. - Sortierung (
sortBy) und Sprache (language: de, fr oder en) der Suchoberfläche. - Eigene Such-URL (
startUrls): Stelle die Suche auf jobs.ch ein und füge die URL ein. - Einzelne Anzeigen (
directUrls) und bestimmte Firmen (companyNames): zum Beispiel um zu prüfen, ob eine Stelle noch online ist, oder um alle Stellen eines Arbeitgebers zu holen.
Per API und automatisch abrufen
Du kannst den Actor auch aus eigenen Skripten, n8n oder Make aufrufen. Dieser Aufruf startet einen Lauf und gibt die Ergebnisse direkt zurück (Apify-Endpunkt run-sync-get-dataset-items):
curl -X POST "https://api.apify.com/v2/acts/santamaria-automations~jobs-ch-scraper/run-sync-get-dataset-items?token=DEIN_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries": ["Pflegefachperson"], "locations": ["Zürich"], "publicationDate": "30", "searchMode": "classic", "companyFilter": "exclude-hr", "maxResultsPerQuery": 100}'Deinen API-Token findest du in der Apify Console unter Settings → API & Integrations. Für Abrufe, die regelmässig laufen sollen, legst du in der Console unter Schedules einen Zeitplan an. Setze sortBy auf newest und vergleiche die Ergebnisse mit dem letzten Abruf (Feld id), damit du nur neue Anzeigen weiterverarbeitest.
Was das kostet
Der Actor rechnet pro Ergebnis ab (Preise live aus dem Apify Store, Stand 21.10.2026, Free-Plan; höhere Apify-Pläne zahlen etwas weniger):
- Start: 0,001 $ pro Lauf.
- Anzeige aus der Trefferliste (
includeJobDetailsaus): 0,00287 $ pro Ergebnis. - Anzeige mit Detailseite (
includeJobDetailsan, Standard): 0,005 $ pro Ergebnis.
Jede Anzeige wird nur einmal berechnet, entweder als Treffer oder mit Details. Rechenbeispiel für die Suche oben mit 426 Stellen: mit Details 0,001 $ + 426 x 0,005 $ = 2,131 $, also etwa 2,13 $. Ohne Details 0,001 $ + 426 x 0,00287 $ = 1,224 $, also etwa 1,22 $. Annahmen: Free-Plan-Preise, jede der 426 Stellen wird einmal berechnet, ein Startereignis pro Lauf (bei 128 MB Speicher). Die aktuellen Preise findest du immer auf der Apify-Seite des Actors.
Wofür Leute die Daten nutzen
Recruiting
Sieh, welche Arbeitgeber in deiner Region für ein Berufsbild Leute suchen, wie viele Stellen offen sind und welche Pensen sie anbieten. Mit company_job_count und company_jobs_url kommst du schnell zu allen Stellen eines Arbeitgebers.
Personalvermittlung
Mit only-hr siehst du, welche Vermittler welche Stellen ausschreiben. Mit exclude-hr bekommst du die Direktausschreibungen von Arbeitgebern, die selbst suchen und als mögliche Kunden infrage kommen.
Lohn- und Marktanalyse
Wenn eine Anzeige ein Gehalt nennt, findest du es in salary_min, salary_max und salary_period. Lass den Lauf regelmässig laufen und zähle, wie viele Stellen pro Woche und Kanton dazukommen.
Häufige Fragen
Brauche ich Programmierkenntnisse für den jobs.ch-Scraper?
Nein. In der Apify Console füllst du ein Formular aus, klickst auf Save and Run und lädst die Tabelle herunter. Code brauchst du nur, wenn du den Actor per API in ein eigenes System einbauen willst.
Kann ich eine fertige jobs.ch-Suche verwenden?
Ja. Stelle deine Suche mit allen Filtern auf jobs.ch ein, kopiere die URL aus dem Browser und füge sie im Feld startUrls ein. Der Actor liest die Filter aus der URL.
Was macht der Filter exclude-hr?
Mit companyFilter exclude-hr blendet der Actor Personalvermittler und Recruiting-Agenturen aus. Er erkennt sie am Firmennamen, zum Beispiel an Wörtern wie Personal, Recruiting, Zeitarbeit oder Stellen. Das ist ein Namensabgleich, kein Register. Prüfe die Tabelle trotzdem kurz, weil einzelne Arbeitgeber mit solchen Wörtern im Namen mit ausgeblendet werden können.
Warum sind weniger Stellen mit Pflege-Titel in der Tabelle als Treffer?
Die Suche liefert auch Anzeigen, in denen der Begriff nur im Text vorkommt. Im Beispiellauf hatten 382 von 426 Stellen einen Pflege-Titel (Titel mit Pflege, FaGe, Fachfrau/Fachmann Gesundheit, HF, Spitex, Pflegehelfer oder Pflegeassistenz, als Filter nach dem Lauf). Mit dem Feld titleFilter behältst du nur Anzeigen, deren Titel einen deiner Begriffe enthält.
Was kostet der jobs.ch-Scraper?
Im Free-Plan 0,001 $ pro Lauf, dazu 0,00287 $ pro Anzeige aus der Trefferliste oder 0,005 $ pro Anzeige mit Detailseite. Die Beispielsuche mit 426 Stellen und Details kostet damit etwa 2,13 $.
Darf ich die Daten verwenden?
Das hängt von deinem Anwendungsfall ab, besonders bei Angaben zu Kontaktpersonen wie Name, E-Mail oder Telefonnummer. Prüfe das für deinen Fall, bevor du Daten speicherst oder weiterverwendest.
Weiterführende Links
- Jobs.ch Scraper, Actor-Seite: Eingabefelder, Ausgabefelder und Preise im Überblick.
- Jobs.ch Scraper auf Apify: Der Actor mit Dokumentation und allen Parametern.
- Arbeit.Swiss Scraper, Actor-Seite: Stellen von arbeit.swiss, der Schweizer Stellenplattform des Bundes.
- Arbeitsagentur Scraper: Stellenanzeigen exportieren: Das gleiche Vorgehen für arbeitsagentur.de.
- meinestadt.de Scraper: Stellenanzeigen exportieren: Das gleiche Vorgehen für meinestadt.de.
- How to Scrape Every Job Online (Englisch): Stellenanzeigen von 110+ Jobbörsen mit einem Aufruf.