Skip to main content
Thirdwatchthirdwatch
E-commerce & products

Scrape Amazon Products for Price Monitoring (2026 Guide)

Track Amazon search-result prices across 19 marketplaces with numeric fields, correct list-price parsing, and incremental change output.

Apr 27, 2026 · 3 min read · 632 words
See the scraper →

Thirdwatch's Amazon Product Scraper returns search-result products across 19 Amazon marketplaces with numeric current and list prices, discount percentage, rating and review numbers, monthly-bought signals, Prime and sponsored flags, badges, ASIN, position, currency, image, and canonical URL.

▶ Skip the setup: Run the ready-made price-monitor Task on Apify →

Why native monitoring is cheaper than full snapshots

Traditional monitoring downloads and stores every product on every run, then computes a diff downstream. The Actor can do that with monitorMode: "off", but it can also retain a baseline and emit only new or changed rows:

  • price-changes: new ASINs plus changes to an available price_value.
  • all-changes: new ASINs plus available price, rating, or review-count changes.

The first run returns the baseline. Later runs usually produce far fewer paid result events, while carrying the previous values and deltas needed for an alert.

Configure the monitor

import os
import requests

payload = {
    "queries": [
        "airpods pro 2",
        "sony wh-1000xm5",
        "bose quietcomfort ultra",
    ],
    "country": "us",
    "category": "electronics",
    "sortBy": "relevance",
    "maxResults": 100,
    "monitorMode": "price-changes",
    "monitorStoreName": "amazon-headphones-us",
}

response = requests.post(
    "https://api.apify.com/v2/acts/thirdwatch~amazon-product-scraper/run-sync-get-dataset-items",
    params={"token": os.environ["APIFY_TOKEN"]},
    json=payload,
    timeout=3600,
)
response.raise_for_status()
changes = response.json()

Keep every comparison-defining input stable: queries, country, category, subcategory, sort, price filters, limit, monitoring mode, and store name. Use a different store for each country or watchlist.

Alert on a real price drop

import os
import requests

for row in changes:
    drop = row.get("price_delta_percentage")
    if drop is None or drop > -5:
        continue

    requests.post(
        os.environ["SLACK_WEBHOOK_URL"],
        json={
            "text": (
                f"Amazon price drop: {row['title']}\n"
                f"{row['previous_price_value']}{row['price_value']} "
                f"({drop:.1f}%)\n{row['url']}"
            )
        },
        timeout=15,
    ).raise_for_status()

No price-string regex is needed. price_value, previous_price_value, price_delta, and price_delta_percentage are numeric.

Sample product output

{
  "title": "Apple AirPods Pro (2nd Generation)",
  "asin": "B0D1XD1ZV3",
  "price": "$189.99",
  "price_value": 189.99,
  "original_price": "$249.00",
  "original_price_value": 249.0,
  "discount_percentage": 23.7,
  "on_sale": true,
  "rating_value": 4.7,
  "reviews_count_value": 125000,
  "monthly_bought": "10K+ bought in past month",
  "monthly_bought_value": 10000,
  "is_prime": true,
  "is_sponsored": false,
  "page": 1,
  "position": 3,
  "currency_code": "USD",
  "domain": "amazon.com",
  "image_url": "https://m.media-amazon.com/images/I/...",
  "url": "https://www.amazon.com/dp/B0D1XD1ZV3"
}

Amazon often renders a per-unit value such as $0.30 / count near the real list price. The parser excludes per-unit prices when selecting original_price_value, preventing a low unit price from being misreported as the struck-through list price.

What a missing price means

A search card without a numeric price is not proof that the product costs zero or is out of stock. Amazon may require a variant selection, omit the featured offer for the request location, or render a different card shape. The Actor returns null; monitoring ignores that missing current value instead of firing a false price-loss alert.

This search Actor does not return seller, Buy Box, stock, inventory, variants, coupons, BSR, or full product-detail data. Use a detail-focused data source when those fields determine the decision.

Multi-market monitoring

Run one configuration per country and store. Keep each marketplace's currency separate unless you explicitly apply an FX conversion:

key = (row["asin"], row["domain"])
amount = row["price_value"]
currency = row["currency_code"]

Do not mix $189, £169, and ₹19,990 into one median. Also expect review counts and Prime display to differ by marketplace.

Pricing

Apify plan Price per result Price per 1,000 emitted rows
Free $0.002 $2.00
Bronze $0.0015 $1.50
Silver $0.0012 $1.20
Gold $0.001 $1.00

Monitoring bills emitted results—not unchanged baseline rows on repeat runs—plus the small platform start event shown by Apify.

Related Amazon workflows

Run the Amazon Product Scraper on Apify or start with the preconfigured monitoring Task.

Frequently asked questions

How much does Amazon price monitoring cost?

The Actor charges per emitted result: $2.00 per 1,000 on Free, then $1.70, $1.40, and $1.10 per 1,000 on Bronze, Silver, and Gold. Incremental monitoring can lower paid output volume because repeat runs emit only new or changed rows.

Which Amazon marketplaces are supported?

Nineteen: US, UK, India, Germany, France, Spain, Italy, Canada, Japan, Australia, Brazil, Mexico, Netherlands, Singapore, Saudi Arabia, UAE, Poland, Sweden, and Belgium.

Can I track the same product across countries?

Yes, but the same ASIN may have different prices, review counts, and merchandising in each marketplace. Run one stable configuration per country and key records by `(asin, domain)`. ASIN-as-query is best effort because this is search, not a direct product-detail lookup.

Are sponsored results identified?

Yes. Use the explicit `is_sponsored` boolean instead of guessing from missing ratings or reviews.

Related

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.