# Jobs.ch Scraper (`ayen-data/jobs-ch-scraper`) Actor

Scrapes job listings from Jobs.ch by search query, location, and Swiss region, returning positions, companies, locations, and full descriptions. Support Bulk scraping with search urls or query.

- **URL**: https://apify.com/ayen-data/jobs-ch-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/ayen-data) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![banner](https://i.ibb.co/v6yTvWnb/Screenshot-2026-06-20-at-2-07-00-PM.png)

## Jobs.ch Scraper

**Collect job listings from Jobs.ch at scale — by search query, location, and Swiss region.**

The Jobs.ch Scraper extracts structured job data from [Jobs.ch](https://www.jobs.ch), Switzerland's
leading job marketplace: positions, companies, locations, employment types, and full descriptions
across all Swiss regions and languages (German, French, Italian, English). It is built for
recruiters, HR teams, and market researchers monitoring the Swiss employment landscape.

### Features

- Extract job data from Jobs.ch at scale
- No login required
- Extract job details including title, company, location, type, description, images, videos, external apply link, external apply button
- Fast and efficient
- Cheapest compared to any other similar scraper

### ⚡ Quick start

Paste a jobs.ch search URL (filters and all) as a start URL:

```json
{
  "startUrls": [
    { "url": "https://www.jobs.ch/en/vacancies/?term=product%20manager" }
  ],
  "maxItems": 5
}
```

Or build the search from fields instead of a URL:

```json
{
  "query": "project manager",
  "location": "zurich",
  "regions": ["central-switzerland"],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                     | Description                                                                                                                                        |
| -------------------- | ------- | -------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | no       | —                           | Public jobs.ch vacancy search URLs to scrape, including any filters applied on the site. When set, `query`, `location`, and `regions` are ignored. |
| `query`              | string  | no       | —                           | Search term (e.g. job title or keyword).                                                                                                           |
| `location`           | string  | no       | —                           | Location to search in. If provided, it takes precedence over region filtering.                                                                     |
| `regions`            | array   | no       | —                           | One or more Swiss region slugs to filter by (see list below).                                                                                      |
| `maxItems`           | integer | no       | `10`                        | Maximum number of job listings to scrape **per start URL**.                                                                                        |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": true }` | Apify proxy settings.                                                                                                                              |

#### Start URLs

Apply any filters on [jobs.ch](https://www.jobs.ch/en/vacancies/) — search term, language skills,
employment positions, employment types, categories, industries, publication date, and more — then
copy the browser URL into `startUrls`. Each URL is scraped as its own search, and `maxItems` applies
to each one independently. Supported filter parameters include `term`, `location`, `language-skill`,
`position`, `employment-type`, `category`, `industry`, `company`, `benefit`, and `publication-date`.

```json
{
  "startUrls": [
    {
      "url": "https://www.jobs.ch/en/vacancies/?language-skill=de&language-skill=en&language-skill=fr&position=1&position=2&position=3&publication-date=7&term=product%20manager"
    }
  ]
}
```

<details><summary>Available region slugs</summary>

`abroad`, `central-switzerland`, `city-of-zurich-lake-zurich`, `eastern-switzerland-gr-fl`,
`german-part-of-switzerland`, `graubunden`, `mittelland-ag-so`, `region-of-basel`, `region-of-bern`,
`region-of-fribourg`, `region-of-geneva`, `region-of-neuchatel-jura`, `region-of-oberwallis`,
`region-of-vaud-valais`, `region-of-winterthur-schaffhausen`, `region-of-zurich-schaffhausen`,
`rheintal-fl-sargans-linth`, `st-gall-appenzell`, `thurgau-lake-constance`, `ticino`,
`western-switzerland`, `wil-toggenburg`, `zurich-oberland`, `zurich-unterland-limmattal`

</details>

### 📤 Output

Each scraped job is pushed to the dataset as one record.

#### Fields

| Field                          | Type           | Description                                          |
| ------------------------------ | -------------- | ---------------------------------------------------- |
| `id`                           | string         | Job listing ID.                                      |
| `url`                          | string         | Public Jobs.ch job URL.                              |
| `type`                         | string\[]       | Employment type(s) (e.g. Festanstellung, Praktikum). |
| `positionName`                 | string         | Job title.                                           |
| `company`                      | string         | Company name.                                        |
| `companyLogo`                  | string | null | Company logo URL.                                    |
| `companyDescription`           | string | null | Company lead text.                                   |
| `postedAt`                     | string | null | Publication date (ISO 8601).                         |
| `expiredAt`                    | string | null | Publication end date (ISO 8601).                     |
| `isExpired`                    | boolean        | Whether the listing has expired.                     |
| `location`                     | string         | Combined street, zip, and place.                     |
| `street` / `place` / `zipcode` | string         | Address parts.                                       |
| `externalLink`                 | string         | External listing URL.                                |
| `externalApplyLink`            | string         | External application URL.                            |
| `descriptionHTML`              | string         | Job description as HTML.                             |
| `description`                  | string | null | Job description as plain text.                       |
| `images`                       | array          | Listing images.                                      |
| `videos`                       | array          | Listing videos.                                      |

<details><summary>Example output</summary>

```json
{
  "id": "f2db64e7-0e5a-4226-988f-955450698d83",
  "url": "https://www.jobs.ch/de/stellenangebote/detail/f2db64e7-0e5a-4226-988f-955450698d83",
  "type": ["Festanstellung"],
  "positionName": "Dipl. Pflegefachfrau/-mann Privatstation Nachtdienst 50-100%",
  "company": "HOCH Health Ostschweiz",
  "companyLogo": "https://media.jobs.ch/images/562d70d3-388e-47ff-8538-dc7f3d77e424/1020x1020.png",
  "postedAt": "2025-09-03T10:31:59.000Z",
  "expiredAt": "2026-10-01T00:00:00.000Z",
  "isExpired": false,
  "location": "Uznach",
  "externalLink": "",
  "street": "",
  "place": "Uznach",
  "zipcode": "",
  "externalApplyLink": "https://career012.successfactors.eu/career?company=KSSG&career_job_req_id=40048",
  "descriptionHTML": "<div><h3>Pflege & Therapeutische Dienste Standort Uznach</h3>...</div>",
  "description": "Pflege & Therapeutische Dienste Standort Uznach ...",
  "images": [
    {
      "type": "png",
      "context": "logo",
      "url": "https://media.jobs.ch/images/562d70d3-388e-47ff-8538-dc7f3d77e424/1020x1020.png",
      "updated": "2025-09-03T12:31:59+02:00",
      "file_name": "1020x1020.png"
    }
  ],
  "videos": []
}
```

</details>

### 💡 Use cases

- **Recruiters** monitor Swiss market roles and competitor postings.
- **HR professionals** analyze hiring trends across regions and languages.
- **Researchers** study employment patterns in Switzerland's multilingual market.
- **Aggregators** keep a Swiss jobs directory fresh.

### ❓ FAQ

- **What is Jobs.ch?** Switzerland's largest job platform, with positions across all regions and languages.
- **How many listings can it extract?** Up to 2000 results per search; use `maxItems` to cap the run.
- **What if Jobs.ch changes its site?** We maintain the scraper and update it when major changes affect functionality.

### 🤝 Anyx Solutions

Anyx Solutions is an Apify Partner. We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

# Actor input Schema

## `startUrls` (type: `array`):

Public jobs.ch vacancy search pages to scrape. Apply any filters on jobs.ch, then copy the page URL here (for example: https://www.jobs.ch/en/vacancies/?term=product%20manager). When set, the search query, location, and regions fields below are ignored.

## `query` (type: `string`):

Keyword to search for, such as a job title, skill, or company name (for example: software engineer).

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

City or place to search jobs in (for example: Zurich).

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

One or more Swiss regions to limit the search to. Leave empty to search all regions.

## `maxItems` (type: `integer`):

Maximum number of job listings to extract. Leave empty to scrape all available results.

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

Apify proxy settings used for the run.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.jobs.ch/en/vacancies/?term=product%20manager"
    }
  ],
  "query": "project manager",
  "location": "zurich",
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.jobs.ch/en/vacancies/?term=product%20manager"
        }
    ],
    "query": "project manager",
    "location": "zurich",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayen-data/jobs-ch-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 = {
    "startUrls": [{ "url": "https://www.jobs.ch/en/vacancies/?term=product%20manager" }],
    "query": "project manager",
    "location": "zurich",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("ayen-data/jobs-ch-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.jobs.ch/en/vacancies/?term=product%20manager"
    }
  ],
  "query": "project manager",
  "location": "zurich",
  "maxItems": 10
}' |
apify call ayen-data/jobs-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ayen-data/jobs-ch-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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