20 % de desconto em todos os planos pagos com o código

Python · Amazon

Monitore preços da Amazon com Python

Os preços na Amazon mudam o tempo todo, e ninguém quer abrir a mesma página de produto toda manhã. Neste guia, você cria um pequeno script que faz isso por você: ele consulta o preço atual dos produtos que interessam, registra cada verificação em um arquivo fácil de abrir em planilhas e avisa quando um preço cai abaixo do valor que você está disposto a pagar.

Você não precisa lidar com a página da Amazon em si. A everydata.io carrega a página de produto ao vivo para você e devolve dados limpos – título, preço, moeda, disponibilidade –, então o script continua curto e não quebra quando a Amazon muda o layout.

Atualizado em · por everydata.io

O que você terá no final

  • Um script que verifica uma lista de produtos da Amazon e adiciona cada preço ao prices.csv.
  • Um aviso quando um preço cai ou atinge o seu alvo.
  • Um agendamento diário, para que ele rode sem você.

O que você precisa

  • Python 3.10 ou mais recente e o pacote requests (pip install requests).
  • Uma chave de API gratuita da everydata.io – crie uma aqui.
  • O ASIN de cada produto: o código de 10 caracteres depois de /dp/ no endereço da Amazon.

01Mantenha sua chave de API fora do código

Entre na sua conta, copie a chave no painel e coloque-a em uma variável de ambiente. O script a lê de lá, então a chave nunca acaba em um arquivo que você possa compartilhar.

terminal
export EVERYDATA_API_KEY="ds_your_key"

02Consulte um produto

Comece com uma única requisição para ver o que volta. O endpoint de produto por ASIN recebe o ASIN e o marketplace (com para amazon.com, de para amazon.de e assim por diante).

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"])

A resposta é JSON. Toda resposta começa com responseStatus e responseMessage, seguidos do produto. Esta é uma versão resumida do exemplo documentado:

Resposta de exemplo · 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"
}

Repare em price neste exemplo: ele é 0. Isso acontece quando a página não mostra nenhum preço de compra – aqui, porque o item não podia ser enviado para o local de entrega. Seu script deve tratar 0 como “sem preço no momento”, e não como um produto grátis.

03Verifique uma lista de produtos e salve cada resultado

Agora transforme a requisição única em um pequeno monitor. WATCHLIST guarda os produtos e o preço que você está esperando. Cada execução consulta cada produto uma vez, adiciona uma linha a prices.csv e compara o novo preço com o último que foi salvo.

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()

Execute com python3 track.py. A primeira execução cria o arquivo; as seguintes adicionam uma linha por produto. Você pode abrir prices.csv em qualquer programa de planilhas para montar um gráfico de preços.

api_get trata as duas respostas que você vai encontrar mais cedo ou mais tarde. Se uma página não puder ser carregada, a API responde com um status 5xx, como 502 ou 503; essas respostas não contam na sua cota, então o script espera alguns segundos e tenta mais uma vez. Se você enviar requisições demais de uma vez, a resposta é 429 e informa quantos segundos esperar – o script espera esse tempo e continua. Um produto que continuar falhando é informado e pulado, e a próxima execução tenta de novo.

04Decida como quer ser avisado

O script imprime uma linha em três casos: a página não mostra preço, o preço está igual ou abaixo do seu alvo, ou caiu desde a última verificação. Imprimir basta se você lê o log. Se preferir receber uma mensagem, substitua as três chamadas print pelo que você já usa – um e-mail via smtplib do Python, um webhook de chat ou um serviço de push.

05Execute todos os dias

Em um Mac ou Linux que fica ligado, o cron é o agendador mais simples. Esta linha executa o monitor todas as manhãs às 7:00 e mantém um log:

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

No Windows, o Agendador de Tarefas faz o mesmo trabalho. Qualquer servidor pequeno ou um job agendado de CI também serve.

Cada verificação de produto é uma requisição. Por exemplo: três produtos verificados uma vez por dia dão cerca de 90 requisições por mês, o que cabe no plano gratuito de 100 requisições. Para mais produtos ou mais verificações por dia, veja os preços.

06Opcional: leia o histórico de preços que a everydata.io já tem

Toda consulta de produto feita pela everydata.io também armazena o preço observado. O endpoint de histórico de preços devolve essas observações dos últimos days dias. Ele só conhece produtos que alguém já consultou; para um produto que ninguém verificou ainda, a lista vem vazia – seu próprio arquivo CSV continua sendo o registro confiável.

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"])
Resposta de exemplo · 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 usados neste guia

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

Todos os parâmetros na referência da API

Teste com seus próprios dados

O plano gratuito inclui 100 requisições por mês, válidas em todas as plataformas – o suficiente para seguir este guia do início ao fim.