# TikTok Shop Scraper | $10 per 1,000 products (`webdata_labs/tiktok-shop-scraper`) Actor

\[$10 / 1K] TikTok Shop products with the real published units-sold count, rating, review count, discount, variants, seller stats and the creator video bound to the card. Scrape by keyword, category or shop. No proxy setup, no captcha, no start fee.

- **URL**: https://apify.com/webdata\_labs/tiktok-shop-scraper.md
- **Developed by:** [WebData Labs](https://apify.com/webdata_labs) (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 $7.80 / 1,000 product scrapeds

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 Scraper

**Scrape TikTok Shop products into typed rows: the units-sold count TikTok publishes itself, rating, review count, real discount, variant price range, seller stats, and the creator video the product card is bound to.**

TikTok Shop answers a "Security Check" page to almost everything, which is why so many TikTok Shop scrapers either fail a quarter of their runs or hand back a thin card: a title, a price string, and nothing you can rank a niche with. This Actor returns the fields that make a product decision: `soldCount` as TikTok publishes it, `price` / `originalPrice` / `discountPercent` as separate numbers, the shop's rating, follower count and total units sold, and - on the products that have one - the TikTok video driving the sales, with its creator, play count and like count.

### ✅ What you get / ❌ what this isn't

| ✅ What you get | ❌ What this isn't |
|---|---|
| `soldCount` straight off TikTok's own card | Not a "GMV estimate" from a model nobody can check |
| `price`, `originalPrice`, `discountPercent` as separate numbers | Not one string with a currency symbol glued to it |
| The bound TikTok video: creator, plays, likes, video URL | Not a product row that hides which creator is actually selling it |
| Shop rating, followers, total units sold, product count | Not a `shopName` string and nothing else about the seller |
| Keywords, categories and shop pages in one run, deduplicated | Not one keyword per run, billing you twice for shared products |
| Rows streamed and charged as each page is parsed | Not a run that buffers everything and delivers nothing if it times out |
| An honest 25-30 products per keyword page, documented | Not a promise of thousands of rows from a source that serves one screen |

### 🔎 Why use this Actor

- **Sold count is measured, not modelled.** TikTok prints the units-sold number on the product card and this Actor passes it through untouched. Nothing here is inferred, smoothed or estimated, and where TikTok has no number the field is null rather than guessed.
- **The creator link is a field, not a footnote.** About a quarter of product cards are bound to a TikTok video. Those rows carry `creatorName`, `creatorId`, `videoUrl`, `videoPlayCount` and `videoLikeCount`, which is how you find the creator whose video is moving a product.
- **Three sources, one row shape.** Scrape by keyword, by category page, or by shop page, in any mix, in one run. Every source produces the same columns, deduplicated on product id across all of them.
- **Keyword resolution that survives real phrasing.** TikTok Shop keyword pages are pre-generated, so `/k/electric-toothbrush` is a 404 while `/k/electric-toothbrushes` is a full page. The Actor walks plural, singular and trimmed spellings until one resolves, and tells you in the run summary which spelling it used.
- **Related-search crawling for volume.** A keyword page serves one screen and does not paginate, so **Follow related searches** ships on at level 1: one starting keyword becomes the nine keyword pages TikTok itself links from it. The walk stops the moment a level adds no product you do not already have, so you never pay for a lap that returns nothing new.
- **Shop economics on every shop-page row.** A shop target attaches the seller's rating, follower count, review count, listed-product count and lifetime units sold to each of its products.
- **Streamed delivery.** Every row is pushed and charged the moment its page is parsed, so an aborted or timed-out run still leaves you with everything collected up to that point.

### 👥 Who it's for

TikTok Shop sellers, dropshippers, affiliate and creator-marketing teams, and marketplace analysts who need a niche's real demand and competition picture rather than a screenshot of one screen.

- Find which products in a niche are actually selling, using published unit counts rather than review-count proxies.
- Build a shortlist of creators to approach, from the videos already selling products like yours.
- Price a new listing against the products TikTok ranks for its keyword.
- Track discount depth and flash-sale labels across a category before timing a promotion.
- Audit a competitor's shop: their full front-page catalog, their rating, and how many units they have moved.
- Feed a product-research model with a clean typed table instead of scraped strings.

### Example tasks

- [Scrape TikTok Shop products for any keyword](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-product-scraper)
- [Find the best selling products on TikTok Shop](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-bestselling-products)
- [Find the TikTok creators selling a product](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-creator-videos-for-products)
- [Track TikTok Shop prices and discounts](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-price-and-discount-tracker)
- [Scrape a TikTok Shop seller's products and stats](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-seller-and-shop-scraper)
- [Scrape TikTok Shop products by category](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-category-products-scraper)
- [Research TikTok Shop products to dropship](https://apify.com/webdata_labs/tiktok-shop-scraper/examples/tiktok-shop-dropshipping-product-research)

### ⚙️ How to scrape TikTok Shop products

1. Open the Actor and click **Try for free**.
2. Put one or more product terms in **Keywords**, for example `wireless earbuds`. Each keyword returns the 25-30 products TikTok Shop ranks for it.
3. Optionally add **Category pages** (paste a `shop.tiktok.com/us/c/...` URL) and **Shop pages** (paste a `shop.tiktok.com/us/store/...` URL or a bare seller id).
4. Set **Max products** (default 100, `0` for no cap) so your first run stays cheap.
5. Optionally set a price band, a minimum units-sold or rating floor, discounted-only, or bound-video-only.
6. Click **Start**, then read results in the run's **Output** tab or export CSV, JSON or Excel from the **Dataset** tab.

#### Get hundreds of products from one keyword

**Follow related searches** is already on at level 1, because a single keyword page serves 25-30 products and cannot be paged. At level 1 the Actor collects your keyword's page and then the roughly nine related keyword pages TikTok links from it; level 2 adds theirs. Each level is deduplicated against everything already collected, and the walk ends early as soon as a level contributes nothing new. Combine it with **Max products** to put a hard ceiling on the job.

### 📥 Input

```json
{
  "searchQueries": ["wireless earbuds", "phone case"],
  "categoryUrls": ["https://shop.tiktok.com/us/c/headphones-earphones-accessories/601990"],
  "shopUrls": ["https://shop.tiktok.com/us/store/cmf-by-nothing/7495669706651568260"],
  "expandRelatedKeywords": 1,
  "maxItems": 300,
  "minPrice": 10,
  "maxPrice": 50,
  "minSoldCount": 100,
  "minRating": 4,
  "onSaleOnly": false,
  "withVideoOnly": false
}
```

- `searchQueries` - product keywords, or full `shop.tiktok.com/us/k/...` URLs. Each resolves to one TikTok Shop keyword page.
- `categoryUrls` - category page URLs, or bare category ids. 15 products per category page.
- `shopUrls` - shop page URLs (either `shop.tiktok.com` or `www.tiktok.com/shop/store/...`), or bare seller ids. Up to 30 products plus the shop profile.
- `expandRelatedKeywords` - how many levels of TikTok's related-search graph to follow. Default `1`, maximum `3`. Set `0` for exactly the keywords you listed.
- `maxItems` - stop after this many unique products across every source. Default `100`, `0` means no cap.
- `minPrice` / `maxPrice` - price band in USD. Optional.
- `minSoldCount` - minimum published units sold. Default `0`.
- `minRating` - minimum score out of 5. Products with no rating yet are excluded when this is set. Default `0`.
- `onSaleOnly` - keep only products TikTok marks with a real original price and discount. Default `false`.
- `withVideoOnly` - keep only products with a bound TikTok video. Keyword sources only; category and shop pages carry no video block. Default `false`.

At least one of `searchQueries`, `categoryUrls` or `shopUrls` is required.

### 📤 Output

| title | price | originalPrice | discountPercent | soldCount | rating | shopName | creatorName |
|---|---|---|---|---|---|---|---|
| Orange Neckband Wireless Earbuds, IPX4 Sweatproof | 17.99 | 25.00 | 28.0 | 1589 | 4.7 | AuraWear | AuraWear |
| CMF Buds 2a Wireless Bluetooth Earbuds, 42 dB ANC | 49.00 | null | null | 12043 | 4.8 | CMF by Nothing | null |
| Hidden Message Coffee Mug, 11 Oz | 16.99 | null | null | 855 | 4.9 | COOOOOS | Ninja Fam Bam |

Each row also carries `productId`, `url` (the canonical product page), `imageUrl`, `currency`, `onSale`, `priceIsFrom` (true when TikTok shows a "From" price because variants differ), `dealLabel` (`Flash sale`, `Limited time deal` and similar), `reviewCount`, `brandName`, `variantCount`, `variantPriceMin`, `variantPriceMax`, `sellerId` and `shopUrl`. Rows with a bound video add `videoId`, `videoUrl`, `videoTitle`, `videoCoverUrl`, `videoPlayCount`, `videoLikeCount`, `videoDurationSeconds`, `creatorId`, `creatorName` and `creatorUrl`. Rows from a shop target add `shopRating`, `shopSoldCount`, `shopReviewCount`, `shopFollowerCount`, `shopVideoCount`, `shopProductCount`, `shopLabel`, `shopIsOfficial` and `shopPageUrl`. Provenance is on every row as `sourceType`, `source`, `sourceUrl`, `position` and `scrapedAt`.

The run summary in the key-value store's `OUTPUT` record lists the keyword spellings that resolved, how many rows the filters removed, how many pages were fetched, and any keyword TikTok has no page for.

### 💵 How much does it cost?

You pay per unique product row delivered, not per page scanned. A product that appears under three of your keywords is returned once and charged once, and rows removed by your filters are never charged. The default 100-product run takes about 23 seconds and ten page fetches. A keyword page returns 25-30 products, a category page 15, and a shop page up to 30, so budget by counting your targets - or leave **Follow related searches** on and let **Max products** be the ceiling. **Max products** is the one setting that bounds the bill, so set it before a big job.

### 🔁 Run it on the Apify platform

Schedule this Actor to re-scrape a niche daily or weekly and diff the results to watch prices, discounts and sold counts move. Every run is available through the Apify API and can export to CSV, JSON, Excel or XML, or push straight into Make, Zapier, Google Sheets, Airtable or your own webhook. Saved Tasks let you keep one configured job per niche and run them all on one schedule.

### ⚠️ Limits and caveats

- **US storefront only.** TikTok Shop's web storefront serves the US market from a US exit and challenges every other exit country we tested (GB, DE, SG, BR). Indonesia redirects to Tokopedia, a different site with a different contract. The Actor pins a US exit and returns US listings in USD.
- **One screen per page, by design of the source.** A keyword page serves 25-30 products, a category page 15, a shop page up to 30, and TikTok Shop has no working pagination on any of them: every load-more call its own page makes returns an empty success unless it carries a signature computed inside the page, and every URL page parameter is ignored. Volume comes from more targets or from **Follow related searches**, not from deeper paging. Nobody can hand you page 2 of a TikTok Shop keyword; be sceptical of an Actor that claims otherwise.
- **Keyword pages are pre-generated, so some phrases have none.** The Actor tries the plural, singular and trimmed spellings of your phrase before giving up, which resolved 25 of 25 natural buyer keywords in testing. Very long or very rare phrases can still have no page at all; those are reported in the run summary rather than silently returning zero.
- **No per-product detail page.** TikTok Shop's product detail pages stay behind the captcha for every client, so full descriptions, per-product review text, shipping detail and live stock are not available and are not offered here. Everything this Actor returns comes from listing surfaces.
- **The bound video only exists on keyword pages.** Roughly a quarter of keyword-page products carry one. Category and shop pages never carry the video block at all, so **Products with a bound TikTok video only** empties those two sources; the run warns you when you combine them. Where TikTok exposes no video, the creator fields are null rather than invented.
- **Sold count is a published lifetime figure, not a rate.** TikTok shows total units sold for the listing, not units in the last 30 days. To get a rate, schedule the Actor and diff two runs.
- **No live stock.** TikTok Shop's listing surfaces do not carry a stock number, so this Actor does not report one.

### 🧩 Related Actors

- **TikTok Ads Library Scraper** - see which TikTok ads a brand is running, alongside the products they sell here.
- **TikTok Hashtag Trends Scraper** - find the hashtags rising around a niche before scraping its products.
- **TikTok Comments Scraper** - pull the comment thread under a product's bound video to read real buyer objections.
- **TikTok Creative Center Ad Intelligence** - the paid-creative side of the same market.
- **Shopee Scraper** - the same product-research job on Southeast Asia's largest marketplace.

### ❓ FAQ

**Am I charged for products that my filters remove?** No. Filters are applied before anything is pushed, and you are charged per delivered row only. The run summary reports how many rows the filters removed.

**Can I get more than 30 products for a keyword?** Not from that one keyword page - TikTok serves one screen and offers no working pagination. Use **Follow related searches** to collect the neighbouring keyword pages, or list more keywords.

**Which countries does it cover?** The US storefront only. That is TikTok Shop's own limit on the web surface, not ours.

**Is `soldCount` an estimate?** No. It is the number TikTok publishes on the product card. Where TikTok publishes none, the field is null.

**Do I get product reviews?** No. Review text lives on the product detail page, which TikTok keeps behind its captcha for every client. You get `rating` and `reviewCount` on every row.

**Do I need to configure a proxy?** No. The Actor selects the exit it needs and rotates it if TikTok challenges a request.

### 🛠️ Support

Something wrong? Open an issue on the Actor's Issues tab with the run URL, the input you used, and what you expected instead. That is the fastest path to a fix.

### ⭐ Rate this Actor

If this saved you an afternoon, please leave a review on the **Reviews** tab. Review count is the main trust signal buyers use on the Apify Store, and it decides what gets built and improved next. If something is broken or missing, please open an issue first so it can be fixed - that helps far more than a low rating with no detail.

# Actor input Schema

## `searchQueries` (type: `array`):

Product keywords to scrape, for example `wireless earbuds`. Each keyword returns the 25-30 products TikTok Shop ranks for it. Results are deduplicated across keywords, so overlapping terms never bill you twice for the same product. You can also paste a full `shop.tiktok.com/us/k/...` URL.

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

TikTok Shop category page URLs such as `https://shop.tiktok.com/us/c/headphones-earphones-accessories/601990`. A bare category id works too. Each category page returns 15 products.

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

TikTok Shop seller page URLs such as `https://shop.tiktok.com/us/store/cmf-by-nothing/7495669706651568260`, or a bare seller id. Each shop page returns up to 30 products plus the shop's rating, follower count, total units sold and product count.

## `expandRelatedKeywords` (type: `integer`):

A single TikTok Shop keyword page serves 25-30 products and does not paginate, so following TikTok's own related-search links is how one keyword fills a larger run. Level 1 (the default) adds the roughly nine keyword pages TikTok links from yours; level 2 adds theirs. The walk stops early as soon as a level adds no product you do not already have. Set 0 to scrape only the exact keywords you listed.

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

Stop after this many unique products across every source. Set 0 for no cap. The default keeps a first run cheap and fast.

## `minPrice` (type: `integer`):

Keep only products at or above this price. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Keep only products at or below this price. Leave empty for no maximum.

## `minSoldCount` (type: `integer`):

Keep only products with at least this many units sold. TikTok publishes the sold count on the card itself, so this is a measured number rather than an estimate. Useful for separating proven sellers from new listings.

## `minRating` (type: `integer`):

Keep only products rated at or above this score out of 5. Products with no rating yet are excluded when this is set.

## `onSaleOnly` (type: `boolean`):

Keep only products that carry a real original price and discount percentage from TikTok, not a computed one.

## `withVideoOnly` (type: `boolean`):

Keep only products whose card is bound to a TikTok video, which is where the creator name, creator id, play count and like count come from. About a quarter of keyword-page products carry one. Category and shop pages never carry the video block, so this filter empties those two sources.

## Actor input object example

```json
{
  "searchQueries": [
    "wireless earbuds",
    "yoga mat"
  ],
  "categoryUrls": [
    "https://shop.tiktok.com/us/c/headphones-earphones-accessories/601990"
  ],
  "shopUrls": [
    "https://shop.tiktok.com/us/store/cmf-by-nothing/7495669706651568260"
  ],
  "expandRelatedKeywords": 1,
  "maxItems": 100,
  "minPrice": 10,
  "maxPrice": 50,
  "minSoldCount": 0,
  "minRating": 0,
  "onSaleOnly": false,
  "withVideoOnly": false
}
```

# Actor output Schema

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

No description

## `pricing` (type: `string`):

No description

## `bestsellers` (type: `string`):

No description

## `creators` (type: `string`):

No description

## `shops` (type: `string`):

No description

## `runSummary` (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 = {
    "searchQueries": [
        "wireless earbuds"
    ],
    "expandRelatedKeywords": 1,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("webdata_labs/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 = {
    "searchQueries": ["wireless earbuds"],
    "expandRelatedKeywords": 1,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("webdata_labs/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 '{
  "searchQueries": [
    "wireless earbuds"
  ],
  "expandRelatedKeywords": 1,
  "maxItems": 100
}' |
apify call webdata_labs/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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