Zum Hauptinhalt springen
Über den Endpunkt /products können Sie eine Schnittstelle nutzen, um Produktdaten und Lagerbestände in unserem Shop-System zu verwalten. Sie können damit Produkte erstellen, bearbeiten, filtern, abrufen und löschen sowie Lagerbestandsinformationen zu Produkten abrufen, aktualisieren und löschen. Hinzu kommen Variantenattribute, Produktvarianten und Set-Produkte. Für größere Datenmengen stehen Bulk-Endpunkte bereit. Die folgende Übersicht zeigt, welche Endpunkte welche Methoden unterstützen. Im Anschluss beschreibt die Seite die Datenfelder und die zeitgesteuerten Preise. Anschließend werden die einzelnen Endpunkte geordnet nach Produkten, Variantenattributen, Produktvarianten, Lagerbeständen und Set-Produkten beschrieben.

Unterstützte Methoden

Datenfelder

Felder werden in der Konfiguration verwaltet und als ein JSON-Objekt in der Tabelle gespeichert. Es wird unterschieden zwischen Standardproduktdatenfeldern und benutzerdefinierten Produktdatenfeldern. Benutzerdefinierte Produktdatenfelder können beliebig angelegt werden, während Standardproduktdatenfelder vom Shop vorgegeben werden und immer definiert sind. Alle benutzerdefinierte Produktdatenfelder sind im Abschnitt custom zu finden. Alle anderen Einträge stellen Standardproduktdatenfelder dar. Die Felder statistics, statisticsPerPoint und ratingApprovalConfig liefert nur GET products/{productId}. Die Listenabfrage GET products enthält sie nicht.

Beispielhafter Datensatz

Zeitgesteuerte Preise (Aktionspreise)

Produkte können Preise mit einem Gültigkeitszeitraum tragen. Damit lassen sich Aktionspreise im Voraus pflegen, ohne dass zum Aktionsstart ein Import oder eine manuelle Änderung nötig ist. Dieser Abschnitt beschreibt zuerst das Format der Preisfelder in Antworten, danach das erlaubte Format in Requests, anschließend die Wirkung im Shop und zuletzt die Validierung. Wer nur wissen will, was an bestehenden Anbindungen anzupassen ist, findet die kurze Antwort im folgenden Hinweis.
Breaking Change in Antworten. Jedes Feld vom Typ Price wird in Produkt-Antworten nicht mehr als String, sondern als Objekt ausgeliefert. Betroffen sind das Basisfeld price und alle benutzerdefinierten Preisfelder. Anbindungen, die den Preis direkt als String weiterverarbeiten, müssen angepasst werden. Die Änderung betrifft alle Endpunkte, die Produktdaten ausliefern, also die Abfrage einzelner Produkte, Listenabfragen, die Antworten von Erstellen und Aktualisieren sowie die Bulk-Endpunkte.

Preisfelder in Antworten

Ein Preisfeld enthält den Standardpreis und die Liste der geplanten Aktionspreise. Die Liste scheduledPrices ist immer vorhanden. Sind keine Aktionspreise gepflegt, wird sie als leeres Array ausgeliefert.

Antwort (Auszug)

Vor dieser Änderung stand an derselben Stelle ein reiner String:

Parameterübersicht

Der Zeitraum ist an beiden Enden einschließend. Ein Eintrag mit endDate auf 2026-08-31T23:59:59.000Z ist zu genau dieser Sekunde noch aktiv.
Bei Produktvarianten kann ein Preisfeld auch null sein. Der Typ eines Preisfelds ist für Anbindungen deshalb object | null. Wann dieser Fall auftritt, beschreibt der Abschnitt Methoden für Produktvarianten.

Preisfelder in Requests

Eingehend bleibt die Schnittstelle abwärtskompatibel. Ein Preisfeld darf weiterhin als reiner String übergeben werden. Bestehende Schreibzugriffe funktionieren damit unverändert weiter. Angepasst werden muss nur, wer Aktionspreise über die Schnittstelle pflegen will. Alternativ nimmt die Schnittstelle das Objekt in derselben Struktur an, in der sie es ausliefert. Wird das Feld scheduledPrices nicht mitgeschickt, bleiben bestehende Einträge erhalten. Ein leer übergebenes Array löscht alle Einträge.

Request Body (Auszug)

Wirkung im Shop

Zu jedem Zeitpunkt wird genau ein Preis aufgelöst. Die Auflösung geschieht bei jeder Anfrage neu, es wird also kein Preis vorberechnet und gespeichert. Welcher Preis gilt, entscheiden drei Regeln. Erstens greift ein Aktionspreis nur dann, wenn er den Standardpreis nicht überschreitet. Einträge über dem Standardpreis werden bei der Auflösung übersprungen. In diesem Fall bleibt der Standardpreis gültig. Zweitens wird bei mehreren gleichzeitig aktiven Einträgen der niedrigste Preis verwendet. Bei gleichem Preis gewinnt der Eintrag mit dem späteren startDate, ein offener Beginn verliert also. Sind auch die Startzeitpunkte gleich, entscheidet die Reihenfolge im Array. Drittens ersetzt ein eigenes Preisfeld an einer Variante den Standardpreis und den Zeitplan des Basisprodukts gemeinsam. Mehr dazu im Abschnitt Methoden für Produktvarianten.
Die Validierung prüft einen Aktionspreis nicht gegen den Standardpreis. Ein Eintrag über dem Standardpreis wird gespeichert und in der Antwort wieder ausgeliefert, er greift aber nie. Das wirkt auch nachträglich. Wird der Standardpreis später unter einen bestehenden Aktionspreis gesenkt, verliert dieser Eintrag stillschweigend seine Wirkung.
Für den Suchindex gilt eine Einschränkung. Preisfelder werden ausschließlich mit ihrem Standardpreis indexiert. Geplante Aktionspreise stehen im Index nicht zur Verfügung und können deshalb nicht gefiltert oder sortiert werden.

Validierung und Fehlerschlüssel

Jeder Eintrag wird einzeln geprüft. Fehlerhafte Angaben führen zu 400 Bad Request. Der Fehlerschlüssel enthält den Index des betroffenen Eintrags im Array. Geprüft wird ausschließlich der Eintrag selbst. Ein Vergleich mit dem Standardpreis oder mit anderen Einträgen findet nicht statt. Überlappende Zeiträume und Preise über dem Standardpreis führen deshalb nicht zu einem Fehler, sondern wirken sich erst bei der Auflösung aus. Welcher Eintrag dann greift, beschreibt der Abschnitt Wirkung im Shop.

Hinweis zum internen Speicherformat

Für Werkzeuge, die direkt auf dem gespeicherten Datenblob eines Produkts oder einer Kategorie arbeiten, gilt eine Besonderheit. Dort tragen die beiden Wrapper eine andere Bezeichnung als im REST-Vertrag. Die inneren Schlüssel eines Eintrags sind identisch. Beide Lesepfade akzeptieren zusätzlich das alte Format als reinen String. Bestandsdaten müssen dafür nicht migriert werden.

Methoden für Produkte

Die hier dokumentierten Endpunkte ermöglichen den Lese-, Schreib-, Änderungs- und Löschzugriff auf Produktdaten im Shopsystem. Sie können zur Verwaltung des Produktkatalogs genutzt werden, sowohl zur Initialbefüllung als auch zur laufenden Aktualisierung von Inhalten. Zusätzlich stehen Endpunkte zur Verfügung, um Produktsuchen auf Basis definierter Regeln durchzuführen. Da jeder Subshop eine eigene Produktmenge hat, sollen URLs den Parameter subshopId enthalten. Ist der angegebene Subshop im Shop nicht vorhanden, wird die Anfrage mit dem Statuscode 400 Bad Request und dem Fehlercode "invalidValue" für das Feld subshopId abgelehnt. Für alle Endpunkte ist eine gültige Authentifizierung erforderlich. Die jeweiligen Berechtigungen zum Lesen, Schreiben, Erstellen oder Löschen von Produkten müssen vorhanden sein.

GET products

Mit diesem Endpunkt können Sie eine Liste aller Produkte im System abrufen. Optional kann die Ergebnismenge mithilfe von Filterparametern eingeschränkt werden, beispielsweise auf Produkte, die einer bestimmten Kategorie zugeordnet sind (inCategory) oder aus einer bestimmten Kategorie ausgeschlossen werden sollen (notInCategory). Beide Parameter dürfen nicht gleichzeitig verwendet werden. Damit der Endpunkt verwendet werden kann, müssen die entsprechenden Berechtigungen zum Lesen von Produkten vorhanden sein.

Reihenfolge bei inCategory

Wird inCategory verwendet und kein eigener sort-Parameter angegeben, liefert der Endpunkt die Produkte genau in der im Shop gepflegten Kategoriereihenfolge. GET products?inCategory={categoryId} und GET categories/{categoryId}/products sind dabei gleichwertig: Der Kategorie-Endpunkt setzt intern nichts anderes als inCategory und wertet denselben Code aus. Es gibt also keinen Grund, für die Kategoriereihenfolge auf den anderen Endpunkt zu wechseln.
Sobald Sie selbst einen sort-Parameter setzen, gilt die Kategoriereihenfolge für keinen der beiden Endpunkte mehr. Ihre Sortierung ersetzt sie vollständig. Wenn Sie die ursprüngliche Reihenfolge benötigen, lassen Sie sort einfach weg.

Beispiel

Antwort

Filterfelder

Alle Produktdatenfelder lassen sich filtern. Benutzerdefinierte Felder tragen das Präfix custom., beispielsweise filter_eq[custom.brand]=Barbour.
Filterbar bedeutet nicht „mit jeder Operation kombinierbar”: Welche Filteroperationen erlaubt sind, hängt vom Datentyp des Feldes ab. Auf einem Enum-Feld wie active sind beispielsweise nur eq und neq zulässig, contains führt zu 400 Bad Request mit dem Typ illegalOperation. Die vollständige Matrix steht ist in den API Basics: Erlaubte Operationen je Feldtyp zu finden.
Zusätzlich zu den Produktdatenfeldern stehen folgende Filter als einfache Query-Parameter zur Verfügung (ohne filter_-Präfix und ohne Klammern): Die Attribute inCategory und notInCategory bzw. inSetProduct und notInSetProduct dürfen nicht gleichzeitig gesetzt werden (Fehler invalidCombination). Das Gleiche gilt für notInAnyCategory=true in Verbindung mit inCategory oder notInCategory.

Sortierfelder

Alle Produktdatenfelder außer den Typen Liste, Map, Bild und Video. Eine Sortierung nach diesen Typen führt zu einer Fehlermeldung 400 Bad Request mit dem Typ invalidValue. Syntax: sort=<Feldname>:asc bzw. sort=<Feldname>:desc. Der Feldname ist Pflicht. Eine Kurzform wie sort=asc ist ein Syntaxfehler. Mehrere Sortierkriterien werden über mehrere sort-Parameter übergeben. Weitere Informationen finden Sie in den API Basics: Sortierung.

Sonstige Parameter

Zusätzlich stehen folgende Query-Parameter zur Verfügung:

Fehlercodes

GET products/{productId}

Mit diesem Endpunkt können Sie die vollständigen Daten eines einzelnen Produkts abrufen. Geben Sie dazu die Produkt-ID als Pfadparameter an. Neben den Basisdaten werden auch benutzerdefinierte Felder zurückgegeben. Damit der Endpunkt verwendet werden kann, müssen die entsprechenden Berechtigungen zum Lesen von Produkten vorhanden sein.

Beispiel

Antwort

Fehlercodes

GET products/{productId}/url

Mit diesem Endpunkt können Sie die vollständige URL eines Produkts abrufen. Für die Nutzung dieses Endpunkts sind Leseberechtigungen für Produkt-Daten erforderlich.

Beispiel

Antwort

Fehlercodes

GET products/{productId}/categories

Über diesen Endpunkt können Sie die Kategorien (Warengruppen) abrufen, denen ein Produkt zugeordnet ist. Die Kategorien werden in der Reihenfolge angezeigt, in der die Zuordnungen angelegt wurden. Die Liste wird nicht seitenweise ausgeliefert, sondern enthält immer alle Kategorien des Produkts. Jeder Eintrag hat den Aufbau einer Kategorie aus der API-Referenz Kategorien. Mit dem Parameter withExternData=yes liefert jeder Eintrag zusätzlich _parent und _children. Um den Endpunkt verwenden zu können, müssen die entsprechenden Berechtigungen zum Lesen von Kategorien vorhanden sein.

Beispiel

Antwort

Fehlercodes

GET products/testRule

Mit diesem Endpunkt können Sie gezielt Produkte abrufen, die einer oder mehreren angegebenen Regeln entsprechen. Die Regeln werden als JSON-formatiertes Array in der Query-URL übergeben und ermöglichen eine flexible Filterung nach Produktfeldern wie beispielsweise Aktivitätsstatus, Artikelnummern oder Preisangaben. Die Regeln dürfen nur gültige Felder und zulässige Operatoren enthalten. Damit dieser Endpunkt verwendet werden kann, müssen die entsprechenden Berechtigungen zum Lesen von Produktdaten vorhanden sein. Der Parameter size ist Pflicht und muss einen Wert zwischen 1 und 1000 enthalten. Der value einer Regel muss immer ein String sein, auch bei Zahlenwerten.

Beispiel

Die Regeln werden in der URL als JSON-Array kodiert und über den Parameter rules übergeben. Um korrekt interpretiert zu werden, muss dieser Parameter URL-dekodiert werden.
Die URL ruft Produkte ab, die zwei Bedingungen erfüllen:
  1. Das Feld active muss den Wert always haben.
    Es werden nur dauerhaft aktive Produkte berücksichtigt.
  2. Die Artikelnummer (itemNumber) muss die Ziffer „5“ enthalten.
    Es werden nur Produkte ausgewählt, deren Artikelnummer irgendwo die „5“ enthält (beispielsweise 11-2518).
Filter und Sortierungen auf Preisfeldern greifen auf den Standardpreis zu. Geplante Aktionspreise werden dabei nicht berücksichtigt.

Antwort

Mögliche Werte für mode

gt (größer), gte (größer oder gleich), lt (kleiner), lte (kleiner oder gleich), eq (gleich), neq (ungleich), contains (enthält), notcontains (nicht enthält), begins (beginnt mit), ends (endet mit), within (Listenwert enthalten), notwithin (Listenwert nicht enthalten)

Fehlercodes

POST products

Mit dem Endpunkt /products können neue Produkte im Shop-System angelegt werden. Alle für die Erstellung erforderlichen Produktinformationen müssen im Request Body übergeben werden. Die Antwort enthält die vollständigen Produktdaten des neu erstellten Produkts im JSON-Format. Wenn die übergebene Produkt-ID bereits vergeben ist, lehnt der Shop die Anfrage mit dem Status 409 Conflict ab. Ein vorhandenes Produkt wird dabei nicht überschrieben. Zum Erstellen eines Produkts sind entsprechende Berechtigungen erforderlich. Mit dem optionalen Parameter updateIndex=yes wird der Suchindex für das Produkt sofort aktualisiert. Ohne diesen Parameter übernimmt der nächste geplante Lauf die Aktualisierung.

Beispiel

Request Body

Der Preis darf wie im Beispiel als String übergeben werden. Sollen zugleich Aktionspreise gepflegt werden, ist die Objektform zu verwenden, die der Abschnitt Preisfelder in Requests beschreibt.

Antwort

Fehlercodes

Fehler in geplanten Aktionspreisen werden je Eintrag gemeldet. Die Schlüssel beschreibt der Abschnitt Validierung und Fehlerschlüssel. Verweist ein Eintrag im Feld set auf ein nicht existierendes Produkt, lehnt der Shop die Anfrage mit dem Statuscode 400 Bad Request und dem Typ “notFound” ab. Der Fehlerschlüssel lautet set[<i>].id, wobei <i> der Index des Eintrags im Array ist.

PUT products/{productId}

Mit dem Endpunkt products/{productId} können Produktdaten aktualisiert werden. Wird ein Produkt mit der angegebenen ID nicht gefunden, kann bei gesetztem Parameter createMissing=yes automatisch ein neues Produkt angelegt werden. Im Request-Body müssen nur die Felder angegeben werden, die geändert werden sollen. Felder, die nicht übermittelt werden, behalten ihren Wert. Mit dem Feld set werden die Mitglieder eines Set-Produkts als Ganzes ersetzt. Mit dem optionalen Parameter updateIndex=yes wird der Suchindex für das Produkt sofort aktualisiert. Das optionale Feld set kann benutzt werden, um andere Produkte zusammen mit dem Aktuellen einem Set zuzuweisen. Alternativ können die Endpunkte für Set-Produkte genutzt werden. Zum Bearbeiten oder Anlegen eines Produkts sind entsprechende Berechtigungen erforderlich.

Beispiel

Request-Body

Antwort

Die Antwort enthält keinen Set-Preis. Er wird nicht gespeichert, sondern bei Bedarf berechnet. Wie Sie ihn abrufen, beschreibt der Abschnitt POST products/setproducts/preview.

Fehlercodes

DELETE products/{productId}

Mit dem Endpunkt products/{productId} kann ein Produkt mit der angegebenen ID dauerhaft gelöscht werden. Dieser Vorgang entfernt das Produkt vollständig mitsamt seiner Varianten vollständig aus dem System. Bestellungen, die das Produkt enthalten, behalten ihre Daten. Mit dem optionalen Parameter updateIndex=yes wird der Suchindex sofort aktualisiert. Zum Löschen eines Produkts sind entsprechende Berechtigungen erforderlich.

Beispiel

Antwort

Fehlercodes

Bulk-Methoden für Produkte

In diesem Abschnitt werden die Bulk-Endpunkte beschrieben, mit denen mehrere Datensätze in einem einzigen Request abgefragt oder verarbeitet werden können.

POST bulk/products

Ermöglicht das massenhafte Erstellen und Aktualisieren von Produktdaten in einem einzigen Request. Der Request-Body ist ein JSON-Array, in dem jedes Element ein Produkt mit ID beschreibt. Erstell- und Schreibrechte für Produkte sind erforderlich. Standardmäßig werden nur Produkte aktualisiert. Wenn der Parameter createMissing=yes gesetzt wird, werden Produkte, die noch nicht existieren, aus der Anfrage automatisch neu angelegt. In einem Request können maximal 1000 Einträge verarbeitet werden. Dieses Limit gilt für alle Bulk-Endpunkte der API gemeinsam. Weitere Informationen finden Sie in den API Basics: Bulk-Endpunkte. Fehler auf Zeilenebene brechen den Request nicht ab. Ungültige oder übersprungene Einträge erscheinen in der Antwort unter skippedLines mit lineNumber (ab 0 gezählt), productId, errorType (beispielsweise notFound oder invalidParameters) und fieldErrors. Unter items stehen die IDs der geschriebenen Produkte.

Beispiel

Request Body

Antwort

Fehlercodes

Methoden für Variantenattribute

Über die Endpunkte im Bereich products/variants/ können Sie die Variantenattribute und die dazugehörigen Optionen verwalten, die zur Bildung von Produktvarianten in Ihrem Shop verwendet werden. Sie können neue Attribut-Optionen hinzufügen, bestehende anpassen oder Attribute löschen. Ebenso können Sie die Reihenfolge der Optionen in der Anzeige ändern (siehe PUT products/variants/{attributeId}/positions) oder gezielt einzelne Optionen abfragen. Für alle hier dokumentierten Endpunkte ist eine gültige Authentifizierung erforderlich. Darüber hinaus benötigen Sie die Berechtigungen zum Lesen, Erstellen, Bearbeiten oder Löschen von Produktvarianten.

GET products/variants

Mit diesem Endpunkt kann eine Liste aller im Shop-System definierten Varianten-Attribute und deren verfügbaren Optionen abgerufen werden. Die Antwort gibt Aufschluss darüber, welche Attributnamen (beispielsweise „Größe“, „Farbe“) verwendet werden und welche Ausprägungen pro Attribut zur Verfügung stehen. Dies ist besonders hilfreich für das Anlegen oder Bearbeiten von Produktvarianten. Für diesen Endpunkt ist eine gültige Authentifizierung erforderlich. Sie müssen über die Berechtigung zum Lesen von Produktvarianten verfügen. Mit dem Parameter textSearch können Sie die Liste auf Attribute einschränken, deren Name oder Optionen den angegebenen Text enthalten.

Beispiel

Antwort

Fehlercodes

GET products/variants/{id}

Mit diesem Endpunkt kann entweder ein Varianten-Attribut mit seinen zugehörigen Optionen oder eine einzelne Variante-Option abgerufen werden. Wird in der URL ein Attributname (beispielsweise „Farbe“) übergeben, liefert die Antwort alle Optionen zu diesem Attribut. Wird hingegen eine Options-ID übergeben, muss zusätzlich der Parameter singleOption=yes gesetzt werden, um die Daten zu einer konkreten Variante-Option abzurufen. Die Suche nach dem Attributnamen erfolgt unabhängig von der Groß-/Kleinschreibung. Um diesen Endpunkt nutzen zu können, ist eine gültige Authentifizierung erforderlich. Sie benötigen außerdem die Berechtigung, Produktvarianten lesen zu dürfen.

Beispiel (Attribut)

Antwort (Attribut)

Beispiel (Option)

Antwort (Option)

Fehlercodes

POST products/variants

Mit diesem Endpunkt wird ein neues Varianten-Attribut mit beliebigen Optionswerten erstellt. Sollte das Attribut bereits existieren (Groß-/Kleinschreibung wird nicht berücksichtigt), wird es um die neuen, bislang nicht vorhandenen Optionen ergänzt. Ist eine der angegebenen Optionen für das Attribut bereits vorhanden, wird der Vorgang mit einem Konfliktfehler (409) abgebrochen. Um diesen Endpunkt nutzen zu können, ist eine gültige Authentifizierung erforderlich. Sie benötigen außerdem die Berechtigung zum Erstellen von Produktvarianten.

Beispiel

Request-Body

Antwort

Fehlercodes

PUT products/variants/{attributeId}

Mit diesem Endpunkt wird ein bestehendes Varianten-Attribut aktualisiert. Die Suche nach dem Attributnamen erfolgt unabhängig von der Groß-/Kleinschreibung. Es können neue Optionen hinzugefügt und bestehende bearbeitet werden. Eine Option mit id wird umbenannt, eine Option ohne id wird neu angelegt und hinter den vorhandenen Optionen eingeordnet. Die Umbenennung wird auf alle Produkte übertragen, die die Option verwenden. Das Umbenennen des Attributs ist über das optionale Feld newAttributeName im Request-Body möglich. Bereits existierende Optionen, die im Request-Body nicht enthalten sind, bleiben unverändert bestehen und behalten ihre Position. Mit dem Query-Parameter complete=true geben Sie an, dass options die vollständige Liste aller Optionen des Attributs ist. Dann gilt zusätzlich:
  • Optionen, die im Request fehlen, werden entfernt.
  • Alle Optionen werden in der Reihenfolge des Requests eingeordnet.
  • Wird eine zu entfernende Option noch von einem Produkt verwendet, lehnt der Shop den gesamten Request ab, ohne etwas zu ändern. Die Antwort nennt die betroffenen Produkte.
Um nur die Reihenfolge zu ändern, verwenden Sie PUT products/variants/{attributeId}/positions. Für die Nutzung dieses Endpunkts ist eine gültige Authentifizierung erforderlich. Sie benötigen außerdem die Berechtigung zum Schreiben von Produktvarianten. Mit complete=true ist zusätzlich die Berechtigung zum Löschen von Produktvarianten nötig, weil dabei Optionen entfernt werden können.

Query-Parameter

Beispiel

Request-Body

Antwort

Fehlercodes

PUT products/variants/{attributeId}/positions

Mit diesem Endpunkt legen Sie die Reihenfolge fest, in der die Optionen eines Varianten-Attributs angeboten werden. Die Optionen werden in der Reihenfolge des Requests eingeordnet. Optionen, die im Request fehlen, folgen danach in ihrer bisherigen Reihenfolge. Namen und Optionen selbst ändern sich nicht. Die Suche nach dem Attributnamen erfolgt unabhängig von der Groß-/Kleinschreibung. Jede Option geben Sie über ihre id oder ihren Namen in option an. Ist beides angegeben, gilt die id. Für die Nutzung dieses Endpunkts ist eine gültige Authentifizierung erforderlich. Sie benötigen außerdem die Berechtigung zum Schreiben von Produktvarianten.

Beispiel

Request-Body

Antwort

Die Antwort enthält das Attribut mit allen Optionen in der neuen Reihenfolge.

Fehlercodes

DELETE products/variants/{id}

Mit diesem Endpunkt können Sie entweder ein Varianten-Attribut samt aller zugehörigen Optionen oder eine einzelne Option löschen. Wird das Attribut derzeit noch von einem Produkt verwendet, wird der Vorgang mit einem Konfliktfehler abgebrochen. Um diesen Endpunkt nutzen zu können, ist eine gültige Authentifizierung erforderlich. Sie benötigen außerdem die Berechtigung, Produktvarianten zu löschen. Wird in der URL ein Attributname übergeben, werden das Attribut und alle zugehörigen Optionen gelöscht. Die Suche nach dem Attributnamen erfolgt unabhängig von der Groß-/Kleinschreibung. Wird hingegen eine Options-ID übergeben, muss zusätzlich der Parameter singleOption=yes gesetzt werden, um nur diese einzelne Option zu löschen.

Beispiel (Attribut)

Antwort (Attribut)

Beispiel (Option)

Antwort (Option)

Fehlercodes

Methoden für Produktvarianten

Mithilfe der folgenden Endpunkte können Produktvarianten innerhalb eines bestehenden Produkts verwaltet werden. Varianten stellen spezifische Ausprägungen eines Produkts dar, beispielsweise Größen oder Farben, und basieren auf den zuvor definierten Variantenattributen. Über die API können Varianten einzeln abgerufen, erstellt, aktualisiert oder gelöscht werden. Zusätzlich lassen sich die Variantenattribute eines Produkts abrufen, festlegen und in ihrer Reihenfolge verschieben. Die meisten Endpunkte in diesem Abschnitt prüfen die Lese-, Erstellungs- oder Schreibberechtigungen für Produktvarianten. Drei Endpunkte benötigen dagegen Berechtigungen für Produkte. Das Löschen einer Variante erfordert die Löschberechtigung für Produkte, das Abrufen der Variantenattribute die Leseberechtigung und das Verschieben eines Variantenattributs die Schreibberechtigung. Auch Varianten tragen ihren Preis als Objekt. Setzt eine Variante ein eigenes Preisfeld, ersetzt dieses den Standardpreis und den Zeitplan des Basisprodukts gemeinsam. Eine Variante mit eigenem Preis und ohne Aktionspreise erbt die Aktion des Basisprodukts also nicht. Setzt eine Variante kein eigenes Preisfeld, liefert die Antwort für dieses Feld null und nicht den Wert des Basisprodukts. Anbindungen müssen diesen Fall abfangen, der Typ ist object | null.

GET products/{productId}/variants

Mit diesem Endpunkt kann eine Liste aller Varianten für das angegebene Produkt geladen werden. Varianten sind Produktversionen, die sich durch unterschiedliche Attributkombinationen (beispielsweise Größe oder Farbe) vom Hauptprodukt unterscheiden. Die Antwort enthält grundlegende Produktdaten sowie die zugehörigen Attributwerte unter selection. Um diesen Endpunkt nutzen zu können, sind entsprechende Berechtigungen zum Lesen von Produktvarianten erforderlich. Die Antwort ist seitenweise aufgebaut. Mit size legen Sie fest, wie viele Varianten eine Seite enthält (Standardwert 10). Die nächste Seite rufen Sie mit dem unverändert übernommenen Parameter pageToken aus nextPageToken der vorherigen Antwort auf. Mit dem Parameter textSearch können Sie die Liste auf Varianten einschränken, deren Name, Beschreibung oder Attributwerte den angegebenen Text enthalten.

Beispiel

Antwort

Fehlercodes

GET products/{productId}/variants/{variantId}

Mit diesem Endpunkt kann eine bestimmte Produktvariante anhand ihrer ID innerhalb eines Produkts geladen werden. Die Produkt-ID wird als Teil der URL übergeben, ebenso die Varianten-ID. Die Antwort enthält die zugehörigen Variantendaten inklusive Preis, Artikelnummer, Auswahlattribute (selection) und weiterer Detailinformationen. Für die Nutzung dieses Endpunkts sind entsprechende Berechtigungen zum Lesen von Produktvarianten erforderlich.

Beispiel

Antwort

Fehlercodes

PUT products/{productId}/variants/{variantId}

Über diesen Endpunkt können die Daten einer bestimmten Produktvariante mithilfe ihrer Produkt-ID und Varianten-ID aktualisiert werden. Die Variante wird über die angegebenen IDs identifiziert. Felder, die nicht im Request-Body angegeben sind, behalten ihren Wert. Die Attributkombination (selection) darf nicht im Request-Body stehen und lässt sich nicht ändern. Für die Nutzung dieses Endpunkts sind Schreibrechte für Produktvarianten erforderlich.

Beispiel

Request-Body

Antwort

Fehlercodes

GET products/{productId}/variantAttributes

Über diesen Endpunkt können die Variantenattribute eines Produkts in der Reihenfolge abgerufen werden, in der sie angeboten werden. Jeder Eintrag enthält den Namen des Attributs (name) und seine Position (position, ab 0 gezählt). Die Antwort ist nicht seitenweise aufgebaut und endReached ist immer true. Für die Nutzung dieses Endpunkts sind Leseberechtigungen für Produkte erforderlich.

Beispiel

Antwort

Fehlercodes

POST products/{productId}/variantAttributes

Über diesen Endpunkt wird die Liste der Variantenattribute eines Produkts festgelegt, anhand derer sich dessen Varianten unterscheiden. Jedes übergebene Attribut muss im Shop mit mindestens einer Option existieren (siehe POST products/variants). Der Endpunkt erzeugt selbst keine Varianten. Konkrete Varianten werden über den Endpunkt POST products/{productId}/variants/manage angelegt. Wenn das Produkt bereits Variantenattribute hat und Attribute ergänzt oder entfernt werden, bricht der Vorgang standardmäßig mit einem 400-Fehler vom Typ conflict ab. Der Grund dafür ist, dass dabei alle bestehenden Varianten wegfallen würden. Um diesen Abbruch zu umgehen, kann der optionale Parameter force=yes verwendet werden. In diesem Fall werden alle bisherigen Varianten des Produkts gelöscht und die Optionen der Attribute am Produkt zurückgesetzt. Wenn das Produkt noch keine Variantenattribute hatte, werden die Attribute ohne Konflikt gesetzt. Für die Nutzung dieses Endpunkts sind Erstellberechtigungen für Produktvarianten erforderlich.

Beispiel

Request-Body

Antwort

Fehlercodes

POST products/{productId}/variantAttributes/move

Mithilfe dieses Endpunkts kann ein Variantenattribut eines Produkts an eine neue Position verschoben werden. Die Position legt die Reihenfolge fest, in der die Attribute angeboten werden. Das Produkt muss mindestens zwei Variantenattribute besitzen. Für die Nutzung dieses Endpunkts sind Schreibberechtigungen für Produkte erforderlich.

Beispiel

Request-Body

position wird ab 0 gezählt und muss kleiner sein als die Anzahl der Variantenattribute des Produkts.

Antwort

Fehlercodes

POST products/{productId}/variants/manage

Dieser Endpunkt ermöglicht es, gezielt bestimmte Varianten-Kombinationen für ein bestehendes Produkt anzulegen. Die Variantenattribute des Produkts müssen zuvor über die API unter POST products/{productId}/variantAttributes festgelegt werden. Es werden nur die explizit übermittelten Kombinationen erzeugt. Bereits existierende Kombinationen werden übersprungen und erscheinen nicht in der Antwort. Optional kann je Eintrag eine id für die neue Variante übergeben werden. Fehlt diese, vergibt der Shop eine ID. Der Endpunkt eignet sich besonders, wenn nicht alle theoretisch möglichen Kombinationen eines Produkts benötigt werden, sondern nur eine gezielte Auswahl. Für die Nutzung sind Erstellberechtigungen für Produktvarianten erforderlich.

Beispiel

Request-Body

Antwort

Fehlercodes

DELETE products/{productId}/variants/{variantId}

Mit diesem Endpunkt kann eine bestehende Produktvariante anhand von Produkt-ID und Varianten-ID gelöscht werden. Dies ist etwa dann sinnvoll, wenn bestimmte Kombinationen von Varianten (beispielsweise Größe und Farbe) nicht mehr angeboten werden sollen. Sowohl das übergeordnete Produkt als auch die Variante müssen existieren. Andernfalls wird ein entsprechender Fehler zurückgegeben. Für die Nutzung sind Löschberechtigungen für Produkte erforderlich.

Beispiel

Antwort

Fehlercodes

Bulk-Methoden für Varianten

In diesem Abschnitt werden die Bulk-Endpunkte beschrieben, mit denen mehrere Datensätze in einem einzigen Request abgefragt oder verarbeitet werden können.

POST bulk/products/variants

Ermöglicht das massenhafte Erstellen und Aktualisieren von Produktvarianten in einem einzigen Request. Der Request-Body ist ein JSON-Array, in dem jedes Element eine Produktvariante beschreibt. Erstell- und Schreibrechte für Produktvarianten sind erforderlich. Für jeden Eintrag wird die jeweilige Produktvariante über die Felder productId, variantId und selection identifiziert. Zum Aktualisieren einer Variante genügt productId in Kombination mit selection oder variantId. Beim Anlegen einer neuen Variante ist selection verpflichtend. Wird zusätzlich variantId mitgegeben, wird die neue Variante mit dieser ID erstellt. Standardmäßig werden nur Produktvarianten aktualisiert. Wenn der Parameter createMissing=yes gesetzt wird, werden Produktvarianten, die noch nicht existieren, aus der Anfrage automatisch neu angelegt. Mit dem Parameter updateIndex=yes wird der Suchindex sofort aktualisiert. In einem Request können maximal 1000 Einträge verarbeitet werden. Dieses Limit gilt gemeinsam für alle Bulk-Endpunkte der API. Details stehen in den API Basics: Bulk-Endpunkte.

Beispiel

Request Body

Antwort

Fehlercodes

Methoden für Lagerbestand Allgemein

Die folgenden Endpunkte ermöglichen das Abrufen, Erstellen, Aktualisieren und Löschen von Lagerbeständen im System. Jeder Lagerbestand wird durch eine eindeutige inventoryId identifiziert. Abhängig vom Endpunkt können Lagerbestände direkt gesetzt oder relativ verändert werden, beispielsweise beim Buchen von Zu- oder Abgängen. Für alle hier dokumentierten Endpunkte ist eine entsprechende Berechtigung für den Zugriff auf Lagerbestände erforderlich. Alle Endpunkte in diesem Abschnitt unterstützen den optionalen URL-Parameter storageId, mit dem die Lager-ID explizit angegeben werden kann. Wird dieser Parameter nicht gesetzt, wird automatisch die Lager-ID des aktiven Subshops verwendet.

Woher kommt die inventoryId?

Die inventoryId ist der Schlüssel des Lagerbestands-Eintrags. Beim Anlegen eines Produkts bzw. einer Variante legt das System automatisch einen Bestands-Eintrag mit einem Standardschlüssel an: Sie müssen die inventoryId also nicht separat abfragen, sondern können sie für den Standardfall aus Produkt- und Varianten-ID zusammensetzen.
Der Standardschlüssel ist lediglich der Ausgangswert und stellt keine Garantie dar. Die inventoryId eines Produkts kann überschrieben werden. Genau dafür ist sie da: Mehrere Produkte oder Varianten können sich denselben Lagerbestand teilen, indem sie auf dieselbe inventoryId verweisen. Welche inventoryId einem Produkt tatsächlich zugeordnet ist, lesen Sie über die Methode GET products/{productId}/inventory im Feld storeId. Verlassen Sie sich bei Integrationen, die auf gepflegten Shops arbeiten, nicht blind auf das Standardschema.
Aus demselben Grund weichen die Beispiele in diesem Abschnitt (beispielsweise 11-1701 M) vom Standardschema ab. Sie zeigen einen Shop, in dem eigene Bestandsschlüssel gepflegt wurden.

GET products/inventory/{inventoryId}

Mit diesem Endpunkt kann der Lagerbestand eines Produkts oder einer Produktvariante anhand der Lagerbestands-ID (inventoryId) abgerufen werden. Die Antwort enthält Informationen über den aktuellen Bestand, offene Bestellungen sowie den Zeitpunkt der letzten Aktualisierung. Damit der Endpunkt genutzt werden kann, müssen die entsprechenden Berechtigungen zum Lesen von Lagerbeständen vorhanden sein.

Beispiel

Antwort

Fehlercodes

POST products/inventory

Mit diesem Endpunkt wird ein neuer Lagerbestand für ein Produkt oder eine Produktvariante angelegt. Dabei wird eine eindeutige Lagerbestands-ID (id) sowie die verfügbaren und offenen Mengen angegeben. Damit dieser Endpunkt verwendet werden kann, müssen die entsprechenden Berechtigungen zum Erstellen von Lagerbeständen vorhanden sein.

Beispiel

Request-Body

Antwort

Fehlercodes

PUT products/inventory/{inventoryId}

Mit diesem Endpunkt aktualisieren Sie den Lagerbestand eines bestimmten Produkts anhand der übergebenen Parameter. Dabei können Sie sowohl den Bestand (amount) als auch die Anzahl der offenen Bestellungen (openOrder) anpassen, entweder absolut oder relativ:
  • Ist amountType auf relative gesetzt, wird der aktuelle Lagerbestand um den angegebenen amount erhöht. Bei einem negativen Wert wird er verringert. Andernfalls wird der Lagerbestand auf den Wert von amount gesetzt.
  • Entsprechend funktioniert openOrderType. Ist dieser auf relative gesetzt, wird die Anzahl der offenen Bestellungen um openOrder erhöht oder bei negativem Wert verringert. Ohne relative wird openOrder direkt gesetzt.
Existiert noch kein Lagerbestand für die angegebene {inventoryId}, kann über den optionalen URL-Parameter createMissing=yes automatisch ein neuer Eintrag angelegt werden. Um diesen Endpunkt verwenden zu können, benötigen Sie die Berechtigung zum Schreiben von Lagerbeständen.

Beispiel

Request-Body

Antwort

Fehlercodes

DELETE products/inventory/{inventoryId}

Mit diesem Endpunkt löschen Sie den Lagerbestand eines Produkts für die angegebene {inventoryId} im aktuellen Subshop. Wenn kein entsprechender Eintrag existiert, wird ein Fehler zurückgegeben. Um diesen Endpunkt verwenden zu können, benötigen Sie die Berechtigung zum Löschen von Lagerbeständen.

Beispiel

Antwort

Fehlercodes

POST bulk/products/inventory

Mit diesem Endpunkt legen Sie mehrere Lagerbestände in einem Request an oder aktualisieren sie (Upsert). Jeder Eintrag im Request-Body wird über seine id (Lagerbestands-ID, siehe Woher kommt die inventoryId?) adressiert. Für jeden Eintrag können Sie den Bestand (amount) und die Anzahl der offenen Bestellungen (openOrder) absolut oder relativ anpassen:
  • Ist amountType auf relative gesetzt, wird der aktuelle Lagerbestand um den angegebenen amount erhöht. Bei einem negativen Wert wird er verringert. Andernfalls wird der Lagerbestand auf den Wert von amount gesetzt.
  • Entsprechend funktioniert openOrderType. Ist dieser auf relative gesetzt, wird die Anzahl der offenen Bestellungen um openOrder erhöht oder bei negativem Wert verringert. Ohne relative wird openOrder direkt gesetzt.
  • Existiert für eine id noch kein Lagerbestand, wird er standardmäßig angelegt, sofern ein Produkt oder eine Variante des Subshops auf diese inventoryId verweist. Mit createMissing=no werden nur bestehende Einträge aktualisiert.
Um diesen Endpunkt verwenden zu können, benötigen Sie die Berechtigung zum Schreiben von Lagerbeständen.
Der Endpunkt erwartet POST, auch wenn bestehende Bestände aktualisiert werden. Das gilt für alle Bulk-Endpunkte. Ein PUT auf bulk/products/inventory wird nicht beantwortet. Der Request läuft ins Leere, ohne dass sich die Bestände ändern.
Geändertes Standardverhalten. Bisher wurden fehlende Lagerbestände nur mit createMissing=yes angelegt. Jetzt ist das Anlegen der Standard. Anbindungen, die ohne createMissing aufrufen und sich darauf verlassen, dass unbekannte IDs nicht angelegt werden, müssen createMissing=no mitsenden.
In einem Request können maximal 1000 Einträge verarbeitet werden. Dieses Limit gilt gemeinsam für alle Bulk-Endpunkte der API. Weitere Informationen finden Sie in den API Basics: Bulk-Endpunkte. Bei mehr Einträgen wird der gesamte Request abgelehnt und nichts geschrieben.

URL-Parameter

Bestehende Einträge werden immer aktualisiert, auch wenn kein Produkt auf sie verweist. requireReference greift nur beim Anlegen. Soll der Bestand bewusst angelegt werden, bevor das zugehörige Produkt existiert, senden Sie requireReference=no.

Felder pro Eintrag

Mindestens amount oder openOrder muss angegeben sein. Ein nicht angegebenes Feld bleibt unverändert. Wird ein Eintrag neu angelegt, zählt eine relative Änderung ab 0: Aus {"id": "4800", "amount": 5, "amountType": "relative"} wird ein Eintrag mit amount = 5. Ein nicht angegebenes Feld wird mit 0 angelegt. Alle Felder eines Eintrags werden vor dem Schreiben geprüft. Ein ungültiger Eintrag wird vollständig übersprungen, auch wenn einzelne Felder gültig sind.

Beispiel

Request-Body

Der Request-Body ist ein JSON-Array. Aus Kompatibilitätsgründen wird auch ein Objekt mit dem Array im Feld data akzeptiert ({"data": [ ... ]}).

Antwort

Fehler auf Zeilenebene brechen den Request nicht ab. Gültige Einträge werden geschrieben, ungültige werden in skippedLines aufgeführt. Die Antwort hat in beiden Fällen den Status 200.

Werte für errorType

Back-in-Stock

Nach jeder erfolgreichen Änderung werden Back-in-Stock-Benachrichtigungen für alle Produkte und Varianten erzeugt, die auf die geänderte inventoryId verweisen. Ist Back-in-Stock im Shop deaktiviert, entfällt dieser Schritt.

Fehlercodes

Methoden für Produkte Lagerbestand

Über die folgenden Endpunkte lassen sich lagerbezogene Einstellungen für einzelne Produkte verwalten. Dazu zählen sowohl die Zuordnung zu einem Lagerbestandseintrag als auch die Konfiguration der Darstellung im Shop, beispielsweise farbliche Ampellogik, individuelle Lagermeldungen und Reservierungszeiten. Die Einstellungen greifen dabei direkt auf die allgemeinen Lagerbestände zu, die über die Endpunkte im Abschnitt Methoden für Lagerbestand Allgemein gepflegt werden. Für den Zugriff auf diese Endpunkte sind Lese- oder Schreibrechte für Produktdaten erforderlich, je nach gewählter Operation.

GET products/{productId}/inventory

Mit diesem Endpunkt können Sie die Lagerbestandskonfiguration eines bestimmten Produkts abrufen. Diese Konfiguration umfasst unter anderem Schwellwerte für Ampelfarben, individuelle Lagermeldungen und die Reservierungsdauer. Die Angabe storeId verweist auf einen allgemeinen Lagerbestandseintrag, wie er über die Lagerbestands-Endpunkte verwaltet wird. Für die Verwendung dieses Endpunkts sind Lese-Berechtigungen für Produktdaten erforderlich.

Beispiel

Antwort

Fehlercodes

PUT products/{productId}/inventory

Dieser Endpunkt dient dazu, die Lagerbestandseinstellungen eines Produkts zu aktualisieren. Dabei lassen sich beispielsweise die Darstellung im Shop (Ampel-Logik), Lagermeldungen oder die Reservierungszeit anpassen. Die Einstellung storeId bleibt hierbei unverändert und muss nicht übergeben werden. Für die Verwendung dieses Endpunkts sind Schreib-Berechtigungen für Produktdaten erforderlich.

Beispiel

Request-Body

Antwort

Fehlercodes

Methoden für Varianten Lagerbestand

Dieses Kapitel beschreibt die Endpunkte zur Verwaltung von lagerbezogenen Einstellungen einzelner Produktvarianten. Wie bei Produkten lassen sich auch für Varianten spezifische Lagerbestandsanzeigen, Ampelgrenzen, individuelle Texte und Reservierungszeiten festlegen. Die Zuordnung erfolgt ebenfalls über einen storeId, der auf einen zentral gepflegten Lagerbestand verweist. Für den Zugriff sind entsprechende Lese- oder Schreibrechte auf Produktvarianten erforderlich.

GET products/{productId}/variants/{variantId}/inventory

Ruft die Lagerbestandseinstellungen der Produktvariante mit der angegebenen variantId ab. Die Einstellungen beinhalten unter anderem Ampelgrenzen, Verfügbarkeitsanzeige, E-Mail-Benachrichtigungen sowie den Verweis (storeId) auf den zugehörigen zentralen Lagerbestand. Für diese Abfrage werden Lese-Rechte auf Produktvarianten benötigt.

Beispiel

Antwort

Fehlercodes

PUT products/{productId}/variants/{variantId}/inventory

Aktualisiert die Lagerbestandseinstellungen der Produktvariante mit der angegebenen variantId. Die Konfigurationen wirken sich direkt auf die Darstellung im Shop aus und steuern beispielsweise die Verfügbarkeitsanzeige. Die Verknüpfung zum zentralen Lager erfolgt über das Feld storeId. Für diese Operation werden Schreibrechte auf Produktvarianten benötigt.

Beispiel

Request-Body

Antwort

Fehlercodes

Bulk-Methoden für Lagereinstellungen

Mit dem folgenden Endpunkt pflegen Sie die Lagereinstellungen mehrerer Produkte und Varianten in einem einzigen Request. Er ist das Bulk-Gegenstück zu PUT products/{productId}/inventory und PUT products/{productId}/variants/{variantId}/inventory.

POST bulk/products/inventoryConfig

Mit diesem Endpunkt legen Sie die Lagereinstellungen mehrerer Produkte und/oder Varianten an oder aktualisieren sie (Upsert). Dazu zählen Ampelgrenzen, Texte, Lagermeldungen, Reservierungszeiten und die Verknüpfung mit einem Lagerbestand über storeId. Ein Request darf Produkte und Varianten gemischt enthalten. Da ein Request Produkte und Varianten enthalten kann, benötigen Sie immer die Schreibrechte für Produktdaten und für Produktvarianten. Die Berechtigung wird einmal für den gesamten Request geprüft. In einem Request können maximal 1000 Einträge verarbeitet werden. Dieses Limit gilt gemeinsam für alle Bulk-Endpunkte der API. Weitere Informationen finden Sie in den API Basics: Bulk-Endpunkte. Bei mehr Einträgen wird der gesamte Request abgelehnt und nichts geschrieben.

URL-Parameter

Adressierung

Ein Produkt und seine Varianten dürfen im selben Request vorkommen. Dieselbe Kombination aus productId und variantId darf dagegen nur einmal enthalten sein.

Einstellungsfelder

Alle Einstellungsfelder sind optional. Nicht angegebene Felder behalten ihren gespeicherten Wert. Es gelten dieselben Felder und Prüfungen wie bei den Einzel-Endpunkten. Das Produkt bzw. die Variante muss bereits existieren. Existieren für sie noch keine Lagereinstellungen, werden sie mit Standardwerten angelegt und mit den Werten aus dem Request ergänzt. Der Suchindex wird, wie bei den Einzel-Endpunkten, nicht aktualisiert.

Beispiel

Request-Body

Der Request-Body muss ein JSON-Array sein. Ein Objekt mit dem Feld data wird hier nicht akzeptiert.

Antwort

Fehler auf Zeilenebene brechen den Request nicht ab. Gültige Einträge werden geschrieben, ungültige werden in skippedLines aufgeführt. Die Antwort hat in beiden Fällen den Status 200.

Werte für errorType

Fehlercodes

Mehrere Varianten teilen sich einen Lagerbestand

Über storeId verknüpfen Sie mehrere Varianten mit demselben Lagerbestand, beispielsweise über die EAN:
Anschließend genügt ein einziger Eintrag in POST bulk/products/inventory, um den Bestand beider Varianten zu setzen:
Ist Back-in-Stock im Shop aktiv, werden die Benachrichtigungen für beide Varianten erzeugt. Um die Verknüpfung einer Variante wieder aufzuheben, senden Sie "storeId": "".

Typischer Ablauf beim Import

1

Produkte importieren

POST bulk/products legt die Produkte an oder aktualisiert sie.
2

Lagereinstellungen setzen

POST bulk/products/inventoryConfig setzt die Lagereinstellungen. Bei Bedarf verknüpfen Sie über storeId eine abweichende inventoryId.
3

Bestände schreiben

POST bulk/products/inventory schreibt die Bestände. Da requireReference standardmäßig aktiv ist, werden nur inventoryIds angelegt, auf die ein Produkt oder eine Variante aus den vorherigen Schritten verweist.
Werden die Bestände vor den Produkten geliefert, rufen Sie POST bulk/products/inventory mit requireReference=no auf.

Methoden für Set-Produkte

Dieses Kapitel beschreibt die Endpunkte zur Verwaltung von Set-Produkten (Produktbündeln). Für den Zugriff sind entsprechende Lese-, Schreib- oder Löschrechte auf Produktdaten erforderlich. Der Preis eines Sets ist kein gespeicherter Wert. Er wird aus dem Preis des Hauptprodukts und den Preisen der Unterprodukte berechnet, und zwar jedes Mal neu. Wer ihn anzeigen will, ruft ihn über den Endpunkt POST products/setproducts/preview ab. Was das für bestehende Anbindungen bedeutet, steht am Ende dieses Kapitels im Abschnitt Set-Preis wird nicht mehr gespeichert.

GET products/{parentProductId}/setproducts

Gibt eine Liste mit Unterprodukten zurück, wenn das Produkt mit id=parentProductId einen Set besitzt. Optional kann setParentProductList IDs der Produkte enthalten, zu deren Sets das aktuelle Produkt gehört. Für diese Abfrage werden Lese-Rechte auf Produktdaten benötigt. Mit size legen Sie fest, wie viele Unterprodukte items enthält. Mit from legen Sie den Startpunkt fest (ab 0 gezählt). Ohne size bleibt items leer. totalCount und setData enthalten dennoch alle Mitglieder des Sets.

Beispiel

Antwort (Hauptprodukt)

Antwort (Set-Unterprodukt)

Fehlercodes

POST products/{parentProductId}/setproducts/assign

Die Produkte aus dem Request-Body werden dem Set des Produkts mit der ID id=parentProductId zugewiesen. Das Feld prodId kann entweder einen einzelnen String oder ein Array von Strings enthalten. Es können nur vorhandene Produkte zugewiesen werden. Ist eines der Produkte unbekannt, lehnt der Shop den gesamten Request ab und weist keines der Produkte zu. Für diese Abfrage werden Schreib-Rechte auf Produktdaten benötigt.

Beispiel

Request Body

Antwort

Fehlercodes

POST products/{parentProductId}/setproducts/update/{childProductId}

Daten vom Produkt mit id=childProductId im Set vom Produkt mit id=parentProductId werden aktualisiert. Für diese Abfrage werden Schreibrechte auf Produktdaten benötigt. Im Objekt setData müssen alle fünf Felder id, quantityFactor, usePrice, fixQuantity und hidden angegeben werden. Wenn die id ein anderes Produkt als childProductId nennt, wird das Mitglied durch dieses Produkt ersetzt.

Beispiel

Request Body

Antwort

Fehlercodes

POST products/setproducts/preview

Dieser Endpunkt berechnet den Preis eines Set-Produkts aus den übergebenen Werten und gibt das Ergebnis zurück. Er speichert nichts. Damit lässt sich der Set-Preis bereits während der Bearbeitung anzeigen, also noch bevor das Produkt gespeichert wird. Berechnet werden zwei Werte. setPrice ist die Summe aus dem Preis des Hauptprodukts und den Preisen aller Unterprodukte mit usePrice. setOrgPrice ist die Summe aus dem Preis des Hauptprodukts und den Preisen aller Unterprodukte und dient als Referenzpreis. Die Preise werden zum aktuellen Zeitpunkt aufgelöst, aktive Aktionspreise fließen also in beide Werte ein. Für diese Abfrage werden Schreib-Rechte auf Produktdaten benötigt.

Beispiel

Request Body

Unbekannte IDs in setProducts werden übersprungen, ohne einen Fehler auszulösen. Ein Tippfehler in setProducts[].id führt deshalb nicht zu 404, sondern zu einer Antwort mit einem zu niedrigen Preis. Prüfen Sie die IDs vor dem Aufruf.

Antwort

Beide Werte sind Strings. Die Antwort im Beispiel ergibt sich aus einem Preis von 4,99 für P1 und 9,99 für P2. setPrice enthält das Hauptprodukt und das zweifache P1, also 19,99 plus 9,98. In setOrgPrice kommt zusätzlich P2 hinzu, weil dort alle Unterprodukte einfließen. Tragen alle Unterprodukte usePrice, sind beide Werte gleich.

Fehlercodes

Entfallener Endpunkt. Der bisherige Endpunkt PUT products/{childProductId}/setproducts/recalculate steht nicht mehr zur Verfügung. Er hat den Set-Preis berechnet und gespeichert. An seine Stelle tritt POST products/setproducts/preview, der ausschließlich berechnet.

DELETE products/{parentProductId}/setproducts/{childProductId}

Das Produkt mit id=childProductId wird aus dem Set vom Produkt mit id=parentProductId entfernt. Gilt childProductId=all, werden alle Produkte aus dem Set entfernt. Gilt parentProductId=all, wird das Produkt mit id=childProductId aus allen Sets entfernt, in denen es enthalten ist. Für diese Abfrage werden Löschberechtigungen für Produktdaten benötigt.

Beispiel

Antwort

Fehlercodes

Set-Preis wird nicht mehr gespeichert

Der Set-Preis ist kein gespeicherter Wert mehr, sondern wird bei Bedarf berechnet. Die impliziten Neuberechnungen beim Anlegen, Aktualisieren und Löschen von Produkten, bei den Bulk-Endpunkten und im Produktimport sind entfallen. Für Clients bedeutet das zwei Dinge. Erstens liefert kein Endpunkt mehr einen gespeicherten Set-Preis aus. Zweitens muss ein Client, der den Set-Preis anzeigen will, ihn über den Endpunkt POST products/setproducts/preview berechnen lassen.
Im Shop wird der Set-Preis weiterhin bei jedem Seitenaufruf berechnet. Die Felder am Template-Objekt haben sich dabei geändert, setPrice und die zugehörigen Felder stehen nur noch an Set-Produkten. Was das für bestehende Templates bedeutet, beschreibt der Abschnitt Änderungen an bestehenden Templates.

Entfernte Felder

Die Entfernung von double_setPrice betrifft alle Abfragen, Filter und Sortierungen, die dieses Indexfeld verwenden. Bestehende Anbindungen müssen vor dem Update geprüft und angepasst werden.

Ergänzende Referenzen

Hinweis zu Produktdatenfeldern

Neue Produktdatenfelder (zusätzliche Eigenschaften, Attribute oder technische Felder) können nicht direkt über die Produkt-API erstellt werden. Die API dient ausschließlich dem Auslesen und Pflegen vorhandener Felder. Um neue Felder zu definieren, muss die Konfiguration im Knoten content.customProductField verwendet werden. → content - Katalog (Kategorien & Produkte) Dort lassen sich individuelle Felder mit Typ, Suchrelevanz, Pflichtstatus und Varianteneigenschaften anlegen. Sobald ein Feld dort konfiguriert wurde, steht es anschließend automatisch in der Produkt-API zur Verfügung, beispielsweise in GET products oder POST products.

Support

Bei technischen Fragen und Hilfestellungen ist unser Support-Team für Sie erreichbar: Zum Kundenportal Bitte senden Sie uns eine möglichst detaillierte Beschreibung sowie Screenshots, Requests/Antworten, damit wir Ihre Anfrage zeitnah und zielführend beantworten können.