Aperçu
Que vous réajustiez vos propres prix ou suiviez ceux de vos concurrents, connaître les prix Amazon en temps réel est essentiel. Ce workflow s'exécute chaque matin, recherche votre liste de produits sur Amazon via Scavio, enregistre les prix actuels, les compare à votre référence et vous alerte de tout changement au-dessus de votre seuil. Il suit également la disponibilité des stocks pour vous informer lorsqu'un concurrent est en rupture. La surveillance de 20 produits par jour coûte environ 0,10 $ en crédits.
Déclencheur
Cron 6h UTC tous les jours
Planification
Tous les jours à 6h
Étapes du workflow
Charger la liste de surveillance des produits
Lire la liste des ASIN Amazon ou des noms de produits à suivre à partir d'un fichier de configuration JSON.
Rechercher sur Amazon via Scavio
Pour chaque produit, appeler la recherche Scavio sur Amazon et extraire le prix actuel et la disponibilité.
Comparer avec la référence
Charger les prix précédents depuis le stockage et calculer la variation absolue et en pourcentage.
Détecter les changements significatifs
Filtrer les produits dont le prix a changé de plus que le seuil configuré (par défaut 3%).
Envoyer des alertes
Envoyer des notifications de changement de prix vers Slack, email ou un webhook pour une action immédiate.
Mettre à jour l'historique des prix
Ajouter les prix du jour à la base de données historique pour l'analyse des tendances.
Implémentation Python
import requests, os, json
from pathlib import Path
from datetime import date
API_KEY = os.environ["SCAVIO_API_KEY"]
SH = {"x-api-key": API_KEY, "Content-Type": "application/json"}
THRESHOLD = 0.03
WATCHLIST_FILE = Path("amazon_watchlist.json")
HISTORY_FILE = Path("amazon_price_history.jsonl")
BASELINE_FILE = Path("amazon_baseline.json")
def search_amazon(query: str) -> dict:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=SH,
json={"query": query, "platform": "amazon"},
timeout=15,
)
resp.raise_for_status()
data = resp.json()
if data.get("organic"):
top = data["organic"][0]
return {"title": top.get("title", ""), "price": top.get("price"), "in_stock": top.get("in_stock", True), "url": top.get("url", "")}
return {}
def run():
watchlist = json.loads(WATCHLIST_FILE.read_text())
baseline = json.loads(BASELINE_FILE.read_text()) if BASELINE_FILE.exists() else {}
alerts = []
today_prices = {}
for item in watchlist:
slug = item["slug"]
result = search_amazon(item["query"])
current_price = result.get("price")
today_prices[slug] = {"price": current_price, "in_stock": result.get("in_stock"), "title": result.get("title", "")}
prev_price = baseline.get(slug, {}).get("price")
if current_price and prev_price:
change_pct = (current_price - prev_price) / prev_price
if abs(change_pct) >= THRESHOLD:
direction = "UP" if change_pct > 0 else "DOWN"
alerts.append(f"{direction} {abs(change_pct)*100:.1f}%: {item['query']} ${prev_price} -> ${current_price}")
prev_stock = baseline.get(slug, {}).get("in_stock", True)
if prev_stock and not result.get("in_stock", True):
alerts.append(f"OUT OF STOCK: {item['query']}")
BASELINE_FILE.write_text(json.dumps(today_prices, indent=2))
with open(HISTORY_FILE, "a") as f:
f.write(json.dumps({"date": str(date.today()), "prices": today_prices}) + "\n")
print(f"Monitored {len(watchlist)} products on {date.today()}")
for a in alerts:
print(f" ALERT: {a}")
run()Implémentation JavaScript
const SH = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const THRESHOLD = 0.03;
const watchlist = JSON.parse(fs.readFileSync('amazon_watchlist.json', 'utf8'));
let baseline = {};
try { baseline = JSON.parse(fs.readFileSync('amazon_baseline.json', 'utf8')); } catch {}
async function searchAmazon(query) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:SH, body:JSON.stringify({query, platform:'amazon'})});
const data = await r.json();
if (data.organic && data.organic.length > 0) {
const top = data.organic[0];
return {title:top.title||'', price:top.price, inStock:top.in_stock!==false, url:top.url||''};
}
return {};
}
const alerts = [];
const todayPrices = {};
for (const item of watchlist) {
const result = await searchAmazon(item.query);
todayPrices[item.slug] = {price:result.price, inStock:result.inStock, title:result.title};
const prev = baseline[item.slug] || {};
if (result.price && prev.price) {
const changePct = (result.price - prev.price) / prev.price;
if (Math.abs(changePct) >= THRESHOLD) {
alerts.push((changePct>0?'UP':'DOWN')+' '+(Math.abs(changePct)*100).toFixed(1)+'%: '+item.query+' $'+prev.price+' -> $'+result.price);
}
}
if (prev.inStock && !result.inStock) alerts.push('OUT OF STOCK: '+item.query);
}
fs.writeFileSync('amazon_baseline.json', JSON.stringify(todayPrices, null, 2));
fs.appendFileSync('amazon_price_history.jsonl', JSON.stringify({date:new Date().toISOString().split('T')[0], prices:todayPrices})+'\n');
console.log('Monitored '+watchlist.length+' products');
alerts.forEach(a => console.log(' ALERT: '+a));Plateformes utilisées
Amazon
Recherche de produits avec prix, notes et avis