FINMA-Leitfaden · 3 von 3
Die FINMA-Prüfung
Ihrer Gegenparteien automatisieren.
Drei Namen von Hand zu prüfen dauert wenige Minuten. Für Hunderte von Gegenparteien, die regelmässig überprüft werden, braucht es ein wiederholbares Vorgehen: zuerst über Kennungen abgleichen, Namen als Hinweise behandeln und die verwendete Version festhalten. Dieser Leitfaden beschreibt es mit der FINMA-Datei von OpenSwissData und getesteten Beispielen.
Inhalt
Das Prinzip
- Ihre GegenparteienName, UID und LEI, soweit bekannt.
- NormalisierenUID auf «CHE» und neun Ziffern bringen, LEI in Grossbuchstaben.
- Über Kennungen abgleichenExakte UID, dann exakter LEI: sichere Übereinstimmungen.
- Über Namen abgleichenKandidaten zur Prüfung, nie Urteile.
- Prüfen und festhaltenEine Person entscheidet; Dateiversion und Entscheid werden aufbewahrt.
Der Abgleich über Kennungen liefert sichere Übereinstimmungen. Der Abgleich über Namen liefert nur Kandidaten: Er lenkt die menschliche Prüfung, er entscheidet nicht.
Die abzugleichenden Dateien
Das FINMA-Archiv von OpenSwissData enthält unter anderem:
Scrollen Sie die Tabelle, um alle Spalten zu sehen
| Datei | Inhalt | Gut zu wissen |
|---|---|---|
finma_registry.csv, .json, .sql, .parquet | Eine Zeile je Bewilligung aus der von der FINMA veröffentlichten UID-Liste. | Ein Unternehmen mit mehreren Bewilligungen erscheint auf mehreren Zeilen. |
finma_<kategorie>.csv | Dieselben Zeilen, eine Datei je nicht leerer Kategorie. | Kategorien von OpenSwissData gruppiert (Feld entity_type). |
finma_warnings.csv, .json, .sql, .parquet | Die Warnliste, getrennt vom Register. | Nur Name, Datum, Handelsregister-Filter und Link zur Detailseite. |
finma.xlsx | Register und Warnungen in zwei Tabellenblättern. | Ein drittes Blatt erinnert an die Leseregeln. |
changelog_90d.csv, .json | Beobachtete Änderungen zwischen den verfügbaren Versionen. | Beobachtungsdaten, keine Entscheiddaten der FINMA. |
quality.json, checksums.sha256, provenance.json | Abdeckung der Felder, Erhebungslücken, Prüfsummen und Signatur. | Zusammen mit dem Prüfergebnis aufbewahren. |
Die Registerfelder für den Abgleich
Scrollen Sie die Tabelle, um alle Spalten zu sehen
| Feld | Inhalt |
|---|---|
uid | Die UID, wie von der FINMA veröffentlicht, im Format CHE-123.456.789; bei einigen Zeilen leer. |
name, city | Name und Ort gemäss FINMA. |
licence_type, licence_type_fr, licence_type_de, licence_type_it | Die Bewilligungsart, von der FINMA auf Englisch, Französisch, Deutsch und Italienisch bezeichnet. |
entity_type | Eine Gruppierung durch OpenSwissData; eine nicht zugeordnete Bezeichnung landet in other. Für einen genauen Filter verwenden Sie licence_type. |
lei, lei_registration_status | Der LEI, nur wenn die UID genau einem LEI bei der GLEIF entspricht, und der Status dieser LEI-Registrierung. |
address, canton | Von der GLEIF übernommen, wenn ein LEI zugeordnet wurde; sie können auch mit LEI leer bleiben. |
licence_date, status | Leer: Die Liste der FINMA enthält diese Angaben nicht. |
is_warning_listed | Leer: Aus einer Namensähnlichkeit wird keine Verbindung zur Warnliste abgeleitet. |
In CSV und SQL ist ein fehlender Wert eine leere Zeichenkette; im JSON fehlt der Schlüssel oder er ist null; im Parquet ist der Wert null. Prüfen Sie in SQL deshalb uid <> '' statt uid IS NOT NULL.
Aktualisierung
Aufseiten der FINMA werden die Listen «regelmässig aktualisiert», und jede Liste zeigt das Datum ihrer letzten Änderung.1 Die Warnliste ist weder abschliessend noch tagesaktuell.2
Bei OpenSwissData ist die FINMA-Erhebung täglich geplant. Eine Erhebung kann gestoppt werden, wenn ihre Kontrollen fehlschlagen; Lücken werden in quality.json ausgewiesen, und die tatsächlich verfügbare Version steht auf der Produktseite.
Wie oft Sie selbst prüfen, ist eine Frage Ihrer Risikopolitik: zum Beispiel vor jeder neuen Geschäftsbeziehung und danach in regelmässigen Abständen. Die Datei changelog_90d hilft, die von einer beobachteten Änderung betroffenen Gegenparteien gezielt zu prüfen.
In der richtigen Reihenfolge abgleichen
1. Zuerst die UID
Das BFS lässt beide Schreibweisen der UID zu, mit oder ohne Bindestrich und Punkte, und die Ergänzung HR oder MWST gehört nicht zur Nummer.3 Bringen Sie beide Seiten auf eine kompakte Form, «CHE» gefolgt von den neun Ziffern: Eine exakte Übereinstimmung in dieser Form ist ein sicherer Abgleich.
2. Dann der LEI
Hat Ihre Gegenpartei einen LEI, vergleichen Sie ihn in Grossbuchstaben mit dem Feld lei. Die Datei ordnet einen LEI nur zu, wenn die UID genau einem LEI bei der GLEIF entspricht: Fehlt ein LEI in der Datei, heisst das nicht, dass die Einheit keinen hat.
3. Zuletzt der Name, mit Vorsicht
Für Gegenparteien ohne Kennung und für die ganze Warnliste, die keine UID enthält, bleibt nur der Name. Normalisieren Sie beide Seiten (Gross- und Kleinschreibung, Akzente, Rechtsformen), suchen Sie Namen, die im anderen enthalten sind, und legen Sie jeden Kandidaten einer menschlichen Prüfung vor.
Eine Namensübereinstimmung ist keine Identität
Gerade bei der Warnliste belegt ein Kandidat nichts über Ihre Gegenpartei: Vergleichen Sie Sitz, Adresse und Website auf der Detailseite der FINMA, bevor Sie etwas folgern. Siehe den Leitfaden zur Warnliste.
Beispiel: SQLite in der Kommandozeile
Die .sql-Dateien des Archivs legen je eine Tabelle mit Textspalten an und füllen sie. Legen Sie in den Ordner des entpackten Archivs eine Datei counterparties.csv:
reference,name,uid
C-001,Exemple Banque SA,CHE-123.456.789
C-002,Exemple Gestion Sàrl,CHE987654321 TVA
C-003,Exemple Conseil AG,Namen und UID dieses Beispiels sind fiktiv. Laden Sie danach die beiden Tabellen und starten Sie die Prüfungen aus checks.sql; die Option --csv von .import setzt sqlite3 ab Version 3.32 voraus:
sqlite3 check.db < finma_registry.sql
sqlite3 check.db < finma_warnings.sql
sqlite3 -header -column check.db < checks.sql-- Ihre Gegenparteien: eine CSV-Datei mit den Spalten reference, name und uid
DROP TABLE IF EXISTS counterparties;
.import --csv counterparties.csv counterparties
-- UID auf «CHE» und neun Ziffern gebracht, auf beiden Seiten
CREATE TEMP VIEW counterparty_uid AS
SELECT *, substr(upper(replace(replace(replace(uid, '-', ''), '.', ''), ' ', '')), 1, 12) AS uid_key
FROM counterparties WHERE trim(uid) <> '';
CREATE TEMP VIEW registry_uid AS
SELECT *, substr(upper(replace(replace(replace(uid, '-', ''), '.', ''), ' ', '')), 1, 12) AS uid_key
FROM finma_registry WHERE uid <> '';
-- 1. Übereinstimmungen über die UID, Bewilligungen zusammengefasst
SELECT c.reference, c.name, min(r.name) AS finma_name,
group_concat(r.licence_type_de, ' ; ') AS authorisations
FROM counterparty_uid c
JOIN registry_uid r ON r.uid_key = c.uid_key
GROUP BY c.reference, c.name;
-- 2. Zu prüfen: keine UID oder UID nicht in der Liste
SELECT reference, name FROM counterparties
WHERE reference NOT IN (
SELECT c.reference FROM counterparty_uid c
JOIN registry_uid r ON r.uid_key = c.uid_key
);
-- 3. Kandidaten der Warnliste, zu prüfen: ein Name im anderen enthalten
SELECT c.reference, c.name, w.name AS warning_name, w.date_added, w.source_url
FROM counterparties c
JOIN finma_warnings w
ON instr(lower(w.name), lower(c.name)) > 0
OR instr(lower(c.name), lower(w.name)) > 0;Die erste Abfrage fasst die Bewilligungen eines Unternehmens zusammen. Die zweite listet die zu prüfenden Gegenparteien ohne UID oder ohne Übereinstimmung auf: Das sind keine «nicht bewilligten» Gegenparteien. Die dritte liefert nur Kandidaten; die SQLite-Funktion lower() behandelt nur ASCII-Buchstaben, Akzente bleiben also unterscheidend.
Mit dem JSON
Alle Bewilligungen einer UID mit jq finden:
jq '.[] | select(.uid == "CHE-123.456.789") | {name, licence_type, lei}' finma_registry.jsonBeispiel: Namen in Python aufbereiten
Um Namen ohne Akzente und Rechtsformen zu vergleichen, genügt eine einfache Normalisierung für robustere Kandidaten:
import csv
import re
import unicodedata
# Häufige Rechtsformen, vor dem Vergleich entfernt (Liste als Beispiel)
LEGAL_FORMS = {"ag", "sa", "sarl", "gmbh", "ltd", "sagl", "kg", "snc", "scs"}
def fold(name: str) -> str:
text = unicodedata.normalize("NFKD", name).encode("ascii", "ignore").decode().lower()
return " ".join(w for w in re.findall(r"[a-z0-9]+", text) if w not in LEGAL_FORMS)
with open("finma_warnings.csv", encoding="utf-8-sig", newline="") as f:
warnings = [(fold(row["name"]), row) for row in csv.DictReader(f)]
with open("counterparties.csv", encoding="utf-8-sig", newline="") as f:
for row in csv.DictReader(f):
key = fold(row["name"])
if len(key) < 4:
continue # Name zu kurz für eine sinnvolle Suche
for folded, warning in warnings:
if len(folded) >= 4 and (key in folded or folded in key):
print(row["reference"], row["name"], "->", warning["name"], warning["source_url"])Die Liste der Rechtsformen ist ein Beispiel: Passen Sie sie an Ihre Gegenparteien an. Jede ausgegebene Zeile bleibt ein zu prüfender Kandidat.
Jede Prüfung nachvollziehbar halten
Damit sich ein Ergebnis später erklären lässt, bewahren Sie zusammen mit ihm auf:
- die Version der Datei, die im Namen des Archivs und in
quality.jsonsteht; - die Datei
checksums.sha256und das Ergebnis ihrer Prüfung; - das Datum der Prüfung, die bestätigten Übereinstimmungen und die Entscheide zu den Kandidaten.
shasum -a 256 -c checksums.sha256 # macOS
sha256sum -c checksums.sha256 # LinuxDie Daten in changelog_90d sind Beobachtungsdaten zwischen zwei Versionen, keine Entscheiddaten der FINMA.
Für eine einzelne Frage: kyc_check
Der MCP-Server von OpenSwissData bietet das Werkzeug kyc_check ohne Konto und ohne Schlüssel an, mit bis zu 100 Aufrufen pro Stunde und IP-Adresse. Es sucht einen Namen im Register und in der Warnliste, unabhängig von Gross- und Kleinschreibung und Akzenten, und liefert die nächsten Treffer mit ihrer Gesamtzahl. Eine leere Antwort ist keine Konformitätsbescheinigung.
claude mcp add --transport http openswissdata https://mcp.openswissdata.com/jsonrpc
curl -s https://mcp.openswissdata.com/jsonrpc \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"kyc_check","arguments":{"name":"Exemple Banque"}}}'Der Kauf der Datei eröffnet keinen kostenpflichtigen MCP-Zugang, und neue Pro-Abonnements sind derzeit geschlossen. Details und weitere Clients: Seite des MCP-Servers.
Grenzen
- Die Datei folgt der von der FINMA veröffentlichten UID-Liste bewilligter Unternehmen. Sie umfasst weder das Register der Versicherungsvermittler noch die SRO-Mitglieder oder die kollektiven Kapitalanlagen: Konsultieren Sie diese Quellen direkt.1
- Bewilligungsdaten und detaillierte Status sind in der Liste der FINMA nicht enthalten: Die entsprechenden Felder bleiben leer.
- Ein Abgleich über Namen erzeugt Fehltreffer und kann eine Variante übersehen: Er bleibt eine Vorauswahl vor der Prüfung.
- Eine Zeile der Datei spiegelt die Liste der FINMA zum Zeitpunkt der Erhebung; für einen Entscheid ist die offizielle Quelle massgebend.
Mit den Daten arbeiten
Das FINMA-Register als Dateien.
Die von der FINMA veröffentlichte Liste der UID bewilligter Unternehmen als Excel, CSV, JSON, Parquet und SQL. Ein LEI wird ergänzt, wenn die UID genau einem LEI bei der GLEIF entspricht; die Warnliste bleibt in separaten Dateien, und jede Version ist signiert. Einmalige Zahlung: CHF 299.
Offizielle Quellen
Die Zitate und Fakten dieses Leitfadens stammen aus diesen Seiten, abgerufen am 29.09.2026. Massgebend sind allein diese Quellen; sie können sich seither geändert haben.
- FINMA · Bewilligte oder registrierte Institute, Personen und Produktehttps://www.finma.ch/de/finma-public/bewilligte-institute-personen-und-produkte/
- FINMA · Warnlistehttps://www.finma.ch/de/finma-public/warnungen/warnliste/
- Bundesamt für Statistik (BFS) · Allgemeines zur UIDhttps://www.bfs.admin.ch/bfs/de/home/register/unternehmensregister/unternehmens-identifikationsnummer/allgemeines-uid.html