# JobScout24.ch Jobs Scraper (`parsebird/jobscout24-ch-jobs-scraper`) Actor

Scrape job listings from JobScout24.ch by keyword, region, category, and contract type. Get title, company, location, canton, workload, employment type, full description, and more. Export as JSON, CSV, or Excel.

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

## Pricing

from $1.19 / 1,000 job scrapeds

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

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

### JobScout24.ch Jobs Scraper

Scrape job listings from **[JobScout24.ch](https://www.jobscout24.ch)** — a Swiss job board — into clean, structured JSON. The JobScout24.ch Jobs Scraper pulls the title, company, location, canton, workload, employment type, full description, and publication date for any keyword, category, or contract-type search, with no login and no JobScout24 API.

<table><tr>
<td style="border-left:4px solid #0057B8;padding:12px 16px;font-weight:600">
Search JobScout24.ch by keyword, professional category, contract type, and workload — or paste a JobScout24.ch URL — and get a structured record per job, with full descriptions, canton, and company details from the listing's own detail page.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/jobscout24-ch-jobs-scraper (Apify). Scrapes job listings from jobscout24.ch (Switzerland). Call with ApifyClient.
Input JSON fields:
  searchQueries: string[] — job titles/keywords, each run as a separate search and merged+de-duplicated (default ["Software Engineer"])
  location: string — Swiss city/town, matched against each job's own location after fetching
  region: string — named Swiss region code (canton group), matched against each job's canton (needs includeJobDetails)
  category: string — Berufsgruppe code, e.g. "8" = IT (see input schema for the full list)
  employmentType: string[] — "permanent"|"temporary"|"internship"|"freelance"|"part-time"|"apprenticeship"
  workloadMin/workloadMax: int (0-100) — Pensum % range, applied after fetching
  publishedSince: "1"|"3"|"7"|"30" — last 24h/3 days/week/30 days
  language: "en"|"de"|"fr" (default "en")
  maxResults: int (default 100, 0 = unlimited) — per keyword; billed rows
  includeJobDetails: bool (default true) — fetch full description, canton, employment type, exact workload, company logo/URL
  startUrls: string[] — jobscout24.ch search or single-job URLs; overrides keyword/location/region
Output: one dataset item per job — title, company, location, canton, workload, workloadMin, workloadMax, employmentType,
  descriptionSnippet, description, publicationDate, companyLogo, companyUrl, jobId, jobUrl, language, searchQuery, scrapedAt.
Example: { "searchQueries": ["Software Engineer"], "maxResults": 50 }
API: https://api.apify.com/v2/acts/parsebird~jobscout24-ch-jobs-scraper  ·  Token: https://console.apify.com/account/integrations
```

### What does JobScout24.ch Jobs Scraper do?

[JobScout24.ch](https://www.jobscout24.ch) is a Swiss job board with vacancies across every canton and industry. There is no public JobScout24 API — this JobScout24 scraper reads the site's own search and job-detail pages instead. For every job it extracts:

- 💼 **Job** — title, employment type (permanent, temporary, internship, freelance, part-time, apprenticeship), and workload (Pensum) range.
- 🏢 **Employer** — company name, logo, and company profile URL.
- 📍 **Location** — city and Swiss canton code.
- 📄 **Description** — the full job description, plus a short snippet.
- 📅 **Freshness** — the publication date and a direct link to the job.

Common uses: Swiss job-market research, building a jobs board or alert service, canton- and category-level hiring analysis, and monitoring specific employers.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| searchQueries | array | No | `["Software Engineer"]` | Job titles or keywords. Each runs a separate search; results are merged and de-duplicated. Up to 50. |
| location | string | No | — | Swiss city or town. Matched against each job's own location after fetching. |
| region | string | No | Any region | Named Swiss region (canton group). Matched against each job's canton — requires `includeJobDetails`. |
| startUrls | array | No | — | JobScout24.ch search-result or job URLs. Overrides `searchQueries`, `location`, and `region`. |
| category | string | No | Any category | One professional category (Berufsgruppe), e.g. IT, Management, Sales. |
| employmentType | array | No | — | `permanent`, `temporary`, `internship`, `freelance`, `part-time`, `apprenticeship`. Leave empty for all. |
| workloadMin / workloadMax | integer | No | — | Workload percentage range (Pensum), 0–100. Applied after fetching. |
| publishedSince | string | No | Any time | `1` (24h), `3` (3 days), `7` (week), `30` (30 days). |
| language | string | No | `en` | `en`, `de`, or `fr` — site language for titles and descriptions. |
| maxResults | integer | No | 100 | Maximum jobs per search keyword (0 = unlimited). Billed rows. |
| includeJobDetails | boolean | No | true | Fetch the full description and detail-page fields. Turn off for a faster, lighter scan. |

> `location` and `region` are applied after fetching — JobScout24.ch's own location filter fields render but do not narrow results server-side, so this actor matches them itself against each job's real location and canton for reliability.

#### Example inputs

Simple keyword search:

```json
{ "searchQueries": ["Software Engineer"], "maxResults": 50 }
```

Region and category filter:

```json
{
  "searchQueries": ["Projektleiter"],
  "region": "2",
  "category": "8",
  "publishedSince": "7",
  "language": "de"
}
```

Part-time permanent roles up to 60% workload, with full descriptions:

```json
{
  "searchQueries": ["Sachbearbeiter", "Kundenberater"],
  "region": "1",
  "employmentType": ["permanent", "part-time"],
  "workloadMin": 40,
  "workloadMax": 60,
  "publishedSince": "30",
  "language": "de",
  "maxResults": 500,
  "includeJobDetails": true
}
```

### What data can you extract from JobScout24.ch?

| Field | Description |
|-------|-------------|
| title | Job title as posted |
| company / companyLogo / companyUrl | Employer name, logo, and company profile URL |
| location / canton | City and Swiss canton code (e.g. ZH, GE, TI) |
| workload / workloadMin / workloadMax | Workload display string and percentage range (Pensum) |
| employmentType | Contract type (Permanent position, Part-time, etc.) |
| descriptionSnippet / description | Short summary and the full job description |
| publicationDate | Date the job was published |
| jobId / jobUrl | Unique JobScout24.ch identifier and direct link |
| language / searchQuery / scrapedAt | Output language, the keyword that found this row, and the extraction timestamp |

### Output example

```json
{
  "title": "Software Engineer (m/w/d)",
  "company": "Beispiel AG",
  "location": "Zürich",
  "canton": "ZH",
  "workload": "80% – 100%",
  "workloadMin": 80,
  "workloadMax": 100,
  "employmentType": "Permanent position",
  "descriptionSnippet": "We are looking for an experienced software engineer to join our platform team.",
  "description": "We are looking for an experienced software engineer to join our platform team. You will design and build services, collaborate across teams, and own features end to end...",
  "publicationDate": "2026-06-28",
  "companyLogo": "https://media.jobs.ch/images/example/300x150.png",
  "companyUrl": "https://www.jobscout24.ch/en/company/beispiel-ag/12345/",
  "jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "jobUrl": "https://www.jobscout24.ch/en/job/a1b2c3d4-e5f6-7890-abcd-ef1234567890/",
  "language": "en",
  "searchQuery": "Software Engineer",
  "scrapedAt": "2026-07-04T09:15:00Z"
}
```

Download the dataset as **JSON, CSV, Excel, HTML, or XML** from the Storage tab or the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- **Swiss jobs board** — feed an aggregator or alert service with live JobScout24.ch vacancies.
- **Canton and category analysis** — measure hiring volume by canton, professional group, and contract type.
- **Employer monitoring** — track what a specific company posts via its company profile URL.
- **Workload benchmarking** — compare part-time vs. full-time availability across roles.
- **LLM training data** — a structured corpus of Swiss job descriptions in English, German, or French.

### How it works

1. **Search** — the scraper queries JobScout24.ch for each of your `searchQueries` (or `startUrls`), applying category, contract-type, and posted-within filters server-side.
2. **Paginate** — it walks through result pages until `maxResults` or the end of the listing.
3. **Filter** — location, region (canton), and workload bounds are applied to the fetched data.
4. **Detail** — when `includeJobDetails` is on, each job's detail page is fetched for the full description, canton, employment type, exact workload, and company details.
5. Rows stream to the dataset, de-duplicated across all keywords.

### How much does it cost to scrape JobScout24.ch?

This actor is **pay per result** — charged once per job saved to the dataset.

| Plan | Price per 1,000 jobs |
|------|----------------------|
| Free | **$1.99** |
| Bronze | **$1.79** |
| Silver | **$1.49** |
| Gold | **$1.19** |

A small platform **Actor start** fee also applies per run. Scraping 1,000 jobs on the Free plan costs about **$1.99**. Apify's monthly free platform usage covers small runs.

### How to scrape JobScout24.ch

1. Click **Try for free** and sign in to Apify.
2. Enter one or more **search keywords**.
3. Add filters — category, contract type, workload, or posted-within window.
4. Set **max results per keyword** (start low, e.g. 25).
5. Leave **Fetch full job details** on for complete records, or turn it off for a fast scan.
6. Click **Start**, then watch rows appear in the **Output** tab.
7. Export from **Storage**, or pull results via the API.

#### Run it via API

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/jobscout24-ch-jobs-scraper").call(run_input={
    "searchQueries": ["Software Engineer"],
    "maxResults": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "-", job["company"], "-", job.get("canton"))
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/jobscout24-ch-jobs-scraper').call({
    searchQueries: ['Projektleiter'],
    region: '2',
    category: '8',
    maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Schedule recurring runs, add webhooks, or push results to Google Sheets, Slack, Zapier, and Make with [Apify integrations](https://docs.apify.com/platform/integrations).

### FAQ

**Do I need a JobScout24 account or API key?**
No. The scraper reads public JobScout24.ch pages only. JobScout24 has no public API — this actor is the alternative.

**How current is the data?**
Live. Each run reads JobScout24.ch at that moment. Use Apify's scheduler to keep a dataset fresh.

**What does turning off `includeJobDetails` change?**
The scraper skips each job's detail page, so you get title, company, location, workload, and the job URL, but not canton, employment type, the full description, or company logo/URL — much faster for large listing-only runs.

**Why do `location` and `region` sometimes return fewer jobs than expected?**
Both are matched against each job's real location and canton after fetching, not sent to JobScout24.ch as a server-side filter (its own location filter UI does not reliably narrow results). `region` also needs `includeJobDetails` on, since canton only appears on the detail page — the actor turns this on automatically if you set a region.

**Why does `maxResults` sometimes overshoot slightly?**
It caps results per search keyword, and the last page of a search is kept in full rather than cut mid-page.

**Something's not working.**
Open an issue on the **Issues** tab with your input and the run link — we respond quickly.

### Is it legal to scrape JobScout24.ch?

JobScout24.ch job listings are public information that any visitor can see without logging in. Scraping publicly available pages is legal in most jurisdictions, and this actor does not access private data or bypass any login. You are responsible for how you use the data — follow JobScout24's Terms of Use and Swiss data-protection law, and consult a lawyer if you are unsure. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Related actors

- [Homegate.ch Swiss Real Estate Scraper](https://apify.com/parsebird/homegate-ch-scraper) — property listings from Homegate.ch.
- [Job-Room.ch Jobs Scraper](https://apify.com/parsebird/job-room-ch-jobs-scraper) — vacancies from Switzerland's official job portal.
- [Jobbird Jobs Scraper](https://apify.com/parsebird/jobbird-jobs-scraper) — vacancies from Jobbird.com (Netherlands).
- [Jobs.ie Scraper](https://apify.com/parsebird/jobs-ie-scraper) — job listings from Ireland's Jobs.ie.

Browse all [ParseBird actors](https://apify.com/parsebird) on Apify Store.

# Actor input Schema

## `searchQueries` (type: `array`):

Job titles or keywords. Each keyword runs a separate search; results are merged and de-duplicated. Up to 50 keywords.

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

A Swiss city or town (e.g. Zürich, Bern, Geneva, Basel). Matched against each job's own listed location after fetching. Leave empty to search all of Switzerland.

## `region` (type: `string`):

Named Swiss region (canton group). Matched against each job's canton after fetching its detail page — automatically turns on 'Fetch full job details' if it is off.

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

Paste JobScout24.ch search-result or individual job URLs directly. Overrides the keyword, location, and region fields above.

## `category` (type: `string`):

One professional category (Berufsgruppe).

## `employmentType` (type: `array`):

Contract types to keep. Leave empty for all.

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

Keep jobs offering at least this workload percentage (Pensum), 0–100. Applied after fetching.

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

Keep jobs offering at most this workload percentage (Pensum), 0–100.

## `publishedSince` (type: `string`):

Only return jobs posted within this window.

## `language` (type: `string`):

Language for job titles and descriptions.

## `maxResults` (type: `integer`):

Maximum jobs per search keyword (0 = collect every match). The last page is kept in full, so the count can slightly overshoot.

## `includeJobDetails` (type: `boolean`):

Fetch the full description and detail-page fields (canton, employment type, exact workload, full description, company logo/URL) for each job. Turn off for a faster, lighter scan of summary fields only.

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

Optional proxy settings. JobScout24.ch works well without a proxy; add one for higher reliability on large runs.

## Actor input object example

```json
{
  "searchQueries": [
    "Software Engineer"
  ],
  "region": "",
  "startUrls": [],
  "category": "",
  "employmentType": [],
  "publishedSince": "",
  "language": "en",
  "maxResults": 50,
  "includeJobDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchQueries": [
        "Software Engineer"
    ],
    "location": "",
    "startUrls": [],
    "workloadMin": 0,
    "workloadMax": 0,
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/jobscout24-ch-jobs-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 = {
    "searchQueries": ["Software Engineer"],
    "location": "",
    "startUrls": [],
    "workloadMin": 0,
    "workloadMax": 0,
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/jobscout24-ch-jobs-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 '{
  "searchQueries": [
    "Software Engineer"
  ],
  "location": "",
  "startUrls": [],
  "workloadMin": 0,
  "workloadMax": 0,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/jobscout24-ch-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/jobscout24-ch-jobs-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/RRL9jxNSpNh2xrFlq/builds/v1rZQGANoRKpfMfQu/openapi.json
