Firmenwatch UID API

Pruefung und Normalisierung von Unternehmens-Identifikationsnummern.

GitHub OpenAPI

Operations 1

POST /uid/validate UID pruefen und normalisieren #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/firmenwatch-ch:firmenwatch-ch-uid-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

firmenwatch-ch-uid-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Firmenwatch UID API
  version: 1.11.0
  summary: Schweizer Firmenidentitaeten, atomarer Portfolio-Abgleich, amtliche SHAB-Publikationen und ein geschlossener Arbeitskreislauf.
  description: 'REST-Schnittstelle auf den uebernommenen Zefix/LINDAS-Stammbestand und erfasste Publikationen des Schweizerischen Handelsamtsblatts: Firmensuche, sicherer Namensabgleich ohne bekannte UID, Einzelabfrage per UID, Organe, Historie, Ereignisstrom, resumierbarer und atomarer Portfolio-Abgleich, priorisierte Prueffaelle, konkurrenzsichere Rueckmeldung von Bearbeitungsstand und Entscheidung sowie UID-Pruefung. Der separate Root-Resolver /uid/{uid}.json liefert ohne API-Schluessel einen minimalen, versionierten Identitaetskern. Alle Zeitangaben sind UTC, alle Datumsangaben ISO 8601 (YYYY-MM-DD). Die erfasste Publikationshistorie beginnt am 2025-01-03; fruehere Zeitstaende werden nicht aus dem heutigen Bestand zurueckgerechnet und eine vollstaendige amtliche Gesamthistorie wird nicht zugesichert. Betraege in Franken ohne Rappen, sofern nicht anders vermerkt.


    Ereignisse des Stroms /events folgen dem Ereignisvertrag (Schema FeedEvent): stabile Kennung id, schema_version, sequence als Lesezeiger, status, revised_at, content_hash und source. Die menschenlesbare Begruendung steht unter https://firmenwatch.ch/api-docs#ereignisvertrag.


    Optionale X-Firmenwatch-Monthly-*-Kopfzeilen melden nach der Kontingentpruefung den kontoweiten Buchungsstand aller Schluessel und geschuetzten MCP-Aufrufe. Zugelassene Aufrufe zaehlen einschliesslich leerer Antworten, weiterer Seiten und nachgelagerter Eingabe- oder Fachfehler. Eine 402-Abweisung wegen ausgeschoepftem Monatskontingent zaehlt nicht; fruehe 401/403/429-Antworten und oeffentliche Endpunkte enthalten keine Monatswerte. Bestaetigte technische Rueckbuchungen koennen in derselben Antwort fuer den urspruenglich gebuchten UTC-Kalendermonat beruecksichtigt sein. Der Stand ist eine Momentaufnahme und reserviert kein Budget fuer parallele oder folgende Aufrufe. Eingeschlossenes Restvolumen = max(0, Included - Used); bei Overage=true bedeutet 0 keine Sperre. X-RateLimit-* beschreibt getrennt die kurzfristige Ratenbegrenzung.'
  termsOfService: https://firmenwatch.ch/agb
  contact:
    name: Firmenwatch Support
    url: https://firmenwatch.ch/kontakt
  license:
    name: 'Firmenevent-CH- und Firmenidentitaet-CH-Schema samt Testvektoren: CC0-1.0'
    url: https://creativecommons.org/publicdomain/zero/1.0/
servers:
- url: https://firmenwatch.ch/api/v1
  description: Produktion
security:
- bearerAuth: []
tags:
- name: UID
  description: Pruefung und Normalisierung von Unternehmens-Identifikationsnummern.
paths:
  /uid/validate:
    post:
      tags:
      - UID
      operationId: validateUid
      summary: UID pruefen und normalisieren
      description: Prueft die Pruefziffer nach der Spezifikation des Bundesamts fuer Statistik (Modulo 11 mit den Gewichten 5, 4, 3, 2, 7, 6, 5, 4) und schlaegt die UID anschliessend im Bestand nach. Eine formal gueltige UID muss nicht eingetragen sein.
      x-max-body-bytes: 4096
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - uid
              additionalProperties: false
              properties:
                uid:
                  type: string
                  maxLength: 40
                  description: UID in beliebiger Schreibweise.
            example:
              uid: CHE-000.000.000
      responses:
        '200':
          description: Pruefergebnis.
          content:
            application/json:
              schema:
                type: object
                required:
                - data
                properties:
                  data:
                    $ref: '#/components/schemas/UidValidation'
              example:
                data:
                  valid: true
                  normalized: CHE-000.000.000
                  found: false
                  company: null
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '400':
          description: Ungueltige Anfrage (invalid_request).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '401':
          description: Kein oder ungueltiger Schluessel (unauthorized).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            WWW-Authenticate:
              $ref: '#/components/headers/BearerChallenge'
        '402':
          description: Monatskontingent erschoepft (quota_exceeded).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '403':
          description: Abonnement nicht aktiv oder benoetigtes Schluesselrecht fehlt (forbidden).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Anfrage-Rumpf zu gross (payload_too_large).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '415':
          description: JSON-Medientyp erforderlich (unsupported_media_type).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '429':
          description: Ratenbegrenzung erreicht (rate_limited).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Unerwarteter Fehler (internal).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
        '503':
          description: Der Registerbestand wird gerade vollständig verifiziert (temporarily_unavailable). Dieselbe Abfrage später erneut senden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              description: Empfohlene Wartezeit vor demselben Abruf in Sekunden.
              schema:
                type: integer
                minimum: 1
            X-Firmenwatch-Monthly-Included:
              $ref: '#/components/headers/MonthlyIncluded'
            X-Firmenwatch-Monthly-Used:
              $ref: '#/components/headers/MonthlyUsed'
            X-Firmenwatch-Monthly-Reset:
              $ref: '#/components/headers/MonthlyReset'
            X-Firmenwatch-Monthly-Overage:
              $ref: '#/components/headers/MonthlyOverage'
components:
  schemas:
    Address:
      type: object
      required:
      - care_of
      - street
      - house_number
      - po_box
      - zip
      - town
      properties:
        masked:
          type: boolean
          description: 'true: genaue Adresse aus Datenschutzgründen nicht öffentlich; Ort bleibt verfügbar.'
        care_of:
          type:
          - string
          - 'null'
          description: Zustellvermerk, z. B. c/o Muster Treuhand AG.
        street:
          type:
          - string
          - 'null'
        house_number:
          type:
          - string
          - 'null'
        po_box:
          type:
          - string
          - 'null'
          description: Postfachnummer ohne das Wort Postfach.
        zip:
          type:
          - string
          - 'null'
        town:
          type:
          - string
          - 'null'
    UidValidation:
      type: object
      required:
      - valid
      - normalized
      - found
      properties:
        valid:
          type: boolean
          description: Format und Pruefziffer sind korrekt.
        normalized:
          type:
          - string
          - 'null'
          description: Kanonische Schreibweise CHE-000.000.000; null bei ungueltigem Format.
        found:
          type: boolean
          description: Die UID ist im Firmenwatch-Bestand vorhanden.
        reason:
          type: string
          enum:
          - format
          - checksum
          description: Grund bei ungueltiger UID.
        company:
          oneOf:
          - $ref: '#/components/schemas/Company'
          - type: 'null'
    Capital:
      type: object
      required:
      - nominal
      - paid
      - currency
      - verification
      - evidence_basis
      - publication
      properties:
        nominal:
          type: number
          description: Nominalkapital mit belegtem ISO-Waehrungscode.
        paid:
          type:
          - number
          - 'null'
          description: Belegtes liberiertes Kapital, soweit erfasst.
        currency:
          type: string
          pattern: ^[A-Z]{3}$
          description: In einer erfassten Registerpublikation belegter ISO-Waehrungscode.
        verification:
          type: string
          const: currency_evidenced
        evidence_basis:
          type: string
          const: structured_shab_company_capital
        publication:
          type: object
          required:
          - id
          - date
          - number
          - sub_rubric
          - state
          - url
          properties:
            id:
              type: string
            date:
              type: string
              format: date
            number:
              type:
              - string
              - 'null'
            sub_rubric:
              type: string
            state:
              type: string
              enum:
              - commonsActual
              - commonsNew
            url:
              type: string
              format: uri
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: object
          required:
          - code
          - message
          properties:
            code:
              type: string
              enum:
              - unauthorized
              - forbidden
              - not_found
              - invalid_request
              - payload_too_large
              - unsupported_media_type
              - conflict
              - precondition_required
              - rate_limited
              - quota_exceeded
              - stream_reset
              - temporarily_unavailable
              - internal
            message:
              type: string
            details:
              type: object
              additionalProperties: true
    Company:
      type: object
      required:
      - uid
      - name
      - slug
      - legal_form_code
      - legal_form
      - status
      - seat
      - canton
      - address
      - purpose
      - capital
      - industry
      - first_registered_at
      - deleted_at
      - last_event_at
      - url
      properties:
        uid:
          type: string
          example: CHE-000.000.000
        name:
          type: string
          example: Muster Handels AG
        slug:
          type: string
          example: muster-handels-ag-zuerich
        legal_form_code:
          type:
          - string
          - 'null'
          example: '0106'
        legal_form:
          type:
          - string
          - 'null'
          example: Aktiengesellschaft
        status:
          type: string
          enum:
          - active
          - in_liquidation
          - bankrupt
          - deleted
        seat:
          type:
          - string
          - 'null'
          description: Politische Gemeinde des Sitzes.
        canton:
          type:
          - string
          - 'null'
          example: ZH
        address:
          $ref: '#/components/schemas/Address'
        purpose:
          type:
          - string
          - 'null'
          description: Zweckumschreibung gemaess Handelsregister.
        capital:
          description: Nur vorhanden, wenn Betrag und Waehrung gemeinsam belegt sind; sonst null.
          oneOf:
          - $ref: '#/components/schemas/Capital'
          - type: 'null'
        industry:
          oneOf:
          - $ref: '#/components/schemas/Industry'
          - type: 'null'
        first_registered_at:
          type:
          - string
          - 'null'
          format: date
          description: SHAB publication date of the earliest evidenced new registration; not the cantonal journal date.
        deleted_at:
          type:
          - string
          - 'null'
          format: date
        last_event_at:
          type:
          - string
          - 'null'
          format: date
        url:
          type: string
          format: uri
          description: Oeffentliches Firmenprofil auf firmenwatch.ch.
    Industry:
      type: object
      description: Aus dem eingetragenen Zweck abgeleitete Firmenwatch-Klassifikation; keine amtliche NOGA-Zuordnung.
      required:
      - code
      - label
      - confidence
      - qualification
      - basis
      properties:
        code:
          type:
          - string
          - 'null'
          description: Interner, NOGA-naher Klassifikationscode.
        label:
          type: string
          description: Deutsche Bezeichnung der abgeleiteten Branche.
        confidence:
          type: number
          minimum: 0.45
          maximum: 1
        qualification:
          type: string
          enum:
          - derived
          - probable
        basis:
          type: string
          const: registered_purpose_text
  headers:
    MonthlyOverage:
      description: 'Optional: true erlaubt Abfragen oberhalb des eingeschlossenen Volumens. Bei false fuehrt ein ausgeschoepftes Monatskontingent zu HTTP 402. Der Verbrauch darf bei true groesser als Included sein.'
      required: false
      schema:
        type: boolean
    MonthlyIncluded:
      description: 'Optional: eingeschlossene Abfragen im wirksamen Kontotarif fuer den gebuchten UTC-Kalendermonat.'
      required: false
      schema:
        type: integer
        minimum: 0
    BearerChallenge:
      description: HTTP-Bearer-Herausforderung fuer einen fehlenden oder ungueltigen API-Schluessel.
      schema:
        type: string
        const: Bearer realm="firmenwatch"
    MonthlyUsed:
      description: 'Optional: kontoweit verbuchte Abfragen einschliesslich dieses zugelassenen Aufrufs. Alle Schluessel und geschuetzten MCP-Aufrufe teilen den Stand. Bestaetigte Rueckbuchungen koennen ihn senken; keine Reservierung fuer den naechsten Aufruf.'
      required: false
      schema:
        type: integer
        minimum: 0
    MonthlyReset:
      description: 'Optional: Unix-Zeit in Sekunden fuer den naechsten Monatsanfang um 00:00 UTC, bezogen auf den urspruenglich gebuchten Monat, auch nach einer Rueckbuchung.'
      required: false
      schema:
        type: integer
        format: int64
        minimum: 0
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: fw_live_…
      description: 'API-Schluessel als Bearer-Token im Authorization-Kopf. Produktivschluessel beginnen mit fw_live_. Das ist bewusst kein OAuth-Flow: Die unveraenderlichen Rechte werden beim Erstellen des Schluessels vergeben.'
      x-firmenwatch-scopes:
        api:read: Registerdaten, Ereignisstrom und eigene Prueffaelle lesen.
        actions:write: Status, Wiedervorlage und finale Entscheidung eigener Prueffaelle schreiben.
        portfolio:write: Eigene Portfolios aus einem angebundenen System synchronisieren.
externalDocs:
  description: Firmenevent CH 1.0 — offener Ereignisvertrag und Integrationsablauf
  url: https://firmenwatch.ch/standard
x-history-coverage:
  available_from: '2025-01-03'
  complete_history_guaranteed: false
  before_start: not_available