openapi: 3.1.0
info:
  title: booklooker REST API
  description: |
    <p>
      Die <strong>Booklooker REST API</strong> ermöglicht die sichere und einfache Kommunikation mit verschiedenen
      Booklooker-Schnittstellen. Es besteht die Möglichkeit, Artikel und Aufträge abzufragen, zu ändern, zu stornieren
      etc. Auch der automatische Import neuer oder geänderter Artikel ist ohne Weiteres möglich.
    </p>
    <p>
      Diese API basiert auf REST. Zur Benutzung führen Sie bitte die folgenden Schritte durch:
    </p>
    <ol>
      <li>
        Sie benötigen Ihren persönlichen <strong>API Key</strong>, diesen erhalten Sie im Bereich
        <a href="https://www.booklooker.de/app/priv/api_key.php">Persönliche Daten</a>
      </li>
      <li>
        Benutzen Sie anschließend die Schnittstelle
        <a href="https://www.booklooker.de/pages/rest_api.php?interface=authenticate">authenticate</a>
        via HTTP&nbsp;POST und Sie erhalten einen <strong>Token</strong>,
        welcher für alle folgenden Aufrufe benötigt wird.
        Sofern Sie 10&nbsp;Minuten keine Schnittstelle aufrufen,
        verfällt der Token und Sie müssen sich erneut authentifizieren.
      </li>
      <li>
        Verwenden Sie eine der unten aufgelisteten Schnittstellen.
        Die Beschreibung jeder Schnittstelle enthält die benötigten Parameter und die möglichen Rückgabewerte.
      </li>
    </ol>
    <p>
      Zur Kommunikation können verschiedene Programmiersprachen zum Einsatz kommen. Wir stellen Ihnen hier ein
      <a href="https://www.booklooker.de/pages/rest_api.php?do=download&filename=booklooker_rest_api.php&path=booklooker_rest_api.php">Beispiel in PHP</a>
      zur Verfügung.
    </p>
    <p>
      Weiterhin bieten wir hier eine <a href="https://www.booklooker.de/download/openapi.yaml">OpenAPI Spezifikation</a> an. 
    </p>
  version: '2.0'
servers:
  - url: 'https://api.booklooker.de/2.0'
tags:
  - name: authentication
  - name: article
  - name: upload
  - name: image
  - name: order
paths:
  /authenticate:
    post:
      tags:
        - authentication
      summary: Authentifizierung via API Key
      description: |
        Authentifizierung via API Key. Ihren persönlichen API Key erhalten Sie
        <a href="https://www.booklooker.de/app/priv/api_key.php">hier</a>.
      parameters:
        - name: apiKey
          description: Ihr persönlicher API Key
          in: query
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Der Token, welcher für alle weiteren Aufrufe benötigt wird.
                  value:
                    status: OK
                    returnValue: REST_API_TOKEN
                API_KEY_MISSING:
                  description: Der API Key ist leer oder nicht vorhanden.
                  value:
                    status: NOK
                    returnValue: API_KEY_MISSING
                AUTHENTICATION_FAILED:
                  description: Der API Key ist nicht bekannt.
                  value:
                    status: NOK
                    returnValue: AUTHENTICATION_FAILED
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
  /account:
    get:
      tags:
        - authentication
      summary: Abfragen des Anbieterkontos und seiner Verkaufsbereitschaft
      description: |
        <p>
          Liefert das Anbieterkonto, zu dem der Token gehört, und gibt an, ob dieses Konto Angebote der
          angegebenen Medienart einstellen kann. So lässt sich vor einem Datei-Upload prüfen, ob alle
          Voraussetzungen erfüllt sind.
        </p>
        <p>
          Geprüft wird dasselbe wie beim Einstellen von Angeboten auf der Website: Verifizierung des Kontos,
          steuerliche Angaben, Verkaufssperre, Versandkosten für die Medienart und angebotene Zahlungsarten.
        </p>
      security:
        - tokenAuth: [ ]
      parameters:
        - name: mediaType
          description: |
            Medientyp, für den die Versandkosten geprüft werden, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Bücher</li>
              <li>1 &middot; Filme</li>
              <li>2 &middot; Musik</li>
              <li>3 &middot; Hörbücher</li>
              <li>4 &middot; Spiele</li>
            </ul>
          in: query
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 4
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: object
              examples:
                SUCCESS:
                  description: |
                    <p>Die Rückgabe ist ein Objekt mit diesen Elementen:</p>
                    <table class="table-padding-5 grid">
                      <tr>
                        <th>Element</th>
                        <th>Bedeutung</th>
                      </tr>
                      <tr>
                        <td>sellerId</td>
                        <td>Interne ID des Anbieters</td>
                      </tr>
                      <tr>
                        <td>username</td>
                        <td>Benutzername des Anbieters (Login-Name)</td>
                      </tr>
                      <tr>
                        <td>readyToSell</td>
                        <td>
                          <q>true</q>, wenn das Konto Angebote der angegebenen Medienart einstellen kann,
                          sonst <q>false</q>
                        </td>
                      </tr>
                      <tr>
                        <td>missing</td>
                        <td>
                          Liste der Gründe, die dem Einstellen entgegenstehen; leer, wenn <q>readyToSell</q>
                          <q>true</q> ist. Mögliche Einträge:
                          <ul class="default-list">
                            <li>ACCOUNT_NOT_VERIFIED &middot; Das Konto muss noch verifiziert werden.</li>
                            <li>TAX_DATA_MISSING &middot; Die erforderlichen steuerlichen Angaben fehlen.</li>
                            <li>SELLING_BLOCKED &middot; Das Konto darf derzeit keine Artikel anbieten.</li>
                            <li>SHIPPING_COSTS_MISSING &middot; Für die Medienart sind keine Versandkosten hinterlegt.</li>
                            <li>PAYMENT_METHODS_MISSING &middot; Es sind keine angebotenen Zahlungsarten hinterlegt.</li>
                          </ul>
                        </td>
                      </tr>
                    </table>
                  value:
                    status: OK
                    returnValue: ""
                INVALID_PARAMETERS:
                  description: Der Parameter <q>mediaType</q> wurde mit einem falschen Wert übergeben.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /article:
    delete:
      tags:
        - article
      summary: Einzelnen Artikel zum Löschen vormerken
      description: Einzelnen Artikel zum Löschen vormerken. Der Artikel wird innerhalb der nächsten 2 Stunden gelöscht.
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderNoParam'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Der Artikel wurde erfolgreich für den Löschvorgang vorgemerkt.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  $ref: '#/components/responses/INVALID_PARAMETER_ORDERNO'
                NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERNO'
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /article_list:
    get:
      tags:
        - article
      summary: Liste aller eigenen aktiven Artikelnummern
      description: |
        Liste aller eigenen aktiven Artikelnummern.
        <p>
          <strong>Bitte beachten:</strong> Wird ein Artikel gelöscht, so wird dieser nicht sofort aus den aktuell
          angebotenen Artikel gelöscht, sondern mit einer Verzögerung von im Schnitt 1-2 Stunden.
          Um den aktuellen Status eines Artikels zu ermitteln, benutzen Sie bitte die Schnittstelle
          <a href="https://www.booklooker.de/pages/rest_api.php?interface=article_status">article_status</a>.
        </p>
      security:
        - tokenAuth: [ ]
      parameters:
        - name: field
          description: |
            Rückgabefeld, mögliche Werte:
            <ul class="default-list">
              <li>orderNo &middot; Bestellnummer</li>
              <li>isbn &middot; ISBN</li>
              <li>ean &middot; EAN</li>
            </ul>
          in: query
          schema:
            type: string
            default: orderNo
            enum:
              - orderNo
              - isbn
              - ean
        - name: showPrice
          description: |
            Übermittlung des Preises, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; nein</li>
              <li>1 &middot; ja</li>
            </ul>
            <p>
              Wird der Parameter <q>showPrice</q> mit dem Wert <q>1</q> übergeben,
              so werden die Artikelpreise TAB-getrennt zurückgegeben.
            </p>
          in: query
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1
        - name: showStock
          description: |
            Übermittlung des Bestands, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; nein</li>
              <li>1 &middot; ja</li>
            </ul>
            <p>
              Wird der Parameter <q>showStock</q> mit dem Wert <q>1</q> übergeben,
              so werden ausschließlich die Bestellnummern und Bestandsangaben der Artikel zurückgegeben,
              die einen Bestand >=1 besitzen.
              Alle übrigen Parameter (field, showPrice, mediaType) werden in diesem Fall ignoriert.
            </p>
          in: query
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1
        - name: mediaType
          description: |
            Einschränkung nach Medientyp, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Bücher</li>
              <li>1 &middot; Filme</li>
              <li>2 &middot; Musik</li>
              <li>3 &middot; Hörbücher</li>
              <li>4 &middot; Spiele</li>
            </ul>
          in: query
          schema:
            type: integer
            minimum: 0
            maximum: 4
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: |
                    Eine Liste der Artikelnummern (bzw. ISBN/EAN) aller vom Anbieter aktuell angebotenen Artikel,
                    getrennt mit einem einfachen Zeilenumbruch (\n).
                  value:
                    status: OK
                    returnValue: ""
                INVALID_PARAMETERS:
                  description: |
                    Einer der Parameter <q>field</q> oder <q>mediaType</q> wurde mit einem falschen Wert übergeben.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                PARAMETER_MISMATCH:
                  description: |
                    Der Parameter <q>field</q> mit Wert <q>isbn</q> oder <q>ean</q> kann nur verwendet werden,
                    wenn der Parameter <q>mediaType</q> vorhanden ist.
                  value:
                    status: NOK
                    returnValue: PARAMETER_MISMATCH
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /article_status:
    get:
      tags:
        - article
      summary: Abfragen des Status eines Artikels
      description: Abfragen des Status eines Artikels
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderNoParam'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SOLD:
                  description: Der Artikel wurde verkauft und steht nicht mehr zum Verkauf.
                  value:
                    status: OK
                    returnValue: SOLD
                DELETED:
                  description: Der Artikel wurde gelöscht, ist aber noch in der Datenbank.
                  value:
                    status: OK
                    returnValue: DELETED
                ACTIVE:
                  description: Der Artikel steht zum Verkauf.
                  value:
                    status: OK
                    returnValue: ACTIVE
                INVALID_PARAMETERS:
                  $ref: '#/components/responses/INVALID_PARAMETER_ORDERNO'
                NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERNO'
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /search:
    get:
      tags:
        - article
      summary: Suche in der booklooker-Datenbank
      description: Suche in der booklooker-Datenbank
      security:
        - tokenAuth: [ ]
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: |
                    Es wird eine selbsterklärende Liste mit den gefundenen Artikeln zurückgeliefert.
                  value:
                    status: OK
                    returnValue: ""
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /file_import:
    post:
      tags:
        - upload
      summary: Upload von Angebots- oder Bilddateien
      description: Upload von Angebots- oder Bilddateien
      security:
        - tokenAuth: [ ]
      requestBody:
        required: true
        description: |
          <p>
            Die hochzuladende Datei, übergeben als <q>multipart/form-data</q> im Feld <q>file</q>.
            Der Dateiname muss für Angebotsdateien auf <q>.zip</q>, <q>.txt</q>, <q>.tab</q>, <q>.csv</q>
            oder <q>.xls</q> enden, für Bilddateien auf <q>.zip</q>.
          </p>
          <p>
            Ihre Angebotsdatei können Sie entweder als Textdatei oder als komprimiertes ZIP-Archiv übergeben.
            Standardmäßig müssen die Textdateien in der Kodierung <q>ISO 8859-1</q> vorliegen.
            Wenn Ihre Daten in einer anderen Kodierung, bspw. <q>UTF-8</q> vorliegen,
            verwenden Sie bitte den Parameter <q>encoding</q>.
          </p>
          <p>
            Bilddateien müssen als ZIP-Archiv übergeben werden.
            Weitere Hinweise finden Sie auf der Seite zum
            <a href="https://www.booklooker.de/app/priv/upload/upload_pic.php">manuellen Hochladen</a>.
            Die hochgeladenen Dateien werden in der Reihenfolge des Uploads verarbeitet.
          </p>
          <p>
            Maximale Dateigröße: 80 MB.
          </p>
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
      parameters:
        - name: fileType
          description: |
            Dateityp, mögliche Werte:
            <ul class="default-list">
              <li>pic &middot; Bilddatei</li>
              <li>article &middot; Angebotsdatei</li>
            </ul>
          in: query
          schema:
            type: string
            default: article
            enum:
              - pic
              - article
        - name: dataType
          description: |
            Art des Uploads, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Hinzufügen/ändern/Löschen</li>
              <li>1 &middot; Ersetzen</li>
              <li>2 &middot; Löschen</li>
            </ul>
          in: query
          required: true
          schema:
            type: integer
            minimum: 0
            maximum: 2
        - name: mediaType
          description: |
            Medientyp, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Bücher</li>
              <li>1 &middot; Filme</li>
              <li>2 &middot; Musik</li>
              <li>3 &middot; Hörbücher</li>
              <li>4 &middot; Spiele</li>
            </ul>
          in: query
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 4
        - name: formatID
          description: |
            Interne ID des Formats, legt Feldreihenfolge und Texttrenner fest.
            Für das booklooker-Format verwenden Sie bitte den Wert <q>1</q>,
            für mehr Informationen wenden Sie sich bitte an daten@booklooker.de.
            Ohne Angabe wird das Format des letzten Uploads verwendet.
          in: query
          schema:
            type: integer
        - name: encoding
          description: |
            Character Encoding der Datei, mögliche Werte:
            <ul class="default-list">
              <li>IBMPC/CR (= CP-437)</li>
              <li>macintosh (= Mac OS Roman)</li>
              <li>UTF-8</li>
            </ul>
          in: query
          schema:
            type: string
            default: Es wird das Encoding des letzten Uploads verwendet, beim Erst-Upload CP-1252.
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Upload erfolgreich.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  description: |
                    Einer der Parameter <q>fileType</q>, <q>dataType</q> oder <q>mediaType</q>
                    wurde nicht oder mit einem falschen Wert übergeben.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                FORMAT_ID_MISMATCH:
                  description: |
                    Die Kombination der Werte der Parameter <q>formatID</q> und <q>mediaType</q>
                    kann nicht verarbeitet werden.
                  value:
                    status: NOK
                    returnValue: FORMAT_ID_MISMATCH
                FILE_MISSING:
                  description: Es wurde keine Datei übertragen.
                  value:
                    status: NOK
                    returnValue: FILE_MISSING
                MAX_SIZE_EXCEEDED:
                  description: Die maximal erlaubte Dateigröße wurde überschritten.
                  value:
                    status: NOK
                    returnValue: MAX_SIZE_EXCEEDED
                INVALID_FILE_TYPE:
                  description: Falscher Dateityp.
                  value:
                    status: NOK
                    returnValue: INVALID_FILE_TYPE
                UPLOAD_FAILED:
                  description: Der Upload der Datei ist fehlgeschlagen.
                  value:
                    status: NOK
                    returnValue: UPLOAD_FAILED
                REPLACE_AMOUNT_EXCEEDED:
                  description: |
                    Uploads im Ersetzen-Modus sind bei einem Angebotsbestand
                    > 1.000.000 Artikel nur in Absprache möglich. Bitte wenden Sie sich an daten@booklooker.de
                  value:
                    status: NOK
                    returnValue: REPLACE_AMOUNT_EXCEEDED
                IDENTICAL_FILE_UPLOADED:
                  description: Die Datei ist bereits im System vorhanden.
                  value:
                    status: NOK
                    returnValue: IDENTICAL_FILE_UPLOADED
                QUEUE_FULL:
                  description: |
                    Die Warteschlange der hochgeladenen Dateien ist voll
                    – entweder mehr als 200 Dateien oder mehr als 250 MB.
                  value:
                    status: NOK
                    returnValue: QUEUE_FULL
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /file_status:
    get:
      tags:
        - upload
      summary: Abfragen des Status einer hochgeladenen Angebotsdatei
      description: Abfragen des Status einer hochgeladenen Angebotsdatei
      security:
        - tokenAuth: [ ]
      parameters:
        - name: filename
          description: |
            Name der hochgeladenen Datei.
            <p>
              Existieren mehrere hochgeladene Dateien mit diesem Namen,
              bezieht sich der zurückgegebene Wert auf die zuletzt hochgeladene Datei.
            </p>
          in: query
          required: true
          schema:
            type: string
        - name: showErrors
          description: |
            Der Rückgabewert ist eine Liste von Fehlern, die beim Import der Datei identifiziert wurden.
            
            <p>Mögliche Werte:</p>
            
            <ul class="default-list">
              <li>0 &middot; nur der Status wird zurückgeliefert</li>
              <li>1 &middot; Liste von Fehlern, siehe <q>Rückgabe</q></li>
            </ul>
            
            <p>
              <strong>Achtung:</strong> Die Liste der Fehler kann nur für komplett verarbeitete Dateien abgefragt werden!
            </p>
          in: query
          required: false
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                FILE_RECEIVED:
                  description: Die Datei wurde vollständig hochgeladen, aber noch nicht verarbeitet.
                  value:
                    status: OK
                    returnValue: FILE_RECEIVED
                UPLOAD_IN_PROGRESS:
                  description: Die Datei befindet sich aktuell in Verarbeitung.
                  value:
                    status: OK
                    returnValue: UPLOAD_IN_PROGRESS
                UPLOAD_DONE:
                  description: Die Datei komplett verarbeitet.
                  value:
                    status: OK
                    returnValue: UPLOAD_DONE
                SHOW_ERRORS:
                  description: |
                    <p>
                      Sofern der Parameter <q>showErrors</q> mit dem Wert <q>1</q> übergeben wurde, ist die Rückgabe
                      eine Liste von Fehlern, welche je Zeile einen Artikel mit diesen Werten enthält:
                    </p>

                    <table class="table-padding-5 grid">
                      <tr><th>Spalte</th><th>Beschreibung</th></tr>
                      <tr><td>errorID</td><td>ID des Fehlers (siehe unten)</td></tr>
                      <tr><td>record</td><td>Datensatz</td></tr>
                      <tr><td>orderNo</td><td>Bestellnummer</td></tr>
                      <tr><td>title</td><td>Titel (sofern vorhanden)</td></tr>
                      <tr><td>details</td><td>weitere Informationen, warum der Artikel abgelehnt wurde (sofern vorhanden)</td></tr>
                    </table>
                    
                    <p>
                      <q>errorID</q> kann folgende Werte annehmen:</q>
                    </p>

                    <table class="table-padding-5 grid">
                      <tr><th>errorID</th><th>Beschreibung</th></tr>
                      <tr><td>1</td><td>Mehrfach vergebene Bestellnummer</td></tr>
                      <tr><td>2</td><td>Mehrfach vorhandene identische Angebote (Dubletten)</td></tr>
                      <tr><td>3</td><td>(wird nicht mehr verwendet)</td></tr>
                      <tr><td>4</td><td>Neubücher in privatem Account</td></tr>
                      <tr><td>5</td><td>Fehlende Formatangabe (z. B. CD, DVD, LP etc.)</td></tr>
                      <tr><td>6</td><td>Hörbuch in Bücherdatei</td></tr>
                      <tr><td>7</td><td>Fehlende oder ungültige FSK-Angabe</td></tr>
                      <tr><td>8</td><td>Nicht unterstützter Artikeltyp</td></tr>
                      <tr><td>9</td><td>(wird nicht mehr verwendet)</td></tr>
                      <tr><td>10</td><td>Das Feld <q>Titel</q> ist leer</td></tr>
                      <tr><td>11</td><td>Das Feld <q>Preis</q> oder <q>Währung</q> ist leer oder wurde nicht gefunden</td></tr>
                      <tr><td>12</td><td>Preis von Neubuch weicht ab vom gebundenen Preis</td></tr>
                      <tr><td>13</td><td>Grenze von 5000 VLB-Artikel überschritten, gesamte Datei wird nicht verarbeitet</td></tr>
                      <tr><td>14</td><td>E-Books sind nicht erlaubt</td></tr>
                      <tr><td>15</td><td>Keine Daten zur ISBN vorhanden</td></tr>
                      <tr><td>16</td><td>FSK 18</td></tr>
                      <tr><td>17</td><td>Maximale Artikelanzahl überschritten</td></tr>
                      <tr><td>18</td><td>Erscheinungsdatum liegt in der Zukunft</td></tr>
                      <tr><td>19</td><td>Preisangaben von 100.000 EUR und darüber werden nicht unterstützt</td></tr>
                      <tr><td>20</td><td>Unerwünschter Verlag</td></tr>
                      <tr><td>21</td><td>Nicht-westeuropäisches Zeichen in Bestellnummer</td></tr>
                    </table>
                  value:
                    status: OK
                    returnValue: ""
                INVALID_PARAMETERS:
                  description: Der Parameter <q>filename</q> ist leer oder nicht vorhanden.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                FILE_NOT_FOUND:
                  description: Die Datei wurde nicht gefunden.
                  value:
                    status: NOK
                    returnValue: FILE_NOT_FOUND
                UPLOAD_FAILED:
                  description: Datei konnte nicht eingelesen werden (es wurde kein gültiger Datensatz gefunden).
                  value:
                    status: NOK
                    returnValue: UPLOAD_FAILED
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /image:
    delete:
      tags:
        - image
      summary: Einzelne oder alle Bilder eines Artikels löschen
      description: Einzelne oder alle Bilder eines Artikels löschen
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderNoParam'
        - name: position
          description: |
            <p>
              Position des Bildes, falls nicht vorhanden werden alle (!) Bilder des Artikels gelöscht.
            </p>
            <p>
              <strong>Achtung:</strong> Beim Löschen mehrerer (aber nicht aller) Bilder eines Artikels muss
              berücksichtigt werden, dass sich beim Aufruf dieser Schnittstelle die Position der nachfolgenden Bilder
              ändert: Wenn ein Artikel z.B. 5 Bilder hat und das Bild an Position <q>2</q> gelöscht wird,
              ändert sich die Position der Bilder 3, 4, 5 in 2, 3, 4.
            </p>
          in: query
          schema:
            type: integer
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Das Bild wurde bzw. die Bilder wurden erfolgreich gelöscht.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  $ref: '#/components/responses/INVALID_PARAMETER_ORDERNO'
                ARTICLE_NOT_FOUND:
                  description: Die Bestellnummer wurde nicht gefunden.
                  value:
                    status: NOK
                    returnValue: ARTICLE_NOT_FOUND
                IMAGE_NOT_FOUND:
                  description: Das Bild wurde nicht gefunden.
                  value:
                    status: NOK
                    returnValue: IMAGE_NOT_FOUND
                IMAGE_NOT_DELETED:
                  description: Das Bild konnte nicht gelöscht werden.
                  value:
                    status: NOK
                    returnValue: IMAGE_NOT_DELETED
                IMAGES_NOT_DELETED:
                  description: Die Bilder konnten nicht gelöscht werden.
                  value:
                    status: NOK
                    returnValue: IMAGES_NOT_DELETED
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /import_status:
    get:
      tags:
        - upload
      summary: Abfragen der Anzahl unverarbeiteter hochgeladener Angebotsdateien
      description: Abfragen der Anzahl unverarbeiteter hochgeladener Angebotsdateien
      security:
        - tokenAuth: [ ]
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Anzahl der aktuell unverarbeiteten Dateien
                  value:
                    status: OK
                    returnValue: ""
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order:
    get:
      tags:
        - order
      summary: Download aller Bestellungen eines bestimmten Tages
      description: Download aller Bestellungen eines bestimmten Tages bzw. Zeitintervalls
      security:
        - tokenAuth: [ ]
      parameters:
        - name: orderId
          description: |
            Interne booklooker <q>orderId</q> der Bestellung, wird von der Schnittstelle
            <a href="https://www.booklooker.de/pages/rest_api.php?interface=order">order</a> zurückgeliefert.
          in: query
          required: true
          schema:
            type: integer
        - name: date
          description: |
            Datum, zu dem Bestellungen angefordert werden, im Format YYYY-MM-DD.
            Wenn übergeben, hat dieser Parameter Vorrang vor <q>dateFrom</q> und <q>dateTo</q>
          in: query
          required: false
          schema:
            type: string
        - name: dateFrom
          description: Startdatum, zu dem Bestellungen angefordert werden, im Format YYYY-MM-DD
          in: query
          required: false
          schema:
            type: string
        - name: dateTo
          description: Enddatum, zu dem Bestellungen angefordert werden, im Format YYYY-MM-DD
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: |
                    <p>Alle Bestellungen des angeforderten Tages bzw. Zeitintervalls.</p>
                    <p>
                      <strong>fett</strong> &middot; Das Element ist immer vorhanden.<br>
                      normal &middot; Das Element ist nur dann vorhanden, wenn ein Wert existiert.
                    </p>
                    
                    <table class="table-padding-5 grid">
                      <tr>
                        <th>Element</th>
                        <th>Bedeutung</th>
                      </tr>
                      <tr>
                        <td><strong>orderId</strong></td>
                        <td>Interne Booklooker <q>orderId</q> der Bestellung</td>
                      </tr>
                      <tr>
                        <td>
                          <strong>orderDate</strong><br>
                          <strong>orderTime</strong>
                        </td>
                        <td>Datum und Uhrzeit der Bestellung</td>
                      </tr>
                      <tr>
                        <td>
                          accountHolder<br>
                          accountIban<br>
                          accountBic
                        </td>
                        <td>
                          Falls der Besteller als Zahlungsart Lastschrift gewählt hat und eine Bankverbindung
                          angegeben hat, stehen in diesen Feldern die Kontodaten: Kontoinhaber, IBAN und BIC.
                        </td>
                      </tr>
                      <tr>
                        <td><strong>buyerPositiveRatingPercentage</strong></td>
                        <td>
                          Prozentzahl der positiven Bewertungen des Käufers
                          (0.0 - falls der Käufer noch keine Bewertung erhalten hat)
                        </td>
                      </tr>
                      <tr>
                        <td><strong>buyerTotalRatingNumber</strong></td>
                        <td>Anzahl der erhaltenen Bewertungen des Käufers</td>
                      </tr>
                      <tr>
                        <td><strong>buyerUsername</strong></td>
                        <td>Benutzername des Käufers, bei Händlern der Firmenname</td>
                      </tr>
                      <tr>
                        <td>calculatedShippingCost</td>
                        <td>
                          Dieses Element wird nur übergeben, wenn die Versandkosten berechnet werden konnten,
                          bspw. bei vorhandener Gewichtsangabe und Nutzung der Gewichts-Staffel-Tabelle zur
                          Portoberechnung, oder bei Nutzung von Pauschalpreisen
                        </td>
                      </tr>
                      <tr>
                        <td>comments</td>
                        <td>Freitextfeld, in das Kunden bei Bestellung spezielle Wünsche eintragen können</td>
                      </tr>
                      <tr>
                        <td><strong>currentProvisionNet</strong></td>
                        <td>
                          Aktuelle Provision ohne MwSt. unter Berücksichtigung von Stornierungen - siehe auch
                          <q>originalProvisionNet</q>
                        </td>
                      </tr>
                      <tr>
                        <td><strong>email</strong></td>
                        <td>E-Mail-Adresse des Käufers</td>
                      </tr>
                      <tr>
                        <td><strong>originalProvisionNet</strong></td>
                        <td>
                          Ursprüngliche Provision ohne MwSt. ohne Berücksichtigung von Stornierungen - siehe auch 
                          <q>currentProvisionNet</q>.
                        </td>
                      </tr>
                      <tr>
                        <td>
                          paymentConfirmed<br>
                          transactionId
                        </td>
                        <td>
                          Aktuell nur für Zahlungsart PayPal bzw. PayPal REST API: Falls uns der Zeitpunkt der
                          erfolgreichen Bezahlung vom Zahlungsdienstleister gemeldet wurde, steht hier der Zeitpunkt im
                          Format YYYY-MM-DD HH:MM:SS. Weiterhin die von PayPal übermittelte <q>txn_id</q> bzw.
                          Capture-ID der zugehörigen Bezahlung.
                        </td>
                      </tr>
                      <tr>
                        <td>paymentId</td>
                        <td>
                        Die vom Besteller gewählte Zahlungsart. Folgende Werte sind möglich:
                        <ul class="default-list">
                          <li>1 &middot; Banküberweisung (Vorkasse)</li>
                          <li>2 &middot; Offene Rechnung</li>
                          <li>11 &middot; Offene Rechnung (Vorkasse vorbehalten)</li>
                          <li>3 &middot; Lastschrift (Vorkasse)</li>
                          <li>4 &middot; Kreditkarte (Vorkasse)</li>
                          <li>5 &middot; Nachnahme</li>
                          <li>6 &middot; PayPal (Vorkasse)</li>
                          <li>8 &middot; Skrill (Vorkasse)</li>
                          <li>9 &middot; Selbstabholung und Barzahlung</li>
                          <li>12 &middot; PayPal REST API (Vorkasse)</li>
                        </ul>
                        </td>
                      </tr>
                      <tr>
                        <td><strong>status</strong></td>
                        <td>
                          Mögliche Rückgabewerte siehe
                          <a href="https://www.booklooker.de/pages/rest_api.php?interface=order_status">order_status</a> 
                        </td>
                      </tr>
                      <tr>
                        <td>tel</td>
                        <td>Telefonnummer des Käufers</td>
                      </tr>
                      <tr>
                        <td>ustIdNr</td>
                        <td>Umsatzsteuer-Identifikationsnummer des Käufers</td>
                      </tr>
                      <tr>
                        <td>
                          <strong>invoiceAddress</strong><br>
                          deliveryAddress
                        </td>
                        <td>
                          Rechnungs- und ggf. Lieferanschrift
                          <table class="table-padding-5 grid">
                            <tr><td><strong>title</strong></td><td>Anrede</td></tr>
                            <tr><td><strong>name</strong></td><td>Nachname</td></tr>
                            <tr><td><strong>firstName</strong></td><td>Vorname</td></tr>
                            <tr><td>company</td><td>Firma</td></tr>
                            <tr><td>addressSupplement</td><td>Zusatz</td></tr>
                            <tr><td><strong>street</strong></td><td>Straße und Hausnummer</td></tr>
                            <tr><td><strong>zip</strong></td><td>PLZ</td></tr>
                            <tr><td><strong>city</strong></td><td>Ort</td></tr>
                            <tr><td><strong>country</strong></td><td>Land</td></tr>
                          </table>
                        </td>
                      </tr>
                      <tr>
                        <td><strong>orderItems</strong></td>
                        <td>
                          <table class="table-padding-5 grid">
                            <tr>
                              <td><strong>amount</strong></td>
                              <td>Bestellmenge</td>
                            </tr>
                            <tr>
                              <td><strong>author</strong></td>
                              <td>
                                Geistiger Schöpfer des Artikels, abhängig vom <q>mediaType</q> (s.u.):
                                <ul class="default-list">
                                  <li>Buch &middot; Autor/in</li>
                                  <li>Hörbuch &middot; Autor/in</li>
                                  <li>Film &middot; Regisseur/in</li>
                                  <li>Tonträger &middot; Interpret/in</li>
                                  <li>Spiel &middot; Autor/in</li>
                                </ul>
                              </td>
                            </tr>
                            <tr>
                              <td>infotext</td>
                              <td>
                                Beschreibungstext des Artikels (diese Option muss von unserem Kundendienst aktiviert
                                werden, bitte schreiben Sie bei Bedarf eine E-Mail an support@booklooker.de
                              </td>
                            </tr>
                            <tr>
                              <td><strong>mediaType</strong></td>
                              <td>
                                <ul class="default-list">
                                  <li>0 &middot; Buch</li>
                                  <li>3 &middot; Hörbuch</li>
                                  <li>1 &middot; Film</li>
                                  <li>2 &middot; Tonträger</li>
                                  <li>4 &middot; Spiel</li>
                                </ul>
                              </td>
                            </tr>
                            <tr>
                              <td>note</td>
                              <td>Persönliche Notiz/Lagerort (nur wenn vorhanden)</td>
                            </tr>
                            <tr>
                              <td><strong>orderItemId</strong></td>
                              <td>
                                Interne booklooker <q>orderItemId</q> des Artikels, wichtig bei Nutzung der Schnittstelle
                                <a href="https://www.booklooker.de/pages/rest_api.php?interface=order_item_cancel">order_item_cancel</a>
                              </td>
                            </tr>
                            <tr>
                              <td><strong>orderNo</strong></td>
                              <td>Ihre Bestellnummer</td>
                            </tr>
                            <tr>
                              <td><strong>orderTitle</strong></td>
                              <td>Titel des Artikels</td>
                            </tr>
                            <tr>
                              <td><strong>singlePrice</td>
                              <td>Preis des einzelnen Bestellpostens (unabhängig von Amount)</td>
                            </tr>
                            <tr>
                              <td><strong>status</strong></td>
                              <td>
                                <ul class="default-list">
                                  <li>Ordered</li>
                                  <li>Canceled</li>
                                </ul>
                              </td>
                            </tr>
                            <tr>
                              <td><strong>totalPriceRebated</strong></td>
                              <td>Gesamtpreis des Bestellpostens abzgl. evtl. Rabatte</td>
                            </tr>
                          </table>
                        </td>
                      </tr>
                    </table>
                  value:
                    status: OK
                    returnValue: ""
                INVALID_ORDERID:
                  description: Der Parameter <q>orderId</q> hat ein falsches Format.
                  value:
                    status: NOK
                    returnValue: INVALID_ORDERID
                INVALID_DATE:
                  description: Der Parameter <q>date</q> hat ein falsches Datumsformat.
                  value:
                    status: NOK
                    returnValue: INVALID_DATE
                INVALID_DATE_FROM:
                  description: Der Parameter <q>dateFrom</q> hat ein falsches Datumsformat.
                  value:
                    status: NOK
                    returnValue: INVALID_DATE_FROM
                INVALID_DATE_TO:
                  description: Der Parameter <q>dateTo</q> hat ein falsches Datumsformat.
                  value:
                    status: NOK
                    returnValue: INVALID_DATE_TO
                INVALID_DATE_INTERVAL:
                  description: Das maximal erlaubte Intervall beträgt 1 Monat.
                  value:
                    status: NOK
                    returnValue: INVALID_DATE_INTERVAL
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order_cancel:
    put:
      tags:
        - order
      summary: Stornieren einer kompletten Bestellung
      description: Stornieren einer kompletten Bestellung
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderIdParam'
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Die Bestellung wurde erfolgreich storniert.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  description: Der Parameter <q>orderId</q> ist leer oder nicht vorhanden.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERID'
                NO_ARTICLES_FOUND:
                  description: Es wurden keine zu stornierenden Artikel gefunden.
                  value:
                    status: NOK
                    returnValue: NO_ARTICLES_FOUND
                SIX_WEEKS_EXCEEDED:
                  $ref: '#/components/responses/SIX_WEEKS_EXCEEDED'
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order_item_cancel:
    put:
      tags:
        - order
      summary: Stornieren der Bestellung eines Einzelartikels
      description: Stornieren der Bestellung eines Einzelartikels
      security:
        - tokenAuth: [ ]
      parameters:
        - name: orderItemId
          description: |
            Interne booklooker "orderItemId" des Artikels, wird von der Schnittstelle
            <a href="https://www.booklooker.de/pages/rest_api.php?interface=order">order</a> zurückgeliefert.
          in: query
          required: true
          schema:
            type: integer
        - name: mediaType
          description: |
            Medientyp, mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Bücher</li>
              <li>1 &middot; Filme</li>
              <li>2 &middot; Musik</li>
              <li>3 &middot; Hörbücher</li>
              <li>4 &middot; Spiele</li>
            </ul>
          in: query
          required: true
          schema:
            type: integer
            minimum: 0
            maximum: 4
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Die Artikel wurde erfolgreich storniert.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  description: |
                    Einer der Parameter <q>orderItemId</q> oder <q>mediaType</q> ist leer oder nicht vorhanden.
                    Auch ein falscher Wert für den Parameter <q>mediaType</q> erzeugt diesen Fehler.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                NOT_FOUND:
                  description: |
                    Die <q>orderItemId</q> wurde nicht gefunden.
                    Bitte achten Sie darauf, ausschließlich die <q>orderItemId</q> zu verwenden,
                    die Sie über die Schnittstelle
                    <a href="https://www.booklooker.de/pages/rest_api.php?interface=order">order</a> ausgelesen haben.
                  value:
                    status: NOK
                    returnValue: NOT_FOUND
                SIX_WEEKS_EXCEEDED:
                  $ref: '#/components/responses/SIX_WEEKS_EXCEEDED'
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order_message:
    put:
      tags:
        - order
      summary: Versand einer Nachricht an den Kunden
      description: Versand einer Nachricht an den Kunden
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderIdParam'
        - name: messageType
          description: |
            <p>Art der Nachricht, mögliche Werte</p>
            <table class="table-padding-5 grid">
              <tr><th>Wert</th><th>Beschreibung</th></tr>
              <tr><td>PAYMENT_INFORMATION</td><td>Zahlungsinformationen senden</td></tr>
              <tr><td>PAYMENT_REMINDER</td><td>Zahlungserinnerung senden</td></tr>
              <tr><td>SHIPPING_NOTICE</td><td>Versandmitteilung senden</td></tr>
            </table>
          in: query
          required: true
          schema:
            type: string
            enum:
              - PAYMENT_INFORMATION
              - PAYMENT_REMINDER
              - SHIPPING_NOTICE
        - name: additionalText
          description: Zusätzlicher Text, der in die Nachricht aufgenommen wird
          in: query
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Zurückgegeben wird der Nachrichtentext, der an den Kunden per Mail versandt wurde.
                  value:
                    status: OK
                    returnValue: ""
                INVALID_ORDERID:
                  description: Der Parameter <q>orderId</q> fehlt oder ist nicht korrekt angegeben.
                  value:
                    status: NOK
                    returnValue: INVALID_ORDERID
                INVALID_MESSAGE_TYPE:
                  description: Der Parameter <q>messageType</q> fehlt oder ist nicht korrekt angegeben.
                  value:
                    status: NOK
                    returnValue: INVALID_MESSAGE_TYPE
                ORDER_NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERID'
                NO_RECIPIENT:
                  description: Es ist kein Handelspartner für diesen Verkauf eingetragen.
                  value:
                    status: NOK
                    returnValue: NO_RECIPIENT
                NO_ARTICLES:
                  description: Alle im Verkauf enthaltenen Artikel sind storniert.
                  value:
                    status: NOK
                    returnValue: NO_ARTICLES
                ALREADY_SENT:
                  description: Die Nachricht dieses Typs wurde bereits versandt (nur bei Versandmitteilungen).
                  value:
                    status: NOK
                    returnValue: ALREADY_SENT
                TIME_RESTRICTION:
                  description: |
                    Zeitliche Beschränkungen verhindern den Versand der Nachricht. Es gelten folgende Regeln:
                    <ul class="default-list">
                      <li>Zahlungsinformationen können nur alle 7 Tage verschickt werden.</li>
                      <li>Zahlungserinnerungen können nur alle 7 Tage verschickt werden.</li>
                      <li>Eine Zahlungserinnerung kann frühestens am 7. Tag nach der Bestellung verschickt werden.</li>
                    </ul>
                  value:
                    status: NOK
                    returnValue: TIME_RESTRICTION
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order_rating:
    put:
      tags:
        - order
      summary: Abgabe einer Bewertung für eine Bestellung
      description: Gibt eine Bewertung (Anzahl der Sterne) und optional einen Kommentar für eine Bestellung ab.
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderIdParam'
        - name: rating
          description: |
            <p>Anzahl der Sterne, mögliche Werte</p>
            <ul class="default-list">
              <li>4 &middot; Perfekt</li>
              <li>3 &middot; Alles O.K.</li>
              <li>2 &middot; Problematische Angelegenheit</li>
              <li>1 &middot; Nie wieder</li>
            </ul>
          in: query
          required: true
          schema:
            type: integer
            enum:
              - 1
              - 2
              - 3
              - 4
        - name: comment
          description: Kommentar zur Bewertung, bei negativen Bewertungen (1 oder 2 Sterne) verpflichtend (mindestens 15 Buchstaben).
          in: query
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Die Bewertung wurde gespeichert.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  description: |
                    Einer der Parameter <q>orderId</q> oder <q>rating</q> ist leer oder nicht vorhanden.<br>
                    Auch ein ungültiger Wert für <q>rating</q> erzeugt diesen Fehler.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERID'
                RATING_INVALID:
                  description: Eine bereits abgegebene Bewertung kann nur verbessert, nicht verschlechtert werden.
                  value:
                    status: NOK
                    returnValue: RATING_INVALID
                RATING_LOCKED:
                  description: Die Bewertung für diese Bestellung ist gesperrt und kann nicht mehr geändert werden.
                  value:
                    status: NOK
                    returnValue: RATING_LOCKED
                RATING_EXPIRED:
                  description: Eine Bewertung muss innerhalb von 6 Monaten nach Bestelleingang erfolgen.
                  value:
                    status: NOK
                    returnValue: RATING_EXPIRED
                COMMENT_MANDATORY:
                  description: Bei einer Bewertung von <q>1</q> oder <q>2</q> ist ein Kommentar von mindestens 15 Zeichen (ohne Sonderzeichen) erforderlich.
                  value:
                    status: NOK
                    returnValue: COMMENT_MANDATORY
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /order_status:
    put:
      tags:
        - order
      summary: Setzen des Status einer Bestellung
      description: Setzen des Status einer Bestellung
      security:
        - tokenAuth: [ ]
      parameters:
        - $ref: '#/components/parameters/orderIdParam'
        - name: status
          in: query
          required: true
          schema:
            type: string
            enum:
              - BUYER_NO_REACTION
              - CANCELED
              - PAID_WAITING_FOR_SHIPMENT
              - READY_FOR_SHIPMENT
              - SHIPPED_AND_PAID
              - SHIPPED_WAITING_FOR_PAYMENT
              - TO_BE_PAID
              - VENDOR_NO_REACTION
              - WAITING_FOR_PAYMENT
              - WAITING_FOR_SHIPMENT
          description: |
            <p>Neuer Status der Bestellung</p>
            
            <p>
              <strong>Achtung:</strong> Das Setzen des Status <strong>CANCELED</strong>
              ist nicht gleichbedeutend mit dem Aufruf der Schnittstelle
              <a href="https://www.booklooker.de/pages/rest_api.php?interface=order_item_cancel">order_item_cancel</a>.
              Der Status <strong>CANCELED</strong> dient lediglich der
              Eigenorganisation des Verkäufers. Um eine Bestellung so zu
              stornieren, dass keine Provision anfällt, <strong>muss</strong>
              <a href="https://www.booklooker.de/pages/rest_api.php?interface=order_cancel">order_cancel</a>
              oder
              <a href="https://www.booklooker.de/pages/rest_api.php?interface=order_item_cancel">order_item_cancel</a>
              aufgerufen werden.
            </p>
            
            <h4>Bei Verkäufen sind die folgenden Status möglich</h4>
            
            <table class="table-padding-5 grid">
              <tr><th>Status</th><th>Bedeutung</th></tr>
              <tr><td>WAITING_FOR_PAYMENT</td><td>warte auf Zahlung</td></tr>
              <tr><td>READY_FOR_SHIPMENT</td><td>fertig zum Versand</td></tr>
              <tr><td>SHIPPED_WAITING_FOR_PAYMENT</td><td>versendet, warte auf Zahlung</td></tr>
              <tr><td>SHIPPED_AND_PAID</td><td>versendet &amp; bezahlt</td></tr>
              <tr><td>BUYER_NO_REACTION</td><td>Kunde reagiert nicht</td></tr>
              <tr><td>CANCELED</td><td>storniert</td></tr>
            </table>            
            
            <h4>Bei Käufen sind die folgenden Status möglich</h4>
            
            <table class="table-padding-5 grid">
              <tr><th>Status</th><th>Bedeutung</th></tr>
              <tr><td>TO_BE_PAID</td><td>Zahlung offen</td></tr>
              <tr><td>WAITING_FOR_PAYMENT_INFO</td><td>warte auf Zahlungsinformationen</td></tr>
              <tr><td>WAITING_FOR_SHIPMENT</td><td>warte auf Lieferung</td></tr>
              <tr><td>PAID_WAITING_FOR_SHIPMENT</td><td>bezahlt, warte auf Lieferung</td></tr>
              <tr><td>RECEIVED_AND_PAID</td><td>erhalten &amp; bezahlt </td></tr>
              <tr><td>VENDOR_NO_REACTION</td><td>Verkäufer reagiert nicht</td></tr>
              <tr><td>CANCELED</td><td>storniert</td></tr>
            </table>
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: Der Status wurde erfolgreich gesetzt.
                  value:
                    status: OK
                    returnValue: SUCCESS
                INVALID_PARAMETERS:
                  description: Einer der Parameter <q>orderId</q> oder <q>status</q> ist leer oder nicht vorhanden.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                NOT_FOUND:
                  $ref: '#/components/responses/NOT_FOUND_ORDERID'
                STATUS_NOT_VALID:
                  description: Kein gültiger Wert für den Parameter <q>status</q>.
                  value:
                    status: NOK
                    returnValue: STATUS_NOT_VALID
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
  /purchase:
    post:
      tags:
        - order
      summary: Kauf von Artikeln auslösen
      description: |
        <h3>ACHTUNG: Wenn Sie diese Schnittstelle verwenden möchten, wenden Sie sich bitte an daten@booklooker.de</h3>
        <p>
          Löst den Kauf eines oder mehrerer Artikel. Es können bis zu <strong>100</strong> Artikelnummern in einem
          einzigen Aufruf übergeben werden, auch von unterschiedlichen Anbietern.
        </p>
        <h3>Ablauf</h3>
        <ul class="default-list">
          <li>
            Die übergebenen Artikelnummern werden nach Anbieter gruppiert. Artikelnummern, die keinem Anbieter
            zugeordnet werden können (unbekannt oder fehlerhaft), werden übersprungen und in
            <q>invalidArticles</q> zurückgegeben.
          </li>
          <li>
            Pro Anbieter wird eine Bestellung angelegt. Die Bestellungen sind unabhängig voneinander: Sofern
            eine Bestellung fehlschlägt hat dies keine Auswirkungen auf andere Bestellungen
          </li>
          <li>
            Für jede Bestellung wird aus der Liste der Zahlungsarten <q>paymentId</q> die erste vom Anbieter
            angebotene und zulässige Zahlungsart gewählt. <strong>Achtung</strong>: Sofern für eine Zahlungsart
            ein Mindestbestellwert verlangt wird und die Bestellung diesen Wert nicht erreicht, wird kein Fehler
            erzeugt, sondern die nächste Zahlungsart in der Liste verwendet!
          </li>
          <li>
            Verfügbare Artikel werden bestellt; nicht verfügbare oder abgewiesene Artikel werden pro Anbieter
            einzeln ausgewiesen (siehe <q>articles</q> in der Rückgabe).
          </li>
        </ul>
        <h3>Wichtige Hinweise</h3>
        <ul class="default-list">
          <li>
            <strong>Käufer</strong> ist stets der authentifizierte Nutzer. Der Kauf bei sich selbst ist nicht möglich.
          </li>
          <li>
            Es kann pro Aufruf nur <strong>eine</strong> Lieferadresse (<q>addressId</q>) angegeben werden;
            diese gilt für <strong>alle</strong> im Aufruf entstehenden Bestellungen.
          </li>
          <li>
            Jeder Aufruf muss einen eindeutigen <q>orderToken</q> enthalten, der nur einmal verwendet werden
            kann. Hat ein Aufruf bereits mindestens eine Bestellung ausgelöst, wird jeder weitere Aufruf mit demselben
            <q>orderToken</q> mit <q>ORDER_TOKEN_ALREADY_USED</q> abgelehnt. So wird nach einem
            Verbindungsabbruch eine versehentliche Doppelbestellung verhindert. Die Antwort des ursprünglichen Aufrufs wird dabei
            <strong>nicht</strong> erneut geliefert; ob und welche Bestellungen tatsächlich zustande kamen, ist der
            Ablehnung nicht zu entnehmen.
          </li>
          <li>
            <q>status</q> ist <strong>NOK</strong> nur, wenn der Aufruf gar nicht verarbeitet werden konnte
            (fehlerhafte Parameter, Authentifizierung, Kontingent o.&nbsp;Ä.); <q>returnValue</q> ist dann eine
            einzelne Fehlerzeichenkette (siehe die entsprechenden Beispiele). Sobald der Aufruf verarbeitet wurde,
            ist <q>status</q> stets <strong>OK</strong> und <q>returnValue</q> ein Objekt mit den Listen
            <q>invalidArticles</q> und <q>orders</q> (s.u.) — auch dann, wenn keine
            gültige Artikelnummer übergeben wurde oder keine Bestellung zustande kam! Werten Sie daher stets die
            Detaildaten in <q>orders</q> und <q>invalidArticles</q> aus;
            <q>status = OK</q> bedeutet nicht, dass jede Bestellung erfolgreich war.
          </li>
        </ul>
      security:
        - tokenAuth: [ ]
      parameters:
        - name: articleId
          description: |
            Eine oder mehrere Artikelnummern der zu kaufenden Artikel (max. 100).
            Artikel verschiedener Anbieter sind zulässig und werden anbieterweise zu getrennten Bestellungen zusammengefasst.
            Doppelte Nummern werden nur einmal berücksichtigt.
          in: query
          required: true
          schema:
            type: array
            maxItems: 100
            items:
              type: string
        - name: paymentId
          description: |
            <p>
              Gewünschte Zahlungsarten als Prioritätsliste. Pro Bestellung wird die erste angebotene und zulässige
              Zahlungsart verwendet; Wurde keine gültige Zahlungsart gefunden, schlägt die betreffende Bestellung mit
              <q>NO_PAYMENT_METHOD_AVAILABLE</q> fehl.
            </p>
            <p>
            Mögliche Werte:
            </p>
            <ul class="default-list">
              <li>1 &middot; Banküberweisung</li>
              <li>2 &middot; Offene Rechnung</li>
              <li>5 &middot; Nachnahme</li>
              <li>9 &middot; Selbstabholung und Barzahlung</li>
              <li>11 &middot; Offene Rechnung (Vorkasse vorbehalten)</li>
              <li>12 &middot; PayPal</li>
            </ul>
          in: query
          required: true
          schema:
            type: array
            items:
              type: integer
        - name: acceptTerms
          description: |
            Bestätigung der Allgemeinen Geschäftsbedingungen. Der Kauf wird nur ausgeführt, wenn der Wert
            <q>1</q> übergeben wird. Andernfalls wird der Aufruf mit <q>TERMS_NOT_ACCEPTED</q> abgelehnt.
          in: query
          required: true
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1
        - name: orderToken
          description: |
            Frei wählbare, eindeutige Kennung dieses Kaufs (z.&nbsp;B. eine UUID). Wird derselbe <q>orderToken</q>
            erneut übermittelt, wird der Aufruf mit <q>ORDER_TOKEN_ALREADY_USED</q> abgelehnt und keine zweite
            Bestellung ausgelöst. Erlaubt sind 1 bis 64 Zeichen, ausschließlich Buchstaben, Ziffern, Bindestrich
            und Unterstrich; andernfalls wird der Aufruf mit <q>INVALID_PARAMETERS</q> abgelehnt.
          in: query
          required: true
          schema:
            type: string
            maxLength: 64
            pattern: "^[A-Za-z0-9_-]{1,64}$"
        - name: addressId
          description: |
            ID der Lieferadresse des Käufers. Die Adresse muss dem authentifizierten Nutzer gehören.
            Wird <q>0</q> übergeben oder der Parameter weggelassen, wird die Rechnungsadresse des Nutzers verwendet.
            Eine ungültige oder fremde <q>addressId</q> führt zum Abbruch des gesamten Aufrufs mit
            <q>INVALID_ADDRESS</q>.
          in: query
          schema:
            type: integer
            default: 0
        - name: requireCompleteOrder
          description: |
            Steuert das Verhalten, wenn nicht alle Artikel eines Anbieters verfügbar sind. Mögliche Werte:
            <ul class="default-list">
              <li>0 &middot; Es werden alle verfügbaren Artikel des Anbieters bestellt (Teilbestellung erlaubt).</li>
              <li>1 &middot; Die Bestellung eines Anbieters wird nur ausgeführt, wenn <strong>alle</strong> seiner Artikel verfügbar sind; andernfalls entsteht für diesen Anbieter keine Bestellung (Bestellfehler <q>INCOMPLETE_ORDER</q>).</li>
            </ul>
          in: query
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1
        - name: message
          description: Optionale Nachricht an den Anbieter (Anmerkung zur Bestellung).
          in: query
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                  returnValue:
                    type: mixed
              examples:
                SUCCESS:
                  description: |
                    <p>
                      Der Aufruf wurde verarbeitet. Die Rückgabe ist ein Objekt mit den
                      Listen <q>invalidArticles</q> und <q>orders</q>. Jede übergebene Artikelnummer erscheint genau
                      einmal: entweder in <q>invalidArticles</q> (kein Anbieter ermittelbar) oder in der
                      <q>articles</q>-Liste genau eines Anbieters.
                    </p>
                    <table class="table-padding-5 grid">
                      <tr>
                        <th>Element</th>
                        <th>Bedeutung</th>
                      </tr>
                      <tr>
                        <td>invalidArticles</td>
                        <td>
                          Liste von Artikelnummern, die keinem Anbieter zugeordnet werden konnten,
                          weil sie fehlerhaft (ungültiges Format) oder unbekannt sind. Diese Artikel sind in keiner
                          Bestellung enthalten. Leer, wenn alle Nummern aufgelöst werden konnten.
                        </td>
                      </tr>
                      <tr>
                        <td>orders</td>
                        <td>
                          <p>
                            Ein Eintrag je Anbieter, zu dem mindestens eine gültige Artikelnummer übergeben wurde.
                          </p>
                          <table class="table-padding-5 grid">
                            <tr>
                              <th>Element</th>
                              <th>Bedeutung</th>
                            </tr>
                            <tr>
                              <td>sellerId</td>
                              <td>Interne ID des Anbieters.</td>
                            </tr>
                            <tr>
                              <td>status</td>
                              <td>
                                OK &middot; für diesen Anbieter wurde eine Bestellung ausgelöst<br>
                                NOK &middot; für diesen Anbieter wurde <strong>keine</strong> Bestellung ausgelöst (siehe <q>error</a>)
                              </td>
                            </tr>
                            <tr>
                              <td>error</td>
                              <td>
                                <table class="table-padding-5 grid">
                                  <tr>
                                    <th>Wert</th>
                                    <th>Bedeutung</th>
                                  </tr>
                                  <tr>
                                    <td>NO_ORDERABLE_ARTICLES</td><td>Kein Artikel dieses Anbieters war (mehr) bestellbar.</td>
                                  </tr>
                                  <tr>
                                    <td>INCOMPLETE_ORDER</td>
                                    <td><q>requireCompleteOrder=1</q> und mindestens ein Artikel des Anbieters nicht verfügbar; es wurde keine Bestellung erstellt.</td>
                                  </tr>
                                  <tr>
                                    <td>NO_PAYMENT_METHOD_AVAILABLE</td>
                                    <td>Keine der gewünschten Zahlungsarten wird vom Anbieter angeboten oder der Mindestbestellwert wurde nicht erreicht.</td>
                                  </tr>
                                  <tr>
                                    <td>ORDER_IN_PROGRESS</td>
                                    <td>Für diese Kombination wird bereits eine gleichartige Bestellung verarbeitet (paralleler Aufruf / erneuter Versuch).</td>
                                  </tr>
                                  <tr>
                                    <td>SELF_ORDER</td>
                                    <td>Der Nutzer kann nicht bei sich selbst kaufen.</td>
                                  </tr>
                                  <tr>
                                    <td>SELLER_NOT_FOUND</td>
                                    <td>Der Anbieter existiert nicht.</td>
                                  </tr>
                                  <tr>
                                    <td>SELLER_NOT_AVAILABLE</td>
                                    <td>Der Anbieter ist derzeit nicht verkaufsberechtigt (gesperrt, ungültige E-Mail o.&nbsp;Ä.).</td>
                                  </tr>
                                  <tr>
                                    <td>SELLER_IN_HOLIDAY</td>
                                    <td>Der Anbieter befindet sich im Urlaub.</td>
                                  </tr>
                                  <tr>
                                    <td>ORDER_REFUSED</td>
                                    <td>Ein Kauf zwischen diesen Parteien ist nicht möglich (z.&nbsp;B. Sperrliste).</td>
                                  </tr>
                                  <tr>
                                    <td>BUYER_NOT_ACTIVATED</td>
                                    <td>Das Käuferkonto ist nicht (vollständig) aktiviert.</td>
                                  </tr>
                                  <tr>
                                    <td>ORDER_LIMIT_REACHED</td>
                                    <td>Ein Bestelllimit wurde erreicht.</td>
                                  </tr>
                                  <tr>
                                    <td>INVALID_ADDRESS</td>
                                    <td>Ungültige Lieferadresse für diese Bestellung.</td>
                                  </tr>
                                  <tr>
                                    <td>COUNTRY_NOT_SUPPORTED</td>
                                    <td>Lieferung in das Zielland nicht möglich.</td>
                                  </tr>
                                  <tr>
                                    <td>PACKSTATION_NOT_SUPPORTED</td>
                                    <td>Lieferung an eine Packstation nicht möglich.</td>
                                  </tr>
                                  <tr>
                                    <td>BUYER_NOT_FOUND</td>
                                    <td>Das Käuferkonto existiert nicht.</td>
                                  </tr>
                                  <tr>
                                    <td>MIN_ORDER_VALUE_NOT_REACHED</td>
                                    <td>Der Warenwert liegt unter dem Mindestbestellwert des Anbieters.</td>
                                  </tr>
                                  <tr>
                                    <td>ORDER_NOT_READY</td>
                                    <td>Die Bestellung war nicht bereit zum Abschluss.</td>
                                  </tr>
                                  <tr>
                                    <td>INVALID_DEBIT_ACCOUNT</td>
                                    <td>Die Bankverbindung für die Lastschrift ist ungültig.</td>
                                  </tr>
                                  <tr>
                                    <td>CANNOT_CREATE_DEBIT_ACCOUNT</td>
                                    <td>Für die Lastschrift konnte keine Bankverbindung angelegt werden.</td>
                                  </tr>
                                  <tr>
                                    <td>UNEXPECTED_ERROR</td>
                                    <td>Unerwarteter Fehler bei der Verarbeitung dieser Bestellung.</td>
                                  </tr>
                                </table>
                              </td>
                            </tr>
                            <tr>
                              <td>orderId</td>
                              <td>Interne booklooker-ID der erstellten Bestellung.</td>
                            </tr>
                            <tr>
                              <td>price</td>
                              <td>Warenwert der Bestellung in Euro (ohne Versand).</td>
                            </tr>
                            <tr>
                              <td>shippingCost</td>
                              <td>Versandkosten in Euro.</td>
                            </tr>
                            <tr>
                              <td>additionalCosts</td>
                              <td>Zusätzliche Kosten der gewählten Zahlungsart in Euro.</td>
                            </tr>
                            <tr>
                              <td>totalCost</td>
                              <td>Gesamtbetrag in Euro (Warenwert + Versand + Zusatzkosten).</td>
                            </tr>
                            <tr>
                              <td>paymentId</td>
                              <td>Tatsächlich verwendete Zahlungsart aus der Prioritätsliste.</td>
                            </tr>
                            <tr>
                              <td>paymentNotice</td>
                              <td>Hinweistext zur Zahlung (z.&nbsp;B. Bankverbindung des Anbieters bei Vorkasse).</td>
                            </tr>
                            <tr>
                              <td>articles</td>
                              <td>
                                <p>
                                  Ergebnis je Artikel dieses Anbieters
                                </p>
                                <table class="table-padding-5 grid">
                                  <tr>
                                    <th>Element</th>
                                    <th>Bedeutung</th>
                                  </tr>
                                  <tr>
                                    <td>articleId</td>
                                    <td>Die Bestellnummer</td>
                                  </tr>
                                  <tr>
                                    <td>status</td>
                                    <td>
                                      OK &middot; der Artikel ist Teil der ausgelösten Bestellung<br>
                                      NOK &middot; der Artikel ist <strong>nicht</strong> Teil der ausgelösten Bestellung (siehe <q>error</q>)
                                  </td>
                                  </tr>
                                  <tr>
                                    <td>error</td>
                                    <td>
                                      <table class="table-padding-5 grid">
                                        <tr>
                                          <th>Wert</th>
                                          <th>Bedeutung</th>
                                        </tr>
                                        <tr>
                                          <td>ARTICLE_SOLD</td>
                                          <td>Der Artikel wurde bereits verkauft.</td>
                                        </tr>
                                        <tr>
                                          <td>ARTICLE_NOT_AVAILABLE</td>
                                          <td>Der Artikel ist gelöscht, gesperrt oder pausiert.</td>
                                        </tr>
                                        <tr>
                                          <td>ARTICLE_IN_PROCESS</td>
                                          <td>Vorübergehend nicht verfügbar (in Verarbeitung / Warteschlange).</td>
                                        </tr>
                                        <tr>
                                          <td>ARTICLE_SHORTAGE</td>
                                          <td>Der Bestand reicht nicht aus.</td>
                                        </tr>
                                        <tr>
                                          <td>INVALID_ARTICLE_ID</td>
                                          <td>Einem Anbieter zugeordnet, aber nicht bestellbar (z.&nbsp;B. ungültige Quelle).</td>
                                        </tr>
                                        <tr>
                                          <td>ORDER_NOT_PLACED</td>
                                          <td>
                                            Der Artikel wäre bestellbar gewesen, aber die Bestellung dieses Anbieters
                                            kam nicht zustande (siehe <q>error</q> der Bestellung)</td>
                                        </tr>
                                      </table>
                                    </td>
                                  </tr>
                                </table>
                              </td>
                            </tr>
                          </table>
                        </td>
                      </tr>
                    </table>
                  value:
                    status: OK
                    returnValue: ""
                NOT_ENABLED:
                  description: Diese Schnittstelle muss freigeschaltet werden. Bitte wenden Sie sich an daten@booklooker.de.
                  value:
                    status: NOK
                    returnValue: NOT_ENABLED
                INVALID_PARAMETERS:
                  description: Es wurde kein Artikel, keine gültige Zahlungsart oder kein gültiger <q>orderToken</q> übergeben.
                  value:
                    status: NOK
                    returnValue: INVALID_PARAMETERS
                TOO_MANY_ARTICLES:
                  description: Es wurden mehr als 100 Artikelnummern übergeben.
                  value:
                    status: NOK
                    returnValue: TOO_MANY_ARTICLES
                TERMS_NOT_ACCEPTED:
                  description: Der Parameter <q>acceptTerms</q> wurde nicht mit dem Wert <q>1</q> übergeben.
                  value:
                    status: NOK
                    returnValue: TERMS_NOT_ACCEPTED
                ORDER_TOKEN_ALREADY_USED:
                  description: Der übergebene <q>orderToken</q> wurde bereits verwendet.
                  value:
                    status: NOK
                    returnValue: ORDER_TOKEN_ALREADY_USED
                INVALID_ADDRESS:
                  description: Die übergebene <q>addressId</q> ist unbekannt oder gehört nicht zum Nutzer.
                  value:
                    status: NOK
                    returnValue: INVALID_ADDRESS
                ENCODING_ERROR:
                  $ref: '#/components/responses/ENCODING_ERROR'
                INVALID_INTERFACE:
                  $ref: '#/components/responses/INVALID_INTERFACE'
                INVALID_REQUEST_METHOD:
                  $ref: '#/components/responses/INVALID_REQUEST_METHOD'
                QUOTA_EXCEEDED:
                  $ref: '#/components/responses/QUOTA_EXCEEDED'
                SERVER_DOWN:
                  $ref: '#/components/responses/SERVER_DOWN'
                TEMPORARILY_BLOCKED:
                  $ref: '#/components/responses/TEMPORARILY_BLOCKED'
                TOKEN_EXPIRED:
                  $ref: '#/components/responses/TOKEN_EXPIRED'
                TOKEN_MISSING:
                  $ref: '#/components/responses/TOKEN_MISSING'
                TOKEN_UNKNOWN:
                  $ref: '#/components/responses/TOKEN_UNKNOWN'
components:
  securitySchemes:
    tokenAuth:
      type: apiKey
      in: query
      name: token
  parameters:
    orderNoParam:
      name: orderNo
      description: Ihre Bestellnummer
      in: query
      required: true
      schema:
        type: string
    orderIdParam:
      name: orderId
      description: |
        Interne booklooker <q>orderId</q> der Bestellung, wird von der Schnittstelle
        <a href="https://www.booklooker.de/pages/rest_api.php?interface=order">order</a> zurückgeliefert.
      in: query
      required: true
      schema:
        type: integer
  responses:
    SERVER_DOWN:
      description: Aufgrund von Wartungsarbeiten ist die REST API momentan nicht verfügbar.
      value:
        status: NOK
        returnValue: SERVER_DOWN
    INVALID_INTERFACE:
      description: Es wurde eine ungültige Schnittstelle verwendet.
      value:
        status: NOK
        returnValue: INVALID_INTERFACE
    INVALID_REQUEST_METHOD:
      description: Die Schnittstelle wurde mit einer ungültigen HTTP-Methode aufgerufen.
      value:
        status: NOK
        returnValue: INVALID_REQUEST_METHOD
    TOKEN_MISSING:
      description: Der Token ist leer oder nicht vorhanden.
      value:
        status: NOK
        returnValue: TOKEN_MISSING
    TOKEN_UNKNOWN:
      description: Der Token wurde nicht gefunden.
      value:
        status: NOK
        returnValue: TOKEN_UNKNOWN
    TOKEN_EXPIRED:
      description: Der Token ist nicht mehr gültig, eine erneute Authentifizierung ist notwendig.
      value:
        status: NOK
        returnValue: TOKEN_EXPIRED
    TEMPORARILY_BLOCKED:
      description: Der Zugang wurde vorübergehend gesperrt, bitte wenden Sie sich an unseren Kundensupport.
      value:
        status: NOK
        returnValue: TEMPORARILY_BLOCKED
    QUOTA_EXCEEDED:
      description: Die maximale Anzahl Abfragen/Minute wurde überschritten.
      value:
        status: NOK
        returnValue: QUOTA_EXCEEDED
    ENCODING_ERROR:
      description: Die Rückgabe enthält ungültige Zeichen.
      value:
        status: NOK
        returnValue: ENCODING_ERROR
    SIX_WEEKS_EXCEEDED:
      description: Eine Stornierung ist nur 6 Wochen nach Bestelleingang möglich.
      value:
        status: NOK
        returnValue: SIX_WEEKS_EXCEEDED
    INVALID_PARAMETER_ORDERNO:
      description: Der Parameter <q>orderNo</q> ist leer oder nicht vorhanden.
      value:
        status: NOK
        returnValue: INVALID_PARAMETERS
    NOT_FOUND_ORDERNO:
      description: Die Bestellnummer wurde nicht gefunden.
      value:
        status: NOK
        returnValue: NOT_FOUND
    NOT_FOUND_ORDERID:
      description: Die <q>orderId</q> wurde nicht gefunden.
      value:
        status: NOK
        returnValue: NOT_FOUND
