20 % de remise sur toutes les offres payantes avec le code

Python · Amazon

Suivre les prix Amazon avec Python

Les prix sur Amazon changent sans arrêt, et personne n'a envie d'ouvrir la même page produit tous les matins. Dans ce guide, vous écrivez un petit script qui le fait pour vous : il récupère le prix actuel des produits qui vous intéressent, consigne chaque vérification dans un fichier lisible par un tableur et vous prévient quand un prix passe sous le montant que vous êtes prêt à payer.

Vous n'avez pas à vous occuper de la page Amazon elle-même. everydata.io charge pour vous la page produit en direct et renvoie des données propres – titre, prix, devise, disponibilité – : le script reste court et ne casse pas quand Amazon modifie sa mise en page.

Mis à jour le · par everydata.io

Ce que vous aurez à la fin

  • Un script qui vérifie une liste de produits Amazon et ajoute chaque prix à prices.csv.
  • Un message quand un prix baisse ou atteint votre objectif.
  • Une exécution quotidienne planifiée, pour qu'il tourne sans vous.

Ce dont vous avez besoin

  • Python 3.10 ou plus récent et le paquet requests (pip install requests).
  • Une clé API everydata.io gratuite – créez-la ici.
  • L'ASIN de chaque produit : le code à 10 caractères qui suit /dp/ dans l'adresse Amazon.

01Gardez votre clé API hors du code

Connectez-vous, copiez votre clé depuis le tableau de bord et placez-la dans une variable d'environnement. Le script la lit à cet endroit : la clé ne se retrouve jamais dans un fichier que vous pourriez partager.

terminal
export EVERYDATA_API_KEY="ds_your_key"

02Recherchez un produit

Commencez par une seule requête pour voir ce qui est renvoyé. L'endpoint produit par ASIN prend l'ASIN et la marketplace (com pour amazon.com, de pour amazon.de, etc.).

first_request.py
import os

import requests

API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]

resp = requests.get(
    f"{API}/amz/amazon-lookup-product-by-asin",
    params={"asin": "B07ZPKN6YR", "domainCode": "com"},
    headers={"x-api-key": KEY},
    timeout=60,
)
resp.raise_for_status()
product = resp.json()

print(product["productTitle"])
print(product["price"], product["currency"], "-", product["warehouseAvailability"])

La réponse est au format JSON. Chaque réponse commence par responseStatus et responseMessage, suivis du produit. Voici une version abrégée de l'exemple documenté :

Exemple de réponse · GET /amz/amazon-lookup-product-by-asin
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "responseMessage": "Product successfully found!",
  "productTitle": "Apple iPhone 11, 64GB, Black - Unlocked (Renewed)",
  "productRating": "4.2 out of 5 stars",
  "countReview": 60024,
  "asin": "B07ZPKN6YR",
  "warehouseAvailability": "This item cannot be shipped to your selected delivery location. Please choose a different delivery location.",
  "retailPrice": 0,
  "price": 0,
  "currency": "USD"
}

Regardez price dans cet exemple : il vaut 0. Cela arrive quand la page n'affiche aucun prix d'achat – ici parce que l'article ne pouvait pas être livré à l'adresse de livraison. Votre script doit traiter 0 comme « pas de prix pour l'instant », et non comme un produit gratuit.

03Vérifiez une liste de produits et enregistrez chaque résultat

Transformez maintenant cette requête unique en petit tracker. WATCHLIST contient les produits et le prix que vous attendez. Chaque exécution interroge chaque produit une fois, ajoute une ligne à prices.csv et compare le nouveau prix au dernier enregistré.

track.py
"""Check the price of a few Amazon products and append each check to prices.csv."""
import csv
import os
import re
import time
from datetime import datetime, timezone
from pathlib import Path

import requests

API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
CSV_FILE = Path("prices.csv")
DOMAIN = "com"  # amazon.com – use "de", "co.uk", "fr" … for other marketplaces

# ASIN -> the price at which you want to hear about it
WATCHLIST = {
    "B07ZPKN6YR": 30.00,
}


def api_get(path: str, params: dict) -> dict:
    """GET an everydata.io endpoint. Waits when rate limited (429) and retries a failed page load (5xx) once."""
    retried = False
    for _ in range(4):
        resp = requests.get(f"{API}{path}", params=params, headers={"x-api-key": KEY}, timeout=60)
        if resp.status_code == 429:
            # Too many requests at once. The answer says how long to wait: "... Try again in 12 seconds."
            wait = re.search(r"in (\d+) seconds", resp.text)
            time.sleep(int(wait.group(1)) + 1 if wait else 60)
            continue
        if resp.status_code >= 500 and not retried:
            retried = True  # 5xx answers are not counted against your quota
            time.sleep(10)
            continue
        resp.raise_for_status()  # 4xx (wrong key, quota used up, bad parameter) or a second 5xx
        return resp.json()
    raise RuntimeError("still rate limited after several waits – try again later")


def last_price(asin: str) -> float | None:
    """The most recent price we saved for this ASIN, if any."""
    if not CSV_FILE.exists():
        return None
    with CSV_FILE.open(newline="") as f:
        rows = [r for r in csv.DictReader(f) if r["asin"] == asin and r["price"]]
    return float(rows[-1]["price"]) if rows else None


def main() -> None:
    previous = {asin: last_price(asin) for asin in WATCHLIST}
    now = datetime.now(timezone.utc).isoformat(timespec="seconds")
    new_file = not CSV_FILE.exists()

    with CSV_FILE.open("a", newline="") as f:
        writer = csv.writer(f)
        if new_file:
            writer.writerow(["checked_at", "asin", "title", "price", "retail_price", "currency", "availability"])

        for asin, target in WATCHLIST.items():
            try:
                p = api_get("/amz/amazon-lookup-product-by-asin", {"asin": asin, "domainCode": DOMAIN})
            except (requests.RequestException, RuntimeError) as exc:
                print(f"{asin}: could not check this time ({exc}) – the next run tries again")
                continue  # one failed product does not stop the others
            price = p.get("price") or None  # 0 means the page showed no price
            writer.writerow([
                now, asin, p.get("productTitle"), price or "", p.get("retailPrice") or "",
                p.get("currency") or "", p.get("warehouseAvailability") or "",
            ])

            if price is None:
                print(f"{asin}: no price on the page ({p.get('warehouseAvailability')})")
            elif price <= target:
                print(f"{asin}: {price} {p.get('currency')} – at or below your target of {target}")
            elif previous[asin] is not None and price < previous[asin]:
                print(f"{asin}: dropped from {previous[asin]} to {price} {p.get('currency')}")


if __name__ == "__main__":
    main()

Lancez-le avec python3 track.py. La première exécution crée le fichier ; les suivantes ajoutent une ligne par produit. Vous pouvez ouvrir prices.csv dans n'importe quel tableur pour tracer une courbe de prix.

api_get gère les deux réponses que vous rencontrerez tôt ou tard. Si une page ne peut pas être chargée, l'API répond avec un statut 5xx comme 502 ou 503 ; ces réponses ne sont pas décomptées de votre quota, le script attend donc quelques secondes et réessaie une fois. Si vous envoyez trop de requêtes à la fois, la réponse est un 429 qui indique combien de secondes attendre – le script patiente le temps indiqué et continue. Un produit qui échoue encore est signalé et ignoré, et l'exécution suivante le reprend.

04Choisissez comment être prévenu

Le script affiche une ligne dans trois cas : la page n'affiche aucun prix, le prix est inférieur ou égal à votre objectif, ou il a baissé depuis la dernière vérification. L'affichage suffit si vous lisez le journal. Si vous préférez recevoir un message, remplacez les trois appels print par ce que vous utilisez déjà – un e-mail via le module smtplib de Python, un webhook de messagerie ou un service de notifications push.

05Exécutez-le chaque jour

Sur un Mac ou une machine Linux allumée, cron est le planificateur le plus simple. Cette ligne lance le tracker tous les matins à 7 h et conserve un journal :

crontab
# Every day at 07:00 – edit with: crontab -e
0 7 * * * cd /home/you/price-tracker && EVERYDATA_API_KEY=ds_your_key /usr/bin/python3 track.py >> track.log 2>&1

Sous Windows, le Planificateur de tâches fait le même travail. Un petit serveur ou une tâche CI planifiée conviennent aussi.

Chaque vérification de produit correspond à une requête. Par exemple, trois produits vérifiés une fois par jour représentent environ 90 requêtes par mois, ce qui tient dans l'offre gratuite de 100 requêtes. Pour plus de produits ou plus de vérifications par jour, consultez les tarifs.

06Facultatif : lisez l'historique des prix dont everydata.io dispose déjà

Chaque recherche de produit effectuée via everydata.io enregistre aussi le prix observé. L'endpoint d'historique des prix renvoie ces relevés pour les days derniers jours. Il ne connaît que les produits que quelqu'un a déjà consultés : pour un produit que personne n'a encore vérifié, la liste est vide – votre propre fichier CSV reste la référence fiable.

history.py
resp = requests.get(
    f"{API}/amz/amazon-price-history",
    params={"asin": "B07ZPKN6YR", "domainCode": "com", "days": 90},
    headers={"x-api-key": KEY},
    timeout=60,
)
data = resp.json()
print(data["count"], "observations")
for point in data["history"]:
    print(point["observedAt"], point["price"], point["inStock"])
Exemple de réponse · GET /amz/amazon-price-history
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "responseMessage": "Product successfully found!",
  "asin": "B07ZPKN6YR",
  "domainCode": "com",
  "days": 90,
  "currency": "USD",
  "count": 2,
  "history": [
    {
      "observedAt": "2026-09-18T10:12:00Z",
      "price": 39.99,
      "retailPrice": 49.99,
      "inStock": true
    },
    {
      "observedAt": "2026-09-19T09:40:00Z",
      "price": 34.99,
      "retailPrice": 49.99,
      "inStock": true
    }
  ]
}

Endpoints utilisés dans ce guide

GET/amz/amazon-lookup-product-by-asin

Product Details by ASIN · API Amazon

GET/amz/amazon-price-history

Price History (observations collected by this API) · API Amazon

Tous les paramètres dans la référence de l’API

Essayez avec vos propres données

L’offre gratuite comprend 100 requêtes par mois, utilisables sur toutes les plateformes – de quoi suivre ce guide de bout en bout.