Zum Inhalt springen

JTL-Wawi API Dokumentation

SQL2REST bietet eine Read-Only REST-API Schnittstelle für JTL-Wawi. Hier finden Sie die vollständige Dokumentation zum Anbinden, Einrichten und Nutzen der API-Endpunkte.

Diese Entwicklerdokumentation beschreibt die REST-API Schnittstellen von SQL2REST für die Anbindung an JTL-Wawi. Mit SQL2REST können Sie externe Systeme effizient an Ihre Warenwirtschaft anbinden, Kundendaten und Artikeldaten auslesen, Bestellungen abrufen und Workflows automatisieren.

SQL2REST funktioniert als API-Anbindung zwischen Ihrer JTL-Wawi Datenbank und externen Anwendungen. Die Erweiterung läuft als Windows-Dienst lokal auf Ihrem Server und stellt zuverlässig Read-Only Endpunkte bereit. So können Sie JTL-Wawi API anbinden, ohne einen JTL-Connector oder teure Zusatzfunktionen zu benötigen.

Typische Anwendungsfälle sind die Integration in CRM-Systeme, E-Commerce Plattformen wie JTL-Shop oder Shopware, Multichannel-Handel über JTL-eazyAuction, sowie die zentrale Verwaltung von Prozessen über Tools wie n8n, Make oder Zapier.

SQL2REST hält Ihre Datenbank konsistent durch ausschliesslich lesende Zugriffe. Updates und neue Features werden regelmässig bereitgestellt. JTL Servicepartner und Entwickler können die API-Anbindung individuell anpassen und integrieren.

Inhalt

Erste Schritte

1. Installation

  1. ZIP-Datei auf Ihren Windows-Server entpacken (z.B. C:\SQL2REST\)
  2. StartWizard.bat doppelklicken
  3. Der Assistent führt Sie durch alles: Verbindung testen, Views erstellen, Dienst installieren

ODBC Driver 17 wird benötigt, ist aber auf den meisten JTL-Wawi-Servern bereits installiert. Der Assistent prüft die Verbindung automatisch.

Setup

So funktioniert es

Vom SQL Server zur REST API in 4 Schritten, vollautomatisch.

SQL2REST Wizard
DESKTOP-JTL01\JTLWAWI
sa
••••••••••
Admin-Konto nur für die Einrichtung. Der Assistent erstellt automatisch einen dedizierten Nur-Lese-Benutzer mit minimalen Berechtigungen. Ihre Admin-Zugangsdaten werden nicht gespeichert.
Reiner Lesezugriff: die API liest ausschließlich, kein Schreibzugriff möglich.

2. Erster API-Aufruf

Nach Abschluss des Wizards ist Ihre API sofort einsatzbereit:

bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/customers

Ersetzen Sie YOUR_KEY durch den API-Schlüssel aus dem Setup-Wizard (gespeichert in config.ini).

Ersetzen Sie YOUR-SERVER durch localhost (gleicher Rechner) oder die IP-Adresse Ihres Servers. Standard-Port ist 8000; der Port kann im Setup-Wizard angepasst werden.

Authentifizierung

Jede API-Anfrage erfordert einen API-Schlüssel als HTTP-Header:

http
X-API-Key: your-api-key-here

Der Header-Name ist standardmäßig X-API-Key und kann in config.ini unter [API] HeaderName geändert werden.

Hinweis: Query-Parameter-Authentifizierung wird nicht unterstützt. Der API-Schlüssel muss als Header gesendet werden.

Endpunkte

Alle Daten-Endpunkte erfordern einen gültigen API-Schlüssel und eine aktive Lizenz. Feldnamen hängen von Ihrer Spaltenzuordnung im Setup-Wizard ab.

Alle Endpunkte unterstützen: sort, order, limit, offset, mandant. Details siehe unten.

Interne JTL-IDs (JTL_-Präfix)

Ab v1.1.80 gibt jede Entität interne JTL-IDs zurück: JTL_CustomerId (Kunden), JTL_SalesOrderId + JTL_CustomerId (Aufträge), JTL_ItemId + JTL_SalesOrderId + JTL_ProductId (Auftragspositionen), JTL_ProductId (Produkte), JTL_DeliveryNoteId + JTL_SalesOrderId + JTL_CustomerId (Lieferscheine), JTL_ShipmentId + JTL_DeliveryNoteId + JTL_SalesOrderId (Lieferungen).

Kunden

GET /customers

Kunden auflisten mit optionaler Suche, Sortierung und Paginierung.

ParameterTypBeschreibung
searchstringLIKE-Suche über Name und Nummer
customer_numberstringExakter Filter nach Kundennummer
bash
curl -H "X-API-Key: YOUR_KEY" "http://YOUR-SERVER:8000/customers?search=Müller"
json
{
  "data": [
    {
      "CustomerNumber": "10001",
      "Company": "Müller GmbH",
      "Email": "[email protected]",
      "City": "Frankfurt"
    }
  ],
  "total": 3,
  "limit": 100,
  "offset": 0
}
GET /customers/{number}

Einzelnen Kunden nach Kundennummer abrufen.

bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/customers/10001
json
{
  "data": {
    "CustomerNumber": "10001",
    "Company": "Müller GmbH",
    "FirstName": "Thomas",
    "LastName": "Müller",
    "Email": "[email protected]",
    "City": "Frankfurt",
    "Country": "DE"
  }
}

Aufträge

GET /orders

Aufträge auflisten mit Filtern nach Kunde, Status und Zeitraum.

ParameterTypBeschreibung
customerstringFilter nach Kundennummer
customer_numberstringExakter Filter nach Kundennummer
order_numberstringExakter Filter nach Auftragsnummer
external_order_idstringExakter Filter nach externer Bestell-ID
statusstringFilter nach Status
fromdateStartdatum (YYYY-MM-DD)
todateEnddatum (YYYY-MM-DD)
bash
curl -H "X-API-Key: YOUR_KEY" "http://YOUR-SERVER:8000/orders?from=2024-01-01&status=Versendet"
GET /orders/{number}

Einzelnen Auftrag nach Auftragsnummer abrufen.

GET /orders/{number}/items

Positionen eines Auftrags abrufen.

Rechnungen

GET /invoices

Rechnungen auflisten mit Filtern nach Kunde, Status und Zeitraum.

ParameterTypBeschreibung
customerstringFilter nach Kundennummer
statusstringFilter nach Status
from / todateDatumsbereich (YYYY-MM-DD)
orderstringFilter nach Auftragsnummer

Mit dem Parameter ?order= können alle Rechnungen zu einem bestimmten Auftrag abgerufen werden:

bash
curl -H "X-API-Key: YOUR_KEY" "http://YOUR-SERVER:8000/invoices?order=86957"

Produkte

GET /products

Produkte auflisten mit optionaler Suche.

ParameterTypBeschreibung
searchstringLIKE-Suche über Name und Nummer
skustringExakter Filter nach Artikelnummer (SKU)
GET /products/{sku}

Einzelnes Produkt nach Artikelnummer (SKU) abrufen.

Attribute (Merkmale)

SQL2REST erkennt JTL-Merkmale (standardisierte Varianten-Beschreibungen wie Farbe, Größe, Material) und stellt sie über drei Wege zur Verfügung: einen Katalog-Endpunkt, eingebettete Werte auf Produkten und einen Filter-Parameter.

GET /attributes

Alle Merkmal-Definitionen mit ihren möglichen Werten, gruppiert nach Name.

ParameterTypBeschreibung
advancedbooleanJTL_AttributeId und JTL_ValueId zusätzlich ausgeben (Standard: false)
mandantintegerMandanten-ID (Standard: 1)
bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/attributes
json
{
  "data": [
    { "name": "Farbe", "values": ["Rot", "Blau", "Grün"] },
    { "name": "Größe", "values": ["S", "M", "L"] }
  ],
  "total": 2
}

Eingebettete Attribute auf Produkten

Der Endpunkt /products/{sku} liefert immer ein attributes-Objekt, gruppiert nach Attributname. Bei /products opt-in über ?include=attributes, um N+1 zu vermeiden.

json
{
  "data": {
    "SKU": "ART-001",
    "ProductName": "T-Shirt",
    "attributes": {
      "Farbe": ["Rot"],
      "Größe": ["M"]
    }
  }
}

Produkte nach Attribut filtern

Der Parameter ?attribute[name]=wert filtert Produkte. Attributnamen sind die deutschen JTL-Originalnamen (kleingeschrieben). Mehrere Filter werden mit UND verknüpft.

bash
# Einzelner Filter
curl -H "X-API-Key: YOUR_KEY" "http://YOUR-SERVER:8000/products?attribute[farbe]=rot&include=attributes"

# Mehrere Filter (UND-verknüpft)
curl -H "X-API-Key: YOUR_KEY" "http://YOUR-SERVER:8000/products?attribute[farbe]=rot&attribute[groesse]=m"

Erweiterter Modus (JTL-IDs)

Mit ?advanced=true wird das Antwort-Format auf Objekte mit JTL_AttributeId (kMerkmal) und JTL_ValueId (kMerkmalWert) umgestellt. Nützlich für Write-Back über die offizielle JTL-API.

json
{
  "data": [
    {
      "name": "Farbe",
      "JTL_AttributeId": 5,
      "values": [
        { "value": "Rot", "JTL_ValueId": 12 },
        { "value": "Blau", "JTL_ValueId": 13 }
      ]
    }
  ]
}

Attribute ausblenden

Über den Abschnitt [MERKMALE] in der config.ini können einzelne Attribute aus allen Antworten ausgeblendet werden (Komma-getrennt, Groß-/Kleinschreibung wird ignoriert). Versuche, diese Namen als Filter zu nutzen, liefern HTTP 400.

config.ini
[MERKMALE]
Disabled = InternalCode, LegacyFlag

Sprache

Attribut-Übersetzungen werden bei der View-Erstellung fixiert (Standard: Deutsch, kSprache=1). Eine laufzeitseitige Umschaltung über den Accept-Language-Header ist aktuell nicht aktiv. Bei Bedarf an Mehrsprachigkeit bitte Kontakt aufnehmen.

Bestand

GET /stock

Lagerbestand auflisten mit optionalem SKU-Filter. Jede Zeile enthält: SKU, InternalArticleId, AvailableStock, ReservedStock, IncomingStock, BlockedStock und StockLevel.

GET /products/{sku}/stock

Lagerbestand eines Artikels aufgeteilt nach Lager abrufen. Eine Zeile pro Lager mit WarehouseId, WarehouseName, WarehouseActive und StockInWarehouse.

bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/products/ART-001/stock
json
{
  "data": [
    {
      "SKU": "ART-001",
      "WarehouseId": 1,
      "WarehouseName": "Main",
      "WarehouseActive": 1,
      "StockInWarehouse": 42.0
    }
  ]
}

Lieferungen

GET /shipments

Lieferungen auflisten mit Filtern nach Auftrag, Versanddienstleister und Zeitraum.

ParameterTypBeschreibung
orderstringFilter nach Auftragsnummer
carrierstringFilter nach Versanddienstleister
from / todateDatumsbereich (YYYY-MM-DD)
sort_orderstringSortierrichtung: asc oder desc (statt order)

Lieferscheine

GET /delivery-notes

Lieferscheine auflisten mit optionaler Suche und Datumsfilter.

ParameterTypBeschreibung
searchstringLIKE-Suche über Name und Nummer
from / todateDatumsbereich (YYYY-MM-DD)
includestringitems (Positionen einschliessen)
json
{
  "data": [
    {
      "DeliveryNoteNumber": "LS-10042",
      "DeliveryNoteDate": "2024-03-15",
      "OrderNumber": "86957",
      "CustomerNumber": "10001"
    }
  ],
  "total": 12,
  "limit": 100,
  "offset": 0
}
GET /delivery-notes/{number}

Einzelnen Lieferschein nach Lieferscheinnummer abrufen. Positionen werden automatisch eingeschlossen.

bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/delivery-notes/LS-10042
GET /delivery-notes?include=items

Lieferscheine mit Positionen in einem Aufruf abrufen.

json
{
  "data": [
    {
      "DeliveryNoteNumber": "LS-10042",
      "DeliveryNoteDate": "2024-03-15",
      "OrderNumber": "86957",
      "CustomerNumber": "10001",
      "items": [
        {
          "ArticleNumber": "ART-001",
          "ArticleName": "Produkt A",
          "Quantity": 2
        }
      ]
    }
  ]
}

Cross-API: SQL2REST lesen + JTL schreiben

Die Felder mit JTL_-Präfix sind Schlüsselwerte aus Ihrer JTL-Datenbank. Sie sind im Wizard standardmäßig deaktiviert (siehe Abschnitt "Erweitert" im Setup) und werden nur benötigt, wenn Sie zusätzlich zur read-only API von SQL2REST auch über die offizielle JTL-API in JTL schreiben (zum Beispiel Auftragsstatus aktualisieren). Reine Leseintegrationen können diese Felder ignorieren.

http
# 1. Read order via SQL2REST (this API)
GET /orders?order_number=12345
# response includes: JTL_SalesOrderId: 9, JTL_CustomerId: 42

# 2. Use JTL_SalesOrderId to update via the official JTL API
PATCH https://your-jtl-server/api/eazybusiness/v1/salesOrder/9

Sync-Endpunkte

Vorverbundene Endpunkte für CRM-Integrationen. Liefern Daten aus mehreren Tabellen in einem Aufruf.

GET /sync/orders

Aufträge mit Kunden-, Rechnungs- und Versanddaten in einem Aufruf.

GET /sync/customers

Batch-Kundensynchronisation mit höherem Limit (bis zu 1000).

Filtern & Suchen

Zwei Arten von Filtern stehen zur Verfügung:

Textsuche (LIKE)

Der search-Parameter durchsucht Name und Nummer. Verfügbar auf /customers und /products.

Exakte Filter

Filterparameter liefern exakte Übereinstimmungen:

ParameterVerfügbar auf
customer/orders, /invoices, /sync/orders
customer_number/customers, /orders
order_number/orders
external_order_id/orders
status/orders, /invoices
sku/stock, /products
order/shipments
carrier/shipments

Sortierung & Paginierung

Alle Listen-Endpunkte unterstützen Sortierung und Paginierung.

ParameterStandardBeschreibung
sortSortierfeld (beliebiger Spaltenname der View)
orderascSortierrichtung: asc oder desc
limit100Ergebnisse pro Seite (1–500)
offset0Ergebnisse überspringen

Hinweis: /shipments verwendet sort_order statt order.

Datumsfilter

Zeitraum-Filter über from/to-Parameter (jeweils einschließlich).

Multi-Mandant

Wenn Sie mehrere JTL-Datenbanken konfiguriert haben, verwenden Sie den mandant-Parameter, um die Zieldatenbank auszuwählen. Standard ist 1.

Mandanten-Limits nach Tarif

TarifMandanten
Trial1
Personal1
Agency5
EnterpriseUnbegrenzt

Auto-Discovery

Der Setup-Wizard analysiert automatisch Ihr JTL-Datenbankschema und erkennt die richtigen Spalten für jeden Endpunkt.

  • Erkennt Ihre JTL-Wawi Version automatisch (1.5 bis 2.0)
  • Ordnet Standardfelder automatisch zu (Kundennummer, Bestelldatum, SKU etc.)
  • Nicht erkannte Felder können manuell per Dropdown zugeordnet werden
  • Spaltenvorschau zeigt echte Beispieldaten aus Ihrer Datenbank

Eigene Felder

SQL2REST erkennt automatisch benutzerdefinierte Felder (Eigene Felder) in Ihrer JTL-Datenbank und macht sie per API verfügbar.

  • Unterstützt Artikel-, Kunden- und Bestellungsfelder
  • Alle JTL-Feldtypen: Text, Ganzzahl, Dezimalzahl, Datum
  • Pro Gruppe aktivierbar/deaktivierbar im Setup-Wizard (Schritt 3)
  • Standardmäßig deaktiviert - nur aktive Felder erscheinen in der API

Eigene Felder erscheinen in der API-Antwort mit dem Präfix CF_:

json
{
  "SKU": "ART-001",
  "ProductName": "Widget",
  "CF_Energie_KJ": 500,
  "CF_Zutaten": "Mehl, Zucker, Butter",
  "CF_WEEE_Pickup": 1
}

Um Eigene Felder nachträglich zu aktivieren, führen Sie den Setup-Wizard erneut aus.

Community Mapping

Wenn Sie eine Spalte manuell zuordnen, können Sie diese Zuordnung anonym teilen, um die Erkennung für alle Nutzer zu verbessern.

  • Nur bei expliziter Zustimmung im Wizard (Opt-in)
  • Es werden nur Tabellen-/Spaltennamen geteilt, niemals Geschäftsdaten

Details zum Datenschutz: /datenschutz

Rechnungs-PDFs

GET /invoices/{number}/pdf

Rechnungs-PDF nach Rechnungsnummer herunterladen. Standardmäßig deaktiviert, kann im Setup-Wizard oder in config.ini aktiviert werden.

Die Suche extrahiert den numerischen Teil der Rechnungsnummer (RE-12345 → 12345) und sucht rekursiv in allen konfigurierten Ordnern und Unterordnern. Bei mehreren Treffern wird die neueste Datei verwendet.

bash
curl -H "X-API-Key: YOUR_KEY" http://YOUR-SERVER:8000/invoices/86774/pdf --output rechnung.pdf

Gibt die PDF-Datei direkt als Download zurück (Content-Type: application/pdf). Bei nicht gefundener Rechnung: 404.

Konfiguration

Es reicht, den Hauptordner anzugeben - Unterordner wie Jahres- oder Monatsverzeichnisse werden automatisch durchsucht:

config.ini
InvoicePdfPath = \\SERVER\Buchhaltung\Rechnungsausgang
; Findet auch: \2026\04\RE-12345.pdf

MCP Server (KI)

SQL2REST kann als MCP-Server für KI-Assistenten genutzt werden. 15 Tools und 2 Resources stehen zur Verfügung.

bash
sql2rest.exe --mcp

Voraussetzung: Die API muss als Windows-Dienst laufen. Der MCP-Server liest den API-Schlüssel aus config.ini.

Claude Desktop Konfiguration

json
{
  "mcpServers": {
    "sql2rest": {
      "command": "C:\\SQL2REST\\sql2rest.exe",
      "args": ["--mcp"]
    }
  }
}

Verfügbare Tools

search_customers get_customer list_orders get_order get_order_items list_invoices get_invoice_pdf search_products get_product get_stock list_shipments sync_orders sync_customers list_attributes filter_products_by_attribute

Kompatibel mit: Claude Desktop, Claude Code, Cursor, Windsurf, ChatGPT Desktop und jedem MCP-Client.

Aktualisierung

SQL2REST enthält ein Auto-Update. Einfach update.bat als Administrator ausführen. Das Skript prüft auf neue Versionen, lädt das Update herunter, verifiziert die Integrität (SHA-256) und wendet es automatisch an.

Update-Benachrichtigung

Wenn eine neue Version verfügbar ist, zeigt der Setup-Wizard automatisch einen Hinweis an. Öffnen Sie den Wizard über StartWizard.bat. Das Banner erscheint zwischen Header und Schritt-Anzeige.

Auto-Update (empfohlen)

  1. Rechtsklick auf update.bat → „Als Administrator ausführen"
  2. Versionsvergleich prüfen und mit Y bestätigen

Manuelles Update (offline)

  1. Laden Sie die neueste Version aus Ihrem Dashboard herunter
  2. Führen Sie als Administrator aus: update.bat C:\Pfad\zur\sql2rest-latest.zip

Was passiert

  • Prüft auf neue Versionen (Auto-Update) oder nutzt die angegebene ZIP-Datei
  • Dienst wird über NSSM gestoppt (Fallback: taskkill)
  • config.ini wird gesichert und nach dem Update wiederhergestellt
  • Download wird per SHA-256-Hash verifiziert
  • Dienst wird automatisch neu gestartet

Wenn kein Windows-Dienst installiert ist, wird sql2rest.exe direkt beendet. Nach dem Update müssen Sie das Programm manuell neu starten.

Bereinigung

Die Bereinigungsfunktion entfernt alle SQL-Views und den Read-Only SQL2REST-Datenbankbenutzer. Vollständig reversibel: führen Sie den Wizard erneut aus, um alles neu einzurichten.

  • Zugänglich über den Erfolgsbildschirm des Wizards
  • Erfordert Admin-SQL-Zugangsdaten (der config.ini-Benutzer ist Read-Only)
  • Optional: config.ini löschen, um in den Setup-Modus zurückzukehren

Fehlercodes

StatusBedeutung
200Erfolg
402Lizenz erforderlich oder Tarif-Limit überschritten
403Ungültiger API-Schlüssel
404Ressource nicht gefunden / Mandant nicht konfiguriert
500Datenbankfehler
503Setup erforderlich (Wizard unter /setup ausführen)

402-Antwortformat

json
{
  "detail": {
    "message": "Valid license required",
    "url": "https://sql2rest.com/jtl-wawi#pricing"
  }
}

Testversion

Die 30-Tage-Testversion wird automatisch beim Setup erstellt und hat folgende Einschränkungen:

MerkmalTrialBezahlt
Endpunkte/customers, /orders, /products, /syncAlle
Mandanten1Je nach Tarif
Laufzeit30 TageUnbegrenzt

Nicht verfügbare Endpunkte liefern Status 402 mit Upgrade-Link. Upgraden Sie unter /jtl-wawi#pricing.