# Jobbern Jobs Search Scraper (`alexist/jobbern-jobs-search-scraper`) Actor

Scrape Swiss job listings from JobBern.ch efficiently. Collect 28+ data fields including titles, company info, location, salary ranges, requirements, and publication dates — perfect for recruiters, job aggregators, and labor market researchers.

- **URL**: https://apify.com/alexist/jobbern-jobs-search-scraper.md
- **Developed by:** [Alex](https://apify.com/alexist) (community)
- **Categories:** Automation, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

## JobBern.ch Jobs Scraper: Extract Swiss Job Listings at Scale

***

### What Is JobBern.ch?

JobBern.ch is a prominent Swiss job portal specializing in employment opportunities across Switzerland. It hosts thousands of active job listings across diverse industries and regions, serving both employers and job seekers in the Swiss labor market. Extracting and analyzing this job data manually is tedious and error-prone — the **JobBern Jobs Scraper** automates the process, delivering structured, ready-to-analyze records from job list pages.

***

### Overview

The **JobBern Jobs Search Scraper** extracts comprehensive job listings from JobBern.ch search and category pages, converting unstructured HTML into clean, structured data records. It is designed for:

- **Recruitment agencies** tracking job market trends and competitor postings
- **HR professionals** researching salary ranges and skill requirements
- **Job aggregator platforms** feeding content into custom job boards
- **Labor market researchers** analyzing employment patterns across Swiss regions
- **Data analysts** building datasets for Swiss employment insights

Key strengths include configurable scraping limits, graceful error handling, and detailed company and job metadata across 28 data fields.

***

### Input Format

The scraper accepts a JSON configuration object:

```json
{
  "urls": [
    "https://www.jobbern.ch/job/alle-jobs-seite-2"
  ],
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

| Parameter | Description | Example |
|---|---|---|
| `urls` | Array of JobBern job list pages to scrape | `["https://www.jobbern.ch/job/alle-jobs-seite-2"]` |
| `max_items_per_url` | Maximum job listings to extract per URL (1–200) | `200` |
| `ignore_url_failures` | If `true`, continues scraping if some URLs fail; if `false`, stops on first failure | `true` |

> **Tip:** Use the "alle-jobs" (all jobs) pages or filter by canton/region for targeted data collection. You can add multiple pagination URLs to scrape larger datasets.

***

### Output Format

**Sample output**

```json
{
  "id": 327462,
  "title": "Dipl. Pflegefachfrau / Pflegefachmann Dialyse",
  "company_id": 24808,
  "workplace_zip": "5001",
  "workplace_city": "Aarau",
  "activity": "40-100% Sofort oder nach Vereinbarung, unbefristet Möchten Sie ein Teil unseres Teams sein? Bei uns können und dürfen Sie etwas bewirken. Wir suchen zur Ergänzung unseres Teams der Dialysestation, mit den Standorten Aarau, Frick und Zofingen, mit Hauptarbeitsort Aarau ein neues Teammitglied. Ihre Aufgaben Sie führen Hämodialyse-Behandlungen bei unseren Patienten durch, welche sich im ambulanten, stationären oder intensivmedizinischen Setting  ... ",
  "requirements": "",
  "offer": "",
  "contact": "Luis Bastos Pereira, Stationsleiter Pflege\nLuis.bastos-pereira@ksa.ch",
  "url_application": "https://ohws.prospective.ch/public/v1/redirect/1e8e4e48-17f1-4898-afaa-1d96226b7629/ats",
  "is_shown_on_company_minisite": true,
  "date_first_published": "2026-07-18T05:10:17.373+02:00",
  "date_start": "2026-07-18",
  "date_end": null,
  "company_description": "",
  "keywords": "Pflege, Spital, Klinik, Dialyse",
  "type_key": 5,
  "type_value_min": 40,
  "type_value_max": 100,
  "date_actualization": "2026-07-18",
  "is_special_offer": false,
  "is_promoted": false,
  "position": [],
  "external_id": "330148",
  "home_office": false,
  "country_code": [
    "ch"
  ],
  "video_url": null,
  "coordinates": [
    {
      "ort": "Aarau",
      "latitude": 47.392519,
      "longitude": 8.046133
    }
  ],
  "cantons": [
    "Aargau"
  ],
  "updated_at": "2026-07-18T10:10:23.787+02:00",
  "company": {
    "id": 24808,
    "name": "Kantonsspital Aarau",
    "description": "<span style=\"font-size:16px;\">Das Kantonsspital Aarau (KSA) ist das grösste Spital des Kantons Aargau und neben den Universitätsspitälern eines der grössten Zentrumsspitäler der Schweiz. Die <a href=\"https://www.ksa.ch/zentren-kliniken/allgemeine-innere-und-notfallmedizin\" rel=\"nofollow noopener\" style=\"color:rgb(0,159,227);margin:0px;padding:0px;\" target=\"_blank\">Allgemeine Innere Medizin</a> des KSA trägt seit 2010 den Status einer universitären Klinik. Als überregionales Gesundheitszentrum mit ausserkantonaler Ausstrahlung verfügt das KSA über eine erstklassige medizinisch-technische Infrastruktur, betreibt eine rege Forschungstätigkeit und ist durch die Ausbildung von 31 Facharzttiteln, davon 19 im A-Status, eine bedeutende Weiterbildungsstätte für angehende Fachärzte sowie ein attraktiver Arbeitgeber für zahlreiche Berufsgruppen aus Pflege, Therapie und Betrieb.<br />\nDas medizinische Leistungsangebot reicht von der Grundversorgung über die spezialisierte bis hin zur <a href=\"https://www.ksa.ch/ueber-uns#hochspezialisierte_medizin\" rel=\"nofollow noopener\" style=\"color:rgb(0,159,227);margin:0px;padding:0px;\" target=\"_blank\">Hochspezialisierten Medizin.</a> In über 30 Behandlungs- und Diagnosezentren zeichnen rund 4600 Fachpersonen aus Diagnostik, Medizin, Pflege, Therapie und anderen Berufsbereichen jährlich für über 28'000 stationäre und über 520'000 ambulante Behandlungen verantwortlich.</span>",
    "homepage": "https://www.ksa.ch/stellen-karriere/stellen-karriere",
    "additional_address": "",
    "vacancy_list_style_class": "Ostjob_Vacancy_ListStyle_Default",
    "zip": "5001",
    "city": "Aarau",
    "hide_first_publication_date": false,
    "street": "Tellstrasse",
    "house_number": "25",
    "po_box": "",
    "country": "Schweiz",
    "additional_name": "",
    "main_phone_number": "062 838 41 41",
    "pdf_preview_enable": true,
    "contact_and_application_url_enable": true,
    "vacancies_in_popup": false,
    "is_shown_iframe_on_mobile_pages": true,
    "show_template_on_mobile": false,
    "logo_id": "4ff68b30440200e849d2",
    "country_of_origin_code": "ch",
    "is_free_company": false,
    "with_profile": true,
    "profile": {
      "company_id": 24808,
      "social_urls": [
        {
          "name": "facebook",
          "url": "https://www.facebook.com/ksaarau"
        },
        {
          "name": "twitter",
          "url": "https://twitter.com/ksaarau"
        },
        {
          "name": "xing",
          "url": "https://www.xing.com/pages/kantonsspitalaarau"
        },
        {
          "name": "linkedin",
          "url": "https://www.linkedin.com/company/5244077"
        },
        {
          "name": "youtube",
          "url": "https://www.youtube.com/kantonsspitalaarau"
        },
        {
          "name": "kununu",
          "url": "https://www.kununu.com/ch/kantonsspital-aarau2"
        },
        {
          "name": "instagram",
          "url": "https://www.instagram.com/ksaarau"
        }
      ],
      "company_site": "",
      "career_site": "https://www.ksa.ch/stellen-karriere/stellen-karriere",
      "contact": {
        "firstname": "Fabio",
        "lastname": "Blasi",
        "title": "Leiter Sourcing, Employer Branding und Development",
        "phone": "+41 62 838 68 67",
        "email": "fabio.blasi@ksa.ch"
      },
      "benefits": [
        {
          "name": "Relocation Support",
          "icon": "e906ce2a57a617ccf981",
          "icon_format": ""
        },
        {
          "name": "Karrierestart",
          "icon": "665c339a846add4b5c58",
          "icon_format": ""
        },
        {
          "name": "Vorsorge",
          "icon": "120eabb7ce7172f7fb00",
          "icon_format": ""
        },
        {
          "name": "Versicherungen",
          "icon": "3f3cbe0db408c0b5ad93",
          "icon_format": ""
        },
        {
          "name": "Kinderbetreuung",
          "icon": "22ee973f91aefcc9666a",
          "icon_format": ""
        }
      ],
      "active_sections": [
        "career",
        "benefits",
        "jobs",
        "photo_video",
        "about_us"
      ]
    }
  },
  "from_url": "https://www.jobbern.ch/job/alle-jobs"
}
```

Each job listing returns 28+ fields covering identity, location, dates, compensation, company details, and metadata:

#### Identification & Tracking

| Field | Meaning | Example |
|---|---|---|
| `id` | Unique JobBern identifier for the listing | `12345` |
| `external_id` | External or partner system ID | `partner-abc123` |
| `title` | Job title as displayed | `Senior Full Stack Developer` |
| `url_application` | Direct link to apply or external application URL | `https://www.jobbern.ch/job/...` |

#### Location & Geography

| Field | Meaning | Example |
|---|---|---|
| `workplace_city` | City where the job is based | `Bern`, `Zurich` |
| `workplace_zip` | Postal code of the workplace | `3011` |
| `cantons` | Swiss cantons (regions) where the role is available | `BE`, `ZH` |
| `country_code` | ISO country code | `CH` |
| `coordinates` | Geographic coordinates (latitude, longitude) for mapping | `[46.9479, 7.4474]` |
| `home_office` | Work-from-home availability (percentage or flag) | `50%`, `true` |

#### Job Details & Requirements

| Field | Meaning | Example |
|---|---|---|
| `requirements` | Candidate requirements and qualifications | `3+ years experience, fluent German` |
| `offer` | Job benefits and offer details | `Competitive salary, flexible hours` |
| `activity` | Job function or area | `Software Development` |
| `keywords` | Searchable tags or keywords | `developer, python, startups` |
| `position` | Position level or seniority | `Senior`, `Entry-level` |

#### Company Information

| Field | Meaning | Example |
|---|---|---|
| `company` | Employer name | `TechCorp AG` |
| `company_id` | Internal company identifier in JobBern | `5678` |
| `company_description` | Brief company overview | `Leading Swiss tech innovation firm` |
| `is_shown_on_company_minisite` | Whether listed on employer's JobBern profile | `true` |

#### Compensation & Employment Type

| Field | Meaning | Example |
|---|---|---|
| `type_key` | Employment type classification | `salary`, `hourly` |
| `type_value_min` | Minimum salary or hourly rate | `95000` |
| `type_value_max` | Maximum salary or hourly rate | `120000` |

#### Dates & Lifecycle

| Field | Meaning | Example |
|---|---|---|
| `date_first_published` | When the listing was first published | `2024-01-15T10:30:00Z` |
| `date_start` | Expected start date for the role | `2024-03-01` |
| `date_end` | Listing expiry date | `2024-03-31` |
| `date_actualization` | Last update timestamp | `2024-01-20T14:45:00Z` |
| `updated_at` | Most recent modification time | `2024-01-20T14:45:00Z` |

#### Listing Status & Promotion

| Field | Meaning | Example |
|---|---|---|
| `is_special_offer` | Whether listing has special promotion status | `true` |
| `is_promoted` | Whether the listing is promoted/boosted | `true` |

#### Additional Resources

| Field | Meaning | Example |
|---|---|---|
| `contact` | Recruiter or HR contact information | `contact@techcorp.ch` |
| `video_url` | Link to company or job video (if available) | `https://www.youtube.com/...` |

***

### How to Use

1. **Identify target URLs** — Navigate to JobBern.ch and find the job list pages you wish to scrape (e.g., all jobs, jobs by canton, jobs by industry).
2. **Copy URLs** — Collect one or more search result page URLs and paste them into the `urls` array.
3. **Set scraping parameters** — Configure `max_items_per_url` (recommend 200 for comprehensive data) and set `ignore_url_failures: true` for robust batch runs.
4. **Run the scraper** — Start the actor and monitor progress in the logs.
5. **Export results** — Download output as JSON, CSV, or Excel for analysis or integration.

**Common best practices:**

- Scrape paginated pages (seite-2, seite-3, etc.) to capture large datasets.
- Use canton-filtered URLs (e.g., `/job?canton=BE`) to focus on specific regions.
- Set a reasonable `max_items_per_url` to balance coverage and speed.

***

### Use Cases & Business Value

- **Salary benchmarking:** Compare compensation ranges across job titles and regions
- **Skill trend analysis:** Identify in-demand skills and qualifications
- **Competitor monitoring:** Track hiring activity by industry or company
- **Job aggregation:** Feed Swiss job data into custom job boards or niche portals
- **Labor market insights:** Research employment patterns, job distribution by canton, and industry growth

The JobBern Jobs Scraper eliminates tedious manual data collection, enabling fast, systematic analysis of Switzerland's dynamic job market.

***

### Conclusion

The **JobBern.ch Jobs Scraper** is an essential tool for anyone working with Swiss employment data. Whether you're building a job aggregator, researching the labor market, or conducting competitive intelligence, this scraper delivers rich, actionable data across 28 fields in minutes. Start collecting Swiss job listings today and unlock insights that drive recruitment, research, and strategic decision-making.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Jobs list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.jobbern.ch/job/alle-jobs-seite-2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 100
}
```

# 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 = {
    "urls": [
        "https://www.jobbern.ch/job/alle-jobs-seite-2"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/jobbern-jobs-search-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 = {
    "urls": ["https://www.jobbern.ch/job/alle-jobs-seite-2"],
    "ignore_url_failures": True,
    "max_items_per_url": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/jobbern-jobs-search-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 '{
  "urls": [
    "https://www.jobbern.ch/job/alle-jobs-seite-2"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 100
}' |
apify call alexist/jobbern-jobs-search-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/sh0OYflTbHh8Xq53u/builds/iny3yAlUZiPvWQsOx/openapi.json
