Amazon Review Defect Finder avatar

Amazon Review Defect Finder

Pricing

from $15.00 / 1,000 defect cluster founds

Go to Apify Store
Amazon Review Defect Finder

Amazon Review Defect Finder

Paste an Amazon product URL and see which complaints are real patterns. It fetches the critical reviews and returns each recurring fault, how many separate reviewers named it, how many times it was mentioned, the first and last date seen, the worst star rating, and their exact words.

Pricing

from $15.00 / 1,000 defect cluster founds

Rating

0.0

(0)

Developer

E A

E A

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Find out which product complaints are REAL patterns and which are one-off grumbles.

Paste an Amazon product URL and it does the rest. It fetches the critical reviews, groups the complaints more than one person made, and hands you a ledger: each named fault with how many separate reviewers reported it, the date range, the worst star rating, and their own words as evidence.

Who it is for. Sellers and brand owners watching their own listings, and equally buyers, sourcing teams and researchers looking at a product they do NOT own. You need no seller account and no ownership — a competitor's product works exactly as well as your own.

Most review tools give you raw data. This one tells you which complaint is a pattern and which is one person having a bad week.

Run it in ten seconds

Paste a product URL into Amazon product URL(s) and press Start:

{
"productUrls": ["https://www.amazon.com/dp/B0BSHF7WHW"],
"maxReviews": 100,
"minCorroboration": 3
}

It fetches only the 1-3★ reviews — the ones that can carry a defect — so you are not billed for five-star reviews it would only discard. Out comes one row per corroborated fault.

Leave the URL blank and press Start anyway. The Actor ships with a worked example in the reviews field, so you get a real ledger for free before spending anything:

{
"reviews": [
{ "userId": "R1", "date": "2026-03-02", "ratingScore": 2,
"reviewDescription": "The left earbud stopped charging after about four months. Case shows it at 100% but it is dead." },
{ "userId": "R2", "date": "2026-03-19", "ratingScore": 1,
"reviewDescription": "Left bud stopped charging completely around month five. Right one is fine." },
{ "userId": "R3", "date": "2026-04-07", "ratingScore": 2,
"reviewDescription": "Battery died on the left earbud after four months of light use." }
],
"minCorroboration": 3,
"productName": "Wireless Earbuds (example)"
}

and the ledger row it produces:

{
"result": "DEFECT_CLUSTER",
"asin": "_all",
"product": "Wireless Earbuds (example)",
"defectPhrase": "left earbud",
"distinctReviewers": 3,
"totalMentions": 3,
"firstSeen": "2026-03-02",
"lastSeen": "2026-04-07",
"severityMinRating": 1,
"exampleQuotes": [
{
"text": "The left earbud stopped charging after about four months",
"userId": "R1",
"date": "2026-03-02"
},
{
"text": "Left bud stopped charging completely around month five",
"userId": "R2",
"date": "2026-03-19"
},
{
"text": "Battery died on the left earbud after four months of light use",
"userId": "R3",
"date": "2026-04-07"
}
]
}

That is the actual output of the input above, captured from a real run — not a mock-up. The review text is illustrative; the row is what the Actor produced.

distinctReviewers: 3 is the number that matters. Three separate people, three separate dates, describing the same physical failure — that is a defect. One person saying it twice is not, and this counts users rather than mentions so the two never look alike.

When nothing clears the threshold you get a row saying so, rather than an empty dataset that could mean anything:

{ "result": "NO_CORROBORATED_DEFECTS", "why": "no failure was named by 3 or more distinct reviewers" }

Output fields

FieldMeaning
resultDEFECT_CLUSTER, or a status row when there is nothing to report
asinthe product group this cluster belongs to, or _all when reviews carry no ASIN
productthe productName you passed
defectPhrasethe dominant phrase across the cluster, in reviewers' own words
distinctReviewershow many DIFFERENT people named it — the corroboration count
totalMentionshow many times it was named, which can exceed the reviewer count
firstSeen / lastSeenthe date range, so you can see whether it is old or current
criticalReviewsAnalysedhow many 1-3★ reviews were read. On EVERY row — the denominator
failureSentencesFoundhow many sentences carried failure language
clustersFoundhow many distinct faults were grouped, before the corroboration cut
clustersBelowThresholdhow many of those had too few distinct reviewers to report
whyon a status row, the sentence explaining why there is nothing to report
minCorroborationthe threshold this run used
analysedAtwhen the ledger was built — a saved ledger cannot say it is still true
severityMinRatingthe lowest star rating among the reviews in this cluster
exampleQuotesverbatim evidence, with the user and date behind each one
productUrlthe link back to the product: linkUrl if you set it, otherwise the first URL you fetched with. null if you gave neither

firstSeen and lastSeen are worth reading together. A cluster spanning eight months is a manufacturing problem; one spanning eight days is often a single bad batch.

What you get

Each dataset item is a defect cluster — one named product failure corroborated by multiple independent reviewers, with dates, severity and verbatim evidence. When no defect meets the corroboration threshold, you get an explicit record saying so — never silence, never an empty dataset that could mean anything.

How to use it

Paste a product URL. That is the whole thing. It fetches the critical reviews and builds the ledger in one run.

Amazon gives sellers no export of review text — Voice of the Customer exports returns and customer-experience data, and "download feedback reports" is seller feedback. So the reviews have to be scraped, and this does it for you rather than sending you off to do it.

If you already have review data, two other ways in:

  • A dataset you already produced. Put its ID in reviewsDatasetId. Set it to {{resource.defaultDatasetId}} on a scraper's Integrations tab and that scraper feeds this Actor automatically, on whatever schedule you give it.
  • Paste the objects into reviews. Fine for a handful or a hand-assembled set.

A product URL takes priority over both. Clear it to use the review data instead.

What makes this different

Every bulk review tool gives quantity. None tell you whether a complaint is a real recurring defect or noise. This one counts DISTINCT reviewers per named failure — so you know "battery dies after 6 months" reported by 12 independent people is different from "hated the colour" mentioned once.

Input

FieldDefaultDescription
productUrls(empty)Start here. One or more Amazon product URLs. It fetches the 1-3★ reviews itself and builds the ledger. Takes priority over the two fields below.
maxReviews100Caps how many critical reviews are fetched — five-star reviews are never requested, so this is the number you are billed for. Only applies when you give a product URL.
reviewsScraperActorjunglee/amazon-reviews-scraperWhich Store Actor does the fetching. Change it if you prefer another; it must return objects carrying review text, a rating, a reviewer id and a date.
reviews(prefilled)Review objects (JSON), if you already have them. Arrives filled with a worked example, so Start works before you change anything.
reviewsDatasetId(optional)The dataset ID of a run that produced reviews. Set it to {{resource.defaultDatasetId}} in an Integration and a scraper feeds this Actor automatically.
minCorroboration3Minimum distinct reviewers per defect to appear in the ledger
productName(optional)Human-readable label for the ledger entries
linkUrl(optional)A link copied onto every row so you can click back to the product. Only needed when you supply reviews yourself; if you gave a product URL, that one is used. Never fetched.

Give it a product URL, or reviews, or reviewsDatasetId. A URL wins over the other two, because a URL is something you typed and the prefilled reviews are a sample you did not choose. The log says so when it ignores something.

Two failures are reported as their own rows rather than as an empty result, because a run that could not look and a product with no defects are different answers:

  • REVIEW_FETCH_FAILED — a URL was given and the fetch returned nothing usable.
  • REVIEWS_DATASET_UNREADABLE — a dataset ID was given and could not be opened.

Honest limits

On a free Apify plan the fetch returns at most 10 reviews, from one product URL. That is the review scraper's own limit, not ours, and you will meet it before you meet anything else: ten critical reviews rarely contain three people naming the same fault, so a free-plan run will often return NO_CORROBORATED_DEFECTS on a product that genuinely has a defect. Measured on a real product 2026-08-27: 10 reviews fetched, 5 failure mentions, 5 candidate faults, none reaching even two distinct reviewers. Raise maxReviews on a paid plan, or supply reviews you already have.

It under-reports, and you should know how. Two reviewers are joined into one defect only when they use the same two-word phrase. Measured: "Case hinge snapped in my pocket" and "the hinge on the charging case broke" share no two-word phrase, so they do not cluster — even though both name the hinge. Short sentences are also dropped: "Hinge cracked." is below the length floor and never reaches the clustering step at all.

So a NO_CORROBORATED_DEFECTS result means no defect was named the same way by enough people, which is not the same as no defect existing. Read the reviews yourself before concluding a product is clean. This is deliberate: a defect it missed costs you a second look at the reviews, while one it invented would cost you a decision you cannot take back.

  • It does not judge quality, only corroboration. Three people reporting the same fault is a pattern; whether that fault matters is your call, not a number this returns.
  • The fetch is done by a separate review-scraper Actor, so its coverage and its limits become this Actor's. If it returns nothing for a product, you get REVIEW_FETCH_FAILED rather than a clean bill of health.
  • Clustering uses bigram overlap on failure-language sentences. It finds recurring themes; it does not perform NLP-level semantic understanding of each complaint.

Questions

What review shape does it accept? Objects with the text under text or reviewDescription, the score under rating or ratingScore, plus userId and date. Output from the common Store scrapers works without reshaping.

Should I filter to 1-3 star reviews first? You do not have to, because this Actor does it for you — and you should know that it does. Every review rated 4 or 5 is dropped before any text is read, so a fault mentioned inside a five-star review does not contribute to a cluster and is not counted in criticalReviewsAnalysed. Send everything and the filter runs here; filter first and you only save scraping cost.

Why did it find fewer defects than I expected? See the limits section above; it under- reports on purpose and the reason is mechanical rather than mysterious.

Does it work for multiple products at once? Yes. Reviews are grouped by ASIN before clustering, so a mixed dataset gives you one ledger per product rather than one blend.

Pricing

Pay per event. There are exactly two, and these are the prices the platform charges:

EventPriceWhen
defect-cluster-found$0.015once per corroborated defect cluster in the ledger
apify-actor-start$0.00005once per gigabyte of memory, when the run starts

So a run that finds 5 corroborated defects costs about $0.075 — 5 x $0.015, plus a single start event at $0.00005.

This Actor runs in 256 MB, which is under a gigabyte, so the start event is charged exactly once per run whatever the review count.

When you give a product URL, you pay two publishers. The fetch runs a separate review scraper on your account and its publisher bills you for that run — the default charges about $0.006 per review returned, so 100 critical reviews is roughly $0.60, on top of what this Actor charges. maxReviews caps it. Supplying your own reviews or a dataset ID costs nothing extra, because nothing is fetched.

Filtering happens before you are charged for anything. Dropping the 4-5 star reviews, reading the critical ones and grouping them are all free; the only per-unit charge is a corroborated cluster in your results. So what a run costs follows the number of defects found, not the number of reviews you send: ten thousand reviews producing three clusters cost the same as fifty reviews producing three.

A run that finds nothing charges no defect-cluster-found events at all. Complaints that no one else corroborated are NOT reported at all — they are counted in clustersBelowThreshold and nothing else, because you are paying for the finding rather than for the reading.

That covers every outcome where there is nothing to report, including a run that stops because a dataset ID could not be read. The start event is charged by Apify on every run whatever happens, so a run that finds nothing costs $0.00005 and never more.

apify-actor-start is Apify's own platform event, charged on every pay-per-event Actor rather than added by this one. No per-row event is billed alongside the cluster event, so one unit of work is billed once.

Where the reviews come from

Give it a product URL and it fetches them, using junglee/amazon-reviews-scraper by default — the most used Amazon review scraper on the Store. You can point reviewsScraperActor at a different one if you prefer.

Only the 1-3★ reviews are fetched. A five-star review cannot carry a defect, and fetching one would cost you money for data this discards.

You can also bring your own, from any scraper, a Seller Central export, a helpdesk, or a CSV a colleague sent you: if it has a reviewer id, a date, a rating and the text, this reads it.

The companion to this one is Apify Store Intelligence, which applies the same corroboration-before-conclusion idea to a marketplace rather than a product.

Integrations

An ordinary Apify Actor, so the whole platform works with it: schedule it, call it from the Apify API or the JavaScript and Python clients, wire it into Zapier, Make, n8n, Slack or a webhook, or reach it from an AI agent over MCP. Output is a dataset you can export as JSON, CSV or Excel.

The obvious chain is a review scraper on a schedule feeding this one, so a defect that is newly corroborated reaches you the week it crosses the threshold rather than the quarter. Set it up on the scraper's Integrations tab with reviewsDatasetId = {{resource.defaultDatasetId}}.

Every row can carry a link back to the product, because a defect cluster you cannot trace to a listing is an interesting fact you can do nothing with.

It would be easy to build that link from the ASIN — amazon.com/dp/<asin> — and it would be wrong for every review set that is not from the US store. This Actor never fetches the product page, so it does not know whether your reviews came from .com, .co.uk, .de or .co.jp, and a link that is right most of the time is worse than no link at all: nobody checks the ones that look plausible.

So you supply it, or you leave it blank and the field is null. Guessed and absent are different answers, and this returns the honest one.

Found a problem?

Report it on the Issues tab. Paste the reviews that produced the wrong answer if you can share them; a description of the fault the ledger missed is enough if you cannot.

The most useful report is a real defect this failed to cluster. That is the direction it errs in, and a concrete example is what gets the threshold changed.

Unofficial

Not affiliated with or endorsed by Amazon or Apify. It reads review data you supply and contacts no third-party service.