Swiss Jobs Scraper (Job-Room / arbeit.swiss)
Pricing
from $4.90 / 1,000 results
Swiss Jobs Scraper (Job-Room / arbeit.swiss)
Scrape every open job in Switzerland from Job-Room (arbeit.swiss): 80,000+ jobs with recruiter email and phone, salary when stated, GPS and required languages. Search by keyword, occupation or distance around any town, skip staffing agencies, and get alerts on new jobs.
Pricing
from $4.90 / 1,000 results
Rating
0.0
(0)
Developer
Norm Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share

🇨🇭 Swiss Jobs Scraper (Job-Room / arbeit.swiss)
Get every open job on Job-Room, Switzerland's public job platform run by SECO and the regional employment centres (also known as arbeit.swiss, travail.swiss and lavoro.swiss): more than 80,000 jobs from employers, partner job boards and the RAV offices. Each job comes with the full description, the company with its address, phone and email, the recruiter by name with phone and email, how to apply, workload, contract type, the languages required with their level, the occupation in plain words, exact coordinates and, when the ad states it, the salary. No login, no account.
Search by keyword, occupation, job title, company, canton, postal code, or distance around any Swiss town, and filter on what matters to you: remote work, immediate start, no German required, a contact email, a stated salary, or only employers hiring directly (no staffing agencies). Turn on change tracking and schedule it, and each run tells you which jobs are new, changed or closed, with an optional alert to Slack, Discord, Telegram or your own webhook.
🎯 Who uses it?
🧑💼 Recruitment and staffing agencies
Find every company hiring for the roles you place, with the recruiter's name, phone and email, and get told every morning which new jobs appeared.
📣 B2B sales teams
Build lead lists of Swiss companies that are hiring right now, by canton, sector or town, with a direct phone and email.
🌍 Job seekers and relocation services
Find jobs that don't require German or French, jobs with home office, or jobs within 20 km of a town, with the salary when it is stated.
📊 Labour market analysts
Pull the whole Swiss public job market with occupation, workload, contract type, language requirements and coordinates for mapping and trends.
✨ What it does
- Every open job: the whole platform, well past the 10,000 jobs a single search can show.
- Search: keywords in any language, 130 occupation groups, exact Swiss job titles (Pflegefachfrau, Informatiker, infirmier...), company name, cantons, postal codes, and a radius around any town.
- Job conditions: permanent or temporary, workload range, posted in the last day, week or month, immediate start, remote or hybrid, no experience needed.
- Contact and languages: keep only jobs with an email, a phone number, a named contact person or an application link, and drop jobs that ask for German, French or Italian.
- Employers only: leave out jobs that staffing and recruitment agencies post on behalf of other companies, or keep them and see which ones they are.
- Salary: minimum, maximum and period (year, month or hour) whenever the ad states a salary, with the original wording.
- Check jobs you already have: paste job links to get their full details and whether they are still online.
- Change tracking and alerts: new, updated, reposted and closed jobs between scheduled runs, sent to Slack, Discord, Telegram or a webhook.
- Readable data: occupation names in English, German, French or Italian, education, experience, qualification and language levels in words, not codes.
Why this scraper
- Fast: about 1,000 jobs in half a minute.
- Complete: every job on the platform, not only the first 10,000 of a search.
- Salary when stated: parsed into numbers, where other Job-Room scrapers leave it empty.
- Distance search: "within 15 km of Winterthur" in one field.
- Filters built for real needs: no German required, remote, immediate start, must have a contact email, no staffing agencies.
- Full description on every job, also for keyword searches.
- No proxy to set up and nothing to configure beyond your search.
How it compares
| Capability | This actor | Other Job-Room scrapers on Apify |
|---|---|---|
| Title, company, location, workload, description, contacts | yes | yes |
| About 1,000 jobs in half a minute | yes | about 250 per minute |
| Works without a paid proxy | yes | residential proxy by default |
| Every job past the 10,000 per search limit | yes | not stated |
| Salary parsed from the ad | yes | always empty |
| Radius around a town | yes | no |
| Occupation groups and exact job titles | yes | no |
| Company, permanent or temporary, immediate start filters | yes | no |
| Remote, no experience, languages not required, must have contact filters | yes | no |
| Tells staffing agency ads apart, and can leave them out | yes | no |
| Occupation names, education, experience and languages in words | yes | no |
| Exact coordinates | yes | no |
| Sort by relevance | yes | no |
| Change tracking with closed jobs and repost detection | yes | no |
| Slack, Discord, Telegram and webhook alerts | yes | no |
| Live status of known jobs | yes | yes |
📦 What data you get
| Entity | Useful fields |
|---|---|
| Job | Title, full description, occupation name and code, contract type, workload min and max, immediate start, start and end date, number of openings, remote or hybrid, status. |
| Salary | Minimum, maximum, period (year, month or hour), currency and the original wording, when the ad states a salary. |
| Requirements | Experience, education level, qualification, languages with spoken and written level, work forms (shift, night, Sunday and holidays, home based). |
| Location | City, postal code, canton, region, commune code, country, latitude and longitude, location notes. |
| Company | Name, whether a staffing agency posted the ad, street, P.O. box, postal code, city, country, phone, email, website. |
| Contacts | Contact person with salutation, phone and email; apply by email, phone, post or link, with application notes. |
| Source | Posted via (employer, partner job board or RAV office), official job number, employer reference, RAV office code, reporting obligation, shown on EURES, description language. |
| Links and dates | Job-Room link, application link, original ad, published, online until, approved, created, updated. |
| Change tracking | Change type, changed fields, repost flag with the original job ID, first seen, previously seen and closed dates. |
Every job has 71 fields, plus the change tracking fields when tracking is on. Every record includes scraped_at (UTC). Rows for a job ID that no longer exists carry an error field; it appears only on those rows. The dataset has four ready views: Jobs, Contacts, Requirements and Changes. Download it as CSV, JSON, Excel or XML.
💡 Use cases
🧑💼 Nursing jobs within 20 km of Bern, with a named contact
{ "occupationGroups": ["222"], "city": "Bern", "radiusKm": "20", "mustHave": ["contactPerson"] }
📣 Every company hiring software developers in Zurich this week, without staffing agencies
{ "occupationGroups": ["251"], "cantons": ["ZH"], "postedWithinDays": "7", "excludeAgencies": true, "maxItems": 500 }
🌍 Jobs in Geneva and Vaud that don't require French, with home office
{ "cantons": ["GE", "VD"], "languagesNotRequired": ["fr"], "remoteOnly": true }
💰 Jobs that state a salary, for pay benchmarks
{ "salaryOnly": true, "maxItems": 1000 }
🔔 A daily watch on new Migros jobs, sent to Slack
{ "company": "Migros", "trackChanges": true, "slackWebhookUrl": "https://hooks.slack.com/services/..." }
📊 The whole Swiss public job market
{ "maxItems": null }
🔎 Check whether known jobs are still online
{ "jobIds": ["https://www.job-room.ch/job-search/b11fd96c-0cca-4960-aeec-4b4814693266"] }
⚙️ How the input is organised
How many jobs sits at the very top. It is 10 (prefilled) so a first run is a quick sample; clear it to get every match. The rest reads like a conversation:
| Section | What it asks |
|---|---|
| 1 · What kind of job? | Job title or keywords, occupations from a list, official Swiss job titles, company. |
| 2 · Where? | A town with a distance around it, whole cantons, or postal codes. |
| 3 · Contract and hours | Permanent or temporary, workload from and up to, start right away. |
| 4 · Only show jobs that... | were published recently, offer home office, state a salary, need no experience, are posted by the employer itself, come with an email, phone, contact person or application link, don't require German, French or Italian. |
| 5 · Results | Order, and the language of occupation names. |
| 6 · Already have job links? | Paste links to get just those jobs; the search sections are then ignored. |
| 7 · Get only new jobs on each run | Change tracking for scheduled runs. |
| 8 · Send me an alert | Slack, Discord, Telegram or a webhook. |
Apify Free plan: every run is limited to a fixed 10 job sample. Upgrade your Apify plan to run your own settings.
❓ FAQ
How fast is it? About 1,000 jobs in half a minute; the whole platform of 80,000+ jobs takes proportionally longer. Rare combinations (for example a stated salary, or no experience needed) have to look through many jobs to find enough matches, so they take a little longer.
How is the salary found? Job-Room has no salary field, so the ad text is read for a stated amount next to a pay word, such as "zwischen CHF 57'700 bis CHF 67'700 pro Jahr" or "mindestens CHF 4'192 pro Monat". Amounts that are not pay, like a travel allowance, are left out. About 2 in 100 ads state a salary; those get minimum, maximum and period.
How does the distance search work? Type any Swiss town in "Town or city" and pick a distance. The town is matched to its location and every job within that distance comes back, across canton borders.
What does "Don't require these languages" do? It drops jobs that ask for the chosen language at intermediate level or above. Jobs that list it only at a basic level, or not at all, stay.
What do the change tracking results mean?
NEW is a job not seen before, UPDATED changed one of its tracked fields (listed in changed_fields), REAPPEARED came back after closing, and EXPIRED rows are jobs from the last run that are no longer online (turn off "Also return closed jobs" to skip them). A new job that matches an expired one from the same company, title and town is flagged as a repost.
What does "posted by the employer itself" mean?
Many jobs are posted by staffing and recruitment agencies on behalf of another company (more than a third in some cantons). They are marked in posted_by_agency, and ticking this box leaves them out, so a lead list only has companies hiring directly.
What if I paste job links and also fill in filters? Pasted links win: you get exactly those jobs, with their full details and whether they are still online, and the search sections are not used. The run log says so. To search, leave "Job links" empty.
Why are some columns empty? Each employer fills in different details. Every job has a title, description, location and coordinates; about a quarter have a named contact with phone and email, and a third list language requirements.
🛡️ Limits & responsible use
This Actor reads only public job ads. It never signs in and never contacts employers.
Recruiter names, phones and emails are published by the employers on their own ads for applicants. Use them for relevant recruitment and business purposes, and respect Swiss and EU privacy and anti-spam rules when you reach out.
📧 Contact
Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com
Local development
bun installbun testbun run typecheckbun run test:matrixbun run test:fieldsbun run src/main.ts