Status Code 429 too many requests - Probleme der neuen Amazon Partnernet API PA API 5.0

Viele Webseiten-Betreiber nutzen den Amazon Partnernet Service, um auf Amazon-Produkte zu verlinken und sich etwas Geld durch Provisionen dazu zu verdienen. Hierbei kann man die Links manuell erstellen und auf der eigenen Webseite verlinken oder man bedient sich der PA API, sprich eine Schnittstelle von Amazon, um Produktinformationen abzurufen und das ganze zu automatisieren. Sehr wahrscheinlich wurde in der Vergangenheit zu sehr Schindluder betrieben und die Partnernet-API mißbraucht, um kostenlos an Produktdaten und -bilder zu gelangen. Was die genauen Gründe sind, weiß nur Amazon, aber das Ergebnis ist, dass der Zugriff auf die neue Schnittstelle PA API 5.0 sehr restriktiv ist. So ist die Anzahl der Zugriffe (Status Code 429 - too many requests) begrenzt und Accounts, die innerhalb von 30 Tagen keinen Umsatz erwirtschaftet haben, werden deaktiviert.Kurz gefasst: Amazon möchte sich von kleinen und unrentablen Partnern trennen. Nachvollziehbar, denn eine solch komplexe API kostet nun einmal Resourcen.

Amazon PA API 5.0 Product Advertising API

Wir geben in diesem Artikel einige Hilfestellungen bei der Umstellung der alten PA API 4.0 auf die neue PA API 5.0 API.

Migration PA API 4.0 auf 5.0

Die Migration ist hier beschrieben. Eine weitere gute Anleitung ist: https://webservices.amazon.com/paapi5/documentation/migration-guide.html

Zuerst muss man sich neue Zugangsdaten besorgen, da die alten mit der neuen PA API 5.0 API nicht mehr gültig sind. Diese sind problemlos mit der alten PA API 4.0 API "kompatibel", so dass man diesen Schritt auch vorher umsetzen kann.

Die Credentials zu finden, ist etwas schwerer als gedacht. Dazu loggt man sich im Partnernet ein und klickt unter TOOLS auf Product Advertising API: https://partnernet.amazon.de/assoc_credentials/home

Nun muss man sich mit der neuen API vertraut machen. Hierfür bietet Amazon ein Scratchpad an, wo man on-the-fly mit den Credentials Abfragen an die API schicken kann: https://webservices.amazon.com/paapi5/documentation/migration-guide.html

In unserem Fall funktioniert die Nutzung bzw. die Produktabfrage immer in zwei Schritten:

  • SearchItems: suche mithilfe eines Suchbegriffs
  • GetItems: für jeden Treffer holen wir uns die Produktdetails

Wir sparen uns eine tiefgreifende Erläuterung, da es Aufgabe des Entwicklers ist, die Abfrage der API zu programmieren und an die persönlichen Bedürfnisse anzupassen.

Das Problem mit Status Code 429 too many requests

Amazon führt mit der PA API 5.0 so genannte API-Rates ein: https://webservices.amazon.com/paapi5/documentation/troubleshooting/api-rates.html

Hiermit werden die Zugriffe limitiert:

  • 1 Zugriff pro Sekunde
  • 8640 Zugriffe am Tag

Für uns Entwickler bedeutet dies, dass wir nicht unbegrenzt die API aufrufen können, was den Einsatz der Amazon Product Advertising API sehr stark eingrenzt. Verwendet man kein Caching, wird bei jedem Seitenaufruf die API verwendet und schneller als man denkt sind die 8640 API Requests verbraucht. Ein Skandal! Aber wir zeigen später eine Möglichkeit, wie man dieses Thema umgehen kann.

Status Code 429 - Ursache Nr 1. falsche Region

Während der Entwicklung trat sofort der Fehler bzgl. des Status Codes 429 auf:

PHP Fatal error:  Uncaught exception 'Exception' with message 'ERROR aws PA-API5: awsSearchItems(). fopen(https://webservices.amazon.com/paapi5/searchitems): failed to open stream: HTTP request failed! HTTP/1.1 429 Too Many Requests
Selbst bei der Verwendung des Scratchpads verhinderte der Status Code 429 jeglichen Test. Ursache war hier, dass die falsche Region (US anstatt EU) verwendet wurde. Der Fehler war an dieser Stelle irreführend.

Bei der Abfrage also bitte prüfen, ob

  • host = webservices.amazon.de und nicht .com gesetzt ist
  • region = eu-west-1
  • Marketplace = www.amazon.de

        $payload = "{"
. " \"Keywords\": \"$Keywords\","
. " \"SearchIndex\": \"Electronics\","
. " \"PartnerTag\": \"" . self::Associate_tag . "\","
. " \"PartnerType\": \"Associates\","
. " \"Marketplace\": \"www.amazon.de\""
. "}";
$host = "webservices.amazon.de";
$uriPath = "/paapi5/searchitems";

$awsv4 = new Aws(self::Access_Key_ID, self::Secret_Access_Key_ID);
$awsv4->setRegionName("eu-west-1");
$awsv4->setServiceName($serviceName);
Dasselbe auch im Scratchpad anpassen:

Status Code 429 - Ursache Nr 2. kein Caching

Nicht jeder Seitenaufruf muss zwingend einen Call an die Product Advertising API schicken. Wir speichern jedes Product von Amazon, welche bei der Suche gefunden wurde, in einer internen Datenbank. Erst nach 7 Tagen fragen wir erneut bei Amazon nach, ob sich Daten geändert haben. Das Prinzip ist wie folgt:

  • Suche nach "Geforce RTX 2080"
  • Ergebnis: ASIN 1, ASIN 2, ASIN 3 usw.
  • Frage Details für jede ASIN ab und speichere Daten in Datenbank ab
  • Nur wenn Datensatz älter als 7 Tage
  • Umsetzung mittels crawler

Somit werden in den meisten Fällen die Daten aus der internen Datenbank bezogen und die Anzahl der Anfragen an Amazon drastisch reduziert. Das erklärte Ziel von Amazon.

Caching der Amazon Partnernet APi
Alle Produkte werden in der Datenbank zwischengespeichert und erst nach 7 Tagen wieder abgefragt

Bei Hilfestellung einfach eine E-Mail an mschmidt@pc-erfahrung.de schicken oder uns im Forum www.pce-forum.de anfragen:

https://www.pce-forum.de/artikel-amazon-partnernet-upgrade-product-advertising-api-5-0-t29597.html