Créer un bot de suivi de prix en Python (Amazon + Google Shopping)
Découvrez des produits, suivez le prix des ASIN, stockez l'historique dans SQLite et recevez une alerte en cas de baisse. Coût réel par produit, août 2026.
Un bot de suivi de prix comporte quatre parties : trouver les produits à surveiller, vérifier leur prix selon un calendrier, stocker l’historique, et prévenir quelqu’un quand le prix baisse. Voici les quatre, avec le calcul des crédits pour une taille de bot réaliste.
Étape 1 : découvrir des produits par la recherche
Partez d’une catégorie ou d’un mot-clé, pas d’une liste saisie à la main. L’endpoint de recherche /amazon renvoie des produits organiques avec asin, price, extracted_price et les données de notation pour 1 crédit par requête :
import re
import requests
API_KEY = "faf_live_..." # votre clé FastAF
def discover(query, domain="com", pages=1):
products = []
for page in range(1, pages + 1):
resp = requests.get(
"https://api.fastaf.co/v1/amazon",
params={"query": query, "domain": domain, "page": page},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
products.extend(
item for item in resp.json()["results"]
if item["type"] == "search_product"
)
return products
candidates = discover("mechanical keyboard")
watchlist = [p["asin"] for p in candidates if p.get("stars", 0) >= 4.0]
Exécutez ceci une fois par catégorie pour construire votre liste de suivi, puis passez à l’endpoint produit pour le suivi proprement dit. Les résultats de recherche peuvent se réordonner entre deux requêtes, les ASIN non.
Étape 2 : suivre le prix par ASIN
resource=product récupère la fiche complète d’un ASIN, avec le prix actuel, la disponibilité et le vendeur de la buybox, pour 1 crédit :
def check_price(asin, domain="com"):
resp = requests.get(
"https://api.fastaf.co/v1/amazon",
params={"resource": "product", "asin": asin, "domain": domain},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
# resource=product renvoie un seul objet plat (title, price, ...), pas une liste results.
# Son champ price est une chaîne d'affichage du type "$25.49 with 40 percent savings" (vérifié en août 2026).
product = resp.json()
match = re.search(r"[\d][\d.,]*", product.get("price") or "")
price = float(match.group().replace(",", "")) if match else None
return price, product.get("title")
Étape 3 : stocker l’historique dans SQLite
import sqlite3
import time
conn = sqlite3.connect("prices.db")
conn.execute("""
CREATE TABLE IF NOT EXISTS price_history (
asin TEXT,
price REAL,
checked_at INTEGER
)
""")
def record_price(asin, price):
conn.execute(
"INSERT INTO price_history VALUES (?, ?, ?)",
(asin, price, int(time.time())),
)
conn.commit()
def last_price(asin):
row = conn.execute(
"SELECT price FROM price_history WHERE asin = ? ORDER BY checked_at DESC LIMIT 1",
(asin,),
).fetchone()
return row[0] if row else None
Étape 4 : planifier les vérifications et alerter en cas de baisse
Une tâche cron (ou une simple boucle avec time.sleep, si vous n’êtes pas sur une machine avec cron) qui parcourt la liste de suivi et compare avec le dernier prix stocké :
def run_check(watchlist, threshold_pct=5):
for asin in watchlist:
price, title = check_price(asin)
if price is None:
continue
previous = last_price(asin)
record_price(asin, price)
if previous and price < previous * (1 - threshold_pct / 100):
drop_pct = round((1 - price / previous) * 100, 1)
alert(f"{title}: ${previous:.2f} -> ${price:.2f} ({drop_pct}% off)")
def alert(message):
print(message) # remplacez par un e-mail, un webhook Slack, ce que vous consultez réellement
Planifiez run_check(watchlist) comme cela vous convient : cron, timer systemd, ou worker planifié si vous déployez ceci sur une plateforme serverless. Vérifier quelques fois par jour suffit pour la plupart des produits de consommation ; toutes les heures est excessif, sauf si vous chassez spécifiquement les offres flash.
Surveiller au-delà d’Amazon
Amazon n’est pas le seul endroit où un prix bouge. Pour une vérification de marché plus large, passez le nom du produit dans /serp, Google Search, et lisez les résultats organiques : quels revendeurs se positionnent sur le produit, et si un nouveau vendeur est entré dans les résultats, c’est un signal utile même sans flux shopping dédié :
def market_check(product_name, country="us"):
resp = requests.get(
"https://api.fastaf.co/v1/serp",
params={"query": f"{product_name} price", "country": country},
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=60,
)
resp.raise_for_status()
return [r["link"] for r in resp.json().get("organic_results", [])]
Cela coûte 5 crédits par produit et vaut la peine d’être exécuté chaque semaine, pas chaque jour : c’est pour repérer un nouveau concurrent ou un retrait de la vente, pas pour capter une variation de prix horaire.
Combien cela coûte-t-il réellement ?
Un bot concret : 200 ASIN suivis trois fois par jour, plus une vérification de marché hebdomadaire sur les mêmes 200 produits, plus 20 recherches de découverte par mois pour actualiser la liste de suivi.
| Tâche | Requêtes (30 jours) | Crédits chacune | Crédits (30 jours) |
|---|---|---|---|
| Vérifications de prix ASIN (200 x 3/jour) | 18 000 | 1 | 18 000 |
| Vérification de marché hebdomadaire (200 x 4) | 800 | 5 | 4 000 |
| Recherches de découverte | 20 | 1 | 20 |
| Total | ~22 020 |
Un pack Growth à 29 $ (75 000 crédits) en couvre plus de trois mois, ou un mois d’une liste de suivi passée au-delà de 600 ASIN. L’offre gratuite (500 crédits, sans carte) suffit pour faire tourner exactement ce bot sur une liste de 15 ASIN pendant une semaine avant de décider si cela vaut la peine de payer.
En bref
Découvrez avec la recherche, suivez avec l’endpoint produit, stockez chaque vérification même quand rien n’a changé (il vous faut l’historique pour calculer un pourcentage de baisse), et n’alertez qu’au-delà d’un seuil pour ne pas être dérangé pour une fluctuation de 0,01 $. Prévoyez environ 1 crédit par ASIN et par vérification : à ce tarif, suivre des centaines de produits chaque jour coûte quelques dollars pour un mois de vérifications. Liste complète des paramètres dans la documentation.