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
5.0
(1)
Developer
NanoScrape
Maintained by CommunityActor stats
4
Bookmarked
70
Total users
17
Monthly active users
1.8 hours
Issues response
2 days ago
Last modified
Categories
Share
Arbeit.swiss / Travail.swiss / Lavoro.swiss / Work.swiss Job Scraper
Scrapes job listings from the SECO Job-Room.ch federal employment platform, Switzerland's official multilingual government job portal operated by RAV/SECO (Staatssekretariat fur Wirtschaft / Secretariat d'Etat a l'economie / Segreteria di Stato dell'economia). The same platform is served under four language-branded domains:
- arbeit.swiss (German / Deutsch)
- travail.swiss (French / Francais)
- lavoro.swiss (Italian / Italiano)
- work.swiss (English)
All four surfaces expose the same underlying Job-Room API, so this single actor covers every canton and every Swiss national language. DE-, FR-, IT-, and EN-speaking users all get the same normalized JobListing output.
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 - Built-in proxy handling - Swiss residential access is managed for you, no setup needed
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 the Swiss federal Job-Room platform (arbeit.swiss / travail.swiss / lavoro.swiss / work.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: newest (date_desc), oldest (date_asc), or "" for platform default. Note: arbeit.swiss has no relevance sort -- only date-based options exist. | "newest" |
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 |
titleFilter | string | Comma-separated title terms (case-insensitive OR substring), applied before detail fetch and charge. Example: Laborant, Chemiker, QC | "" (no filter) |
statsMode | string | Per-query statistics output: off, include, only | off |
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": "newest"}
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)
The actor uses a Swiss residential proxy automatically; there is nothing to configure.
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
- Websites (same platform, four language surfaces): arbeit.swiss (DE) · travail.swiss (FR) · lavoro.swiss (IT) · work.swiss (EN)
- Underlying platform: Job-Room.ch
- Search API:
POST https://www.job-room.ch/jobadservice/api/jobAdvertisements/_search - Operator: SECO (Staatssekretariat fur Wirtschaft / Secretariat d'Etat a l'economie / Segreteria di Stato dell'economia)
Legal Notice
This actor accesses publicly available job listings through the official API. Please ensure your use case complies with the SECO Job-Room terms of service, available in DE, FR, IT, and EN.
Related Actors
Working across the Swiss job market? These complement the SECO Job-Room platform (arbeit.swiss / travail.swiss / lavoro.swiss / work.swiss):
Switzerland
- Jobs.ch Scraper — Switzerland's #1 private job board (largest inventory) — market-side peer to this government portal.
- SwissDevJobs Scraper — Swiss developer/tech specialist board.
- JobScout24 Scraper — Swiss classifieds job section.
- ICTjobs.ch Scraper — Swiss IT/telecom specialist board.
- Zentraljob.ch Scraper — Central Switzerland regional board.
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