# Switzerland Zefix · Company Directors (`corent1robert/switzerland-zefix-company-enrich`) Actor

Two jobs: find Swiss companies by name and canton, or enrich CHE UIDs you already have. Every row: legal form, seat, purpose, address, SHAB publications and named officers when the gazette lists them. Official Zefix — no login, no API key, not Moneyhouse.

- **URL**: https://apify.com/corent1robert/switzerland-zefix-company-enrich.md
- **Developed by:** [Corentin Robert](https://apify.com/corent1robert) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.49 / 1,000 swiss company — zefix register + shabs

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/platform/actors/running/actors-in-store#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

## Switzerland Zefix · Company Enrich

**Two jobs, one Actor.** Paste Swiss **UID** numbers (`CHE-…`) or search by **company name**.

| Job | You have… | You get… |
|-----|-----------|----------|
| **Enrich UIDs** | CHE numbers from your CRM | Official Zefix file for each ID still on the register |
| **Find companies** | A name (and optional canton) | Matching active companies from the central business name index |

**By default** every row is the **register file**: legal form, seat, address, purpose, SHAB / SOGC publications, and **named officers when the gazette lists them**.

This is **not** a SIRENE-style director file. Names come from SHAB text (`Eingetragene Personen`). Some rows have no named person — for example a domicile-only publication.

**No login. No API key. Official Zefix — not Moneyhouse.**

Built for: KYB / family offices · B2B DACH · compliance desks · CRM backfill on Swiss counterparties

***

### Who is this for?

| You are… | Typical goal | Suggested setup |
|----------|--------------|-----------------|
| KYB / onboarding analyst | Confirm UID, status, seat, purpose | **Enrich UIDs** · Quick look first |
| Family office / bank ops | SHAB mutations + named signatories when published | **Enrich UIDs** · KYB / SHAB view |
| B2B sales covering DACH | Named officers in a canton | **Find companies** · your name + canton · Call list |
| RevOps / data | Stable CHE columns for a CRM list | **Enrich UIDs** · bulk list · All matching |
| Journalist / researcher | Former names, branches, auditor | **Find companies** · KYB / SHAB view |
| Agency running Swiss outbound | First name + last name before the call | **Find companies** · Outreach / CRM view |

**What you get by default:** company name, UID, CH-ID, legal form, status, canton, seat, address, purpose, SHAB count and publications, auditor when listed, old names, branches, and officers parsed from the gazette when present.

**Zefix does not publish a company website, email or phone.** There is no website crawl in this version. Use the legal name + city in a contact enricher if you need inboxes.

***

### What it does

| Job | How it works | Best for |
|-----|--------------|----------|
| Enrich UIDs | Paste CHE numbers. Each ID is confirmed on Zefix. Unknown IDs are skipped and **not billed**. | CRM backfill, KYB |
| Find companies | Search the official name index. Optional canton filter (applied after search). | Territory lists |

Same output either way: **one row per company (UID)**.

***

### What it extracts

| Field | Description |
|-------|-------------|
| `uid` / `uidFormatted` | 9-digit UID and `CHE-xxx.xxx.xxx` |
| `chid` / `ehraid` | Commercial-register and Zefix internal IDs |
| `name` | Registered name |
| `legalForm` / `status` | Form (Corporation, LLC, sole proprietorship…) and Active / Deleted / In liquidation |
| `canton` / `legalSeat` | Canton (from the cantonal excerpt) and seat |
| `address` / `postalCode` / `city` | Domicile as published |
| `purpose` / `purposeShort` | Company purpose (short form for tables) |
| `directorName` / `directorFirstName` / `directorLastName` / `directorRole` | Primary officer from SHAB when listed |
| `directors[]` | All officers remaining after applying SHAB entries and departures |
| `auditor` | Audit firm when Zefix lists one |
| `oldNames` / `branches` | Former names and branch offices |
| `sogcPublications[]` / `sogcCount` | SHAB / SOGC publications |
| `zefixUrl` / `cantonalExcerptUrl` | Public Zefix page and cantonal excerpt |

Missing register fields are `null`. IDs **not on Zefix** are logged and **never billed**.

***

### Quick start

1. Open this Actor in Apify Console
2. Leave **Job** on **Enrich UIDs**
3. Keep `CHE-105.909.036` (Nestlé AG) or paste your list
4. Leave **How many** on **Quick look (25)**
5. Click **Start** — download JSON, CSV or Excel from the Dataset tab

Already have a name? Switch **Job** to **Find companies**, type `Migros`, optionally pick a canton, click **Start**.

***

### Ready-made examples

Saved Console tasks (same Actor, ready to run):

| Example | Job | View |
|---------|-----|------|
| [Enrich Nestlé UID](https://console.apify.com/actors/tasks/KPYoWemM7iCRG2QdB) | Enrich UIDs | Overview |
| [Find Migros in Zürich](https://console.apify.com/actors/tasks/3fhAfYSrCh5ec3Ps7) | Find companies | Overview |
| [Treuhand name sample](https://console.apify.com/actors/tasks/1uIOIBq4Sjr8X8aHj) | Find companies | Outreach / CRM |
| [Bulk CHE list](https://console.apify.com/actors/tasks/qJm5YGZo1vp3VKCVF) | Enrich UIDs | KYB / SHAB |

Store **Examples** tab landing pages go live after the Actor itself is public. Specs live in `published-tasks/`.

***

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `uids` | **Job.** `uids` = Enrich UIDs. `nameSearch` = Find companies. Pasting IDs also switches to Enrich. |
| `searchName` | string | — | Company name. Used in Find; ignored in Enrich. |
| `canton` | string | `all` | Two-letter canton or `all`. Applied after search. Ignored in Enrich. |
| `uids` | string\[] | Nestlé example | CHE UID list. Used in Enrich; ignored in Find. |
| `howMany` | string | `preview` | `preview` (25), `call_list` (250), `all` (up to 2,000) |

**API-only** (accepted in JSON, hidden from Console): `maxResults` (integer; `0` = search cap 2,000, overrides `howMany`), `verboseLogs`, `maxConcurrency` (default 4, max 8), `requestDelayMs` (default 200), `proxyConfiguration`.

#### JSON example (Enrich UIDs)

```json
{
  "mode": "uids",
  "uids": ["CHE-105.909.036"],
  "howMany": "preview"
}
```

#### JSON example (Find companies)

```json
{
  "mode": "nameSearch",
  "searchName": "Migros",
  "canton": "ZH",
  "howMany": "preview"
}
```

***

### Output sample

```json
{
  "uid": "105909036",
  "uidFormatted": "CHE-105.909.036",
  "name": "Nestlé AG",
  "legalForm": "Corporation",
  "status": "Active",
  "canton": "ZG",
  "legalSeat": "Cham",
  "address": "Zugerstrasse 8, 6330 Cham",
  "directorName": "Philippe Vossen",
  "directorRole": "Direktor",
  "auditor": "Ernst & Young SA",
  "sogcCount": 59,
  "source": "zefix"
}
```

Download in JSON, CSV, Excel or HTML from the Dataset tab. Use **Outreach / CRM** for first name / last name columns.

***

### How it works

1. Read the public Zefix central business name index (same data as [zefix.admin.ch](https://www.zefix.admin.ch))
2. Confirm each UID or collapse name hits to **one row per company**
3. Attach purpose, address, SHAB publications and parse named officers from gazette text
4. Push each row as soon as it is ready — you see data during the run

***

### How much does it cost?

HTTP-only (no browser). You pay per **unique company saved**. Not-found IDs are free.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Swiss company — Zefix register + SHAB | **$4.99 / 1k** | $4.49 | $3.99 | $3.49 |

| Scenario | Free | Bronze | Silver | Gold |
|----------|------|--------|--------|------|
| 25 companies (first test) | ~$0.12 | ~$0.11 | ~$0.10 | ~$0.09 |
| 1,000 companies | **$4.99** | $4.49 | $3.99 | $3.49 |

Higher Apify plans pay the same or less per row. Compute stays low because Zefix is open JSON. Residential proxies are **not** required.

Free Apify accounts are capped at **100 companies per run**.

Name search can return at most **2,000** hits (public search window). **All matching** uses that window.

***

### Is it legal to use Zefix?

This Actor only reads data that the **Federal Commercial Registry Office** already publishes as open data (Zefix). Officer names in SHAB publications are personal data: use them under GDPR / Swiss FADP and your own legitimate-interest basis. Do not spam. See also [Apify’s note on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

This is **not** Moneyhouse. We do not scrape credit scores, paid contact lists or the Moneyhouse paywall.

***

### Limitations

- **Officers are gazette text, not a live board file.** Fill is high on typical SMEs (~8 in 10 Treuhand rows in our sample had an `Eingetragene Personen` block) and can be empty on domicile-only notices.
- **No website, email or phone** on Zefix.
- **Canton filter is applied after search** (the public name index does not honour canton in the query).
- **Name search is a window of 2,000** — not a dump of every Swiss AG.
- Large **All matching** exports take longer. Default timeout is 1 hour.

***

### Same suite — company registers

- **[French Companies · Search & SIREN Enrich](https://apify.com/corent1robert/recherche-entreprises-scraper)** — France
- **[Belgium BCE/KBO](https://apify.com/corent1robert/belgium-bce-kbo-company-enrich)** — Belgium
- **[UK Companies House](https://apify.com/corent1robert/uk-companies-house-scraper)** — directors and PSC
- **[Germany Handelsregister](https://apify.com/corent1robert/germany-handelsregister-scraper)** — court + HRB
- **[Domain to SIREN](https://apify.com/corent1robert/domain-siren-scraper)** — website → confirmed SIREN
- **[RGE France](https://apify.com/corent1robert/rge-siren-enrich)** — certified artisans + named gérants

***

### FAQ

- **What is the difference between the two jobs?** **Find companies** builds a list from a name. **Enrich UIDs** confirms IDs you already have.
- **Is this the founder?** No. SHAB publishes people with signing authority when a mutation is filed. That may be a director, manager or owner — not a historical founder file.
- **Do I need a Zefix API password?** No. This Actor uses the same public index as the website.
- **Why is `directorName` empty?** The latest publications may not name a person (address change only). That row is still billed — you still received the register file.
- **Can I export a whole canton?** No. Pick a name (or paste UIDs). A canton-wide dump is out of scope.
- **What if an ID is unknown?** It is skipped and not billed.

***

### Local development

```bash
npm install
npm test
apify run --input-file=./input.json
```

`apify run` validates **`storage/key_value_stores/default/INPUT.json`** against the input schema **before** your code runs.

Output: Dataset in `storage/datasets/default/`, `RUN_LOG` in the default key-value store.

***

### Support

Contact <corentin@outreacher.fr> for custom territories, a private feed, or bulk exports.

Ready? Leave **Enrich UIDs**, keep the Nestlé example (or paste your CHE list), and click **Start**.

# Actor input Schema

## `mode` (type: `string`):

**Find companies** — type a company name and optional canton. Build a list from the official Zefix index.

**Enrich UIDs** — paste CHE numbers you already have. Keep only companies still on Zefix.

## `searchName` (type: `string`):

Name (or part of name) as on the commercial register. Example: `Migros`. **Ignored** in Enrich UIDs.

## `canton` (type: `string`):

Optional. Keep **All cantons** unless you cover one sales territory. Applied after the official search. **Ignored** in Enrich UIDs.

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

One Swiss **UID** per line (`CHE-105.909.036`, `CHE105909036`, or 9 digits). **Required** in Enrich UIDs; **ignored** in Find companies. Pasting IDs switches to Enrich automatically.

## `howMany` (type: `string`):

**Quick look** — 25 companies, under a minute.

**Call list** — 250 companies.

**All matching** — every Zefix hit for this run, up to 2,000 (the public search window).

## Actor input object example

```json
{
  "mode": "uids",
  "canton": "all",
  "uids": [
    "CHE-105.909.036"
  ],
  "howMany": "preview"
}
```

# Actor output Schema

## `overview` (type: `string`):

Name, UID, seat, form, named officer

## `kyb` (type: `string`):

Purpose, publications, auditor, excerpt

## `outreachCrm` (type: `string`):

Officer name + UID + seat

## `dataset` (type: `string`):

All rows

## `output` (type: `string`):

No description

## `runLog` (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 = {
    "mode": "uids",
    "canton": "all",
    "uids": [
        "CHE-105.909.036"
    ],
    "howMany": "preview"
};

// Run the Actor and wait for it to finish
const run = await client.actor("corent1robert/switzerland-zefix-company-enrich").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 = {
    "mode": "uids",
    "canton": "all",
    "uids": ["CHE-105.909.036"],
    "howMany": "preview",
}

# Run the Actor and wait for it to finish
run = client.actor("corent1robert/switzerland-zefix-company-enrich").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 '{
  "mode": "uids",
  "canton": "all",
  "uids": [
    "CHE-105.909.036"
  ],
  "howMany": "preview"
}' |
apify call corent1robert/switzerland-zefix-company-enrich --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,corent1robert/switzerland-zefix-company-enrich"
        }
    }
}

```

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/49Nr3EwbZJiNeznFj/builds/Bvj20wazdSUW6KTUA/openapi.json
