# Amazon Product Scraper - Prices, Deals & Ratings (`thirdwatch/amazon-product-scraper`) Actor

Extract Amazon search-result products at scale — titles, prices, discounts, ratings, review counts, badges, and images — with price-change monitoring for repricing, catalog intelligence, and competitive tracking. Clean JSON output.

- **URL**: https://apify.com/thirdwatch/amazon-product-scraper.md
- **Developed by:** [Thirdwatch](https://apify.com/thirdwatch) (community)
- **Categories:** E-commerce
- **Stats:** 365 total users, 94 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.10 / 1,000 results

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 Monitor

> **Thirdwatch portfolio:** 8,800+ users across 140+ public Actors, 2M+ records delivered, >95% run success. [Explore all Thirdwatch Actors](https://apify.com/thirdwatch).

### What you get

Scrape Amazon product search results across 19 marketplaces without an Amazon account or Product Advertising API key. Get numeric prices, real list prices, discounts, ratings, review counts, monthly-bought signals, sponsored status, badges, Prime eligibility, rank position, images, and canonical ASIN URLs. Schedule the same input to receive only new or changed products.

### Why use this Amazon scraper?

- **19 marketplaces:** US, UK, India, Germany, France, Spain, Italy, Canada, Japan, Australia, Brazil, Mexico, Netherlands, Singapore, Saudi Arabia, UAE, Poland, Sweden, and Belgium.
- **Analysis-ready numbers:** `price_value`, `original_price_value`, `rating_value`, and `reviews_count_value` avoid spreadsheet cleanup.
- **Deal intelligence:** distinguish a genuine list price from Amazon's misleading per-unit price, then use `discount_percentage` and `on_sale`.
- **Organic ranking analysis:** filter sponsored rows with `is_sponsored` and retain `page` plus `position`.
- **Demand signals:** capture the public “10K+ bought in past month” text and normalized threshold.
- **Incremental monitoring:** return only new products or changes in price, rating, and review count.
- **Fast, inexpensive runs:** each search page returns many products at once, so large catalogs finish quickly.

### Output fields

| Field | Description |
|---|---|
| `asin` | Stable Amazon product identifier |
| `title` | Product title shown in search |
| `url` | Canonical marketplace `/dp/{ASIN}` URL |
| `price` / `price_value` | Display price and normalized number |
| `original_price` / `original_price_value` | Real list/typical price, excluding per-unit text |
| `discount_percentage` / `on_sale` | Computed discount and sale flag |
| `currency` / `currency_code` | Display symbol and ISO currency code |
| `rating` / `rating_value` | Display rating and numeric rating |
| `reviews_count` / `reviews_count_value` | Compact display count and normalized integer |
| `monthly_bought` / `monthly_bought_value` | Public bought-in-past-month threshold |
| `is_prime` | Prime badge shown on the search result |
| `is_sponsored` | Sponsored placement flag |
| `badge` | Search badge such as Best Seller or Overall Pick |
| `page` / `position` | Search page and placement position |
| `image_url` | Main product image |
| `query`, `country`, `domain` | Search and marketplace attribution |
| `scraped_at` | UTC extraction timestamp |
| `change_type`, `changed_fields` | Incremental-monitoring classification |
| `previous_price_value`, `price_delta`, `price_delta_percentage` | Price-change context |
| `previous_rating_value`, `rating_delta` | Rating-change context |
| `previous_reviews_count_value`, `reviews_count_delta` | Review-velocity context |

Fields unavailable on a particular public search card are returned as empty strings or `null`; they are never fabricated.

### Example output

```json
{
  "asin": "B082Z1YYRK",
  "title": "USB C Cable 5 Pack 6FT",
  "url": "https://www.amazon.com/dp/B082Z1YYRK",
  "price": "$8.97",
  "price_value": 8.97,
  "original_price": "List: $17.97",
  "original_price_value": 17.97,
  "discount_percentage": 50.08,
  "on_sale": true,
  "currency_code": "USD",
  "rating_value": 4.6,
  "reviews_count_value": 59200,
  "monthly_bought": "10K+",
  "monthly_bought_value": 10000,
  "is_prime": true,
  "is_sponsored": false,
  "badge": "Best Seller",
  "page": 1,
  "position": 15,
  "query": "usb c cable",
  "country": "us",
  "domain": "amazon.com"
}
```

### Input

| Input | Description |
|---|---|
| `queries` | Search keywords or ASINs. Optional when browsing a category. |
| `country` | Marketplace code. Default: `us`. |
| `category` | Optional Amazon department. |
| `subcategorySlug` | Optional browse-node ID or subcategory term. |
| `sortBy` | Relevance, price, rating, newest, or best sellers. |
| `minPrice`, `maxPrice` | Optional marketplace-currency price range. |
| `maxResults` | Total unique ASINs across the run, up to 500. |
| `monitorMode` | `off`, `price-changes`, or `all-changes`. |
| `monitorStoreName` | Optional stable state name for a scheduled watch. |
| `proxyConfiguration` | Proxy settings; the default is recommended. |

#### Search products

```json
{
  "queries": ["usb c charger", "portable monitor"],
  "country": "us",
  "sortBy": "bestSellers",
  "minPrice": 10,
  "maxPrice": 250,
  "maxResults": 100
}
```

#### Monitor price changes

Use the same `monitorStoreName`, marketplace, queries, filters, sort, and result limit on every scheduled run. The first run creates the baseline and returns the current unique products. Later runs return only new ASINs, newly available prices, or changed prices.

```json
{
  "queries": ["B0C3HCD34R", "B082Z1YYRK"],
  "country": "us",
  "maxResults": 40,
  "monitorMode": "price-changes",
  "monitorStoreName": "amazon-competitor-asin-prices-us"
}
```

Use `all-changes` to additionally emit rating and review-count movement. Monitoring fails closed when any requested page is blocked or incomplete, so a partial scrape cannot overwrite a healthy baseline. Results are published before state advances; a retry may duplicate an alert but cannot silently lose it.

### What this Actor deliberately does not claim

This is a search-results Actor. It does **not** currently fetch product-detail pages, so it does not promise seller/Buy Box ownership, inventory quantities, variants, A+ content, full descriptions, category breadcrumbs, Best Sellers Rank (BSR), offer lists, or full reviews. Use [Amazon Reviews Scraper](https://apify.com/thirdwatch/amazon-reviews-scraper?fpr=9m2cd6) for written reviews.

Amazon may omit price or Prime status from a search card, especially for variants, products without a featured offer, and products unavailable to the proxy location. A missing value is returned as `null`, not zero. Monthly-bought values are public thresholds such as `1K+`, not exact sales counts.

### Compared with alternatives

- Search-result competitors commonly charge roughly $2–$6 per 1,000 products; what you pay here drops at higher usage tiers.
- Detail-page Actors can return variants, sellers, offers, and BSR. Choose one of those when field depth matters more than low-cost keyword coverage.
- Amazon's Product Advertising API requires affiliate approval, sales eligibility, and throttled access. This Actor uses public pages and needs no API key.

### Use cases

- competitor and MAP price monitoring;
- retail-arbitrage and deal discovery;
- sponsored-versus-organic search analysis;
- product and private-label niche research;
- review-velocity and rating monitoring;
- cross-marketplace pricing comparisons.

### Guides

- [Scrape Amazon products for price monitoring](https://thirdwatch.dev/blog/scrape-amazon-products-for-price-monitoring)
- [Monitor Amazon competitor pricing and ratings](https://thirdwatch.dev/blog/monitor-amazon-competitor-pricing-and-ratings)
- [Track Amazon bestsellers by category](https://thirdwatch.dev/blog/track-amazon-bestsellers-by-category)
- [Build an Amazon product research tool](https://thirdwatch.dev/blog/build-amazon-product-research-tool)

### Limitations

- This is a search-results Actor: it does not fetch product-detail pages, so it does not return seller/Buy Box ownership, inventory quantities, variants, A+ content, full descriptions, category breadcrumbs, Best Sellers Rank, offer lists, or full reviews.
- Amazon may omit price or Prime status from a search card, especially for variants, products without a featured offer, or products unavailable in the chosen marketplace; a missing value is returned as `null`, not zero.
- Monthly-bought values are public thresholds such as `1K+`, not exact sales counts.
- Listings that are removed or restricted by Amazon between runs simply disappear from later results rather than erroring.

Last verified: 2026-07

More scrapers at [thirdwatch.dev](https://thirdwatch.dev).

# Actor input Schema

## `queries` (type: `array`):

List of search terms (e.g. 'wireless headphones'). Optional if you set a Category — leave empty to browse a category instead of searching.

## `category` (type: `string`):

Top-level Amazon department to browse or search within. Leave as 'All Departments' to search everything. Combine with Subcategory Slug for deeper paths.

## `subcategorySlug` (type: `string`):

Optional deeper path. For Amazon, paste a browse-node ID (e.g. '172282' for Electronics → Headphones) or a sub-department slug. Find it in the Amazon URL after picking a subcategory on site.

## `sortBy` (type: `string`):

How to order results.

## `minPrice` (type: `integer`):

Minimum price in the country's main currency unit. Leave empty for no lower bound.

## `maxPrice` (type: `integer`):

Maximum price in the country's main currency unit. Leave empty for no upper bound.

## `maxResults` (type: `integer`):

Maximum number of products to extract across all queries / categories.

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

Amazon country domain to scrape. Determines the domain and currency.

## `monitorMode` (type: `string`):

Off returns the full current dataset. Price changes stores a baseline and returns only new products or products with a newly available/changed price. All changes also tracks rating and review-count movement.

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

Optional stable key-value store name. Reuse the same name for every scheduled run of one watch.

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

Proxy settings. Leave default for best results.

## Actor input object example

```json
{
  "queries": [
    "wireless headphones"
  ],
  "category": "all",
  "sortBy": "relevance",
  "maxResults": 20,
  "country": "us",
  "monitorMode": "off",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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 = {
    "queries": [
        "wireless headphones"
    ],
    "maxResults": 20,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("thirdwatch/amazon-product-scraper").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 = {
    "queries": ["wireless headphones"],
    "maxResults": 20,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("thirdwatch/amazon-product-scraper").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 '{
  "queries": [
    "wireless headphones"
  ],
  "maxResults": 20,
  "country": "us"
}' |
apify call thirdwatch/amazon-product-scraper --silent --output-dataset

```

## MCP server setup

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

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/BTq2lREYawBGEF0l5/builds/8dgGlwNav3spTxOf9/openapi.json
