# TikTok Shop Scraper — Products, Sales, Stock & Reviews (`cazadores/tiktok-shop-scraper`) Actor

Scrape TikTok Shop products in bulk: price, discount, units sold, rating breakdown, stock per variant, reviews and shop stats. Search by keyword, store or category. Pay only for products delivered.

- **URL**: https://apify.com/cazadores/tiktok-shop-scraper.md
- **Developed by:** [Juan Manuel D'Amico](https://apify.com/cazadores) (community)
- **Categories:** E-commerce, Social media, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 product (full details)s

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 Scraper — Products, Sales, Stock & Reviews

Scrape TikTok Shop (US) product data in bulk: **price, discount, units sold, rating breakdown, stock per variant, reviews, shipping and shop stats**. Start from product links, keywords, stores or categories. **$5 per 1,000 full products (or $1 per 1,000 listing rows), no start fee, and you only pay for products delivered.**

### Why this TikTok Shop scraper

| | This Actor | Typical alternatives |
|---|---|---|
| Price per 1,000 products | **$5 full details / $1 listing** | $10–30 |
| Start fee per run | **None** | Often charged |
| Many products per run | **Yes: product URLs, keywords, stores, categories** | Often one URL per run |
| Units sold, stock per variant, rating breakdown | **Yes** | Partial |
| Failed or removed products | **Free** | Often charged |
| Login or cookies needed | **No** | Sometimes |

### What you get

For every product:

- **Pricing:** current price, original price, discount %, currency, price per variant
- **Demand signals:** units sold, rating, review count, 1–5 star breakdown
- **Inventory:** stock per variant (SKU) and total stock
- **Content:** title, description, specifications, categories, images
- **Shipping:** free shipping, fee, delivery days, estimated delivery
- **Shop:** name, rating, followers, total units sold, product count, reviews, videos
- **Reviews:** top reviews shown on the product page (rating, text, date, verified purchase, variant, photos)

### Input

```json
{
  "productUrls": ["https://www.tiktok.com/shop/pdp/1729527313880355335"],
  "searchKeywords": ["led face mask", "protein powder"],
  "storeUrls": ["https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079"],
  "categoryUrls": ["https://www.tiktok.com/shop/c/kitchen-utensils-gadgets/859528"],
  "maxProductsPerSource": 30,
  "scrapeProductDetails": true,
  "maxReviewsPerProduct": 10
}
```

| Field | Default | Description |
|---|---|---|
| `productUrls` | – | Product links in any format (`tiktok.com/shop/pdp/…`, `shop.tiktok.com/…`, share links) or product IDs |
| `searchKeywords` | – | Keywords: returns TikTok Shop's top ~30 products for each one |
| `storeUrls` | – | Store links: the store's featured products (up to 20) plus store stats |
| `categoryUrls` | – | Category links, paginated up to `maxProductsPerSource` |
| `maxProductsPerSource` | 30 | Max products per keyword, store or category |
| `scrapeProductDetails` | `true` | `true`: full details for every product. `false`: fast listing rows (title, price, sold, rating) at a lower price |
| `maxReviewsPerProduct` | 10 | Top reviews from the product page |
| `includeVariants` | `true` | Price and stock of every variant |

### Output example

```json
{
  "productId": "1729527313880355335",
  "url": "https://www.tiktok.com/shop/pdp/1729527313880355335",
  "status": "ok",
  "title": "Goli Ashwagandha & Vitamin D Gummy - Mixed Berry, KSM-66, Vegan",
  "price": 19.47,
  "originalPrice": 24.7,
  "discountPercent": 21,
  "currency": "USD",
  "soldCount": 1303343,
  "rating": 4.5,
  "reviewCount": 94531,
  "ratingDistribution": { "1star": 5781, "2star": 1519, "3star": 3727, "4star": 7818, "5star": 75686 },
  "categories": ["Health", "Nutrition & Wellness", "Vitamins, Minerals & Wellness Supplements"],
  "shipping": { "freeShipping": true, "fee": 0, "minDays": 4, "maxDays": 7 },
  "shop": { "name": "Goli Nutrition", "rating": 4.6, "followers": 600503, "soldCount": 5763554, "productCount": 52 },
  "variants": [{ "skuId": "1729527298861535751", "properties": { "Size": "1 Bottle" }, "price": 19.47, "stock": 339985 }],
  "totalStock": 339985,
  "reviews": [{ "rating": 5, "text": "…", "date": "2026-07-09T14:46:53Z", "verifiedPurchase": true }],
  "source": "led face mask",
  "scrapedAt": "2026-09-29T12:00:00Z"
}
```

`status` is `ok` (charged), `unavailable` (removed or not sold in the US) or `error` (see `error`; not charged). A run summary is saved in the key-value store as `SUMMARY`.

### Use cases

- **Product research & dropshipping:** find winning products by units sold, rating and discount.
- **Competitor monitoring:** track prices, stock and sales of competing shops over time (schedule the Actor).
- **Market sizing:** compare categories and keywords by sales volume.
- **Review analysis:** collect top reviews and rating breakdowns for sentiment analysis.
- **AI agents:** give an agent live TikTok Shop data through the Apify MCP server.

### How to use it from code

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("cazadores/tiktok-shop-scraper").call(run_input={
    "searchKeywords": ["led face mask"],
    "maxProductsPerSource": 30,
})
for p in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(p["title"], p.get("price"), p.get("soldCount"))
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('cazadores/tiktok-shop-scraper').call({
    storeUrls: ['https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

#### As an MCP tool for AI agents

```
https://mcp.apify.com/?actors=cazadores/tiktok-shop-scraper
```

### Pricing

Pay-per-event, no subscription and no start fee:

| Event | Price |
|---|---|
| Full product details (`status: ok`) | **$0.005** ($5 per 1,000) — lower on higher Apify plans |
| Listing row (`scrapeProductDetails: false`) | **$0.001** ($1 per 1,000) |
| Removed products, errors, invalid inputs | **Free** |

Proxies and compute are included. Set a maximum cost per run and the Actor stops cleanly when it's reached.

### Known limitations

- US TikTok Shop only.
- Keywords use TikTok Shop's public keyword pages: about 30 top products per keyword. Most common product keywords have one; the Actor also tries the singular/plural form automatically (12 of 12 keywords found in our tests). If a keyword has no page, you get a clear message (not charged): try a broader term or a category.
- Stores return their ~20 featured products. For more, add the store's product links or its category pages.
- Only the top reviews shown on the product page are included (not every review).
- Data is public information visible without logging in; the Actor never logs in.

### Related actors

- [YouTube Transcript & Subtitles API](https://apify.com/cazadores/youtube-transcript-bulk) — bulk YouTube transcripts for research and AI.

### En español

**Scraper de TikTok Shop (EE. UU.)**: precio, descuento, unidades vendidas, rating con distribución de estrellas, stock por variante, reviews, envío y datos de la tienda, a partir de links de productos, palabras clave, tiendas o categorías. **$5 cada 1.000 productos completos** (o $1 cada 1.000 filas de listado), sin costo de arranque, y **solo pagás los productos entregados**.

# Actor input Schema

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

TikTok Shop product links in any format (tiktok.com/shop/pdp/..., shop.tiktok.com/..., vm.tiktok.com share links) or numeric product IDs.

## `searchKeywords` (type: `array`):

Keywords such as 'led face mask'. Returns TikTok Shop's top ~30 products for each keyword (uses TikTok's public keyword pages; singular/plural variants are tried automatically).

## `storeUrls` (type: `array`):

TikTok Shop store links (tiktok.com/shop/store/<name>/<id>). Returns the store's featured products (up to 20) and the store stats.

## `categoryUrls` (type: `array`):

TikTok Shop category links (tiktok.com/shop/c/<name>/<id>). Paginated up to 'Max products per source'.

## `maxProductsPerSource` (type: `integer`):

Keywords return at most ~30 and stores at most 20 featured products.

## `scrapeProductDetails` (type: `boolean`):

On: open every product for full details (variants and stock, rating breakdown, reviews, shipping, specifications). Off: return the quick listing data only (title, price, sold count, rating) at a lower price. Product URLs are always scraped in full.

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

Top reviews shown on the product page (usually up to 3-10).

## `includeVariants` (type: `boolean`):

Price, stock and options of every variant.

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

Products scraped in parallel.

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

Default (Apify proxy, no group) uses datacenter IPs and automatically retries with US residential IPs if TikTok blocks. Included in the price.

## `failIfSuccessRateBelow` (type: `integer`):

For monitoring: mark the run as FAILED when fewer than this % of products succeed (0 = off).

## Actor input object example

```json
{
  "productUrls": [
    "https://www.tiktok.com/shop/pdp/1729527313880355335"
  ],
  "maxProductsPerSource": 30,
  "scrapeProductDetails": true,
  "maxReviewsPerProduct": 10,
  "includeVariants": true,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "failIfSuccessRateBelow": 0
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "productUrls": [
        "https://www.tiktok.com/shop/pdp/1729527313880355335"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cazadores/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 = {
    "productUrls": ["https://www.tiktok.com/shop/pdp/1729527313880355335"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("cazadores/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 '{
  "productUrls": [
    "https://www.tiktok.com/shop/pdp/1729527313880355335"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call cazadores/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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