---
title: "Vollstaendigen Portfolio-Sync atomar veroeffentlichen"
method: POST
path: "/portfolios/{sourceKey}/syncs/{syncId}/commit"
tags: ["Portfolios"]
---

# Vollstaendigen Portfolio-Sync atomar veroeffentlichen

`POST /portfolios/{sourceKey}/syncs/{syncId}/commit`

## Request

- Base URL: `https://firmenwatch.ch/api/v1`
- URL: `https://firmenwatch.ch/api/v1/portfolios/{sourceKey}/syncs/{syncId}/commit`
- Auth: HTTP bearer

Prueft unter Konto- und Quellensperre nochmals expected_items, base_version und die Ueberwachungsplaetze des Tarifs. Erst danach werden Quellbestand, deduplizierte Firmenueberwachung, neue Portfolio-Version und unveraenderliche Commit-Quittung in derselben Datenbanktransaktion sichtbar. replace ersetzt den vollstaendigen Quellbestand und entfernt ausgelassene external_id-Werte; delta aendert nur explizite upsert- und delete-Werte. Mehrere external_id-Werte derselben UID bleiben im Quellbestand, belegen aber nur einen Ueberwachungsplatz. Ein Retry nach erfolgreichem Commit liefert dieselbe Quittung mit replayed=true und fuehrt keine Aenderung erneut aus. Ein unvollstaendiger Lauf bleibt fortsetzbar; ein base_version-Konflikt invalidiert dagegen den Staging-Lauf. Nach dem dauerhaften Commit wertet Firmenwatch fuer bis zu 10 000 Firmen sofort Massnahmen aus. Groessere Portfolios liefern activation.status=pending und werden spaetestens vom Tageslauf erfasst. Jeder Retry nach einem HTTP-5xx ist sicher: Ein Commit kann vor einem Fehler der nachgelagerten Aktivierung bereits dauerhaft sein; derselbe Commit-Abruf liest dann die Quittung und wiederholt die Aktivierung idempotent fuer dieselbe Portfolio-Version.

## Path parameters

- `sourceKey` string, required
- `syncId` string, required

## Response `200`

Atomare Commit-Quittung samt Aktivierungsstand oder idempotente Wiederholung derselben Portfolio-Version.

- object
  - `data` PortfolioCommitResult, required
    - `sync_id` string, required
    - `source_key` string, required
    - `mode` 'replace' | 'delta', required
    - `source_revision` string, nullable, required: Vom Quellsystem gelieferte, unveraendert quittierte Revision.
    - `relationship_default` 'customer' | 'supplier' | 'mandate' | 'lead' | 'partner' | 'null', nullable, required: Schlanke Einordnung fuer alle Firmen dieser Quelle. Eine lokale Firmenwatch-Annotation hat immer Vorrang; null bedeutet keine Quellvorgabe.
    - `version` integer, required: Neue Portfolio-Version; beim naechsten Lauf als base_version verwenden.
    - `received_items` integer, required: Eindeutige external_id-Werte, die der Lauf angenommen hat.
    - `source_items` integer, required: Eindeutige external_id-Werte im resultierenden Quellbestand.
    - `monitored_entities` integer, required: Resultierende unterschiedliche Schweizer UIDs und damit belegte Ueberwachungsplaetze.
    - `added` integer, required
    - `updated` integer, required
    - `removed` integer, required
    - `digest` string, required: SHA-256-Quittungsdigest des vollstaendigen resultierenden Quellbestands einschliesslich relationship_default.
    - `committed_at` string, date-time, required
    - `replayed` boolean, required: true bei einem Retry eines bereits erfolgreich committed Laufs.
    - `activation` union, required
      - PortfolioActivationReady
        - `status` 'ready', required
        - `entities` integer, required: Unterschiedliche Firmen dieser aktivierten Portfolio-Version.
        - `timeline_events` integer, required: Amtliche Ereignisse, die fuer diese Sofortauswertung gelesen wurden.
        - `candidates` integer, required: Von den Regeln erkannte Massnahmenkandidaten.
        - `evaluated` integer, required: In diesem Lauf neu angelegte oder aktualisierte Prueffaelle.
        - `open_cases` integer, required: Danach offene, ausstehende oder wiedervorgelegte Prueffaelle dieser Liste.
        - `critical_cases` integer, required: Davon kritische Prueffaelle.
        - `sync_version` integer, required
        - `evaluated_at` string, date-time, required
      - PortfolioActivationPending
        - `status` 'pending', required
        - `entities` integer, required: Portfolio-Firmen oberhalb der direkten Auswertungsgrenze.
        - `reason` 'portfolio_too_large', required
        - `limit` 10000, required: Hoechstzahl Firmen fuer die direkte Massnahmenauswertung im Commit-Abruf.
        - `sync_version` integer, required
      - PortfolioActivationSuperseded
        - `status` 'superseded', required
        - `entities` integer, required
        - `reason` 'invalid_scope' | 'not_found' | 'inactive' | 'version_changed' | 'no_active_scope' | 'scope_changed' | 'event_stream_changed' | 'ingest_not_published', required
        - `expected_sync_version` integer, required
        - `current_sync_version` integer, nullable, required: Aktuelle Version, sofern die Liste noch vorhanden und lesbar ist.

## Other responses

- `401`: Kein oder ungueltiger Schluessel (unauthorized).
- `402`: Monatskontingent oder Ueberwachungsplaetze erschoepft (quota_exceeded).
- `403`: Abonnement nicht aktiv oder portfolio:write fehlt (forbidden).
- `404`: Quelle oder Sync gehoert nicht zum Konto oder existiert nicht (not_found).
- `409`: Lauf unvollstaendig, nicht mehr offen oder base_version inzwischen veraltet (conflict).
- `429`: Ratenbegrenzung erreicht (rate_limited).
- `500`: Commit oder nachgelagerte Aktivierung meldete einen unerwarteten Fehler (internal). Der Commit kann bereits dauerhaft sein; exakt denselben Commit sicher wiederholen.
- `503`: Der Dienst ist voruebergehend nicht verfuegbar (temporarily_unavailable). Dieselbe Anfrage spaeter erneut senden.

---

[API](https://skmtc.dev/firmenwatch/apis/firmenwatch-api.md) · [All operations](https://skmtc.dev/firmenwatch/apis/firmenwatch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/firmenwatch/apis/firmenwatch-api/revisions/65e774135677?raw)
