arbeit.swiss Jobs Scraper: Swiss Federal Job-Room avatar

arbeit.swiss Jobs Scraper: Swiss Federal Job-Room

Pricing

from $3.00 / 1,000 results

Go to Apify Store
arbeit.swiss Jobs Scraper: Swiss Federal Job-Room

arbeit.swiss Jobs Scraper: Swiss Federal Job-Room

Scrape jobs from the Swiss federal job portal (arbeit.swiss, travail.swiss, lavoro.swiss, work.swiss, Job-Room). All cantons; filter by canton, workload % and date. Employer, location, contract type and description.

Pricing

from $3.00 / 1,000 results

Rating

5.0

(1)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

4

Bookmarked

75

Total users

18

Monthly active users

5 days ago

Last modified

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:

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 JobListing schema format with search_query tracking
  • 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-scraper to 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

FieldTypeDescriptionDefault
directUrlsstring[]Job URLs (job-room.ch, arbeit.swiss, travail.swiss, lavoro.swiss, work.swiss) or bare job ids (UUIDs), fetched via the detail API, one row per job. Duplicates removed, unparsable URLs skipped, not-found or expired jobs skipped without charge. Without searchQueries no search runs; with it, the listed jobs come first and the search shares maxResults and the duplicate check.[]
searchQueriesstring[]One or more search keywords. Each runs as a separate search, deduplicated.[]
keywordsstring[]Legacy: search keywords (use searchQueries instead)[]
cantonCodesstring[]Swiss canton codes (e.g., ["ZH", "BE", "SG"])[] (all cantons)
sortBystringSort order: newest (date_desc), oldest (date_asc), or "" for platform default. Note: arbeit.swiss has no relevance sort -- only date-based options exist."newest"
workloadMinintegerMinimum workload percentage (Pensum)10
workloadMaxintegerMaximum workload percentage (Pensum)100
onlineSinceDaysintegerOnly include jobs posted within this many days60
maxResultsPerQueryintegerMax results per search keyword100
maxResultsintegerTotal cap across all queries. 0 = unlimited.0
titleFilterstringComma-separated title terms (case-insensitive OR substring), applied before detail fetch and charge. Example: Laborant, Chemiker, QC"" (no filter)
statsModestringPer-query statistics output: off, include, onlyoff

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.

ModeDataset outputCost
off (default)Jobs only, no stats items — unchanged behaviourStandard per-result pricing
includeJobs + one type: "stats" item per query + one type: "run_summary"Standard per-result pricing (stats items are free)
onlyStats + run_summary only, no jobs, no detail fetchesOne 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.

{
"searchQueries": ["Pflege", "IT", "Buchhaltung"],
"cantonCodes": ["ZH", "BE"],
"maxResultsPerQuery": 50,
"sortBy": "newest"
}
{
"searchQueries": ["Software Engineer"],
"cantonCodes": ["ZH"],
"maxResultsPerQuery": 200
}

Example: Direct URLs (re-scrape or still-alive checks)

{
"directUrls": [
"https://www.job-room.ch/job-search/50431565-628c-40a4-bf79-8fcba7973b5c",
"11111111-2222-3333-4444-555555555555"
]
}

Each listed job is returned as a full row (same fields as search rows, including the full description). A job that no longer exists is skipped with a warning and is not charged.

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,
"contract_type": "temporary",
"start_date": "2026-12-01",
"start_date_text": "per 1. Dezember 2026",
"starts_immediately": false,
"end_date": "2027-06-15",
"work_forms": ["sunday and holiday work"],
"description_snippet": "Wir suchen eine engagierte Pflegefachperson...",
"description_full": "...",
"requirements": ["Abgeschlossene Ausbildung als Pflegefachperson HF/FH", "Bereitschaft zu Schicht- und Wochenenddiensten"],
"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",
"contact_emails": ["jobs@usz.ch"],
"contact_phones": ["+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"
}

Employment terms

FieldTypeDescription
contract_typestring or nullpermanent (Unbefristet) or temporary (Befristet, or a short employment). null when the ad does not say.
start_datestring or nullFixed start date as ISO date (2026-12-01). null when the start is by arrangement ("Nach Vereinbarung") or immediate.
start_date_textstring or nullStart date as written in the ad (Ab sofort, per 1. Januar 2027). null when the ad names none. A full date in the text also fills start_date when the structured field is empty.
starts_immediatelyboolean or nulltrue when the ad starts immediately (ab sofort).
end_datestring or nullEnd date of a fixed-term job as ISO date.
work_formsstring[]Special work forms: night work, shift work, sunday and holiday work, home work. Empty array when none.

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 - Items of the profile section of the ad text ("Ihr Profil", "Votre profil", "Il vostro profilo"); empty array when the ad has no such list
  • Contact fields - The contact person, email and phone come from the structured contact and application fields first. When those are empty, the actor reads the person, phone numbers and email addresses written in the ad text; the employer's company phone and email come last. contact_emails and contact_phones list every address and number found. Agency ads often carry a phone number but no email
  • Data protection - You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.

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

CodeCantonCodeCanton
AGAargauNWNidwalden
AIAppenzell I.OWObwalden
ARAppenzell A.SGSt. Gallen
BEBernSHSchaffhausen
BLBasel-LandSOSolothurn
BSBasel-StadtSZSchwyz
FRFribourgTGThurgau
GEGeneveTITicino
GLGlarusURUri
GRGraubundenVDVaud
JUJuraVSValais
LULuzernZGZug
NENeuchatelZHZurich

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)

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.

Working across the Swiss job market? These complement the SECO Job-Room platform (arbeit.swiss / travail.swiss / lavoro.swiss / work.swiss):

Switzerland

Germany

Global

Enrich your job data


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