# TikTok Shop Reviews & Product Sentiment Analyzer (`nexascout/tiktok-shop-reviews-sentiment-analyzer`) Actor

Extract public TikTok Shop reviews by product URL or keyword. Get normalized review text, ratings, sentiment, praise, complaints, and recurring product topics. Export verified product-level analyses to JSON, CSV, Excel, or API—no external data provider or AI key required.

- **URL**: https://apify.com/nexascout/tiktok-shop-reviews-sentiment-analyzer.md
- **Developed by:** [Scout](https://apify.com/nexascout) (community)
- **Categories:** E-commerce, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 analyzed product review results

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?

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

## TikTok Shop Reviews & Product Sentiment Analyzer

Scrape **public TikTok Shop reviews** and turn them into product-level sentiment, recurring complaints, customer praise, rating distributions, and topic insights. Use this TikTok Shop review scraper for product validation, competitor research, quality control, sourcing, customer-feedback analysis, and AI-agent workflows.

Paste a product URL or search a niche. The Actor returns normalized public reviews plus deterministic, explainable sentiment analysis—without an external AI model, TikTok login, third-party data API, or LLM key.

**One paid result = one product with at least one captured public review.** Pricing is **$0.025 per analyzed product** ($25 per 1,000). Nested reviews do not create additional result charges.

### What can you learn?

- What buyers praise or complain about most
- Positive, neutral, and negative review shares
- Quality, value, shipping, packaging, fulfillment, durability, sizing, performance, and other topics
- Cases where a high star rating hides a serious written complaint
- Products that need manual review before promotion, sourcing, or private labeling

### What one result contains

- Product ID, name, URL, image, seller, price, public rating, and review count when exposed
- Captured review text, star rating, reviewer, date, variant, helpful count, images, verification, and seller reply when public
- Per-review sentiment label, score, confidence, topics, and lexical evidence
- Product-level `sentimentScore` from -100 to 100 and `POSITIVE`, `NEUTRAL`, `NEGATIVE`, or `MIXED` label
- Sentiment percentages, rating distribution, captured average rating, common topics, and readable signals
- Source provenance and quality state

### Quick start

```json
{
  "productUrls": [
    {
      "url": "https://shop.tiktok.com/us/pdp/gooloo-jump-starter-1500a-2000a-water-resistant-power-pack-for-8-0l-gas/1729408995699495797"
    }
  ],
  "searchQueries": [],
  "region": "US",
  "maxReviewsPerProduct": 20,
  "sortBy": "SENTIMENT_SCORE",
  "maxConcurrency": 2,
  "includeRawData": false
}
```

For niche research:

```json
{
  "searchQueries": ["portable car jump starter"],
  "maxProductsPerQuery": 3,
  "maxReviewsPerProduct": 20,
  "sortBy": "NEGATIVE_SHARE"
}
```

Direct product URLs are the most precise and cost-efficient input.

### Real captured result

This abbreviated result was captured from the public US TikTok Shop on **August 26, 2026** after the product-price provenance fix.

```json
{
  "productId": "1729408995699495797",
  "productName": "GOOLOO Jump Starter Battery Pack 1500A—2000A",
  "price": null,
  "currency": null,
  "analyzedReviewCount": 3,
  "sentimentScore": 26.5,
  "sentimentLabel": "MIXED",
  "positiveReviewCount": 1,
  "neutralReviewCount": 1,
  "negativeReviewCount": 1,
  "positivePercent": 33.3,
  "neutralPercent": 33.3,
  "negativePercent": 33.3,
  "averageAnalyzedRating": 4.67,
  "commonTopics": [
    { "topic": "quality", "mentions": 1, "sentimentScore": 100 },
    { "topic": "order_fulfillment", "mentions": 1, "sentimentScore": -35 },
    { "topic": "packaging", "mentions": 1, "sentimentScore": -35 }
  ],
  "qualityState": "verified_success",
  "dataSource": "tiktok_review_network_json"
}
```

The product price stayed null because no verified structured price was available in that review run. Currency amounts mentioned inside review text are never treated as the current product price.

### Explainable sentiment methodology

1. Normalize public review text and star rating.
2. Detect English positive and negative phrases with nearby negation handling.
3. Combine observed star and text evidence while allowing explicit complaints to override a misleading high rating.
4. Classify each review and detect product topics.
5. Aggregate only the captured public sample.

The model is deterministic and does not send review text to an external LLM. A small sample is labeled cautiously and should not be treated as statistically representative.

### Pricing and billing

- **Analyzed product result:** $0.025 each ($25 per 1,000)
- **Actor start:** $0.00005
- **Platform usage:** included
- **Products with no captured reviews:** reported in diagnostics, not written as billable results
- **Nested reviews:** included in the product result, no separate charge

### FAQ

#### Can this scrape all TikTok Shop reviews?

It captures the public sample TikTok exposes during the run. TikTok may paginate, reorder, limit, or withhold reviews, so the captured count can be lower than the listing's displayed total.

#### Does it use ChatGPT or another AI API?

No. Sentiment and topic analysis are deterministic and explainable; no external AI key is required.

#### Can it find recurring complaints?

Yes, when a topic appears repeatedly in the captured sample. If every topic appears once, the Actor reports detected topics without claiming statistical recurrence.

#### Why can the average star rating look positive while sentiment is mixed?

Some customers submit five stars but write a fulfillment, billing, packaging, or quality complaint. The Actor analyzes both rating and text.

#### Can an AI agent use the results?

Yes. The schema is designed for Apify API and MCP clients such as ChatGPT, Claude, and Cursor.

### NexaScout TikTok Shop Intelligence Suite

- [Product & Viral Radar](https://apify.com/nexascout/tiktok-shop-product-radar) — find and rank current products.
- [Trending Products & Sales Velocity](https://apify.com/nexascout/tiktok-shop-trending-products) — measure product movement over time.
- [Affiliate Creator & Video Finder](https://apify.com/nexascout/tiktok-shop-affiliate-creator-finder) — find public creator and video leads.
- [Seller & Competitor Monitor](https://apify.com/nexascout/tiktok-shop-seller-competitor-monitor) — analyze stores and relevant competitors.
- [Reviews & Product Sentiment Analyzer](https://apify.com/nexascout/tiktok-shop-reviews-sentiment-analyzer) — extract reviews, praise, complaints, and topics.

### Limitations and responsible use

- US TikTok Shop and English-language sentiment in this release
- Public availability varies by product, region, and session
- Review text is user-generated and can be inaccurate
- Do not use the Actor to collect private data, identify anonymous reviewers, defeat access controls, or make automated eligibility decisions

For support, include the run ID, product URL or query, failed stage, and `qualityState`. Never post credentials, cookies, or tokens.

# Actor input Schema

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

Public TikTok Shop product-detail URLs to analyze.

## `searchQueries` (type: `array`):

Optional niches or product keywords. The Actor discovers live products, then analyzes their public reviews.

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

The launch version supports the United States TikTok Shop.

## `maxProductsPerQuery` (type: `integer`):

Maximum live products analyzed for each keyword.

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

Maximum public review sample retained and analyzed for each product.

## `minimumReviewTextLength` (type: `integer`):

Ignore empty or extremely short review text below this character count.

## `sortBy` (type: `string`):

Controls final dataset order.

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

US residential proxy is recommended because TikTok Shop is geo-sensitive and rate-limits data-center traffic.

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

Keep at 1–2 to reduce TikTok security challenges and residential-proxy traffic.

## `navigationTimeoutSecs` (type: `integer`):

Maximum time allowed for loading each TikTok Shop page before the request is retried or skipped.

## `includeRawData` (type: `boolean`):

Include raw product source data for debugging. Raw review payloads are never written.

## `includeSearchFallbacks` (type: `boolean`):

Advanced option. Search-only leads still produce no dataset row unless public reviews are actually captured.

## Actor input object example

```json
{
  "productUrls": [
    {
      "url": "https://shop.tiktok.com/us/pdp/gooloo-jump-starter-1500a-2000a-water-resistant-power-pack-for-8-0l-gas/1729408995699495797"
    }
  ],
  "searchQueries": [
    "car accessories"
  ],
  "region": "US",
  "maxProductsPerQuery": 3,
  "maxReviewsPerProduct": 20,
  "minimumReviewTextLength": 3,
  "sortBy": "SENTIMENT_SCORE",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxConcurrency": 2,
  "navigationTimeoutSecs": 45,
  "includeRawData": false,
  "includeSearchFallbacks": false
}
```

# Actor output Schema

## `products` (type: `string`):

One dataset item per product containing product metadata, aggregate sentiment, topics, and normalized public reviews.

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

Counts, quality and sentiment breakdowns, budget-limited or reviewless products, extraction diagnostics, and proof that no external Actor or data API was used.

# 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": [
        {
            "url": "https://shop.tiktok.com/us/pdp/gooloo-jump-starter-1500a-2000a-water-resistant-power-pack-for-8-0l-gas/1729408995699495797"
        }
    ],
    "searchQueries": [
        "car accessories"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexascout/tiktok-shop-reviews-sentiment-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": [{ "url": "https://shop.tiktok.com/us/pdp/gooloo-jump-starter-1500a-2000a-water-resistant-power-pack-for-8-0l-gas/1729408995699495797" }],
    "searchQueries": ["car accessories"],
}

# Run the Actor and wait for it to finish
run = client.actor("nexascout/tiktok-shop-reviews-sentiment-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": [
    {
      "url": "https://shop.tiktok.com/us/pdp/gooloo-jump-starter-1500a-2000a-water-resistant-power-pack-for-8-0l-gas/1729408995699495797"
    }
  ],
  "searchQueries": [
    "car accessories"
  ]
}' |
apify call nexascout/tiktok-shop-reviews-sentiment-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexascout/tiktok-shop-reviews-sentiment-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/DfZbEzftqUiMaeAbe/builds/7zam8giigNhJ8Lwuz/openapi.json
