---
title: "Bis zu 500 Portfolio-Zeilen bereitstellen"
method: PUT
path: "/portfolios/{sourceKey}/syncs/{syncId}/items"
tags: ["Portfolios"]
---

# Bis zu 500 Portfolio-Zeilen bereitstellen

`PUT /portfolios/{sourceKey}/syncs/{syncId}/items`

## Request

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

Speichert einen strikt validierten Stapel nur im unsichtbaren Staging-Bereich. Jeder Stapel enthaelt 1 bis 500 Zeilen und hoechstens 512 KiB. Nach UID- und UTC-Normalisierung inhaltlich gleiche external_id-Zeilen im selben Lauf sind idempotente Wiederholungen; sie erhoehen received_items nicht. Widerspruechlicher Inhalt fuer dieselbe external_id ergibt 409 und der ganze Stapel bleibt unveraendert. Auch eine formal gueltige, aber im verifizierten Registerbestand unbekannte UID verwirft den ganzen Stapel. replace akzeptiert ausschliesslich upsert; delta akzeptiert upsert und delete. Ein reiner delete-Stapel benoetigt keinen Register-Lesezugriff. In Summe duerfen nie mehr eindeutige IDs gespeichert werden als expected_items. Der Rumpf ist unkomprimiertes UTF-8-JSON. Nach jedem HTTP-5xx ist derselbe Stapel sicher wiederholbar.

## Path parameters

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

## Request body

- PortfolioSyncItemsRequest
  - `items` union[], required: Nach Normalisierung identische Dubletten sind idempotent erlaubt; widerspruechliche external_id-Werte nicht.
    - union
      - PortfolioSyncUpsertItem
        - `external_id` string, required: Dauerhafte Objektkennung des Quellsystems, ohne Rand-Leerzeichen oder Steuerzeichen.
        - `op` 'upsert', required
        - `uid` string, required: Gueltige Schweizer UID in ueblicher Schreibweise; wird kanonisch normalisiert.
        - `display_ref` string, nullable: Optionale sichtbare ERP-/CRM-Referenz ohne Rand-Leerzeichen oder Steuerzeichen.
        - `source_updated_at` string, date-time, nullable: Optionaler Quellzeitpunkt mit Zeitzone; Firmenwatch normalisiert ihn auf UTC.
      - PortfolioSyncDeleteItem
        - `external_id` string, required: Dauerhafte Objektkennung des Quellsystems.
        - `op` 'delete', required
        - `uid` unknown
        - `display_ref` unknown
        - `source_updated_at` unknown

## Response `200`

Atomar angenommener Stapel samt eindeutigem Fortschritt.

- object
  - `data` PortfolioSyncItemsResult, required
    - `source_key` string, required
    - `sync_id` string, required
    - `status` 'staging' | 'committed', required
    - `accepted_items` integer, required: In diesem Versuch neu gespeicherte eindeutige external_id-Werte.
    - `replayed_items` integer, required: Bereits bekannte oder nach Normalisierung gleiche Zeilen.
    - `received_items` integer, required
    - `expected_items` integer, required
    - `remaining_items` integer, required
    - `replayed` boolean, required: true, wenn dieser Versuch keine neue eindeutige Zeile gespeichert hat.

## Other responses

- `400`: Ungueltige Anfrage (invalid_request).
- `401`: Kein oder ungueltiger Schluessel (unauthorized).
- `402`: Monatskontingent erschoepft (quota_exceeded).
- `403`: Abonnement nicht aktiv oder benoetigtes Schluesselrecht fehlt (forbidden).
- `404`: Quelle oder Sync gehoert nicht zum Konto oder existiert nicht (not_found).
- `409`: Modus, Laufstatus, expected_items oder bereits gespeicherter Zeileninhalt widerspricht (conflict).
- `429`: Ratenbegrenzung erreicht (rate_limited).
- `500`: Unerwarteter Fehler (internal).
- `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)
