Arbeit.Swiss Scraper - Swiss Government Job Portal avatar
Arbeit.Swiss Scraper - Swiss Government Job Portal
Under maintenance

Pricing

from $3.00 / 1,000 results

Go to Apify Store
Arbeit.Swiss Scraper - Swiss Government Job Portal

Arbeit.Swiss Scraper - Swiss Government Job Portal

Under maintenance

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

Alessandro Santamaria

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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:

ModeInputOutputUse Case
SEARCHkeywords, cantonCodes, etc.Job data from search resultsStandard job collection by criteria
SEARCH + DETAILSSame as SEARCH modeSame as SEARCH (API provides full data)Same as SEARCH (no separate detail scraping needed)
DIRECT URLsdirectUrls: [...]Full job data + job_statusStill-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:

  1. Run locally using apify run from your machine
  2. Self-hosted - Deploy on your own server with a residential IP
  3. 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 JobListing schema format
  • Rate-limited - Respectful 4-second delays between API requests
  • Proxy support - Optional proxy configuration for different network setups

Input

FieldTypeDescriptionDefault
directUrlsstring[]Direct job URLs to scrape (skips search mode). Example: https://www.job-room.ch/job-search/job123[]
keywordsstring[]Job titles, skills, or keywords to search for[] (all jobs)
cantonCodesstring[]Swiss canton codes (e.g., ["ZH", "BE", "SG"])[] (all cantons)
workloadMinintegerMinimum workload percentage (Pensum)10
workloadMaxintegerMaximum workload percentage (Pensum)100
onlineSinceDaysintegerOnly include jobs posted within this many days60
maxResultsintegerMaximum number of job listings to scrape1000
proxyConfigurationobjectApify proxy settingsResidential

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, or unknown
  • 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; null in 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 publicContact when available
  • Remote option: Determined from workForms array (HOME_WORK, REMOTE_WORK, FLEXIBLE_WORK)

Usage

For best results, run this actor locally from your machine:

# Clone and install
git clone https://github.com/santamaria/apify-scrapers
cd actors/jobs/arbeit-swiss
npm install
# Create input file
echo '{"keywords": ["Pflege"], "maxResults": 100}' > storage/key_value_stores/default/INPUT.json
# Run the actor
apify 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.

  1. Go to the actor page
  2. Configure input parameters
  3. Click "Start"
  4. 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 online
const 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

CodeCantonCodeCanton
AGAargauNWNidwalden
AIAppenzell I.OWObwalden
ARAppenzell A.SGSt. Gallen
BEBernSHSchaffhausen
BLBasel-LandSOSolothurn
BSBasel-StadtSZSchwyz
FRFribourgTGThurgau
GEGenèveTITicino
GLGlarusURUri
GRGraubündenVDVaud
JUJuraVSValais
LULuzernZGZug
NENeuchâtelZHZü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

  1. API Search: Calls the Job-Room search API with your criteria (keywords, cantons, workload)
  2. Pagination: Automatically fetches all pages (up to maxResults)
  3. Data Mapping: Maps Swiss-specific fields (canton, workload, remote options)
  4. Deduplication: Removes duplicate jobs across multiple keyword searches
  5. Validation: Validates each job against the JobListing schema

Direct URL Mode

  1. ID Extraction: Extracts job IDs from provided URLs
  2. API Fetch: Calls the Job-Room detail API for each job ID
  3. Status Detection: Determines if job is online, offline, expired, or unknown
  4. Data Mapping: Maps API response to JobListing schema with status
  5. 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)

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