---
language: "de"
---
# Cobai V2 API Home

## Cobai V2 API Home

Welcome to your new space! Spaces help your team structure, organize, and share work, so every team member has visibility into institutional knowledge and acces...

### Themen

*

  #### [Einleitung](https://help.cobai.com/cobai-v2-api/einleitung.md)

  * [Authentifizierung mit einem Bearer Token](https://help.cobai.com/cobai-v2-api/authentifizierung-mit-einem-bearer-token.md)
  * [Authentifizierung (Legacy)](https://help.cobai.com/cobai-v2-api/authentifizierung-legacy.md)
  * [API Status abrufen](https://help.cobai.com/cobai-v2-api/api-status-abrufen.md)
*

  #### [Preise](https://help.cobai.com/cobai-v2-api/preise.md)

  * [Artikelpreise aktualisieren](https://help.cobai.com/cobai-v2-api/artikelpreise-aktualisieren.md)
  * [Artikelpreise ersetzen](https://help.cobai.com/cobai-v2-api/artikelpreise-ersetzen.md)
  * [Kundenpreise aktualisieren](https://help.cobai.com/cobai-v2-api/kundenpreise-aktualisieren.md)
  * [Kundenpreise ersetzen](https://help.cobai.com/cobai-v2-api/kundenpreise-ersetzen.md)
  * [Kundenpreise pro Katalog aktualisieren](https://help.cobai.com/cobai-v2-api/kundenpreise-pro-katalog-aktualisieren.md)
  * [7 more pages](https://help.cobai.com/cobai-v2-api/preise.md)
*

  #### [Kunden](https://help.cobai.com/cobai-v2-api/kunden.md)

  * [Kundenliste abrufen](https://help.cobai.com/cobai-v2-api/kundenliste-abrufen.md)
  * [Kunden anlegen](https://help.cobai.com/cobai-v2-api/kunden-anlegen.md)
  * [Kunden abrufen](https://help.cobai.com/cobai-v2-api/kunden-abrufen.md)
  * [Lieferadressen abrufen](https://help.cobai.com/cobai-v2-api/lieferadressen-abrufen.md)
  * [Lieferadressen aktualisieren](https://help.cobai.com/cobai-v2-api/lieferadressen-aktualisieren.md)
  * [6 more pages](https://help.cobai.com/cobai-v2-api/kunden.md)
*

  #### [Katalog](https://help.cobai.com/cobai-v2-api/katalog.md)

  * [Produktabbildung anlegen oder ändern](https://help.cobai.com/cobai-v2-api/produktabbildung-anlegen-oder-andern.md)
  * [Produkte anlegen](https://help.cobai.com/cobai-v2-api/produkte-anlegen.md)
  * [Produktvarianten anlegen oder ändern](https://help.cobai.com/cobai-v2-api/produktvarianten-anlegen-oder-andern.md)
  * [Produktvariante löschen](https://help.cobai.com/cobai-v2-api/produktvariante-loschen.md)
  * [Produkte aktualisieren](https://help.cobai.com/cobai-v2-api/produkte-aktualisieren.md)
  * [3 more pages](https://help.cobai.com/cobai-v2-api/katalog.md)
*

  #### [Wertebereiche](https://help.cobai.com/cobai-v2-api/wertebereiche.md)

  * [Länderkennzeichen](https://help.cobai.com/cobai-v2-api/landerkennzeichen.md)
  * [Preislistennamen](https://help.cobai.com/cobai-v2-api/preislistennamen.md)
  * [Benutzerrollen](https://help.cobai.com/cobai-v2-api/benutzerrollen.md)
  * [ISO-Geschlechtsangaben](https://help.cobai.com/cobai-v2-api/iso-geschlechtsangaben.md)
*

  #### [Antwortdokumente](https://help.cobai.com/cobai-v2-api/antwortdokumente.md)

  * [Fehlerantwort: BadRequest](https://help.cobai.com/cobai-v2-api/fehlerantwort-badrequest.md)

---
language: "de"
---
# Antwortdokumente

---
language: "de"
---
# API Status abrufen

## Beschreibung

Mit dieser Methode können Sie die Systemzeit der API abrufen.
> * Diese Methode benötigt keine Authentifizierung.
>
> * Der Server synchronisiert seine Zeit über NTP, sie können die Antwort daher auch als Normalzeitquelle verwenden wenn Sie keinen Zugriff auf einen NTP-Server haben.

### Anfrage

#### Syntax

    GET /v2/ping HTTP/1.1
    Host: api.cobai.com
    Content-Length: 0
    Date: Datum/Uhrzeit

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwort

Als Antwort erhalten Sie ein XML-Dokument mit der aktuellen Systemzeit des API-Servers. Diese Zeit können Sie z.B. bei der Erzeugung einer API-Signatur als Zeitbasis verwenden.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <pingResponse>
      <localTime>2011-01-29T13:23:56.750+01:00</localTime>
    </pingResponse>

Das Antwortdokument wird zukünftig um zusätzliche Felder erweitert. Verwenden Sie daher einen geeigneten XML-Parser um die Zeitinformation auszulesen.

#### Antwortelemente

|   Name    |                  Inhalt                  |
|-----------|------------------------------------------|
| localTime | Die aktuelle Systemzeit des API-Servers. |

---
language: "de"
---
# Artikelpreise aktualisieren

## Artikelpreise anlegen, ergänzen oder aktualisieren

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für ein Material anlegen. Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    POST /v2/prices HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Materialpreise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

* ...

* Staffelgrenze n

* Staffelpreis n

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v2/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Artikelpreise ersetzen

## Artikelpreise anlegen, ersetzen oder löschen

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für Material löschen und optional neue Preise anlegen.

### Anfrage

#### Syntax

    PUT /v2/prices HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Materialpreise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

<!-- -->

* Durch übergeben eines leeren Request-Bodys werden vorhandene Materialpreise gelöscht ohne das neue Materialpreise angelegt werden. - Durch das löschen aller Materialpreise löschen Sie auch die Preise, die bei der Erstellung eines Angebotes eingepflegt werden können.

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v2/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Authentifizierung (Legacy)

Die hier beschriebene Authentifizierung wird für neue Integrationsprojekte nicht mehr empfohlen und sollte nur verwendet werden, wenn Sie keine https Verbindung aufbauen können. Verwenden Sie für neue Projekte [Authentifizierung mit einem Bearer Token](https://help.cobai.com/cobai-v2-api/authentifizierung-mit-einem-bearer-token.md) .

Jede Anfrage an unser REST-API muss authentifiziert werden, um unserem System Ihre Identität zu bestätigen. Der Ablauf der Authentifizierung lehnt sich eng an die Authentifizierung von REST-Anfragen in Amazon S3 an.

## Der Authentication-Header

Anfragen an unser REST-API verwenden den standard HTTP-Header `Authorization` um Authentifizierungsinformationen zu transportieren. Der Authentifizierungsheader hat die folgenden Form:

    Authorization: COB CobaiWebServicesAccessKeyID:Signatur

Die Access-Key-Id und Ihren geheimen Schlüssel [++können Sie im jeweiligen Zielsystem selbst erzeugen++](https://opcenter.cobai.com/backoffice/admin/apiKeyManager.view). Über die Access-Key-Id kann das System erkennen, wer die Anfrage signiert hat und welcher geheime Schlüssel verwendet wurde um die Anfrage zu signieren.

Die Signatur ist eine Auswahl von Elementen aus der REST-Anfrage, die mit RFC 2104 HMAC-SHA1 verschlüsselt werden, die Signatur ändert sich daher mit jeder Anfrage. Bei einer eingehenden REST-Anfrage erzeugt das System die selbe Auswahl der Anfrageelemente und verschlüsselt sie mit dem geheimen Schlüssel der zur übermittelten Access-Key-Id gehört. Stimmen die übermittelte Signatur und die vom System erzeugte Signatur überein gilt die Anfrage als authentifiziert und wird mit der Authorisierung des Schlüsselinhabers ausgeführt.

Der *Authorisation-Header* wird wie folgt erzeugt:

    Authorization = "COB" + " " + CobaiWebServiceAccessKeyId + ":" + Signatur;

    Signatur = Base64( HMAC-SHA1 ( UTF8-Encoding-von ( IhrGeheimerSchüssel, ZuSignierenderString ) ) );

    ZuSignierenderString = HTTPVerb + "\n" +
                           Content-MD5 + "\n" +
                           Content-Type + "\n" +
                           Date + "\n" +
                           Header-Normalform = <siehe weiter unten> +
                           URL-Normalform = <siehe weiter unten>

In Java würden Sie dazu etwas in dieser Art machen, wobei RequestDescription das Erzeugen der Normalform kapselt:
Java

    package net.lacho.remoting.api;

    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;

    import org.apache.commons.codec.binary.Base64;

    public class RequestSignature {

        private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
        private String signature;

        public RequestSignature(final String privateKey, final RequestDescription requestDescription)  {
            try {
                SecretKeySpec signingKey = new SecretKeySpec(privateKey.getBytes(), HMAC_SHA1_ALGORITHM);
                Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
                mac.init(signingKey);
                byte[]rawHmac = mac.doFinal(requestDescription.getBytes());
                signature = new Base64(1000, new byte[] {}).encodeToString(rawHmac);   
            }
            catch (Exception e) {
                signature = "";
            }

        }

        @Override
        public String toString() {
            return signature;
        }
    }

## Erzeugung der Anfrage-Normalform

Wie weiter oben ausgeführt erzeugt das System bei einer Anfrage eine Signatur für die Anfrage und vergleicht sie mit der übermittelten Signatur. Sie müssen daher die Signatur mit der selben Methode erzeugen wie das System. Der zu signierenden String heißt auch *Anfrage-Normalform* . Um die Anfrage-Normalform erzeugen zu können müssen sie die *URL-Normalform* und die *Header-Normalform* erzeugen.

### Header-Normalform

Um die Header-Normalform zu erzeugen verwenden Sie alle HTTP-Header aus Ihrer Anfrage die mit 'x-cob-' beginnen und wenden den folgenden Prozess darauf an:

1. Wandeln Sie alle Headernamen in Kleinbuchstaben um, aus 'X-Cob-Date' wird also 'x-cob-date'.

2. Sortieren Sie die Headerfelder lexikografisch nach den Headernamen.

3. Kombinieren Sie mehrere Header mit identischem Namen in einen neuen Header, wie in [++RFC 2616++](http://www.ietf.org/rfc/rfc2616.txt), Abschnitt 4.2 beschrieben. Zwischen den einzelnen kommagetrennten Werten ist kein Whitespace erlaubt. Zum Bespiel wird aus den beiden Headern `x-cob-username:user1` und `x-cob-username:user2` der Header `x-cob-username:user1,user2`.

4. Wandeln Sie Header deren Werte über mehrere Zeilen gehen in eine einzeilige Form um (siehe [++RFC 2616++](http://www.ietf.org/rfc/rfc2616.txt), Abschnitt 4.2).

5. Entfernen Sie eventuell vorhanden Leerraum um den Doppelpunkt in den Headern.

6. Fügen Sie an jeden Header ein Newline an (U+000A). Verbinden Sie anschließend alle Header zu einem einzelnen String. Dieser String ist die *Header-Normalform*.

### URL-Normalform

Erzeugung der URL-Normalform:

1. Entfernen Sie den [++Domänenteil (FQDN)++](http://de.wikipedia.org/wiki/FQDN#Fully_Qualified_Domain_Name_.28FQDN.29) aus der Anfrage-URL.

2. Entfernen Sie den [++Query-String++](http://de.wikipedia.org/wiki/Uniform_Resource_Locator#searchpart), sofern vorhanden, inklusive des "?" aus der Anfrage URL.

3. [++URL-encoden++](http://de.wikipedia.org/wiki/URL-Encoding) Sie alle Meta-Characters im verbliebenen String. Verwenden Sie dabei UTF-8.

Damit entsteht zum Beispiel aus

`api.cobai.com/v2/orders/pending?sort=desc`

die Normalform

`/v2/orders/pending`

## Benannte Headerelemente und Headerelemente an festen Positionen

Die ersten vier Headerelemente unterscheiden sich von den anderen dadurch das sie an einer festen Position stehen. Von ihnen wird daher in den zu signierenden String nur der Wert, nicht aber der Headername aufgenommen.

Wenn einer dieser Header in Ihrer Anfrage nicht vorkommt (manche sind optional, z.B. Content-Type bei einer PUT-Anfrage) verwenden sie an der entsprechenden Stelle den leeren String ("").

Wenn Ihre Anfrage einen x-cob-date Header enthält müssen Sie bei der Erzeugung der Header-Normalform den Wert des Date Headers weglassen, also den leeren String verwenden.

## Anforderungen an Zeitstempel

Für jede Anfrage ist ein gültiger Zeitstempel, entweder als HTTP Date Header oder alternativ als `x-cob-date Header` notwendig. Der Zeitstempel darf maximal 15 Minuten (vor oder zurück) von unserer aktuellen Systemzeit abweichen wenn die Anfrage abgesendet wird um [++Replay-Angriffe++](http://de.wikipedia.org/wiki/Replay-Angriff) zu erschweren. Anfragen die ausserhalb der erlaubten Zeitfensters eingehen werden mit einem `RequestTimeTooSkewed`-Fehler abgelehnt.

Wenn Ihre HTTP-Clientlibrary das Setzen des Date Headers nicht erlaubt können Sie alternativ den `x-cob-date` Header verwenden. Das Datum muss in einem der von RFC 2616, Abschnitt 3.3 vorgegebenen Formate übergeben werden. Wenn Sie einen `x-cob-date Header` übergeben ignoriert das System bei der erzeugung des zu signierenden Strings den Date Header. Denken Sie also in diesem Fall daran bei der Erzeugung Ihres zu signierenden Strings für den Date Header den leeren String ("") zu verwenden.

Sie sollten Ihre lokale Uhrzeit mit einer Normalzeitquelle abgleichen, Quellen finden Sie \[hier\](<https://support.ntp.org/bin/view/Servers/WebHome>). Alternativ können Sie auch die API-Methode 'ping' verwenden, die Ihnen die Systemzeit des API-Servers bereitstellt.

## Signaturprobleme

Wenn die Authentifizierung fehlschlägt antwortet das System mit einem `SignatureDoesNotMatch`-Fehler (ein XML-Dokument). Dieses Dokument soll Ihnen helfen mögliche Fehlergründe zu erkennen und enthält dazu unter anderem im Element `requestDescription` den kompletten zu signierenden String basierend auf der von Ihnen übermittelten Anfrage.

---
language: "de"
---
# Authentifizierung mit einem Bearer Token

Die hier beschriebene Authentifizierung sollte für alle neue Integrationsprojekte verwendet werden und ist nur über https Verbindungen nutzbar. Falls Sie keine https Verbindung aufbauen können, können Sie alternativ [Authentifizierung (Legacy)](https://help.cobai.com/cobai-v2-api/authentifizierung-legacy.md) nutzen.

Jede Anfrage an unser REST-API muss authentifiziert werden, um unserem System Ihre Identität zu bestätigen.

## Der Authorization-Header

Anfragen an unser REST-API verwenden den standard HTTP-Header `Authorization` um Authentifizierungsinformationen zu transportieren. Der Authentifizierungsheader hat die folgende Form:

    Authorization: Bearer APIKeyID:PrivateKey

Die Access-Key-Id und Ihren geheimen Schlüssel [++können Sie im jeweiligen Zielsystem selbst erzeugen++](https://opcenter.cobai.com/backoffice/admin/apiKeyManager.view). Über die Access-Key-Id kann das System erkennen, wer die Anfrage signiert hat und welcher geheime Schlüssel verwendet wurde um die Anfrage zu signieren.

Um den Header zu erzeugen:

1. Melden Sie sich im opCenter an

2. Rufen Sie Einstellungen / API-Schlüssel auf

3. Kopieren Sie die beiden Schlüssel

4. Fügen Sie API-Schlüssel und privaten Schlüssel zu einem String zusammen, getrennt durch einen Doppelpunkt. Der dabei entstehende String ist Ihr Token

5. Übergeben Sie bei jedem API-Aufruf einen `Authorization` Header mit dem Wert "Bearer", einem Leerzeichen und dem String aus Schritt 4.

---
language: "de"
---
# Benutzerrollen

Über die Nutzerrolle steuern Sie die Berechtigungen eines Benutzers. Folgende Rollen sind vorhanden:  

|        Rollenkennung        |                                                            Bedeutung                                                             |
|-----------------------------|----------------------------------------------------------------------------------------------------------------------------------|
| `ROLE_SHOP_USER`            | Ein Standardnutzer. Diese Rolle bekommt ein Benutzer der sich selbst im Frontend registriert.                                    |
| `ROLE_SHOP_COSTCENTER_USER` | Ein Kostenstellenverwalter. Diese Rolle bekommt ein Benutzer dessen Rolle im Backend auf "Kostenstellenverwalter" geändert wird. |
| `ROLE_RESTRICTED_SHOP_USER` | Ein eingeschränkter Nutzer. Diese Rolle bekommt ein Nutzer dessen Rolle im Backend auf "eingeschränkt" geändert wird.            |

Die `ROLE_RESTRICTED_SHOP_USER`-Rolle können Sie zwar über die Schnittstelle vergeben, die Pflege der eingeschränkten Lieferadressen ist aber nicht möglich.

---
language: "de"
---
# Bestellungen (Datei)

## openTRANS 2.0

### Einführung

Für die Übergabe von Warenkörben/Bestellungen an externe Systeme (z.B. Warenwirtschaften) verwenden wir das Format openTRANS in den Versionen 1.0 und 2.0. Die vollständige Beschreibung des openTRANS-Standards finden Sie auf der [++openTRANS Website++](http://www.opentrans.de/), diese Dokumentation beschreibt daher nur Besonderheiten unserer Implementierung sowie die verwendeten Felder.
> openTRANS ist ein offener Standard zur Unterstützung des elektronischen Datenaustauschs (EDI) bei Geschäftstransaktionen zwischen Handelsunternehmen. Der Standard begründete sich in einer Initiative von Industrie- und Handelsunternehmen unter der Leitung von Fraunhofer IAO in Kooperation mit der Universität Duisburg-Essen BLI mit dem Ziel einer Standardisierung von Geschäftsprozessdokumenten (z. B. Lieferavis, Rechnung) als Grundlage für eine elektronische System-zu-System-Kommunikation.
>
> *Quelle: wikipedia (* <https://de.wikipedia.org/wiki/OpenTRANS> *)*

### Überblick

openTRANS 2.0 ist die von uns aktuell unterstützte Version. Verwenden Sie eine der Implementierungen für neue Schnittstellen. Anpassungen sind bei begründetem Bedarf möglich und werden als eine eigene Schnittstellenversion geführt. Bitte wenden Sie sich bei Bedarf per Mail an [++support@cobai.com++](mailto:support@cobai.com) und beschreiben Sie Ihren Anwendungsfall.

Für Version 2.0 der openTRANS-Schnittstelle existieren die folgenden Implementierungen:

**Standard**: Unsere Standardimplementierung. Bei Bedarf werden Erweiterungen implementiert, der vorhandene Funktionsumfang bleibt aber garantiert erhalten. Sollten Erweiterungen die Abwärtskompatibilität beeinträchtigen erzeugen wir eine neue Variante der Schnittstelle

**Gega-IT**: Eine angepasste Version für Nutzer des Warenwirtschaftssystems der Firma Gega-IT. Sie können dieses Format auch für andere Anbindungen verwenden, wir garantieren allerdings nicht das der implementierte Umfang erhalten bleibt.

### openTRANS 2.0 - Standardformat

#### Beispielbestellung

[++Beispieldatei openTRANS - Standard++](https://github.com/cobai/public-sample-files/blob/main/opentrans2-standard.xml)

#### Felder

Felder die nicht in dieser Liste enthalten sind sollten selbsterklärend sein. Sie finden ihre Bedeutung in der offiziellen openTRANS-Dokumentation.

##### ORDER_HEADER/ORDER_INFO/ORDER_ID

Eine eindeutige Id für die Bestellung. Die Id ist garantiert eindeutig innerhalb eines Shops und innerhalb aller von uns gehosteten Shops.

##### ORDER_HEADER/ORDER_INFO/PARTIES/PARTY\[PARTY_ROLE='delivery'\]

Abhängig vom Inhalte der Felder "Kundennummer (extern)" und "WE-Nummer" werden in den Kindelementen dieses Knotens unterschiedliche Informationen übergeben:

* Ist das Feld "WE-Nummer" gefüllt wird eine `PARTY_ID` mit `type="supplier_specific"` übergeben. Wert ist der Inhalt aus dem Feld "WE-Nummer".

* Ist das Feld "WE-Nummer" nicht gefüllt wird eine `PARTY_ID` mit `type="buyer_specific"` übergeben. Wert ist der Inhalt aus dem Feld "Kundennummer (extern)". Bitte beachten Sie, dass dadurch auch eine leere PARTY_ID übergeben werden kann.

* Ist dem Auftrag kein Kunde zugeordnet (z.B. wenn er direkt im opCenter ohne Kunde erzeugt wurde) wird ebenfalls eine `PARTY_ID` mit `type="supplier_specific"` übergeben. Wert ist in diesem Fall die dem Shop zugeordnete Kundennummer des Shopbetreibers.

##### ORDER_HEADER/ORDER_INFO/PARTIES/PARTY\[PARTY_ROLE='delivery'\]/ADDRESS/CONTACT_DETAIL

Dieser Knoten wird nur übergeben wenn der Bestellung ein Kunde zugeordnet ist. Der Unterknoten `EMAILS/EMAIL` enthält die Mailadresse des bestellenden Nutzers.

##### ORDER_ITEM_LIST/ORDER_ITEM/QUANTITY

Stückzahl einer Position. Ist für den Artikel der aktuellen Position eine Preiseinheit ungleich Eins definiert wird

* der Einzelpreis durch die Preiseinheit dividiert

* die Stückzahl mit der Preiseinheit multipliziert

Siehe auch `ORDER_ITEM_LIST/ORDER_ITEM/PRODUCT_PRICE_FIX/PRICE_AMOUNT`

##### ORDER_ITEM_LIST/ORDER_ITEM/PRODUCT_PRICE_FIX/PRICE_AMOUNT

Einzelpreis einer Position. Ist für den Artikel der aktuellen Position eine Preiseinheit ungleich Eins definiert wird

* der Einzelpreis durch die Preiseinheit dividiert

* die Stückzahl mit der Preiseinheit multipliziert

Siehe auch `ORDER_ITEM_LIST/ORDER_ITEM/QUANTITY`

### openTRANS 2.0 - Gega-IT Format

[++Beispieldatei openTRANS - Gega-IT Format++](https://github.com/cobai/public-sample-files/blob/main/opentrans2-gega-it.xml)

---
language: "de"
---
# Einleitung

---
language: "de"
---
# Fehlerantwort: BadRequest

## Ursache

Ihre Anfrage ist ungültig. Sie kann nicht verarbeitet werden. Das `<message />`-Feld enthält eine Erläuterung des Fehlers.

## Beispiel

    <?xml version="1.0" encoding="UTF-8"?>
    <badRequest>
      <message xml:lang="de">Eine Erläuterung des Fehlers.</message>
    </badRequest>

## HTTP-Statuscode

400 BadRequest

## Zusätzliche Informationen

|   Feld    |            Inhalt             |
|-----------|-------------------------------|
| `message` | Eine Erläuterung des Fehlers. |

---
language: "de"
---
# ISO-Geschlechtsangaben

Eine Geschlechtsangabe kennzeichnet eindeutig das Geschlecht einer Person. Folgende Werte sind erlaubt:  

|     Wert     |    Bedeutung    |                         Bemerkung                          |
|--------------|-----------------|------------------------------------------------------------|
| MALE         | männlich        |                                                            |
| FEMALE       | weiblich        |                                                            |
| NOTKNOWN     | unbekannt       |                                                            |
| NOTSPECIFIED | nicht angegeben | Die Person hat explizit abgelehnt ihr Geschlecht zu nennen |

> Wenn Ihnen in Ihrem System keine Geschlechtsangabe vorliegt verwenden Sie `NOTKNOWN`, `NOTSPECIFIED` ist **ausschliesslich** für den Fall der expliziten Verweigerung einer Angabe vorgesehen.

---
language: "de"
---
# Jobstatus abrufen

**Achtung**

Die Beschreibung dieser Methode dient nur zu Dokumentationszwecken. Methoden die Jobs erzeugen liefern Ihnen ein Antwortdokument mit der vollständigen URL zur Abfrage des Jobstatus. Erzeugen Sie Anfrage-URLs zur Abfrage eines Jobstatus daher **nicht** manuell.

## Beschreibung

Mit dieser Methode können Sie den Status eines Jobs für asynchrone Verarbeitung erfragen

### Anfrage

#### Syntax

    GET /v2/job/{JOBID} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwort

Als Antwort erhalten Sie ein XML-Dokument mit den Statusinformationen des angefragten Jobs. Wurde mit Ihrem API-Schlüssel kein Job mit der angefragten Id erzeugt oder liegt die Erzeugung zu lange zurück erhalten Sie einen `404 Not Found`-Status.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self"/>
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

#### Antwortelemente

|   Name   |                                                                                                                            Inhalt                                                                                                                            |
|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| jobid    | Die Id des Jobs. Dies ist die selbe Id die Sie in Ihrer Anfrage übergeben haben.                                                                                                                                                                             |
| queuepos | Die Jobs werden in eine Warteschlange eingereiht und in der Reihenfolge der Einreihung abgearbeitet. Ein Job an Position 1 wird verarbeitet. Sein Status wechselt dabei von `pending` auf `running`. Höhere Werte für `queuepos` bedeuten längere Wartezeit. |
| state    | `pending`: der Job wartet auf seine Ausführung `running`: der Job wird gerade ausgeführt `done`: der Job hat seine Ausführung beendet `done_with_error`: Der Job wurde beendet, bei der Ausführung ist es aber zu mindestens einem Fehler gekommen.          |

---
language: "de"
---
# Katalog

---
language: "de"
---
# Kontakte abrufen

## Beschreibung

Mit dieser Methode können Sie die Stammdaten eines Kontaktes (Ansprechpartners) abrufen.

### Anfrage

#### Syntax

    GET /v2/customer/{UUID_des_Kunden}/contact/{UUID_des_Kontaktes} HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <contact xmlns:atom="http://www.w3.org/2005/atom">
        <firstName>Rico</firstName>
        <gender>MALE</gender>
        <ignoreAssortment>false</ignoreAssortment>
        <lastName>Blaa</lastName>
        <officeFax></officeFax>
        <officeMail>rico@blaa.de</officeMail>
        <officeMobile></officeMobile>
        <officePhone></officePhone>
        <role>ROLE_SHOP_COSTCENTER_USER</role>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/b00de3c0-f685-42d5-92b5-c46f04803c8f/contact/683aacec-1225-4fe5-a71b-cbb0010fe1eb"/>
        <uuid>683aacec-1225-4fe5-a71b-cbb0010fe1eb</uuid>
        <webUserName>rico</webUserName>
    </contact>

---
language: "de"
---
# Kontakte ändern

## Beschreibung

Mit dieser Methode können Sie die Stammdaten eines vorhandenen Kontaktes ändern.

###Anfrage

### Syntax

    PUT /v2/customer/<UUID_des_Kunden>/contact/<UUID_des_Kontaktes> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des zu ändernden Kontaktes innerhalb des Root-Elements `<contact/>`. Die folgenden Felder können übergeben werden:  

|     Feldname     | Pflicht |  Typ   |                                                                                       Bemerkung                                                                                        |
|------------------|---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| gender           |         |        | Geschlecht des Kontaktes, beachten Sie hierzu auch die [++Hinweise zu Geschlechtsangaben++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/iso-geschlechtsangaben/).        |
| firstName        |         | C(35)  |                                                                                                                                                                                        |
| lastName         |         | C(35)  |                                                                                                                                                                                        |
| officePhone      |         | C(30)  |                                                                                                                                                                                        |
| officeFax        |         | C(30)  |                                                                                                                                                                                        |
| officeMobile     |         | C(30)  |                                                                                                                                                                                        |
| officeMail       |         | C(200) |                                                                                                                                                                                        |
| webUserName      |         | C(80)  |                                                                                                                                                                                        |
| webPassword      |         | C(50)  | Übergeben Sie das Passwort als Klartext. {::nomarkdown} Wir speichern nur einen Hash des Passwortes, Sie können es also nachfolgend nicht wieder auslesen. {:/}                        |
| role             |         |        | Die Nutzerrolle des anzulegenden Kontaktes. Bitte beachten Sie hierzu die [++Hinweise zu Benutzerrollen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/benutzerrollen/). |
| ignoreAssortment |         |        | `true` wenn für diesen Kontakt Sortimente ignoriert werden sollen, sonst `false`.                                                                                                      |

> Das vorhandene Passwort wird nur geändert wenn das übergebene Passwort nicht leer ist (mindestens ein nicht-Whitespace enthält).

### Antwort

Im Erfolgsfall werden im Zielsystem die Daten des Kontaktes geändert. Sie erhalten als Antwort ein Antwortdokument mit den gespeicherten Kontaktdaten.

#### Fehlerfall

Im Fehlerfall wird kein neuer Kontakt angelegt. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein BadRequest Antwort-Dokument.

### Antwortheader

**Location** : Im Location-Header erhalten Sie die URL des neu angelegten Kontaktes.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <contact xmlns:atom="http://www.w3.org/2005/atom">
        <firstName>Rico</firstName>
        <gender>MALE</gender>
        <ignoreAssortment>false</ignoreAssortment>
        <lastName>Blaa</lastName>
        <officeFax></officeFax>
        <officeMail>rico@blaa.de</officeMail>
        <officeMobile></officeMobile>
        <officePhone></officePhone>
        <role>ROLE_SHOP_COSTCENTER_USER</role>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/b00de3c0-f685-42d5-92b5-c46f04803c8f/contact/683aacec-1225-4fe5-a71b-cbb0010fe1eb"/>
        <uuid>683aacec-1225-4fe5-a71b-cbb0010fe1eb</uuid>
        <webUserName>rico</webUserName>
    </contact>

---
language: "de"
---
# Kontakte anlegen

## Beschreibung

Mit dieser Methode können Sie neue Kontakte für einen vorhandenen Kunden anlegen.

### Anfrage

#### Syntax

    POST /v2/customer/<UUID_des_Kunden>/contact HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des anzulegenden Kontaktes innerhalb des Root-Elements `<contact/>`. Die folgenden Felder können übergeben werden:  

|     Feldname     | Pflicht |  Typ   |                                                                                       Bemerkung                                                                                        |
|------------------|---------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| gender           |         |        | Geschlecht des Kontaktes, beachten Sie hierzu auch die [++Hinweise zu Geschlechtsangaben++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/iso-geschlechtsangaben/).        |
| firstName        |         | C(35)  |                                                                                                                                                                                        |
| lastName         |         | C(35)  |                                                                                                                                                                                        |
| officePhone      |         | C(30)  |                                                                                                                                                                                        |
| officeFax        |         | C(30)  |                                                                                                                                                                                        |
| officeMobile     |         | C(30)  |                                                                                                                                                                                        |
| officeMail       |         | C(200) |                                                                                                                                                                                        |
| webUserName      |         | C(80)  |                                                                                                                                                                                        |
| webPassword      |         | C(50)  | Übergeben Sie das Passwort als Klartext. {::nomarkdown} Wir speichern nur einen Hash des Passwortes, Sie können es also nachfolgend nicht wieder auslesen. {:/}                        |
| role             |         |        | Die Nutzerrolle des anzulegenden Kontaktes. Bitte beachten Sie hierzu die [++Hinweise zu Benutzerrollen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/benutzerrollen/). |
| ignoreAssortment |         |        | `true` wenn für diesen Kontakt Sortimente ignoriert werden sollen, sonst `false`.                                                                                                      |

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird im Zielsystem ein neuer Kontakt angelegt. Sie erhalten als Antwort HTTP-Status `201 Created`, einen Location-Header mit der Url des Kontaktes sowie ein Antwortdokument mit den gespeicherten Kontaktdaten.

#### Fehlerfall

Im Fehlerfall wird kein neuer Kontakt angelegt. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein BadRequest Antwort-Dokument.

### Antwortheader

**Location** : Im Location-Header erhalten Sie die URL des neu angelegten Kontaktes.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <contact xmlns:atom="http://www.w3.org/2005/atom">
        <firstName>Rico</firstName>
        <gender>MALE</gender>
        <ignoreAssortment>false</ignoreAssortment>
        <lastName>Blaa</lastName>
        <officeFax></officeFax>
        <officeMail>rico@blaa.de</officeMail>
        <officeMobile></officeMobile>
        <officePhone></officePhone>
        <role>ROLE_SHOP_COSTCENTER_USER</role>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/b00de3c0-f685-42d5-92b5-c46f04803c8f/contact/683aacec-1225-4fe5-a71b-cbb0010fe1eb"/>
        <uuid>683aacec-1225-4fe5-a71b-cbb0010fe1eb</uuid>
        <webUserName>rico</webUserName>
    </contact>

> Die UUID des Kontaktes ist sein eindeutiger Schlüssel. Speichern Sie die UUID oder die vollständige Url aus dem `Location`-Header in Ihrem System, ohne sie können Sie keine Änderungen an dem gerade angelegten Kontakt vornehmen.

---
language: "de"
---
# Kontaktliste abrufen

## Beschreibung

Mit dieser Methode können Sie die Stammdaten aller Kontakte (Ansprechpartner) eines Kunden abrufen.

### Anfrage

#### Syntax

    GET /v2/customer/{UUID_des_Kunden}/contacts HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <contacts>
        <contact xmlns:atom="http://www.w3.org/2005/atom">
            <firstName>Rico</firstName>
            <gender>MALE</gender>
            <ignoreAssortment>false</ignoreAssortment>
            <lastName>Blaa</lastName>
            <officeFax></officeFax>
            <officeMail>rico@blaa.de</officeMail>
            <officeMobile></officeMobile>
            <officePhone></officePhone>
            <role>ROLE_SHOP_COSTCENTER_USER</role>
            <atom:link rel="self" href="http://api.cobai.com/v1/customer/b00de3c0-f685-42d5-92b5-c46f04803c8f/contact/683aacec-1225-4fe5-a71b-cbb0010fe1eb" />
            <uuid>683aacec-1225-4fe5-a71b-cbb0010fe1eb</uuid>
            <webUserName>rico</webUserName>
        </contact>
        ...
        <contact>
            ....
        </contact>   
    </contacts>

---
language: "de"
---
# Kunden

---
language: "de"
---
# Kunden abrufen

## Beschreibung

Mit dieser Methode können Sie die Stammdaten eines Kunden abrufen.

### Anfrage

#### Syntax

    GET /v2/customer/{UUID_des_Kunden} HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body\`

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customer xmlns:atom="http://www.w3.org/2005/atom">
        <city>Testingen</city>
        <countryNameIso>AT</countryNameIso>
        <externalAccountId1>ABCDEF</externalAccountId1>
        <fax></fax>
        <fon>12345</fon>
        <houseNumber>1</houseNumber>
        <inAutoDeliveryMode>false</inAutoDeliveryMode>
        <mail></mail>
        <name1>Testfirma geändert</name1>
        <name2></name2>
        <postcode>1234</postcode>
        <priceListTypeName>F100</priceListTypeName>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/fe81c542-0d72-41e6-af06-87e9cbefb070"/>
        <street>Testweg</street>
        <uuid>fe81c542-0d72-41e6-af06-87e9cbefb070</uuid>
    </customer>

---
language: "de"
---
# Kunden anlegen

## Beschreibung

Mit dieser Methode können Sie neue Kunden anlegen.

### Anfrage

#### Syntax

    POST /v2/customer/ HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

|      Name       |   Typ   | Default |                                   Beschreibung                                   |
|-----------------|---------|---------|----------------------------------------------------------------------------------|
| allow_id1_reuse | boolean | false   | Eine Prüfung auf doppelt vergebene Kundennummern findet nicht statt wenn `true`. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des anzulegenden Kunden innerhalb des Root-Elements `<customer/>`. Die folgenden Felder können übergeben werden:  

|      Feldname      | Pflicht |  Typ   |                                                                                                                                                                                          Bemerkung                                                                                                                                                                                          |
|--------------------|---------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| externalAccountId1 |         | C(15)  | Kundennummer im Warenwirtschaftssystem, muss systemweit eindeutig sein. Siehe auch Request Parameter '`allow_id1_reuse`'.                                                                                                                                                                                                                                                                   |
| externalAccountId2 |         | C(15)  | Infofeld, wird bisher nicht verwendet.                                                                                                                                                                                                                                                                                                                                                      |
| name1              |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| name2              |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| city               |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| postcode           |         | C(10)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| street             |         | C(60)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| houseNumber        |         | C(10)  | Sie können die Hausnummer auch im Feld "street" übergeben wenn die Daten nicht getrennt vorliegen.                                                                                                                                                                                                                                                                                          |
| countryNameIso     |         | C(3)   | Verwenden Sie nur Codes aus der Liste der [++freigegebenen Länderkennzeichen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/laenderkennzeichen/).                                                                                                                                                                                                                             |
| fon                |         | C(30)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| fax                |         | C(30)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| mail               |         | C(200) |                                                                                                                                                                                                                                                                                                                                                                                             |
| priceListTypeName  |         | C(4)   | Bitte beachten Sie dazu die [++Hinweise zu Preislistennamen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/preislistennamen/).                                                                                                                                                                                                                                                |
| inAutoDeliveryMode |         |        | `true` wenn der Kunden automatisch beliefert werden soll, sonst `false`.                                                                                                                                                                                                                                                                                                                    |
| custom1            |         | Liste  | seit 2026-02-01 Für individuelle Erweiterungen. Sie können hier eine Liste von Strings in folgender Form übergeben: <custom1> <entry>something</entry> <entry>something else</entry> <custom1> * Die übergebenen Werte werden nicht geprüft. * Maximale Länge pro Element 200 Zeichen. * Dieses Feld ist nur über die API zu pflegen, eingegebene Werte werden im opCenter nicht angezeigt. |

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird im Zielsystem ein neuer Kunden angelegt. Sie erhalten als Antwort HTTP-Status `201 Created`, einen Location-Header mit der Url des Kunden sowie ein Antwortdokument mit den gespeicherten Kundendaten.

#### Fehlerfall

Im Fehlerfall wird kein neuer Kunde angelegt. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein BadRequest Antwort-Dokument.

### Antwortheader

**Location** : Im Location-Header erhalten Sie die URL des neu angelegten Kunden.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customer xmlns:atom="http://www.w3.org/2005/atom">
        <city>Testingen</city>
        <countryNameIso>AT</countryNameIso>
        <externalAccountId1>ABCDEF</externalAccountId1>
        <fax></fax>
        <fon>12345</fon>
        <houseNumber>1</houseNumber>
        <inAutoDeliveryMode>false</inAutoDeliveryMode>
        <mail></mail>
        <name1>Testfirma geändert</name1>
        <name2></name2>
        <postcode>1234</postcode>
        <priceListTypeName>F100</priceListTypeName>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/fe81c542-0d72-41e6-af06-87e9cbefb070"/>
        <street>Testweg</street>
        <uuid>fe81c542-0d72-41e6-af06-87e9cbefb070</uuid>
    </customer>

> Die UUID des Kunden ist sein eindeutiger Schlüssel. Speichern Sie die UUID oder die vollständige Url aus dem `Location`-Header in Ihrem System, ohne sie können Sie keine Änderungen an dem gerade angelegten Kunden vornehmen.

---
language: "de"
---
# Kunden zusammenführen

## beta
Kunden zusammenführen

### Beschreibung

Mit dieser Methode können Sie zwei Kunden zu einem Kunden zusammenfassen.

Aus dem Quellkunden werden

* Kontakte

* Merklisten

* Kostenstellen

* Aufträge

in den Zielkunden übernommen.

Für Aufträge die noch im Frontend verfügbar sind (die also nicht bezahlt oder beliefert wurden) wird eine neue Preisfindung durchgeführt, die dem Warenkorb zugewiesene Preisfindungsart bleibt aber erhalten. Das kann dazu führen dass Warenkörbe die vor der Zusammenführung angelegt wurden Preisfindungsarten enthalten die dem Zielkunden nicht zur Verfügung stehen.

Der Quellkunde ist nach der Zusammenführung nicht mehr im System vorhanden.

### Anfrage

#### Syntax

    POST /v2/mergecustomer/<UUID_des_Zielkunden> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

| Parameter |    Beschreibung    |
|-----------|--------------------|
| sourceId  | ID des Quellkunden |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet den Request-Body nicht.

Antwort

#### Erfolgsfall

Im Erfolgsfall werden im Zielsystem die Kunden zusammengeführt und der Quellkunde gelöscht. Sie erhalten als Antwort HTTP-Status `200 OK` sowie ein Antwortdokument mit den gespeicherten Kundendaten.

#### Fehlerfall

Im Fehlerfall werden die Daten nicht aktualisiert. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein BadRequest Antwort-Dokument.

Gibt es keinen Kunden mit der übergebenen Ziel-UUID erhalten sie als Antwort HTTP-Status `404 Not found`.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customer xmlns:atom="http://www.w3.org/2005/atom">
        <city>Testingen</city>
        <countryNameIso>AT</countryNameIso>
        <externalAccountId1>ABCDEF</externalAccountId1>
        <fax></fax>
        <fon>12345</fon>
        <houseNumber>1</houseNumber>
        <inAutoDeliveryMode>false</inAutoDeliveryMode>
        <mail></mail>
        <name1>Testfirma geändert</name1>
        <name2></name2>
        <postcode>1234</postcode>
        <priceListTypeName>F100</priceListTypeName>
        <atom:link rel="self" href="http://api.cobai.com/v2/customer/fe81c542-0d72-41e6-af06-87e9cbefb070"/>
        <street>Testweg</street>
        <uuid>fe81c542-0d72-41e6-af06-87e9cbefb070</uuid>
    </customer>

---
language: "de"
---
# Kundenartikel

## Beschreibung

Mit dieser Methode können Sie Artikel einem einzelnen oder einer Gruppe von Kunden zuordnen. Sobald Sie einen Artikel mindestens einem Kunden zugeordnet haben ist er für Kunden denen der Artikel nicht zugeordnet wurde nicht mehr zu sehen oder zu kaufen.

Um einen Artikel einem Kunden zuordnen zu können muss dem Kunden eine \[externe Kundennummer\](/docs/de/kunden/hinzufuegen/#wichtige-felder) zugewiesen worden sein.

### Anfrage

#### Syntax

    PUT /v2/catalog/product-range/{sku} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Übergeben Sie pro Zeile eine externen Kundennummern eines Kunden dem der Artikel zugewiesen werden soll.

Sie können eine beliebige Anzahl Kundennummenn übergeben, eine leere Liste entfernt alle Zuordnungen-

Als Antwort auf die Anfrage erhalten sie

* im Erfolgsfall eine `HTTP 204 No-Content` Antwort.

* `HTTP Status 404 Not-Found` falls es keinen Artikel mit der übergebenen Artikelnummer gibt.

---
language: "de"
---
# Kundenliste abrufen

## Beschreibung

Mit dieser Methode können Sie eine Liste aller im System hinterlegter Kunden abrufen.

### Anfrage

#### Syntax

    GET /v2/customer HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

**state**

Liefert nur Kunden mit einem bestimmten Status, z.B. `http://api.cobai.com/v1/customer?state=new. `Der Parameter ist optional, wenn er fehlt erhalten Sie eine Liste aller Kunden.

Verfügbare Stati:  

| Name  |                                                                                            Beschreibung                                                                                            |
|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `new` | Nur Neukunden. Ein Neukunde ist ein Kunde der sich über das Shopfrontend selbst registriert hat. Der Kunden behält diesen Status bis sie einen Wert für das Feld `autoDeliveryMode` gesetzt haben. |

Bei Verwendung eines nicht definierten Status erhalten Sie als Antwort HTTP-Statuscode \`400 Bad request\`.

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

## Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customerIdList xmlns:atom="http://www.w3.org/2005/atom">
        <customer>
            <uuid>fe81c542-0d72-41e6-af06-87e9cbefb070</uuid>
            <atom:link rel="self" href="http://api.cobai.com/v1/customer/fe81c542-0d72-41e6-af06-87e9cbefb070"/>
        </customer>
        <customer>
            <uuid>7aa82b32-c86a-441b-a339-65d59c34719c</uuid>
            <atom:link rel="self" href="http://api.cobai.com/v1/customer/7aa82b32-c86a-441b-a339-65d59c34719c"/>
        </customer>
     
        ...
     
     
        <customer>
            <uuid>1b99acd7-d851-4726-b67b-58c3eb059581</uuid>
            <atom:link rel="self" href="http://api.cobai.com/v1/customer/1b99acd7-d851-4726-b67b-58c3eb059581"/>
        </customer>
    </customerIdList>

---
language: "de"
---
# Kundenpreise aktualisieren

## Kundenpreise aktualisieren oder neu anlegen

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für einen Kunden anlegen. Der Kunde für den Preise hinterlegt werden sollen muss bereits angelegt sein. Für den Kunden muss eine Kundennummer hinterlegt sein. Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    POST /v2/customer/{KUNDENNUMMER}/prices HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

Verwenden Sie als Kundennummer die Nummer, die Sie Ihrem Kunden zugeordnet haben, nicht die UUID des Kunden.

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Kundenpreise werden Zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Kundenpreise ersetzen

## Kundenpreise anlegen, ersetzen oder löschen

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für einen Kunden löschen und optional neue Preise anlegen. Der Kunde für den Preise gelöscht und optional neu hinterlegt werden sollen muss bereits angelegt sein. Für den Kunden muss eine Kundennummer hinterlegt sein.

### Anfrage

#### Syntax

    PUT /v2/customer/{KUNDENNUMMER}/prices HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

Verwenden Sie als Kundennummer die Nummer, die Sie Ihrem Kunden zugeordnet haben, nicht die UUID des Kunden.

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Kundenpreise werden Zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

Durch übergeben eines leeren Request-Bodys werden vorhandene Kundenpreise gelöscht ohne das neue Kundenpreise angelegt werden.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Kundenpreise pro Katalog aktualisieren

Dieser Endpunkt ist unter aktiver Entwicklung und noch nicht für allgemeine Verwendung freigegeben.

Die Katalog-IDs erhalten Sie auf Anfrage.

## Kundenpreise pro Katalog aktualisieren oder neu anlegen

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für einen Kunden anlegen.

* Der Kunde für den Preise hinterlegt werden sollen muss bereits angelegt sein.

* Für den Kunden muss eine Kundennummer hinterlegt sein.

Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    POST /v2/customer/{KUNDENNUMMER}/catalog-prices/{CATALOG_ID} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

Verwenden Sie als Kundennummer die Nummer, die Sie Ihrem Kunden zugeordnet haben, nicht die UUID des Kunden.

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Kundenpreise werden Zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Kundenpreise pro Katalog ersetzen

Dieser Endpunkt ist unter aktiver Entwicklung und noch nicht für allgemeine Verwendung freigegeben.

Die Katalog-IDs erhalten Sie auf Anfrage.

## Kundenpreise pro Katalog anlegen, ersetzen oder löschen

### Beschreibung

Mit dieser Methode können Sie individuelle Preise für einen Kunden löschen und optional neue Preise anlegen. Es werden zuerst **alle Preise des Kunden für einen Katalog entfernt** und dann optional übergebene Preise neu angelegt. Wenn Sie keine Preise übergeben, werden lediglich alle vorhandenen Kundenpreise für einen Katalog gelöscht.

* Der Kunde für den Preise gelöscht und optional neu hinterlegt werden sollen muss bereits angelegt sein.

* Für den Kunden muss eine Kundennummer hinterlegt sein.

Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    PUT /v2/customer/{KUNDENNUMMER}/catalog-prices/{CATALOG_ID} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

Verwenden Sie als Kundennummer die Nummer, die Sie Ihrem Kunden zugeordnet haben, nicht die UUID des Kunden.

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Kundenpreise werden Zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

* Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

Durch übergeben eines leeren Request-Bodys werden vorhandene Kundenpreise gelöscht ohne das neue Kundenpreise angelegt werden.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Kundenstammdaten ändern

## Beschreibung

Mit dieser Methode können Sie neue Kunden anlegen.

### Anfrage

#### Syntax

    PUT /v2/customer/<UUID_des_Kunden> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

|      Name       |   Typ   | Default |                                   Beschreibung                                   |
|-----------------|---------|---------|----------------------------------------------------------------------------------|
| allow_id1_reuse | boolean | false   | Eine Prüfung auf doppelt vergebene Kundennummern findet nicht statt wenn `true`. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des zu ändernden Kunden innerhalb des Root-Elements `<customer/>`. Die folgenden Felder können übergeben werden:  

|      Feldname      | Pflicht |  Typ   |                                                                                                                                                                                          Bemerkung                                                                                                                                                                                          |
|--------------------|---------|--------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| externalAccountId1 |         | C(15)  | Kundennummer im Warenwirtschaftssystem, muss systemweit eindeutig sein. Siehe auch Request Parameter '`allow_id1_reuse`'.                                                                                                                                                                                                                                                                   |
| externalAccountId2 |         | C(15)  | Infofeld, wird bisher nicht verwendet.                                                                                                                                                                                                                                                                                                                                                      |
| name1              |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| name2              |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| city               |         | C(40)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| postcode           |         | C(10)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| street             |         | C(60)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| houseNumber        |         | C(10)  | Sie können die Hausnummer auch im Feld "street" übergeben wenn die Daten nicht getrennt vorliegen.                                                                                                                                                                                                                                                                                          |
| countryNameIso     |         | C(3)   | Verwenden Sie nur Codes aus der Liste der [++freigegebenen Länderkennzeichen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/laenderkennzeichen/).                                                                                                                                                                                                                             |
| fon                |         | C(30)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| fax                |         | C(30)  |                                                                                                                                                                                                                                                                                                                                                                                             |
| mail               |         | C(200) |                                                                                                                                                                                                                                                                                                                                                                                             |
| priceListTypeName  |         | C(4)   | Bitte beachten Sie dazu die [++Hinweise zu Preislistennamen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/preislistennamen/).                                                                                                                                                                                                                                                |
| inAutoDeliveryMode |         |        | `true` wenn der Kunden automatisch beliefert werden soll, sonst `false`.                                                                                                                                                                                                                                                                                                                    |
| custom1            |         | Liste  | seit 2026-02-01 Für individuelle Erweiterungen. Sie können hier eine Liste von Strings in folgender Form übergeben: <custom1> <entry>something</entry> <entry>something else</entry> <custom1> * Die übergebenen Werte werden nicht geprüft. * Maximale Länge pro Element 200 Zeichen. * Dieses Feld ist nur über die API zu pflegen, eingegebene Werte werden im opCenter nicht angezeigt. |

### Antwort

#### Erfolgsfall

Im Erfolgsfall werden im Zielsystem die Kundendaten geändert. Sie erhalten als Antwort HTTP-Status `200 OK` sowie ein Antwortdokument mit den gespeicherten Kundendaten.

#### Fehlerfall

Im Fehlerfall werden die Daten nicht aktualisiert. Sie erhalten als Antwort HTTP-Status `400 Bad Request` oder `409 Conflict` und ein BadRequest Antwort-Dokument.

Gibt es keinen Kunden mit der übergebenen UUID erhalten sie als Antwort HTTP-Status `404 Not found`.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <customer xmlns:atom="http://www.w3.org/2005/atom">
        <city>Testingen</city>
        <countryNameIso>AT</countryNameIso>
        <externalAccountId1>ABCDEF</externalAccountId1>
        <fax></fax>
        <fon>12345</fon>
        <houseNumber>1</houseNumber>
        <inAutoDeliveryMode>false</inAutoDeliveryMode>
        <mail></mail>
        <name1>Testfirma geändert</name1>
        <name2></name2>
        <postcode>1234</postcode>
        <priceListTypeName>F100</priceListTypeName>
        <atom:link rel="self" href="http://api.cobai.com/v1/customer/fe81c542-0d72-41e6-af06-87e9cbefb070"/>
        <street>Testweg</street>
        <uuid>fe81c542-0d72-41e6-af06-87e9cbefb070</uuid>
    </customer>

---
language: "de"
---
# Länderkennzeichen

## Freigegebene Länderkennzeichen

|     Land      | ISO-Code |
|---------------|----------|
| Belgien       | BE       |
| Bulgarien     | BG       |
| Deutschland   | DE       |
| Dänemark      | DK       |
| England       | GB       |
| Estland       | EE       |
| Finland       | FI       |
| Frankreich    | FR       |
| Gibraltar     | GI       |
| Griechenland  | GR       |
| Irland        | IE       |
| Italien       | IT       |
| Kroatien      | HR       |
| Lettland      | LV       |
| Liechtenstein | LI       |
| Littauen      | LT       |
| Luxemburg     | LU       |
| Malta         | MT       |
| Niederlande   | NL       |
| Polen         | PL       |
| Portugal      | PT       |
| Rumänien      | RO       |
| Schweden      | SE       |
| Slovakei      | SK       |
| Slovenien     | SI       |
| Spanien       | ES       |
| Tschechien    | CZ       |
| Ungarn        | HU       |
| Cypern        | CY       |
| Österreich    | AT       |

---
language: "de"
---
# Lieferadressen abrufen

## Beschreibung

Mit dieser Methode können Sie eine Liste aller Lieferadressen eines Kunden abrufen. Wenn Sie bei der Aktualisierung von Lieferadressen externe IDs übergeben haben werden die externen IDs im Antwortdokument zurück geliefert. Adressen die nach der Aktualisierung per Schnittstelle im Shop geändert wurden behalten ihre alte ID, sofern die Adresse nicht manuell gelöscht und danach erneut angelegt wurde.

### Anfrage

#### Syntax

    GET /v2/customer/<uuid>/delivery-addresses HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese methode benutzt keine Requestparameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <addresses xmlns:atom="http://www.w3.org/2005/atom">
        <address>
            <addressIdentifier>c0bc3796-6d99-4693-826c-47fd5bfbaedb</addressIdentifier>
            <externalAddressIdentifier>some-external-id</externalAddressIdentifier>
            <city>Ort</city>
            <countryIso>DE</countryIso>
            <fax></fax>
            <fon></fon>
            <houseNumber>3</houseNumber>
            <mail></mail>
            <name1>Anderswo AG</name1>
            <name2></name2>
            <name3></name3>
            <name4></name4>
            <postbox></postbox>
            <postcode>12345</postcode>
            <postcodeCompany></postcodeCompany>
            <postcodePostbox></postcodePostbox>
            <street>Weg</street>
        </address>
        
        ...
        
    </addresses>

---
language: "de"
---
# Lieferadressen aktualisieren

## Beschreibung

Diese Methode aktualisiert alle Lieferadressen eines Kunden.

Die übergebenen Lieferadressen müssen eindeutig sein, Sie dürfen also keine zwei oder mehr identische Adressen übergeben.

Die übergebenen Adressen ersetzen/aktualisieren die vorhandenen Adressen eines Kunden, dabei können optional externe Adress-Ids gesetzt werden:

* Übergabe einer externen Ids zu einer Adresse:

  * Existiert im Shop bereits eine Adresse mit der übergebenen externen ID wird die Adresse aktualisiert. Das betrifft auch eingeschränkte Lieferadressen an Kontakten.

  * Bereits vorhandenen Adressen ohne externe Id wird die externe ID zugewiesen

  * In den übrigen Fällen wird eine neue Adresse mit der übergebenen externen Id angelegt.

* Keine Übergabe einer externen Id zu einer Adresse:

  * Ist die Adresse bereits vorhanden wird sie beibehalten, eine vorhandene externe Id wird entfernt.

  * Sonst wird die Adresse neu angelegt.

* Adressen die vor dem Aufruf vorhanden waren aber nicht übergeben wurden werden entfernt. Das betrifft auch eingeschränkte Lieferadressen an Kontakten.

### Anfrage

#### Syntax

    PUT /v2/customer/<uuid>/delivery-addresses HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine Requestparameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request Body erwartet die Methode ein XML-Dokument mit folgendem Aufbau:

    <addresses>
        <address>
            <externalAddressIdentifier>some-external-id</externalAddressIdentifier>
            <city>Ort</city>
            <countryIso>DE</countryIso>
            <houseNumber>3</houseNumber>
            <name1>Anderswo AG</name1>
            <name2></name2>
            <name3></name3>
            <name4></name4>
            <postcode>12345</postcode>
            <street>Weg</street>
        </address>
        
        ...
        
    </addresses>

|         Feldname          | Pflicht |  Typ   |                                                                            Bemerkung                                                                            |
|---------------------------|---------|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| externalAddressIdentifier |         | C(255) | Externe Id der Adresse. Diese Id bliebt der Adresse auch bei Änderungen auf Shopseite weiter zugeordnet.                                                        |
| name1                     |         | C(40)  |                                                                                                                                                                 |
| name2                     |         | C(40)  |                                                                                                                                                                 |
| name3                     |         | C(40)  |                                                                                                                                                                 |
| name4                     |         | C(40)  |                                                                                                                                                                 |
| city                      |         | C(40)  |                                                                                                                                                                 |
| postcode                  |         | C(10)  |                                                                                                                                                                 |
| street                    |         | C(60)  |                                                                                                                                                                 |
| houseNumber               |         | C(10)  | Sie können die Hausnummer auch im Feld "street" übergeben wenn die Daten nicht getrennt vorliegen.                                                              |
| countryNameIso            |         | C(3)   | Verwenden Sie nur Codes aus der Liste der [++freigegebenen Länderkennzeichen++](https://www.cobai.com/de/docs/api-v2/kunden/wertebereiche/laenderkennzeichen/). |

> Sie können alle Lieferadressen eines Kunden löschen indem Sie einen leeren Request Body übergeben.

### Antwortdokument

Als Antwort erhalten Sie ein XML-Dokument mit allen hinterlegten Lieferadressen oder im Fehlerfall ein `BadRequest` Antwortdokument.

---
language: "de"
---
# Preise

---
language: "de"
---
# Preislistennamen

> Bitte beachten Sie sie unterschiedliche Preislistenbenennung zwischen Preisupload und Preislistenhinterlegung im Kundenstamm:
>
> * Beim Upload von Preislisten wird **kein** Präfix verwendet.
>
> * Beim Hinterlegen von Preislisten im Kundenstamm **müssen** Sie den Präfix `F` verwenden.

Preislistennamen müssen in bestimmten Wertebereichen liegen. Die Bereiche sind:

## Standardpreisliste

Preislistenname: **F95** .

Die Preise in der Standardpreisliste werden automatisch aktualisiert.

### Zusatzlisten mit Anlage über die Listennummer

Wertebereich: **F100** bis **F120** .

Diese Listen können Sie selbst anlegen. Bei der Anlage übergeben Sie die Listennummer, das System erstellt dazu selbstständig einen Namen. Der Name der Liste ist fest "Preisliste `<Nummer der Liste>`".

### Zusatzlisten mit Anlage über den Listennamen

Wertebereich: ab **F200** .

Diese Listen können Sie selbst anlegen. Bei der Anlage übergeben Sie einen Listennamen, das System erstellt dazu selbstständig eine Listennummer.

---
language: "de"
---
# Preislistenpreise aktualisieren

## Preislistenpreise aktualisieren oder neu anlegen

### Beschreibung

Mit dieser Methode können Sie Preislisten anlegen und Preise in vorhandenen Preislisten aktualisieren bzw. hinzufügen. Noch nicht vorhandenen Preislisten werden automatisch angelegt. Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    POST /v2/pricelist/{LISTENNUMMER} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

> Abhängig von dem einem Shop zugeordneten Vertrag stehen Ihnen entweder Listennummern im Bereich zwischen 100 und 120 (einschliesslich) oder beliebige Listennummern größer gleich 100 zur Verfügung. Listennummern ausserhalb des erlaubten Bereiches werden mit Http-Status 404 beantwortet.

#### Request-Parameter

| Name |  Typ   |           Default           |                   Beschreibung                    |
|------|--------|-----------------------------|---------------------------------------------------|
| name | String | Preisliste `<Listennummer>` | Setzt einen optionalen Namen für eine Preisliste. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Preise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
        <jobid>12345</jobid> 
        <state>pending</state> 
        <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" /> 
        <message xml:lang="de">
            Ihre Anfrage wartet auf die Verarbeitung.
        </message>
        <queuepos>5</queuepos> 
    </job>

---
language: "de"
---
# Preislistenpreise ersetzen

## Beschreibung

Mit dieser Methode können Sie Preislisten anlegen oder vorhandene Preislisten überschreiben. Noch nicht vorhandenen Preislisten werden automatisch angelegt.

Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    PUT /v2/pricelist/<LISTENNUMMER> HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

> * Abhängig von dem einem Shop zugeordneten Vertrag stehen Ihnen entweder Listennummern im Bereich zwischen 100 und 120 (einschliesslich) oder beliebige Listennummern größer gleich 100 zur Verfügung.
>
> * Listennummern ausserhalb des erlaubten Bereiches werden mit Http-Status 404 beantwortet.

#### Request-Parameter

| Name |  Typ   |           Default           |                   Beschreibung                    |
|------|--------|-----------------------------|---------------------------------------------------|
| name | String | Preisliste `<Listennummer>` | Setzt einen optionalen Namen für eine Preisliste. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Preise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein.

Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

1. Artikelnummer

2. Preis

3. Staffelgrenze 1

4. Staffelpreis 1

5. Staffelgrenze 2

6. Staffelpreis 2

Sie können mit dieser Methode auch alle Preise in einer Preisliste löschen, indem Sie einen leeren Request-Body übergeben.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln.

Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Preislistenpreise pro Katalog aktualisieren

Dieser Endpunkt ist unter aktiver Entwicklung und noch nicht für allgemeine Verwendung freigegeben.

Die Katalog-IDs erhalten Sie auf Anfrage.

## Preislistenpreise pro Katalog aktualisieren oder neu anlegen

### Beschreibung

Mit dieser Methode können Sie Preislisten anlegen und Preise in vorhandenen Preislisten aktualisieren bzw. hinzufügen. Noch nicht vorhandenen Preislisten werden automatisch angelegt.

Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    POST /v2/pricelist/{LISTENNUMMER}/catalog-prices/{CATALOG_ID} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

> Abhängig von dem einem Shop zugeordneten Vertrag stehen Ihnen entweder Listennummern im Bereich zwischen 100 und 120 (einschliesslich) oder beliebige Listennummern größer gleich 100 zur Verfügung. Listennummern ausserhalb des erlaubten Bereiches werden mit Http-Status 404 beantwortet.

#### Request-Parameter

| Name |  Typ   |           Default           |                   Beschreibung                    |
|------|--------|-----------------------------|---------------------------------------------------|
| name | String | Preisliste `<Listennummer>` | Setzt einen optionalen Namen für eine Preisliste. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Preise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein. Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

Artikelnummer

* Preis

* Staffelgrenze 1

* Staffelpreis 1

* Staffelgrenze 2

* Staffelpreis 2

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln. Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
        <jobid>12345</jobid> 
        <state>pending</state> 
        <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" /> 
        <message xml:lang="de">
            Ihre Anfrage wartet auf die Verarbeitung.
        </message>
        <queuepos>5</queuepos> 
    </job>

---
language: "de"
---
# Preislistenpreise pro Katalog ersetzen

Dieser Endpunkt ist unter aktiver Entwicklung und noch nicht für allgemeine Verwendung freigegeben.

Die Katalog-IDs erhalten Sie auf Anfrage.

## Preislistenpreise pro Katalog anlegen, ersetzen oder löschen

### Beschreibung

Mit dieser Methode können Sie Preislisten anlegen oder vorhandene Preislisten überschreiben. Noch nicht vorhandenen Preislisten werden automatisch angelegt. Es werden zuerst **alle Preise der Preisliste für einen Katalog entfernt** und dann optional übergebene Preise neu angelegt. Wenn Sie keine Preise übergeben, werden lediglich alle vorhandenen Preslistenpreise für einen Katalog gelöscht.

Die Verarbeitung der übergebenen Daten erfolgt asynchron. Sie erhalten als Antwort auf Ihre Anfrage eine Job-Id mit der Sie den Verarbeitungsstatus der übergebenen Preise ermitteln können.

### Anfrage

#### Syntax

    PUT /v2/pricelist/<LISTENNUMMER>/catalog-prices/{CATALOG_ID} HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

> * Abhängig von dem einem Shop zugeordneten Vertrag stehen Ihnen entweder Listennummern im Bereich zwischen 100 und 120 (einschliesslich) oder beliebige Listennummern größer gleich 100 zur Verfügung.
>
> * Listennummern ausserhalb des erlaubten Bereiches werden mit Http-Status 404 beantwortet.

#### Request-Parameter

| Name |  Typ   |           Default           |                   Beschreibung                    |
|------|--------|-----------------------------|---------------------------------------------------|
| name | String | Preisliste `<Listennummer>` | Setzt einen optionalen Namen für eine Preisliste. |

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Anders als die meisten anderen Methoden verwendet diese Methode aufgrund der zu erwartenden Datenmenge im Body nicht XML sondern ein Plaintextformat. Die Preise werden zeilenweise übertragen, wobei einzelne Elemente einer Zeile durch Tab getrennt werden. Ein Newline beendet die aktuelle Zeile und leitet eine neue Zeile ein.

Eine Zeile besteht aus den folgenden Feldern in genau der angegebenen Reihenfolge:

1. Artikelnummer

2. Preis

3. Staffelgrenze 1

4. Staffelpreis 1

5. Staffelgrenze 2

6. Staffelpreis 2

Sie können mit dieser Methode auch alle Preise in einer Preisliste löschen, indem Sie einen leeren Request-Body übergeben.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit Job-Id und Status des Verarbeitungsjobs. Mit dem zurückgelieferten Link können Sie optional den Verarbeitungsstatus Ihrer Anfrage ermitteln.

Bitte verwenden Sie für die Abfrage des Jobstatus die im `<atom:link />`-Tag übergebene URL, da sich der Aufbau der URL jederzeit ändern kann.

    <job xmlns:atom="http://www.w3.org/2005/atom">
      <jobid>12345</jobid>
      <state>pending</state>
      <atom:link href="http://api.cobai.com/v1/job/12345" rel="self" />
      <message xml:lang="de">Ihre Anfrage wartet auf die Verarbeitung.</message>
      <queuepos>5</queuepos>
    </job>

---
language: "de"
---
# Produkt löschen

## Beschreibung

Mit dieser Methode können Sie ein Produkte löschen. Das Produkt muss nicht leer sein, eventuell enthaltene Varianten werden ebenfalls gelöscht.

### Anfrage

#### Syntax

    DELETE /v2/product/<Produktnummer> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body.

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird das Objekt gelöscht. Sie erhalten als Antwort HTTP-Status `204 No Content`.

#### Fehlerfall

* Falls kein Produkt unter der übergebene URL existiert erhalten Sie HTTP-Status `404 Not Found`.

---
language: "de"
---
# Produktabbildung anlegen oder ändern

## Beschreibung

Mit dieser Methode können Sie ein neues Objekt anlegen oder ein vorhandenes ändern.

### Anfrage

#### Syntax

    PUT /v2/product/<StandardProduktNummer>/image HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: type
    Authorization: Signatur

> Achten Sie darauf den Content-Type anzugeben. Fehlt er, wird der Upload mit einem `400 Bad Request`-Fehler abgebrochen.

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode die für die Abbildung zu speichernden Byte. Es wird keine Kodierung/Konvertierung durchgeführt.

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird das Objekt angelegt. Sie erhalten als Antwort HTTP-Status `204 No Content`.

#### Fehlerfall

* Im Fehlerfall wird das Objekt nicht angelegt/geändert. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein `BadRequest` Antwort-Dokument.

* Existiert kein Produkt unter der angegeben Urn erhalten Sie als Antwort Http-Status `404 Not Found`.

* Wurde das Produkt nicht von Ihnen angelegt erhalten Sie als Antwort Http-Status `403 Forbidden`.

---
language: "de"
---
# Produkte aktualisieren

## Beschreibung

Mit dieser Methode können Sie die Daten vorhandener Produkte aktualisieren.

### Anfrage

#### Syntax

    PUT /v2/product/<StandardProduktNummer> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des zu aktualisierenden Produktes. Der Aufbau des Dokumentes ist identisch mit dem Dokument zur Neuanlage eines Produktes.

### Antwort

#### Erfolgsfall

Im Erfolgsfall werden im Zielsystem die Produktdaten aktualisiert. Sie erhalten als Antwort HTTP-Status `200 OK` sowie ein Antwortdokument mit der Standardproduktnummer (SPN) sowie der Url des Produktes.

#### Fehlerfall

Im Fehlerfall werden die Produktdaten nicht aktualisiert. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein BadRequest Antwort-Dokument.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <productResponse xmlns:atom="http://www.w3.org/2005/atom">
      <spn>1234567890</spn>
      <atom:link rel="self" href="http://api.cobai.com/v1/product/1234567890"/>
    </productResponse>

---
language: "de"
---
# Produkte anlegen

## Beschreibung

Mit dieser Methode können Sie neue Produkte anlegen.

### Anfrage

#### Syntax

    POST /v2/product/ HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten des anzulegenden Produktes innerhalb des Root-Elements mit folgendem Aufbau:

    <product>
      <head>
        <category>Warengruppe</category>
        <make>Marke</make> 
        <title>Titel</title>
        <description>Beschreibung (lang)</description>
        <keywords>
          <keyword>Zusätzlicher Suchbegriff</keyword>
        </keywords>
        <attributes>
          <attribute>Name eines Attributes</attribute>
        </attributes>
      </head>
      <items>
        <item>
          <sku>Artikelnummer</sku>
          <manufacturerMaterialNumber>Herstellerteilenummer</manufacturerMaterialNumber>
          <text>Artikeltext für Warenkorb und Auftragsbestätigungen</text>
          <tax>Steuercode</tax>
          <content>Inhalt bei grundpreisangabepflichtigen Produkten</content>
          <unit>Inhaltsmengeneinheit bei grundpreisangabepflichtigen Produkten</unit>
          <attributeValues>
            <value>Wert eines Attributes</value>
          </attributeValues>
        </item>
      </items>
    <product>

|          Feldname          | Pflicht |   Typ   |                                                                                                         Bemerkung                                                                                                         |
|----------------------------|---------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| make                       |         | C(60)   | Marke                                                                                                                                                                                                                     |
| title                      |         | C(200)  | Kurztitel des Produktes                                                                                                                                                                                                   |
| description                |         | C(3500) | Beschreibung (lang) des Produktes                                                                                                                                                                                         |
| category                   |         | C       | Verwenden Sie nur gültige Warengruppen-IDs. Eine Liste aller IDs erhalten sie über die Servicemethode Warengruppenliste abrufen. Achtung: Verwenden Sie nur Warengruppen, die keine weiteren Unterwarengruppen enthalten. |
| keywords/keyword           |         | C       | Geben Sie hier zusätzliche Suchbegriffe an mit denen der Artikel über die Volltextsuche gefunden werden soll. Innerhalb des `<keywords>`-Tags können Sie beliebig viele `<keyword>`-Tags aufnehmen.                       |
| attributes/attribute       |         | C(100)  | Maximal 6 Attributnamen                                                                                                                                                                                                   |
| items/item                 |         | -       | Die einzelnen Varianten eines Artikels, z.B. Farbvarianten. Wenn Ihr Artikel keine Varianten enthält nehmen Sie nur ein einzelnes item-Tag innerhalb des items-Tags auf.                                                  |
| sku                        |         | C(32)   | Ihre Artikelnummer. Bitte achten Sie darauf, nicht mit den Shop-Artikelnummern zu kollidieren.                                                                                                                            |
| manufacturerMaterialNumber |         | C(32)   | Die Teilenummer des Herstellers (Herstellerartikelnummer)                                                                                                                                                                 |
| text                       |         | C(80)   | Die Artikelbeschreibung. Dieser Text wird im Warenkorb angezeigt und in allen ausgehenden Mails verwendet in denen Artikel beschrieben werden (z.B. Auftragsbestätigungen).                                               |
| tax                        |         | N(1)    | Steuercode: 1 - Volle Steuer, 2 - halbe Steuer, 0 - steuerbefreit                                                                                                                                                         |
| content                    |         | N(6)    | Der Inhalt bei Produkten für die ein Grundpreis angegeben werden muss. Geben Sie den Inhalt als ganze Zahl an.                                                                                                            |
| unit                       |         | C(2)    | Die Inhaltsmengeneinheit des Inhalts, falls im Feld content ein Inhalt angegeben wird. Erlaubte Werte: ml: Milliliter g: Gramm mm: Millimeter l: Liter kg: Kilogramm m: Meter                                             |
| attributeValues/value      |         | C(100)  | Ausprägung eines Attributes. Es sind maximal 6 Attributwerte erlaubt.                                                                                                                                                     |

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird im Zielsystem ein neues Produkt angelegt. Sie erhalten als Antwort HTTP-Status `201 Created` und ein Antwortdokument mit der Standardproduktnummer (SPN) sowie der Url des Produktes.

#### Fehlerfall

Im Fehlerfall wird kein neues Produkt angelegt. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein `BadRequest` Antwort-Dokument.

### Antwortheader

**Location:** Im Location-Header erhalten Sie die URL des neu angelegten Produktes.

### Antwortdokument

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <productResponse xmlns:atom="http://www.w3.org/2005/atom">
      <spn>1234567890</spn>
      <atom:link rel="self" href="http://api.cobai.com/v1/product/1234567890"/>
    </productResponse>

> Speichern Sie die Url des Artikels und die Standardproduktnummer, sie können andernfalls keine Änderungen am Produkt vornehmen und keine Produktabbildungen zuordnen.

---
language: "de"
---
# Produktvariante löschen

## Beschreibung

Mit dieser Methode können Sie innerhalb eines Produktes Varianten löschen. Das Produkt bleibt auch nach der Entfernung der letzten Variante erhalten.

### Anfrage

#### Syntax

    DELETE /v2/product/<Produktnummer>/item/<sku> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body.

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird die Variante gelöscht. Sie erhalten als Antwort HTTP-Status `204 No Content`.

#### Fehlerfall

* Falls keine Variante unter der übergebene URL existiert erhalten Sie HTTP-Status `404 Not Found`.

---
language: "de"
---
# Produktvarianten anlegen oder ändern

## Beschreibung

Mit dieser Methode können Sie innerhalb eines Produktes Varianten anlegen oder ändern. Das Produkt muss vorher angelegt worden sein.

### Anfrage

#### Syntax

    PUT /v2/product/<Produktnummer>/item/<SKU> HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Content-Length: Länge
    Content-Type: application/xml
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Im Request-Body erwartet die Methode ein XML-Dokument mit den Daten der anzulegenden/zu ändernden Variante innerhalb des Root-Elements `<item/>` mit folgendem Aufbau:

    <item>
      <sku>Artikelnummer</sku>
      <manufacturerMaterialNumber>Herstellerteilenummer</manufacturerMaterialNumber>
      <text>Artikeltext für Warenkorb und Auftragsbestätigungen</text>
      <tax>Steuercode</tax>
      <content>Inhalt bei grundpreisangabepflichtigen Produkten</content>
      <unit>Inhaltsmengeneinheit bei grundpreisangabepflichtigen Produkten</unit>
      <freeGoodsOnly>nur für Naturalrabatte verwendbar</freeGoodsOnly>
      <attributeValues>
        <value>Wert eines Attributes</value>
      </attributeValues>
    </item>

Die Belegung der Felder entspricht der Belegung bei der Anlage eines Produktes.

### Antwort

#### Erfolgsfall

Im Erfolgsfall wird im Zielsystem eine neue Variante angelegt oder eine bestehende Variante geändert. Sie erhalten als Antwort HTTP-Status `204 No Content`.

#### Fehlerfall

* Im Fehlerfall wird das Objekt nicht angelegt/geändert. Sie erhalten als Antwort HTTP-Status `400 Bad Request` und ein `BadRequest` Antwort-Dokument.

* Falls kein Produkt mit der übergebenen Produktnummer existiert erhalten Sie HTTP-Status `404 Not Found`.

---
language: "de"
---
# Warenempfängerpreise abrufen

## Beschreibung

Mit dieser Methode können Sie alle Warenempfängerpreise eines Shops abrufen, der Aufruf ist daher nur in Shops sinnvoll in die automatisiert Einkaufspreise für Warenempfänger eingespielt werden. Diese Funktion wird aktuell nur in Shops unterstützt die an die Logistik von ALKA/PBS-Deutschland angeschlossen sind.

### Anfrage

#### Syntax

    GET /v2/weprices HTTP/1.1
    Host: api.cobai.com
    Content-Length: Länge
    Content-Type: text/plain
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument im Format `text/plain` mit folgendem Inhalt:

1. Kundennummer

2. Warenempfängernummer

3. Artikelnummer

4. Preis

5. Staffelgrenze 1

6. Staffelpreis 1

7. Staffelgrenze 2

8. Staffelpreis 2

Ab Punkt 5 sind die Inhalte optional. Einzelne Felder werden durch Tab getrennt, einzelne Zeilen durch ein einzelnes Newline ("`\\n`").

Sie erhalten in jedem Fall ein (eventuell leeres) Antwortdokument.

---
language: "de"
---
# Warengruppenliste abrufen

## Beschreibung

Mit dieser Methode können Sie eine Liste aller im System hinterlegter Warengruppen abrufen.

### Anfrage

#### Syntax

    GET /v2/categories HTTP/1.1
    Host: api.cobai.com
    Date: Datum/Uhrzeit
    Authorization: Signatur

#### Request-Parameter

Diese Methode benutzt keine zusätzlichen Request-Parameter

#### Request-Header

Diese Methode benutzt zusätzlich zu den Standard-Requestheadern keine weiteren Header.

#### Request-Body

Diese Methode verwendet keinen Request-Body

### Antwortdokument

Als Antwort auf die Anfrage erhalten sie ein Antwortdokument mit folgendem Inhalt:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <categories>
        <category id="123" lable="Name der Warengruppe">
            <category id="456" parent="123" lable="Unterwarengruppe"></category>
        </category>
        ...
     
        <category id="002" lable="Name der Warengruppe"></category>
    </categories>

---
language: "de"
---
# Wertebereiche

---
version: "Working version"
language: "de"
---
# Für Shopbetreiber

## Für Shopbetreiber

### Empfohlen

*

  #### [Eigene Domänen](https://help.cobai.com/customer-documentation/working-version/eigene-domanen.md)

  Eigene Domänen verwenden Sie können Ihren Shop unter einer eigenen Domäne betreiben die sie selbst erworben haben. Um Ihren Shop unter einer eigenen Domäne zu ...
*

  #### [Einstellungen / SPF-Records](https://help.cobai.com/customer-documentation/working-version/einstellungen-spf-records.md)

  Was ist ein SPF-Record? Das Sender Policy Framework (SPF) ist eine Methode zur Authentifizierung von E-Mails, mit der gefälschte Absenderadressen bei der E-Mai...
*

  #### [Template anpassen](https://help.cobai.com/customer-documentation/working-version/template-anpassen.md)

  Neues Template verwenden Neben dem bisherigen Standardtemplate steht Ihnen zusätzlich unser neues Template zur Verfügung. Sie können jederzeit vom bisherigen a...

### Themen

*

  #### [Kunden](https://help.cobai.com/customer-documentation/working-version/kunden.md)

  * [Kundenstammdaten](https://help.cobai.com/customer-documentation/working-version/kundenstammdaten.md)
  * [Benutzerrollen](https://help.cobai.com/customer-documentation/working-version/benutzerrollen.md)
  * [OCI-Punchout](https://help.cobai.com/customer-documentation/working-version/oci-punchout.md)
  * [cXML Punchout einrichten](https://help.cobai.com/customer-documentation/working-version/cxml-punchout-einrichten.md)
  * [Kundendaten importieren und exportieren](https://help.cobai.com/customer-documentation/working-version/kundendaten-importieren-und-exportieren.md)
  * [7 more pages](https://help.cobai.com/customer-documentation/working-version/kunden.md)
*

  #### [Produkte](https://help.cobai.com/customer-documentation/working-version/produkte.md)

  * [Massenanlage und -änderung von Produkten](https://help.cobai.com/customer-documentation/working-version/massenanlage-und-anderung-von-produkten-gpsr-ab-13.md)
  * [Produktbeziehungen](https://help.cobai.com/customer-documentation/working-version/produktbeziehungen.md)
  * [Bestandsverwaltung für eigene Artikel](https://help.cobai.com/customer-documentation/working-version/bestandsverwaltung-fur-eigene-artikel.md)
  * [Massenlöschung von eigenen Produkten](https://help.cobai.com/customer-documentation/working-version/massenloschung-von-eigenen-produkten.md)
*

  #### [Lieferanten \& Kataloge](https://help.cobai.com/customer-documentation/working-version/lieferanten-kataloge.md)

  * [Lieferantenkategorien auswählen](https://help.cobai.com/customer-documentation/working-version/lieferantenkategorien-auswaehlen.md)
  * [Marken pro Lieferant auswählen](https://help.cobai.com/customer-documentation/working-version/marken-pro-lieferant-auswaehlen.md)
  * [Preise pro Lieferant bearbeiten](https://help.cobai.com/customer-documentation/working-version/preise-pro-lieferant-bearbeiten.md)
  * [Empfohlene VK pro Lieferant](https://help.cobai.com/customer-documentation/working-version/empfohlene-vk-pro-lieferant.md)
*

  #### [Marketing](https://help.cobai.com/customer-documentation/working-version/marketing.md)

  * [Aktionspreise / Preisaktionen](https://help.cobai.com/customer-documentation/working-version/aktionspreise-preisaktionen.md)
  * [Cashback World](https://help.cobai.com/customer-documentation/working-version/cashback-world.md)
  * [Werbegeschenke und Zugaben](https://help.cobai.com/customer-documentation/working-version/werbegeschenke-und-zugaben.md)
  * [Gutscheine](https://help.cobai.com/customer-documentation/working-version/gutscheine-vorschau.md)
  * [Kategorietexte](https://help.cobai.com/customer-documentation/working-version/kategorietexte.md)
  * [6 more pages](https://help.cobai.com/customer-documentation/working-version/marketing.md)
*

  #### [B2B-Funktionen](https://help.cobai.com/customer-documentation/working-version/b2b-funktionen.md)

  * [Auftragsfreigabe](https://help.cobai.com/customer-documentation/working-version/auftragsfreigabe.md)
  * [Kontakte mehrfach zuordnen](https://help.cobai.com/customer-documentation/working-version/kontakte-mehrfach-zuordnen.md)
  * [Kostenstellen](https://help.cobai.com/customer-documentation/working-version/kostenstellen.md)
  * [Kundenindividuelle Artikelnummern](https://help.cobai.com/customer-documentation/working-version/kundenindividuelle-artikelnummern.md)
  * [Sortimente](https://help.cobai.com/customer-documentation/working-version/sortimente.md)
  * [1 more pages](https://help.cobai.com/customer-documentation/working-version/b2b-funktionen.md)
*

  #### [Insights](https://help.cobai.com/customer-documentation/working-version/insights.md)

  * [Offene Warenkörbe](https://help.cobai.com/customer-documentation/working-version/offene-warenkorbe.md)
*

  #### [Preisfindung](https://help.cobai.com/customer-documentation/working-version/preisfindung.md)

  * [Einstellungen zur Preisfindung](https://help.cobai.com/customer-documentation/working-version/einstellungen-zur-preisfindung.md)
  * [Steuerbegünstigter Zweckbetrieb](https://help.cobai.com/customer-documentation/working-version/steuerbegunstigter-zweckbetrieb.md)
*

  #### [Setup](https://help.cobai.com/customer-documentation/working-version/setup.md)

  * [Automatische Adressvervollständigung](https://help.cobai.com/customer-documentation/working-version/automatische-adressvervollstandigung.md)
  * [Anmeldegeheimnis](https://help.cobai.com/customer-documentation/working-version/anmeldegeheimnis.md)
  * [Auftragsübergabe](https://help.cobai.com/customer-documentation/working-version/auftragsubergabe.md)
  * [Cookiebanner](https://help.cobai.com/customer-documentation/working-version/cookiebanner.md)
  * [Eigene Domänen](https://help.cobai.com/customer-documentation/working-version/eigene-domanen.md)
  * [15 more pages](https://help.cobai.com/customer-documentation/working-version/setup.md)
*

  #### [Hinweise für Lieferanten](https://help.cobai.com/customer-documentation/working-version/hinweise-fur-lieferanten.md)

  * [Hinweise für Lieferanten zur Anlage und -änderung von Produkten](https://help.cobai.com/customer-documentation/working-version/hinweise-fur-lieferanten-zur-anlage-und-anderung-von-produkten.md)
  * [Instructions for suppliers on creating and modifying products](https://help.cobai.com/customer-documentation/working-version/instructions-for-suppliers-on-creating-and-modifying-products.md)

---
version: "Working version"
language: "de"
---
# Aktionspreise / Preisaktionen

## Hinweis auf Aktionspreise und Preisaktionen von Distributoren

> Diese Funktion ist nur für Nutzer verfügbar die den ALKA-Katalog einsetzen.

Der Hinweis auf Aktionspreise / Preisaktionen ist ähnlich wie der [Sonderpreishinweis](https://help.cobai.com/customer-documentation/working-version/kundensonderpreise.md), Sie haben aber keinen Pflegeaufwand wenn Sie diese Funktion aktivieren.

Wenn Sie an Preisaktionen des Distributors ALKA teilnehmen, werden Ihre Aktions-Verkaufspreise automatisch im Shop aktualisiert. Wenn Sie zusätzlich die Aktionspreisanzeige einschalten, sehen Ihre Kunden einen Hinweis auf die Preisaktion.

![aktionspreise-1.png](https://help.cobai.com/__attachments/a_b0d5c9a0fb538fc453e9998e7612f36a0591a17001c7b498aa292b9ba865fbf0/aktionspreise-1.png?cb=12736980077b075e5cba2f723e8024f5)

* Der Hinweis wird nicht angezeigt, wenn für den Kunden ebenfalls ein Kundensonderpreis ermittelt wurde und die Anzeige von Kundensonderpreisen aktiv ist. Der Hinweis auf Kundensonderpreise hat Vorrang.

* Damit der „Aktion" Hinweis angezeigt wird, muss für den angezeigten Artikel für mindestens eine Aktion ein Aktionspreis ermittelt worden sein. Das erfolgt nicht, wenn die Bestpreisfindung ausgeschaltet ist und zusätzlich:

  * ein Kunden- oder Materialpreis angelegt wurde oder

  * für den Kunden eine abweichende Preisliste hinterlegt ist.

Der Hinweis wird angezeigt:

* In Suchergebnissen

* Auf der Produktdetailseite

* In Angeboten auf der Startseite und der Angebotsseite

* Im Warenkorb

* In Merklisten

### Aktivierung

Die Funktion ist im Standard ausgeschaltet und muss manuell aktiviert werden

* Global unter "Einstellungen" / "Allgemeine Einstellungen" -\> Preisanzeige -\> "Auf Aktionspreise/Aktionen hinweisen" Ein Haken aktiviert die Funktion global, entfernen des Haken deaktiviert sie global.

![aktionspreise-2.png](https://help.cobai.com/__attachments/a_67fe28f8ef284f442f285b136d7a3fa9b82031eade1a50c61a7401ae08bd97b5/aktionspreise-2.png?cb=44f8479d7dc8970c983c59164946a8b4)

---
version: "Working version"
language: "de"
---
# Anmeldegeheimnis

## Anmeldegeheimnis / Registrieren in geschlossenen Shops

In einem geschlossenen Shop können nur Kunden einkaufen die vom Shopbetreiber angelegt wurden. Mit der Vergabe von Anmeldegeheimnissen können sich Neukunden selbst registrieren, obwohl ein Shop geschlossen ist.

Wer sich in einem geschlossenen Shop selbst registrieren kann steuern Sie über Anmeldegeheimnisse. Ein Neukunde der das Geheimnis kennt kann sich selbst als Kunde registrieren, allen anderen ist es nicht möglich. Sie können entweder ein globales Geheimnis definieren oder Kundengruppen anlegen und Geheimnisse pro Kundengruppe definieren. Ein Neukunde der sich mit einem Kundengruppengeheimnis registriert wird automatisch Mitglied dieser Kundengruppe.

## Globales Registrierungsgeheimnis anlegen

Um ein globales Geheimnis anzulegen

* Melden Sie sich im opCenter an

* Gehen Sie zu "Einstellungen/Allgemein"

* Geben Sie ein Geheimnis in das Feld "Anmeldegeheimnis für geschlossenen Shop" ein

* Setzen Sie einen Haken bei "Registrierung nur mit Geheimnis"

* Speichern Sie

![anmeldegeheimnis-1.png](https://help.cobai.com/__attachments/a_c6c03f569d006e56f7d1f17ea0b74c6562d49f5a503a42819b110ba9b6b781c7/anmeldegeheimnis-1.png?cb=f68d1bee29f1752b005e1174fd7bbc7a)

## Registrierungsgeheimnis für eine Kundengruppe anlegen

Um ein Geheimnis für eine Kundengruppe anzulegen

* Melden Sie sich im opCenter an

* Gehen Sie zu "Einstellungen/Kundengruppen"

* Optional: Legen Sie eine Kundengruppe an

* Klicken Sie auf den Namen einer Kundengruppe

* Geben Sie ein Geheimnis in das Feld "Anmeldegeheimnis" ein

* Klicken Sie auf das Schließfeld der Kundengruppe (rechts oben), eine beliebige Stelle ausserhalb des Eingabefeldes oder drücken Sie die Eingabetaste um Ihre Eingabe zu speichern

Wiederholen Sie diese Schritte für alle Kundengruppen für die Sie ein Geheimnis anlegen möchten. Sie müssen zusätzlich **einmalig** die Verwendung von Geheimnissen aktivieren:

* Gehen Sie zu "Einstellungen/Allgemein"

* Setzen Sie einen Haken bei "Registrierung nur mit Geheimnis"

* Speichern Sie

![anmeldegeheimnis-2.png](https://help.cobai.com/__attachments/a_1587930eb672024eff131ffb88a081dfab144dc21b4d9c26da9db755369e8dda/anmeldegeheimnis-2.png?cb=961e0a8968017185d8c036b32175bfad)  
Abhängig von Ihrem Shopvertrag und dem in Ihrem Shop verwendeten Template sind eventuell weitere Einstellungen durch uns notwendig. Sprechen Sie uns in diesem Fall bitte an.

[Next Page](https://help.cobai.com/llms-full.txt/1)
