# jobs.ch Company Directory, All 86,995 of Them (`gubidonius/jobsch-companies`) Actor

Every employer listed on jobs.ch, with the address, coordinates and advert count from the profile. The directory cannot be browsed and its first index file stops at exactly 50,000, so this reads every file the site names and reports whether the count is complete.

- **URL**: https://apify.com/gubidonius/jobsch-companies.md
- **Developed by:** [Gregory Bolshakov](https://apify.com/gubidonius) (community)
- **Categories:** Business, Lead generation, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

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

## jobs.ch company directory

Every employer listed on jobs.ch. There were 86,995 of them on 13 September 2026.

Turn on the profile option and each company also gives you the real name, legal name, own
website, street address, postcode, town, map coordinates, the languages the profile is
published in, and how many adverts the company is running.

### The directory cannot be browsed

There is no page to walk. The company search renders its cards in the browser, so an HTTP
client gets none of them, and `/en/companies/` redirects to a page holding 8 companies.

The sitemaps are the only server side list of the directory. robots.txt names them itself.

### Why the count is 86,995 and not 50,000

The first company sitemap file holds exactly 50,000 entries. That is a round number and it
looks like an answer.

It is not. 50,000 is the cap the sitemap format puts on one file. There is a second file with
36,996 more companies in it, and the two do not overlap.

A scraper that reads the first file reports a Swiss company directory of 50,000 and is wrong by
36,995. This Actor reads every file the site names, and the run summary tells you whether the
count is complete or only a floor.

### A company with no adverts, and a company you cannot count

jobs.ch uses two different page titles for a company, and which one it uses is itself the
answer.

"Tellco Bank AG - 2 job offers on jobs.ch" carries the number. One advert gets the singular
wording, "1 job vacancy". A company with no adverts gets a different title entirely, "Company
profile from TradeXBank AG on jobs.ch", with no number in it.

So a 0 in `companyAdvertsOnJobsCh` means the page said the company has none. A null means the
title matched neither template and the number could not be read. `advertCountKnown` tells you
which. If you are building a list of employers who are hiring, that difference is the whole
job.

Of the first 8 companies matching "bank", four had adverts and four had none.

### The name in the listing is not the name

The sitemap carries URLs and nothing else. The listing row gives you `nameHintFromSlug`, taken
from the web address, so "hc-bienne-gastro-sa" becomes "hc bienne gastro sa".

That is not how the company writes itself, and this Actor does not dress it up into a title
cased name that would look real and be invented. For the company's own spelling, turn on the
profile option and read `companyName`.

### Cost

Both events cost 0.00001 USD. You are charged after rows are written, so a name filter that
matches nothing costs nothing.

With the profile option off the whole directory costs 3 requests. With it on, each company you
keep costs one more request, and the budget is checked before that request so you never pay for
a row that gets thrown away.

Run it with a name filter and the profile off first to see how many match. Then run it again
with the profile on and a budget.

### Companion Actors

jobsch-company-details takes the `profileUrl` column and opens one company at a time, with the
option to list its open adverts.

All measurements here are from 13 September 2026.

# Actor input Schema

## `nameContains` (type: `string`):

Keep only companies whose jobs.ch address contains this text, for example bank, spital, treuhand or sa. Matched against the company's URL slug, which is the only name the directory listing carries, so it is lower case and hyphenated: "credit-suisse" rather than "Credit Suisse". Leave it empty for the whole directory.

## `withProfile` (type: `boolean`):

Off, the run costs two requests and returns the directory listing: the company's id, URL and a name hint taken from the slug. On, each company kept costs one more request and the row gains the real company name, legal name, website, street address, postcode, town, coordinates, languages and how many adverts it has on jobs.ch. Turn this on with a small maxResults first.

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

How many companies to return at most. The directory held 86,995 companies on 13 September 2026, so a run with no name filter and no budget would open 86,995 profiles. The budget is checked before a row is kept.

## Actor input object example

```json
{
  "nameContains": "bank",
  "withProfile": true,
  "maxResults": 50
}
```

# Actor output Schema

## `results` (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 = {
    "nameContains": "bank",
    "withProfile": true,
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("gubidonius/jobsch-companies").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 = {
    "nameContains": "bank",
    "withProfile": True,
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("gubidonius/jobsch-companies").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 '{
  "nameContains": "bank",
  "withProfile": true,
  "maxResults": 50
}' |
apify call gubidonius/jobsch-companies --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gubidonius/jobsch-companies"
        }
    }
}
```

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/N7lxCd2fqUc5cOzyB/builds/hRPdhocd9FZJIjoPH/openapi.json
