# Jobup.ch Scraper (`shahidirfan/jobup-ch-scraper`) Actor

Scrape Swiss job listings from Jobup.ch with job titles, companies, locations, salaries, descriptions, employment types, posting dates, and application URLs. Ideal for Switzerland job market research, recruitment intelligence, salary analysis, lead generation, and HR analytics.

- **URL**: https://apify.com/shahidirfan/jobup-ch-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **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/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

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

jobup.ch Jobs Scraper collects job listings from jobup.ch, the leading job platform for French-speaking Switzerland. Run it with a search URL, a keyword, or a location and get structured job data you can export to CSV, Excel, JSON, or a database.

The Actor returns job titles, companies, work locations, workload, salary ranges, posting dates, contract types, and full job descriptions.

### Why use jobup.ch Jobs Scraper?

- **Swiss job market data** - Track hiring activity across Geneva, Zurich, Lausanne, Bern, Basel, and other Swiss regions.
- **Recruiter and research workflows** - Study demand for specific skills, salary bands, and contract types.
- **Automation-ready output** - Export results to spreadsheets, databases, or your own tools.
- **Scheduled monitoring** - Refresh the dataset daily or weekly to follow new openings.
- **Clean records** - Empty fields are removed, so every saved item contains real values.

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

| Field              | Description                                   |
| ------------------ | --------------------------------------------- |
| `title`            | Job title                                     |
| `company`          | Hiring company name                           |
| `location`         | Full work location                            |
| `city`             | Work city                                     |
| `canton`           | Swiss canton or region                        |
| `employment_type`  | Permanent, temporary, internship, and similar |
| `workload`         | Workload percentage or range                  |
| `salary_min`       | Lower salary bound when published             |
| `salary_max`       | Upper salary bound when published             |
| `date_posted`      | Publication date                              |
| `description_text` | Full job description as plain text            |
| `job_url`          | Direct job page URL                           |

### How to use jobup.ch Jobs Scraper

1. Open the Actor on Apify Store.
2. Enter a Start URL, a Keyword, or a Location. Keyword and Location take precedence over the Start URL.
3. Set the maximum results and optional page limit.
4. Run the Actor.
5. Download the dataset or connect it to your workflow.

### Input Parameters

| Parameter            | Type    | Required | Default               | Description                                                   |
| -------------------- | ------- | -------- | --------------------- | ------------------------------------------------------------- |
| `startUrl`           | String  | No       | A jobup.ch search URL | A search, category, location, or job detail URL from jobup.ch |
| `keyword`            | String  | No       | -                     | Job title, skill, or phrase to search for                     |
| `location`           | String  | No       | -                     | Swiss city or region such as Geneva, Zurich, or Lausanne      |
| `results_wanted`     | Integer | No       | `20`                  | Maximum number of job listings to save                        |
| `max_pages`          | Integer | No       | `10`                  | Maximum number of result pages to read                        |
| `sort_by`            | String  | No       | `relevance`           | Sort by `relevance` or `newest`                               |
| `collect_details`    | Boolean | No       | `true`                | Open each job page for the full description and extra fields  |
| `proxyConfiguration` | Object  | No       | -                     | Optional proxy settings for the run                           |

When both a Start URL and a Keyword or Location are supplied, the Keyword and Location are used and the Start URL is ignored. To run a specific URL, leave Keyword and Location empty.

### Output Data

| Field                   | Type    | Description                                         |
| ----------------------- | ------- | --------------------------------------------------- |
| `job_id`                | String  | Unique jobup.ch job identifier                      |
| `title`                 | String  | Job title                                           |
| `company`               | String  | Hiring company name                                 |
| `company_url`           | String  | Company profile page on jobup.ch                    |
| `company_website`       | String  | Company website when listed                         |
| `company_logo`          | String  | Company logo URL                                    |
| `location`              | String  | Full work location                                  |
| `city`                  | String  | Work city                                           |
| `canton`                | String  | Swiss canton or region                              |
| `postal_code`           | String  | Postal code of the work location                    |
| `country`               | String  | Work location country                               |
| `latitude`              | Number  | Work location latitude                              |
| `longitude`             | Number  | Work location longitude                             |
| `date_posted`           | String  | Publication date                                    |
| `employment_type`       | String  | Contract type                                       |
| `employment_position`   | String  | Position level                                      |
| `workload`              | String  | Workload percentage or range                        |
| `salary_min`            | Number  | Lower salary bound when published                   |
| `salary_max`            | Number  | Upper salary bound when published                   |
| `salary_currency`       | String  | Salary currency                                     |
| `salary_period`         | String  | Salary period such as year                          |
| `occupational_category` | String  | Job category                                        |
| `description_html`      | String  | Full job description as clean HTML (text tags only) |
| `description_text`      | String  | Full job description as plain text                  |
| `job_url`               | String  | Direct job page URL                                 |
| `easy_apply`            | Boolean | Present when the listing offers easy apply          |
| `source`                | String  | Source website                                      |
| `scraped_at`            | String  | ISO timestamp for when the record was collected     |

Fields that have no value are removed from the saved item.

### Usage Examples

#### Keyword and location

Collect software engineering jobs in Geneva.

```json
{
    "keyword": "software engineer",
    "location": "Geneva",
    "results_wanted": 50,
    "max_pages": 3
}
```

#### Start URL

Collect jobs from a saved jobup.ch search URL.

```json
{
    "startUrl": "https://www.jobup.ch/en/jobs/?term=data%20analyst&location=Zurich",
    "results_wanted": 50,
    "collect_details": true
}
```

#### Category or region URL

Collect jobs from a jobup.ch category or region page, with the newest listings first.

```json
{
    "startUrl": "https://www.jobup.ch/en/jobs/it-telecommunications/",
    "sort_by": "newest",
    "results_wanted": 100,
    "collect_details": false
}
```

### Sample Output

```json
{
    "job_id": "0ea3ba54-8871-4bba-9667-467644e03839",
    "title": "PHP Software Engineer (Media)",
    "company": "INFOMANIAK NETWORK SA",
    "company_url": "https://www.jobup.ch/en/enterprises/605e3d1e-3bfa-4c78-8934-67cc8b9879d6-infomaniak-network-sa/",
    "company_website": "https://www.infomaniak.com",
    "location": "Rue Eugene-Marziano 25, 1227 Geneve, Geneve, CH",
    "city": "Geneve",
    "canton": "Geneve",
    "postal_code": "1227",
    "country": "CH",
    "latitude": 46.1914,
    "longitude": 6.13052,
    "date_posted": "2026-10-14T13:26:06+05:00",
    "employment_type": "Permanent position",
    "employment_position": "Position with responsibilities",
    "workload": "100%",
    "salary_min": 80450,
    "salary_max": 120450,
    "salary_currency": "CHF",
    "salary_period": "YEAR",
    "occupational_category": "IT / Telecommunications / Software Architecture",
    "description_text": "Turn your passion into meaningful work...",
    "job_url": "https://www.jobup.ch/en/jobs/detail/0ea3ba54-8871-4bba-9667-467644e03839/",
    "easy_apply": true,
    "source": "jobup.ch",
    "scraped_at": "2026-10-19T08:00:00.000Z"
}
```

### Tips for Best Results

- Start with a small result limit to confirm the input before running a larger job.
- Use a jobup.ch URL copied from your browser to keep the same search filters.
- Leave Keyword and Location empty when you want to run a Start URL.
- Use `collect_details: false` for large runs when you only need listing fields.
- Some jobs do not publish a salary, so salary fields can be absent.
- Public job pages change over time. Report unexpected changes through the Issues tab.

### Integrations

- **Google Sheets** - Send results to a spreadsheet for analysis.
- **Webhooks** - Trigger downstream workflows after each run.
- **Make or Zapier** - Connect results to no-code automations.
- **API** - Read datasets programmatically from your own systems.
- **CSV, Excel, and JSON** - Download the dataset in your preferred format.

### Frequently Asked Questions

#### Can I export jobup.ch job data to CSV or Excel?

Yes. Apify datasets can be downloaded in CSV, Excel, JSON, XML, and other supported formats.

#### Can I run this Actor on a schedule?

Yes. You can schedule the Actor in Apify Console to collect new jobs hourly, daily, or weekly.

#### Can I scrape a specific job URL?

Yes. Paste a jobup.ch job detail URL into `startUrl` and the Actor returns that single job.

#### Can I collect jobs from a jobup.ch category or region page?

Yes. Paste the category or region URL into `startUrl`. The Actor reads the filters from that page and collects matching jobs.

#### Why are some fields missing?

Some job listings do not publish a salary, coordinates, or company website. Empty fields are removed from the saved record.

#### Is this Actor suitable for non-technical users?

Yes. You can run it from Apify Console with form-based inputs and download the results without writing code.

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

Scraping public web data can be legal, but you are responsible for complying with applicable laws, website terms, and privacy rules.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate data collection from publicly available sources. Users are responsible for using the data responsibly and complying with applicable laws and website terms.

# Actor input Schema

## `startUrl` (type: `string`):

A jobup.ch search, category, location, or job detail URL. Used only when Keyword and Location are empty.

## `keyword` (type: `string`):

Job title, skill, or search phrase. Takes precedence over Start URL.

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

Swiss city or region, for example Geneva, Zurich, or Lausanne. Takes precedence over Start URL.

## `results_wanted` (type: `integer`):

Maximum number of job listings to save.

## `max_pages` (type: `integer`):

Maximum number of search result pages to read.

## `sort_by` (type: `string`):

Order of the collected listings.

## `collect_details` (type: `boolean`):

Open each job page to collect the full description and extra fields.

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

Optional proxy settings for the run.

## Actor input object example

```json
{
  "startUrl": "https://www.jobup.ch/en/jobs/?term=software%20engineer",
  "results_wanted": 20,
  "max_pages": 10,
  "sort_by": "relevance",
  "collect_details": true,
  "proxyConfiguration": {}
}
```

# 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 = {
    "startUrl": "https://www.jobup.ch/en/jobs/?term=software%20engineer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/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 = { "startUrl": "https://www.jobup.ch/en/jobs/?term=software%20engineer" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/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 '{
  "startUrl": "https://www.jobup.ch/en/jobs/?term=software%20engineer"
}' |
apify call shahidirfan/jobup-ch-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/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/oPB4tK4NtRSX1NwNh/builds/uzfXUWNMkqFhevBkf/openapi.json
