# Amazon Reviews Scraper - Ratings, Verified Purchases & Images (`automly/amazon-reviews-scraper`) Actor

Scrape Amazon customer reviews by ASIN or product URL: review text, star rating, title, author, date, verified purchase badge, helpful votes, variant, language and review images. Merge marketplaces and variants for more reviews per product. No login, no cookies.

- **URL**: https://apify.com/automly/amazon-reviews-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Reviews Scraper — review text, star ratings, verified purchases and review images

**Amazon Reviews Scraper** extracts customer reviews from Amazon product pages by ASIN or product URL. Every review comes back as one row with the star rating, review title, full review text, author, date, country, Verified Purchase badge, helpful votes, the product variant it was written for, the review's language, and any photos the reviewer attached. Export to JSON, CSV, Excel or XML, or pull it straight from the Apify API.

No Amazon account, no session cookie and no headless browser. You give it products, it gives you reviews.

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Amazon.

### What does Amazon Reviews Scraper do?

It reads the customer reviews Amazon publishes on a product page and turns them into structured data. You can point it at:

- **ASINs** such as `B07N7KFHVH`, pasted as a list
- **Amazon product URLs** such as `https://www.amazon.com/dp/B07N7KFHVH`
- **Amazon review URLs** — the product ID is taken from the link

It works across Amazon marketplaces: amazon.com, co.uk, de, fr, it, es, ca, com.mx, in, co.jp and com.au. A URL's own domain always wins, so a list mixing amazon.com and amazon.de links is read on both sites without extra configuration.

### What data does it extract from each Amazon review?

| Field | Description |
|---|---|
| `review_id` | Amazon's own review ID, stable across runs and across marketplaces. Use it to deduplicate when monitoring. |
| `rating` | Star rating as a number, 1 to 5 |
| `title` | Review headline |
| `body` | Full review text, with the reviewer's paragraph breaks kept |
| `author_name` | Reviewer's display name |
| `author_profile_url` | Link to the reviewer's public Amazon profile |
| `review_url` | Permalink to the review |
| `date` | Review date as ISO `YYYY-MM-DD` |
| `date_raw` | The date exactly as Amazon printed it |
| `country` | Country the review was written in, for example "United States" |
| `verified_purchase` | True when Amazon shows the Verified Purchase badge |
| `is_vine` | True for Vine Customer Review of Free Product |
| `helpful_votes` | Number of people who found the review helpful, as a number |
| `variant` | The variant the review is about, for example "Color: Large | Copper" |
| `variant_asin` | That variant's own ASIN |
| `language` | Language the review was written in, for example `en-US` |
| `images` | Reviewer photos, as full-size image URLs |
| `asin` | The product you asked for |
| `source_asin` | The product page this review was read from, which differs when variants are included |
| `marketplace` | Which Amazon site it came from, for example `amazon.co.uk` |
| `product_title`, `product_rating`, `product_rating_count`, `product_rating_distribution` | Product context on every row, so a single review row is enough for analysis |
| `position`, `scraped_at` | Order within the run and the UTC timestamp |

### How many Amazon reviews can you scrape per product?

Amazon publishes about **8 to 10 reviews per product page** to visitors who are not signed in. The dedicated reviews pages, `/product-reviews/<ASIN>` and the star-filter links, redirect to a sign-in form, and the pagination endpoint the page used to call now answers 404. Measured on 2026-09-20 with a real browser as well as an HTTP client, so it is Amazon's behaviour, not a limit of this Actor. Any tool promising "all reviews" without a login is promising something Amazon stopped serving.

Amazon Reviews Scraper gets past that ceiling by merging sets of reviews instead of paginating one:

- **Read the same product on several marketplaces.** Amazon shows a different set of reviews per storefront. Adding `co.uk`, `ca` and `com.au` typically turns 8 reviews into 25 to 35. Reviews are deduplicated by review ID, so nothing is counted twice.
- **Read the product's variants.** Each colour or size has its own page with its own reviews. A product with ten variants has roughly ten times the reviews available.

Both are off by default, because both cost extra page fetches. Turn them on when you need depth.

### How do I scrape Amazon reviews?

1. Add your ASINs, or paste Amazon product URLs.
2. Set **Maximum reviews per product**. It is a budget: the Actor stops fetching as soon as it has enough.
3. To go deeper, list extra marketplaces in **Also read these marketplaces**, or set **Also read this many product variants**.
4. Optionally filter by star rating, Verified Purchase or date.
5. Keep the residential proxy setting on. Amazon serves a stripped page with no reviews to datacenter addresses.
6. Run it, then download the dataset as JSON, CSV or Excel, or read it from the API.

### Input options

| Option | What it does |
|---|---|
| `asins` | Product IDs to scrape |
| `startUrls` | Amazon product or review URLs |
| `marketplace` | Which Amazon site to use for bare ASINs |
| `maxReviewsPerProduct` | Upper bound per product |
| `alsoSearchMarketplaces` | Extra storefronts to merge, for example `co.uk`, `ca` |
| `maxVariantsPerProduct` | How many colour or size variants to read as well |
| `minRating`, `maxRating` | Keep only reviews in a star range |
| `verifiedPurchasesOnly` | Keep only Verified Purchase reviews |
| `reviewsStartDate`, `reviewsEndDate` | Keep only reviews in a date range |
| `includeProductDetails` | Add product title, overall rating and star distribution to each row |
| `concurrency` | How many products to fetch at once |
| `proxyConfiguration` | Residential proxy settings |

### Output example

```json
{
  "review_id": "R3QZ12747962W7",
  "asin": "B07N7KFHVH",
  "variant_asin": "B0D5DM136R",
  "rating": 5,
  "title": "great product",
  "body": "I am very pleased with this garlic press. It presses garlic quickly with very little effort.\n\nMy only regret is that I wish I had purchased the larger model.",
  "author_name": "George Pinell",
  "author_profile_url": "https://www.amazon.com/gp/profile/amzn1.account.AE3SWAAR6UPKOHMUEPU2I3SUZUNA",
  "review_url": "https://www.amazon.com/portal/customer-reviews/srp/-/R3QZ12747962W7",
  "date": "2026-07-20",
  "date_raw": "Reviewed in the United States on July 20, 2026",
  "country": "United States",
  "verified_purchase": true,
  "is_vine": false,
  "helpful_votes": 5,
  "variant": "Color: Large | Copper",
  "language": "en-US",
  "images": [],
  "marketplace": "amazon.com",
  "product_title": "Zulay Kitchen Premium Garlic Press Set",
  "product_rating": 4.6,
  "product_rating_count": 51884,
  "product_rating_distribution": { "5_star_pct": 78, "4_star_pct": 13, "3_star_pct": 5, "2_star_pct": 2, "1_star_pct": 2 },
  "position": 1,
  "scraped_at": "2026-09-20T15:40:12.001Z"
}
```

### Can I filter Amazon reviews by star rating, verified purchase or date?

Yes. Set a star range, a Verified Purchase toggle, or a date range, and only matching reviews are written to the dataset.

One thing worth knowing: Amazon no longer applies those filters on the public product page, so no tool can ask Amazon for one-star reviews only. Filtering happens after the page is read. You get exactly the reviews you asked for; they simply cost the same page fetch as an unfiltered run.

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

You pay per review returned, plus Apify platform usage. See the Pricing tab for the current rate. Because the price is per review, a product with four reviews costs a fifth of one with twenty, and a run that returns nothing costs nothing but platform time.

### Is it legal to scrape Amazon reviews?

Scraping publicly available data is broadly lawful in the US and the EU, and this Actor reads only what Amazon shows to any visitor without an account. It does not log in, does not bypass a paywall and does not collect anything behind authentication.

Reviews do contain personal data, such as a reviewer's display name and profile link. If you are in the EU or handling EU residents' data, you need a legal basis under the GDPR for storing it, and you should drop the author fields when you do not need them. Use the data responsibly, and follow Amazon's terms and applicable law. This is not legal advice.

### What can you do with Amazon review data?

- **Product research.** Read what buyers complain about before sourcing a product, and size the complaint by how many people found the review helpful.
- **Sentiment analysis.** Feed review text to a language model or a classifier. Each row carries the rating as a label.
- **Competitor monitoring.** Track a rival's new reviews on a schedule and alert on one- and two-star arrivals.
- **Quality control.** Catch a defect pattern early by filtering to critical reviews from the last 30 days.
- **Listing optimisation.** See which variant attracts the complaints and fix the listing or the packaging.

### Using Amazon Reviews Scraper with the Apify API

Start a run and collect the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/automly~amazon-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"asins":["B07N7KFHVH"],"maxReviewsPerProduct":10}'
```

The Actor also works with the Apify Python and JavaScript clients, with scheduled runs, and with integrations such as Zapier, Make, Google Sheets, Slack and webhooks.

### Frequently asked questions

**Do I need an Amazon account or a session cookie?**
No. Amazon Reviews Scraper reads only the reviews Amazon publishes to anonymous visitors. You never hand over credentials.

**How many reviews will I actually get per product?**
About 8 to 10 from a single marketplace. Adding three more marketplaces usually brings 25 to 35, and reading variants adds roughly another 8 per variant. The numbers depend on how many reviews the product has.

**Why do some products return fewer reviews than the product page shows?**
The rating count on a listing counts ratings without text as well. Only reviews with text are published on the page, and only those are returned.

**Can it scrape reviews in other languages?**
Yes. Reviews are returned exactly as written, and each row carries a `language` field, so a pull across marketplaces stays sortable by language.

**Does it return review photos and videos?**
Photos, yes, as full-size image URLs. Videos are not returned.

**Can I scrape reviews for a whole category or a search term?**
Not directly. Give it products. Pair it with an Amazon product scraper to turn a search or a category into a list of ASINs, then feed those here.

**How do I avoid being blocked?**
Keep the residential proxy setting on and leave concurrency at the default. Amazon serves a stripped page without reviews to datacenter IP addresses, and this Actor reports that case as an error rather than silently returning nothing.

**Can I run it on a schedule and only get new reviews?**
Yes. Schedule the Actor, then deduplicate on `review_id`, which is stable across runs and marketplaces.

**What happens if a product has no reviews?**
You get no rows for it and a line in the log. A product whose page came back without the review section is reported separately as an error, so a block never looks like an empty product.

### Support

Found a product that does not parse, or a field you need? Open an issue on the Actor's Issues tab with the ASIN and the marketplace, and it will be looked at.

# Actor input Schema

## `startUrls` (type: `array`):

Product pages to read reviews from. Reviews URLs work too: the ASIN is taken from the link. Example: https://www.amazon.com/dp/B07N7KFHVH

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

Amazon product IDs, the 10 characters after /dp/ in a product URL. Use these instead of URLs when you already have the IDs.

## `marketplace` (type: `string`):

Which Amazon site to read. A URL's own domain always wins over this setting.

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

Upper bound per product. Amazon serves roughly 8 to 10 reviews per product page to visitors who are not signed in, so a higher number does not add rows.

## `includeProductDetails` (type: `boolean`):

Adds the product title, overall star rating, total rating count and star distribution to every review row.

## `concurrency` (type: `integer`):

How many products to fetch at once. Lower it if Amazon starts refusing requests.

## `alsoSearchMarketplaces` (type: `array`):

Read the same ASIN on other Amazon storefronts and merge the results. Amazon shows a different set of reviews per storefront, so co.uk, ca and com.au typically turn ~8 reviews into ~25-35. Duplicates are removed by review ID.

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

Each colour or size of a product has its own page with its own reviews. 0 reads only the product you asked for. Every variant costs one more page fetch.

## `minRating` (type: `integer`):

Keep reviews at or above this rating. Amazon no longer applies star filters on the public product page, so this is applied to the reviews after they are read.

## `maxRating` (type: `integer`):

Keep reviews at or below this rating. Set minimum 1 and maximum 2 to mine complaints.

## `verifiedPurchasesOnly` (type: `boolean`):

Drop reviews without the Verified Purchase badge.

## `reviewsStartDate` (type: `string`):

ISO date, for example 2026-01-01. Reviews whose date could not be read are dropped when a date filter is set.

## `reviewsEndDate` (type: `string`):

ISO date, for example 2026-06-30.

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

Residential proxies are strongly recommended: Amazon serves a stripped page without reviews to datacenter addresses.

## Actor input object example

```json
{
  "startUrls": [],
  "asins": [
    "B07N7KFHVH",
    "B0DG3SL8ZN"
  ],
  "marketplace": "com",
  "maxReviewsPerProduct": 10,
  "includeProductDetails": true,
  "concurrency": 4,
  "alsoSearchMarketplaces": [
    "co.uk",
    "ca",
    "com.au"
  ],
  "maxVariantsPerProduct": 0,
  "verifiedPurchasesOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

Every scraped review with the columns most people use: rating, title, text, author, date, verified purchase, helpful votes, variant and product.

## `ratingsOnly` (type: `string`):

Just the numbers: ASIN, rating, date, verified purchase and helpful votes, for charting or scoring.

## `rawDataset` (type: `string`):

Every field of every review, including images, language, review URL, reviewer profile and the product's rating distribution.

# 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 = {
    "startUrls": [],
    "asins": [
        "B07N7KFHVH"
    ],
    "alsoSearchMarketplaces": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = {
    "startUrls": [],
    "asins": ["B07N7KFHVH"],
    "alsoSearchMarketplaces": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/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 '{
  "startUrls": [],
  "asins": [
    "B07N7KFHVH"
  ],
  "alsoSearchMarketplaces": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call automly/amazon-reviews-scraper --silent --output-dataset

```

## MCP server setup

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