# Zefix.ch Scraper - Swiss Commercial Register (`parsebird/zefix-ch-scraper`) Actor

Search the Swiss Central Business Names Index (Zefix) by company name, canton, or legal form. Get UID, legal form, registered seat, address, purpose, and SOGC publication date. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/zefix-ch-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 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?

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

### Zefix.ch Scraper - Swiss Commercial Register

Extract **company records from Zefix** — Switzerland's official Central Business Names Index (Zentraler Firmenindex), run by the Federal Statistical Office. **Zefix.ch Scraper** returns clean, structured JSON for every match: UID, legal form, registered seat, canton, status, full address, official purpose, and the date of its last SOGC/SHAB publication.

<table><tr>
<td style="border-left:4px solid #D8232A;padding:12px 16px;font-weight:600">
Search by company name or keyword, filter by canton and legal form, or paste Zefix search URLs directly — every result is enriched from its own registry entry for the full street address, postal code, and official purpose text.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Zefix.ch Scraper (parsebird/zefix-ch-scraper) searches the Swiss commercial register (Zefix). Inputs: searchQuery (string, min 2 characters, also accepts a UID like "CHE-111.730.652"), searchUrls (array of Zefix search URLs — name/canton/legalForm query params are read from each), canton (string — 2-letter code or DE/FR/EN full name, comma-separated for multiple, e.g. "ZH,BE"), legalForm (string — AG/GmbH/Verein/Stiftung/etc, comma-separated), activeOnly (boolean, default true — excludes deleted companies), maxResults (integer, default 100, max 2000), includeDetails (boolean, default true — fetches each company's registry entry for purpose/address/postal code/city), proxyConfiguration (Apify proxy, default — Zefix has no anti-bot protection). Output per company: uid (CHE-xxx.xxx.xxx), name, legal_form, legal_seat, canton, status (active/in_liquidation/deleted), purpose, address, postal_code, city, sogc_date, register_office, registry_href, source_url, source_platform, scraped_at. Pricing: pay-per-event, two events — "company-scraped" ($0.99/1k Free down to $0.79/1k Gold) fires for every row, "company-detail" ($2.99/1k Free down to $1.49/1k Gold) fires additionally when a row is enriched with the full registry entry. API: https://apify.com/parsebird/zefix-ch-scraper/api - Token: https://console.apify.com/account/integrations
```

### What is Zefix.ch Scraper?

**Zefix.ch Scraper** is an Apify Actor that extracts company data from [Zefix](https://www.zefix.ch), the Swiss Central Business Names Index maintained by the Federal Statistical Office on behalf of all 26 cantonal commercial registries. Give it a company name, a UID, or a canton/legal-form filter, and it returns every matching company as structured JSON — the same data shown on the public zefix.ch website, plus each company's full registered address and official purpose text.

Zefix has no public search API of its own for third parties; this Actor calls the same public JSON endpoint the zefix.ch website itself uses to render search results, so it works as a practical **Zefix API alternative** without scraping HTML.

### What can Zefix.ch Scraper do?

- 🔍 **Name/keyword search** — matches anywhere in the company name; also accepts a UID directly (e.g. `CHE-111.730.652`).
- 🇨🇭 **Canton filtering** — restrict results to one or more of Switzerland's 26 cantons, by code or full name in German, French, or English.
- ⚖️ **Legal form filtering** — AG, GmbH, Einzelunternehmen, Kollektivgesellschaft, Kommanditgesellschaft, Genossenschaft, Verein, Stiftung, Zweigniederlassung, and more.
- 🟢 **Active-only or full history** — exclude deleted companies by default, or include them to see the full historical register.
- 🔗 **Search URL mode** — paste one or more `zefix.ch/en/search/entity/list?...` URLs directly; canton and legal form filters are read straight from the URL.
- 📄 **Full registry detail** — every result is enriched from its own registry entry for the complete official purpose text, street address, postal code, and city.
- ⚡ Runs on Apify with scheduling, API access, integrations, and export to JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Zefix?

| Field | Description |
|-------|-------------|
| `uid` | Swiss company UID, formatted `CHE-xxx.xxx.xxx` |
| `name` | Official registered company name |
| `legal_form` | Legal form short code (`AG`, `GmbH`, `Verein`, `Stiftung`, ...) |
| `legal_seat` | Registered seat (municipality) |
| `canton` | Canton code (`ZH`, `BE`, `GE`, ...) |
| `status` | `active`, `in_liquidation`, or `deleted` |
| `purpose` | Official company purpose text, as filed with the registry |
| `address` | Full registered street address |
| `postal_code` / `city` | Swiss postal code and city |
| `sogc_date` | Date of the company's last SOGC/SHAB (Swiss Official Gazette of Commerce) publication |
| `register_office` | Name of the cantonal commercial registry office |
| `registry_href` | Direct link to the cantonal registry excerpt |
| `source_url` / `source_platform` | Zefix detail-page URL and `"zefix.ch"` |
| `scraped_at` | ISO 8601 scrape timestamp |

`purpose`, `address`, `postal_code`, and `city` require a registry-detail fetch (see `includeDetails` below) — every other field comes straight from the search result.

### How to scrape Zefix

1. Open [Zefix.ch Scraper](https://apify.com/parsebird/zefix-ch-scraper) on Apify Store and click **Try for free**.
2. Enter a **Search query** (company name, keyword, or UID).
3. (Optional) Restrict to a **Canton** and/or **Legal form**, and set **Max results**.
4. (Optional) Use **Search URLs** instead, to run one or more Zefix search links directly.
5. Click **Start**, then open the **Dataset** tab. Export as JSON, CSV, Excel, HTML, or XML.

#### Input example — name + canton + legal form

```json
{
    "searchQuery": "software",
    "canton": "ZH",
    "legalForm": "AG",
    "activeOnly": true,
    "maxResults": 50
}
```

#### Input example — search URL

```json
{
    "searchUrls": [
        "https://www.zefix.ch/en/search/entity/list?name=consulting&searchType=exact&canton=BE"
    ],
    "maxResults": 100
}
```

#### Input example — search-level fields only (cheaper)

```json
{
    "searchQuery": "consulting",
    "canton": "Vaud",
    "maxResults": 200,
    "includeDetails": false
}
```

### Output example

```json
{
    "uid": "CHE-209.993.214",
    "name": "2S-Software AG",
    "legal_form": "AG",
    "legal_seat": "Stammheim",
    "canton": "ZH",
    "status": "active",
    "purpose": "Die Gesellschaft bezweckt die Erbringung von Dienstleistungen im Bereich Informations- und Kommunikationstechnologie...",
    "address": "Heerenweg 7",
    "postal_code": "8476",
    "city": "Unterstammheim",
    "sogc_date": "2022-02-11",
    "register_office": "Handelsregisteramt des Kantons Zürich",
    "registry_href": "https://zh.chregister.ch/cr-portal/auszug/auszug.xhtml?uid=CHE-209.993.214",
    "source_url": "https://www.zefix.ch/en/search/entity/list/firm/1523485",
    "source_platform": "zefix.ch",
    "scraped_at": "2026-09-05T12:00:00Z"
}
```

Download the dataset in JSON, CSV, Excel, HTML, or XML from the [Dataset tab](https://docs.apify.com/platform/storage/dataset).

### Swiss canton codes

| Code | Canton | Code | Canton |
|------|--------|------|--------|
| AG | Aargau | NW | Nidwalden |
| AI | Appenzell Innerrhoden | OW | Obwalden |
| AR | Appenzell Ausserrhoden | SG | St. Gallen |
| BE | Bern | SH | Schaffhausen |
| BL | Basel-Landschaft | SO | Solothurn |
| BS | Basel-Stadt | SZ | Schwyz |
| FR | Fribourg | TG | Thurgau |
| GE | Genève | TI | Ticino |
| GL | Glarus | UR | Uri |
| GR | Graubünden | VD | Vaud |
| JU | Jura | VS | Valais |
| LU | Luzern | ZG | Zug |
| NE | Neuchâtel | ZH | Zürich |

Pass these in `canton` as the code or the full German/French/English name (e.g. `"ZH"`, `"Zurich"`, `"Zürich"` all work), comma-separated for multiple cantons. Leave empty to search all cantons.

### Legal forms

`AG` (Aktiengesellschaft / SA / Corporation), `GmbH` (Sàrl / LLC), `Einzelunternehmen` (sole proprietorship), `Kollektivgesellschaft` (general partnership), `Kommanditgesellschaft` (limited partnership), `Genossenschaft` (cooperative), `Verein` (association), `Stiftung` (foundation), `Zweigniederlassung` (branch), and a handful of rarer forms (foreign branch, investment companies, etc.). The German short code, full German/French/Italian/English name, and common abbreviations (`SA`, `Sàrl`, `Ltd`, `LLC`, ...) are all accepted in `legalForm`.

### Use cases

- 🏢 **Company research & due diligence** — verify a Swiss company's legal status, registered address, and official purpose before doing business.
- 📊 **Market mapping** — pull every registered company for a canton and legal form combination (e.g. all Zurich AGs matching a keyword) to build a prospect list.
- 🔁 **Monitoring** — re-run a saved search on a schedule to catch newly registered companies or status changes (new entries, liquidations).
- 🤖 **AI & data pipelines** — feed structured Swiss registry data into LLM agents through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### How it works

1. The Actor builds a search request from your `searchQuery`/`canton`/`legalForm`, or reads them straight out of each `searchUrls` entry.
2. It calls Zefix's own public search endpoint (the same one the website uses) and returns matches up to `maxResults`.
3. If `includeDetails` is on, each result's own registry entry is fetched concurrently for the official purpose text and full street address.
4. Duplicate companies (by UID) across multiple queries are only pushed once.
5. Each company is billed as one `company-scraped` event; a detail-enriched company is additionally billed one `company-detail` event.

### How much does it cost to scrape Zefix.ch?

Zefix.ch Scraper uses **pay-per-event** pricing with two events.

| Event | When it fires | Free | Bronze | Silver | Gold |
|-------|---------------|------|--------|--------|------|
| `company-scraped` | Every company row | $0.99 / 1k | $0.89 / 1k | $0.89 / 1k | $0.79 / 1k |
| `company-detail` | Extra, per detail-enriched row (full registry data: purpose, full address, SOGC date) | $2.99 / 1k | $2.49 / 1k | $1.99 / 1k | $1.49 / 1k |

A search-only run (`includeDetails: false`) of 1,000 companies costs about **$0.99** on the Free plan. The default run, with full registry details included, costs about **$3.98** per 1,000 companies. Apify platform usage (compute) is billed separately — Zefix has no anti-bot protection, so runs are fast and use very little platform credit. See the [Apify pricing page](https://apify.com/pricing).

### API usage examples

Run Zefix.ch Scraper with the [Apify API](https://docs.apify.com/api/v2).

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "searchQuery": "software",
    "canton": "ZH",
    "legalForm": "AG",
    "maxResults": 100,
}

run = client.actor("parsebird/zefix-ch-scraper").call(run_input=run_input)

for company in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(company["name"], "-", company["uid"], "-", company["canton"])
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('parsebird/zefix-ch-scraper').call({
    searchQuery: 'consulting',
    canton: 'Bern',
    maxResults: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((c) => `${c.name} (${c.uid})`));
```

Connect finished datasets to [Google Sheets](https://docs.apify.com/platform/integrations/google-sheets), [Slack](https://docs.apify.com/platform/integrations/slack), [Zapier](https://docs.apify.com/platform/integrations/zapier), [Make](https://docs.apify.com/platform/integrations/make), webhooks, or your own pipeline.

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

Zefix.ch Scraper reads only publicly visible data — the same company records any visitor sees on [zefix.ch](https://www.zefix.ch), a public Swiss government register. It does not log in or access private account data. You should still review Zefix's Terms of Use and make sure your use case complies with applicable laws. For background, read Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

### Related Actors

- [FirmenABC.at Scraper](https://apify.com/parsebird/firmenabc-at-scraper) — Austrian company data.
- [Job-Room.ch Jobs Scraper](https://apify.com/parsebird/job-room-ch-jobs-scraper) — Swiss job listings from arbeit.swiss.
- [UK Companies House Scraper](https://apify.com/parsebird/uk-companies-house-scraper) — UK company register data.
- [Website Contact Finder](https://apify.com/parsebird/website-contact-finder) — Emails, phones, and socials from any list of websites.

### FAQ

**Do I need a Zefix account or API key?**
No. The Actor uses Zefix's own public search data — no login or API key.

**Why is Apify Proxy used by default if Zefix has no anti-bot protection?**
It's set as a sensible default for IP hygiene on sustained/scheduled runs, not because it's required — every test for this Actor passed identically with no proxy at all.

**Why do I get fewer results than the total shown, even below my Max results?**
Zefix's public search endpoint has no working pagination (its `offset` parameter is accepted but ignored) — a single request returns up to 2,000 matches. If your query has more matches than that, narrow it with a canton or legal form filter, or split it into more specific queries.

**What's the minimum search query length?**
2 characters. Shorter queries are rejected by Zefix's own API and are skipped with a warning in the log.

**Can I search by UID instead of name?**
Yes — put the UID (formatted like `CHE-111.730.652`, or without the dashes) in `searchQuery`.

**What does `includeDetails: false` skip?**
The `purpose`, `address`, `postal_code`, and `city` fields — everything else (UID, name, legal form, canton, status, SOGC date, registry link) still comes from the search result at no extra charge.

**Can I schedule recurring runs?**
Yes. Use Apify [schedules](https://docs.apify.com/platform/schedules) to re-run a saved search and catch newly registered companies.

**Something looks wrong or missing.**
Report it on the [Issues tab](https://apify.com/parsebird/zefix-ch-scraper/issues) and it will be looked at quickly.

# Actor input Schema

## `searchQuery` (type: `string`):

Company name or keyword to search (minimum 2 characters). Also accepts a UID, e.g. "CHE-111.730.652". Matches anywhere in the company name.

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

Zefix search URLs with parameters, e.g. https://www.zefix.ch/en/search/entity/list?name=consulting\&canton=BE. The name, canton and legalForm query parameters are read from each URL. Combined with Search query if both are set.

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

Filter by canton. Accepts the 2-letter code (ZH, BE, GE, ...) or the full name in German, French or English. Comma-separate multiple cantons. See the README for the full 26-canton table.

## `legalForm` (type: `string`):

Filter by legal form: AG, GmbH, Einzelunternehmen, Kollektivgesellschaft, Kommanditgesellschaft, Genossenschaft, Verein, Stiftung, Zweigniederlassung (or the French/Italian/English equivalent, e.g. SA, Sàrl, Ltd, LLC). Comma-separate multiple forms.

## `activeOnly` (type: `boolean`):

Only include active companies (EXISTIEREND / in liquidation). Turn off to also include deleted (GELOESCHT) companies.

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

Maximum number of companies to return, combined across Search query and Search URLs.

## `includeDetails` (type: `boolean`):

Fetch each company's registry entry for its purpose, full street address, postal code and city. Off = search-level fields only (UID, name, legal form, canton, status, SOGC date). Detail records are billed at a higher rate — see Pricing.

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

Zefix.ch has no anti-bot protection and works fine without a proxy, but Apify proxy is used by default for IP hygiene on sustained runs.

## Actor input object example

```json
{
  "searchQuery": "software",
  "searchUrls": [],
  "canton": "ZH",
  "legalForm": "AG",
  "activeOnly": true,
  "maxResults": 50,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "searchQuery": "software",
    "canton": "ZH",
    "legalForm": "AG",
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/zefix-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 = {
    "searchQuery": "software",
    "canton": "ZH",
    "legalForm": "AG",
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/zefix-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 '{
  "searchQuery": "software",
  "canton": "ZH",
  "legalForm": "AG",
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/zefix-ch-scraper --silent --output-dataset

```

## MCP server setup

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