Aus dem Englischen übersetzt. Bei Abweichungen gilt die englische Seite. Auf Englisch lesen

Bestand und Preise in großen Mengen synchronisieren

Sende Mengen- und Preisänderungen für bis zu 100 SKUs pro Aufruf und lies das Ergebnis für jeden einzelnen Artikel.

Für regelmäßige Synchronisierungen aus einem ERP oder Lager ist POST /inventory/batch der richtige Endpoint: Er adressiert Varianten über die SKU, du musst also überhaupt keine Nembol-IDs speichern.

curl -X POST https://api.nembol.com/rest/v1/inventory/batch \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: stock-sync-2026-07-30T22:00" \
  -d '{"items": [
    {"sku": "VDJ-M-001", "quantity": 12},
    {"sku": "VDJ-L-001", "quantity": 0, "price": "44.90"}
  ]}'

Das lokale Schreiben erfolgt sofort, die Übertragung an die Kanäle asynchron. Die Antwort ist eine Operation. Artikel, die keiner Variante zugeordnet werden können, kommen in rejected_items mit einem Grund zurück (sku_not_found, sku_ambiguous), ohne dass der Rest fehlschlägt. Sie erscheinen außerdem als failed-Einträge in results: Die Operation endet mit partial. Eine in deinem System umbenannte SKU taucht also in deinen Alerts auf, statt ihre Synchronisierung stillschweigend zu beenden. Wenn sich kein Artikel anwenden lässt, antwortet der Aufruf mit 422 no_items_applied (Gründe in error.details.rejected_items) und nichts ändert sich.

results[] enthält einen Eintrag pro SKU und pro Kanal, auf dem das Produkt live ist, jeweils mit channel_account_id und listing_id:

  • pending: in Nembol gespeichert, der Kanal hat noch nicht geantwortet;
  • succeeded: der Kanal hat den neuen Bestand bzw. Preis;
  • failed: der Kanal hat die Änderung abgelehnt, seine Meldung steht in error. Die Operation wird partial.

Eine vorübergehende Ablehnung (z. B. Shopifys „this product is currently being modified“, wenn zwei Schreibvorgänge gleichzeitig dasselbe Produkt erreichen, oder ein Rate-Limit) wiederholt Nembol zuerst selbst: Während der Wiederholung bleibt das Ergebnis pending, und nur eine Übertragung, die weiterhin fehlschlägt, endet mit failed.

So weißt du immer, ob jeder Shop den Bestand erhalten hat, und genau das verhindert Überverkäufe: Warte auf den Webhook operation.completed (oder frage GET /operations/{id} ab) und reagiere auf die fehlgeschlagenen Einträge. Ein Produkt, das auf keinem Kanal live ist, erhält einen Eintrag mit channel_account_id: null, bereits succeeded: in Nembol gespeichert, nichts zu übertragen.

Upserts für den gesamten Katalog

Um ganze Produkte (inklusive Inhalt) anzulegen oder zu aktualisieren, verwende POST /products/batch. Der Endpoint hat dieselbe Zuordnung pro SKU (eine mehrdeutige SKU schlägt mit sku_ambiguous fehl, nichts wird geschrieben), bis zu 100 Artikel, Ergebnisse pro Artikel, status: "partial", wenn nur einige fehlschlagen, und 422 no_items_applied, wenn keiner angewendet wird. Nicht zugeordnete SKUs werden angelegt (Titel erforderlich), zugeordnete werden aktualisiert.

Angebotsaktionen in großen Mengen

POST /listings/batch führt eine action (publish, delist, resync oder retry) für bis zu 100 Paare aus (Produkt, Kanalkonto), z. B. um einen Katalog auf ein zweites eBay-Konto zu kopieren:

curl -X POST https://api.nembol.com/rest/v1/listings/batch \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: copy-to-ebay2-page-1" \
  -d '{"action": "publish",
       "items": [{"product_id": "prod_66a1f0", "channel_account_id": "chac_6aa12cab"},
                 {"product_id": "prod_66a1f1", "channel_account_id": "chac_6aa12cab"}]}'

Jedes Paar erhält ein eigenes Ergebnis in der Operation: pending, bis der Kanal antwortet, skipped, wenn es bereits im gewünschten Zustand ist (z. B. already_listed), andernfalls failed mit einem Code. Die Ergebnisse kommen in derselben Reihenfolge wie deine items zurück, und jedes wiederholt die product_id und channel_account_id, die du gesendet hast (auch unbekannte). So erkennst du immer, zu welchem Paar ein Ergebnis gehört. Größere Kataloge blätterst du in Schritten von 100 Paaren durch, mit einem eigenen Idempotency-Key pro Seite.

Preisänderungen in großen Mengen

POST /inventory/price_adjustment erhöht oder senkt den Preis jeder Variante von bis zu 100 Produkten um einen Prozentsatz oder einen Betrag (optional auf .99 gerundet) und überträgt die neuen Preise an die Live-Kanäle:

curl -X POST https://api.nembol.com/rest/v1/inventory/price_adjustment \
  -H "Authorization: Bearer $NEMBOL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_ids": ["prod_66a1f0", "prod_66a1f1"], "mode": "percentage", "value": -15, "rounding": true}'

Das Ergebnis jeder Variante enthält previous_price und price. Zum Rückgängigmachen sendest du die vorherigen Preise zurück:

POST /inventory/batch
{"items": [{"sku": "TEE-M", "price": "19.99"}, {"sku": "TEE-L", "price": "21.99"}]}

Stolperfallen

  • Ein Idempotency-Key pro Batch-Lauf. Wiederholst du einen Batch nach einem Timeout mit demselben Key, wird das gespeicherte Ergebnis zurückgegeben, statt die Änderungen doppelt anzuwenden.
  • Batch-Updates nehmen keine Bilder an. Ein zugeordneter Artikel mit images[] schlägt fehl (pro Artikel). Aktualisiere Bilder stattdessen mit PATCH /products/{id}.
  • quantity: 0 ist ein echter Wert. Die Variante ist damit überall ausverkauft.
  • Beobachte operation.completed, statt abzufragen, wenn du häufig synchronisierst.
  • Preise sind Strings ("44.90"), immer in der Basiswährung des Shops.
  • Ein Kanal kann weniger Einheiten anzeigen, als du hast (oder „nicht vorrätig“ in Google Merchant Center): Verkäufer können pro Kanal eine Mengenobergrenze festlegen (inventory in GET /channel_accounts).
  • Preisregeln des Kanals gelten zusätzlich zu den Preisen, die du festlegst oder anpasst (pricing am Kanalkonto).

Zuletzt aktualisiert am 20. Oktober 2026

Brauchst du Hilfe?

Schreib uns, und ein Mensch antwortet, meist innerhalb eines Werktags.

Auf dieser Seite