Switzerland
Swiss companies come from the federal commercial register (Zefix), the federal UID register, the Swiss Official Gazette of Commerce (SOGC) and the cantonal register excerpts. All five sources are official and open. Four of them need no account; the Zefix REST API needs credentials that the operator enters once (see Activating Zefix REST).
Sources#
| Source | Gives | Access | Default |
|---|---|---|---|
lindas_zefix (Zefix on LINDAS) |
legal name and its de/fr/it/en versions, UID, CH-ID, EHRA-ID, legal form, seat municipality (BFS number), registered address, purpose | SPARQL, no login; active entities only, updated daily | on |
uid_register (UID register, BFS) |
master data of every UID, also outside the commercial register (administrations, sole traders, associations, VAT-only entities): names, legal form, UID and register status, legal and postal addresses, register entry and deletion dates, VAT status and number, LEI | SOAP, no login; about 20 requests per minute | on |
zefix_rest (Zefix Public REST API) |
the full register record, deleted companies included: status and deletion date, nominal capital, former names, SOGC publications, head and branch offices, mergers, audit firms, link to the cantonal excerpt | HTTP basic credentials from the Federal Office of the Commercial Register | off until credentials are set |
sogc (Swiss Official Gazette of Commerce) |
the events timeline: incorporation, name, seat, address, purpose and capital changes, officer changes (who joined or left, with dates), mergers, liquidation, deletion; the company as its latest publication states it; daily change feed | Amtsblattportal public API, no login; robots.txt not applied (official API, see Access) | on |
ch_cantonal_excerpt (cantonal register excerpts) |
officers and signatories: name, role, signing authority, since/until, residence, origin or nationality as published | public excerpt pages through the residential proxy tier; robots.txt not applied (official register, see Access) | on |
Where sources disagree, the register (Zefix, UID register, cantonal excerpts) ranks above the gazette; every value keeps its source, and conflicts are shown (see Company data sources).
Access#
How Cormorant reaches the two sources that need special handling. Both are shown on the source card in Mission Control (Company data → Sources, row Access).
SOGC: robots.txt not applied (official API)#
amtsblattportal.ch serves User-agent: * / Disallow: / for the whole host,
its public API (/api/v1/publications) included, so every request was
refused as blocked. The API is documented for public use and the operator
decided to use it regardless. The source therefore has the robots policy
official_api ("robots.txt: not applied (official API)"):
- only this connector's requests skip robots.txt, on both transport paths (plain GETs through the Fetcher and requests with headers or a body);
- its rate bucket (
amtsblattportal, 1 request/s, burst 2), the per-domain politeness, the SSRF checks and the storage of the exact response bodies still apply; - every other fetch, including
/v1/fetchof the same host, still obeys robots.txt (RESPECT_ROBOTS).
The policy is reserved for documented official APIs the operator has decided to use; web pages never get it.
The API negotiates its representation: a browser's Accept header gets
XML (application/xhtml+xml), so the source asks for
Accept: application/json. A response of another type fails as parse
with what came back ("expected application/json, got …"), and a cached
copy of another type is never used.
Cantonal excerpts: through the premium routes#
The cantonal register portals (e.g. prestations.vd.ch, zh.chregister.ch) answer HTTP 403 to datacenter addresses, robots.txt included. Excerpt pages are therefore fetched only through the premium routes:
- the residential proxy first, in a sticky session per portal host (renewed every 25 requests or 10 minutes, requests on one exit at least 1.5 s apart), with the headers of a Chrome navigation;
- when the proxy is refused (403, 429, a challenge), the request is retried once on a new exit, then the rendering tier answers; refusals from 3 different exits within 5 minutes skip the proxy for that host only, for 5 minutes, doubling while refusals continue (at most an hour);
- never Cormorant's own egress for excerpt pages.
The chregister.ch portals (ZH, BE, LU, ZG, BS, TI) show the excerpt in a
panel that the page loads after itself (a JSF request). The source does the
same: it requests the page (never from the cache), then loads the panel with
a POST in the same residential-proxy session, and reads the panel. Both
requests are metered. The portals are asked in German, whatever the canton's
language: the German panel is the one verified in production (the English
one comes back empty). The rendering tier cannot send that POST, so these cantons
need the residential proxy; without it the source answers not_configured.
VD and GE have their own portals and are asked in French.
The canton (which portal to ask) comes from what the register already knows
about the company (its seat canton from Zefix or the UID register), else from
the source option cantons. Only for a company the register does not know
yet is it looked up on LINDAS (one SPARQL query from our own egress). The
canary (ABB Ltd, canton of Zurich) carries its canton and checks the excerpt
route itself.
robots.txt: not applied (official register). Every *.chregister.ch
portal and lindas.admin.ch serve User-agent: * / Disallow: /. These are
the official public commercial registers, and the operator decided that this
source reads them regardless: it has the robots policy official_register
("robots.txt: not applied (official register)" on the source card). Only
this source's own requests (excerpt pages and the LINDAS canton lookup) skip
robots.txt; its rate bucket (0.2 requests/s), the per-domain politeness, the
SSRF checks, the stored exact bodies, the premium route and the billing
below are unchanged, and every other fetch of these hosts, /v1/fetch
included, still obeys robots.txt.
Cost. Premium-route usage of the source is company-data pipeline cost, not
a customer's fetch: its premium attempts are reserved against the internal project
company-data (COMPANY_DATA_PROJECT, created on first use under the
internal customer with a monthly budget of COMPANY_DATA_MONTHLY_BUDGET_USD,
20 USD; change it in Mission Control). Each excerpt fetch that reached
the premium routes is one request_log row on that project with kind company
(billing category company, reason = source:ch_cantonal_excerpt), its
premium bytes and cost, so it shows with the company traffic and on the Costs
page and never counts towards a customer's premium fetches. Your own company
requests are metered as before.
Errors: not_configured when the premium routes or the company-data project is not
available, budget_exhausted when that project's budget is used up,
blocked for a refused destination (SSRF checks). The message says how;
a refused page lists every attempt ("all_tiers_failed [proxy 403 http_403,
proxy_render 403 http_403]").
The same text is shown with failing canary checks and Test connection in
Mission Control, and logged by the worker.
Identifiers#
| Scheme | Example | Notes |
|---|---|---|
ch_uid |
CHE-101.049.653 |
Enterprise identification number; the check digit is verified. CHE101049653, CHE-101.049.653 MWST and che 101 049 653 are accepted. |
ch_chid |
CH02030216152 |
The former 11-digit commercial-register number (CH-ID); CH-020.3.021.615-2 is accepted. |
ch_ehraid |
460530 |
Internal id of the federal register office, one per register entry. |
vat |
CHE101049653 |
Swiss VAT numbers are UIDs. A company in a VAT group is taxed under the group's number; that number is not added to the members, so they stay separate records. |
A company with two head offices (Nestlé AG in Cham and Nestlé S.A. in Vevey)
has one UID and two register entries: the record carries both EHRA-IDs and
CH-IDs, the entry with the lower EHRA-ID gives the name, and the second seat
appears as an address of type other.
Fields#
- Legal name (
names.legal): the commercial register's primary entry, as Zefix REST, Zefix on LINDAS, the UID register or the cantonal excerpt (in this order) publish it; the gazette, GLEIF and other sources never replace it, whatever order the sources are refreshed in. Swiss firms often have equal-ranking versions in several languages (Nestlé AG / Nestlé S.A. / Nestlé Ltd.): the others are innames.translations, and other sources' forms (GLEIF'sNESTLÉ S.A.) innames.alternates, each with itssource. - Legal form: the eCH-0097 code as
local_code(0106), the name in the canton's language aslocal_name(Aktiengesellschaft, société anonyme, società anonima), the ISO 20275 ELF code and the category. Examples: AG / SAMVII, GmbH / Sàrl / Sagl3EKS, GenossenschaftQSI2, VereinH781, Stiftung2JZ4, EinzelunternehmenAZA0, KollektivgesellschaftMRSY, KommanditgesellschaftCQMY, Swiss branchUNA9, branch of a foreign companyJB25, federal administration2XJA. - Status:
active;in_liquidation(statusBEING_CANCELLED, or "in Liquidation / en liquidation / in liquidazione" in the name);dissolvedafter deletion;mergedwhen the company was taken over.local_valuekeeps the source's wording andsincethe deletion date. - Addresses: the registered address with the BFS municipality number, and the postal address (PO box) from the UID register.
- Purpose: in the register's language (
de,frorit). - Capital: nominal capital, and paid-in capital from the SOGC.
- Relationships:
auditor,merged_into,absorbed,branch,head_office(Zefix REST). - Activities: NOGA codes, with their NACE class, when the UID register publishes them.
- People (
include=people): every officer and signatory the cantonal excerpt lists, current and former, with role (chair,director,ceo,managing_director,partner,auditor,liquidator,secretary,signatory,member) and the register's own wording, signing authority (individual,joint_two,joint,procuration_individual,procuration_joint_two,none), since/until from the register journal, residence and origin or nationality. Officer changes published in the SOGC are also ineventswith the people who joined or left. The register publishes no birth dates and Cormorant stores none. - Events (
include=events): one entry per change and publication, with the publication link on shab.ch, the publication and journal numbers and dates, and details such as the old and new name or capital, the other company of a merger, or the people of an officer change.
curl -s "https://api.cormorant.ch/v1/companies/ch_uid:CHE-105.909.036?include=people,events" \
-H "Authorization: Bearer $CORMORANT_API_KEY"
Freshness#
| Field group | Refreshed after | Kept current by |
|---|---|---|
| core (name, legal form, status, address, purpose, capital) | 24 hours | the SOGC daily feed |
| people | 7 days | officer changes in the SOGC feed |
| events | 24 hours | the SOGC daily feed |
| relationships | 24 hours | Zefix REST |
The gazette publishes every register change on the day it takes effect for third parties. Cormorant reads its daily feed and applies the publications to companies already in the register, without your request. LINDAS and the UID register update daily. A company that is not in LINDAS has been deleted or is not in the commercial register: the UID register and Zefix REST still know it.
Activating Zefix REST#
Zefix REST adds deleted companies, capital, former names, mergers, branches and audit firms. It stays inactive until credentials are set:
- The operator requests credentials from the Federal Office of the Commercial Register (zefix@bj.admin.ch). The office issues them without charge.
- In Mission Control, open Company data → Sources → zefix_rest and enter the username and password. Credentials are encrypted at rest, never shown again and never logged.
- Switch the source on. The source card shows its health and canaries
(Nestlé, UBS Group). A wrong password shows as error class
auth.
GET /v1/companies/sources then lists zefix_rest as active.
Limits#
- The VD and GE portals have not yet been checked against production responses; ZH (chregister.ch) has.
- Cantonal excerpts exist for the cantons in the source's URL table (ZH, BE, LU, ZG, BS, TI, VD, GE) and those the operator adds in its options; elsewhere officers come from the SOGC events only.
- Cantonal excerpts need the premium routes (residential proxy or rendering). Without
it the source answers
not_configured. - Some French-speaking register offices write officer changes as prose, not as labelled lists. Cormorant reads the usual sentences ("n'est plus administrateur", "Nouvel organe de révision: …", "Signature individuelle est conférée à …"). Unusual wording yields an officer-change event without the people.
- The UID register allows about 20 requests per minute. Bulk lookups take their time, and the register answers in the meantime.