# jobs.ch & jobup.ch Scraper — Swiss Job Ads, No Phones (`highbrow_fame/jobs-ch-jobs`) Actor

Swiss job ads from jobs.ch and jobup.ch: title, company, place, workload %, contract type, salary when published, date, snippet and optionally the full ad. Contact persons and phones taken out.

- **URL**: https://apify.com/highbrow_fame/jobs-ch-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 job delivereds

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 & jobup.ch Scraper — Swiss Job Ads, No Phones

Get job ads from jobs.ch, Switzerland's largest job board, and jobup.ch, its French-speaking sister site: title, company, place, postcode and canton, workload %, contract type, position level, publication date, the salary when the ad publishes one, the ad's opening lines, job categories, language skills and benefits — and, if you want, the full ad text, the apply link, the industry and the closing date. Paste your jobs.ch or jobup.ch search links — or just type keywords and places.

**Why this one**

- 🔗 **Your search, as you set it up.** Set every filter you like on jobs.ch or jobup.ch (German, French or English pages) and paste the link. Or type keywords and places here — python, pflege, comptable; Zürich, 8001, Genève — and choose workload, contract type, position, employer type, "posted within" and the order below.
- ⚡ **Fast.** A live test run read four searches — all jobs in Zürich newest first, permanent sales jobs on jobup.ch, 60–80% care jobs of the last 30 days, engineer jobs from recruitment agencies — 4,666 jobs in 88 seconds.
- 📄 **The full ad when you need it.** Tick **Full job ad** for the ad text, the apply link, the industry and the closing date. A live run read 1,282 jobs with their full ads — nursing jobs on jobs.ch and jobup.ch, IT jobs in Bern — in 160 seconds.
- 🔎 **Keyword search or AI search.** jobs.ch shows some visitors a keyword search and others an "AI" search that also finds related jobs, and the link does not say which. Here you choose: keyword search (the default: the jobs whose ad has your word) or AI search.
- 🔒 **No phone numbers, no contact persons.** The recruiter's name, phone and e-mail that jobs.ch keeps with each ad are never read. Lines and sentences of the ad text that name a contact person or carry a phone number or an e-mail address are taken out; the rest of the ad stays. For the workplace you get the town, postcode and canton, not the street-level map point.
- 💸 **You pay only for jobs delivered.** A link that is not a jobs.ch or jobup.ch search, or a place the site does not know, comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `title`, `snippet`, `url`, `jobId`, `site` | the job title, the first lines of the ad, the ad's address, its id, and jobs.ch or jobup.ch |
| `company`, `companyUrl`, `companyId`, `companyHidden` | the employer as the ad names it and its company page; empty when the ad hides the employer (`companyHidden: true`) |
| `companyType`, `isStaffingAgency` | large company, SME or recruitment agency, as the site classes the employer |
| `place`, `city`, `postalCode`, `canton`, `locations`, `regions` | the workplace as the ad writes it; town, postcode and canton of each place the site knows; the site's regions |
| `workload`, `workloadMin`, `workloadMax` | the workload in % ("80–100%") |
| `contractTypes`, `positionLevels` | permanent, temporary, freelance, internship, side-job, apprenticeship; employee, specialist, executive |
| `categories`, `categoryGroups`, `languageSkills`, `benefits` | the site's job fields, the languages asked for with their level, and the benefits the employer ticked |
| `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | the salary range when the ad publishes one (per year, month or hour) |
| `publishedAt`, `postedDate`, `easyApply` | when the ad was published (and its date in Zurich), and whether it takes the site's quick application |
| `input`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Full job ad** also: `description` (the ad text, without contact persons, phone numbers and e-mail addresses), `applyUrl`, `industry`, `expiresOn`.

#### Example

A real record from a live run with the full ad — keyword "informatik", place "Bern", 25 September 2026:

```json
{
  "site": "jobs.ch",
  "jobId": "896d9660-37fd-4c58-919b-4c927ce1f567",
  "title": "IT Service Manager & Product Owner (m/w/d) | 80-100%",
  "company": "yellowshark",
  "companyType": "recruitment agency",
  "isStaffingAgency": true,
  "companyUrl": "https://www.jobs.ch/de/firmen/3f5628a2-2317-4a04-949c-fabc172a30c5-yellowshark/",
  "place": "Hindelbank",
  "city": "Hindelbank",
  "postalCode": "3324",
  "canton": "BE",
  "regions": ["Region of Bern"],
  "workload": "100%",
  "contractTypes": ["permanent"],
  "positionLevels": ["employee"],
  "categories": ["System Administration"],
  "salaryMin": 100000,
  "salaryMax": 115000,
  "salaryCurrency": "CHF",
  "salaryPeriod": "year",
  "publishedAt": "2026-09-10T13:17:19+02:00",
  "postedDate": "2026-09-10",
  "snippet": "Ein etabliertes Unternehmen im Bereich Digitalisierung und IT-Operations sucht eine:n Spezialist:in für ICT Service Management zur Sicherstellung ...",
  "url": "https://www.jobs.ch/de/stellenangebote/detail/896d9660-37fd-4c58-919b-4c927ce1f567/",
  "description": "Ein etabliertes Unternehmen im Bereich Digitalisierung und IT-Operations sucht eine:n Spezialist:in für ICT Service Management zur Sicherstellung zuverlässiger IT-Basisdienste und Koordination externer Partner. Die Position bietet die Möglichkeit, als Product …",
  "applyUrl": "https://tnl2.jometer.com/v2/job?jz=…",
  "industry": "Information technology / Telecom.",
  "expiresOn": "2027-10-01",
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from jobs.ch or jobup.ch, one per line — or type **Keywords** and/or **Places** and choose the filters.
2. Set **Max jobs per search**, choose the **Search type**, and tick **Full job ad** if you need the whole text.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new jobs, save your input as a task with **Posted within (days)** set to 1 and **Sort** set to newest first, and schedule it daily.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. The full ad costs nothing extra, only time. Links that are not jobs.ch or jobup.ch searches and places the site does not know are free.

### FAQ

**How many jobs per search?** As many as the site shows, up to its own limit of 10,000 per search — a live run read 2,000 of the 9,959 jobs in Zürich. Set **Max jobs per search** as high as you need; beyond 10,000, split the search by place or filter.

**Why do so few jobs have a salary?** Most Swiss ads do not publish one: in the live test runs, 225 of 6,484 jobs had a salary. The fields come as the employer entered them — now and then a monthly amount is marked as yearly.

**Why do some jobs have no town or canton?** `place` is the workplace as the ad writes it ("Zürich", "Raum Bern", "Thun, Emmen, Bern"); `city`, `postalCode` and `canton` are filled when the site knows the exact place — in the live test runs 78% of the jobs had a town and 67% a canton. The site matches a place you type as free text and includes the region around a town.

**Keyword search or AI search?** Keyword search gives the jobs whose ad has your word. AI search also brings related jobs. It applies to links too, as a link does not say which one jobs.ch showed you.

**jobs.ch or jobup.ch?** jobup.ch is JobCloud's job board for French-speaking Switzerland, with jobs of its own. Links from both work; for keywords and places, choose the site under **Site**.

**Why no contact persons or phone numbers?** They are personal data. Every job has its `url` and, with the full ad, its `applyUrl`; candidates apply on the site. The employer is named as the ad names it — a few small employers publish under a person's name.

**Is this affiliated with jobs.ch, jobup.ch or JobCloud?** No. This is an independent tool that reads public job ads.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Set up a search on jobs.ch or jobup.ch with all the filters you want and paste the address of the results page. One per line.

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

Or search here without a link: job titles or keywords (python, pflege, comptable). Each keyword is searched in each place below, or in all of Switzerland when there is no place. The filters below apply.

## `locations` (type: `array`):

Towns, postcodes or cantons as the site writes them (Zürich, 8001, Genève, Bern). A place without keywords gives all its jobs.

## `site` (type: `string`):

For the keywords and places above. jobup.ch is JobCloud's French-speaking job board with its own jobs; links say which site they are from.

## `searchMode` (type: `string`):

Keyword search finds the jobs whose ad contains your keyword. AI search, which jobs.ch shows some of its visitors, also finds related jobs ("koch" also brings bakers and kitchen-furniture sales). Applies to links too.

## `workloadMin` (type: `integer`):

Optional, as on the site: a job matches when its workload range reaches into yours (an 80–100% job matches 60–80%).

## `workloadMax` (type: `integer`):

Optional.

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

Optional: only jobs of any of these kinds.

## `positionLevels` (type: `array`):

Optional: only jobs at any of these levels.

## `companyTypes` (type: `array`):

Optional: only jobs from any of these kinds of employer.

## `postedWithinDays` (type: `integer`):

Optional: only jobs published this many days ago or later (1 = yesterday and today). 0: any date. For links, the link's own "published since" filter applies.

## `sortBy` (type: `string`):

For the keywords and places above. Newest first also reads a big search completely: in relevance order the site moves a few equally ranked jobs between pages.

## `maxListingsPerSearch` (type: `integer`):

Stops each search after this many jobs. The site shows at most 10,000 jobs of one search.

## `includeDetails` (type: `boolean`):

Opens every job for the full ad text (without contact persons, phone numbers and e-mail addresses), the apply link, the industry and the closing date. One more request per job, so slower.

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

## `proxyConfiguration` (type: `object`):

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.jobs.ch/de/stellenangebote/?term=python&location=Z%C3%BCrich"
  ],
  "site": "jobs.ch",
  "searchMode": "full_text",
  "postedWithinDays": 0,
  "sortBy": "relevance",
  "maxListingsPerSearch": 30,
  "includeDetails": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://www.jobs.ch/de/stellenangebote/?term=python&location=Z%C3%BCrich"
    ],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/jobs-ch-jobs").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 = {
    "searchUrls": ["https://www.jobs.ch/de/stellenangebote/?term=python&location=Z%C3%BCrich"],
    "maxListingsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/jobs-ch-jobs").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 '{
  "searchUrls": [
    "https://www.jobs.ch/de/stellenangebote/?term=python&location=Z%C3%BCrich"
  ],
  "maxListingsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/jobs-ch-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,highbrow_fame/jobs-ch-jobs"
        }
    }
}
```

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/H25tXkozFiSfCjETp/builds/H5qpWoqgUYrjjhLm4/openapi.json
