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.

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 availableprice_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
- Track Amazon bestseller-oriented search results
- Build an Amazon product-research tool
- Monitor Amazon competitor prices and ratings
- The complete guide to scraping e-commerce data
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
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.