---
title: "Amazon reviews scraper"
description: "Scrape Amazon reviews as JSON: star rating, title, text, date, verified purchase, helpful votes and the star breakdown. One API request from Python, Node.js or MCP."
canonical: https://www.zenrows.com/scrape/amazon-reviews
updated: 2026-10-20
---

# Amazon reviews scraper

The Zenrows Amazon reviews scraper returns the reviews on any Amazon product page as JSON: review ID, author, star rating, title, text, date, verified purchase flag, helpful votes, the variant bought, plus the star breakdown and Amazon's review insights. Fetch in Adaptive Stealth Mode opens the page and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: amazon.com
- Returns: Review text, star ratings, dates, verified flags and the rating breakdown

## Run it: one product in, its reviews out

```json Input
{
  "url": "https://www.amazon.com/dp/B0CFPJYX7P",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "product": {
    "asin": "B0CFPJYX7P",
    "title": "Amazon Kindle Paperwhite 16GB (2024 model), 7\" glare-free display and weeks of battery life, Black",
    "brand": "Amazon"
  },
  "ratings_summary": {
    "average_rating": 4.6,
    "total_ratings": 23639,
    "five_star_percent": 84,
    "four_star_percent": 8,
    "three_star_percent": 3,
    "two_star_percent": 1,
    "one_star_percent": 4
  },
  "review_insights": [
    { "summary": "Customers are satisfied with the Kindle Paperwhite's battery life, noting that it charges fast and only needs to be charged once.", "mention_count": 773 },
    { "summary": "Customers have mixed feelings about the Kindle Paperwhite's compatibility, with some loving their device while others report issues with specific services like CloudLibrary and Hoopla.", "mention_count": 526 }
  ],
  "customer_reviews": [
    {
      "review_id": "R16VZW4L3CVV7H",
      "author": "A.",
      "rating": 5,
      "title": "Favorite Kindle!",
      "date": "August 4, 2026",
      "verified_purchase": true,
      "helpful_votes": 105,
      "variation_color": "Raspberry",
      "body": "I've had a Kindle Fire for years now and kept buying a new version when the old ones would give out…"
    },
    {
      "review_id": "R2XKH2JZWW7AV2",
      "author": "C. L.",
      "rating": 4,
      "title": "Try it, You will love it!!",
      "date": "October 14, 2026",
      "verified_purchase": true,
      "helpful_votes": null,
      "variation_color": "Raspberry",
      "body": "So, I’ve had the kindle Paperwhite for a couple of weeks now, and I am loving it…"
    }
  ]
}
```

Request and output of a live call to an Amazon product page on Oct 20, 2026, trimmed for length. The page returned eight reviews; two are shown.

## What review data can you scrape from Amazon?

Amazon prints its reviews on the product page, next to the star breakdown and a set of AI-written insights. Extract reads all three. Each review is one object in `customer_reviews[]`, and the summary fields describe every rating the product has, not only the reviews on the page.

| Field | What it holds | Example |
|---|---|---|
| `customer_reviews[].review_id` | Amazon's ID for the review, stable across requests, the key for deduplication | `R16VZW4L3CVV7H` |
| `customer_reviews[].author` | The reviewer's public display name | `A.` |
| `customer_reviews[].rating` | Stars the reviewer gave, 1 to 5 | `5` |
| `customer_reviews[].title` | The review headline | `Favorite Kindle!` |
| `customer_reviews[].body` | Full review text | `I've had a Kindle Fire for years now…` |
| `customer_reviews[].date` | Date the review was posted, as Amazon prints it | `August 4, 2026` |
| `customer_reviews[].verified_purchase` | Whether Amazon marks it as a verified purchase | `true` |
| `customer_reviews[].helpful_votes` | People who found the review helpful | `105` |
| `customer_reviews[].variation_color` | The color or variant the reviewer bought | `Raspberry` |
| `ratings_summary.average_rating` | Star average across all ratings | `4.6` |
| `ratings_summary.total_ratings` | Number of ratings behind the average | `23639` |
| `ratings_summary.five_star_percent` | Share of five-star ratings (four, three, two and one sit next to it) | `84` |
| `review_insights[].summary` | Amazon's one-line summary of what reviewers say about one topic | `Customers are satisfied with the… battery life…` |
| `review_insights[].mention_count` | How many reviews mention that topic | `773` |
| `product.asin` | The product the reviews belong to | `B0CFPJYX7P` |
| `product.title` | Listing title, to label the reviews in a report | `Amazon Kindle Paperwhite 16GB…` |

## How to scrape Amazon reviews with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Build the product URL from the ASIN.** `https://www.amazon.com/dp/ASIN` is the page that carries the reviews block, the star breakdown and the insights.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page, Extract to return the fields, and the US as the country for amazon.com.
4. **Read `customer_reviews` from `parsed`.** To skip the product fields, list only the review paths you want and the response returns just those.
5. **Run your ASIN list in Batch** and repeat it on a schedule. Each run adds the reviews you have not seen yet, keyed by `review_id`.

```python Python
# pip install requests
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.amazon.com/dp/B0CFPJYX7P",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

parsed = response.json()["parsed"]
summary = parsed.get("ratings_summary") or parsed.get("ratings")
print(summary["average_rating"], "from", summary.get("total_ratings"), "ratings")
for review in parsed.get("customer_reviews", []):
    print(review["rating"], review["date"], review["verified_purchase"], review["title"])
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.amazon.com/dp/B0CFPJYX7P",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
const lowStars = (parsed.customer_reviews ?? []).filter((r) => r.rating <= 3);
const summary = parsed.ratings_summary ?? parsed.ratings;
console.log(summary.average_rating, lowStars.map((r) => r.title));
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CFPJYX7P&mode=auto&extract=auto&proxy_country=us"

# Reviews and the star breakdown only
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.amazon.com%2Fdp%2FB0CFPJYX7P&mode=auto&extract=auto&proxy_country=us&extract_fields=customer_reviews%2Cratings_summary%2Creview_insights"
```

```python Python SDK
# pip install zenrows pandas
import pandas as pd
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://www.amazon.com/dp/B0CFPJYX7P",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
reviews = pd.json_normalize(response.json()["parsed"]["customer_reviews"])
reviews.to_csv("kindle-reviews.csv", index=False)
```

## Input

The input is a list of product URLs, one per request, with the same settings on each. The ASIN in the URL decides which product's reviews come back, so a review dataset starts as a list of ASINs.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | The product page, `https://www.amazon.com/dp/ASIN`, or the same path on another Amazon domain |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the reviews, star breakdown and insights as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Paths to keep, such as `customer_reviews,ratings_summary`. A bare group name keeps the whole group |
| `proxy_country` | string | any | Two-letter country code. Match it to the Amazon domain: `us` for amazon.com, `gb` for amazon.co.uk, `de` for amazon.de |
| `wait_for` | string | none | A CSS selector to wait for before the page is read. |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us",
    "extract_fields": "customer_reviews,ratings_summary,review_insights"
  },
  "tasks": [
    { "url": "https://www.amazon.com/dp/B0CFPJYX7P", "external_id": "B0CFPJYX7P" },
    { "url": "https://www.amazon.com/dp/B09B8V1LZ3", "external_id": "B09B8V1LZ3" },
    { "url": "https://www.amazon.com/dp/B0D1XD1ZV3", "external_id": "B0D1XD1ZV3" }
  ]
}
```

## Output

Every response carries `html`, the page as Amazon served it, and `parsed`, the structured record. Review fields sit in three groups: `customer_reviews` for the individual reviews, `ratings_summary` for the distribution, and `review_insights` for Amazon's topic summaries. Both samples below are trimmed outputs of live requests.

```json Reviews block
{
  "customer_reviews": [
    {
      "review_id": "R1OY8YYL9E59N1",
      "author": "M. S.",
      "rating": 5,
      "title": "A skeptic turned Kindle lover!",
      "date": "October 11, 2026",
      "verified_purchase": true,
      "helpful_votes": 7,
      "variation_color": "Black",
      "variation_configuration": null,
      "body": "I was honestly skeptical about getting a Kindle because I’ve always loved reading an actual book and physically turning the pages…"
    },
    {
      "review_id": "R1B0BCM8PH5LOI",
      "author": "E.",
      "rating": 5,
      "title": "Lifesaver for a new mom",
      "date": "July 15, 2026",
      "verified_purchase": true,
      "helpful_votes": 17,
      "variation_color": "Raspberry",
      "variation_configuration": null,
      "body": "As a frequent reader I was struggling postpartum with my inability to read while never having more than one free hand…"
    },
    {
      "review_id": "RWCVBYDECCHR1",
      "author": "C. C.",
      "rating": 5,
      "title": "Great product for avid readers!",
      "date": "September 27, 2026",
      "verified_purchase": true,
      "helpful_votes": null,
      "variation_color": "Jade",
      "variation_configuration": null,
      "body": "Must have for avid readers!! Lightweight and easy on the eyes!! Long battery life, no need to keep charging…"
    }
  ]
}
```

```json Ratings and insights
{
  "product": {
    "asin": "B09B8V1LZ3",
    "title": "Amazon Echo Dot (newest model), Vibrant sounding speaker, Designed for Alexa+, Great for bedrooms, dining rooms and offices, Charcoal"
  },
  "badges": { "amazons_choice": true },
  "ratings_summary": {
    "average_rating": 4.7,
    "total_ratings": 201154,
    "five_star_percent": 82,
    "four_star_percent": 11,
    "three_star_percent": 3,
    "two_star_percent": null,
    "one_star_percent": 3
  },
  "review_insights": [
    { "summary": "Customers praise the sound quality of the Echo Dot, describing it as very good and clear.", "mention_count": null, "sentiment": null },
    { "summary": "Customers have mixed experiences with the Echo Dot's reliability, with some finding it works well and performs great, while others report that it completely stops working.", "mention_count": null, "sentiment": null }
  ]
}
```

A field the page does not show comes back as `null`, as `two_star_percent` does on the Echo Dot. Load the reviews into pandas with `pd.json_normalize(parsed["customer_reviews"])` for a CSV, or ask for the page as Markdown when an LLM will read it.

## Scrape Amazon reviews from your coding agent

Claude Code, Cursor, Codex and any MCP client can pull Amazon reviews from a prompt and summarize them in the same session.

The agent sends the same Fetch and Extract request shown above and reads `customer_reviews` from the result. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.amazon.com/dp/B0CFPJYX7P" --proxy-country us
```

```text Then ask your agent
Use Zenrows to get the customer reviews, star breakdown and review insights
for these two Amazon products. List every review of 3 stars or less with
its date and the color bought, then compare the complaints:
https://www.amazon.com/dp/B0CFPJYX7P
https://www.amazon.com/dp/B0D1XD1ZV3
```

## Scrape Amazon reviews at scale with Batch and Crawl

**Batch** runs your ASIN list as one job, with the ASIN as the `external_id` on each result. Schedule the same job daily or weekly, store each review once by `review_id`, and the dataset grows as new reviews reach the product page.

**Crawl** builds the ASIN list when you only know the brand. Start it on a brand store, keep the links that contain `/dp/`, and it returns every product page it reaches. Feed those URLs to Batch to collect the reviews for a whole brand or category.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://www.amazon.com/dp/B0CFPJYX7P", "external_id": "B0CFPJYX7P" },
      { "url": "https://www.amazon.com/dp/B09B8V1LZ3", "external_id": "B09B8V1LZ3" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# review-asins.jsonl: one {"url": "https://www.amazon.com/dp/ASIN", "external_id": "ASIN", "extract": "auto"} per line
zenrows batch create review-asins.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out amazon-reviews.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.amazon.com/stores/Stanley/page/47A7E765-00AF-4F34-AC01-240A7EDD822A",
    "depth": 1,
    "max_pages": 150,
    "include_patterns": ["/dp/"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://www.amazon.com/dp/B0CFPJYX7P",
          "external_id": "amazon-reviews"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Amazon reviews

| Use case | Data they pull | Who runs it |
|---|---|---|
| Voice of customer for your own products | Low-star reviews, review text, variant bought, date | Product managers and CX teams |
| Competitor teardown | Review insights, mention counts and complaints on rival ASINs | Product marketing and category managers |
| Sentiment and topic models | Review title and body, rating as the label, verified flag as a filter | Data science and ML teams |
| Quality and defect alerts | New 1 and 2 star reviews per ASIN, posted since the last run | Quality, ops and brand protection teams |
| Launch tracking | Star breakdown and total ratings for a new ASIN, week over week | Brands, agencies and Amazon sellers |
| Review analysis in an AI assistant | The reviews block as JSON or the page as Markdown | AI and data teams |

## Tips for scraping Amazon reviews

- **Deduplicate on `review_id`.** The same review appears on the page for weeks. Store it once by its ID and update `helpful_votes` when it changes.
- **Read the breakdown and insights first.** `ratings_summary` and `review_insights` cover every rating on the product, so they answer "how do people rate it" before you parse a single review.
- **Use `variation_color` to split by variant.** One listing collects reviews from every color or size it sells. In the Kindle sample, reviews came from Black, Raspberry and Jade buyers on the same page.
- **Filter on `verified_purchase`** when the analysis should count only buyers Amazon has confirmed.
- **Parse dates per marketplace.** amazon.com prints `October 14, 2026`. Other Amazon domains use their own language and date order, so parse with the locale of the site you request.
- **Request each Amazon country site separately.** amazon.co.uk, amazon.de and amazon.in each show reviews to their own shoppers. Send the matching country with each domain and keep the domain next to the ASIN in your data.
- **Check the main product page too.** For prices, stock and the listing itself, use the [Amazon scraper](/scrape/amazon); the [Amazon ASIN scraper](/scrape/amazon-asin) covers identifiers and specs.

## Frequently asked questions

### Is it legal to scrape Amazon reviews?

Reviews on a public product page are visible to every visitor, and collecting them for product research and sentiment analysis is common practice. Reviews carry the reviewer's display name, and personal data is protected by laws such as the GDPR and the CCPA, so drop or pseudonymize names unless you have a legitimate reason to keep them. Check Amazon's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Amazon reviews API?

No. Amazon's Product Advertising API serves approved Amazon Associates and returns product and offer data, without review text. The Selling Partner API covers a seller's own catalog, orders and inventory. Neither returns the reviews of any product on demand, which is why teams read them from the product page.

### What review data does the scraper return?

For each review: ID, author name, star rating, title, full text, date, verified purchase flag, helpful votes and the variant bought. For the product: the average rating, the number of ratings, the share of each star level and Amazon's review insights with how many reviews mention each topic.

### How many reviews do I get per product?

The reviews Amazon shows on the product page. The Kindle Paperwhite page in our sample returned eight, while the star breakdown and insights described all 23,639 ratings. Running the same ASIN on a schedule collects new reviews as they reach the page, and the same product on another Amazon country site can show a different set.

### How do I scrape Amazon reviews with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the product URL, Adaptive Stealth Mode and Extract, as in the Python example above. response.json()["parsed"]["customer_reviews"] is a list of dictionaries, ready for pandas.

### Can I get only the reviews and skip the product fields?

Yes. List the groups you want, such as customer_reviews , ratings_summary and review_insights , and the response returns only those. The cURL and Batch examples above show the request.

### Can I scrape reviews for products on Amazon UK, Germany or India?

Yes. Use the product URL on that domain, such as https://www.amazon.co.uk/dp/ASIN , and set the matching country. Review text comes back in the language the site shows.

### Can AI agents scrape Amazon reviews with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the reviews of an ASIN in plain language and the agent calls Fetch and Extract, then reads the JSON to summarize or compare.

### Can I scrape Amazon on a schedule?

Yes. Create a scheduled Batch job with your Amazon URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Amazon reviews scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. A common setup sends new low-star reviews to Slack or a sheet from n8n or Make. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the reviews in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which suits LLM summarization and RAG.

### How is this different from the Amazon price scraper?

This page is about what buyers say. The Amazon price scraper tracks what products cost across sellers and countries, and the Amazon scraper covers product and search pages as a whole. All three use the same request.

## More Amazon scrapers

- [Amazon scraper](https://www.zenrows.com/scrape/amazon.md)
- [Amazon ASIN scraper](https://www.zenrows.com/scrape/amazon-asin.md)
- [Amazon price scraper](https://www.zenrows.com/scrape/amazon-prices.md)

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
