Swiss Commercial Register Scraper — Companies & Bankruptcies avatar

Swiss Commercial Register Scraper — Companies & Bankruptcies

Pricing

from $4.25 / 1,000 publications

Go to Apify Store
Swiss Commercial Register Scraper — Companies & Bankruptcies

Swiss Commercial Register Scraper — Companies & Bankruptcies

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.

Pricing

from $4.25 / 1,000 publications

Rating

0.0

(0)

Developer

PublicData

PublicData

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

a day ago

Last modified

Share

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 browser. The API answers plain HTTP requests, so runs connect directly and only fall back to Apify Proxy if that direct connection fails. 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, titles (DE/FR/IT/EN), registrationOffice, legalRemedy, lastPublication (the entity's previous gazette entry), publicationUrl, xmlUrl, publicationId and source, plus distributionCantons and secondaryTenants — the cantonal editions the publication was distributed to.

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, plus journalNumber and journalDate (the commercial-register journal entry). 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. Each of these rubrics has its own XML schema and, unlike HR, no publicationText — the gazette publishes them as structured fields instead. Those fields land in contentFields: a bankruptcy's debtor company, resolutionDate and entryDeadline; a liquidation's call to creditors; a general meeting's date, time, place and agenda (UP04); balance-sheet totals (FM02); capital before and after (SR05); trustee and moratorium dates (NA02); the precious-metal mark holder (EK). Where the debtor or subject is a company, companyName, uid and seat are filled from it, so bankruptcies join HR rows on UID.

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:

{
"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)"
}

A bankruptcy over a company, shortened — no publicationText, structured fields instead:

{
"publicationNumber": "KK02-0000060412",
"subRubric": "KK02",
"subRubricLabel": "Bankruptcy publication / call to creditors",
"cantons": ["LU"],
"distributionCantons": ["LU"],
"companyName": "Pegasound AG in Liquidation",
"uid": "CHE-100.060.882",
"seat": "Luzern",
"publicationText": null,
"contentFields": {
"proceeding": { "selectType": "summary" },
"debtor": { "selectType": "company", "companies": { "company": { "name": "Pegasound AG in Liquidation", "uid": "CHE-100.060.882", "canton": "LU" } } },
"resolutionDate": "2026-05-29",
"entryDeadline": "2026-09-21",
"registrationOffice": "Konkursamt Luzern, Zentralstrasse 28, Postfach 3541, 6002 Luzern"
}
}

Input

FieldWhat it does
subRubricsPublication types, as sub-codes: HR01HR03, KK01KK07/KK10, LS01LS05, NA01NA03/NA05/NA07, SR01SR05, UP01/UP02/UP04, FM01/FM02/FM10/FM12, AB01/AB02, EK10/EK40. This is a curated subset, not the full code list. Counting every code against the live API on 2026-08-21, these nine rubrics hold 66 sub-rubric codes that carry publications and the selector offers 37 of them; the 29 you cannot tick include EK50 (13,615 publications archive-wide), AB04 (1,846), EK20 (954), EK30 (767), NA04 (765), NA11 (606), NA06 (543) and KK08 (472). Ask for the whole rubric in rubrics to include them — rubrics: ["EK"] covers EK50. UP05 and FM08 are not offered because both had 0 publications archive-wide on 2026-08-21. Leave both this and rubrics empty for the commercial-register default HR01, HR02, HR03 — the same three codes the field is pre-filled with in the UI.
rubricsWhole rubrics (HR, KK, LS, NA, SR, UP, FM, AB, EK, AW, AZ, ES). The gazette combines rubrics and subRubrics with OR, so set one or the other: leaving HR01 in subRubrics while asking for rubrics: ["KK"] returns both.
cantonsTwo-letter codes, e.g. ["TI","ZH"]. Empty = all Switzerland. The gazette matches every cantonal edition a publication appears in, so a Moesa bankruptcy carried by both the Grisons and the Ticino gazette matches TI while its cantons field reads ["GR"]; distributionCantons shows the full matched set. Commercial-register (HR) publications are never cross-published, so the default configuration is unaffected.
keywordFull-text filter: company name, town, UID CHE-…, or an industry word.
publishedFrom / publishedUntilDate window (YYYY-MM-DD). Default: the last 7 days. Both are checked against the calendar before anything is fetched: an impossible date such as 2026-13-45 or 2026-02-30, or a window that runs backwards, fails the run with a message. (2026-13-45 used to be passed straight through, and the gazette answers it by dropping the date filter altogether — 402,715 HR01 publications of any age instead of an error.)
languagePreferred language for titles (de, fr, it, en). Publication text stays in its original language.
includeContentFetch each publication's official XML. Default true; one extra request per publication. HR gets full text plus the structured company block; every other rubric gets its own fields in contentFields.
maxItemsSafety cap. Default 500, 0 = no cap from this Actor. Publication days are searched newest-first, so a cap keeps the most recent publications and drops the older end of your window — see below.

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

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

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

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

Bankruptcies and creditor calls in French-speaking Switzerland this month — note subRubrics explicitly emptied, because the two filters are OR-ed:

{ "subRubrics": [], "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. 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.

Set maxItems to match the window, not the day. The cap is not a sample: publication days are searched newest-first, so maxItems: 500 on a busy filter returns the newest 500 publications and skips the older days. With the dates left empty every run covers seven days, so size the cap for seven days. Measured on 2026-08-21 over exactly that window (2026-08-14…21), the default HR sub-rubrics matched 6,406 publications nationwide, 1,310 for canton ZH alone and 243 for canton TI; the six publishing days inside it ran 996 / 1,142 / 1,097 / 1,045 / 993 / 1,133 (the gazette does not publish at the weekend). So a nationwide HR run on the default window needs maxItems of at least 6,406, or 01,500 would cover barely more than one of the seven days. A ZH-only run needs at least 1,310 over the same window; a TI-only run's 243 fits under the default 500. When a cap does truncate a run, the log carries a warning and the run's status message reads 500 of 6406 — check it after the first scheduled run.

Coverage inside the window is complete. The gazette's search is not stably ordered — two backend replicas answer the same query in two different orders, so the same page requested twice a second apart shared only 35 of 100 rows — which makes a naive page-by-page walk skip rows. This Actor asks for the largest page the API accepts (3,000 rows) and splits anything bigger into one search per publication day, then de-duplicates on publicationId. Re-measured end to end on 2026-08-21 with maxItems: 0: nationwide HR over the 7-day window exported 6,406 of 6,406, ZH 1,310 of 1,310, TI 243 of 243, a single day (2026-08-21) 1,133 of 1,133, a 14-day nationwide HR window 11,281 of 11,281, and the busiest single day in the last 120 days (2026-06-19, every rubric) 3,046 of 3,046.

One upstream limit remains. amtsblattportal refuses any search offset at or beyond row 10,000 ((page+1)×size > 10000 answers HTTP 400), so a single publication day matching more than about 9,000 publications cannot be read in full by anyone, this Actor included. The busiest day in the 120 days to 2026-08-21 carried 3,046 publications across every rubric, so a normal filter is nowhere near it. If a run does hit the cap it now ends successfully with an INCOMPLETE: n of N status message naming the day, instead of failing the run after you have already been charged for the rows it did export.

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. The full official text (publicationText) and the company block with purpose and capital exist only for commercial-register (HR) publications; every other rubric publishes structured fields instead, which arrive under contentFields with that rubric's own field names. maxItems truncates from the oldest end, so size it to your window, and no search can read past the gazette's own 10,000-row offset cap on a single publication day.

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). Inside the rubrics that are offered, a bankruptcy whose debtor is a natural person has its structured person block dropped: contentFields.debtor becomes {"selectType": "person", "personalDataOmitted": true}, so no given name, date of birth or home-address field is exported, and companyName, uid and seat stay empty. That is not anonymisation. The gazette prints the debtor's name in the publication title, and this Actor exports the official title verbatim — measured on 2026-08-21 over a 100-row sample of KK01/KK02/KK04/NA01 for 2026-08-01…21 (1,950 matching publications), 73 rows had a natural-person debtor and all 73 carried that person's name in title; 0 of the 73 carried a date of birth, and 7 of the 73 carried a street address inside the free-text contentFields.remarks. If you must not process personal data, exclude the KK, NA and LS rubrics rather than relying on the redaction. 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.

Frequently asked questions

Is republishing SHAB data allowed?

Yes. 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.

Does it include data about private individuals?

No. Rubrics concerning private individuals — debt enforcement (SB) and private bankruptcies — are deliberately excluded from the input selector for data-protection reasons under the revised Swiss FADP.

How is this different from Zefix?

Zefix shows a company's current state. The Swiss Commercial Register Scraper gives the feed of events: what changed yesterday, nationwide or in your cantons. Looking a company up and being told when something happens to it are different jobs.

How current is it?

The gazette publishes on working days and this Actor reads it the same day. Roughly 900 entries appear nationwide per working day.

Same engine, same official-source approach: