Die Grenzen der beiden Shopware-APIs
500 gegen 100 Datensätze je Anfrage, zehn Minuten Tokenlaufzeit. Diese drei Zahlen entscheiden mehr über die Architektur einer Integration als jede Funktionsliste.
Funktionslisten beantworten die Frage „geht das?". Die Frage, die eine Integration teuer oder billig macht, ist eine andere: wie oft muss ich fragen?
Drei Zahlen
| Admin-API | Store-API | |
|---|---|---|
| Datensätze je Anfrage | 500 | 100 |
| Fehler ab | 501 | 101 |
| Tokenlaufzeit | 600 s | — |
Gemessen durch reale Aufrufe mit steigendem limit. Bei Überschreitung:
{
"code": "FRAMEWORK__QUERY_LIMIT_EXCEEDED",
"detail": "The limit must be lower than or equal to MAX_LIMIT(=500). Given: 501",
"source": { "pointer": "/limit" },
"meta": { "parameters": { "maxLimit": 500, "limit": 501 } }
}
Die Antwort nennt die erlaubte Obergrenze im Klartext — ein Client kann sie auslesen, statt sie zu raten. Das ist selten und angenehm.
In 6.6.10.6 und 6.7.13.1 identisch. Beide Grenzen sind keine Versionsfrage.
Was daraus folgt
Ein Katalog mit 10.000 Produkten:
| Weg | Anfragen | bei 200 ms je Anfrage |
|---|---|---|
| Admin-API, 500 je Seite | 20 | 4 Sekunden |
| Store-API, 100 je Seite | 100 | 20 Sekunden |
Das ist der Unterschied, der in der Architekturentscheidung zählt — nicht die Frage, ob ein Endpunkt existiert.
Und er verschärft sich mit der zweiten Zahl: 600 Sekunden Tokenlaufzeit. Ein Abzug, der länger dauert, muss den Token mitten im Lauf erneuern. Das ist kein Problem, wenn man es einplant, und eine sporadisch fehlschlagende Integration, wenn nicht.
Die Tokenantwort
{
"token_type": "Bearer",
"expires_in": 600,
"refresh_token": "def502…"
}
Zehn Minuten, mit refresh_token. Der richtige Umgang damit ist: Token
zwischenspeichern, Ablaufzeitpunkt mitführen, kurz vor Ablauf über das
refresh_token erneuern — und nicht bei jedem Aufruf neu anmelden.
Wer bei jedem Aufruf grant_type: password schickt, läuft in die
Ratenbegrenzung des OAuth-Endpunkts, die bei zehn Versuchen in zehn Sekunden
beginnt und eine Rücksetzfrist von vierundzwanzig Stunden hat. Das ist die
häufigste Ursache für Automatisierungen, die wochenlang laufen und dann ohne
erkennbaren Anlass abbrechen.
Fehler, die man lesen kann
Zwei Fälle provoziert:
Unbekanntes Feld im Filter
code: FRAMEWORK__UNMAPPED_FIELD
detail: Field "gibtEsNicht" in entity "product" was not found.
Feld und Entität werden benannt. Ein Tippfehler im Feldnamen ist damit in Sekunden gefunden.
Pflichtfeld fehlt beim Schreiben
pointer: /0/taxRate
detail: This value should not be blank.
Der Zeiger nennt den Index im Stapel und das Feld. Wer mehrere Datensätze auf einmal schreibt, weiß sofort, welcher davon.
Beides ist maschinell auswertbar. Eine Integration, die diese Antworten protokolliert statt nur den HTTP-Code, spart bei jeder Störung eine Analyserunde.
Die Entscheidung
| Fall | API | Grund |
|---|---|---|
| Nächtlicher Katalogabzug | Admin | 20 statt 100 Anfragen |
| Headless-Frontend | Store | Kundenkontext, und 100 je Seite reichen für ein Listing |
| Bestandsabgleich aus dem ERP | Admin, besser Sync | Schreiben im Namen des Shops |
| Produktsuche im eigenen Frontend | Store | die Suche arbeitet im Verkaufskanal |
| Einmalige Datenmigration | Admin | größere Seiten, kein Kundenkontext nötig |
Grenzen dieser Messung
Gemessen sind die Obergrenzen, nicht das Laufzeitverhalten an der Grenze. Ob 500 Datensätze je Anfrage bei großen Entitäten tatsächlich durchlaufen, hängt an PHP-Speicher, Laufzeitgrenze und der Zahl der geladenen Verknüpfungen — ein Produkt mit Übersetzungen, Preisen und Medien wiegt ein Vielfaches eines Steuersatzes.
Nicht gemessen wurden Antwortzeiten unter Last und das Verhalten hinter einem Reverse Proxy, der eigene Grenzen mitbringen kann.
Und die Tokenlaufzeit ist ein Konfigurationswert der Installation. 600 Sekunden sind der gemessene Wert beider Runtimes, nicht zwingend der Ihres Shops.
Häufige Fragen
- Wie viele Datensätze liefert die Shopware-API je Anfrage?
- Die Admin-API höchstens 500, die Store-API höchstens 100. Wer mehr anfragt, bekommt HTTP 400 mit dem Fehlercode FRAMEWORK__QUERY_LIMIT_EXCEEDED und der erlaubten Obergrenze in der Antwort.
- Wie lange gilt ein Admin-API-Token?
- 600 Sekunden, also zehn Minuten. Die Antwort enthält zusätzlich ein refresh_token, mit dem sich ein neuer Zugriffstoken holen lässt, ohne Benutzername und Passwort erneut zu senden.
- Warum ist die Store-API strenger begrenzt?
- Sie ist kundenseitig und über einen Zugangsschlüssel erreichbar, der im Quelltext jeder Storefront steht. Eine großzügige Obergrenze wäre dort ein leicht nutzbarer Hebel für Massenabzüge.
- Lässt sich das Limit erhöhen?
- Es ist eine Konstante im Kern, kein Konfigurationswert. Wer mehr Daten braucht, blättert — oder nimmt für Massenabzüge die Admin-API statt der Store-API.
