# TikTok Shop Reviews Scraper (`maximedupre/tiktok-shop-reviews-scraper`) Actor

Collect public TikTok Shop reviews from product page links or bare product IDs. Filter by star rating, photos or video, and verified purchase, then review product, reviewer, purchase, and variant details in an Apify dataset.

- **URL**: https://apify.com/maximedupre/tiktok-shop-reviews-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Social media, Developer tools
- **Stats:** 1 total users, 0 monthly users, 85.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 review collecteds

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

### 🛍️ TikTok Shop review research for product teams

For ecommerce sellers, product researchers, and developers, this Actor collects public TikTok Shop review rows from product page links or bare product IDs. Each row gives the rating, review text when present, publication time, product context, media links, and public reviewer, purchase, and variant details. Use the rows to compare customer feedback, check product issues, and study reviews before a product decision.

**Use cases**

- Collect a product's public review rows with **[Scrape TikTok Shop Reviews](https://apify.com/maximedupre/tiktok-shop-reviews-scraper/examples/scrape-tiktok-shop-reviews)**.
- Run a **[Product Review Scraper](https://apify.com/maximedupre/tiktok-shop-reviews-scraper/examples/product-review-scraper)** for one submitted product.
- Inspect star ratings and written feedback with **[TikTok Shop Reviews Scraper](https://apify.com/maximedupre/tiktok-shop-reviews-scraper/examples/tiktok-shop-reviews-scraper)**.
- Gather product review data for comparison with **[TikTok Product Review Scraper](https://apify.com/maximedupre/tiktok-shop-reviews-scraper/examples/tiktok-product-review-scraper)**.
- Build a review set for a selected item with **[TikTok Shop Product Reviews](https://apify.com/maximedupre/tiktok-shop-reviews-scraper/examples/tiktok-shop-product-reviews)**.

#### 🧾 TikTok Shop review rows with product context

Each saved row is one public review tied to its product. It can include the product name and link, overall rating, star distribution, matching review count, review rating, text, publication time, media links, public reviewer details, purchase signals, and purchased variant details. Optional values are included when TikTok Shop exposes them. A rating-only review can omit `text` and still has its `rating`.

The `media` array is empty when no photo or video was shown for the review. The Actor collects public review data only. It does not promise private or login-only reviews.

#### ▶️ Run focused TikTok Shop review collections

Add product page links or bare numeric product IDs to `productTargets`. Choose the storefront that matches the product pages, then choose the review order and any rating, media, or verified-purchase filters. You can submit up to 500 target values in one run.

Set a review limit when you need fewer reviews for each product. Leave it empty to return all available reviews until the source is exhausted. Filters and a limit can reduce the number of reviews saved when you need a smaller collection.

**Run steps**

1. Add one or more TikTok Shop product page links or bare numeric product IDs.
2. Choose a supported storefront.
3. Set any review filters, order, or per-product limit.
4. Start the run and open the default dataset from the output.

#### ⚙️ Input

The required field is `productTargets`. The other fields are optional and use the defaults shown in the form.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `productTargets` | array of strings | Required. Accepts TikTok Shop product page links or bare numeric product IDs. Add 1 to 500 target values in one run. |
| `storefront` | string | Chooses the source storefront: `US`, `GB`, `SG`, `MY`, `PH`, `TH`, `VN`, `ID`, `JP`, or `MX`. The default is `US`. |
| `starRatingFilter` | string | Uses `any`, one exact rating from `exact-1` through `exact-5`, or one minimum rating from `minimum-1` through `minimum-5`. The default is `any`. |
| `mediaOnly` | boolean | When true, returns only reviews with attached photos or videos. |
| `verifiedPurchaseOnly` | boolean | When true, returns only reviews that TikTok marks as verified purchases. |
| `reviewLimit` | integer | Sets the maximum number of reviews for each product. Leave it empty to return all available reviews until the source is exhausted. If set, it must be at least 1. |
| `reviewOrder` | string | Uses source-recommended order with `recommended` or newest-first order with `newest`. The default is `recommended`. |

**Default input**

This is the public input from a successful default-input run. Because `reviewLimit` is empty, the run returns all available reviews until the source is exhausted.

```json
{
  "productTargets": [
    "https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773"
  ],
  "storefront": "US",
  "starRatingFilter": "any",
  "reviewOrder": "recommended"
}
```

#### 🧾 Output

The run output contains a link to the collected review rows in the default Apify dataset.

**Run output**

| Field | Type | What it does |
|---|---|---|
| `dataset` | string | Opens the collected TikTok Shop review rows. |

Each dataset row uses one review shape. `product`, `rating`, `publishedAt`, and `media` are required. `text`, some product summary values, reviewer details, purchase signals, and variant details can be missing when the public source does not expose them.

**Review row fields**

| Field | Type | What it does |
|---|---|---|
| `product` | object | Product context attached to the review. |
| `product.id` | string | TikTok Shop product identifier. |
| `product.name` | string | Product name shown by TikTok Shop. |
| `product.url` | URL string | TikTok Shop page for the product. |
| `product.overallRating` | number | Overall product rating on a 0 to 5 scale, when provided. |
| `product.ratingDistribution` | object | Counts of the product's one-star through five-star reviews. |
| `product.ratingDistribution.oneStar` | integer | Number of one-star reviews. |
| `product.ratingDistribution.twoStar` | integer | Number of two-star reviews. |
| `product.ratingDistribution.threeStar` | integer | Number of three-star reviews. |
| `product.ratingDistribution.fourStar` | integer | Number of four-star reviews. |
| `product.ratingDistribution.fiveStar` | integer | Number of five-star reviews. |
| `product.matchingReviewCount` | integer | Number of product reviews matching the active filters, when provided. |
| `rating` | integer | Review star rating from 1 to 5. |
| `text` | string | Written review text when the reviewer added text. It can be omitted for a rating-only review. |
| `publishedAt` | ISO 8601 date-time string | Time when the review was published, with a time zone. |
| `media` | array of objects | Photos or videos attached to the review. An empty array means no media was shown. |
| `media[].url` | URL string | Direct source link for an attached photo or video. |
| `media[].type` | string | Media kind: `image` or `video`. |
| `reviewer` | object | Public reviewer details when available. |
| `reviewer.name` | string | Reviewer name shown by TikTok Shop. |
| `reviewer.accountId` | string | Public reviewer account identifier shown by TikTok Shop. |
| `reviewer.avatarUrl` | URL string | Direct link to the reviewer's public avatar. |
| `reviewer.country` | string | Reviewer country shown by TikTok Shop. |
| `purchase` | object | Purchase signals shown with the review when available. |
| `purchase.isVerifiedPurchase` | boolean | Whether TikTok marks the review as a verified purchase. |
| `purchase.isIncentivized` | boolean | Whether TikTok marks the review as incentivized. |
| `variant` | object | Purchased SKU or variant details when available. |
| `variant.sku` | string | Purchased SKU shown by TikTok Shop. |
| `variant.name` | string | Purchased variant name. |
| `variant.attributes` | object of strings | Option values that define the purchased variant, such as platform, size, or color. |
| `variant.attributes.<option>` | string | Value for one variant option. The option name comes from the source. |

**Example review row**

This complete row is from the successful default-input run above. That run returned 129 rows.

```json
{
  "product": {
    "id": "1731043373753405773",
    "name": "PDP Riffmaster Wireless Guitar Controller with Guitar Strap, Shoulder Strap, Rechargeable Battery, Analog Stick, Home Storage Compatibility for Fortnite Festival, Rock Band 4",
    "url": "https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773",
    "overallRating": 4.7,
    "ratingDistribution": {
      "oneStar": 1,
      "twoStar": 0,
      "threeStar": 0,
      "fourStar": 34,
      "fiveStar": 94
    },
    "matchingReviewCount": 129
  },
  "rating": 1,
  "publishedAt": "2026-06-01T03:21:56.027Z",
  "media": [
    {
      "url": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/fac5bbca79bd4a7fb29bea64938f597d~tplv-fhlh96nyum-crop-webp:300:300.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "type": "image"
    }
  ],
  "text": "Literally not what I ordered. Now I gotta return it back, get a refund, and try and purchase the guitar again HOPING they get it right this time smh.",
  "reviewer": {
    "name": "U**J",
    "accountId": "6873921462563701766",
    "avatarUrl": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/107674e902517e3894d08ea3b5007fd3~tplv-tiktokx-cropcenter:100:100.jpg?dr=9640&refresh_token=5a6f5068&x-expires=1788310800&x-signature=%2FB8ykU0yxvFuNLp7vZndBAVEWDI%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=5f8d3399&idc=useast5",
    "country": "US"
  },
  "purchase": {
    "isVerifiedPurchase": true,
    "isIncentivized": false
  },
  "variant": {
    "sku": "1731043397250683213",
    "name": "PlayStation",
    "attributes": {
      "Platform": "PlayStation"
    }
  }
}
```

#### 💳 Pricing

**Billing event**

The `review-collected` event covers one buyer review saved for the selected product. Its price depends on the Apify pricing tier shown in the Actor settings. The public event is tied to a saved review, so this page does not assign a charge to setup, empty, or no-result work.

#### 🔌 Integrations

Use the default dataset link in the run output, download the collected data from Apify, or read it through the Apify API.

Learn more about using Actors with integrations:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can I submit a product URL and a bare product ID?

Yes. Add either value to `productTargets`, and you can mix both forms in the same run. Submit up to 500 target values.

##### What happens when I leave the review limit empty?

The Actor returns all available matching reviews until the source is exhausted. A smaller count can mean that the public matching pool is smaller or that active filters found fewer reviews. `product.matchingReviewCount` shows the matching total when the source provides it.

##### Can I collect one exact rating or a minimum rating?

Yes. Choose one exact star rating or a minimum star rating in `starRatingFilter`. Use `any` when you want all ratings.

##### Can I combine rating, media, and verified-purchase filters?

Yes. You can use the star rating choice together with `mediaOnly` and `verifiedPurchaseOnly`. The saved rows meet the active filter choices.

##### Why is `text` missing from some reviews?

TikTok Shop can show a star rating without written text. Those rating-only reviews keep their `rating`, while `text` can be omitted.

##### What does an empty `media` array mean?

It means that no photo or video was shown with that review.

##### What if reviewer, purchase, or variant details are missing?

Those objects and their fields are optional. They appear when TikTok Shop exposes the public details, and private account data is not collected.

##### Which storefront should I choose?

Choose the storefront that matches the product page and the market you want to read. The form supports `US`, `GB`, `SG`, `MY`, `PH`, `TH`, `VN`, `ID`, `JP`, and `MX`.

##### How do I read the collected data after a run?

Open the `dataset` link in the run output. You can also use the Apify API to read the dataset items.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-shop-reviews-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- **[TikTok Shop Scraper No Cookies](https://apify.com/maximedupre/tiktok-shop-scraper-no-cookies)** helps you collect product titles, prices, seller details, variants, and demand signals before review work.
- **[TikTok Shop Buyer Reviews Scraper](https://apify.com/thenetaji/tiktok-shop-reviews-scraper)** offers another way to collect buyer reviews with star, text, media, variant, and purchase details.
- **[TikTok Shop Reviews Scraper — full archive](https://apify.com/mu0i/tiktok-shop-reviews-scraper)** is useful when you need a full US review archive with reviewer, SKU, country, and purchase signals.
- **[TikTok Shop Reviews & Product Sentiment Analyzer](https://apify.com/nexascout/tiktok-shop-reviews-sentiment-analyzer)** adds sentiment, praise, complaint, and topic analysis to review text.
- **[TikTok Shop Product Reviews](https://apify.com/vistics/tiktok-shop-product-reviews)** supports bulk TikTok Shop product review collection.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `productTargets` (type: `array`):

Add one or more TikTok Shop product page links or bare product IDs. You can submit up to 500 products in one run.

## `storefront` (type: `string`):

Choose the TikTok Shop storefront that matches these product pages.

## `starRatingFilter` (type: `string`):

Choose all ratings, one exact star rating, or a minimum star rating.

## `mediaOnly` (type: `boolean`):

Return only reviews with attached photos or videos.

## `verifiedPurchaseOnly` (type: `boolean`):

Return only reviews that TikTok marks as verified purchases.

## `reviewLimit` (type: `integer`):

Set the maximum number of reviews to collect for each product. Leave this empty to return all available reviews until the source is exhausted.

## `reviewOrder` (type: `string`):

Choose the source-recommended order or newest-first order.

## Actor input object example

```json
{
  "productTargets": [
    "https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773"
  ],
  "storefront": "US",
  "starRatingFilter": "any",
  "reviewLimit": 100,
  "reviewOrder": "recommended"
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the collected TikTok Shop review 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 = {
    "productTargets": [
        "https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773"
    ],
    "reviewLimit": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-shop-reviews-scraper").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 = {
    "productTargets": ["https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773"],
    "reviewLimit": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-shop-reviews-scraper").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 '{
  "productTargets": [
    "https://shop.tiktok.com/us/pdp/riffmaster-wireless-guitar-controller-by-pdp-lightweight-design-easy-connectivity/1731043373753405773"
  ],
  "reviewLimit": 100
}' |
apify call maximedupre/tiktok-shop-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

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/o5X0bYaQDBUmS0Hb5/builds/KezicpWwrjEL5o62U/openapi.json
