# Jobup.ch Scraper - Switzerland Jobs, Salaries, Employers (`santamaria-automations/jobup-ch-scraper`) Actor

Scrape job listings from Jobup.ch, Switzerland-#1 general job board (JobCloud AG). Returns title, company, location, canton, workload, salary, contact details, and full descriptions. Multi-language (DE/FR/IT/EN). Public JSON API, no login. Pay-per-result.

- **URL**: https://apify.com/santamaria-automations/jobup-ch-scraper.md
- **Developed by:** [NanoScrape](https://apify.com/santamaria-automations) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 job search results

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

## Jobup.ch Scraper - Switzerland Jobs, Salaries, Employers

Scrape job listings from [Jobup.ch](https://www.jobup.ch/), Switzerland's #1 general job board (JobCloud AG, sister site to jobs.ch). Returns title, company, canton, workload, salary, contact details, apply URL, and full description. Multi-language (DE / FR / IT / EN).

Jobup.ch is the leading job board in French-speaking Switzerland (Suisse romande), covering Geneva, Vaud, Neuchâtel, Fribourg, Valais, and Jura.

**Cost-effective**: uses Jobup.ch's public JSON API for search (fast, cheap) with optional detail-page enrichment. No login required.

***

### Features

- 4 input modes: **searchQueries** (keywords) · **searchUrls** (paste any Jobup.ch SERP URL) · **startUrls** (alias) · **directUrls** (single-job re-scrape / still-alive checks)
- Multi-language: DE, FR, IT, EN
- Sort by **newest** (recommended for scheduled scrapes) or **relevance**
- Fleet-canonical field names: `job_url`, `title`, `company_name`, `canton`, `posted_at_datetime`, `salary_min/max`, `remote_type`, `description_full`, `apply_url`, `contact_email`, `contact_phone`, etc.
- **Description quartet** (v0.2.0): `description_full` (plain text), `description_snippet` (300-char preview), `description_html` (cleaned HTML), `description_md` (markdown for LLMs)
- Detail-page enrichment: full description in 4 formats, external ATS apply URL (Workday, SmartRecruiters, Greenhouse) + JSON-LD apply endpoint fallback, recruiter email + Swiss phone (with platform-boilerplate filtering)
- Multilingual `requirements` / `benefits` extraction: scans DE/FR/IT/EN section headers (Anforderungen / Votre profil / Requisiti / Requirements etc.)
- Salary extraction from Swiss patterns (`CHF 80'000 - 120'000 par an`, JSON-LD baseSalary)
- Fast SERP-only mode: `includeJobDetails: false` returns 20 fields per listing at ~10 items/sec
- Concurrent detail fetching (default 8 workers)
- Multi-language: `de`, `fr`, `it`, `en`; set via `language`; API accepts all four
- 3-tier proxy fallback (user proxy → auto → direct) for resilience
- 128 MB memory, ~$0.001 base charge per run

***

### Sample input

```json
{
  "searchQueries": ["développeur", "software engineer"],
  "language": "fr",
  "sortBy": "newest",
  "includeJobDetails": true,
  "maxResultsPerQuery": 50,
  "maxResults": 100,
  "maxConcurrency": 8,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

**Search URL mode**: paste any Jobup.ch SERP URL:

```json
{
  "searchUrls": [
    "https://www.jobup.ch/fr/emplois/?category=informatique-telecommunication&region_ids=1",
    "https://www.jobup.ch/de/jobs/?query=data%20engineer"
  ],
  "includeJobDetails": true,
  "maxResultsPerQuery": 30
}
```

**Direct URL mode**: re-scrape specific jobs:

```json
{
  "directUrls": [
    "https://www.jobup.ch/en/jobs/detail/d997ba3c-0238-49b4-b05d-a1b4f32c27ee/",
    "https://www.jobup.ch/fr/jobs/detail/53919591-93f1-4268-b50b-1c4e70124822/"
  ],
  "language": "en"
}
```

***

### Sample output

```json
{
  "id": "d997ba3c-0238-49b4-b05d-a1b4f32c27ee",
  "job_url": "https://www.jobup.ch/en/jobs/detail/d997ba3c-0238-49b4-b05d-a1b4f32c27ee/",
  "title": "Image Processing Engineer",
  "company_name": "SICPA SA",
  "company_logo_url": "https://media.jobs.ch/media/a3ced256-75ca-4598-a294-3c83cfa7e64c",
  "location": "Prilly",
  "canton": "VD",
  "postal_code": "1008",
  "country": "CH",
  "latitude": 46.53431,
  "longitude": 6.60564,
  "posted_at_datetime": "2026-09-03T13:26:13+02:00",
  "initial_posted_at": "2026-09-03T11:26:13+00:00",
  "employment_type": "permanent",
  "employment_position": "permanent",
  "workload_min": 100,
  "workload_max": 100,
  "salary_min": null,
  "salary_max": null,
  "salary_currency": "CHF",
  "salary_period": null,
  "remote_type": "hybrid",
  "language": "en",
  "description_full": "About the job\nEstablished in 1927, SICPA is a Swiss private technology company that supports the effective governance and long-term prosperity of nations...",
  "description_snippet": "About the job Established in 1927, SICPA is a Swiss private technology company that supports the effective governance and long-term...",
  "description_html": "<h4>About the job</h4><p>Established in 1927, SICPA is a Swiss private technology company...</p>",
  "description_md": "#### About the job\n\nEstablished in 1927, SICPA is a Swiss private technology company...",
  "apply_url": "https://www.jobup.ch/en/jobs/detail/d997ba3c-0238-49b4-b05d-a1b4f32c27ee/apply",
  "contact_email": "hr@sicpa.com",
  "contact_phone": "031 357 96 63",
  "requirements": ["MSc/BSc in Computer Science, Engineering, or related field", "3+ years experience in image processing"],
  "benefits": ["Competitive compensation package", "International working environment"],
  "tags": ["quickApply"],
  "coordinates": [46.53431, 6.60564],
  "source_query": "developer",
  "scraped_at": "2026-09-03T18:36:00Z"
}
```

***

### Input fields

| Field | Type | Description |
|---|---|---|
| `searchQueries` | string\[] | Keywords, one search per keyword |
| `searchUrls` | string\[] | Paste pre-filtered Jobup.ch SERP URLs |
| `startUrls` | string\[] | Alias for `searchUrls` (Apify convention) |
| `directUrls` | string\[] | Detail-page URLs for single-job re-scrapes |
| `language` | enum | `de` / `fr` / `it` / `en` (default `de`) |
| `sortBy` | enum | `newest` (default) / `relevance` |
| `includeJobDetails` | bool | Fetch full description + apply URL + contact email (default `true`) |
| `maxResults` | int | Global cap across all queries (0 = unlimited) |
| `maxResultsPerQuery` | int | Per-keyword cap (0 = unlimited; Jobup.ch caps ~400 per keyword) |
| `maxConcurrency` | int | Parallel detail fetches (default 8, max 30) |
| `proxyConfiguration` | proxy | Apify proxy (default auto). Public API works from datacenter. |

***

### Pricing (Pay-per-event)

| Event | Description | When it fires |
|---|---|---|
| `apify-actor-start` | One-time run start charge | Every run, once |
| `job-serp-result` | SERP-only listing (basic fields, no description) | When `includeJobDetails: false` OR detail fetch fails |
| `job-detail-result` | Full listing with description + apply\_url + contact\_email | When `includeJobDetails: true` succeeds |

Rate card is set on the Apify Console. This actor is designed for cost parity with our jobs.ch scraper (same JobCloud parent = same cost profile).

***

### Related actors

- [Jobs.ch Scraper](https://apify.com/santamaria-automations/jobs-ch-scraper) - sister JobCloud site, same API family
- [travail.swiss / job-room.ch Scraper](https://apify.com/santamaria-automations/arbeit-swiss-scraper) - official Swiss federal employment office (SECO). Covers arbeit.swiss (DE) / travail.swiss (FR) / lavoro.swiss (IT) / work.swiss (EN).
- [Swissdevjobs.ch Scraper](https://apify.com/santamaria-automations/swissdevjobs-ch-scraper) - Swiss developer-focused jobs
- [Zentraljob.ch Scraper](https://apify.com/santamaria-automations/zentraljob-ch-scraper) - Central-Switzerland regional board
- [JobScout24.ch Scraper](https://apify.com/santamaria-automations/jobscout24-ch-scraper) - General Swiss job aggregator with strong Suisse romande coverage.
- [LinkedIn Scraper](https://apify.com/santamaria-automations/linkedin-scraper) - Global professional network with Swiss localization; complementary to Swiss-native boards.
- [Indeed Scraper](https://apify.com/santamaria-automations/indeed-scraper) - Global aggregator with a strong Swiss corpus; broadens coverage beyond native boards.

***

### Issues / feature requests

Contact us at <contact@nanoscrape.com> or open an issue via the Apify Console.

***

*Built by [NanoScrape](https://apify.com/santamaria-automations). No affiliation with JobCloud AG or Jobup.ch.*

# Actor input Schema

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

One or more search keywords. Each keyword runs as a separate search on Jobup.ch. Results are deduplicated across queries. Leave empty and use searchUrls or directUrls instead.

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

Paste one or more Jobup.ch search URLs with pre-applied filters (e.g. category, region, employment type). The actor extracts all filters from the URL — the easiest way to scrape narrow segments.

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

Alias for searchUrls (Apify convention). Behaves identically. Provided for compatibility with Apify tools that inject startUrls.

## `directUrls` (type: `array`):

List of Jobup.ch job detail page URLs (https://www.jobup.ch/{lang}/jobs/detail/{id}/). Skips search and scrapes each URL directly. Useful for still-alive checks or targeted re-scrapes.

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

Search interface + detail page language. Note: Jobup.ch shows listings in all languages regardless of this setting; language mostly affects UI labels.

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

How to order results. 'newest' = most recently posted first (recommended for scheduled scrapes). 'relevance' = Jobup.ch default ranking (best for one-off keyword searches).

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

Fetch full job descriptions from detail pages (slower but returns description\_full, apply\_url, contact\_email, remote\_type). Disable for fast SERP-only scrapes.

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

Hard cap across all queries. Set to 0 for unlimited (per-query limited by maxResultsPerQuery). Jobup.ch caps each keyword at 400 total.

## `maxResultsPerQuery` (type: `integer`):

Cap per keyword. Example: 100 results × 3 queries = up to 300 items total (deduplicated). Set to 0 for unlimited per query.

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

Number of detail pages to fetch in parallel when includeJobDetails is enabled. Higher = faster but more proxy bandwidth. 1 = sequential.

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

Apify proxy settings. Jobup.ch's public API works from datacenter; residential is optional. Leave defaults for auto-proxy.

## Actor input object example

```json
{
  "searchQueries": [
    "developer"
  ],
  "searchUrls": [],
  "startUrls": [],
  "directUrls": [],
  "language": "de",
  "sortBy": "newest",
  "includeJobDetails": true,
  "maxResults": 0,
  "maxResultsPerQuery": 100,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobListings` (type: `string`):

Dataset containing scraped Jobup.ch job listings.

# 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": [
        "developer"
    ],
    "searchUrls": [],
    "startUrls": [],
    "directUrls": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("santamaria-automations/jobup-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 = {
    "searchQueries": ["developer"],
    "searchUrls": [],
    "startUrls": [],
    "directUrls": [],
}

# Run the Actor and wait for it to finish
run = client.actor("santamaria-automations/jobup-ch-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": [
    "developer"
  ],
  "searchUrls": [],
  "startUrls": [],
  "directUrls": []
}' |
apify call santamaria-automations/jobup-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,santamaria-automations/jobup-ch-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/CwC68cZlmqL5PZIDc/builds/RFOlzacxhMXMeIbDR/openapi.json
