kestrel actors › Ecommerce
Amazon Reviews Scraper — Customer Reviews & Ratings
An amazon reviews scraper that returns amazon customer reviews and amazon product reviews for any product, in any marketplace, as structured rows: star rating, review body, reviewer, the country the review came from, date, Verified Purchase flag, helpful votes and the variation bought — plus a product row carrying amazon ratings and the total rating count.
Run Amazon Reviews Scraper on Apify →
Amazon reviews scraper pricing: what one row costs
| Event | What it is | Price | Charged for |
|---|---|---|---|
review | Review row | $0.005 | One customer review: star rating, body, reviewer, country, date, verified-purchase flag and helpful votes. Products with no visible reviews are free. |
product | Product row | $0.003 | One product's rating summary: title, brand, overall rating, total rating count, availability, image and feature bullets. |
Pay per event: one per delivered review row and one per product row. Free: status rows, every review removed by a filter, products with no visible reviews, and failed products. An ASIN and its URL are one product, fetched and billed once per run.
Verified runs behind this listing cost $0.0002–$0.0024 each in platform compute. Exact per-row pricing is on this page's pricing tab.
Amazon reviews scraper input reference
Every field of Amazon Reviews, straight from the actor's input schema.
| Field | Type | Default | What it does |
|---|---|---|---|
asins | array | [] | Amazon ASINs (B0BSHF7WHW) or product URLs from any marketplace (https://www.amazon.co.uk/dp/B09G9FPHY6). A URL's marketplace is used automatically; bare ASINs use the marketplace below. |
domain | string | "com" | Amazon marketplace for bare ASINs: com, co.uk, de, fr, it, es, ca, com.au, co.jp, in, com.mx, com.br, nl, se, pl, sa, ae, sg, com.tr, com.be. |
minRating | integer | 0 | 0 = keep every review. 1-5 = keep only reviews at or below that star rating, so a complaints feed costs nothing for the happy ones. Filtered reviews are never charged. Range 0-5. |
verifiedOnly | boolean | false | Keep only reviews Amazon marks as a Verified Purchase. |
requireText | boolean | false | Drop rating-only reviews that have no written body. |
maxReviewsPerProduct | integer | 0 | 0 = every review visible on the product page. Amazon publishes at most 13 per product without a signed-in session (fewer outside amazon.com), so that is the ceiling here. N = the first N. Range 0-13. |
includeProductRow | boolean | true | Emit one row per product with its title, brand, overall rating, total rating count, availability, image and feature bullets. |
sessions | integer | 4 | How many proxy sessions (egress IPs) run in parallel. More is faster; each is paced separately. Range 1-16. |
perIp | number | 0.5 | Pace for each session. Amazon tolerates about 0.5/s per IP; faster causes captchas, not speed. Range 0.1-2. |
proxyConfiguration | object | {"useApifyProxy": true} | Apify Proxy is required: Amazon captchas datacentre traffic that is not rotated. RESIDENTIAL works best. |
Example input
{ "asins": ["B0BSHF7WHW", "B09B8V1LZ3"], "minRating": 2, "requireText": true, "verifiedOnly": true }
{ "asins": ["B0BSHF7WHW", "https://www.amazon.co.uk/dp/B09G9FPHY6"], "maxReviewsPerProduct": 0 }
Amazon reviews scraper output fields
Three row types share one dataset: review (one customer review, charged), product (the product's rating summary, charged) and status (per product, free).
Dataset views in the Apify Console: Overview, Reviews, Products, Run status.
| Field | Type | What it holds |
|---|---|---|
type | string | Row type: review, product or status. |
asin | string | Amazon's product id. |
domain | string | Marketplace domain suffix, e.g. com, co.uk, de. |
marketplace | string | Marketplace country name. |
url | string | Product URL on product rows; the review's permalink on review rows. |
title | string | Product title on product rows; the review headline on review rows. |
product_title | string | Review rows: the product the review belongs to. |
brand | string | Product rows: brand or 'Visit the … Store' byline. |
price | number | Product rows: price when Amazon serves one. Often null — Amazon withholds price markup from unauthenticated clients. |
price_display | string | Product rows: the price exactly as printed, when present. |
currency | string | Currency of the marketplace. |
rating | number | Overall star rating on product rows; the reviewer's stars on review rows (1-5). |
ratings_count | integer | Product rows: how many ratings the product has in total. |
reviews_visible | integer | Product rows: how many reviews were visible on the page. |
availability | string | Product rows: stock message. |
image | string | Product rows: main image URL. |
features | array | Product rows: the bullet feature list. |
review_id | string | Amazon's id for the review. |
text | string | The review body as written. |
author | string | Reviewer's display name. |
country | string | Country the review was written in — Amazon mixes international reviews in. |
date_text | string | Review date as Amazon prints it. |
verified | boolean | Whether Amazon marks it a Verified Purchase. |
helpful_votes | integer | How many people found the review helpful. |
variant | string | The product variation the reviewer bought, when shown. |
status | string | Status rows: ok, no_reviews or error. |
target | string | Status rows: the ASIN or URL this job was given. |
reviews | integer | Status rows: review rows delivered. |
filtered | integer | Status rows: reviews dropped by the filters, never charged. |
duplicates | integer | Status rows: 1 when another input already covered this product. |
error | string | Status rows: why the product failed, null when it did not. |
fetched_at | string | UTC timestamp when the row was fetched. |
Example row from a real run
Taken from the actor's README — this is the shape your dataset holds.
{
"type": "review", "asin": "B0BSHF7WHW", "domain": "com", "marketplace": "US",
"product_title": "Apple 2023 MacBook Pro Laptop", "review_id": "RCA7TI5EBH5VK",
"rating": 5.0, "title": null,
"text": "I upgraded from the i9 Intel MacBook Pro from 2019, and this laptop seriously blows that away.",
"author": "Michael M", "country": "the United States", "date_text": "July 22, 2023",
"verified": true, "helpful_votes": 65, "variant": null,
"url": "https://www.amazon.com/gp/customer-reviews/RCA7TI5EBH5VK"
}
{
"type": "product", "asin": "B0BSHF7WHW", "domain": "com", "marketplace": "US",
"title": "Apple 2023 MacBook Pro Laptop", "brand": null,
"rating": 4.7, "ratings_count": 387, "reviews_visible": 13,
"price": null, "price_display": null, "currency": "USD",
"availability": null, "image": "https://m.media-amazon.com/images/I/example.jpg",
"features": ["Apple M2 Pro chip"], "url": "https://www.amazon.com/dp/B0BSHF7WHW?th=1&psc=1"
}
Amazon reviews scraper in Python, JavaScript and curl
Python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kestrel/amazon-reviews-scraper").call(run_input={
"asins": ["B0BSHF7WHW"], "minRating": 2, "verifiedOnly": True, "requireText": True,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["type"] == "review":
print(row["rating"], row["country"], row["text"][:80])
JavaScript (Node)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('kestrel/amazon-reviews-scraper').call({
asins: ['B0BSHF7WHW', 'https://www.amazon.co.uk/dp/B09G9FPHY6'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((i) => i.type === 'product').map((p) => [p.marketplace, p.rating, p.ratings_count]));
curl
curl -X POST "https://api.apify.com/v2/acts/kestrel~amazon-reviews-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H 'Content-Type: application/json' \
-d '{"asins":["B0BSHF7WHW"],"minRating":2}'
The same three calls are runnable files in the examples repository: examples/amazon-reviews-scraper.py|.js|.sh.
Limits and honest notes
Scope — read this before you buy
This reads the reviews Amazon publishes on the public product page, which is roughly 8–13 reviews per product, ordered by Amazon's own mix of recent and most-helpful. Amazon requires a signed-in session for its full review archive, and this actor deliberately does not attempt that — no account sharing, no cookie injection, no session resale. If you need every review a product has ever had, this is not the tool, and no honest listing should tell you otherwise.
What you do get for every ASIN is the complete rating summary (rating, ratings_count) plus that visible sample, which is enough for rating trends, complaint detection and competitor tracking across a large catalogue.
Likewise, price is best-effort. Amazon frequently withholds price markup from unauthenticated clients — on a 1.8 MB product page in testing there was no price element at all. When Amazon serves one, you get it; treat the field as a bonus, not a price-tracking feature. If you want prices and rank, use the companion Amazon Search & Best Sellers actor, which reads them from result pages where Amazon does render them.
- 8–13 reviews per product, as covered in Scope.
reviews_visibleon the product row tells you exactly how many were on the page. titleis often null. The compact review blocks Amazon renders on product pages frequently omit a headline; the body is always there.- Amazon serves a captcha to repeat callers. The run detects it and rotates to a fresh IP rather than parsing the captcha page as an empty product.
- Cheap proxies first, residential only when Amazon pushes back. A run starts on the proxies you chose — datacentre is the cheapest — and rotates to a fresh IP on a captcha or a 503. When the same page is refused twice in a row that is the IP range being blocked, not the page, so the run stops trusting that pool: its sessions re-open on a residential proxy and stay there for the rest of the run. Nothing to configure, no run has to fail to teach it, and a run that is never refused never leaves the cheap pool — so a run costs the least that still succeeds. The run's SUMMARY reports it as
http.escalated. countryis where the review was written, not where the reviewer lives — Amazon phrases it "Reviewed in …".- Rating is a float 1–5. Amazon renders "5.0 out of 5 stars"; the row carries
5.0. brandandavailabilityare frequently null on pages where Amazon does not render them.
FAQ
Does it need an Amazon API key or login?
No. There is no public amazon review api for product reviews, and Amazon's Product Advertising API requires an affiliate account with sales requirements and does not return review text. This uses neither — it reads the public product page.
Can I download Amazon reviews as CSV or Excel?
Yes. Every run writes an Apify dataset, exportable to CSV, Excel, JSON or XML from the Console or over the API with ?format=csv. That is the quick path to download amazon reviews for an ASIN list.
How do I get only Amazon negative reviews?
Set minRating to your ceiling (2 for one- and two-star) and add requireText: true so you only pay for reviews with actual words. verifiedOnly: true strips unverified noise. Everything above the ceiling is dropped before billing.
How many reviews will I get per product?
Roughly 8–13 — the set Amazon shows publicly. This is a real limit, not a setting, and it is the honest answer that some listings in this category avoid giving. reviews_visible on each product row reports the exact number.
Can I scrape Amazon reviews by ASIN in bulk?
Yes. Put as many ASINs in asins as you like; each is fetched once and billed once. Bulk amazon reviews are billed per delivered row, so cost scales with data rather than time, and the filters cut it directly.
Which marketplaces are supported?
Twenty, listed in the input section. A product URL selects its own marketplace automatically; bare ASINs use domain. The same ASIN in two marketplaces is treated as two products because the reviews and ratings genuinely differ.
Does it return prices?
Best-effort only — see Scope. Amazon commonly withholds price markup from unauthenticated clients. For prices and keyword rank, use the companion Amazon Search & Best Sellers actor.
Can I get the star-rating breakdown?
The product row carries rating and ratings_count for every ASIN. The 5/4/3/2/1 percentage split is included when Amazon renders it on the page, which is not always.
Can I scrape Amazon reviews without an API?
That is what this is — amazon reviews without api access, no key to apply for and no affiliate account. You call an Apify actor and read rows back.
Is there a free tier?
Products with no visible reviews, filtered reviews, status rows and failed products are always free, so a run that finds nothing costs nothing beyond a fraction of a cent of platform compute. Apify's free plan includes monthly credit you can spend here.
How to use Amazon Reviews Scraper
Ready-made runs you can open and start
Each one is a saved input on the Apify Store — open it, press Start, and it runs with the fields already filled in. All 163 across the suite.
| Ready-made run | What it does |
|---|---|
| Amazon Negative Reviews by ASIN (1-3 Stars) | Keep only reviews at three stars or below, with a written body: the complaint file for two ASINs, with the happy ones filtered before billing. |
| Verified Purchase Reviews Only (Amazon) | Drop everything Amazon has not marked as a Verified Purchase, so the sample is people who actually bought the product on that marketplace. |
| Amazon Reviews by Marketplace: UK, DE, FR | The same product on three marketplaces in one run: paste full product URLs and each one is scraped on its own domain, in its own language. |
| Voice of Customer Across 25 Amazon ASINs | Twenty-five ASINs across electronics, kitchen and beauty in a single run: a voice-of-customer corpus wide enough to compare categories. |
| Amazon Product Reviews at One Star Only | minRating 1 keeps nothing but one-star reviews - the defect and returns signal, separated from the general grumbling at two and three stars. |
| Amazon Customer Reviews on amazon.de | German ASINs scraped on amazon.de: reviews in German with the German verified-purchase label and the German ratings count on the product row. |
| Amazon Ratings and Reviews on amazon.co.jp | Japanese ASINs on amazon.co.jp: reviews in Japanese with the local rating and ratings count, which differ from the same product on .com. |
| Review Monitoring for Your Own ASINs | Five newest reviews for each of six ASINs, cheap enough to run every morning: a seller-side alert feed rather than a research pull. |
| Amazon Reviews Without API Approval | Amazon's Product Advertising API needs an affiliate account and returns no review text. This is the one-ASIN replacement: paste it and run. |
| Amazon Product Rating Data by ASIN | The products view is a rating table: ASIN, brand, star rating, total ratings count, reviews visible and availability, one row per product. |
| Scrape Amazon Reviews on amazon.co.uk | Eight UK best-seller ASINs on amazon.co.uk: British reviewers, British spelling and a ratings count that is not the American one. |
Related scrapers
Run Amazon Reviews Scraper
The actor lives on the Apify Store, where the pricing tab carries the live per-row price and the input form has every field above: apify.com/kestrel/amazon-reviews-scraper