Job-Room.ch Scraper - Swiss Federal Jobs
Pricing
from $3.00 / 1,000 results
Job-Room.ch Scraper - Swiss Federal Jobs
Scrape SECO federal jobs from arbeit.swiss (DE), travail.swiss (FR), lavoro.swiss (IT), work.swiss (EN) - Job-Room.ch platform. All Swiss cantons. Filter by canton, workload %, posting date. Returns employer, location, contract type, deadline, description.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
4
Bookmarked
62
Total users
17
Monthly active users
1.8 hours
Issues response
13 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 fur Wirtschaft).
Features
- Multi-query support - Run multiple search keywords in a single actor run, deduplicated across queries
- Per-query limits - Control how many results each keyword returns independently
- 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
- Sort order - Sort by date (newest/oldest first) or default
- Standardized output - Returns data in the
JobListingschema format withsearch_querytracking - Proxy support - Optional proxy configuration for different network setups
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client — Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Apify MCP server URL:
https://mcp.apify.com?tools=santamaria-automations/arbeit-swiss-scraper
Example prompt once connected:
"Use
arbeit-swiss-scraperto scrape job listings from arbeit swiss. Return results as a table."
Clients that support dynamic tool discovery (Claude.ai, VS Code) will receive the full input schema automatically via add-actor.
Input
| Field | Type | Description | Default |
|---|---|---|---|
directUrls | string[] | Direct job URLs to scrape (skips search mode) | [] |
searchQueries | string[] | One or more search keywords. Each runs as a separate search, deduplicated. | [] |
keywords | string[] | Legacy: search keywords (use searchQueries instead) | [] |
cantonCodes | string[] | Swiss canton codes (e.g., ["ZH", "BE", "SG"]) | [] (all cantons) |
sortBy | string | Sort order: date_desc, date_asc, or empty for default | "" |
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 |
maxResultsPerQuery | integer | Max results per search keyword | 100 |
maxResults | integer | Total cap across all queries. 0 = unlimited. | 0 |
statsMode | string | Per-query statistics output: off, include, only | off |
proxyConfiguration | object | Apify proxy settings | Residential CH |
Statistics output (optional)
Set statsMode to get per-query statistics alongside or instead of job data — useful for workflow control (resume state, "was it worth a full scrape?") and cheap labour-market snapshots.
| Mode | Dataset output | Cost |
|---|---|---|
off (default) | Jobs only, no stats items — unchanged behaviour | Standard per-result pricing |
include | Jobs + one type: "stats" item per query + one type: "run_summary" | Standard per-result pricing (stats items are free) |
only | Stats + run_summary only, no jobs, no detail fetches | One page fetch per query, no per-result charges |
Each stats item carries the platform-reported total (from arbeit.swiss's X-Total-Count header — same value the job-room.ch UI shows), page count, how far the scrape got, why it stopped, and — if it stopped early — the exact URL/page/offset to resume from. A STATS record is always written to the key-value store so workflows can read resume state without parsing a mixed dataset.
Field-level contract (schema version, stopReason enum, resume shape) is stable across type: "stats" items — see docs/JOBSTATS_SPEC.md in the source repo.
Example: Multi-Query Search
{"searchQueries": ["Pflege", "IT", "Buchhaltung"],"cantonCodes": ["ZH", "BE"],"maxResultsPerQuery": 50,"sortBy": "date_desc"}
Example: Single Search
{"searchQueries": ["Software Engineer"],"cantonCodes": ["ZH"],"maxResultsPerQuery": 200}
Example: Direct URLs (Still Alive Checks)
{"directUrls": ["https://www.job-room.ch/job-search/abc123-def456","https://www.job-room.ch/job-search/xyz789-uvw012"]}
Output
Each job listing follows the standardized JobListing schema:
{"id": "abc123-def456","title": "Dipl. Pflegefachperson HF/FH","company": "Universitatsspital Zurich","location": "Zurich, ZH","canton": "ZH","job_status": null,"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": "Mueller","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","search_query": "Pflege","scraped_at": "2024-01-16T12:00:00.000Z"}
Field Notes
search_query- The search keyword that found this job (null for direct URL mode)job_status- Only populated in Direct URL mode; null in search mode- Salary fields - Not available in arbeit.swiss API; always null
requirements- Not easily extractable from API; empty array
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: Use residential proxy (configured by default).
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 | Geneve | TI | Ticino |
| GL | Glarus | UR | Uri |
| GR | Graubunden | VD | Vaud |
| JU | Jura | VS | Valais |
| LU | Luzern | ZG | Zug |
| NE | Neuchatel | ZH | Zurich |
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 with exponential backoff
Data Source
- Website: arbeit.swiss
- Search API:
POST https://www.job-room.ch/jobadservice/api/jobAdvertisements/_search - Operator: SECO (Staatssekretariat fur 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.
Related Actors
Looking for more job data? Check out our other scrapers:
Switzerland
Germany
Global
Enrich your job data
- Website Job Extractor -- Extract jobs directly from company career pages
- Website Contact Extractor -- Get emails and phone numbers from company websites
- Website Email & Phone Scraper -- Fast email and phone extraction (no AI needed)
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@nanoscrape.com