# jobs.ch Scraper: Swiss Jobs & Hiring Report (`precious_bathmat/swiss-job-scraper`) Actor

Scrape Swiss jobs from jobs.ch: title, company, company size, place, region, workload %, permanent or temporary, category, languages, posted date. Plus a hiring report per search across every matching job. No login, no API key.

- **URL**: https://apify.com/precious_bathmat/swiss-job-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## jobs.ch Scraper: Swiss Jobs & Hiring Report

Scrape **Swiss jobs from jobs.ch**, Switzerland's biggest job board, with no login and no API key, and get a **hiring report for every search that counts every matching job**:

- **Every job**: title, company, company size (SME, large company or staffing agency), place, region, map position, **workload (Pensum) range**, contract type, position level, category, languages required, first published and days online, paid listing, preview, link
- **Search any way**: keywords in any language ("data analyst", "Pflegefachfrau", "comptable"), a town, regions, contract types, minimum workload; or no keyword for **all 41,000+ jobs**
- **Past the 2,000-job limit**: jobs.ch returns 2,000 jobs per search; this Actor reads big searches region by region
- **Hiring report over every match**, not only the jobs read: categories, industries, regions, top places, contract types, position levels, company size, **full-time vs part-time only**, **languages required**, top job titles, top companies, newest jobs

### What does this jobs.ch scraper do?

```
jobs.ch · "accountant" · 261 jobs
 82% permanent · 22% via staffing agencies · 76% offer full time
 Languages asked: German 42%, English 33%, French 22%
 Top places: Zürich, Geneva · top company: Fed Group
```

1. Enter **keywords** and, optionally, a **town**, **regions**, **contract types** and a **minimum workload**.
2. You get **one row per job** and **one hiring report per keyword**.

```mermaid
flowchart LR
    A[Keywords, town,<br/>regions, workload] --> C[jobs.ch search]
    C --> D[Jobs<br/>company, place,<br/>workload, contract]
    C --> E[Hiring report<br/>every match: categories,<br/>regions, languages,<br/>company size]
```

### Who is it for?

- **Recruiters and staffing agencies**: who is hiring in Switzerland, where, and how much of a market agencies already cover
- **Job seekers and expats**: which roles need German or French, and where the jobs are
- **HR and employer branding teams**: competitors' hiring volume, workload offers and regions
- **Sales teams**: companies hiring now, with their size, as leads
- **Analysts and journalists**: the Swiss job market by category, industry, region and language

### What data do you get?

**Jobs** (dataset, one row per job)

| Field | What it tells you |
|---|---|
| `id`, `title`, `url`, `preview` | The job |
| `company`, `companySize`, `companyUrl` | Who is hiring: SME, large company or staffing agency |
| `place`, `region`, `latitude`, `longitude` | Where |
| `workloadMin`, `workloadMax` | Workload (Pensum) in %, e.g. 80-100 |
| `contractType`, `position` | Permanent, temporary, freelance, internship, apprenticeship; employee, specialist or management |
| `category`, `categoryGroup`, `languages` | Job category and languages asked for |
| `firstPublishedAt`, `publishedAt`, `daysOnline`, `isPaid` | When it was posted and whether it is a paid listing |

**Report** (`REPORTS`, one per keyword, counting every match)

| Field | What it tells you |
|---|---|
| `totalJobs`, `jobsRead` | Jobs matching the search, and how many were read |
| `byCategory`, `byIndustry`, `byRegion`, `topPlaces` | What and where |
| `byContractType`, `byPosition`, `byCompanySize` | Contracts, seniority, who hires |
| `fullTimeOfferedPercent`, `partTimeOnlyPercent` | Workload |
| `languagesRequired`, `paidListingPercent`, `topJobTitles` | Languages, paid ads, the titles employers use |
| `topCompanies`, `postedLast7Days`, `newestJobs` | From the jobs read |

### Example: 4 October 2026

Six searches, 200 newest jobs each: **1,150 jobs and 6 reports in 37 seconds**.

| Search | Jobs on jobs.ch | Permanent | Via agencies | Full time offered | German / English / French asked |
|---|---|---|---|---|---|
| Pflegefachfrau (nurse) | 2,622 | 70% | 2% | 78% | 34% / 1% / 4% |
| Electrician | 1,305 | 79% | 11% | 99% | 34% / 4% / 4% |
| Software engineer | 898 | 67% | 5% | 95% | 23% / 18% / 2% |
| Project manager | 655 | 62% | 4% | 97% | 20% / 22% / 6% |
| Accountant | 261 | 82% | 22% | 76% | 42% / 33% / 22% |
| Data analyst | 150 | 57% | 3% | 97% | 17% / 16% / 4% |

- **All of jobs.ch**: 41,322 jobs; Zürich leads with 7.8%; 51% at SMEs, 43% at large companies, 6% via staffing agencies. 3,000 jobs were read in 97 seconds, past the 2,000 cap.
- Many ads state no language, so the language shares are the minimum asked for.

### Pricing

**$0.001 per job** and **$0.02 per report**.

- 200 jobs with a report: **$0.22**
- The run above (1,150 jobs, 6 reports): **$1.27**

Turn off reports to pay for jobs only.

### Good to know

- **Report counts cover every job matching the search**, straight from jobs.ch, not only the jobs read.
- **Categories and industries** are what the employer chose on jobs.ch; "Not specified" means the ad has none.
- **No salaries**: jobs.ch search results carry none, so neither does this Actor.
- **Places** in different spellings ("Zürich" and "Zurich", "Genève" and "Geneva") are counted together in the report.
- **Privacy**: recruiters and contact persons are not collected; emails and phone numbers in previews are hidden.
- Data comes from **jobs.ch's public job search**. **Not affiliated with jobs.ch or JobCloud.**

### Input

| Field | Meaning |
|---|---|
| **Keywords** | One search each; empty = all jobs |
| **Location** | A town or city |
| **Regions** | Zurich, Bern, Basel, Geneva, Vaud/Valais, Ticino and more |
| **Contract type** | Permanent, temporary, freelance, internship, apprenticeship, side job |
| **Minimum workload** | 50% to 100% |
| **Sort** | Newest first (default) or most relevant |
| **Jobs per search** | 1 to 20,000 (default 300) |
| **Reports** | On by default |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** for a feed of new Swiss jobs.

# Actor input Schema

## `keywords` (type: `array`):

Job titles or skills, one search each, e.g. "data analyst", "Pflegefachfrau", "software engineer". Empty = all jobs.

## `location` (type: `string`):

Optional town or city, e.g. "Zürich", "Genève", "Basel".

## `regions` (type: `array`):

Optional: only these regions.

## `contractTypes` (type: `array`):

Optional: only these contract types.

## `workloadMin` (type: `string`):

Only jobs offering at least this workload (Pensum).

## `sort` (type: `string`):

Order of the jobs read.

## `maxJobsPerSearch` (type: `integer`):

Most jobs to read per keyword (past 2,000 the search is read region by region).

## `includeReports` (type: `boolean`):

One hiring report per search over every matching job: categories, industries, regions, places, contract types, positions, company size, workload, languages required, top companies, newest jobs.

## Actor input object example

```json
{
  "keywords": [
    "data analyst"
  ],
  "workloadMin": "0",
  "sort": "newest",
  "maxJobsPerSearch": 300,
  "includeReports": true
}
```

# Actor output Schema

## `jobs` (type: `string`):

One row per job: title, company, company size, place, region, workload, contract type, position, category, languages, posted date, link.

## `reports` (type: `string`):

Per search, over every match: categories, industries, regions, places, contract types, company size, workload, languages, top companies.

## `reportsCsv` (type: `string`):

One flat row per search.

## `summary` (type: `string`):

Requests, problems and the limits of the data.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "data analyst"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/swiss-job-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": ["data analyst"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/swiss-job-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "data analyst"
  ]
}' |
apify call precious_bathmat/swiss-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,precious_bathmat/swiss-job-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bULtsw8c9bDFO1SQv/builds/JwfygFuShLyPeyUaO/openapi.json
