# Myjob Jobs Details Scraper (`alexist/myjob-jobs-details-scraper`) Actor

Scrape detailed job postings from MyJob.ch, Switzerland's leading job board. Capture titles, company info, requirements, salaries, locations, and 26+ fields per listing — perfect for recruiters, HR teams, and labor market researchers.

- **URL**: https://apify.com/alexist/myjob-jobs-details-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

## MyJob.ch Jobs Scraper: Extract Swiss Job Listings in Minutes

***

### About MyJob.ch

MyJob.ch is a premier Swiss job marketplace connecting employers with candidates across all industries and regions. With thousands of active listings updated daily, it serves as a vital source for understanding the Swiss labor market. Manually extracting job data is inefficient — the **MyJob.ch Jobs Scraper** automates this, delivering clean, structured records ready for analysis and integration.

***

### Scraper Overview

The **MyJob.ch Jobs Scraper** extracts comprehensive job detail pages from MyJob.ch, transforming raw listings into organized datasets with 26+ structured fields. Perfect for:

- **Recruiters** tracking market trends and competitor postings
- **HR professionals** building talent pipeline databases
- **Salary researchers** analyzing compensation benchmarks
- **Job aggregators** feeding data into custom job boards
- **Market analysts** studying Swiss employment patterns

The scraper handles bulk operations efficiently with configurable item limits and robust error handling.

***

### Input Configuration

The scraper accepts a JSON-based configuration:

```json
{
    "urls": [
        "https://www.myjob.ch/job/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/3226642",
        "https://www.myjob.ch/job/assistenzaerztin-assistenzarzt-w-m-d-fuer-die-klinik-fur-gefasschirurgie-80-100/3226459"
    ],
    "max_items_per_url": 200,
    "ignore_url_failures": true
}
```

| Parameter | Type | Description |
|---|---|---|
| `urls` | Array | Direct links to MyJob.ch job detail pages. Accepts single or bulk URLs. |
| `max_items_per_url` | Number | Maximum records extracted per URL (e.g., `200`). Controls output volume. |
| `ignore_url_failures` | Boolean | If `true`, continues processing even if some URLs fail, avoiding premature stop on errors. |

**Input requirements:**

- Use full job detail page URLs (not search results pages)
- URLs must be publicly accessible
- Each URL should point to an active job listing for best results

***

### Output Fields Explained

**Example output snippet:**

```json
{
  "id": 3226642,
  "title": "Quereinstieg Lokführer in Personenverkehr 03/2027",
  "company_id": 30456,
  "workplace_zip": "",
  "workplace_city": "Schaffhausen",
  "activity": "<p>Das kannst du bewegen.</p>\n<ul>\n<li>Als Lokführer:in übernimmst du nicht nur die Spitze des Zugs, sondern auch Verantwortung-für Sicherheit und Pünktlichkeit auf dem dicht befahrenen Schienennetz.-</li>\n<li>Während deiner Fahrt bist du achtsam und-reagierst schnell und richtig auf Signale, Geschwindigkeitsregelungen sowie unvorhersehbare Ereignisse. </li>\n<li>Du handelst selbstständig und stehst jederzeit mit Betriebszentralen und Leitstellen in Kontakt.</li>\n<li>Neben dem-Führen und Rangieren der Züge-gehört auch das-Überprüfen des technischen Zustands-vor-und nach der Übernahme des Fahrzeugs zu deinen Aufgaben.</li>\n</ul>\n<p>Erfahre mehr zum  Berufsbild an der nächsten Informationsveranstaltung.</p>\n<p>Das bringst du mit.</p>\n<ul>\n<li>Du hast eine dreijährige Berufslehre oder die Matura abgeschlossen. Deine Motivation ist uns dabei wichtiger als die Branche, aus der du kommst.</li>\n<li>Herausforderungen gehst du gelassen an, triffst auch in stressigen Situationen überlegte Entscheidungen und bringst Bereitschaft für Schichtarbeit mit.</li>\n<li>Du bist verhandlungssicher in Deutsch (Niveau C2) und bringst Anfängerkenntnisse einer zweiten Landessprache (Niveau A1) mit.</li>\n<li>Du verfügst über einen einwandfreien Farbsinn (keine Rot-Grün-Schwäche) und weist keine Einträge im Straf- und Betreibungsregister auf.</li>\n<li>Für die intensive und anspruchsvolle Ausbildungszeit bringst du viel Eigenverantwortung und Motivation mit und bist bereit, dich auf unterschiedliche Lernumgebungen einzulassen - von Präsenzunterricht vor Ort bis zum digitalen Selbststudium.</li>\n</ul>",
  "requirements": null,
  "offer": null,
  "contact": null,
  "url_application": "https://jobs.sbb.ch/v2/offene-stellen/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/44261df2-b8e6-4c12-ba12-3f15ff5a28db",
  "url_description": "https://jobs.sbb.ch/v2/offene-stellen/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/44261df2-b8e6-4c12-ba12-3f15ff5a28db",
  "is_shown_on_company_minisite": true,
  "company_description": null,
  "type_key": 5,
  "type_value_min": 100,
  "type_value_max": 100,
  "date_actualization": "2026-07-18",
  "date_start": "2026-07-18",
  "date_first_published": "2026-07-18 05:15:46.971125+0200",
  "is_special_offer": false,
  "is_promoted": false,
  "home_office": false,
  "position": [],
  "external_id": "e0f18f11-0071-554d-8aac-e34ef13a9d7f",
  "country_code": [
    "ch"
  ],
  "company": {
    "id": 30456,
    "name": "Schweizerische Bundesbahnen SBB",
    "description": "Zahlen, die beeindrucken: 354 Millionen Fahrgäste sind jedes Jahr mit der SBB unterwegs. Mit ihrem Streckennetz von 3138 Kilometern Länge hält die SBB einen grossen Anteil am 5200 Kilometer langen Eisenbahnnetz der Schweiz.",
    "homepage": "http://www.sbb.ch/",
    "additional_address": "",
    "vacancy_list_style_class": "Ostjob_Vacancy_ListStyle_Default",
    "zip": "3014",
    "city": "Bern 65",
    "hide_first_publication_date": false,
    "street": "Hilfikerstrasse",
    "house_number": "1",
    "po_box": "",
    "country": "Schweiz",
    "additional_name": "",
    "main_phone_number": "",
    "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": "de034f6785f2ce500ed8",
    "country_of_origin_code": "ch",
    "is_free_company": false
  },
  "categories": [
    {
      "id": 48,
      "title": "Einkauf, Logistik, Transport, Verkehr",
      "description": "",
      "order_position": 5,
      "is_active": true,
      "platform_id": [
        1
      ]
    }
  ],
  "address_country": "ch"
}
```

The scraper returns 26+ fields per job listing, organized by category:

#### Identification & Links

| Field | Meaning |
|---|---|
| `id` | Unique MyJob.ch identifier for the job posting |
| `external_id` | External system ID if job is syndicated from another platform |
| `title` | Official job title displayed on the listing |
| `url_description` | Direct URL to the job detail page on MyJob.ch |
| `url_application` | Application form URL or external link for submitting applications |

#### Company Information

| Field | Meaning |
|---|---|
| `company` | Employer name and linked company profile |
| `company_id` | Unique identifier for the employing company |
| `company_description` | Overview of the company, values, and culture |
| `is_shown_on_company_minisite` | Boolean flag: whether the listing appears on company's career minisite |

#### Location Details

| Field | Meaning |
|---|---|
| `workplace_city` | City where the job is located |
| `workplace_zip` | Postal code of the workplace |
| `address_country` | Country code of the position (e.g., `CH` for Switzerland) |
| `country_code` | ISO country code for regional filtering |

#### Job Content

| Field | Meaning |
|---|---|
| `activity` | Primary job function or role category (e.g., Sales, Engineering, Healthcare) |
| `position` | Position level or seniority (e.g., Junior, Senior, Management) |
| `requirements` | Required qualifications, experience, and skills in plain text |
| `offer` | What the employer offers (benefits, compensation, perks) |
| `categories` | Categorized job tags (e.g., "Healthcare," "IT," "Finance") |
| `contact` | Primary contact person or HR department for inquiries |

#### Compensation & Employment Terms

| Field | Meaning |
|---|---|
| `type_key` | Type of employment (e.g., "Salary," "Hourly") |
| `type_value_min` | Minimum salary or hourly rate in CHF |
| `type_value_max` | Maximum salary or hourly rate in CHF |
| `home_office` | Home office availability policy (e.g., None, Flexible, Full-time remote) |

#### Dates & Status

| Field | Meaning |
|---|---|
| `date_first_published` | When the job was first posted on MyJob.ch |
| `date_start` | Expected start date for the position |
| `date_actualization` | Last update date (when the listing was refreshed) |
| `is_promoted` | Boolean: whether the listing has paid promotion/boost |
| `is_special_offer` | Boolean: whether the listing is a special or featured offer |

***

### How to Use

1. **Gather job URLs** — Visit MyJob.ch and open individual job listings. Copy the full URL from the address bar.
2. **Prepare input** — Paste URLs into the `urls` array in your configuration. Set `max_items_per_url` based on your needs (typically 20–200).
3. **Enable error handling** — Set `ignore_url_failures: true` for large runs to prevent interruptions.
4. **Execute the scraper** — Submit your configuration and monitor progress in the run logs.
5. **Export results** — Download the extracted data as JSON, CSV, or Excel for immediate use.

**Best practices:**

- Batch URLs in groups of 50–100 for better performance
- Use fresh URLs; archived or deleted listings return empty records
- Schedule regular scrapes to capture market updates
- Store `date_actualization` to track when data was last refreshed

***

### Use Cases & Applications

- **Salary benchmarking** — Collect salary ranges across roles, industries, and regions for compensation analysis
- **Talent pipeline** — Build a searchable database of active openings for targeted recruitment campaigns
- **Competitive intelligence** — Monitor competitor job postings, hiring patterns, and positioning strategies
- **Labor market research** — Analyze hiring trends by sector, location, and employment type
- **Job board aggregation** — Feed curated Swiss job data into your own job portal or platform
- **Skills demand analysis** — Identify trending requirements and qualifications across the market

***

### Conclusion

The **MyJob.ch Jobs Scraper** transforms manual job data collection into an automated, scalable process. With 26+ output fields spanning company details, compensation, location, and employment terms, it delivers the complete picture of Swiss job listings. Whether you're a recruiter building pipelines, an analyst studying market trends, or a developer powering a job aggregator, this scraper saves hours and ensures data accuracy.

# Actor input Schema

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

Add the URLs of the Specific jobs 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.

## Actor input object example

```json
{
  "urls": [
    "https://www.myjob.ch/job/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/3226642",
    "https://www.myjob.ch/job/assistenzaerztin-assistenzarzt-w-m-d-fuer-die-klinik-fur-gefasschirurgie-80-100/3226459",
    "https://www.myjob.ch/job/rayonleiterin-fisch/3226438",
    "https://www.myjob.ch/job/verkaeuferin-fisch/3226436",
    "https://www.myjob.ch/job/event-mitarbeiterin-aushilfe/3226434"
  ],
  "ignore_url_failures": true
}
```

# 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.myjob.ch/job/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/3226642",
        "https://www.myjob.ch/job/assistenzaerztin-assistenzarzt-w-m-d-fuer-die-klinik-fur-gefasschirurgie-80-100/3226459",
        "https://www.myjob.ch/job/rayonleiterin-fisch/3226438",
        "https://www.myjob.ch/job/verkaeuferin-fisch/3226436",
        "https://www.myjob.ch/job/event-mitarbeiterin-aushilfe/3226434"
    ],
    "ignore_url_failures": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("alexist/myjob-jobs-details-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.myjob.ch/job/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/3226642",
        "https://www.myjob.ch/job/assistenzaerztin-assistenzarzt-w-m-d-fuer-die-klinik-fur-gefasschirurgie-80-100/3226459",
        "https://www.myjob.ch/job/rayonleiterin-fisch/3226438",
        "https://www.myjob.ch/job/verkaeuferin-fisch/3226436",
        "https://www.myjob.ch/job/event-mitarbeiterin-aushilfe/3226434",
    ],
    "ignore_url_failures": True,
}

# Run the Actor and wait for it to finish
run = client.actor("alexist/myjob-jobs-details-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.myjob.ch/job/quereinstieg-lokfuehrer-in-personenverkehr-03-2027/3226642",
    "https://www.myjob.ch/job/assistenzaerztin-assistenzarzt-w-m-d-fuer-die-klinik-fur-gefasschirurgie-80-100/3226459",
    "https://www.myjob.ch/job/rayonleiterin-fisch/3226438",
    "https://www.myjob.ch/job/verkaeuferin-fisch/3226436",
    "https://www.myjob.ch/job/event-mitarbeiterin-aushilfe/3226434"
  ],
  "ignore_url_failures": true
}' |
apify call alexist/myjob-jobs-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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