# TikTok Shop Review Analyzer - Complaints, Praise & Verdict (`seemuapps/tiktok-shop-review-analyzer`) Actor

Turn TikTok Shop product reviews into one report per product: top complaints, praise, buyer questions, star breakdown, rating trend and a buy verdict.

- **URL**: https://apify.com/seemuapps/tiktok-shop-review-analyzer.md
- **Developed by:** [Seemu Scraping](https://apify.com/seemuapps) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $60.00 / 1,000 product reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Shop Review Analyzer - Complaints, Praise & Verdict

Turn hundreds of TikTok Shop reviews into one clear report per product. Paste product URLs and get the star breakdown, average rating, the top complaints and top praise (with how often each comes up and a real buyer quote), the questions shoppers should check before buying, whether quality is improving or declining over time, a sentiment score and a plain-English verdict. No login and no TikTok account needed.

### What you get

One row per product with:

- **Verdict**: `recommended`, `mixed` or `not-recommended`, a 2-3 sentence summary, who the product suits best (`idealFor`) and who should skip it (`avoidIf`)
- **Top complaints**: up to 6 recurring problems, each with a short label, description, number of reviews that mention it, share of reviews (%) and a verbatim example quote with its star rating
- **Top praise**: up to 6 recurring things buyers love, same detail as complaints
- **Buyer questions and concerns**: sizing, fit, compatibility, durability or shipping doubts raised in reviews, with how often each comes up
- **Star breakdown**: exact count of 5, 4, 3, 2 and 1 star reviews, average rating, positive (4-5 star) and negative (1-2 star) share
- **Quality trend**: `improving`, `declining` or `stable`, comparing the average rating of recent reviews against earlier ones, plus a month-by-month rating table and a note on new problems or improvements
- **Sentiment score**: 0-100 overall buyer sentiment read from the review text
- **Trust signals**: share of verified purchases and of reviews with photos, date range of the reviews analysed
- **Product context**: product ID, URL, title, image, shop name and URL, overall rating, total review count and units sold

Star counts, averages, shares and the trend are calculated exactly from the reviews, not estimated. Export to JSON, CSV, Excel or Google Sheets from the **Dataset** tab, or pull results through the Apify API.

### Use cases

- **Product research**: see what buyers love and hate about a product before you source, stock or promote it
- **Competitor analysis**: find the recurring complaints in competing listings and build a product that fixes them
- **Affiliate and creator vetting**: check a product's real quality and trend before you promote it to your audience
- **Brand and seller monitoring**: track your own listings for new complaints and a declining rating trend
- **Ad copy and listing optimisation**: reuse the praise buyers mention most, and answer common buyer questions in your listing

### How to use

1. Paste one or more **Product URLs** (any `tiktok.com/shop/pdp/...` link, or just the numeric product ID), one per line
2. Set **Max reviews to analyse per product** (default 100; more reviews give more reliable themes and trends, up to 1,000)
3. Pick the **Shop region** if the products aren't on the US store
4. Run the actor. One report per product appears in the **Dataset** tab

### Output example

```json
{
  "productId": "1732082916245279675",
  "productUrl": "https://www.tiktok.com/shop/pdp/1732082916245279675",
  "productTitle": "ESR Adjustable Stash Stand Magnetic Casing for iPhone 15/14/13, Classic Hybrid MagSafe-Compatible Durable Military-Grade Protection Case, Wireless Charging Support, Scratch-Resistant Back",
  "productImageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/...webp",
  "shopName": "ESR US",
  "shopUrl": "https://www.tiktok.com/shop/store/7495274372865887163",
  "productRating": 4.7,
  "productReviewCount": 33,
  "productUnitsSold": 292,
  "status": "ok",
  "reviewsAnalyzed": 33,
  "averageRating": 4.67,
  "starBreakdown": {
    "1": 2,
    "2": 0,
    "3": 1,
    "4": 1,
    "5": 29
  },
  "positiveSharePercent": 90.9,
  "negativeSharePercent": 6.1,
  "verifiedPurchaseSharePercent": 100,
  "withPhotosSharePercent": 6.1,
  "sentimentScore": 89,
  "verdict": "recommended",
  "verdictSummary": "Most reviewers are very positive about the case’s quality, protection, fit, and built-in stand. The main risks are fast discoloration on the clear version and one report of a faulty stand hinge, so it suits buyers who value protection and a stand more than long-term clarity.",
  "idealFor": "iPhone owners wanting a protective case with a built-in stand",
  "avoidIf": "You need a clear case that stays colorless over time",
  "topComplaints": [
    {
      "theme": "Clear-case yellowing",
      "description": "The clear case reportedly yellowed quickly and turned brown within weeks.",
      "mentions": 1,
      "sharePercent": 3,
      "exampleQuote": "case turned yellow after a week and brown after 3 weeks",
      "exampleRating": 3
    },
    {
      "theme": "Faulty stand hinge",
      "description": "One buyer said the camera stand hinge did not work properly.",
      "mentions": 1,
      "sharePercent": 3,
      "exampleQuote": "There was bad hinge at the stand camera it didnt work well for me",
      "exampleRating": 1
    }
  ],
  "topPraise": [
    {
      "theme": "Protection and quality",
      "description": "Buyers praise the case’s quality and say it helps protect their phones, including from drops.",
      "mentions": 5,
      "sharePercent": 15.2,
      "exampleQuote": "Love this product, its really good if you drop your phone a lot",
      "exampleRating": 5
    }
  ],
  "buyerQuestions": [
    {
      "question": "Will the clear case yellow or discolor after a few weeks?",
      "mentions": 1,
      "sharePercent": 3
    },
    {
      "question": "Is the camera stand hinge reliable and easy to use?",
      "mentions": 1,
      "sharePercent": 3
    },
    {
      "question": "Will a camera protector fit with the case on my iPhone 15 Pro Max?",
      "mentions": 1,
      "sharePercent": 3
    }
  ],
  "qualityTrend": "improving",
  "qualityTrendNote": null,
  "recentAverageRating": 4.81,
  "earlierAverageRating": 4.5,
  "monthlyRatings": [
    {
      "month": "2026-08",
      "reviews": 7,
      "averageRating": 4.57
    },
    {
      "month": "2026-09",
      "reviews": 3,
      "averageRating": 5
    },
    {
      "month": "2026-10",
      "reviews": 4,
      "averageRating": 5
    }
  ],
  "oldestReviewAt": "2026-01-31T00:39:13.045Z",
  "newestReviewAt": "2026-10-18T06:52:53.941Z",
  "region": "US",
  "inputUrl": "1732082916245279675",
  "analyzedAt": "2026-10-18T20:28:47.488Z"
}
```

A run summary with the number of reviews analysed per product is saved as `OUTPUT` in the **Key-value store**.

### Pricing

Pay per result. You only pay for what lands in your dataset:

| Event | Price | When it is charged |
|---|---|---|
| `product-report` | $0.06 | Once for each full product report (complaints, praise, questions, trend, verdict) |
| `review-analyzed` | $0.0016 | Once for each review read and analysed in that report |
| `product-lookup` | $0.015 | Once for a product that returns a row without a full report: no reviews found (`status: "no-reviews"`), or reviews collected but the analysis step failed (`status: "analysis-failed"`, you still get the star breakdown, average rating and trend) |

Example: a report built from 100 reviews costs $0.06 + 100 × $0.0016 = **$0.22**. Inputs that aren't a valid product URL or ID are skipped and cost nothing.

### Good to know

- Reviews are read in TikTok Shop's own order (most relevant first), so for very large products the report reflects the most relevant reviews up to your limit, not every review ever posted.
- `sharePercent` on complaints, praise and questions is the share of analysed reviews that mention that theme.
- The quality trend needs at least 10 dated reviews spread over two weeks or more; otherwise it is `insufficient-data`.
- All report text is written in English, even for reviews in other languages.

# Actor input Schema

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

TikTok Shop product page URLs such as https://www.tiktok.com/shop/pdp/cat-nail-clipper/1731578642912612516, or just the numeric product ID. One per line (up to 200).

## `maxReviewsPerProduct` (type: `integer`):

How many of each product's reviews to read and analyse (TikTok Shop's most relevant first). More reviews give more reliable themes and trends. 0 = as many as possible (up to 1,000 per product).

## `region` (type: `string`):

The TikTok Shop marketplace the products are sold in. United States is the most complete; other regions may return fewer reviews.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
  ],
  "maxReviewsPerProduct": 100,
  "region": "US"
}
```

# Actor output Schema

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

One report per product. Fields: productTitle, reviewsAnalyzed, averageRating, starBreakdown, topComplaints, topPraise, buyerQuestions, qualityTrend, sentimentScore, verdict, verdictSummary and more.

## `summary` (type: `string`):

Reports delivered and reviews analysed per product.

# 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 = {
    "productUrls": [
        "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/tiktok-shop-review-analyzer").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 = { "productUrls": ["https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"] }

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/tiktok-shop-review-analyzer").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 '{
  "productUrls": [
    "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
  ]
}' |
apify call seemuapps/tiktok-shop-review-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,seemuapps/tiktok-shop-review-analyzer"
        }
    }
}
```

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/HfKTkVyqnaZaCEl6v/builds/XgWe7ZMdRflRShYLw/openapi.json
