Arbeit.Swiss Scraper - Swiss Government Job Portal
Pricing
from $3.00 / 1,000 results
Arbeit.Swiss Scraper - Swiss Government Job Portal
Scrapes job listings from Arbeit.Swiss (Job-Room.ch), Switzerland's official public employment service. Filter by canton, workload percentage, and posting date. Supports multiple keyword searches. Government and RAV job listings.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer

Alessandro Santamaria
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Arbeit.Swiss Job Scraper
Scrapes job listings from arbeit.swiss, the official Swiss government job portal operated by RAV/SECO (Staatssekretariat für Wirtschaft).
Three Scraping Modes
This scraper supports three distinct modes for different use cases:
| Mode | Input | Output | Use Case |
|---|---|---|---|
| SEARCH | keywords, cantonCodes, etc. | Job data from search results | Standard job collection by criteria |
| SEARCH + DETAILS | Same as SEARCH mode | Same as SEARCH (API provides full data) | Same as SEARCH (no separate detail scraping needed) |
| DIRECT URLs | directUrls: [...] | Full job data + job_status | Still-alive checks, re-scraping specific jobs |
Note: Unlike browser-based scrapers, arbeit.swiss uses an API that provides complete job data in search results, so there's no separate "details" phase needed.
⚠️ Important: Network Requirements
The arbeit.swiss API (job-room.ch) has strict access controls:
- ✅ Works: Residential IPs, corporate networks, VPNs with residential exit
- ❌ Blocked: Cloud/datacenter IPs (including Apify infrastructure)
Recommended usage:
- Run locally using
apify runfrom your machine - Self-hosted - Deploy on your own server with a residential IP
- External proxy - Use a residential proxy service (configure your own proxy URL)
This actor is designed to work best when run from a residential network, not from cloud infrastructure.
Features
- API-based scraping - Uses the official Job-Room API for fast, reliable data extraction
- Three scraping modes - Search mode or direct URL mode for different use cases
- Job status detection - Track if jobs are still online, offline, or expired (direct URL mode)
- Comprehensive job data - Extracts title, company, location, workload, contact details, and more
- Canton filtering - Filter jobs by Swiss canton codes
- Keyword search - Search for specific job titles or skills
- Standardized output - Returns data in the
JobListingschema format - Rate-limited - Respectful 4-second delays between API requests
- Proxy support - Optional proxy configuration for different network setups
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | string[] | Direct job URLs to scrape (skips search mode). Example: https://www.job-room.ch/job-search/job123 | [] |
keywords | string[] | Job titles, skills, or keywords to search for | [] (all jobs) |
cantonCodes | string[] | Swiss canton codes (e.g., ["ZH", "BE", "SG"]) | [] (all cantons) |
workloadMin | integer | Minimum workload percentage (Pensum) | 10 |
workloadMax | integer | Maximum workload percentage (Pensum) | 100 |
onlineSinceDays | integer | Only include jobs posted within this many days | 60 |
maxResults | integer | Maximum number of job listings to scrape | 1000 |
proxyConfiguration | object | Apify proxy settings | Residential |
Mode 1: SEARCH (Standard Job Collection)
Search for jobs by keywords, canton, workload, and date range:
{"keywords": ["Pflege", "Krankenschwester"],"cantonCodes": ["ZH", "BE", "SG"],"workloadMin": 50,"workloadMax": 100,"onlineSinceDays": 30,"maxResults": 500}
Use case: Standard job collection by search criteria.
Mode 2: DIRECT URLs (Still Alive Checks)
When directUrls is provided, the scraper operates in direct mode:
- Skips search phase - Goes directly to provided job IDs via API
- Job status detection - Returns
online,offline,expired, orunknown - Full data extraction - Same as search mode
- Use case - Periodic "still alive" checks, re-scraping specific jobs
{"directUrls": ["https://www.job-room.ch/job-search/abc123-def456","https://www.job-room.ch/job-search/xyz789-uvw012","https://www.job-room.ch/job-search/job-id-here"]}
Use case:
- Still alive checks - Verify if previously scraped jobs are still online
- Re-scraping specific jobs - Update data for specific job URLs
- Post-deduplication enrichment - Fetch details for jobs identified in other sources
Output
Each job listing follows the standardized JobListing schema:
{"id": "abc123-def456","title": "Dipl. Pflegefachperson HF/FH","company": "Universitätsspital Zürich","location": "Zürich, ZH","canton": "ZH","job_status": "online","salary_min": null,"salary_max": null,"salary_currency": "CHF","employment_type": "full-time","workload_min": 80,"workload_max": 100,"remote_option": null,"description_snippet": "Wir suchen eine engagierte Pflegefachperson...","description_full": "...","requirements": [],"posted_at": "2024-01-15T00:00:00.000Z","expires_at": "2024-02-15T00:00:00.000Z","source_url": "https://www.job-room.ch/job-search/abc123-def456","source_platform": "arbeit.swiss","contact_salutation": "Frau","contact_firstname": "Maria","contact_lastname": "Müller","contact_email": "jobs@usz.ch","contact_phone": "+41442551111","apply_url": "https://careers.usz.ch/apply/123","apply_email": "bewerbung@usz.ch","company_url": "https://www.usz.ch","scraped_at": "2024-01-16T12:00:00.000Z"}
Job Status Field
The job_status field indicates job availability (only populated in Direct URL mode):
"online"- Job is currently active and accepting applications"offline"- Job was not found (404) or not publicly displayed"expired"- Job has expired or was archived/cancelled"unknown"- Unable to determine status (API error)null- Not applicable (search mode)
Field Notes
job_status: Only populated in Direct URL mode;nullin search mode- Salary fields: Not available in arbeit.swiss API; always
null requirements: Not easily extractable from API; empty array- Contact fields: Extracted from API's
publicContactwhen available - Remote option: Determined from
workFormsarray (HOME_WORK, REMOTE_WORK, FLEXIBLE_WORK)
Usage
Local Run (Recommended)
For best results, run this actor locally from your machine:
# Clone and installgit clone https://github.com/santamaria/apify-scraperscd actors/jobs/arbeit-swissnpm install# Create input fileecho '{"keywords": ["Pflege"], "maxResults": 100}' > storage/key_value_stores/default/INPUT.json# Run the actorapify run# Results are in storage/datasets/default/
Via Apify Console (Limited)
Note: Running on Apify cloud may be blocked by the arbeit.swiss API. Try local run if cloud execution fails.
- Go to the actor page
- Configure input parameters
- Click "Start"
- Download results from the Dataset tab (JSON, CSV, Excel)
Via API
Search Mode:
curl -X POST "https://api.apify.com/v2/acts/santamaria~arbeit-swiss-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords": ["Informatiker"],"cantonCodes": ["ZH"],"maxResults": 100}'
Direct URL Mode:
curl -X POST "https://api.apify.com/v2/acts/santamaria~arbeit-swiss-scraper/runs" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"directUrls": ["https://www.job-room.ch/job-search/abc123","https://www.job-room.ch/job-search/def456"]}'
Via Apify SDK (Node.js)
Search Mode:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('santamaria/arbeit-swiss-scraper').call({keywords: ['Buchhaltung', 'Finanzen'],cantonCodes: ['ZH', 'ZG'],maxResults: 200,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Found ${items.length} jobs`);
Direct URL Mode (Still Alive Checks):
const run = await client.actor('santamaria/arbeit-swiss-scraper').call({directUrls: ['https://www.job-room.ch/job-search/abc123-def456','https://www.job-room.ch/job-search/xyz789-uvw012',],});const { items } = await client.dataset(run.defaultDatasetId).listItems();// Check which jobs are still onlineconst onlineJobs = items.filter(job => job.job_status === 'online');const offlineJobs = items.filter(job => job.job_status === 'offline');const expiredJobs = items.filter(job => job.job_status === 'expired');console.log(`Online: ${onlineJobs.length}, Offline: ${offlineJobs.length}, Expired: ${expiredJobs.length}`);
Swiss Canton Codes
| Code | Canton | Code | Canton |
|---|---|---|---|
| AG | Aargau | NW | Nidwalden |
| AI | Appenzell I. | OW | Obwalden |
| AR | Appenzell A. | SG | St. Gallen |
| BE | Bern | SH | Schaffhausen |
| BL | Basel-Land | SO | Solothurn |
| BS | Basel-Stadt | SZ | Schwyz |
| FR | Fribourg | TG | Thurgau |
| GE | Genève | TI | Ticino |
| GL | Glarus | UR | Uri |
| GR | Graubünden | VD | Vaud |
| JU | Jura | VS | Valais |
| LU | Luzern | ZG | Zug |
| NE | Neuchâtel | ZH | Zürich |
Performance
- Speed: ~250 jobs/minute (limited by respectful rate limiting)
- Cost: ~0.01-0.05 CU per 1,000 jobs
- Reliability: Built-in retry logic and error handling
- Direct URL mode: ~15 jobs/minute (4-second delay between requests)
How It Works
Search Mode
- API Search: Calls the Job-Room search API with your criteria (keywords, cantons, workload)
- Pagination: Automatically fetches all pages (up to
maxResults) - Data Mapping: Maps Swiss-specific fields (canton, workload, remote options)
- Deduplication: Removes duplicate jobs across multiple keyword searches
- Validation: Validates each job against the JobListing schema
Direct URL Mode
- ID Extraction: Extracts job IDs from provided URLs
- API Fetch: Calls the Job-Room detail API for each job ID
- Status Detection: Determines if job is online, offline, expired, or unknown
- Data Mapping: Maps API response to JobListing schema with status
- Rate Limiting: 4-second delay between requests for respectful scraping
Data Source
This actor scrapes data from the official Swiss government job portal:
- Website: arbeit.swiss
- Search API:
POST https://www.job-room.ch/jobadservice/api/jobAdvertisements/_search - Detail API:
GET https://www.job-room.ch/jobadservice/api/_search/jobAdvertisements/{id} - Operator: SECO (Staatssekretariat für Wirtschaft)
Legal Notice
This actor accesses publicly available job listings through the official API. Please ensure your use case complies with the arbeit.swiss 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