# Amazon Product Scraper & Price Tracker (`rastriq/amazon-product-price-tracker`) Actor

Scrape Amazon products in 21 countries: price, stock, Buy Box seller, rating and Best Sellers Rank by ASIN. Local postcode prices and price-drop alerts.

- **URL**: https://apify.com/rastriq/amazon-product-price-tracker.md
- **Developed by:** [Rastriq — Structured data from the world](https://apify.com/rastriq) (community)
- **Categories:** E-commerce, Automation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.50 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Amazon Product Scraper & Price Tracker — Amazon prices, stock, sellers & Best Sellers Rank by ASIN

**Amazon Product Scraper & Price Tracker** extracts product data from Amazon product pages in **21 marketplaces** — price, list price and discount, coupon, stock, seller and fulfilment, rating and rating breakdown, Best Sellers Rank, brand, categories, images, technical details and all variants. It makes **one request per product**, returns **local, VAT-inclusive prices**, and can **compare every run with the previous one** to alert you about price drops, stock-outs and Buy Box changes.

No Amazon account, no Product Advertising API keys, no browser extension — a simple **Amazon API alternative**. Paste product URLs or ASINs and click **Start**, then export to JSON, CSV, Excel or Google Sheets.

### 🛒 What is Amazon Product Scraper & Price Tracker?

Amazon Product Scraper & Price Tracker is an Amazon scraper built for **price monitoring, catalog intelligence and competitive analysis**. Typical uses:

- 📉 **Price monitoring & MAP compliance** — track your products or competitors every day and get only the ones whose price changed.
- 📦 **Stock & Buy Box watch** — detect out-of-stock events, seller changes and coupon launches.
- 🧭 **Catalog & assortment analysis** — brands, categories, Best Sellers Rank, variants, specifications.
- 🌍 **Cross-border price comparison** — the same ASIN on amazon.com, .de, .fr, .es, .it, .co.uk, .co.jp…

Prices are taken as a **local shopper** sees them: the Actor sets a local delivery address (e.g. New York 10001, Berlin 10115, Madrid 28001) or uses local IPs, so you don't get export prices without VAT or "doesn't ship to your location" pages.

### 📊 What data does Amazon Product Scraper & Price Tracker extract?

| | Fields |
|---|---|
| 💶 **Price** | `price`, `currency`, `originalPrice` (list/RRP/UVP) + `originalPriceLabel`, `discount`, `unitPrice`, `coupon`, `couponDiscount`, `priceSource`, `offersCount`, `lowestOfferPrice` |
| 📦 **Availability** | `availability` (as shown), `inStock` (normalized across languages), `stockQuantity` ("Only 3 left"), `deliveryMessage`, `deliverTo` |
| 🏪 **Seller** | `seller`, `sellerId`, `fulfilledBy` (`Amazon` = FBA / sold by Amazon), `shipsFrom` |
| ⭐ **Ratings** | `rating`, `reviewCount`, `ratingBreakdown` (% per star) |
| 🏆 **Ranking** | `bestSellerRank` (rank + category, every level), `isAmazonChoice`, `isBestSeller`, `boughtPastMonth` |
| 🏷️ **Catalog** | `asin`, `parentAsin`, `title`, `brand`, `categories` (breadcrumbs), `bulletPoints`, `description`, `technicalDetails` |
| 🖼️ **Media** | `mainImage`, `images` (high resolution) |
| 🎨 **Variants** | `variants[]` with ASIN, attributes (colour, size…), availability and URL |
| 📈 **Tracking** | `previousPrice`, `priceChange`, `priceChangePercent`, `lowestPriceSeen`, `highestPriceSeen`, `changes` |
| 🧾 **Quality** | `status`, `_warnings` (e.g. `no_price_out_of_stock`), `scrapedAt`, `input` |

Missing data is returned as `null` and flagged in `_warnings` — the Actor never filters products or invents values.

### 🚀 How to scrape Amazon product data and prices

1. Add **Product URLs** from any Amazon site, or a list of **ASINs** and choose the **Marketplace**.
2. (Optional) To mix countries in the ASIN list, prefix them: `DE:B074D1MBKB`, `FR:B095CLQ1PT`.
3. Click **Start** and download the results as JSON, CSV, Excel or via API.
4. For a **price tracker**, enable **Track price changes**, save the input as a **Task** and add a **Schedule** (e.g. daily). Turn on **Output only changed products** to receive just the price drops, stock changes and new products — perfect for webhooks, Slack or Make/Zapier alerts.

#### Supported marketplaces

🇺🇸 amazon.com · 🇬🇧 amazon.co.uk · 🇩🇪 amazon.de · 🇫🇷 amazon.fr · 🇪🇸 amazon.es · 🇮🇹 amazon.it · 🇳🇱 amazon.nl · 🇧🇪 amazon.com.be · 🇸🇪 amazon.se · 🇵🇱 amazon.pl · 🇮🇪 amazon.ie · 🇨🇦 amazon.ca · 🇲🇽 amazon.com.mx · 🇧🇷 amazon.com.br · 🇯🇵 amazon.co.jp · 🇮🇳 amazon.in · 🇦🇺 amazon.com.au · 🇦🇪 amazon.ae · 🇸🇦 amazon.sa · 🇸🇬 amazon.sg · 🇹🇷 amazon.com.tr

### ⚙️ Input parameters

| Parameter | Description | Default |
|---|---|---|
| `productUrls` | Amazon product URLs (any marketplace, mixed allowed) | — |
| `asins` | ASINs, optionally prefixed with a country (`DE:B074D1MBKB`) | — |
| `country` | Marketplace for plain ASINs | `US` |
| `maxItems` | Max products saved per run — not-found/unchanged don't count (0 = no limit) | `100` |
| `trackPriceChanges` | Compare with the previous run | `false` |
| `onlyChangedItems` | Save only new/changed products (unchanged are free). Requires `trackPriceChanges` | `false` |
| `priceChangeThreshold` | Ignore moves smaller than this % | `0` |
| `monitorStoreName` | Key-value store that keeps the history | `amazon-price-tracker-state` |
| `scrapeVariants` | Also scrape every variant as a full product | `false` |
| `maxVariantsPerProduct` | Variant limit per product | `20` |
| `includeRatingBreakdown` | % of 5★…1★ ratings | `true` |
| `outputFailedItems` | Add a free row for not-found / failed products | `true` |
| `deliveryZipCode` | Your own delivery postcode for the selected marketplace | city centre |
| `proxyConfiguration` | Apify Proxy settings | datacenter |
| `residentialFallback` | Switch to local residential IPs if blocked | `true` |
| `maxConcurrency` | Parallel requests | `10` |
| `sessionMode` | `http` (fast) or `browser` (warm every session in Chromium; for stubborn blocks) | `http` |
| `debugSaveHtml` | Save blocked pages to the key-value store | `false` |

```json
{
  "asins": ["B09B8V1LZ3", "DE:B074D1MBKB", "ES:B07GZSDHSK"],
  "country": "US",
  "trackPriceChanges": true,
  "onlyChangedItems": false
}
```

### 📦 Output example

```json
{
  "asin": "B07GZSDHSK",
  "parentAsin": "B0G1RVQCT1",
  "title": "JETech Protector Pantalla para iPhone 11/XR, 2 Unidades",
  "url": "https://www.amazon.es/dp/B07GZSDHSK",
  "marketplace": "amazon.es",
  "country": "ES",
  "status": "ok",
  "price": 7.49,
  "priceSource": "buybox",
  "currency": "EUR",
  "originalPrice": 7.88,
  "originalPriceLabel": "Precio recomendado",
  "discount": 5,
  "unitPrice": "3,75€",
  "rating": 4.5,
  "reviewCount": 676605,
  "ratingBreakdown": { "5": 71, "4": 17, "3": 7, "2": 2, "1": 3 },
  "availability": "En stock",
  "inStock": true,
  "seller": "JE EU Store",
  "sellerId": "AB4RD1JXHRRE1",
  "fulfilledBy": "Amazon",
  "brand": "JETech",
  "categories": ["Electrónica", "Comunicación móvil y accesorios", "Accesorios", "Protectores de pantalla"],
  "bestSellerRank": [{ "rank": 62, "category": "Protectores de pantalla para móviles" }],
  "boughtPastMonth": "200+ comprados el mes pasado",
  "mainImage": "https://m.media-amazon.com/images/I/71Qv8-7Rq0L._AC_SL1500_.jpg",
  "technicalDetails": { "Marca": "JETech", "Material": "Vidrio templado", "Dureza del producto": "9H" },
  "variants": [{ "asin": "B01KNVF4SI", "attributes": { "Tamaño": "iPhone 7/8" }, "isAvailable": true }],
  "previousPrice": 7.99,
  "priceChange": -0.5,
  "priceChangePercent": -6.26,
  "lowestPriceSeen": 7.49,
  "changes": ["price_down"],
  "scrapedAt": "2026-10-13T15:57:14.584Z",
  "_warnings": []
}
```

The dataset has three ready-made views: **Overview**, **Price tracking** and **Catalog & ranking**. A `RUN_SUMMARY` record in the key-value store reports counts per marketplace.

### 💰 How much does it cost to scrape Amazon with Amazon Product Scraper & Price Tracker?

It uses **pay-per-event** pricing. You pay per product saved, and the price drops with your Apify plan. **Platform usage is included** — no compute or proxy costs on top.

| Apify plan | Price per 1,000 products |
|---|---|
| Free | $3.00 |
| Starter (Bronze) | $2.50 |
| Scale (Silver) | $2.00 |
| Business (Gold) and above | $1.50 |

Plus a small start fee of $0.00125 per GB of memory per run (about $0.005 with the default 4 GB).

- ✅ You only pay for products successfully saved.
- 🆓 Not-found, unsupported and failed products are **free**, and so are unchanged products when **Output only changed products** is on.
- 📍 Local delivery address (postcode), lowest-offer price when there is no Buy Box, rating breakdown and the variant list are **included at no extra cost**.
- 💡 Monitoring 1,000 products every day on the Starter plan costs about **$75/month**; with *Output only changed products* you pay only for the ones that moved.

Run a small test with 10–50 products first to see the output and the cost.

### 🔗 Related Actors

- [Amazon Reviews Scraper](https://apify.com/rastriq/amazon-reviews-scraper) — full review text, ratings and reviewer data for the products you track here.

### ❓ FAQ — scraping Amazon prices and product data

#### How do I track Amazon prices automatically?

Turn on **Track price changes**, save the input as a Task and add a daily **Schedule**. Each run compares with the previous one and fills `previousPrice`, `priceChange`, `lowestPriceSeen` and `changes` (`price_down`, `out_of_stock`, `seller_changed`…). Add a webhook or a Make/Zapier integration to get alerts.

#### Is this an alternative to the Amazon Product Advertising API?

Yes. Amazon Product Scraper & Price Tracker needs no Amazon affiliate account or API keys, works in 21 marketplaces and returns fields the official API doesn't expose, such as Best Sellers Rank per category, "bought in past month" and the Buy Box seller.

#### Is it legal to scrape Amazon?

The Actor only extracts publicly visible product information (no personal data, no logged-in pages). You are responsible for using the data in line with applicable laws and Amazon's terms. If in doubt, ask a lawyer.

#### Why is `price` null for some products?

The product is out of stock, unavailable in that marketplace, or has no Buy Box. In the last case the Actor reads the offer list and returns the **lowest new offer** with `priceSource: "lowest_offer"`. Every case is explained in `_warnings`.

#### Why does a row say `redirected_from_…`?

Amazon redirected the ASIN you sent to another ASIN (merged listing or parent/child). The row contains the product Amazon actually shows.

#### Can I get Amazon prices for my postcode or ZIP code?

Yes — set **Delivery ZIP / postcode** for the selected marketplace.

#### Does it scrape Amazon search results or reviews?

No. It focuses on product pages, which makes it fast and cheap. For reviews, use [Amazon Reviews Scraper](https://apify.com/rastriq/amazon-reviews-scraper).

#### Something looks wrong?

Open an issue on the Actor's **Issues** tab with the run link and the ASIN.

# Actor input Schema

## `productUrls` (type: `array`):

Amazon product page URLs from <b>any supported marketplace</b>. The marketplace is detected from the URL, so you can mix countries.<br><br>Accepted formats:<br>• <code>https://www.amazon.com/dp/B08KTZ8249</code><br>• <code>https://www.amazon.de/Some-Product-Name/dp/B074D1MBKB/ref=...</code><br>• <code>https://www.amazon.co.uk/gp/product/B0BDFS2W5D</code>

## `asins` (type: `array`):

10-character Amazon product IDs. They are scraped on the <b>Marketplace</b> selected below.<br><br>💡 To mix countries in one list, prefix the ASIN: <code>DE:B074D1MBKB</code>, <code>FR:B095CLQ1PT</code>.

## `country` (type: `string`):

Amazon site used for the <b>ASINs</b> list (product URLs keep their own site). Prices are returned in the marketplace's local currency.

## `maxItems` (type: `integer`):

Maximum number of products to <b>save</b> in this run (variants included). Not-found, failed and unchanged products don't count. Use <b>0</b> for no limit.

## `trackPriceChanges` (type: `boolean`):

Compare every product with the <b>previous run</b> and add <code>previousPrice</code>, <code>priceChange</code>, <code>priceChangePercent</code>, <code>lowestPriceSeen</code>, <code>highestPriceSeen</code> and a <code>changes</code> list (<code>price_down</code>, <code>price_up</code>, <code>out_of_stock</code>, <code>back_in_stock</code>, <code>seller_changed</code>, <code>coupon_added</code>…).<br><br>History is kept in a named key-value store in your account, so <b>schedule this Actor</b> (e.g. daily) with the same input to build a price tracker.

## `onlyChangedItems` (type: `boolean`):

With price tracking on, save only products that are new or changed since the last run. Unchanged products are <b>not saved and not charged</b> — ideal for alerts via webhooks or integrations. Requires <b>Track price changes</b>.

## `priceChangeThreshold` (type: `number`):

Ignore price moves smaller than this percentage when detecting <code>price_down</code> / <code>price_up</code>. <b>0</b> = any change.

## `monitorStoreName` (type: `string`):

Name of the key-value store that keeps the price history. Use a <b>different name per watchlist</b> if you run several independent trackers.

## `scrapeVariants` (type: `boolean`):

Also scrape every variant (colour, size, style…) of each product as a full product with its own price and stock.<br><br>⚠️ Each variant is a separate saved product (and counts toward <b>Max products</b>). Variant ASINs and attributes are always listed in the <code>variants</code> field, even with this off.

## `maxVariantsPerProduct` (type: `integer`):

Upper limit of variants scraped per product when <b>Scrape all variants</b> is on.

## `includeRatingBreakdown` (type: `boolean`):

Return the % of 5★…1★ ratings. When the product page doesn't include it, one tiny extra request fetches it.

## `outputFailedItems` (type: `boolean`):

Add a row with <code>status: "not_found"</code> or <code>"failed"</code> for every product that couldn't be scraped, so you always know what happened to each input. These rows are <b>free</b>.

## `deliveryZipCode` (type: `string`):

Amazon prices, buybox and stock depend on the <b>Deliver to</b> location. By default the Actor uses a central postcode of each marketplace (e.g. <code>10001</code> New York, <code>10115</code> Berlin, <code>28001</code> Madrid) so you get <b>local, VAT-inclusive prices</b>.<br><br>Set a postcode here to override it for the <b>Marketplace</b> selected above (e.g. <code>90210</code> for amazon.com).

## `proxyConfiguration` (type: `object`):

Apify Proxy is required. The default (datacenter) works for most marketplaces and keeps costs low; the Actor switches to residential IPs in the product's country automatically if Amazon starts blocking.

## `residentialFallback` (type: `boolean`):

Escalate to residential proxies in the marketplace's country when the block rate goes above 50%. Recommended.

## `maxConcurrency` (type: `integer`):

Maximum parallel product requests. Higher is faster but increases the chance of blocks.<br><br>Recommended: <b>5–15</b>.

## `sessionMode` (type: `string`):

<b>HTTP</b> sends browser-identical requests and is enough for Amazon in almost all cases.<br><br><b>Browser</b> opens each session once in a real Chromium before switching to HTTP. Slower; keep the default <b>4 GB memory</b>; the Actor switches to it automatically if blocks persist on residential proxies.

## `debugSaveHtml` (type: `boolean`):

Store the HTML of blocked responses in the run's key-value store.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.amazon.com/Apple-Cancellation-Hearing-Heart-Rate-Translation/dp/B0FQFB8FMG"
  ],
  "asins": [
    "B09B8V1LZ3",
    "B01J2G4VBG"
  ],
  "country": "US",
  "maxItems": 100,
  "trackPriceChanges": false,
  "onlyChangedItems": false,
  "priceChangeThreshold": 0,
  "monitorStoreName": "amazon-price-tracker-state",
  "scrapeVariants": false,
  "maxVariantsPerProduct": 20,
  "includeRatingBreakdown": true,
  "outputFailedItems": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": true,
  "maxConcurrency": 10,
  "sessionMode": "http",
  "debugSaveHtml": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `priceTracking` (type: `string`):

No description

## `catalog` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "productUrls": [
        "https://www.amazon.com/Apple-Cancellation-Hearing-Heart-Rate-Translation/dp/B0FQFB8FMG"
    ],
    "asins": [
        "B09B8V1LZ3",
        "B01J2G4VBG"
    ],
    "country": "US",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("rastriq/amazon-product-price-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "productUrls": ["https://www.amazon.com/Apple-Cancellation-Hearing-Heart-Rate-Translation/dp/B0FQFB8FMG"],
    "asins": [
        "B09B8V1LZ3",
        "B01J2G4VBG",
    ],
    "country": "US",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("rastriq/amazon-product-price-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "productUrls": [
    "https://www.amazon.com/Apple-Cancellation-Hearing-Heart-Rate-Translation/dp/B0FQFB8FMG"
  ],
  "asins": [
    "B09B8V1LZ3",
    "B01J2G4VBG"
  ],
  "country": "US",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call rastriq/amazon-product-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rastriq/amazon-product-price-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/xQGL31sP3PRbqAWGE/builds/YfGNlHB5eJRhETOPL/openapi.json
