arbeit.swiss Scraper: Stellenanzeigen als CSV exportieren
Du suchst Stellen aus dem Job-Room des SECO (arbeit.swiss) und willst sie in Excel oder in eine eigene Auswertung bekommen? Der Arbeit.Swiss Scraper holt die Stellen zu deinen Stichwörtern und Kantonen 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
- Alle Felder
- Beispiel: Logistik im Kanton Bern
- Beispiel: Elektroinstallateure im Kanton Bern
- Schritt 1: Apify-Konto anlegen
- Schritt 2: Stichwort und Kanton eintragen
- Schritt 3: Actor starten
- Schritt 4: Daten exportieren
- Prompt für Claude
- Welche Filter es gibt
- API und Zeitplan
- Kosten
- Anwendungen
- FAQ
Das bekommst du
Das Job-Room des SECO bietet keinen Export für Stellen. Dort melden Arbeitgeber und RAV offene Stellen, auch solche, die auf privaten Jobbörsen fehlen können. Dieselben Daten laufen unter vier Adressen: arbeit.swiss (Deutsch), travail.swiss (Französisch), lavoro.swiss (Italienisch) und work.swiss (Englisch). Der Actor holt sie in einem Lauf und legt sie als Tabelle ab, die du als CSV, Excel oder JSON herunterladen kannst.
Der Actor liest nur öffentlich sichtbare Anzeigen. Du brauchst kein Konto bei Job-Room und keinen API-Schlüssel.
Alle Felder im Überblick
So sind die Felder laut Ausgabe-Schema des Actors aufgebaut. Ohne includeJobDetails fehlt der volle Anzeigentext, du bekommst dann nur den kurzen Auszug.
| Feld | Typ | Inhalt |
|---|---|---|
id | Text | Eindeutige ID der Stelle bei Job-Room (UUID) |
title | Text | Titel der Stelle |
company | Text | Arbeitgeber, bei Personalvermittlern der Name des Vermittlers |
location / city / postal_code | Text | Arbeitsort als „Ort, Kanton“, Ort und Postleitzahl des Arbeitsorts (nicht des Firmensitzes) |
canton / country | Text | Kanton als Kürzel (zum Beispiel BE) und Land (CH) |
job_status | Text | online, offline, expired oder unknown |
employment_type | Text | Beschäftigungsart, im Beispiel full-time oder part-time |
workload_min / workload_max | Zahl | Pensum in Prozent |
contract_type | Text | permanent (unbefristet) oder temporary (befristet) |
start_date / starts_immediately / end_date | Datum / Boolean | Eintrittsdatum, „ab sofort“ und Ende bei befristeten Stellen |
work_forms | Liste | Besondere Arbeitsformen wie Schicht-, Nacht- oder Sonntagsarbeit |
description_snippet | Text | Kurzer Auszug aus der Beschreibung |
description_full / description_md | Text | Voller Anzeigentext als Klartext und als Markdown (mit Details) |
posted_at / expires_at | Datum | Veröffentlichung und Ablauf der Anzeige (auf den Tag genau) |
source_url / source_platform | Text | Link zur Stelle auf job-room.ch und Plattform (arbeit.swiss) |
apply_url / apply_email | Text | Bewerbungslink und, falls angegeben, Bewerbungs-E-Mail |
company_url | Text | Website oder Profil des Arbeitgebers, falls vorhanden |
contact_salutation, contact_firstname, contact_lastname, contact_email, contact_phone | Text | Ansprechperson, falls die Anzeige eine nennt |
salary_min / salary_max / salary_currency / salary_period | Zahl / Text | Lohn, soweit angegeben. Job-Room veröffentlicht in der Regel keine Löhne |
remote_option / requirements | Text / Liste | Im Schema vorhanden, bei Job-Room aber nicht strukturiert geführt. Im Beispiellauf leer |
search_query / scraped_at | Text | Das Stichwort, das die Stelle gefunden hat, und Zeitpunkt des Abrufs |
Beispiel: Logistik im Kanton Bern
Wir haben den Actor einmal lokal laufen lassen (21.10.2026): Stichwort „Logistik“, Kanton Bern, neueste zuerst, höchstens 30 Stellen, mit vollem Anzeigentext. Das war der Input:
{
"searchQueries": ["Logistik"],
"cantonCodes": ["BE"],
"sortBy": "newest",
"maxResults": 30,
"includeJobDetails": true
}Der Lauf lieferte 30 Stellen und war nach wenigen Sekunden fertig (lokal gemessen, Zeiten auf Apify können abweichen). Job-Room meldete für diese Suche 345 Treffer in den letzten 60 Tagen. Der Lauf endete also an unserem Limit maxResults und nicht, weil es keine weiteren Stellen gab. Drei Ergebnisse, gekürzt und ohne Ansprechpersonen:
[
{
"id": "409c48a9-7faa-48d1-b61c-7cb66591158c",
"title": "Betriebsangestellte:r",
"company": "Jungfraubahnen Management AG",
"location": "Eigergletscher, BE",
"postal_code": "3823",
"canton": "BE",
"job_status": "online",
"employment_type": "full-time",
"workload_min": 100,
"workload_max": 100,
"contract_type": "permanent",
"starts_immediately": false,
"posted_at": "2026-10-21T00:00:00.000Z",
"expires_at": "2026-11-20T00:00:00.000Z",
"source_url": "https://www.job-room.ch/job-search/409c48a9-7faa-48d1-b61c-7cb66591158c",
"source_platform": "arbeit.swiss",
"search_query": "Logistik"
},
{
"id": "38dcda54-688f-4336-aaf9-3f78ed9731c9",
"title": "Teamleitung SAP Services / Business Analyst Order-to-Cash (OTC) 80-100% (m/w/d)",
"company": "Sanitas Troesch AG",
"location": "Bern, BE",
"postal_code": "3018",
"canton": "BE",
"employment_type": "full-time",
"workload_min": 100,
"contract_type": "permanent",
"posted_at": "2026-10-21T00:00:00.000Z",
"search_query": "Logistik"
},
{
"id": "7d3a3ce7-2a00-4f90-ac8d-17445bf115d9",
"title": "Fachspezialist/-in Administration",
"company": "Institut für Virologie und Immunologie IVI",
"location": "Mittelhäusern, BE",
"canton": "BE",
"employment_type": "full-time",
"workload_min": 100,
"contract_type": "permanent",
"posted_at": "2026-10-21T00:00:00.000Z",
"search_query": "Logistik"
}
]So viele der 30 Stellen hatten ein Feld gefüllt:
- Immer (30 von 30): Titel, Arbeitgeber, Ort, Postleitzahl, Kanton, Pensum, Vertragsart, Veröffentlichungs- und Ablaufdatum, Link, Anzeigentext (Klartext und Markdown).
- Bewerbungslink: 29 von 30. Er führt meist zur Anzeige auf einer anderen Jobbörse, zum Beispiel jobs.ch oder jobscout24.ch.
- Bewerbungs-E-Mail und Ansprechperson: 1 von 30.
- Nie gefüllt: Lohn, Firmenwebsite, Eintrittsdatum, Homeoffice-Angabe, Anforderungen.
titleFilter (siehe unten).posted_at enthält nur das Datum, die Uhrzeit ist immer 00:00. Auch die Stellen der Auswahl oben stammen alle vom 20. oder 21. Oktober.Beispiel: Elektroinstallateure im Kanton Bern
Dieses Beispiel steckt hinter unserem Short zu Elektro-Stellen im Kanton Bern. Lokaler Lauf am 21.10.2026: Stichwort „Elektroinstallateur“, Kanton Bern, Stellen der letzten 30 Tage, neueste zuerst, mit vollem Anzeigentext:
{
"keywords": [
"Elektroinstallateur"
],
"cantonCodes": [
"BE"
],
"sortBy": "newest",
"onlineSinceDays": 30,
"maxResultsPerQuery": 300,
"includeJobDetails": true
}- 253 Stellen von 72 Firmen, veröffentlicht zwischen dem 21.09. und dem 21.10.2026.
- Wir haben Personalvermittler mit einer Namensliste aussortiert (119 Zeilen) und nur Titel mit Elektr, Automatik, Monteur oder Install behalten: 109 Stellen. Ohne 20 Lehrstellen bleiben 89 Stellen von 39 Arbeitgebern.
- 22 davon sind auch in Teilzeit ausgeschrieben.
Mit Claude: Verbinde den Apify MCP Server als eigenen Konnektor mit dieser URL (siehe Apifys MCP-Dokumentation). Sie beschränkt Claude auf diesen einen Actor:
https://mcp.apify.com?tools=santamaria-automations/arbeit-swiss-scraperDann fügst du diesen Prompt ein. Claude nennt dir zuerst die Kosten und wartet auf dein OK:
Nutze den Apify MCP Server. Starte den Actor santamaria-automations/arbeit-swiss-scraper mit
keywords ["Elektroinstallateur"], cantonCodes ["BE"], sortBy "newest", onlineSinceDays 30, maxResultsPerQuery 300, includeJobDetails true.
Sag mir vor dem Start, was der Lauf kostet, und warte auf mein OK.
Behalte danach nur Titel mit Elektr, Automatik, Monteur oder Install, ohne Lehrstellen, und markiere Arbeitgeber, die nach Personalvermittlung aussehen.
Gib mir eine Tabelle mit Arbeitgeber, Anzahl Stellen, Ort und Pensum (workload_min bis workload_max), sortiert nach Anzahl absteigend.Apify-Konto anlegen
- Öffne die Seite des arbeit.swiss-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.
Stichwort und Kanton eintragen
Im Feld searchQueries trägst du ein oder mehrere Stichwörter ein. Jedes Stichwort läuft als eigene Suche, doppelte Stellen werden über alle Stichwörter hinweg entfernt. Den Kanton gibst du bei cantonCodes als Kürzel an, zum Beispiel ["BE"] oder ["ZH", "SG"]. Leer heisst ganze Schweiz.
sortBy:newestsortiert nach Datum, neueste zuerst (Standard).oldestdreht die Reihenfolge um. Eine Sortierung nach Relevanz gibt es bei Job-Room nicht.maxResultsPerQuery: Obergrenze pro Stichwort (Standard 100, 0 heisst unbegrenzt).maxResults: Obergrenze über alle Stichwörter zusammen (0 heisst unbegrenzt).includeJobDetails:trueholt zusätzlich den vollen Anzeigentext (Standard).
maxResults auf 10 bis 30. So siehst du schnell, ob die Treffer zu deinem Stichwort passen, und zahlst nur wenige Rappen.postedWithinDays wählst du einen kürzeren Zeitraum.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 Stichwörter und Kantone in einem Lauf sehen so aus:
{
"searchQueries": ["Pflege", "Lagerist", "Buchhaltung"],
"cantonCodes": ["ZH", "BE"],
"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,location,workload_min,posted_atundsource_url.
Prompt für Claude zum Kopieren
Füge in Claude den Apify MCP Server als eigenen Konnektor mit dieser URL hinzu (siehe Apifys MCP-Dokumentation). Die URL beschränkt Claude auf diesen einen Actor:
https://mcp.apify.com?tools=santamaria-automations/arbeit-swiss-scraperDann fügst du diesen Prompt ein und ersetzt Stichwort und Kanton durch deine. Claude nennt dir zuerst die Kosten und wartet auf dein OK, bevor der Lauf startet:
Nutze den Apify MCP Server. Starte den Actor santamaria-automations/arbeit-swiss-scraper mit dem Stichwort
"Logistik", dem Kanton BE, sortBy newest und höchstens 30 Ergebnissen.
Sag mir vor dem Start, was der Lauf kostet, und warte auf mein OK.
Wenn er fertig ist, gib mir eine Tabelle mit Titel, Arbeitgeber, Ort, Pensum und Datum, die neuesten zuerst.Getestet haben wir den Actor und die Eingaben, nicht die Prompts über MCP; Claude formuliert die Kostenangabe eventuell anders.
Welche Filter es gibt
Der Actor filtert bei der Suche nach diesen Angaben:
- Stichwort (
searchQueries) und Kanton (cantonCodes, mehrere möglich). - Pensum (
workloadMinundworkloadMax, in Prozent, Standard 10 bis 100). - Alter der Anzeige (
postedWithinDays): 1 steht für 24 Stunden, 7 für eine Woche. Der Filter läuft bei Job-Room, du zahlst nur für die Treffer. Die ältere EinstellungonlineSinceDayshat den Standard 60. - Titel (
titleFilter): Liste von Begriffen, durch Komma getrennt, zum BeispielLaborant, Chemiker, QC. Nur Stellen mit einem dieser Begriffe im Titel kommen ins Ergebnis. Der Filter greift vor dem Abruf der Details, weggefilterte Stellen kosten also nichts. - Sortierung (
sortBy): neueste oder älteste zuerst. - Mengen:
maxResultsPerQueryundmaxResults.
Einen Filter für Branche, Lohn oder Vertragsart gibt es nicht. Das erledigst du danach in der Tabelle, etwa mit contract_type und employment_type.
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~arbeit-swiss-scraper/run-sync-get-dataset-items?token=DEIN_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries": ["Logistik"], "cantonCodes": ["BE"], "sortBy": "newest", "maxResults": 50}'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 postedWithinDays auf 1 für tägliche Läufe und vergleiche die Ergebnisse mit dem letzten Abruf (Feld id), damit du nur neue Stellen weiterverarbeitest.
Was das kostet
Der Actor rechnet pro Ergebnis ab (Preise laut Apify-Store, Free-Plan, Stand 21.10.2026):
- Start: 0,00005 $ pro Lauf.
- Stelle im Ergebnis: 0,003 $ pro Stelle.
Jede Stelle wird nur einmal berechnet, nämlich beim Speichern im Ergebnis. Der volle Anzeigentext (includeJobDetails) kostet nichts extra. Rechenbeispiel: 30 Stellen = 0,00005 $ + 30 x 0,003 $ = 0,09005 $, also etwa 0,09 $. Alle 345 Treffer des Beispiels (Logistik, Kanton Bern, 60 Tage) würden etwa 1,04 $ kosten. Die aktuellen Preise findest du immer auf der Apify-Seite des Actors.
Wofür Leute die Daten nutzen
Stellenmarkt nach Kanton beobachten
Lass regelmässig die neuesten Stellen für einen Beruf und einen Kanton laufen und zähle, wie viele pro Woche dazukommen oder welche Arbeitgeber am häufigsten suchen.
Eigene Jobliste oder Stellenportal füttern
Über source_url verlinkst du auf die Originalanzeige. Mit expires_at und job_status entfernst du abgelaufene Anzeigen aus deiner Liste.
Arbeitgeber finden
Die Spalte company zeigt, wer in deiner Region gerade einstellt. Beachte, dass dort auch Personalvermittler stehen können.
Pensum und befristete Stellen auswerten
Mit workload_min, workload_max und contract_type siehst du, wie viele Stellen Teilzeit oder befristet sind.
Häufige Fragen
Brauche ich Programmierkenntnisse für den arbeit.swiss-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.
Ist arbeit.swiss dasselbe wie das Job-Room des SECO?
Ja. arbeit.swiss, travail.swiss, lavoro.swiss und work.swiss sind die vier Sprachversionen des Job-Room des SECO (job-room.ch). Der Actor liest die gemeinsame Datenbasis. Du bekommst die Stellen also unabhängig von der Sprache der Seite.
Bekomme ich Gehaltsangaben?
In der Regel nicht. Die Felder salary_min, salary_max, salary_currency und salary_period sind im Schema vorhanden, aber Job-Room veröffentlicht keine Löhne. Im Beispiellauf war keines der 30 Gehaltsfelder gefüllt.
Wie viele Stellen bekomme ich pro Suche?
Standardmässig höchstens 100 pro Suchbegriff (maxResultsPerQuery). Setze den Wert auf 0 und maxResults auf 0, wenn du alle Treffer willst. Die Suche holt dann Seite für Seite je 100 Stellen. Zum Vergleich: Im Beispiel meldete Job-Room 345 Treffer für Logistik im Kanton Bern.
Wie bekomme ich nur neue Stellen?
Setze postedWithinDays auf 1 für die letzten 24 Stunden oder auf 7 für die letzte Woche. Der Filter läuft auf Seiten von Job-Room. Ohne ihn gilt der Standard von 60 Tagen. Bei regelmässigen Läufen vergleichst du zusätzlich das Feld id mit deinem letzten Abruf.
Was kostet der arbeit.swiss-Scraper?
0,003 $ pro Stelle, dazu 0,00005 $ für den Start. Die Detailseite ist im Preis enthalten. 30 Stellen mit vollem Text kosten damit etwa 0,09 $.
Darf ich die Daten verwenden?
Das hängt von deinem Anwendungsfall ab, besonders bei Kontaktangaben von Personen. Einzelne Anzeigen nennen eine Ansprechperson mit E-Mail oder Telefon. Prüfe die Regeln des Datenschutzes (in der Schweiz das DSG, bei EU-Bezug die DSGVO), bevor du solche Daten speicherst oder weiterverwendest.
Weiterführende Links
- Arbeit.Swiss Scraper, Actor-Seite: Eingabefelder, Ausgabefelder und Preise im Überblick.
- Arbeit.Swiss Scraper auf Apify: Der Actor mit Dokumentation und allen Parametern.
- meinestadt.de Scraper: Stellenanzeigen exportieren: Das gleiche Vorgehen für meinestadt.de.
- StepStone Scraper: Stellenanzeigen exportieren: Das gleiche Vorgehen für StepStone.
- How to Scrape Every Job Online (Englisch): Stellenanzeigen von 110+ Jobbörsen mit einem Aufruf.