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

Scrape public TikTok Shop product reviews in bulk: star rating, text, date, photos, purchased variant, verified/incentivized flags, reviewer context and product rating data. Monitor new reviews with date and skip-ID controls. No TikTok login.

- **URL**: https://apify.com/coregent/tiktok-shop-reviews-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Features:** Limited permissions
- **Stats:** 5 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 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.
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?

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 Reviews Scraper — Ratings, Photos & Variants

![TikTok Shop Reviews Scraper](https://raw.githubusercontent.com/coregentdevspace/tiktok-shop-reviews-scraper-assets/main/thumbnail-tiktok-shop-reviews-scraper.png)

Scrape public TikTok Shop buyer reviews from product URLs or IDs and export **one clean row per review**: star rating, text, date, photos, purchased variant, verified/incentivized flags, public reviewer context and product rating data. Use newest-first order with date and skip-ID controls to collect **only new reviews** on scheduled runs. No TikTok login, cookies or API key required.

### ⚡ Need a real-time API?

This Actor also powers the **[TikTok Shop API](https://rapidapi.com/coregentdevspace/api/tiktok-shop-api8)** on RapidAPI. `GET /reviews` returns a TikTok Shop product's reviews and ratings as JSON in a single HTTP request, with a free Basic plan and no Apify account needed.

Use the API for on-demand lookups inside your app. Use this Actor for bulk runs, schedules, datasets and integrations.

### What this Actor does

- Takes up to 500 TikTok Shop product URLs or numeric product IDs.
- Returns one row per unique public review, with product, shop and variant context attached.
- Stops exactly at your limits: per product, per run, by date, or at your spending limit.
- Reports how complete each product's collection was, instead of claiming "all reviews".
- Only charges for unique reviews delivered. Duplicates, skipped IDs and filtered rows are free.

**Good for:** finding 1–2 star complaints before sourcing a product, comparing feedback across competing listings, spotting variant-specific defects, collecting photo reviews (UGC), measuring verified and incentivized review share, monitoring new reviews on your own or competitor products, and building sentiment or topic datasets.

### Quick start

1. Paste one or more product URLs (or IDs) into **Products**.
2. Pick the **Region** for bare IDs (a region in the URL wins).
3. Set **Max reviews per product** and **Max total reviews**.
4. Click **Start**.

Running with the defaults returns **20 reviews** (one page) from one public US product, which is a quick way to see the output format.

```json
{
  "productTargets": ["https://www.tiktok.com/shop/pdp/your-product/1731649211243074211"],
  "region": "US",
  "maxReviewsPerProduct": 100,
  "maxTotalReviews": 500,
  "sortBy": "recommended"
}
```

### Supported TikTok Shop regions

| Code | Storefront |
|---|---|
| US | United States |
| MY | Malaysia |
| TH | Thailand |
| VN | Vietnam |
| PH | Philippines |
| SG | Singapore |

These are the storefronts where we have tested the review feed with native products. **The UK (GB) storefront is not supported** because its review feed is currently unavailable. Indonesia, Japan and Mexico are not listed either. A URL from an unsupported storefront is skipped with a warning and is not charged.

### Accepted product URL / ID formats

- `https://www.tiktok.com/shop/pdp/<slug>/<productId>`
- `https://shop.tiktok.com/<region>/pdp/<slug>/<productId>`
- `https://www.tiktok.com/view/product/<productId>`
- `https://shop.tiktok.com/view/product/<productId>?region=MY`
- `<productId>` (e.g. `1731649211243074211`)

Shop pages, videos, search pages and non-TikTok links are rejected with a clear warning. Duplicate products are merged before any work starts. Every original input is kept in `sourceInput` and in the per-product summary.

### Review order and filters

| Control | How it works |
|---|---|
| **Review order** | `recommended` (TikTok's ranking) or `newest`. Applied by TikTok. |
| **Star rating** | 1–5 = only that rating. Applied by TikTok, so no reviews are scanned and thrown away. |
| **Only reviews with photos** | Applied by TikTok, then re-checked: reviews whose media URLs TikTok does not expose (video-only reviews) are dropped, for free. |
| **Only verified purchases** | Applied by TikTok when it is the only active filter, otherwise checked on each row. |
| **Only incentivized reviews** | Checked on each fetched row. |

TikTok applies one filter per request. If you combine filters, the first one in the priority order **star rating → photos → verified** is applied by TikTok and the others are checked on each row. Filters checked on each row can mean more pages are scanned per delivered review, and very restrictive combinations can return fewer rows than you asked for. **Filtered-out rows are never charged.** If 10 pages in a row (200 reviews) deliver nothing, the product stops with `truncationReason: "noMatchPages"`. Change this with `maxNoMatchPages`. `maxPagesPerProduct` caps the scan overall.

### Incremental / new-review monitoring

```json
{
  "productTargets": ["1731649211243074211", "1729408816995078528"],
  "region": "US",
  "maxReviewsPerProduct": 500,
  "maxTotalReviews": 1000,
  "sortBy": "newest",
  "publishedAfter": "7d",
  "skipReviewIds": ["7700394439423919885"]
}
```

- `publishedAfter` accepts ISO dates (`2026-10-01`, `2026-10-01T00:00:00Z`) or relative values (`24h`, `7d`, `2w`, `3m`).
- Setting `publishedAfter` switches to newest-first order automatically. Each product's scan **stops as soon as it passes the date boundary**, so a daily run only reads the first page or two.
- `skipReviewIds` removes reviews you already have, before output and before charging.
- `publishedBefore` adds an optional upper boundary.

**Negative-review research:**

```json
{
  "productTargets": ["1731649211243074211"],
  "region": "US",
  "maxReviewsPerProduct": 1000,
  "maxTotalReviews": 1000,
  "sortBy": "newest",
  "starRating": 1
}
```

To collect both 1 and 2 star reviews, run once with `starRating: 1` and once with `starRating: 2`.

**Sample input from a real run** (it produced the sample output below). The URL and the bare ID point to the same product, so they are merged and the product is scanned once:

```json
{
  "productTargets": [
    "https://shop.tiktok.com/us/pdp/x/1731649211243074211",
    "1731649211243074211"
  ],
  "region": "US",
  "maxReviewsPerProduct": 30,
  "maxTotalReviews": 30,
  "starRating": 1,
  "publishedAfter": "365d"
}
```

This returned 30 one-star reviews in newest-first order (TikTok reports 86 one-star reviews for the product), from 2 review pages and 1 product-detail lookup.

### Input reference

| Field | Type | Default | Description |
|---|---|---|---|
| `productTargets` | string\[] | one sample product | 1–500 product URLs or numeric IDs (required) |
| `region` | enum | `US` | Storefront for bare IDs; URL region wins |
| `maxReviewsPerProduct` | integer | `20` | Max delivered reviews per product (up to 10,000) |
| `maxTotalReviews` | integer | `1000` | Exact run-wide ceiling on unique reviews (up to 100,000) |
| `sortBy` | enum | `recommended` | `recommended` or `newest` |
| `starRating` | integer | `0` | 0 = all; 1–5 = exact rating |
| `mediaOnly` | boolean | `false` | Only reviews with photo URLs |
| `verifiedPurchaseOnly` | boolean | `false` | Only verified purchases |
| `publishedAfter` | string | — | Lower date boundary (ISO or relative) |
| `publishedBefore` | string | — | Upper date boundary |
| `skipReviewIds` | string\[] | `[]` | Review IDs to skip (free) |
| `incentivizedOnly` | boolean | `false` | Only incentivized reviews |
| `includeProductContext` | boolean | `true` | Product title, image, shop, currency, rating, review count |
| `includeRatingBreakdown` | boolean | `true` | `rating1Count`…`rating5Count` |
| `includeReviewerContext` | boolean | `true` | Masked reviewer name, ID, avatar, country |
| `includeMedia` | boolean | `true` | `media` array of photo URLs |
| `maxPagesPerProduct` | integer | `250` | Scan guard (20 reviews/page) |
| `maxNoMatchPages` | integer | `10` | Stop a product after this many pages in a row that deliver nothing (0 = off) |
| `maxRetries` | integer | `2` | Retries per request on transient failures |
| `maxConcurrency` | integer | `3` | Products in parallel (1–4) |
| `debugMode` | boolean | `false` | Verbose logs, secrets never logged |

### Output fields

One row per review (`recordType: "review"`). **Every field is always present. Values TikTok does not expose, or that you turned off, are `null`.** Nothing is invented.

The samples below come from a real run: the 1-star reviews from the last 365 days of one US product, using the "Sample input from a real run" above. Long CDN query strings are shortened.

#### Output preview

**Reviews** tab:

![Reviews table view](https://raw.githubusercontent.com/coregentdevspace/tiktok-shop-reviews-scraper-assets/main/tiktok-shop-reviews-scraper-output-reviews-table-view.png)

**All fields** tab:

![All fields table view](https://raw.githubusercontent.com/coregentdevspace/tiktok-shop-reviews-scraper-assets/main/tiktok-shop-reviews-scraper-output-all-fields-table-view.png)

#### Sample record — Reviews tab

```json
{
  "productTitle": "DRMITSUI Seiyaku FARINFRARED BonePainPatch Thermal Patches 6 Patches Bag for Recommended Use",
  "rating": 1,
  "text": "I’m not saying the product doesn’t work. It just didn’t do any thing for me sorry.",
  "reviewedAt": "2026-09-24T06:00:51.607Z",
  "variant": "2 bags",
  "verifiedPurchase": true,
  "incentivized": false,
  "reviewerName": "T**y",
  "mediaCount": 0,
  "reviewId": "7688977697074333454",
  "productId": "1731649211243074211",
  "region": "US"
}
```

#### Sample record — All fields (a photo review)

```json
{
  "recordType": "review",
  "reviewId": "7620952175421703950",
  "productId": "1731649211243074211",
  "productUrl": "https://shop.tiktok.com/us/pdp/x/1731649211243074211",
  "productTitle": "DRMITSUI Seiyaku FARINFRARED BonePainPatch Thermal Patches 6 Patches Bag for Recommended Use",
  "productImageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/b12ff44cc34d469e98143e219098f0ae~tplv-fhlh96nyum-crop-webp:800:800.webp",
  "shopId": "7495809471398382243",
  "shopName": "DRMITSUI Global Store",
  "shopUrl": "https://shop.tiktok.com/us/store/drmitsui-global-store/7495809471398382243",
  "region": "US",
  "currency": "USD",
  "overallRating": 4.3,
  "totalReviewCount": 717,
  "rating1Count": 86,
  "rating2Count": 20,
  "rating3Count": 42,
  "rating4Count": 71,
  "rating5Count": 498,
  "rating": 1,
  "text": "No sirven solo queman la piel",
  "reviewedAt": "2026-03-24T22:26:59.212Z",
  "variant": "1 bag",
  "skuId": "1732083369415578275",
  "variantAttributes": null,
  "verifiedPurchase": true,
  "incentivized": false,
  "reviewerName": "e**s",
  "reviewerId": null,
  "reviewerAvatarUrl": null,
  "reviewerCountry": "US",
  "media": [
    {
      "type": "image",
      "url": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/69ae010b8d9546ef8d1f38f5c49034db~tplv-fhlh96nyum-crop-webp:300:300.webp"
    }
  ],
  "mediaCount": 1,
  "hasMedia": true,
  "sourceInput": "https://shop.tiktok.com/us/pdp/x/1731649211243074211",
  "scrapedAt": "2026-11-02T11:44:03.471Z"
}
```

Rating-only reviews have `"text": null`. `variantAttributes` is filled when the product lists properties for that SKU (e.g. `{ "Quantity": "2 bags" }` on this product's two-bag SKU) and is `null` otherwise. `reviewerId` and `reviewerAvatarUrl` are `null` when TikTok hides them.

| Group | Fields |
|---|---|
| Review | `reviewId`, `rating`, `text` (null for rating-only reviews), `reviewedAt` (ISO 8601) |
| Purchase | `variant`, `skuId`, `variantAttributes` (needs product context), `verifiedPurchase`, `incentivized` |
| Media | `media[]` (`{ type, url }`), `mediaCount`, `hasMedia` |
| Reviewer | `reviewerName` (masked by TikTok), `reviewerId`, `reviewerAvatarUrl`, `reviewerCountry` |
| Product | `productId`, `productUrl`, `productTitle`, `productImageUrl`, `shopId`, `shopName`, `shopUrl`, `region`, `currency`, `overallRating`, `totalReviewCount` |
| Rating breakdown | `rating1Count` … `rating5Count` |
| Lineage | `sourceInput`, `scrapedAt` |

#### Dataset views

**Reviews**, **Review Text & Variants**, **Media Reviews**, **Product & Rating Context**, **Reviewer Context** and **Full Data**. Views show different columns of the same rows, so nothing is billed twice. Apify views can select columns but cannot filter rows. For negative, photo or verified-only datasets, use the `starRating`, `mediaOnly` and `verifiedPurchaseOnly` inputs, which also avoid paying for rows you don't want.

### Product and rating context

Product context (title, image, shop, currency, overall rating, total review count, SKU attributes) is fetched **once per product** and attached to every review row. It is fetched only when the product has a review to deliver, so a product with no new or matching reviews costs one lookup instead of two. The 1–5 star breakdown comes with the first review page. Both are **free**. If product context can't be fetched, reviews still arrive, and the product title falls back to the one in the review feed.

### Review depth and completeness

TikTok does not always expose a product's full review history, and the reported review count can be higher than the number of reviews you can actually page through. This Actor **does not claim "all reviews"**. Instead, the key-value store record `PRODUCT_SUMMARIES` reports for every product:

| Field | Meaning |
|---|---|
| `reportedReviewCount` | Total TikTok reports for the product |
| `uniqueReviewsSeen` / `reviewsDelivered` | What was found and what was delivered |
| `isComplete` | `true` when TikTok's feed reported no more pages for your order/filter, or the date boundary was reached |
| `stopReason` / `truncationReason` | Why collection stopped: `feedExhausted`, `publishedAfter`, `maxReviewsPerProduct`, `maxTotalReviews`, `maxPagesPerProduct`, `noMatchPages`, `spendingLimit`, `sourceError`, `repeatedPage`, `duplicateOnlyPages`, `timeout` |
| `status` | `ok`, `ok_no_matches`, `no_reviews`, `partial`, `failed`, `skipped` |
| `candidatesFetched`, `filteredOut`, `duplicatesSkipped`, `skippedByReviewId`, `outsideDateRange`, `pagesRequested` | Scan accounting |
| `newestReviewAt`, `oldestReviewAt` | Date range delivered |

`RUN_SUMMARY` has run-wide totals: products processed/failed, candidates, delivered, duplicates, filtered, pages, rate-limit and retry counts, duration and the overall stop reason.

### Cost controls

- **`maxTotalReviews`** is an exact run-wide ceiling. **`maxReviewsPerProduct`** is an exact per-product ceiling.
- **Spending limit:** if you set a maximum cost per run, the Actor delivers only as many reviews as it allows and then stops.
- **Scan guards:** `maxNoMatchPages` (default 10) stops a product after a run of pages that deliver nothing, and `maxPagesPerProduct` caps the total pages per product.
- **Dedupe before charging:** a review is charged once per run, even if two inputs point to the same product.

### Pricing

Pay per event: you pay **per unique review delivered** to the dataset (`review-result`). There is no start fee.

**Free:** duplicate reviews, skipped review IDs, filtered-out reviews, invalid or unsupported inputs, products with zero reviews, failed product fetches, product context, rating breakdown, and the `RUN_SUMMARY` / `PRODUCT_SUMMARIES` records.

See the **Pricing** tab for current rates. This README deliberately doesn't quote figures.

### Performance

Reviews are written page by page (20 per page), so the first rows usually appear within seconds, and earlier pages are kept even if a later page fails. Products are processed in parallel (up to 4). Throughput depends on TikTok's rate limits, which come and go, so we don't publish a reviews-per-minute figure.

### No-login / transport posture

- You don't need a TikTok account, cookies, session IDs, seller credentials or API key.
- It doesn't run a browser or need a proxy. Review data is fetched as JSON through a hosted TikTok Shop data API.
- Your URLs are never fetched. The Actor only reads the product ID and storefront from them.

### Limitations

- Only the storefronts listed above are supported.
- Reviewer names are **masked by TikTok** (e.g. `n**o r**o`) and may be missing. They are passed through as-is.
- **Video review media is not supported**: TikTok's feed doesn't expose video URLs, so `media` holds photo URLs only.
- The reported review count can be higher than the number of accessible reviews. Hidden, deleted or private reviews can't be recovered.
- `variantAttributes` needs product context. `variant` (e.g. `"2 bags"`) is always available when TikTok shows it.
- TikTok's review feed sometimes throttles. The Actor retries with backoff and reports failures per product. A failed product never stops the batch and is never charged.

### Troubleshooting

| Symptom | What to do |
|---|---|
| A product shows `status: "failed"`, `errorType: "rate_limited_or_blocked"` | TikTok throttled the review feed. Re-run later, or raise `maxRetries`. Nothing was charged for it. |
| `status: "no_reviews"` | The product has no public reviews in that storefront. |
| `status: "ok_no_matches"` | Reviews exist, but none matched your filters or date window. |
| Fewer rows than requested | Check `stopReason`, `filteredOut` and `outsideDateRange` in `PRODUCT_SUMMARIES`. |
| An input was skipped | It wasn't a product URL/ID, or its storefront isn't supported. See `invalidInputs` in `RUN_SUMMARY`. |

### API and integrations

Call it from the Apify API, the JavaScript or Python clients, Make, Zapier, n8n or any HTTP client. Small jobs (a few hundred reviews) work well with the synchronous run-and-get-dataset endpoint. For large or scheduled jobs, run it asynchronously and read the dataset when the run finishes. `reviewId` and `productId` are stable, so you can upsert into a warehouse and feed new IDs back as `skipReviewIds`.

### Privacy and responsible use

This Actor collects only publicly visible TikTok Shop review data. Reviewer information is pseudonymous or masked but may still count as personal data under applicable laws. The Actor doesn't unmask names, infer real identities or sensitive traits, or look up emails or social profiles. You are responsible for using the data lawfully and in line with TikTok's terms and applicable privacy and data-protection law.

### Changelog

- **1.0 update (2026-11-03)** — Product context is fetched only for products that deliver reviews (faster monitoring runs). New `maxNoMatchPages` scan guard (default 10), with stop reason `noMatchPages`. `PRODUCT_SUMMARIES.productContextStatus` can now be `not_needed`.
- **1.0** — Initial release: bulk product URLs/IDs, six storefronts, recommended/newest order, star/photo/verified/incentivized filters, date window and skip IDs for incremental runs, product and rating context, per-product completeness reporting, and pay-per-review charging with dedupe before billing.

# Actor input Schema

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

TikTok Shop product URLs or numeric product IDs (1–500). Accepted: tiktok.com/shop/pdp/<slug>/<id>, shop.tiktok.com/<region>/pdp/<slug>/<id>, tiktok.com/view/product/<id>, or the bare ID. Duplicates are merged before any work is done.

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

Storefront used for bare product IDs. A region in the product URL (e.g. shop.tiktok.com/my/pdp/…) takes precedence. Only storefronts we have tested are listed.

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

Maximum reviews delivered (and charged) per product. Reviews arrive 20 per page.

## `maxTotalReviews` (type: `integer`):

Run-wide ceiling on unique reviews delivered across all products. The run stops exactly here — your cost ceiling.

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

Order in which TikTok returns reviews. Forced to Newest when 'Reviews published after' is set.

## `starRating` (type: `integer`):

0 = all ratings; 1–5 = only reviews with exactly that many stars (filtered by TikTok, so it does not waste scans).

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

Keep only reviews with publicly exposed photo URLs. Video-only reviews are dropped because TikTok does not expose their media URLs.

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

Keep only reviews TikTok marks as verified purchases.

## `publishedAfter` (type: `string`):

Keep reviews at or after this date: ISO (2026-10-01) or relative (24h, 7d, 2w, 3m). Enables cheap new-review monitoring: the scan stops as soon as it passes the boundary.

## `publishedBefore` (type: `string`):

Optional upper date boundary (ISO or relative).

## `skipReviewIds` (type: `array`):

Review IDs you already have. They are skipped before output and are never charged.

## `incentivizedOnly` (type: `boolean`):

Keep only reviews TikTok flags as incentivized/rewarded. Applied after fetching, so restrictive use can return fewer rows than requested (filtered rows are free).

## `includeProductContext` (type: `boolean`):

Attach product title, image, shop, currency, overall rating and total review count to every row (fetched once per product, free).

## `includeRatingBreakdown` (type: `boolean`):

Add the product's rating1Count … rating5Count distribution to each row.

## `includeReviewerContext` (type: `boolean`):

Public reviewer fields as TikTok shows them (masked display name, reviewer ID, avatar, country). Nothing is unmasked or enriched.

## `includeMedia` (type: `boolean`):

Include the media array with review photo URLs. mediaCount and hasMedia are always included.

## `maxPagesPerProduct` (type: `integer`):

Scan guard (20 reviews per page). Stops pathological deep scans when filters match few reviews.

## `maxNoMatchPages` (type: `integer`):

Stop scanning a product after this many pages in a row that deliver no review (all filtered out, skipped or duplicates). Keeps rarely matching filters from scanning deep for nothing. Pages skipped only for being newer than 'Reviews published before' do not count. 0 = off.

## `maxRetries` (type: `integer`):

Retries per request on transient source failures (throttling, 5xx).

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

Products processed in parallel (clamped to 1–4).

## `debugMode` (type: `boolean`):

Verbose logs (retries, request details). Secrets are never logged.

## Actor input object example

```json
{
  "productTargets": [
    "1731649211243074211"
  ],
  "region": "US",
  "maxReviewsPerProduct": 20,
  "maxTotalReviews": 1000,
  "sortBy": "recommended",
  "starRating": 0,
  "mediaOnly": false,
  "verifiedPurchaseOnly": false,
  "publishedAfter": "",
  "publishedBefore": "",
  "skipReviewIds": [],
  "incentivizedOnly": false,
  "includeProductContext": true,
  "includeRatingBreakdown": true,
  "includeReviewerContext": true,
  "includeMedia": true,
  "maxPagesPerProduct": 250,
  "maxNoMatchPages": 10,
  "maxRetries": 2,
  "maxConcurrency": 3,
  "debugMode": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `reviewText` (type: `string`):

No description

## `media` (type: `string`):

No description

## `product` (type: `string`):

No description

## `reviewer` (type: `string`):

No description

## `full` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `productSummaries` (type: `string`):

No description

# 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": [
        "1731649211243074211"
    ],
    "maxReviewsPerProduct": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/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": ["1731649211243074211"],
    "maxReviewsPerProduct": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/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": [
    "1731649211243074211"
  ],
  "maxReviewsPerProduct": 20
}' |
apify call coregent/tiktok-shop-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coregent/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/Fb6wKyTgvhZ0OovOn/builds/tAYiJWS8EL3N8FZYF/openapi.json
