# TikTok Shop Top Products Scraper (`lergassy/tiktok-shop-top-products-scraper`) Actor

Scrape TikTok Shop best-selling products with revenue (GMV), units sold, average price, growth, the video / live / shop-window split and affiliate commission in 15 markets. Search by keyword, category, shop or creator. Optional daily revenue analytics. JSON, CSV, API.

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

## Pricing

from $2.10 / 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.
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 Top Products Scraper** lists the **best-selling TikTok Shop products** with **revenue (GMV), units sold, average selling price, growth and the revenue split between videos, lives and the shop window**, plus the **affiliate commission rate**, for the last day, 7 days, 30 days or any past month in 15 markets. Search by keyword or category, a shop or a creator, or take the overall top list. Turn on **📈 Product analytics** for the number of creators, videos and lives selling each product, review count and price range.

**$3 per 1,000 products** ($0.003 per row, down to $0.0021 on higher Apify plans); with analytics **$40 per 1,000** from 22 October 2026. No login.

### What is TikTok Shop Top Products Scraper?

A product-research tool for dropshippers, brands and TikTok Shop sellers: the winning-products view of sales-analytics dashboards, as rows you can export or feed to an agent.

- **What sells right now?** Top products of a market, a category or a keyword by revenue or units sold.
- **How does it sell?** Revenue from videos vs lives vs the shop window, and the commission creators get.
- **Is it growing?** Revenue growth against the previous period.

### What data can it extract?

| Field | Meaning |
|---|---|
| `productId`, `title`, `url`, `launchDate` | The product |
| `revenue`, `unitsSold`, `avgSellingPrice`, `revenueGrowthPercent` | Revenue (USD) and units sold in the period, change against the previous period |
| `videoRevenue`, `liveRevenue`, `shopWindowRevenue` | Where the revenue came from |
| `commissionRatePercent` | Affiliate commission offered to creators |
| `creatorCount`, `videoCount`, `liveCount`, `reviewCount`, `minPrice`, `maxPrice`, `shopId`, `categoryIds`, `deliveryType` | Analytics option |
| `rank`, `country`, `period`, `source`, `sourceInput`, `category` | Position in the list and which input found the product |

### How much does it cost?

Pay per event:

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Product row | $0.003 | $0.0027 | $0.0024 | $0.0021 |
| Product row with analytics | $0.02 | $0.019 | $0.018 | $0.017 |

From **22 October 2026**: a **run start fee of $0.005**, and a row with analytics costs **$0.04 / $0.038 / $0.036 / $0.035** (the price covers the paid data call behind each such row).

- Rows with analytics are **paused until 22 October 2026**: with the option on, rows are delivered and charged as plain rows.
- Each row is charged once: as a plain product or, with the option on, as a product with analytics.
- Notices (an input with no results), duplicates across inputs and errors are **never billed**.
- Set **Max cost per run** in the run options and the run stops by itself at that amount, with every delivered row paid for.
- **Free Apify plan:** a preview of up to 20 rows from each of the first 2 inputs, without the analytics option (Apify does not pay out free-plan runs, while every row costs us a licensed data call). Any paid Apify plan removes these limits.

### How to scrape TikTok Shop best sellers

1. Leave the inputs empty for the overall top of a country, or add **🔍 Keywords**, **🗂️ Categories**, **🏪 Shops** or **👤 Creators**.
2. Pick **🌍 Country**, **📅 Period** and **↕️ Sort by** (revenue, units sold, growth, video or shop-window revenue, commission, price, launch date). Optionally filter by price and revenue.
3. Press **Start** and export JSON, CSV or Excel.

Keyword results keep only products whose title contains every word of the keyword.

### ⬇️ Input

```json
{
  "keywords": ["phone case"],
  "categories": ["Air Fryers"],
  "country": "US",
  "period": "last7Day",
  "sortBy": "unitsSold",
  "maxResultsPerSource": 100,
  "minPrice": 10
}
```

### ⬆️ Output

A product row with analytics (TikTok Shop Thailand, real run of 8 October 2026):

```json
{
  "type": "product",
  "rank": 1,
  "productId": "1729718557130787026",
  "title": "iPhone 15 128 GB โทรศัพท์มือถือ เครื่องศูนย์ไทย เครื่องใหม่แท้ รับประกันศูนย์ 1 ปี",
  "url": "https://shop.tiktok.com/th/pdp/1729718557130787026",
  "revenue": 2258038.5,
  "unitsSold": 3227,
  "avgSellingPrice": 699.73,
  "revenueGrowthPercent": -68.54,
  "videoRevenue": 189819.67,
  "liveRevenue": 1348813.82,
  "shopWindowRevenue": 719405.02,
  "commissionRatePercent": 0,
  "launchDate": "2023-09-19",
  "country": "TH",
  "period": "last30Day",
  "currency": "USD",
  "source": "top",
  "sourceInput": "top products TH",
  "scrapedAt": "2026-10-08T14:09:49.829Z",
  "minPrice": 758.01,
  "maxPrice": 996.95,
  "shopId": "7494652822320875730",
  "categoryIds": [
    "601739",
    "995976",
    "602097"
  ],
  "creatorCount": 40,
  "videoCount": 65,
  "liveCount": 212,
  "reviewCount": 15346,
  "deliveryType": "local",
  "analytics": true
}
```

### Use cases

#### Product research and dropshipping

Top products of a category in the last 7 days, sorted by units sold, with the commission you can offer creators.

#### Market sizing across countries

The same category in the US, UK, Indonesia, Thailand and Vietnam, side by side in US dollars.

#### Content strategy

Compare revenue from videos and lives to decide where to sell.

#### AI agents and pipelines

Ask an agent "what are the best-selling air fryers on TikTok Shop this week" through the Apify MCP server.

### Integrations

Apify API (`POST /v2/acts/lergassy~tiktok-shop-top-products-scraper/run-sync-get-dataset-items`), Python and JavaScript clients, n8n, Make, Zapier, Google Sheets, webhooks and schedules, and the Apify MCP server.

### Troubleshooting

- **A notice "Stopped here"**: the inputs before it returned almost no matching rows, so the run ended instead of reading on; nothing is charged for inputs that were not read. Use broader keywords or categories.
- **A notice row "No TikTok Shop category matches"**: TikTok's names are short ("Fryers", not "Air Fryers" — both work); try a broader one.
- **Fewer products than the limit for a keyword**: products without every keyword word in the title are skipped and not charged.
- **Need stock per variant, shipping or reviews?** Use [TikTok Shop Scraper](https://apify.com/lergassy/tiktok-shop-scraper) on the product links from this Actor.

### ❓ FAQ

#### Where do the revenue numbers come from?

From licensed TikTok Shop analytics data: the same kind of figures sales-analytics dashboards show. TikTok does not publish revenue, so revenue, units sold and the video / live split are **estimates** built from public sales counters, prices and content. Use them to compare and rank, not as accounting figures.

#### Which markets are covered?

The US, UK, Indonesia, Thailand, Vietnam, the Philippines, Malaysia, Singapore, Japan, Mexico, Germany, Italy, France, Spain and Brazil. Revenue is in US dollars for every market.

#### Does it need a TikTok account, cookies or an API key?

No. Nothing to log in to and no key to bring.

#### Is it legal to scrape TikTok Shop?

The Actor returns aggregated sales analytics and public profile information. Check that your use complies with TikTok's terms and with data-protection law in your country (GDPR, CCPA), especially before contacting creators.

### Your feedback

Found a bug or need a field? Open an issue on the Actor's **Issues** tab. If the Actor saved you time, a short review helps other buyers find it.

### You might also like

| Actor | What it does |
|---|---|
| [TikTok Shop Scraper](https://apify.com/lergassy/tiktok-shop-scraper) | Live product pages: price, stock per variant, shipping, shop stats and up to 25,000 reviews per product |
| [TikTok Shop Top Products Scraper](https://apify.com/lergassy/tiktok-shop-top-products-scraper) | Best-selling products with revenue, units sold and the video / live split in 15 markets |
| [TikTok Shop Creators Scraper](https://apify.com/lergassy/tiktok-shop-creators-scraper) | Selling creators with revenue, followers and contact e-mails |
| [TikTok Shop Videos Scraper](https://apify.com/lergassy/tiktok-shop-videos-scraper) | Shoppable videos with revenue, views, ad ROAS and the AI-video flag |
| [TikTok Shop Shops & Live Scraper](https://apify.com/lergassy/tiktok-shop-shops-live-scraper) | Top shops with the affiliate / own-account split, and top live streams with revenue and views |
| [TikTok Shop Reviews Scraper](https://apify.com/lergassy/tiktok-shop-reviews-scraper) | Every buyer review of US and UK products, or only the new ones since a date |
| [TikTok Influencer Scraper](https://apify.com/lergassy/tiktok-influencer-scraper) | Followers, engagement rate and average views for any list of TikTok creators |

# Changelog

This Actor's version history is a separate document: https://apify.com/lergassy/tiktok-shop-top-products-scraper/changelog.md

# Actor input Schema

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

Give this or another input below — or leave all empty for the overall top products of the chosen country. Products matching each keyword: <b>air fryer</b>, <b>lip gloss</b>, <b>protein</b>.

## `categories` (type: `array`):

Optional. TikTok Shop category names — <b>Beauty & Personal Care</b>, <b>Phones & Electronics</b>, <b>Skincare</b>, <b>Air Fryers</b>. Each one is a separate list of top products; the matched category is in the row.

## `creators` (type: `array`):

Optional. TikTok usernames (<code>@name</code>), profile links or creator IDs: the products of each creator.

## `shopIds` (type: `array`):

Optional. TikTok Shop shop IDs or store links (<code>shop.tiktok.com/us/store/…/7495…</code>): the products of each shop.

## `country` (type: `string`):

TikTok Shop market. Revenue is in US dollars for every market.

## `period` (type: `string`):

Sales window for revenue, units sold and growth.

## `month` (type: `string`):

Optional, overrides Period: a past month as <code>2026-09</code>.

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

Order of the list, highest first.

## `maxResultsPerSource` (type: `integer`):

Upper limit of products from each keyword, category, product, creator or shop (or from the overall top list). Duplicates across inputs are skipped and not charged. Free Apify plan: up to 20 from each of the first 2 inputs.

## `addAnalytics` (type: `boolean`):

<b>Paused until 22 October 2026</b> (rows come as plain rows at the plain price); from then $0.04 per row. Not on the free Apify plan. Adds to each product: number of creators, videos and lives selling it, review count, price range, shop ID, category IDs and delivery type. Each such row is charged as a product with analytics instead of a plain product.

## `minRevenue` (type: `integer`):

Only rows with at least this revenue in the period. 0 = no floor.

## `maxRevenue` (type: `integer`):

0 = no ceiling.

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

0 = no floor.

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

0 = no ceiling.

## `ascending` (type: `boolean`):

Reverse the order: lowest values first.

## Actor input object example

```json
{
  "country": "US",
  "period": "last30Day",
  "sortBy": "revenue",
  "maxResultsPerSource": 20,
  "addAnalytics": false,
  "minRevenue": 0,
  "maxRevenue": 0,
  "minPrice": 0,
  "maxPrice": 0,
  "ascending": false
}
```

# Actor output Schema

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

One row per product: revenue, units sold and the rest of the fields, in rank order.

## `allRows` (type: `string`):

Every row of the run, including notices; the type field tells them apart.

## `runStats` (type: `string`):

Counters for the run: rows, inputs, duplicates, errors.

# 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 = {
    "maxResultsPerSource": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/tiktok-shop-top-products-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 = { "maxResultsPerSource": 20 }

# Run the Actor and wait for it to finish
run = client.actor("lergassy/tiktok-shop-top-products-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 '{
  "maxResultsPerSource": 20
}' |
apify call lergassy/tiktok-shop-top-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/tiktok-shop-top-products-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/QjJ0L1mnUuprHqXak/builds/Ki8vLwtIiU1aanm1E/openapi.json
