Produktpreise über Händler hinweg mit der Google Shopping API vergleichen
Den Preis-String selbst parsen, die Teile des Payloads verwerfen, die du nicht brauchst, und eng genug abfragen, um vergleichbare Angebote zu bekommen. Getestet im August 2026.

Du willst den Preis eines Produkts über jeden Händler hinweg, der es verkauft, für eine Vergleichsseite oder einen Repricing-Job, der eine Liste von SKUs mehrmals am Tag neu prüft. Einen Browser-Tab pro Wettbewerber zu öffnen skaliert nicht über eine Handvoll Produkte hinaus, und genau das ist die Art von repetitivem Nachschlagen, die stattdessen ein Skript übernehmen sollte.
Was /v1/shopping liefert
Schicke eine query an /v1/shopping und du bekommst shopping_results, eine Liste, in der jeder Eintrag ein title, eine source (der Händlername), einen Anzeige-price-String wie "$26.99", eine extracted_price-Zahl, eine product_id hat, und mehrere Felder, die du nicht brauchen wirst: thumbnail, original_thumbnail, page_token, immersive_url. Das kostet 10 Credits pro Call.
Eine breite Query bringt dir alles, was dasselbe Keyword enthält
Wie eng deine Query ist, entscheidet, wie brauchbar die Ergebnisse sind. Wir haben den Endpoint mit der zweiwortigen Query “web scraping api” aufgerufen und 40 Ergebnisse zurückbekommen. Nur ein paar davon waren Software- oder Datenprodukte, der Rest war größtenteils Werkzeug und Zubehör, dessen Titel oder Marke zufällig dieselben Wörter enthielt, darunter eine Imkerei-Werkzeuglinie namens “APIs Tactical”. Google Shopping matcht auf den Text der Query, nicht auf deine Absicht, also zieht ein breiter Kategoriebegriff alles heran, was auf die Wörter passt, nicht alles, was für die Kategorie relevant ist, die du im Kopf hattest.
Für eine Vergleichsseite oder einen Repricing-Job frag den exakten Produktnamen oder die Modellnummer ab, so wie du es in eine Shopping-Suche eintippen würdest, wenn du ein einziges, spezifisches Ergebnis erwartest. Prüfe dann, ob der Titel jeder Zeile wirklich wie dein Produkt aussieht, bevor du den Preis als Konkurrenzangebot behandelst, denn nichts in der Antwort garantiert, dass jede Zeile zum Thema passt.
Den Preis-String selbst parsen
extracted_price sieht wie das sichere Feld aus, eine reine Zahl statt eines Strings mit angehängtem Währungssymbol. In unserem Sample lag es einmal von 40 daneben: ein Listing, angezeigt als "$1,400.00", kam mit extracted_price gleich 1.4 zurück, um den Faktor tausend daneben, fast sicher, weil das Komma falsch gelesen wurde. Eine falsche Zeile von vierzig reicht, um eine Repricing-Entscheidung zu verfälschen, wenn nichts das abfängt. Parse den Anzeige-String selbst mit einer Regex, und behandle extracted_price bestenfalls als Hinweis.
import re
import requests
API_KEY = "faf_live_..." # dein FastAF-Key
def price_to_float(display):
digits = re.sub(r"[^0-9.]", "", display or "")
return float(digits) if digits else None
resp = requests.get(
"https://api.fastaf.co/v1/shopping",
params={"query": "web scraping api"},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
offers = [
{
"merchant": item["source"],
"price": price_to_float(item["price"]),
"title": item["title"],
}
for item in resp.json()["shopping_results"]
]
offers.sort(key=lambda o: (o["price"] is None, o["price"]))
for o in offers[:5]:
print(f'{o["price"]:>8.2f} {o["merchant"]:<24} {o["title"]}')
In unserem Sample waren die fünf günstigsten Angebote ein Alkohol-Tupfer und vier Stück Imkereiausrüstung, alle unter $8, keins davon ein Web-Scraping-Produkt. Das ist kein Parsing-Bug, das ist, was eine zweiwortige Query tatsächlich liefert: der Beweis, dass die Query spezifisch sein muss, bevor diese Liste für eine Vergleichsseite irgendetwas bedeutet.
Fast alles davon verwerfen
Die Beispielantwort, gegen die wir getestet haben, hatte 530.728 Bytes für 40 Ergebnisse. Feld für Feld machen allein thumbnail und original_thumbnail etwa 80 % dieser Bytes aus: base64-kodierte Bilder, für die ein Repricing-Job keine Verwendung hat. page_token und immersive_url sind interne Google-Referenzen, nur nützlich, um die Google-Shopping-Seite selbst wieder aufzubauen. Nichts davon gehört in eine Datenbankzeile, die nur beantworten muss, was ein Produkt gerade kostet.
Die List Comprehension oben erledigt das Verwerfen von selbst: Sie behält drei Felder pro Angebot und überlässt den Rest jedes shopping_results-Eintrags dem Garbage Collector. Bei einer Liste von SKUs, die mehrmals am Tag geprüft wird, summiert sich der Unterschied zwischen diesem Ansatz und dem wörtlichen Speichern jeder Antwort schnell.
Was es kostet
Ein Call kostet 10 Credits, 100 Produkte einmal am Tag zu prüfen sind also 1.000 Credits, etwa 30.000 im Monat: Die 75.000 Credits des $29-Growth-Pakets reichen dafür zweieinhalb Monate. Fehlgeschlagene Anfragen werden nicht berechnet.
Starte mit dem Free Tier, 500 Credits ohne Karte, gut für 50 Calls: genug, um zu sehen, wie die Händlerabdeckung für die konkreten Produkte, die dich interessieren, tatsächlich aussieht, bevor du einen Repricing-Job drumherum baust.