# TikTok Shop Scraper | All-In-One (`toolzerhub/tiktok-shop-scraper`) Actor

Extract TikTok Shop products, sellers, reviews, and trending items in one Actor. Add a keyword, product ID, seller ID, or category and get titles, prices, sold counts, ratings, review text, shop names, and performance data across any supported region.

- **URL**: https://apify.com/toolzerhub/tiktok-shop-scraper.md
- **Developed by:** [ToolzerHub](https://apify.com/toolzerhub) (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 $6.46 / 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/platform/actors/running/actors-in-store#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 Scraper

Pull TikTok Shop products, sellers, reviews, categories, and trending items from one Actor. Give it a keyword, a product ID, a seller ID, or a category, and it returns structured rows — titles, prices, sold counts, ratings, review text, shop names, and performance data across eight regions: **US, GB, SG, MY, PH, TH, VN, ID**.

### Modes

Set **`scraperType`** to pick what this run collects. Each mode takes its own identifier below the picker.

| Mode | Returns | Needs | Or use the focused Actor |
|---|---|---|---|
| Search products | Products matching a keyword, full detail on request | `keyword` | [TikTok Shop Products Scraper](https://apify.com/toolzerhub/tiktok-shop-products-scraper) |
| Product detail | One product's full record: shop, reviews, vouchers, category | `product_id` and `region` | [TikTok Shop Product Detail Scraper](https://apify.com/toolzerhub/tiktok-shop-product-scraper) |
| Seller products | A seller's whole catalog | `seller_id` | [TikTok Shop Seller Products Scraper](https://apify.com/toolzerhub/tiktok-shop-seller-products-scraper) |
| Product reviews | Every review for a product, filterable by rating or photos | `product_id` | [TikTok Shop Reviews Scraper](https://apify.com/toolzerhub/tiktok-shop-reviews-scraper) |
| Category products | Every product in a category | `category` (name or ID) | [TikTok Shop Category Scraper](https://apify.com/toolzerhub/tiktok-shop-category-products-scraper) |
| Trending products | What's trending right now, by region | `region` | [TikTok Shop Trending Scraper](https://apify.com/toolzerhub/tiktok-shop-trending-products-scraper) |
| Shop info | A seller's storefront profile | `seller_id` | [TikTok Shop Seller Info Scraper](https://apify.com/toolzerhub/tiktok-shop-seller-info-scraper) |
| Keyword ideas | Autocomplete suggestions for a seed keyword | `keyword` | [TikTok Shop Keyword Ideas Scraper](https://apify.com/toolzerhub/tiktok-shop-keyword-ideas-scraper) |
| Categories | The full category tree, flattened | `region` | [TikTok Shop Categories Scraper](https://apify.com/toolzerhub/tiktok-shop-categories-scraper) |

**`scraperType`** is the only field this Actor marks required. Every other field is mode-specific, and most modes catch a missing identifier for you with a plain error rather than an empty run: Shop Info stops with `Add a TikTok Shop seller ID or shop link.`, Keyword Ideas with `Add a search keyword to get suggestions for.`, Category Products with `No TikTok Shop category matches "" in region US. Top-level categories are: ...`, and Seller Products with `Could not resolve "" to a TikTok Shop seller ID. Pass a shop share link, or the numeric seller ID directly.` Region-only modes (Trending Products, Categories) default `region` to `US`, so they never hit a blank-identifier case in practice.

### One Actor or nine?

Each of the nine modes above is also its own focused Actor, cheaper per result and scoped to a single lookup. Reach for a focused Actor once you know exactly which dataset you need at scale — a keyword search, one seller's catalog, one product's reviews. Reach for this Actor when a project spans several of those — sizing up a seller's catalog plus their reviews plus where they rank in a category, say — because that's one Actor integration instead of switching between several.

### Input

```json
{
  "scraperType": "searchProducts",
  "keyword": "wireless earbuds",
  "region": "US"
}
```

`maxItems` (default `100`, `0` for no limit) caps every paginated mode. **`region`** defaults to `US` across the board; **Product Detail** is the one mode where it's paired with an ID rather than standing on its own, because the same product ID can serve different data per region. `product_id` (Product Detail, Product Reviews) and `seller_id` (Seller Products, Shop Info) each accept either the bare ID or a page link — a URL costs nothing extra for `product_id`, while a seller share link costs one visible extra request to resolve to a numeric ID.

`addonProductDetails` — "Add product, shop, review, voucher, category, and performance detail to every product found. This makes one extra request per product." — is available on Search Products, Seller Products, Category Products, and Trending Products; it's not on Product Detail, Product Reviews, Shop Info, Keyword Ideas, or Categories, since those either already return that detail or don't return products at all. A failed or empty enrichment leaves the base row intact and isn't billed.

### Output

Field names vary by mode. Across the nine, the ones you'll see most are:

| Field | Contents |
|---|---|
| **`product_id`**, **`seller_id`**, **`title`**, **`name`** | Product and seller identifiers |
| **`price`**, **`rating`**, **`sold_count`**, **`image`** | Listing basics (search mode) |
| **`product_price_info`**, **`rate_info`**, **`sold_info`** | Listing basics (seller/category/trending modes) |
| **`review_id`**, **`review_text`**, **`review_rating`**, **`reviewer_name`**, **`is_verified_purchase`** | Review data |
| **`category_id`**, **`category_name`**, **`category_level`**, **`parent_category_id`** | Category tree data |
| **`shop_profile`** | A seller's storefront record |
| **`product_detail`**, **`shop_info`**, **`reviews_info`**, **`vouchers`**, **`category_info`**, **`shop_performance`** | Present only when `addonProductDetails` is on, or on Product Detail's own full record |

```json
{
  "product_id": "1729384756102938475",
  "seller_id": "7048392010293847561",
  "name": "Wireless Earbuds Pro",
  "title": "Wireless Earbuds Pro - Noise Cancelling",
  "price": "$29.99",
  "sold_count": 15234,
  "rating": 4.6
}
```

### Questions

**Why does Product Detail need `region` when I already have a `product_id`?**
TikTok Shop keeps separate per-region catalogs, and the same numeric product ID can point to different listing data depending on which one you ask. Product Detail is the only mode that marks both `product_id` and `region` as required for exactly that reason — every other mode defaults `region` to `US` and lets you override it.

**Category Products failed with "No TikTok Shop category matches ...". What do I pass?**
Either a category's exact name (e.g. "Beauty & Personal Care") or its numeric ID. A name is resolved against the region's live category tree first, which costs one extra request; an ID skips that lookup entirely. The error message itself lists the top-level categories available in the region you asked for, which is the fastest way to find a valid spelling.

**How do I read a seller ID from a shop link instead of looking up the number?**
Pass the share link (`vt.tiktok.com/...`) or full shop URL directly into `seller_id` on Seller Products — it resolves to the numeric ID for you, at the cost of one extra visible request. Shop Info takes a plain numeric ID or link the same way, without that extra resolution step.

**Product Reviews only returns 20 rows even though I set `maxItems` higher. Why?**
The reviews endpoint pages by a plain page number, 20 reviews per page, not a cursor — so raising `maxItems` does keep pulling further pages, but each one costs a full request regardless of how many rows it returns. A short final page (fewer than 20) is normal and doesn't mean the run stalled; watch `has_more` in the log, not the row count of any single page.

**Categories returned fewer rows than the full tree. Why?**
`maxItems` defaults to `100`. A region's full category tree can have more nodes than that, and the default silently caps the export short of the complete tree. Raise `maxItems` if you need every category.

**Can I filter reviews by star rating or photos?**
Yes — Product Reviews takes `reviewRating` (`all`, or `5_star` down to `1_star`) and `reviewFilter` (`no_filter`, `with_media`, `verified_purchase`). Every row also carries the product's overall star-rating breakdown alongside its own rating, so a single row still tells you where it sits among the full review set.

**What's the difference between "Search Products" here and the separate Search Scraper Actor?**
Both call the same product search behind the scenes. This Actor's Search Products mode and the [TikTok Shop Products Scraper](https://apify.com/toolzerhub/tiktok-shop-products-scraper) return the full field set and support `addonProductDetails`; the [TikTok Shop Search Scraper](https://apify.com/toolzerhub/tiktok-shop-search-scraper) trims the input and output down to the core listing fields only, with no detail add-on, for a cheaper run when that's all you need.

### Related Actors

| Actor | Purpose |
|---|---|
| [TikTok Shop Products Scraper](https://apify.com/toolzerhub/tiktok-shop-products-scraper) | Keyword search with full product detail |
| [TikTok Shop Search Scraper](https://apify.com/toolzerhub/tiktok-shop-search-scraper) | Keyword search, core fields only, no add-on |
| [TikTok Shop Product Detail Scraper](https://apify.com/toolzerhub/tiktok-shop-product-scraper) | One product's full record |
| [TikTok Shop Seller Products Scraper](https://apify.com/toolzerhub/tiktok-shop-seller-products-scraper) | One seller's catalog |
| [TikTok Shop Reviews Scraper](https://apify.com/toolzerhub/tiktok-shop-reviews-scraper) | One product's reviews |

# Actor input Schema

## `scraperType` (type: `string`):

Choose the dataset for this run, then fill in the section for that mode below.

## `keyword` (type: `string`):

Product keyword to search for on TikTok Shop.

## `category` (type: `string`):

TikTok Shop category name (for example Beauty & Personal Care, or a subcategory like Hand & Foot Care) or a numeric category ID.

## `addonProductDetails` (type: `boolean`):

Add product, shop, review, voucher, category, and performance detail to every product found. This makes one extra request per product.

## `product_id` (type: `string`):

TikTok Shop product ID, or a product page URL (https://shop.tiktok.com/view/product/<id>), to fetch full product details for.

## `seller_id` (type: `string`):

A TikTok Shop seller/shop ID, or a shop share link (https://vt.tiktok.com/... or a full shop URL). A share link costs one extra lookup to turn into an ID.

## `reviewFilter` (type: `string`):

Which reviews to collect.

## `reviewRating` (type: `string`):

Only collect reviews with this rating.

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

TikTok Shop region code.

## `lang` (type: `string`):

Locale the keyword suggestions come back in.

## `maxItems` (type: `integer`):

Maximum number of products to save in search mode. Set 0 for no limit.

## Actor input object example

```json
{
  "scraperType": "searchProducts",
  "keyword": "phone",
  "category": "Beauty & Personal Care",
  "addonProductDetails": false,
  "product_id": "1732432759321694958",
  "seller_id": "8655572138322465518",
  "reviewFilter": "no_filter",
  "reviewRating": "all",
  "region": "US",
  "lang": "en-US",
  "maxItems": 20
}
```

# Actor output Schema

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

Every record collected during this run

# 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 = {
    "keyword": "LEGO",
    "category": "Beauty & Personal Care",
    "product_id": "1729401495861891109",
    "seller_id": "8655572138322465518",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("toolzerhub/tiktok-shop-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 = {
    "keyword": "LEGO",
    "category": "Beauty & Personal Care",
    "product_id": "1729401495861891109",
    "seller_id": "8655572138322465518",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("toolzerhub/tiktok-shop-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 '{
  "keyword": "LEGO",
  "category": "Beauty & Personal Care",
  "product_id": "1729401495861891109",
  "seller_id": "8655572138322465518",
  "maxItems": 20
}' |
apify call toolzerhub/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,toolzerhub/tiktok-shop-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/3x1U1bfsf7R0p8Qb3/builds/1Gska6U0IH76m94EK/openapi.json
