# Amazon Customer Insights & Aspect Sentiment (`fanndev/amazon-customer-insights-extractor`) Actor

Extract Amazon's "Customers say" insights per ASIN: the AI review summary plus every aspect customers mention, with sentiment and mention counts. Negative and mixed aspects surface the content gaps competitors leave open, ready for FAQ and SEO copy.

- **URL**: https://apify.com/fanndev/amazon-customer-insights-extractor.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/fanndev) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

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 Customer Insights & Aspect Sentiment

Give it ASINs, get back **what customers actually talk about** — every aspect
Amazon publishes, with sentiment and mention counts, plus the AI review
summary.

The negative and mixed aspects are the useful part: they are the questions a
listing has failed to answer. That is your FAQ section and your SEO copy,
taken straight from a competitor's own review base.

No login, no API key. HTTP-only — no browser.

### Note on Amazon Q\&A

If you came looking for a **Customer Questions & Answers** scraper: that
feature no longer exists on Amazon. `/ask/questions/…` now redirects to the
sign-in page, and product pages carry zero Q\&A content — verified across
several ASINs, the mobile site and every alternate endpoint.

Amazon replaced it with the "Customers say" insight widget, which is what
this actor reads. For gap analysis it is arguably better: the opinions
arrive already clustered by topic, with sentiment and volume attached.

### What you get

One row per aspect:

```json
{
  "recordType": "ASPECT",
  "asin": "B087F16GKW",
  "title": "Gaiam Yoga Mat - Premium 5mm Solid Thick Non Slip",
  "aspect": "grip",
  "sentiment": "MIXED",
  "mentions": 203,
  "mentionRank": 2,
  "mentionSharePercent": 21.4,
  "isContentGap": true
}
```

Plus one summary row per product, with Amazon's generated paragraph and the
gap shortlist:

```
NAKED Whey Protein          8 aspects, 3 gaps   [mixability, digestibility, texture]
Gaiam Yoga Mat              8 aspects, 4 gaps   [grip, thickness, durability, flatness]
Apple iPhone 11 Renewed     8 aspects, 2 gaps   [battery life, condition]
```

Read that yoga-mat row as a brief: customers are **split on grip, thickness,
durability and flatness**. Those four headings answer themselves.

### How to use it for copy

| Goal | Setting |
| --- | --- |
| Full picture of one catalogue | defaults |
| Just the complaints, ranked | `contentGapsOnly: true` |
| Ignore long-tail noise | `minMentions: 50` |
| Feed a spreadsheet | `emitAspectRows: true` (default) — one row per aspect sorts and pivots directly |

### Input

```json
{
  "asins": ["B00XIKPUK4", "B087F16GKW", "https://www.amazon.com/dp/B07ZPKN6YR"],
  "marketplace": "com",
  "contentGapsOnly": false,
  "minMentions": 0
}
```

| Field | Description |
| --- | --- |
| `asins` | ASINs to analyse. Product URLs work too |
| `marketplace` | com and ca verified; others see the caveat below |
| `emitAspectRows` | One row per aspect alongside the product row (default on) |
| `contentGapsOnly` | Only negative and mixed aspects |
| `minMentions` | Drop thinly-mentioned aspects |
| `delaySeconds` | Pacing between products |
| `proxyConfiguration` | Residential **strongly recommended** |

### Coverage

Measured over 10 ASINs spanning supplements, electronics, books and
sporting goods:

| | Coverage |
| --- | --- |
| Aspect list (with sentiment + mentions) | **10/10** |
| AI review summary | **10/10** |
| Aspects per product | 8 in every case |

That is markedly more reliable than Amazon's Buy Box data, which is withheld
from roughly half of anonymous requests. The insight widget was served every
time.

### Things worth knowing

**Products with few reviews carry no insight widget**, and that is a real
answer rather than a failure. `hasInsights: false` marks them, so an empty
aspect list is never ambiguous.

**Amazon caps the widget at 8 aspects.** Every product tested returned
exactly 8, so treat this as the top 8 by volume, not an exhaustive list.

**The summary is Amazon's text, not ours.** `aiSummary` is Amazon's own
generated paragraph, extracted verbatim. This actor does not write or
paraphrase it.

**Only amazon.com and amazon.ca were verified.** The development IP was
bot-walled on `co.uk` and `de` across all 10 TLS fingerprints tried, so
their behaviour is genuinely unknown rather than known-bad. Those
marketplaces are offered, but use a residential proxy in the matching
country, and expect aspect names to be localized — mention counts may then
be `null` while the aspect and sentiment still come through.

**Blocked ASINs are reported, never silently dropped.** They emit a
`CAPTCHA_ESCALATION` row so a short run is never mistaken for a set of
products nobody has opinions about. CAPTCHAs are never solved.

### Known limits

- **8 aspects per product**, Amazon's cap.
- **No individual review text.** `/product-reviews/` is behind the sign-in
  wall for anonymous clients, so per-aspect review quotes are not
  obtainable — the aspect counts and Amazon's summary are what is public.
- Sentiment is **Amazon's classification**, not an independent model.

See [CRAWLING\_METHOD.md](CRAWLING_METHOD.md) for the Q\&A retirement
evidence, the base64 fragment format, and the fingerprint matrix.

# Actor input Schema

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

Amazon ASINs to analyse. Full product URLs are accepted too — the ASIN is extracted from them.

## `marketplace` (type: `string`):

Amazon domain to query. Only amazon.com and amazon.ca were verified during development; other domains need a residential proxy in that country and may return localized aspect names.

## `emitAspectRows` (type: `boolean`):

Adds a row per aspect (sentiment, mentions, rank, share) alongside the product summary row, so the dataset can be sorted and filtered by sentiment directly.

## `contentGapsOnly` (type: `boolean`):

Return only the negative and mixed aspects — the complaints and split opinions a listing has not addressed. This is the shortlist for FAQ and SEO copy.

## `minMentions` (type: `integer`):

Drop aspects mentioned fewer than this many times. Aspects whose count Amazon did not publish are always kept.

## `delaySeconds` (type: `integer`):

Pacing between product pages. Amazon bot-walls fast anonymous crawling.

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

Residential proxy is strongly recommended — Amazon blocks datacentre IPs on product pages within a few requests.

## Actor input object example

```json
{
  "asins": [
    "B00XIKPUK4",
    "B087F16GKW",
    "B07ZPKN6YR"
  ],
  "marketplace": "com",
  "emitAspectRows": true,
  "contentGapsOnly": false,
  "minMentions": 0,
  "delaySeconds": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Per-product insight summaries and per-aspect sentiment rows.

# 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": [
        "B00XIKPUK4",
        "B087F16GKW",
        "B07ZPKN6YR"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fanndev/amazon-customer-insights-extractor").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": [
        "B00XIKPUK4",
        "B087F16GKW",
        "B07ZPKN6YR",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("fanndev/amazon-customer-insights-extractor").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": [
    "B00XIKPUK4",
    "B087F16GKW",
    "B07ZPKN6YR"
  ]
}' |
apify call fanndev/amazon-customer-insights-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fanndev/amazon-customer-insights-extractor"
        }
    }
}
```

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/qYEmONuUCF65QaC6X/builds/vA6mfGrDeZUe0tlrw/openapi.json
