# Amazon Reviews Scraper (`mina_safwat/amazon-reviews-scraper`) Actor

Scrapes Amazon product reviews from any Amazon store: rating, title, text, date, verified purchase, helpful votes, variant, images and reviewer, plus the product's rating summary.

- **URL**: https://apify.com/mina_safwat/amazon-reviews-scraper.md
- **Developed by:** [Mina](https://apify.com/mina_safwat) (community)
- **Categories:** E-commerce, Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 80.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Amazon Reviews Scraper do?

**Amazon Reviews Scraper** extracts **customer reviews from Amazon product pages** in **any Amazon store**: amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.it, amazon.es, amazon.ca, amazon.in, amazon.com.au, amazon.co.jp, amazon.ae, amazon.sa, amazon.com.br, amazon.com.mx and more. Paste product links or ASINs and get **one row per review** with the star rating, title, full text, date, reviewer country, verified-purchase badge, helpful votes, the variant bought (size, colour, format), review photos and reviewer name. Each row also carries the product's **average rating, total ratings count, star histogram and Amazon's "Customers say" summary**.

It works **without an Amazon account or cookies**, so nothing of yours is at risk. Because it runs on the Apify platform you also get API access, scheduling, integrations (Google Sheets, Zapier, Make, webhooks) and run monitoring. Try it with the prefilled Echo Dot link and click **Start**.

**Important:** without signing in, Amazon shows only a product's **top reviews**, usually **8 to 13 per product per store**: the store's own top reviews, plus a "from other countries" list on many products. Since late 2024 the full review list (`/product-reviews/`) sits behind Amazon's sign-in page. This Actor returns everything Amazon shows to a logged-out visitor, and it never logs in. Other no-login Amazon review scrapers have the same limit.

### Why use Amazon Reviews Scraper?

- **Product research:** read what buyers praise and complain about before you source or launch a product.
- **Competitor monitoring:** track the top reviews and the rating histogram of rival products on a schedule.
- **Brand and seller teams:** check how your listings read in every country you sell in, in each store's own language.
- **Sentiment analysis and AI:** feed clean review text, ratings and dates into your LLM, dashboard or spreadsheet.
- **Low cost:** plain HTTP requests, no browser, and no residential proxy for most pages. See the Pricing tab.

### How to scrape Amazon reviews

1. Open the product on Amazon and copy the address from your browser.
2. Paste it into **Amazon product links or ASINs**, one per line. You can mix stores in one run.
3. Optionally lower **Max reviews per product**.
4. Click **Start** and wait a few seconds per product.
5. Download the reviews as JSON, CSV, Excel or HTML from the **Output** tab, or read them through the API.

### Input

Set these fields in the **Input** tab:

| Field | Type | Default | What it does |
|---|---|---|---|
| `productUrls` | list of strings | prefilled with one product | Product links from any Amazon store (`/dp/`, `/gp/product/`, `/product-reviews/`, `amzn.to` / `a.co` short links) or bare ASINs. Links may omit `https://`. API callers may also send `{"url": "..."}` objects. |
| `maxReviewsPerProduct` | integer | 100 | Stop after this many reviews per product. The default keeps all available reviews (Amazon shows up to about 13). |
| `country` | select | `US` | Store used for lines that are a bare ASIN. Product links always use the store in the link. |

```json
{
    "productUrls": [
        "https://www.amazon.com/dp/B09B8V1LZ3",
        "https://www.amazon.de/dp/B07P3H8XT5",
        "amazon.co.jp/product-reviews/B086WCH4FH",
        "B0BSHF7WHW"
    ],
    "maxReviewsPerProduct": 100,
    "country": "US"
}
```

### Output

One row per review. This is a real row from amazon.com (a review "from other countries"):

```json
{
    "reviewId": "R1M7Z45G1CXG6M",
    "productAsin": "1501110365",
    "productTitle": "It Ends with Us: A Novel",
    "rating": 5,
    "title": "Great Packaging and Paper Quality!",
    "text": "The packing and paper quality are awesome! I’ll read the book and rewrite this review once I’ve finished it. I bought this book mainly because of the Amazon reviews, and I’m looking forward to reading it.",
    "date": "2026-09-30",
    "country": "India",
    "verifiedPurchase": true,
    "helpfulVotes": 0,
    "variantAttributes": { "Format": "Paperback" },
    "imageUrls": [
        "https://m.media-amazon.com/images/I/71sfD+1d5vL.jpg",
        "https://m.media-amazon.com/images/I/61X0XBpVq3L.jpg"
    ],
    "reviewerName": "vijaikottesh",
    "language": "en-IN",
    "isInternational": true,
    "position": 10,
    "reviewUrl": "https://www.amazon.com/gp/customer-reviews/R1M7Z45G1CXG6M",
    "productUrl": "https://www.amazon.com/dp/1501110365",
    "store": "amazon.com",
    "productRating": 4.7,
    "productRatingsCount": 411738,
    "ratingHistogram": { "5": 78, "4": 16, "3": 5, "2": 1, "1": 0 },
    "customersSay": "Customers find this novel engaging and emotional, describing it as heartwarming and heartbreaking, ...",
    "scrapedAt": "2026-10-20T11:39:34+00:00"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data fields

| Field | Description |
|---|---|
| `reviewId` | Amazon's review ID. Each review is saved once per run, even if it shows on several stores' pages. |
| `productAsin` | ASIN of the product you asked for. |
| `productTitle` | Product title as the store shows it. |
| `rating` | Stars given, 1–5 (number). |
| `title`, `text` | Review headline and full text (paragraphs separated by line breaks). |
| `date` | Review date as `YYYY-MM-DD`. Amazon shows only a calendar day, with no time or timezone. It is read from the localized line, e.g. "Reviewed in Canada on September 1, 2026" or "Comentado en México el 7 de octubre de 2026". |
| `country` | Country the review was written in, as the store prints it (in the store's language on stores that do not answer in English, e.g. "México"). |
| `verifiedPurchase` | `true` when Amazon marks the review "Verified Purchase". |
| `helpfulVotes` | Number of people who found the review helpful (0 when none). |
| `variantAttributes` | Variant the reviewer bought, e.g. `{"Size": "Large", "Color": "Black"}`; empty when the product has no variants. |
| `imageUrls` | Full-size photos the reviewer uploaded; empty when there are none. |
| `reviewerName` | Public display name of the reviewer. |
| `language` | Language the review was written in, e.g. `de-DE`, `ar-AE`. |
| `isInternational` | `true` for reviews from the "Top reviews from other countries" list. |
| `position` | Order on the product page (1 = first). |
| `reviewUrl`, `productUrl`, `store` | Links to the review and product, and the Amazon store. |
| `productRating`, `productRatingsCount` | Product's average stars and total number of ratings. |
| `ratingHistogram` | Percent of ratings per star, e.g. `{"5": 78, "4": 16, ...}`. |
| `customersSay` | Amazon's AI-written "Customers say" summary; `null` on products or stores that do not show one. |
| `scrapedAt` | When the row was saved (UTC). |

### How much does it cost to scrape Amazon reviews?

You pay per review saved; see the **Pricing** tab for the exact price. Links that give no reviews (not an Amazon link, a product with no reviews, a product Amazon would not show) are never charged. They are listed in the **FAILED_INPUTS** record of the run's key-value store with the reason. A product usually takes 2–10 seconds, and 12 products from 12 stores finished in about 36 seconds in our tests. Platform usage is a tiny fraction of a cent per product, because pages are fetched over plain HTTP and almost never need residential proxies.

### Tips

- **Get more reviews of the same product** by adding its link from other Amazon stores (for example amazon.com, amazon.co.uk and amazon.de). Each store shows its own top reviews, and duplicates across stores are saved only once.
- Mix as many products and stores as you like in one run. Several are processed at once.
- Use the **Max cost per run** option on Apify to cap spending. The Actor stops cleanly when the cap is reached.
- Schedule the Actor daily to watch new top reviews and rating changes on competing products.

### FAQ, disclaimers and support

**Why do I get only about 8–13 reviews per product?** That is all Amazon shows to a visitor who is not signed in. The rest of the review list requires an Amazon login, and this Actor deliberately does not use accounts or cookies. On amazon.com, Amazon also hides the reviews from some visitors ("Sign in to see customer reviews"). The Actor retries with a fresh session until the reviews are shown.

**Why did a product give no reviews?** Check FAILED_INPUTS in the key-value store. Typical reasons are a link that is not a product, an ASIN the store does not list (Amazon answers "page not found"; recorded as *not found* within a few seconds and never retried through paid proxies), a product with no written reviews yet (including products that have star ratings but no review text), or (rarely) Amazon refusing every attempt. Not-found products, products without reviews and invalid links are settled answers: the run still succeeds. The run fails only when every product hit an error on Amazon's side.

**Can it sort or filter reviews by stars, date or keyword?** No. Amazon's filters and sorting live on the sign-in-only review pages. You get the top reviews in the order Amazon shows them.

**Is it legal to scrape Amazon reviews?** This Actor reads only publicly visible product pages and does not log in. Reviews include reviewers' public display names, which may count as personal data under GDPR and similar laws. Only collect and use it if you have a legitimate reason, and check Amazon's terms and your local law. Note that Amazon's robots.txt restricts automated access. If unsure, consult a lawyer.

**Found a bug or need a custom solution?** Open an issue on the **Issues** tab. Custom Amazon data solutions are available on request.

# Actor input Schema

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

One per line. Paste product links from any Amazon store (amazon.com, amazon.co.uk, amazon.de, amazon.fr, amazon.it, amazon.es, amazon.ca, amazon.in, amazon.com.au, amazon.co.jp, amazon.ae, amazon.sa, amazon.com.br, amazon.com.mx and more): /dp/, /gp/product/ and /product-reviews/ links, and amzn.to or a.co short links, all work, and each link's store is read from it. A bare ASIN such as B09B8V1LZ3 uses the store chosen under "Store for bare ASINs".

## `maxReviewsPerProduct` (type: `integer`):

Stops after this many reviews for each product. Without signing in, Amazon shows only a product's top reviews, usually 8 to 13, so the default keeps every review that is available.

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

Only used for lines that are a bare ASIN. Product links always use the store in the link.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.amazon.com/dp/B09B8V1LZ3"
  ],
  "maxReviewsPerProduct": 100,
  "country": "US"
}
```

# Actor output Schema

## `dataset` (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/dp/B09B8V1LZ3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/amazon-reviews-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 = { "productUrls": ["https://www.amazon.com/dp/B09B8V1LZ3"] }

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/amazon-reviews-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 '{
  "productUrls": [
    "https://www.amazon.com/dp/B09B8V1LZ3"
  ]
}' |
apify call mina_safwat/amazon-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mina_safwat/amazon-reviews-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/cl9iPFeSRhibQlyfn/builds/utmi8kJlwef0B5opi/openapi.json
