# TikTok Shop Scraper - Products, Prices & Reviews (`vulnv/tiktok-shop-scraper`) Actor

Scrape TikTok Shop: search products by keyword, get product details with price, sold count, rating and star breakdown, list a shop's products, pull product reviews and shop summaries. Choose the market: US, Singapore, Malaysia, Philippines, Thailand or Vietnam. Export to JSON/CSV/Excel.

- **URL**: https://apify.com/vulnv/tiktok-shop-scraper.md
- **Developed by:** [VulnV](https://apify.com/vulnv) (community)
- **Categories:** E-commerce, Social media
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 products

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 Scraper - Products, Prices & Reviews

**Scrape TikTok Shop and export products, prices, sold counts, ratings, reviews and shop data to JSON, CSV or Excel.** Search products by keyword, pull a product's full details with its star-rating breakdown and category, collect a product's reviews, list every product a shop sells, or get a shop summary - all from one Actor. Each result is one clean, flat row with price, original price, discount, units sold, rating, review count and shop data.

No login, no cookies and no proxies to configure - data is fetched through a fast, managed pipeline. Just pick an operation and a market, add your input and press **Start**.

> **Unofficial notice:** This is an independent tool and is **not** affiliated with, endorsed by, or connected to TikTok, TikTok Shop or ByteDance. "TikTok" and "TikTok Shop" are trademarks of their respective owners, used here only to describe what the Actor scrapes.

### What is TikTok Shop?

TikTok Shop is the in-app marketplace inside TikTok, where sellers list products and creators sell them through videos and live streams. It runs separate storefronts per market (the United States and several Southeast Asian countries), each with its own catalogue, prices and currency. This scraper gives you programmatic access to TikTok Shop search, product pages, reviews and shop catalogues so you can track prices, find best sellers and research competitors without opening the app.

### Operations

Pick one **Operation** and fill in the matching field:

| Operation | Input field | What you get |
|-----------|-------------|--------------|
| **Search products by keyword** | `keywords` | Products matching each keyword, with price, discount, units sold, rating and shop. |
| **Product details** (US) | `productUrls` | One full row per product: price, sold count, rating with the 1-5 star breakdown, review count, category path and shop. |
| **Product reviews** (US) | `productUrls` | Reviews for each product: star rating, text, photos, variant bought, verified-purchase flag and date. |
| **Shop's products** | `shopUrls` | Every product a shop sells, best sellers first. |
| **Shop summary** | `shopUrls` | A shop's name, logo, verified badge, number of products and its best-selling product. |

`productUrls` accept `shop.tiktok.com/<market>/pdp/<name>/<id>` links, `tiktok.com/shop/pdp/...` links, `vt.tiktok.com` share links or bare numeric product IDs. `shopUrls` accept shop (store) links, `vt.tiktok.com` shop share links or bare numeric shop IDs (the `seller_id` column of any product row) - one per line.

### How to use it (step by step)

1. Choose an **Operation**.
2. Choose the **Market** (default United States). Prices come back in that market's currency.
3. Fill in the matching input:
   - Search products -> add one or more **Search keywords**.
   - Product details / Product reviews -> paste **Product URLs / IDs**.
   - Shop's products / Shop summary -> paste **Shop URLs / IDs**.
4. Set **Maximum results per input** (default 100, or 0 for all available) for the paginated operations.
5. For reviews, optionally set **Review sort order** and **Review filter** (a star rating, with photos or videos, or verified purchases).
6. Press **Start**. Export the dataset as JSON, CSV, Excel, XML or via the API.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `operation` | string | **Required.** `search_products`, `product_detail`, `product_reviews`, `shop_products`, or `shop_info`. |
| `keywords` | array | Search keywords (for `search_products`). |
| `productUrls` | array | Product URLs, share links or IDs (for `product_detail`, `product_reviews`). |
| `shopUrls` | array | Shop URLs, share links or IDs (for `shop_products`, `shop_info`). |
| `region` | string | Market: `US`, `SG`, `MY`, `PH`, `TH` or `VN`. Default `US`. A link that names its market uses that market automatically. |
| `maxItems` | integer | Max results per keyword / product / shop. `0` = all available. Default `100`. |
| `reviewSort` | string | `recent` or `recommended` (reviews only). |
| `reviewFilter` | string | `all`, `5_star` ... `1_star`, `with_media`, or `verified` (reviews only). |

### Output

Every row carries a `record_type` of `product`, `review` or `shop`, plus the `region` it came from. Product fields:

| Field | Description |
|-------|-------------|
| `product_id`, `product_url`, `title`, `image_url`, `brand_name` | Product identity, page URL and main image. |
| `currency`, `price`, `original_price`, `discount_percent`, `price_display`, `price_prefix` | Price data. `price_prefix` is `From` when variants are priced differently. |
| `sold_count`, `rating`, `review_count` | Units sold, average star rating and number of reviews. |
| `rating_5_count` ... `rating_1_count`, `category`, `category_path` | Star breakdown and category (Product details only). |
| `sku_count`, `free_shipping`, `promotion_labels` | Variants and badges such as Free shipping or Flash sale. |
| `seller_id`, `shop_name`, `shop_logo_url`, `shop_verified` | The shop selling the product. |

Review (`review`) rows add `review_id`, `rating`, `text`, `create_time`, `verified_purchase`, `incentivized`, `sku_specification`, `review_country`, `image_urls`, `image_count` and the reviewer's `reviewer_*` fields. Shop (`shop`) rows add `product_count` (US market only; empty elsewhere) and the shop's best seller (`top_product_id`, `top_product_title`, `top_product_url`, `top_product_sold_count`).

Example product row:

```json
{
  "record_type": "product",
  "operation": "product_detail",
  "input": "1729488565791527807",
  "region": "US",
  "product_id": "1729488565791527807",
  "title": "Silicone Multi-Layered Heavy Duty Shockproof Rugged Cellphone Case ...",
  "product_url": "https://shop.tiktok.com/us/pdp/iphone-shockproof-case-by-brand-name-heavy-duty-triple-layer-protection/1729488565791527807",
  "category": "Cases, Screen Protectors & Stickers",
  "currency": "USD",
  "price": 14.99,
  "sold_count": 60202,
  "rating": 4.6,
  "review_count": 10427,
  "rating_5_count": 8782,
  "rating_1_count": 576,
  "free_shipping": true,
  "seller_id": "7495641947658095487",
  "shop_name": "XG-Tech Wireless"
}
```

### Common use cases

- **Product research** - find what sells in a niche by sold count, rating and review volume before you source a product.
- **Price and discount monitoring** - schedule a search or a shop's catalogue and track prices, discounts and flash sales over time.
- **Competitor analysis** - list every product a competing shop sells, best sellers first, and compare them with your own.
- **Review mining** - collect 1-star or verified-purchase reviews to learn what buyers love and what they complain about.

### Notes on reliability

- Product and shop IDs belong to one market. Pick the market the product is sold in, or paste a link that names it (`shop.tiktok.com/us/...`).
- **Product details and Product reviews are currently available for the US market only.** Search, Shop's products and Shop summary work in all six markets. Inputs from other markets are skipped with a clear log message and are not charged.
- Product details are built for products that have at least one review. A brand-new product with no reviews may not be found; its price and sold count are still available from Search or Shop's products.
- TikTok Shop's search sometimes returns a short page; the Actor retries automatically, so a run can take a little longer than the result count suggests.
- Sold counts, ratings and prices are what TikTok Shop shows at scrape time. Image URLs are served by TikTok's CDN and expire; fetch them promptly. Reviewer names are masked by TikTok Shop.

### FAQ

**Do I need a TikTok account, cookies or a proxy?** No. Just add your input and press Start.

**Which markets are supported?** United States, Singapore, Malaysia, Philippines, Thailand and Vietnam for search and shops; the United States for product details and reviews. The United Kingdom storefront is not available.

**Where do I find a shop ID?** Run a search or Product details first: every product row has the shop's `seller_id`, which works as input for the shop operations.

**Can I run several keywords or URLs at once?** Yes - add multiple lines. Cross-input duplicates are removed automatically.

**Can I try it for free?** Yes. Users on the free Apify plan can fetch up to 10 results in total to try the Actor. Upgrade to a paid Apify plan to run it without that limit.

**What export formats are supported?** JSON, CSV, Excel, XML and HTML, plus the Apify API and integrations such as Google Sheets, Zapier, Make and webhooks.

### Pricing

This Actor is **pay per result**: you are charged for each record it returns (products, product details, reviews and shop summaries), plus standard Apify platform usage. Different record types have different prices; see the **Pricing** tab for current rates. You are never charged for inputs that return nothing.

### Related scrapers

- **[Instagram Posts Scraper](https://apify.com/vulnv/instagram-posts-scraper)** - Instagram posts with engagement data.
- **[Douyin Scraper](https://apify.com/vulnv/douyin-search-scraper)** - 抖音 videos by keyword, with creators and downloads.
- **[Xiaohongshu Scraper](https://apify.com/vulnv/xiaohongshu-scraper)** - 小红书 / RedNote notes, users and comments.

# Actor input Schema

## `operation` (type: `string`):

What to scrape. Each operation uses a different input field below:

• Search products → Keywords
• Product details → Product URLs / IDs
• Product reviews → Product URLs / IDs
• Shop's products → Shop URLs / IDs
• Shop summary → Shop URLs / IDs

## `keywords` (type: `array`):

For the "Search products" operation. Add one or more keywords or product names. Each keyword is searched independently and cross-keyword duplicates are removed.

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

For the "Product details" and "Product reviews" operations. Paste shop.tiktok.com product links (e.g. https://shop.tiktok.com/us/pdp/<name>/1729488565791527807), tiktok.com/shop/pdp links, vt.tiktok.com share links or bare numeric product IDs - one per line.

## `shopUrls` (type: `array`):

For the "Shop's products" and "Shop summary" operations. Paste shop (store) links, vt.tiktok.com shop share links or bare numeric shop (seller) IDs - one per line. The shop ID is in the seller_id column of any product row.

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

The TikTok Shop market to scrape. Prices are returned in that market's currency, and a product or shop ID only exists in its own market. A link that names its market (shop.tiktok.com/my/...) uses that market automatically. Product details and Product reviews are currently available for the United States only.

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

Upper bound on results per keyword / shop / product (for the paginated operations: search, shop's products, reviews). Cost scales linearly. Set 0 to fetch all available.

## `reviewSort` (type: `string`):

For "Product reviews" only. Newest first or TikTok Shop's recommended order.

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

For "Product reviews" only. All reviews, one star rating, reviews with photos or videos, or verified purchases only.

## Actor input object example

```json
{
  "operation": "search_products",
  "keywords": [
    "phone case",
    "labubu"
  ],
  "region": "US",
  "maxItems": 100,
  "reviewSort": "recent",
  "reviewFilter": "all"
}
```

# Actor output Schema

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

All scraped TikTok Shop results in the default dataset.

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

Overview table of the scraped results.

# 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 = {
    "keywords": [
        "phone case",
        "labubu"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vulnv/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 = { "keywords": [
        "phone case",
        "labubu",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("vulnv/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 '{
  "keywords": [
    "phone case",
    "labubu"
  ]
}' |
apify call vulnv/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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