# Zefix Scraper: Swiss Company Register Search to Excel (`alpine-data/swiss-company-register`) Actor

Zefix scraper for the Swiss company register (Handelsregister): search by name, activity or canton, get UID, legal form and address as Excel.

- **URL**: https://apify.com/alpine-data/swiss-company-register.md
- **Developed by:** [Alpine Data Labs](https://apify.com/alpine-data) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.04 / 1,000 companies

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?

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

## Zefix Scraper: Swiss company register search and company lists as Excel

Get lists of **active Swiss companies** from the **official commercial register (Zefix)** and download them as **Excel, CSV or JSON**. No coding, no login, no API key: type a word, pick a canton, click **Start**, download. You can also **check UIDs in bulk**.

### How to search the Swiss company register in 4 steps (no code)

1. **Type a word** from the company name (e.g. `treuhand`) or its business activity (e.g. `software`), and pick a **canton** (e.g. *Zug*) if you like. The form is already filled in with a working example.
2. Click **Start**. Most runs take 5–60 seconds; searches with no match end after about 15–25 seconds and cost nothing. **Note: Start with the pre-filled example is a small paid run:** up to 100 companies × $0.0038 = at most $0.38. An empty input runs a smaller example (20 Treuhand companies in Zug, about $0.08).
3. Open the **Output** tab and click **Export** to download **Excel** or **CSV**.
4. **Optional: automate it.** Save your search as a *Task* and add a *Schedule* (e.g. weekly) to get new companies regularly. Send results to Google Sheets, Make, Zapier or n8n via the *Integrations* tab. No code needed.

### What you get: a Swiss company list with UID, address and purpose

| Company | UID | Legal form | Address | Canton | Business purpose | Link |
|---|---|---|---|---|---|---|
| Toneatti Treuhand GmbH | CHE-116.310.872 | GmbH | Grabenstrasse 5A, 6340 Baar | ZG | die Führung eines Treuhandbüros, insbesondere Jahresabschlüsse, Steuer… | [Zefix](https://www.zefix.ch/en/search/entity/list/firm/1001679) |
| GA1 Treuhand GmbH | CHE-116.316.320 | GmbH | Eichstrasse 6 A, 6330 Cham | ZG | Ausübung und Erbringung von treuhänderischen Dienstleistungen aller Ar… | [Zefix](https://www.zefix.ch/en/search/entity/list/firm/1001972) |
| H & P Treuhand und Verwaltung AG | CHE-168.043.342 | AG | Haldenstrasse 5, 6340 Baar | ZG | Organisation und Unterstützung bei Umsiedlungen von Gesellschaften und… | [Zefix](https://www.zefix.ch/en/search/entity/list/firm/1010008) |

*(Real rows from a test run on 23 Oct 2026 with the pre-filled example.)* Every row also has name translations, CH-ID, the full legal form in German and French, the municipality number and a link to the UID register (see the *All details* view).

> **Schedule it daily:** click **Schedule** (or *Saved tasks → Schedule*) to refresh your list every morning, e.g. to spot newly registered companies in your canton and industry. Connect email, Google Sheets, Slack or Zapier/Make under *Integrations*.

### List of Swiss companies by canton and industry

Build a list of Swiss companies for one canton (e.g. Zürich, Bern, Vaud) and an activity or industry keyword (e.g. *Treuhand*, *software*, *Bäckerei*). You get the matching active companies from the official Swiss company register (Zefix / Handelsregister) with UID, legal form, address and canton, ready for Excel or your CRM. *Max companies* (default 100, up to 50,000) caps the list and the cost.

### Handelsregister Schweiz: Firmensuche und Firmenliste ohne Programmieren

Der Actor durchsucht das **Handelsregister der Schweiz** (Zefix-Daten) nach Firmenname oder Zweck, z. B. alle Treuhand-Firmen im Kanton Zug oder alle Software-Firmen in Zürich. Ergebnis: eine **Firmenliste Schweiz** mit UID, Rechtsform, Adresse und Zweck als **Excel**. **UID-Nummern prüfen** geht auch in grossen Mengen: UIDs einfügen, Start klicken.

### Typical uses

- **Lead lists** by industry and region, e.g. all `Photovoltaik` companies in canton Bern
- **Check suppliers or customers (KYB)**: paste UIDs and see if each company is registered and active, with its official name and address
- **Market research**: how many GmbHs in Zurich mention `software` in their purpose?

### Input fields in plain words

![Zefix scraper input form: Swiss company register search by name, activity or canton](https://api.apify.com/v2/key-value-stores/jVsR1fgZbtwc50gQM/records/swiss-company-register-input-form)

| Field | What it does | Example |
|---|---|---|
| **Company name contains** | Finds companies whose name contains *any* of these words. Upper/lower case does not matter. | treuhand |
| **Business activity (purpose) contains** | Searches the registered business purpose. German, French or Italian words find the most. | software, Photovoltaik |
| **Canton** | One or more cantons. Leave empty for all of Switzerland. `Zürich`, `Genf`, `Kanton Zug` and `ZH` all work. | Zug |
| **Max companies (cost limit)** | The run stops here, so you never pay more than you expect. | 100 (max. $0.38) |
| **Look up companies by UID** | Paste UIDs in any format: `CHE-105.841.533`, `CHE105841533`, `105841533` or `CHE-105.841.533 MWST`. | CHE-105.841.533 |
| *Advanced:* Postal codes | 4-digit postal codes. `8001 Zürich` or `CH-8001` also work. | 8001, 6300 |
| *Advanced:* Legal form | Pick from the list, or type `AG`, `GmbH`, `Sàrl`, `Verein`, `Stiftung` or a code like `0106`. | AG, GmbH |
| *Advanced:* Include sole proprietorships | Off by default (see *Data protection*). | off |

If you start the Actor with **no filter at all**, it runs a small example search (20 Treuhand companies in Zug, about $0.08) so you can see what the output looks like.

### Output fields

![Swiss company register (Zefix) example output: companies with UID, legal form, canton and address](https://api.apify.com/v2/key-value-stores/jVsR1fgZbtwc50gQM/records/swiss-company-register-example-output)

`name`, `nameTranslations`, `uid` (CHE-xxx.xxx.xxx), `chid`, `zefixCompanyId`, `legalFormShort` (e.g. *GmbH*), `legalForm`, `legalFormFr`, `legalFormCode` (eCH-0097 code, e.g. `0107`), `purpose`, `street`, `postalCode`, `city`, `canton`, `municipalityBfsId`, `zefixUrl`, `uidRegisterUrl`, `linkedDataUri`, `source`.

### Pricing

Pay per result: **$0.0038 per company** returned, which is **$3.80 per 1,000 companies**. There is no start fee. A UID lookup with 10 UIDs costs about $0.04.

These are **launch prices** while the Actor builds its first user base. If prices change, Apify notifies existing users in advance, as its rules require. Platform usage is included in the price.

Higher Apify plans pay less: SILVER 10 % off, GOLD and above 20 % off.

### FAQ and common mistakes

**How do I check a Swiss UID number (UID Nummer prüfen)?** Paste one or many UIDs into *Look up companies by UID* (one per line, `CHE-105.841.533` or `CHE105841533`) and click **Start**. Each row shows whether the company is active, plus name, legal form and address. Typos are detected via the check digit and are free.

**Can I get a list of all companies in a canton or town?** Yes. Pick the canton, or type postal codes under *Advanced*, and set *Max companies* high enough. Leave the name empty but type a business activity (e.g. `software`), or use a broad word.

**I got 0 results. What now?** Use a shorter word: `treuhand` instead of `Treuhand AG Zürich`. Remove the postal code or legal form filter. Try the German word (`Reinigung`) as well as the French one (`nettoyage`). Runs with 0 results cost nothing.

**My UID is "not found".** The register contains **active companies only**. Deleted or merged companies are not included. UIDs that are not found are not charged.

**My UID is "invalid".** A Swiss UID has 9 digits and a check digit. If the check digit does not match, you probably have a typo. Invalid UIDs are skipped, reported in the status message and not charged. If none of the UIDs is valid, the run stops and nothing is charged.

**I typed "Zürich" / "Genf" / "zh". Is that OK?** Yes. Canton names in German, French, Italian or English, and the 2-letter codes, are all understood. If a canton cannot be recognised, the run stops with a message telling you what to fix, and nothing is charged.

**Can I get directors, signatories or share capital?** No. The open dataset does not contain them.

**Is this the official register?** The data comes from the official Zefix open dataset of the Federal Office of Justice. Legally binding extracts are still issued only by the cantonal commercial registers.

**How many companies can I get?** There is no hard cap. Set *Max companies*. Large searches (1,000+ companies) finish in about a minute.

**Zefix vs. Moneyhouse: what is the difference?**
Zefix is the official, free central index of the Swiss commercial register run by the federal government. This actor reads the official Zefix open data (published by the federal government on ld.admin.ch). Moneyhouse is a private service that re-publishes register data with extra information, partly behind a paywall. For bulk company lists with UID and address, Zefix data is the primary source.

### Data protection

The open dataset contains **company-level data only** (no directors, no signatories). **Sole proprietorships are excluded by default**, because their names usually include a private person's name. You can include them explicitly; you are then responsible for having a lawful basis under the Swiss FADP/GDPR. Electronic marketing to companies may require prior consent (e.g. Swiss UWG Art. 3 o, EU ePrivacy rules).

### Limits

- **Active companies only.** Deleted entities are not in the open dataset.
- No share capital, officers or SOGC publications.
- If ld.admin.ch is unreachable, the run stops with a clear message and nothing is charged. If only some requests fail, the status message says so.
- The data is updated daily by the FOJ. This Actor is not affiliated with the Swiss Confederation.

### Data source

Federal Office of Justice FOJ, Zefix central business name index, via the federal **LINDAS linked-data endpoint (ld.admin.ch)** and opendata.swiss (no website scraping). Terms: *Open use. Must provide the source.* Every row includes a `source` field.

### Related tools from Alpine Data Labs

- [Crypto Arbitrage Scanner](https://apify.com/alpine-data/crypto-spread-scanner): exchange spreads for one coin on 20 exchanges, net of fees, as Excel.
- [Honeypot & Rug Pull Checker](https://apify.com/alpine-data/token-risk-scanner): token risk score (0-100) and honeypot/rug pull flags for Ethereum, BSC, Base and Solana.
- [TED Tenders Scraper](https://apify.com/alpine-data/ted-tender-monitor): EU public procurement notices and daily tender alerts as Excel.
- [Career Page Job Scraper](https://apify.com/alpine-data/career-site-jobs): every open job from Greenhouse, Lever, Workday, Ashby and Personio, plus hiring signals.
- [All tools from Alpine Data Labs](https://apify.com/alpine-data): no-code data tools for public data, business research and monitoring.

### For developers: API & integrations

Everything in the form is also available via the API, with the same field names. Old inputs keep working; new fields are optional.

**Input JSON example**

```json
{
  "nameContains": ["treuhand"],
  "purposeContains": [],
  "cantons": ["ZG"],
  "maxResults": 100
}
```

More examples:

- AGs and GmbHs in Zug with "blockchain" in their purpose: `{ "purposeContains": ["blockchain"], "cantons": ["ZG"], "legalForms": ["AG", "GmbH"], "maxResults": 500 }`
- Check UIDs: `{ "uids": ["CHE-105.841.533", "CHE-116.310.872"] }`

The API is forgiving too: `"cantons": ["Zürich", "genf"]`, `"legalForms": ["0106"]` or `"nameContains": ["treuhand, immobilien"]` (comma-separated in one line) work as well.

**cURL** (run and get the results in one call):

```bash
curl -X POST "https://api.apify.com/v2/acts/alpine-data~swiss-company-register/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"nameContains": ["treuhand"], "maxResults": 10}'
```

**JavaScript** (`npm i apify-client`):

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('alpine-data/swiss-company-register').call({"nameContains": ["treuhand"], "maxResults": 10});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("alpine-data/swiss-company-register").call(run_input={"nameContains": ["treuhand"], "maxResults": 10})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

**Webhooks, schedules and no-code tools:** add a webhook (event *Run succeeded*) in the *Integrations* tab to call your own URL when a run finishes, or use the official Apify apps for **Make, Zapier and n8n** (action *Run Actor*, then *Get dataset items*). Schedules work for API users too. AI agents can call this Actor via the **Apify MCP server** (mcp.apify.com).

### Support

Found a bug, need a field or another filter? Open an issue in the **Issues** tab of this Actor page. Alpine Data Labs answers there, usually within one working day.

Built and maintained by **Alpine Data Labs**.

# Actor input Schema

## `nameContains` (type: `array`):

Finds companies whose name contains ANY of these words (upper/lower case does not matter). Example: treuhand, immobilien. One word per line; commas also work. Tip: shorter words find more ('treuhand' also finds 'Treuhand AG').

## `purposeContains` (type: `array`):

Searches the registered business purpose ('Zweck'). Great for target lists by industry. Example: software, Photovoltaik, blockchain. Searching in German, French or Italian finds the most companies.

## `cantons` (type: `array`):

Pick one or more cantons. Example: Zug. Leave empty for all of Switzerland. You can also type names or codes such as Zürich, Genf or ZH.

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

The run stops after this many companies, so you never pay more than you expect. Example: 100 companies cost at most $0.38 ($0.0038 each).

## `uids` (type: `array`):

One UID per line (commas also work). All formats work: CHE-105.841.533, CHE105841533, 105841533 or 'CHE-105.841.533 MWST'. A UID with a typo (wrong check digit) is reported and not charged.

## `postalCodes` (type: `array`):

Swiss 4-digit postal codes of the registered address. Example: 8001, 6300. '8001 Zürich' or 'CH-8001' also work.

## `legalForms` (type: `array`):

Only companies with these legal forms. Example: AG and GmbH. Leave empty for all (sole proprietorships are excluded unless you switch them on below). You can also type AG, GmbH, Sàrl, Verein or the code 0106.

## `includeSoleProprietorships` (type: `boolean`):

Names of sole proprietorships usually contain a private person's name, so they are excluded by default for data-protection reasons. Switch on only if you have a lawful reason. Example: off.

## Actor input object example

```json
{
  "nameContains": [
    "treuhand"
  ],
  "cantons": [
    "ZG"
  ],
  "maxResults": 100,
  "includeSoleProprietorships": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per active Swiss company: name, UID, legal form, street, postal code, city, canton, business purpose and Zefix link. Open the 'All details' view for translations, CH-ID and more.

# 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": [
        "treuhand"
    ],
    "cantons": [
        "ZG"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("alpine-data/swiss-company-register").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": ["treuhand"],
    "cantons": ["ZG"],
}

# Run the Actor and wait for it to finish
run = client.actor("alpine-data/swiss-company-register").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": [
    "treuhand"
  ],
  "cantons": [
    "ZG"
  ]
}' |
apify call alpine-data/swiss-company-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,alpine-data/swiss-company-register"
        }
    }
}
```

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/S0kSsXgdQTrbWnqCX/builds/916kkPjQ98fki2dyZ/openapi.json
