# Swiss Commercial Register Scraper — Companies & Bankruptcies (`publicdata/shab-swiss-company-gazette`) Actor

Swiss company register events from the Official Gazette of Commerce (SHAB/FOSC): new company registrations, changes, deletions, bankruptcies and insolvency filings with name, UID, seat, legal form, purpose and capital. The daily event feed that Zefix snapshots do not give you.

- **URL**: https://apify.com/publicdata/shab-swiss-company-gazette.md
- **Developed by:** [Riccardo](https://apify.com/publicdata) (community)
- **Categories:** Lead generation, Business, Other
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Swiss Commercial Register Gazette (SHAB/FOSC) — bankruptcies, new companies and register changes

**Find out the day a Swiss company is founded, changes its name, seat or capital, is struck off the register, or goes bankrupt — without anyone on your team reading the gazette.**

It turns the daily feed of the Swiss Official Gazette of Commerce (Schweizerisches Handelsamtsblatt SHAB, Feuille officielle suisse du commerce FOSC, Foglio ufficiale svizzero di commercio FUSC) into JSON, CSV or Excel rows, read from the official amtsblattportal.ch API — no login, no proxies, no browser. Filter by canton, publication type, date window and keyword — a company name, a town or a UID such as `CHE-123.456.789`.

### What you get

**Every publication carries:** `publicationNumber`, `publicationDate`, `rubric`, **`subRubric` and `subRubricLabel`** (for example `HR01` / "New registration"), `cantons`, `language`, `journalNumber`, `journalDate`, `titles` (DE/FR/IT/EN), `registrationOffice`, `legalRemedy`, `lastPublication` (the entity's previous gazette entry), `publicationUrl`, `xmlUrl`, `publicationId` and `source`. **`publicationText`** holds the complete official text.

**Commercial-register events (Handelsregister Schweiz — HR01 new registrations / Neueintragungen, HR02 changes, HR03 deletions)** add structured fields when `includeContent` is on: **`companyName`**, **`uid`** (the Swiss business identification number, CHE-…), `seat`, `legalFormCode` and `legalFormLabel`, `purpose`, and a `company` block with address, nominal and paid-in capital, audit opting-out and code13. Changes also carry **`companyBefore`** — the record as it stood before — and **`changes`**, boolean flags for what moved (`nameChanged`, `seatChanged`, `addressChanged`, `purposeChanged`, `capitalChanged` and more). `transactionType` is `registration`, `update` or `delete`; `deletionDate` is filled for HR03.

**Insolvency and other business rubrics in the same run:** **KK bankruptcies (Konkurse)**, LS liquidation calls to creditors, NA composition proceedings, SR corporate-law calls, UP notices to shareholders, FM financial-market notices, AB working-time permits, EK precious-metal marks. These carry title, cantons, dates, links and full text; the structured company block is HR-specific.

### A Zefix alternative? It is the other half

Zefix shows a **snapshot**: what a company looks like today. This Actor gives the **feed of events** — what changed yesterday, nationwide or in your cantons. That is the difference between looking a company up and being told when something happens to it. For company monitoring, insolvency alerts or a list of new companies in Switzerland this week, the gazette is the source. We do not scrape Zefix, and this Actor returns no current-state register extract.

### Who uses this

- **Sales and lead generation:** every new company (HR01) registered in your cantons, with legal form, purpose, capital and address, pushed into the CRM.
- **Credit and risk analysts:** bankruptcies, liquidation calls and composition proceedings by canton, flagging exposure before an invoice goes unpaid.
- **Compliance and KYB teams at banks, insurers and fiduciaries:** name, seat, capital and status changes for a watch-list, filtered by UID, so no file is reviewed against stale data.
- **Lawyers and M\&A researchers:** the full event history of one entity — every HR publication tied to one UID, any date range.
- **Developers and AI agents:** a clean JSON feed of Swiss company events, callable from the API, the CLI or an MCP tool.

### Example output

A new registration in Ticino, shortened:

```json
{
  "publicationNumber": "HR01-1006735012",
  "publicationDate": "2026-08-19",
  "rubric": "HR",
  "subRubric": "HR01",
  "subRubricLabel": "New registration",
  "cantons": ["TI"],
  "title": "Nuove registrazioni AgriEdil Ticino Sagl, Bellinzona",
  "companyName": "AgriEdil Ticino Sagl",
  "uid": "CHE-396.045.519",
  "seat": "Bellinzona",
  "legalFormCode": "0107",
  "legalFormLabel": "Gesellschaft mit beschränkter Haftung (GmbH/Sàrl/Sagl)",
  "purpose": "La società ha per scopo l'esecuzione di lavori edili ...",
  "company": {
    "address": { "street": "Via al Boschetto 5", "zip": "6514", "town": "Sementina" },
    "capitalNominal": "20000.00",
    "capitalPaid": "20000.00"
  },
  "changes": { "nameChanged": false, "seatChanged": false, "others": true },
  "transactionType": "registration",
  "publicationText": "AgriEdil Ticino Sagl, in Bellinzona, CHE-396.045.519, ... (Nuova iscrizione).",
  "language": "it",
  "source": "amtsblattportal.ch (SHAB/FOSC/FUSC)"
}
```

### Input

| Field | What it does |
|---|---|
| `subRubrics` | Publication types, as sub-codes. Default `HR01`, `HR02`, `HR03`; also `KK01`–`KK10`, `LS01`–`LS05`, `NA01`–`NA07`, `SR01`–`SR05`, `UP01`–`UP05`, `FM01`–`FM12`, `AB01`/`AB02`, `EK10`/`EK40`. |
| `rubrics` | Whole rubrics (`HR`, `KK`, `LS`, `NA`, `SR`, `UP`, `FM`, `AB`, `EK`, `AW`, `AZ`, `ES`), used only when `subRubrics` is empty. |
| `cantons` | Two-letter codes, e.g. `["TI","ZH"]`. Empty = all Switzerland. |
| `keyword` | Full-text filter: company name, town, UID `CHE-…`, or an industry word. |
| `publishedFrom` / `publishedUntil` | Date window (YYYY-MM-DD). Default: the last 7 days. |
| `language` | Preferred language for titles (`de`, `fr`, `it`, `en`). Publication text stays in its original language. |
| `includeContent` | Fetch full text and structured company data. Default `true`; one extra request per publication. |
| `maxItems` | Safety cap. Default 500, `0` = unlimited. The register publishes roughly 900 entries per working day nationwide. |

New companies registered in Ticino and Zurich over the last week:

```json
{ "subRubrics": ["HR01"], "cantons": ["TI", "ZH"], "language": "de" }
```

Every register event for one company, by UID, since the start of the year:

```json
{ "subRubrics": ["HR01", "HR02", "HR03"], "keyword": "CHE-396.045.519", "publishedFrom": "2026-01-01" }
```

Bankruptcies and creditor calls in French-speaking Switzerland this month:

```json
{ "rubrics": ["KK", "LS"], "cantons": ["GE", "VD", "NE", "FR", "JU", "VS"], "publishedFrom": "2026-08-01" }
```

### Run it on a schedule

Save your filter as a Task, leave the dates empty so each run covers the last seven days, and schedule it daily — the gazette publishes on working days, so a daily run catches every event. Attach an Apify integration to send results where the work happens: Google Sheets, Slack, e-mail, a webhook, Make or Zapier. Deduplicate on `publicationId` (or `publicationNumber`) so overlapping windows never action a publication twice.

### Use it from code or from an AI agent

Start runs and read the dataset through the Apify API or the `apify` CLI, and fetch results as JSON, CSV or Excel. The Actor is also exposed as an MCP tool via the Apify MCP server, so an AI agent can ask for Swiss company events — "any bankruptcies in Vaud this week?" — in one tool call.

### Pricing

Pay per event: a small fee for each publication exported, shown in the pricing box. Platform usage is negligible — plain API calls, no browser, so no compute bill on top.

### Where the data comes from

The public API of amtsblattportal.ch, the official gazette portal of the Swiss Confederation, published under an open licence permitting commercial reuse. The Ordinance on the SHAB (SHABV, Art. 12–13) foresees electronic data subscriptions and reuse by professional data providers, and the Federal Administrative Court (A-4086/2007) confirmed that private re-publication of commercial-register data is lawful.

Honest limits: this is a publication feed, not a register database. You get events published in the window you ask for — not a current-state extract, and nothing predating its appearance in the gazette. Structured company fields exist for commercial-register publications; other rubrics give the official text.

**Deliberately excluded:** rubrics concerning private individuals — debt enforcement (SB) and private bankruptcies — are not offered in the input selector, for data-protection reasons under the revised Swiss FADP (nDSG). Commercial-register data concerns legal entities and persons registered for business. Respect the gazette's notice in `legalRemedy` and cite amtsblattportal.ch as the source. This Actor is independent and not affiliated with the Swiss Confederation.

### Related Actors

Same engine, same official-source approach:

- [**AusTender (Australia)**](https://apify.com/publicdata/austender-australian-government-contracts) — federal contracts, winners and expiry dates
- [**UK Public Tenders**](https://apify.com/publicdata/uk-contracts-finder-find-a-tender) — Contracts Finder and Find a Tender in one run
- [**Swiss Public Tenders (simap.ch)** — tenders and awards with prices, bid counts and weighted criteria](https://apify.com/publicdata/simap-swiss-public-tenders)
- [**EU Tenders (TED)** — European procurement notices and contract awards](https://apify.com/publicdata/ted-eu-public-tenders)
- [**France Company Register** — SIREN/SIRET, executives, official labels](https://apify.com/publicdata/france-company-register-scraper)
- [**GLEIF LEI** — LEI lookup, lapsed-LEI screening, parent companies](https://apify.com/publicdata/gleif-lei-scraper)
- [**Brazil CNPJ** — Receita Federal company data and partners](https://apify.com/publicdata/brazil-cnpj-lookup)

# Actor input Schema

## `subRubrics` (type: `array`):

Default: commercial-register publications (HR01 new registrations, HR02 changes, HR03 deletions). Other business rubrics: KK bankruptcies, LS liquidation calls to creditors, NA composition proceedings, SR corporate-law calls, UP notices to shareholders, FM financial market. Leave empty and set 'rubrics' to take whole rubrics instead.

## `rubrics` (type: `array`):

Rubric codes such as HR, KK, LS, NA, SR, UP, FM, AB, EK, AW, AZ, ES. Used only when 'subRubrics' is empty (the API ignores sub-rubrics when rubrics are set).

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

Two-letter canton codes (TI, ZH, GE, ...). Empty = all of Switzerland.

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

Optional full-text keyword, e.g. a company name, a town, a UID (CHE-123.456.789) or an industry word.

## `publishedFrom` (type: `string`):

Default: 7 days ago.

## `publishedUntil` (type: `string`):

Default: today.

## `language` (type: `string`):

Titles are multilingual; the publication text itself is in the publication's original language.

## `includeContent` (type: `boolean`):

Adds the full publication text and, for commercial-register publications, structured company data: name, UID, seat, legal form, address, purpose, capital, change flags, deletion date. One extra request per publication (~5/s).

## `maxItems` (type: `integer`):

Safety cap (0 = unlimited). HR publishes ~900 per working day across Switzerland.

## Actor input object example

```json
{
  "subRubrics": [
    "HR01"
  ],
  "cantons": [
    "TI"
  ],
  "language": "de",
  "includeContent": true,
  "maxItems": 500
}
```

# Actor output Schema

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

Commercial-register and other SHAB/FOSC publications. Every exported row is one item in the default dataset.

# 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 = {
    "subRubrics": [
        "HR01"
    ],
    "cantons": [
        "TI"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("publicdata/shab-swiss-company-gazette").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 = {
    "subRubrics": ["HR01"],
    "cantons": ["TI"],
}

# Run the Actor and wait for it to finish
run = client.actor("publicdata/shab-swiss-company-gazette").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 '{
  "subRubrics": [
    "HR01"
  ],
  "cantons": [
    "TI"
  ]
}' |
apify call publicdata/shab-swiss-company-gazette --silent --output-dataset

```

## MCP server setup

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

```

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/vimUEMZYHZljKB7wQ/builds/XVvhuNWQGfJwTOQO5/openapi.json
