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

Scrape Amazon product reviews with correct ratings, publish dates and verified-purchase status, plus Amazon's own aspect sentiment. Priced per product, not per review.

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

## Pricing

from $10.00 / 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Amazon Reviews Scraper API

Extracts Amazon customer reviews with the fields other scrapers get wrong: the
rating the reviewer actually gave, the day the review was published, whether it
was a verified purchase, which product variant it was written against, and how
many people found it helpful.

Alongside the reviews it returns Amazon's own analysis of **all** of a product's
reviews, which no other Amazon reviews scraper returns: the star histogram, the
"Customers say" summary, and a per-aspect sentiment breakdown with mention
counts, a positive and negative split, and quoted evidence.

Priced per product, not per review, so a run's cost is arithmetic you can do
before you start it.

### How many Amazon reviews you can actually scrape, and why it is not 500

Read this before you compare us to anything else on the store.

**Since late 2025, Amazon has required a signed-in account to see a product's
full review list.** Every route that used to serve filtered, sorted or paginated
reviews now answers a signed-out client with a sign-in page:

| Route                                                          | What a signed-out client gets |
| -------------------------------------------------------------- | ----------------------------- |
| `/product-reviews/<ASIN>`                                      | sign-in page                  |
| `/portal/customer-reviews/<ASIN>`                              | sign-in page                  |
| `/gp/aw/cr/<ASIN>`                                             | sign-in page                  |
| `/hz/reviews-render/ajax/reviews/get/`                         | HTTP 403                      |
| `?filterByStar=`, `?sortBy=`, `?pageNumber=` on a product page | ignored                       |

Measured on 2026-08-28 from a plain browser and through residential proxies in
several countries, including amazon.co.jp.

**What is left is the review block on the product page itself.** Measured across
products in unrelated categories, that block is **8 to 20 full reviews** for a
product with meaningful review volume, and fewer for a product with only a
handful of ratings. It is deterministic - the same reviews on every request -
and shared across a product's variants, so fetching a variant does not add any.
There is no page two.

So: **no scraper without an Amazon login can return 500 reviews for a product,
and one that promises to cannot deliver it.** The incumbents' own issue trackers
record when this landed on them, in their users' words:

- 2025-11-20: *"now it can only crawl 8 reviews for any product"*
- 2026-03-03: *"Amazon reviews scraper is now only returning 8 reviews, previously it returned 100"*
- 2026-03-07: *"Actor returns only 8 reviews despite maxReviews=500"*

We chose to say this on the listing rather than let you discover it after
paying, and to make the most of what is reachable instead.

#### Scraping more Amazon reviews than the product page shows

Amazon's review-insights widget quotes reviews as evidence for each aspect, and
links each quote to its review. Those reviews are mostly **not** in the rendered
block, so the excerpts are the only text from them a signed-out client can
reach. Measured over six products in unrelated categories:

| Per product                      | Reviews reached |
| -------------------------------- | --------------- |
| Full reviews on the page         | 13              |
| Aspect-linked excerpts beyond it | ~31             |
| **Distinct reviews reached**     | **~44**         |

Excerpts are returned as excerpts, on the aspect they belong to, never mixed in
with full reviews.

### Amazon review data you get back: ratings, dates and verified purchase

Two kinds of record.

#### One record per Amazon review

```json
{
  "reviewId": "R1RLJMX8S5STRH",
  "url": "https://www.amazon.com/portal/customer-reviews/srp/-/R1RLJMX8S5STRH",
  "asin": "B088NMR44C",
  "productAsin": "B088NRLMPV",
  "productTitle": "Anker USB C to USB C Cable, 60W Fast Charging Cable (2-Pack, 6 ft, Black)",
  "ratingScore": 5,
  "title": "Reliable cable with fast charging and excellent durability",
  "text": "I've bought several Anker cables over the years, and this one lives up to the brand's reputation...",
  "date": "2026-07-29",
  "dateText": "Reviewed in the United States on July 29, 2026",
  "country": "US",
  "isVerifiedPurchase": true,
  "isVineVoice": false,
  "helpfulVotes": 6,
  "variantAttributes": [
    { "key": "Size", "value": "3.3FT*2" },
    { "key": "Color", "value": "Black" },
    { "key": "Number of Items", "value": "2" }
  ],
  "imageUrls": [],
  "reviewer": null,
  "language": "en-US",
  "countryCode": "US"
}
```

#### Star histogram, "Customers say" and Amazon aspect sentiment

One summary record per product, carrying what Amazon computed over every review
the product has:

```json
{
  "type": "productSummary",
  "asin": "B088NRLMPV",
  "productTitle": "Anker USB C to USB C Cable, 60W Fast Charging Cable (2-Pack, 6 ft, Black)",
  "brand": "Anker",
  "ratingScore": 4.7,
  "ratingsCount": 87397,
  "reviewsReturned": 13,
  "starsBreakdown": { "5star": 0.87, "4star": 0.08, "3star": 0.02, "2star": 0.01, "1star": 0.02 },
  "customersSay": "Customers find the USB C cable to be well-made and functional, with good length and flexibility...",
  "aspects": [
    {
      "aspect": "Quality",
      "sentiment": "positive",
      "mentions": 5692,
      "positive": 5126,
      "negative": 566,
      "summary": "Customers find the cable to be of good quality and well-made.",
      "quotes": [
        {
          "reviewId": "R193O3CSMLKQLB",
          "text": "Good quality. I use these for charging my phone at home, off a computer, in the car."
        }
      ]
    }
  ]
}
```

Tell them apart by the `type` field: review records do not have one.

### Correctness: review ratings, publish dates and variant attribution

Each of these is a defect reported against an actor currently on the store.

**`ratingScore` is the rating the reviewer gave.** It is read from the rating's
own text, not from the CSS class, which is rounded to whole stars.

**Every review is dated.** `date` is an ISO day and `dateText` keeps Amazon's own
wording beside it. Dates are parsed from the marketplace language, so
`Bewertet in Deutschland am 24. Juni 2026` becomes `2026-06-24`. Amazon publishes
day resolution and never a time, so neither do we.

**A review is attributed to the variant it was written for.** On a parent
listing, two thirds of reviews are written against a specific variant, and `asin`
says which while `productAsin` says which page it came from. Reporting the page's
ASIN for all of them is how the same review ends up filed under several products.

**Reviews from other Amazon storefronts are labelled.** Amazon mixes them into
the same list without a heading; on amazon.com about a third of the block is from
elsewhere. `country` says where each one was written.

**Helpful votes are never silently lost.** Amazon writes the singular without a
digit, "One person found this helpful", which a number parser reads as nothing.
That is one vote, not no evidence.

**The review body is the review.** Amazon wraps it in screen-reader text ("Brief
content visible, double tap to read full content") that a naive read glues onto
every review.

**The star histogram is null rather than five zeros** when Amazon has too few
ratings to break one down, because five zeros claims a measurement nobody made.

### How to filter Amazon reviews by star rating, date and verified purchase

| Input                    | What it does                                                               |
| ------------------------ | -------------------------------------------------------------------------- |
| `productUrls`            | Product URLs or bare ASINs. **Several per run, and every one is scraped.** |
| `maxReviewsPerProduct`   | Cap reviews kept per product. Empty means everything Amazon publishes.     |
| `filterByRatings`        | Keep only these star ratings.                                              |
| `verifiedPurchaseOnly`   | Keep only badged verified purchases.                                       |
| `reviewsCutoffDate`      | `2026-01-15`, or `30 days` / `6 months` / `1 year`.                        |
| `sort`                   | Amazon's own top-reviews order, most recent, or by rating.                 |
| `includeAspectSentiment` | Amazon's aspect breakdown. On by default.                                  |
| `includeReviewerProfile` | Reviewer name and profile id. Off by default; see Legal.                   |
| `countryCode`            | Which of 23 Amazon storefronts to read.                                    |
| `language`               | Ask Amazon for the page in a given language.                               |
| `proxyConfiguration`     | Residential is effectively required.                                       |

**Filtering and sorting run over the reviews Amazon publishes.** They do not
fetch more, because there is no more to fetch. A star filter here narrows a block
of about a dozen; it does not reach Amazon's own one-star page, which is behind
the sign-in described above. Actors that imply otherwise carry issues titled
"Filter by stars doesnt work" and "Start date and end date not working".

A review whose date could not be parsed is **kept** by a date filter rather than
dropped, so a parsing failure never quietly narrows your results.

### Pricing: pay per product, not per Amazon review

One event: **$0.012 per product**. Everything that product yields is included -
its reviews, the rating breakdown, the aspect sentiment and the quoted evidence.

A run costs `products x $0.012`, and you can work that out before starting it.
Charging per review, as the rest of this niche does, quotes a price against a
count nobody can predict; at $3.00 per 1,000 reviews and roughly a dozen reviews
per product, the same product costs about $0.03 elsewhere, plus a minimum
permitted charge of $0.50 per run.

A product with no reviews still costs $0.012, because the page was still
fetched, and you get an honest `no_reviews_found` record rather than silence.

A product Amazon serves **without its review block** is different, and is not
charged. A listing reporting thousands of ratings always renders reviews, so a
page that arrives with none is an incomplete page rather than an answer: it is
retried on fresh sessions, and if it keeps coming back that way you get an error
record saying so and pay nothing for it.

### Supported Amazon marketplaces, 23 storefronts

`amazon.com`, `.ca`, `.com.mx`, `.com.br`, `.co.uk`, `.ie`, `.de`, `.fr`, `.it`,
`.es`, `.nl`, `.com.be`, `.se`, `.pl`, `.com.tr`, `.ae`, `.sa`, `.eg`, `.in`,
`.co.jp`, `.sg`, `.com.au`, `.co.za`.

Review dates, helpful-vote counts and aspect mention counts are parsed in the
marketplace's own language and number format, so a German run reads
`1.234 Personen` as 1,234 rather than as 1.234.

### Proxies for scraping Amazon reviews without being blocked

Amazon serves an anti-bot interstitial to unproxied clients, so Apify Proxy with
the `RESIDENTIAL` group is the default and is effectively required. The exit
country defaults to the marketplace's own country.

### Errors: products with no reviews, 404s and blocked pages

Failures are pushed to the dataset rather than swallowed, so a partial run can be
reconciled against what you asked for. Error records carry an `error` field;
normal records never do.

```json
{
  "error": "no_reviews_found",
  "errorDescription": "Amazon renders no reviews on this product page.",
  "input": "https://www.amazon.com/dp/B0XXXXXXXX",
  "url": "https://www.amazon.com/dp/B0XXXXXXXX"
}
```

| `error`             | Meaning                                                                                                                                                                                                                                      |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `product_not_found` | The product URL returns a 404 page.                                                                                                                                                                                                          |
| `no_reviews_found`  | The product exists and Amazon publishes no reviews for it, or none matched your filters. Also used when Amazon served the page without its review block despite the product having ratings, in which case the run is **not charged** for it. |
| `request_failed`    | The page could not be fetched after retries.                                                                                                                                                                                                 |
| `blocked`           | Amazon served an anti-bot page.                                                                                                                                                                                                              |
| `invalid_url`       | A start URL was not an Amazon URL or ASIN.                                                                                                                                                                                                   |

### Legal and GDPR: reviewer names are personal data

Product ratings, review text and helpful-vote counts are publicly available data.
A reviewer's **name and profile id are personal data**, protected by GDPR in the
EU and by comparable rules elsewhere. They are off by default; enable
`includeReviewerProfile` only if you have a legitimate reason to hold them.

Amazon's terms prohibit automated access. Use this where you are entitled to.

### Telemetry

The actor reports run health to its maintainer: error codes, the build number,
the marketplace domain, and per-field counts of how often a value was found.

When requests fail, it also sends a small, capped sample of the failures
themselves, so that a broken run can be diagnosed and fixed: the Amazon URL that
was requested, the HTTP status code that came back, and the error with its stack
trace. **That URL is the page you asked for, query string included.** It is not
personal data, but it is your input, and this section says so rather than leave
you to find out.

Your other input settings, your proxy configuration, and the scraped content
itself are never sent. Nothing at all is sent when a run is healthy.

# Actor input Schema

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

The products whose reviews you want. Accepts full Amazon product URLs or bare 10-character ASINs, and every entry is scraped. A bare ASIN is resolved against the marketplace the other URLs point at, or against <b>Marketplace</b> below.

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

Cap the reviews kept per product. Leave empty for everything Amazon publishes, which is 8 to 20 for a product with real review volume and fewer for one with few ratings. Read <b>What Amazon actually serves</b> in the README before setting this high: there is no page two to fetch.

## `filterByRatings` (type: `array`):

Keep only reviews at these star ratings. Applied to the reviews Amazon publishes on the product page, because its own star-filtered pages require a signed-in Amazon account and are not reachable.

## `verifiedPurchaseOnly` (type: `boolean`):

Keep only reviews carrying Amazon's Verified Purchase badge.

## `reviewsCutoffDate` (type: `string`):

Drop reviews older than this. Absolute (<code>2026-01-15</code>) or relative (<code>30 days</code>, <code>6 months</code>, <code>1 year</code>). A review whose date could not be parsed is kept rather than silently dropped.

## `sort` (type: `string`):

Order of the returned reviews. <b>Top reviews</b> keeps Amazon's own ranking, which is the order the page renders.

## `includeAspectSentiment` (type: `boolean`):

Amazon's own per-aspect breakdown, computed over every review a product has rather than over the ones on the page: mention counts, the positive and negative split, and a sentence per aspect.

## `includeReviewerProfile` (type: `boolean`):

A reviewer's name and profile id are personal data, protected by GDPR in the EU and by comparable rules elsewhere. Enable this only if you have a legitimate reason to hold it.

## `countryCode` (type: `string`):

Which Amazon storefront to read. Ignored when the product URLs already name one.

## `language` (type: `string`):

Ask Amazon for the page in this language, when the marketplace offers it. Review dates and helpful-vote counts are parsed in whatever language comes back.

## `proxyCountry` (type: `string`):

Exit country for the proxy. Defaults to the marketplace's own country, which is what Amazon expects to see.

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

Amazon serves an anti-bot interstitial to unproxied clients, so a residential proxy is effectively required.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.amazon.com/dp/B088NRLMPV"
  ],
  "verifiedPurchaseOnly": false,
  "sort": "helpful",
  "includeAspectSentiment": true,
  "includeReviewerProfile": false,
  "countryCode": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every review Amazon publishes for the products you asked for, with its publish date, verified-purchase status, variant and helpful votes.

# 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/B088NRLMPV"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

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

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

```

## MCP server setup

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