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

Collect Amazon customer reviews for any ASIN: rating, title, body, author, date, verified-purchase badge, helpful votes and the purchased variant. One row per review.

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

## Pricing

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

Turn a list of Amazon ASINs or product links into structured customer review data — rating, title, full review text, author, date, verified-purchase badge, helpful-vote count and purchased variant, one row per review.

### Why use this actor

- **No account, no login, no API key** — just paste product IDs or URLs and run.
- **Full review text**, not just a snippet — long, multi-paragraph reviews come through complete.
- **Verified-purchase badge and helpful-vote count** on every review, so you can weigh reviews by trust and usefulness.
- **Multi-country reviews** — a US product page can surface reviews originally posted from other marketplaces (Mexico, Canada, India, etc.), and they all come through with their country tagged.
- **Stable JSON output** ready for spreadsheets, databases, dashboards or sentiment-analysis pipelines. Export to JSON, CSV or Excel.
- **Handles blocks automatically** and retries — no scrapers or browsers to babysit.

### How it works

1. Enter one or more **ASINs** (the 10-character product code) and/or full **product URLs**.
2. Pick the **marketplace** (Amazon US, UK or Germany).
3. The actor opens each product page and reads the reviews Amazon displays directly on it — Amazon's own curated selection of top and recent reviews.
4. Each review becomes one row in your dataset.

You don't manage any of the fetching, retries, or blocking — just the list of products you care about.

### Input

```json
{
    "asins": ["B08N5WRWNW"],
    "productUrls": [],
    "domain": "amazon.com",
    "maxReviews": 0,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US"
    }
}
```

| Field | Type | Description |
| --- | --- | --- |
| `asins` | array | Amazon product IDs, e.g. `B08N5WRWNW`. Add as many as you like. |
| `productUrls` | array | Full product URLs (`/dp/...`); the ID is detected automatically. |
| `domain` | string | Marketplace: `amazon.com`, `amazon.co.uk` or `amazon.de`. |
| `maxReviews` | integer | Cap the reviews collected per ASIN. `0` = collect every review Amazon shows on the page (see Notes for the typical count). |
| `maxConcurrency` | integer | How many products to fetch in parallel. |
| `proxyConfiguration` | object | Residential proxy recommended, matched to the marketplace's country (US for amazon.com). |

### Output

One record per review. Real sample captured from a live run on ASIN `B0BDHWDR12` (Apple AirPods Pro 2nd Gen):

```json
{
    "_source": "top-reviews-widget",
    "_scrapedAt": "2026-08-06T05:07:01Z",
    "asin": "B0BDHWDR12",
    "productUrl": "https://www.amazon.com/dp/B0BDHWDR12",
    "domain": "amazon.com",
    "reviewId": "R3PCXFKB39EVT2",
    "rating": 5,
    "title": "The king of wireless earbuds",
    "body": "These are perfect in every way possible. The sound, noise canceling, quality, battery life, everything. I originally had the airpods pro (1st gen) and the sony wf 1000 xm4...",
    "author": "Marshal H",
    "reviewDate": "2022-09-23",
    "reviewDateText": "Reviewed in the United States on September 23, 2022",
    "country": "United States",
    "verifiedPurchase": true,
    "helpfulVotes": 203,
    "variant": null
}
```

A negative review, from the same run, showing the country tagging on non-US reviews:

```json
{
    "_source": "top-reviews-widget",
    "_scrapedAt": "2026-08-06T05:07:01Z",
    "asin": "B0BDHWDR12",
    "productUrl": "https://www.amazon.com/dp/B0BDHWDR12",
    "domain": "amazon.com",
    "reviewId": "R3NABKZD0H3TXG",
    "rating": 1,
    "title": "PÉSIMAS CONDICIONES",
    "body": "El producto a parte de tener un deplorable empaque, no es funcional, no cumple con las funciones de modo ambiente, cancelación de ruido, etc. He iniciado un proceso de devolución.",
    "author": "Miguel Bautista",
    "reviewDate": "2024-04-01",
    "reviewDateText": "Reviewed in Mexico on April 1, 2024",
    "country": "Mexico",
    "verifiedPurchase": true,
    "helpfulVotes": null,
    "variant": null
}
```

That run returned **13 full reviews** for this ASIN — ratings from 1 to 5 stars, spanning the United States, Canada, Mexico and Egypt, all with complete review text.

| Field | Type | Description |
| --- | --- | --- |
| `asin` | string | The product's 10-character Amazon ID. |
| `productUrl` | string | Product page URL the review was read from. |
| `domain` | string | Marketplace the review was read from. |
| `reviewId` | string | Amazon's internal review ID. |
| `rating` | number | Star rating out of 5. |
| `title` | string | Review headline. |
| `body` | string | Full review text. |
| `author` | string | Display name of the reviewer. |
| `reviewDate` | string | Review date as `YYYY-MM-DD`, when it could be parsed. |
| `reviewDateText` | string | The date exactly as shown on the page (e.g. "Reviewed in the United States on September 23, 2022"). |
| `country` | string | Country the review says it was posted from. |
| `verifiedPurchase` | boolean | Whether the review carries Amazon's "Verified Purchase" badge. |
| `helpfulVotes` | number | null | Number of "found this helpful" votes, when shown. |
| `variant` | string | null | The size/color/style variant the reviewer bought, when shown. |

Failed lookups never fail silently — they produce a status record (`_status`: `not_found`, `blocked`, or `no_reviews_found`, with `_statusDetail` explaining why) so nothing disappears from your dataset.

### Notes & limits

- **This actor collects Amazon's "Top reviews"** — the curated set of reviews (usually **5 to 15 per product**) that Amazon displays directly on the product page — not a full paginated review history. We tested Amazon's dedicated review-listing pages directly and found they redirect to a sign-in page for every anonymous visitor, on the very first page, regardless of how the request is made. There is no way to read a full review archive (hundreds or thousands of reviews) without a logged-in Amazon account. If your use case needs a quick, real read on what customers are saying — sentiment, standout complaints, verified-purchase quality — this actor delivers that reliably; it is not a fit if you need every review a product has ever received.
- **Use a Residential proxy set to the marketplace's country** (US for amazon.com). Datacenter proxies are often shown a block page.
- **Some products show zero reviews** if they're new, have very few ratings, or Amazon didn't render the reviews section for that particular request — you'll get a `no_reviews_found` status record rather than a silent empty result.
- **`maxReviews` rarely limits anything in practice** since the page itself only carries a handful of reviews; it's there for the rare product that shows more.

# Actor input Schema

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

Amazon product IDs (the 10-character code, e.g. B08N5WRWNW). Add as many as you like. Combine with Product URLs below.

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

Full Amazon product URLs (amazon.com/dp/...). The product ID is detected automatically.

## `domain` (type: `string`):

Which Amazon marketplace the products belong to.

## `maxReviews` (type: `integer`):

Cap the reviews collected per ASIN. Amazon shows a curated 'Top reviews' selection on the product page itself (usually 5-15 reviews) rather than a full paginated history, so this rarely limits anything in practice. 0 = collect every review Amazon shows on the page.

## `maxConcurrency` (type: `integer`):

How many products to fetch at the same time. Lower this if you hit blocks.

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

Residential proxy strongly recommended, matching the marketplace country (US for amazon.com). Datacenter proxies are usually shown a block page.

## Actor input object example

```json
{
  "asins": [
    "B08N5WRWNW"
  ],
  "productUrls": [],
  "domain": "amazon.com",
  "maxReviews": 0,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `asin` (type: `string`):

Asin as reported by the source.

## `rating` (type: `string`):

Rating score. Numeric value.

## `title` (type: `string`):

Title of the item.

## `body` (type: `string`):

Body as reported by the source.

## `author` (type: `string`):

Author name.

## `reviewDate` (type: `string`):

Review Date as reported by the source.

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

Country.

## `verifiedPurchase` (type: `string`):

Verified Purchase as reported by the source.

## `helpfulVotes` (type: `string`):

Helpful Votes.

## `variant` (type: `string`):

Variant as reported by the source.

## `productUrl` (type: `string`):

Link to the product.

## `reviewId` (type: `string`):

Review Id as reported by the source.

## `reviewDateText` (type: `string`):

Review Date Text as reported by the source.

## `_source` (type: `string`):

Which extraction strategy produced the row.

## `_scrapedAt` (type: `string`):

UTC timestamp of the scrape, ISO 8601.

## `_input` (type: `string`):

The input value this row was produced from.

## `_status` (type: `string`):

Status.

## `_statusDetail` (type: `string`):

Status Detail as reported by the source.

# 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 = {
    "asins": [
        "B08N5WRWNW"
    ],
    "productUrls": [],
    "domain": "amazon.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/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 = {
    "asins": ["B08N5WRWNW"],
    "productUrls": [],
    "domain": "amazon.com",
}

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

```

## MCP server setup

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