OnPremise API: Keine Daten aus API-Anbindung mittels externer APP

Morimus

Sehr aktives Mitglied
16. Mai 2019
552
119
Moin Thomas,
puh, ich kann da auch nur das mitteilen was ich erstmal aus den Logs erkenne.

Also miit -w JTL startet die API ja bereits:
SQL Server readiness check successful
Now listening on: http://127.0.0.1:5883
Application started


Das heißt "Profile standard not found" war offenbar nur der falsche Profilname.
Euer Profil heißt wohl JTL, nicht standard.

Der Server lauscht laut Log auf http, nicht https, und nur auf 127.0.0.1.
Teste daher direkt auf dem Wawi-Server:

curl -v http://127.0.0.1:5883/api/eazybusiness/info

Nicht:
curl https://...
und nicht von extern.

Wenn das lokal funktioniert, ist der nächste Schritt die Bind-Adresse.
- 127.0.0.1 = nur lokal auf demselben Server
- LAN-IP oder 0.0.0.0 = aus dem Netzwerk erreichbar

tldr:
Der Start mit -w JTL sieht nicht gescheitert aus.
Ihr testet wahrscheinlich gerade mit dem falschen Protokoll bzw. von der falschen Netzwerkseite.
 

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
Hallo Morimus,

danke für die Info, werde ich ausprobieren, aber beim Start mit -w JTL erscheinen Einträge im Terminal bzgl. eines versuchten connects und re-connects:


warn: JTL.Framework.EventBus.Mqtt.MqttMessageBroker[0]
No credentials available from provider - cannot connect broker 'wawi-tenant'
warn: JTL.Framework.EventBus.Mqtt.MqttMessageBroker[0]
Reconnect attempt 4 failed: No credentials available from provider
info: JTL.Framework.EventBus.Mqtt.MqttMessageBroker[0]
Reconnect attempt 5/unlimited in 14,927ms
 

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
Hallo Morimus,

OK, Anbindung läuft, leider aber immer noch keinen Scope für Kunden & Lieferscheine:


items (Artikel)✅ 20071.591 Artikel, echte Datensätze
salesOrders (Aufträge)✅ 200195.135 Aufträge, mit Billing-/Shipment-Adresse inkl. E-Mail
customers (Kunden)❌ 403Scope verweigert (unverändert ggü. altem Stand)
deliveryNotes (Lieferscheine)❌ 403Scope verweigert
Kernbefund: Die Daten sind echt und plausibel (71k Artikel, 195k Aufträge). Der einzige Wermutstropfen ist unverändert: customers + deliveryNotes geben 403 — das ist ein Scope-Problem in der JTL-App-Registrierung, das die neue Version nicht behoben hat.
 

Morimus

Sehr aktives Mitglied
16. Mai 2019
552
119
Kannst du für die beiden 403-Fälle jeweils den exakten Minimalrequest posten?

URL/Pfad:
z.B. GET /api/eazybusiness/v2/customers?pageSize=1
oder /api/eazybusiness/customers mit api-version Header

Alle Header ohne geheime Werte:
Authorization: Wawi <redacted>
x-appid: ...
x-appversion: ...
x-challengecode: ...
api-version: ... falls gesetzt
Accept: application/json

Den Response:
HTTP-Status, Body, relevante Header

Den Registration-Status mit GrantedScopes:
Bitte keine API-Key/Token!
aber GrantedScopes vollständig drinlassen.

Dann baue ich das nach und schaue was bei mir rauskommt.
 

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
Hallo Morimus,

hier die Antwort von unserer IT:

# JTL-WAWI API (OnPrem) — 403 bei /customers und /deliveryNotes
**Server-Version (aus dem OpenAPI-`info`-Block):** JTL-Wawi **2.0.5+Sha.e539cce**
(`x-application-version: 2.0.5.0`, OpenAPI-`version: 1.2`), Kestrel, Mount `/api/eazybusiness`,
Version in der Route (`/v1/...`). Auth-Schema: `securitySchemes.Wawi = { type: apiKey,
name: Authorization, in: header }`.
## Gemeinsame Header beider Requests (Secrets maskiert)
```
Authorization: Wawi <redacted>
x-appid: horologica-1
x-appversion: 1.1
x-challengecode: XXXXX-XXX-XXXX (auskommentiert)
Accept: application/json
```
(kein `api-version`-Header — Version steckt in der Route. `x-runas` NICHT gesetzt.)
## Fall 1 — GET /api/eazybusiness/v1/customers?pageSize=1 → 403
```
HTTP 403 | server: Kestrel | date: Thu, 09 Jul 2026 13:48:04 GMT
(kein WWW-Authenticate, kein x-error-Header) | Body: leer (0 bytes)
```
Von der Spec geforderte Scopes für **GET /customers**:
```
["customer.querycustomers", "all.read", "cusomters.read"]
```
→ enthält den **Typo `cusomters.read`**, NICHT `customers.read`.
## Fall 2 — GET /api/eazybusiness/v1/deliveryNotes?pageSize=1 → 403
```
HTTP 403 | server: Kestrel | date: Thu, 09 Jul 2026 13:48:04 GMT
(kein WWW-Authenticate, kein x-error-Header) | Body: leer (0 bytes)
```
Von der Spec geforderte Scopes für **GET /deliveryNotes**:
```
["deliverynote.querydeliverynotes", "all.read", "deliverynotes.read"]
```
→ fordert `deliverynotes.read`, NICHT `deliveries.read`.
## GrantedScopes unserer App
Die direkte Granted-Liste ist nicht mehr abrufbar: `GET /v1/authentication/{registrationId}` zu
unserer ursprünglichen registrationId liefert inzwischen **404** (Registrierung abgeschlossen).
Daher **aus dem Live-Verhalten abgeleitet** (ein 200 beweist, dass mind. einer der vom Endpunkt
ODER-verknüpft geforderten Scopes granted ist):
| Endpunkt (GET) | HTTP | von der Spec geforderte Scopes (ODER-verknüpft) |
|----------------|------|--------------------------------------------------|
| /v1/items | **200** | item.queryitems, all.read, **items.read** |
| /v1/salesOrders | **200** | salesorder.querysalesorders, all.read, **salesorders.read** |
| /v1/customerGroups | **200** | customergroup.querycustomergroups, all.read, **customers.read** |
| /v1/customerCategories | **200** | customercategory.querycustomercategories, all.read, **customers.read** |
| /v1/shippingMethods | **200** | shippingmethod.queryshippingmethods, all.read, **deliveries.read** |
| /v1/customers | **403** | customer.querycustomers, all.read, **cusomters.read** |
| /v1/deliveryNotes | **403** | deliverynote.querydeliverynotes, all.read, **deliverynotes.read** |
**Belegbar granted** (weil je ein 200-Endpunkt genau diesen Scope fordert):
`customers.read`, `deliveries.read`, `items.read`, `salesorders.read`.
## Kern-Befund /customers — der Typo hängt NUR an der Collection
In unserer 2.0.5 fordern **alle anderen** customer-Endpunkte bereits den **korrigierten**
`customers.read` — z. B.:
```
GET /customers/{id}/contacts -> ["customer.querycustomercontacts", "customers.read"]
GET /customers/{id}/bankaccounts -> ["customer.querycustomerbankaccounts", "customers.read"]
GET /customers/customfields -> ["customer.querycustomercustomfields", "customers.read"]
GET /customers/workflowEvents -> ["customer.querycustomerworkflowevents", "customers.read"]
GET /customerGroups, /customerCategories -> [..., "customers.read"] (liefern bei uns 200)
```
**Einzig** die Haupt-Collection **GET /customers** trägt noch den Typo `cusomters.read`.
Beide Scope-Namen existieren in der Spec-Gesamtliste (`cusomters.read` UND `customers.read`).
→ Euer früherer Hinweis („Typo in einer Version gefixt, korrigierten zusätzlich bereitgestellt;
Scopes sind ODER-verknüpft, nie UND") bezog sich noch auf unsere **damaligen Versuche mit API 1.1**.
**Wir sind inzwischen auf Wawi 2.0.5 / OpenAPI 1.2** — und in DIESER aktuellen Version hängt der Typo
`cusomters.read` an der `/customers`-Collection **weiterhin**, während alle Sub-Endpunkte bereits den
korrigierten `customers.read` fordern. Da ODER-verknüpft, greift unser (granted) `customers.read`
überall — **außer an GET /customers selbst**, weil dort der korrigierte Scope in der Accept-Liste
dieses einen Endpunkts noch fehlt (nur `cusomters.read`). Der Collection-Fix scheint also selbst in
2.0.5 noch nicht angekommen zu sein.

## Kern-Befund /deliveryNotes — zwei getrennte Scope-Familien
Die Spec führt `deliveries.*` und `deliverynote(s).*` als **getrennte** Familien
(`deliveries.read` vs. `deliverynotes.read`) — deckt sich mit dem Hinweis, dass `deliveries` die
reine Versand-API ist und hier „2 getrennte Namings statt einem aggregierenden" existieren.
Wir haben `deliveries.read` (→ /shippingMethods = 200), aber `/deliveryNotes` fordert
`deliverynotes.read` → 403.

## Fragen

Kontext: Ein Typo-Fix-Hinweis bezog von Marc Völker/JTL sich auf unsere **früheren Versuche mit API 1.1**. Wir laufen
jetzt auf **Wawi 2.0.5 / OpenAPI 1.2** und melden den Stand DIESER Version.
1. **/customers:** In 2.0.5 trägt GET /customers (Collection) noch den Typo `cusomters.read`, während
alle Sub-Endpunkte bereits `customers.read` nutzen. Ist der Collection-Fix in einer Version **> 2.0.5**
enthalten (ab welcher)? Oder sollen wir bis dahin `cusomters.read` zusätzlich mitregistrieren,
damit GET /customers greift?
2. **/deliveryNotes:** Bestätigt ihr, dass wir zusätzlich `deliverynotes.read` (statt/neben
`deliveries.read`) registrieren müssen?
3. (Randnotiz 401 vs. 403: bei uns kommt in 2.0.5 durchgängig **403** bei Scope-Fehlern — passt zu
eurer Erwartung.)
 

Morimus

Sehr aktives Mitglied
16. Mai 2019
552
119
Mit dem neuen Auszug ist es ziemlich klar.

1. /deliveryNotes
Für Lieferscheine braucht ihr zusätzlich deliverynotes.read.
deliveries.read reicht dafür nicht.
Das sieht man auch daran dass /shippingMethods mit deliveries.read läuft, /deliveryNotes aber deliverynotes.read fordert.

2. /customers
Euer lokaler OpenAPI Auszug ist der entscheidende Punkt.
Wenn GET /customers in eurer Wawi 2.0.5 tatsächlich nur

customer.querycustomers
all.read
cusomters.read

fordert, aber nicht customers.read, dann erklärt das den 403.
Dann ist der Tippfehler Scope in genau diesem Collection Endpunkt noch aktiv.

Ich würde neu registrieren mit mindestens:

items.read
salesorders.read
customers.read
cusomters.read
deliverynotes.read

Falls cusomters.read oder customer.querycustomers beim Registrieren abgelehnt wird, habt ihr ein sehr sauberes JTL-Ticket.
Der Endpoint fordert lokal einen Scope, den die Registrierung nicht akzeptiert.
 

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
Hallo Morimus,

vielen Dank – dein Tipp war goldrichtig und hat es gelöst! 🎉

Wir haben wie von dir vorgeschlagen neu registriert (neue AppId) mit den Scopes:

items.read
salesorders.read
customers.read
cusomters.read
deliverynotes.read

Ergebnis: cusomters.read wurde bei der Registrierung anstandslos akzeptiert, und damit greift GET /customers jetzt. Beide vorher blockierten Endpunkte liefern nun 200:

GET /v1/customers -> 200
GET /v1/deliveryNotes -> 200

Damit ist genau deine Vermutung bestätigt: In unserer Wawi 2.0.5 fordert der /customers-Collection-Endpunkt intern noch den Tippfehler-Scope cusomters.read – ohne den registrierten Typo-Scope bleibt es beim 403, mit ihm klappt es. Und für /deliveryNotes war, wie du sagtest, zusätzlich deliverynotes.read nötig (deliveries.read reicht nicht).

Wir geben den Typo-Scope-Fund als sauberes Ticket an JTL weiter, damit der /customers-Endpunkt künftig den korrekten customers.read prüft.

Nochmals danke für die schnelle und präzise Hilfe – top!

Viele Grüße Thomas
 

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
Ganz vergessen - nochmal die Frage nach dem Start von JTL.Wawi.Rest.Server.exe als Dienst - es gibt zwar einen Parameter (ich glaube -s) dafür, aber dieser ist (natürlich auch) nicht dokumentiert.
 

Morimus

Sehr aktives Mitglied
16. Mai 2019
552
119
Moin Thomas,
ja, super!
Freut mich, dass es jetzt funktioniert.

Ich möchte für die Nachwelt noch ergänzen, dass es weitere Tippfehler im API-Vertrag und in der Dokumentation gibt:

ItemWeigth statt ItemWeight: Artikelgewicht im JSON-Modell. Hier muss tatsächlich der fehlerhafte Feldname verwendet werden.
Delievered statt Delivered: Bezeichnung im SalesOrder-Workflow-Enum.
Splittet statt Split: ebenfalls im SalesOrder-Workflow-Enum.
availabilites statt availabilities: in den Beschreibungen der Availability-Endpunkte. Das ist redaktionell und hat keine Laufzeitauswirkung.

Je nachdem, was ihr genau baut und welche Daten euch fehlen, kann für ein reines Dashboard auch ein lesender Zugriff auf die Datenbank sinnvoll sein, wie der Servicepartner upbox bereits erwähnt hat.
Schreibzugriffe würde ich allerdings nicht direkt über die Datenbank durchführen.
Außerdem muss man bei Datenbankzugriffen damit rechnen, dass sich Tabellen und Strukturen durch Wawi-Updates ändern können.

Da ihr bereits Wawi 2.0 einsetzt, könntet ihr zusätzlich prüfen, ob eine Anbindung über JTL Cloud für euch infrage kommt.
Das ist vor allem interessant, wenn das Dashboard außerhalb eures Netzwerks betrieben wird.

Zum Dienst:
Ich würde den -s-Parameter vorerst nicht verwenden.

Die Kommandozeilendokumentation nennt zwar das Unterkommando install, verwendet aber noch den alten Dateinamen JTL.Wawi.Rest.exe.
Ob das unverändert für JTL.Wawi.Rest.Server.exe gilt, kann ich nicht bestätigen.

Ich würde deshalb den offiziell vorgesehenen Weg über den JTL-Administrator nehmen und den Server darüber als Dienst einrichten.
 

mvh

Sehr aktives Mitglied
26. Oktober 2011
1.157
444
Ganz vergessen - nochmal die Frage nach dem Start von JTL.Wawi.Rest.Server.exe als Dienst - es gibt zwar einen Parameter (ich glaube -s) dafür, aber dieser ist (natürlich auch) nicht dokumentiert.
Code:
// CloudOptionsBase
--cloudConnected
// GenerateOptions
Verb: generate
// InstallServiceVerbOptions
Verb: install
// NamedVerbOptions
--instanceName
// OptionsBase
// ProfileOptionsBase
--profile
// StartServiceVerbOptions
Verb: start
// StartupOptions
Verb: run
// StopServiceVerbOptions
Verb: stop
// UninstallServiceVerbOptions
Verb: uninstall

Hilfe:
 -w, --profile              Required. Profilname, der bei der Installation von JTL-Wawi angegeben wurde
 --cloudConnected           Die JTL-Wawi API wird über die Cloud Erreichbar gemacht.
  -l, --listeninterface      (Default: 0.0.0.0) Interface, auf welchem die JTL-Wawi API erreichbar sein soll
  --port                     (Default: 5883) Port, über den die JTL-Wawi API erreichbar sein soll
  -d, --database             (Default: eazybusiness) Profilname, der bei der Installation von JTL-Wawi angegeben wurde
  --dev                      (Default: false) Server im Entwicklermodus starten (bspw. für umfangreichere
                             Protokollierung)
  --tele
  --certificateThumbprint    Der Fingerabdruck eines SSL Zertifikats, um die Wawi-API über https erreichbar zu machen
  -s, --service              Run the application as service.
  -c, --console              Starts the application as consolen app.
  --instanceName             The name of the instance.
  --help                     Display this help screen.
  --version                  Display version information.
 
  • Gefällt mir
Reaktionen: Morimus

EW Hamburg

Aktives Mitglied
12. Juli 2010
96
16
>>

Ich möchte für die Nachwelt noch ergänzen, dass es weitere Tippfehler im API-Vertrag und in der Dokumentation gibt:

ItemWeigth statt ItemWeight: Artikelgewicht im JSON-Modell. Hier muss tatsächlich der fehlerhafte Feldname verwendet werden.
Delievered statt Delivered: Bezeichnung im SalesOrder-Workflow-Enum.
Splittet statt Split: ebenfalls im SalesOrder-Workflow-Enum.
availabilites statt availabilities: in den Beschreibungen der Availability-Endpunkte. Das ist redaktionell und hat keine Laufzeitauswirkung.
<<

Man sollte Diplom-Legastheniker kritische Software-Produkte vielleicht doch nicht pflegen lassen.
 
Ähnliche Themen
Titel Forum Antworten Datum
Neu Ab welcher JTL Wawi Version ist der OnPremise REST API Endpoint POST /v2/returns oder POST /v1/returns für Create Return verfügbar? Schnittstellen Import / Export 0
Neu [API] Zahlungen bei salesOrders verbuchen Schnittstellen Import / Export 0
API-Endpunkt Rechnungskorrekturen-PDF JTL-Wawi 2.0 1
Neu Anpassung DPD API JTL-ShippingLabels - Ideen, Lob und Kritik 3
API 2.1 für OnPrem? JTL-Wawi 2.0 6
Neu JTL REST API (on premise) - welche API Version ab welcher Wawi-Version? Changelog? Schnittstellen Import / Export 0
Bessere Greyhound-Anbindung ab 1.10 - JTL-API-Pflicht? JTL-Wawi 1.10 12
Neu VCS Lite / IDU blockiert – Aufträge fälschlich unter "Externe Rechnungen" (Amazon API Fehler) Amazon-Anbindung - Fehler und Bugs 9
API Schnittstelle langsam JTL-Wawi 1.11 0
Nach Update auf Wawi 2.0.X, API v1 Fehler JTL-Wawi 2.0 9
JTL reaktiviert keine Angebote mehr auf Otto Otto.de - Anbindung (SCX) 1
Neu Seit heute Morgen werden bei Amazon keine Rechnungen mehr hochgeladen Amazon-Anbindung - Fehler und Bugs 10
Neu Ameise-Export "Buchungsdaten → Rechnungen" exportiert keine Amazon VCS OSS-Rechnungen (POLU /Bestellungen europäisches Ausland) JTL-Ameise - Fehler und Bugs 3
Neu seit 5.7.2 keine Dashboarddaten JTL-Shop - Fehler und Bugs 2
Neu Shop zeigt keine Artikel mehr Fehler 500 Betrieb / Pflege von JTL-Shop 9
Neu keine Daten seit DHL Versenden 4.0 JTL-Track&Trace - Fehler und Bugs 4
Neu Keine Verbindung zu Siwssbit TSE möglich JTL-POS - Fehler und Bugs 0
Neu Keine Warenpost Int. Labels hsCode - Fehler? JTL-ShippingLabels - Fehler und Bugs 8
Neu Umstellung auf Jera Datev Schnittstelle - keine Kundennummer im Kundencenter Schnittstellen Import / Export 2
Neu Keine Labels für Warenpost international über Packtisch JTL-ShippingLabels - Fehler und Bugs 8
Eigener Drittshop-Connector (jtl/connector 5.3): valide Variationskombinationen werden mit „besitzt keine Variationen" nicht gesendet JTL-Wawi 1.11 1
Nach Wawi Update keine Fehlermeldung mehr sichtbar kaufland.de - Anbindung (SCX) 2
Nach Update auf 2.0.3 Keine Fehlermeldungen mehr sichtbar Otto.de - Anbindung (SCX) 3
Neu eBay-Abgleich Fehlermeldung: Datenverarbeitung fehlgeschlagen: Die Sequenz enthält keine Elemente eBay-Anbindung - Fehler und Bugs 8
Neu Es werden keine Marken ausgedruckt und die Portokasse lässt keine Anmeldung zu. Smalltalk 5
Neu DHL-4.0 keine Labels JTL-ShippingLabels - Fehler und Bugs 12
Einrichtung ZUGFeRD, es lassen sich keine Rechnungen "Speichern" JTL-Wawi 1.11 2
WAWI 2.0.0 erkennt keine Updates JTL-Wawi 2.0 1
Keine Datenübertragung trotz bestehender Verbindung und funktionierendem Server JTL-Wawi 2.0 35
Mindestabnahme Lieferant - keine Kommazahlen erlaubt - Wie gehts? JTL-Wawi 1.11 0
Keine Rückmeldung in JTL Wawi sobald SQL Server Memory durch Database Cache ausgeslastet ist JTL-Wawi 2.0 9
Neu Nach Update auf JTL-Wawi 2.0.3 keine WMS-Lager mehr auswählbar – Versand komplett blockiert JTL-Wawi 2.0 3
Neu Keine Adressvalidierung bei DHL Versenden 4.0? JTL-ShippingLabels - Ideen, Lob und Kritik 5
Neu keine Kontakt Absender/Empfänger bei DHL Versenden 4.0 JTL-ShippingLabels - Ideen, Lob und Kritik 4
Neu Klarna konnte mit den angegebenen Daten keine Sitzung erstellen. Einige Feldbedingungen wurden verletzt. Betrieb / Pflege von JTL-Shop 0
AboutYou keine Felder für GPSR Daten SCX-(Ninepoint)-Anbindungen 0
Neu Angeblich noch keine Verknüpfung mit DPD Meta ??? JTL-ShippingLabels - Fehler und Bugs 1
Neu JTL Pos liest keine Verkäufe mehr ein nach Update Einrichtung / Updates von JTL-POS 0
Neu Zahlung zugewiesen, aber keine Rechnung wird angezeigt User helfen Usern - Fragen zu JTL-Wawi 2

Ähnliche Themen