# TikTok Shop Scraper & API: Products, Sales & Stock (`s_actors/tiktok-shop-scraper`) Actor

Scrape TikTok Shop US products by keyword, product link or store: price, discount, items sold, rating, reviews, stock per variant, SKUs, GTIN/UPC, shop, shipping. Top-selling products per keyword. Sales tracker: items sold since the last run. No login.

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

## Pricing

from $1.59 / 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 Scraper & API: Products, Sales & Stock

Scrape **TikTok Shop US** products by **keyword, product link or store**: price, original price and discount, **items sold**, rating, reviews, **stock (units available) per variant**, every SKU with its price, **GTIN / UPC barcode**, shop, shipping fee and delivery time, description and the seller's business address. Sort by **best selling** to get the **top-selling TikTok Shop products** for any keyword, and schedule the **sales tracker** to see **how many items each product sold since the last run**.

```json
{ "searchQueries": ["portable blender"], "maxItemsPerQuery": 20, "sortBy": "best_selling" }
```

No TikTok login, no cookies, no browser, no proxy setup. Use it as a **TikTok Shop API** for product research, dropshipping, competitor price and stock monitoring, or brand protection.

#### What you get

Real example, 16 October 2026, keyword `mouth tape`, sorted by best selling (TikTok gave 51 products):

| # | product | price | original | items sold | rating | reviews | shop |
|---|---|---|---|---|---|---|---|
| 1 | Pink ZZSleep Tape - (30 Strips) Breathable Mouth Tape | $16.84 | $25.94 (−35%) | 41,296 | 4.5 | 1,294 | zzsleeptape |
| 2 | Queen Mouth Tape - 3 month supply | $34.95 | | 28,764 | 4.7 | 1,614 | Queen Tape |
| 3 | GuruNanda Lavender Infused Mouth Tape - 60 Count | $20.79 | | 11,121 | 4.6 | 663 | GuruNanda LLC |
| 4 | Sleep Mouth Tape, 30pcs Breathable | $6.70 | | 2,421 | 4.5 | 207 | Sleep lab 888 |

Stock and barcodes, store `GuruNanda LLC` (best sellers first):

| product | price | items sold | stock (units) | variants | GTIN |
|---|---|---|---|---|---|
| GuruNanda Farmed Mint Oil Pulling Mouthwash | $25.99 | 1,935,490 | 829 | 2 | 810051084306 |
| GuruNanda Whitening Strips, 7-day treatment | $19.49 | 1,531,102 | 20,970 | 4 | 810051082814 |
| GuruNanda Whitening Dual Barrel Oxyburst Mouthwash | $23.39 | 192,941 | 6 | 2 | 810051083118 |

| Field | Description |
|---|---|
| `productId`, `title`, `url`, `image`, `images` | The product, its TikTok Shop page and pictures |
| `price`, `originalPrice`, `discountPercent`, `currency` | Current price (lowest variant), the crossed-out price and the discount in % (0 = no discount) |
| `soldCount` | Items sold since the product was listed (TikTok's own count, returns excluded) |
| `rating`, `reviewCount` | Product rating (0-5) and number of reviews |
| `stock`, `inStock`, `skuCount`, `skus` | Units available in total and per variant: each SKU with its name (color, size), price, original price, stock, GTIN and the seller's SKU code |
| `gtin` | GTIN / UPC / EAN barcode of the product (first variant that has one) |
| `brand`, `shopName`, `shopId`, `shopUrl` | Brand, the store and its TikTok Shop page |
| `freeShipping`, `shippingFee`, `deliveryDays` | Shipping to the US and the delivery time in days |
| `description`, `properties` | Product description and specifications |
| `sellerBusinessName`, `sellerAddress` | The seller's legal name and business address (shown by TikTok on the product page) |
| `labels`, `promoVideoId`, `promoVideoViews` | TikTok Shop badges (Fall Deals, Free shipping...), the video shown with the product and its views |
| `sourceType`, `source`, `position` | Where the row came from (search keyword, store, product link) and its place in that list |
| `soldSinceLastRun`, `previousSoldCount`, `priceChange`, `previousPrice`, `stockChange`, `previousStock`, `isNew`, `lastCheckedAt` | Sales tracker (with **Track sales** on): change since the previous run |

#### How it works

1. Add **search keywords** (portable blender, lip gloss, phone case), **product links** or **store links**, in any mix
2. Choose the **sort**: TikTok Shop's order, **best selling**, price, rating, reviews or biggest discount
3. Optional filters: **price range**, **minimum items sold**, **minimum rating**, **only discounted**
4. Run, then download the dataset as CSV, Excel, JSON or HTML. Two tabs: **Products** and **Sales tracker**

#### Why this Actor

| | |
|---|---|
| 📦 **Stock per variant** | Units available for every SKU (color, size), on by default and in the same price: see what is selling out and what a competitor holds |
| 🏆 **Top-selling products per keyword** | Best selling reads everything TikTok gives for the keyword (~250 products) and returns the ones with the most items sold, not just the first page |
| 📈 **Sales tracker** | Schedule it daily: `soldSinceLastRun` = items sold since the previous run (real sales velocity), plus price and stock changes |
| 🔖 **GTIN / UPC barcodes** | Match TikTok Shop products to Amazon, Walmart or your own catalogue |
| 🏪 **Whole store catalogues** | A store's products best sellers first, up to 2,000, with stock and price |
| 💰 **$1.99 per 1,000 products, details included** | Stock, variants, GTIN, shipping and seller address in the same price. Filtered-out products are free |

#### Track TikTok Shop sales every day

1. Add the keywords, stores or product links to watch and turn on **Track sales, price and stock between runs**
2. Save as a task and add a schedule, e.g. every morning
3. The **first run** remembers each product's sold count, price and stock. **Every later run** adds `soldSinceLastRun`, `priceChange` and `stockChange`: send them to [Google Sheets](https://apify.com/s_actors/google-sheets-import-export), Slack or email with an integration

The memory is kept in your account (key-value store `tiktok-shop-tracker`). Use a different **Tracker name** for each task.

#### Pricing

Pay per product, no subscription needed. Apify Scale and Business plans pay less per product:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Product (one row, details included) | $0.00199 | $0.00179 | $0.00159 |

| Task | Cost |
|---|---|
| Top 20 best-selling products for a keyword | ~$0.04 |
| 100 products of a store with stock and GTIN | ~$0.20 |
| Daily sales tracker, 50 products | ~$3.00 per month |

#### Ready-made tasks

Open it, change the keyword, and run:

| Task | What you get |
|---|---|
| [TikTok Shop Top Selling Products by Keyword](https://apify.com/s_actors/tiktok-shop-scraper/examples/tiktok-shop-top-selling-products) | The 20 best-selling TikTok Shop products for lip gloss and phone case, with stock and GTIN |

#### FAQ

**Which countries?** TikTok Shop **United States**. Prices are in USD.

**What is "items sold"?** TikTok's own counter shown on the product page: items sold since the product was listed on TikTok Shop, returns excluded. It counts all time, so the tracker's `soldSinceLastRun` is what tells you how fast a product sells now.

**How exact is the stock?** It is the number of units the seller has available for each variant, as TikTok Shop reports it to the product page. Some sellers keep it high or low on purpose; read it together with the sales.

**How many products per keyword?** TikTok Shop's search gives up to ~250 products per keyword. Long exact phrases often return nothing: use short, common keywords and several of them.

**Can I scrape a category?** Not yet. Use keywords for the category (e.g. "serum", "toner", "sunscreen") or the stores of that category.

**Does it give reviews or creator videos?** Not the review texts. Each product has its rating, review count and the TikTok video shown with it (`promoVideoId`, views).

**Do I need a TikTok account or cookies?** No.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "What are the 20 best-selling portable blenders on TikTok Shop, and how much stock do they have?"

#### Other TikTok tools

| Tool | What it does |
|---|---|
| [TikTok Video Scraper](https://apify.com/s_actors/tiktok-video-scraper) | Views, likes, shares, hashtags and sound of TikTok videos, MP4 download, views tracker |
| [TikTok Profile Scraper](https://apify.com/s_actors/tiktok-profile-scraper) | All videos of TikTok profiles: plays, likes, dates, exact followers, new-video alerts, MP4 download |
| [TikTok Comments Scraper](https://apify.com/s_actors/tiktok-comments-scraper) | Comments and replies of TikTok videos and profiles, keyword filter, only-new alerts |
| [TikTok Viral Videos & Explore Scraper](https://apify.com/s_actors/tiktok-explore-scraper) | Viral TikTok videos from the Explore page in any country and 21 categories: plays, likes, plays per hour, creators, new-video alerts |
| [TikTok Trending Hashtags Scraper](https://apify.com/s_actors/tiktok-trending-hashtags-scraper) | Trending TikTok hashtags by country: ~45 per country (not just the top 3), views, trend curve, top creators, new-trend alerts |
| [TikTok Trending Sounds & Songs Scraper](https://apify.com/s_actors/tiktok-trending-sounds-scraper) | Trending TikTok sounds and songs in any country: videos using each sound, plays, commercial-use flag, MP3 |
| [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) | Send the products to a Google Sheet |

# Actor input Schema

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

Search TikTok Shop US like the shop's own search: one keyword or short phrase per line (e.g. portable blender, lip gloss, phone case). TikTok gives up to ~250 products per keyword; long exact phrases often return nothing, so keep them short.

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

TikTok Shop product pages, one per line: shop.tiktok.com/us/pdp/<name>/<id>, www.tiktok.com/shop/pdp/<id>, shop.tiktok.com/view/product/<id>, or the 19-digit product ID. Always returned with full details (stock per variant, GTIN, shipping).

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

TikTok Shop stores, one per line: shop.tiktok.com/us/store/<name>/<seller id>, www.tiktok.com/shop/store/<name>/<seller id>, or the seller ID. Returns the store's catalogue, best sellers first.

## `maxItemsPerQuery` (type: `integer`):

Products to return for each search keyword (TikTok Shop gives at most ~250 per keyword). With a sort or a filter, the Actor reads all products TikTok gives for the keyword and returns the best ones.

## `maxItemsPerStore` (type: `integer`):

Products to return for each store, best sellers first. 0 = the whole catalogue (up to 2,000).

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

Order of products for each keyword and store. Best selling = the top-selling TikTok Shop products for your keyword: the Actor reads everything TikTok gives (~250) and returns the Max products per keyword with the most items sold.

## `includeDetails` (type: `boolean`):

Open each product's page for stock (units available per variant and in total), every variant (SKU) with its price and stock, GTIN / UPC barcode, description, specifications, shipping fee and delivery time, and the seller's business name and address. Same price per product; turn off only for faster runs with list data (price, sold count, rating, shop).

## `minPrice` (type: `number`):

Only products priced at least this much.

## `maxPrice` (type: `number`):

Only products priced at most this much.

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

Only products that have sold at least this many items (TikTok's sold count since the product was listed): find proven winners.

## `minRating` (type: `number`):

Only products rated at least this (0-5).

## `onlyDiscounted` (type: `boolean`):

Only products with an original (crossed-out) price above the current price.

## `trackChanges` (type: `boolean`):

For scheduled runs (save the input as a task and add a schedule, e.g. daily). Each product gets soldSinceLastRun (items sold since the previous run = sales velocity), priceChange, stockChange, previous values and isNew. The first run remembers the numbers; changes appear from the second run.

## `monitorName` (type: `string`):

Name of the memory used by the sales tracker. Use a different name for each task, otherwise two tasks share the same previous values.

## `debugLog` (type: `boolean`):

Log every request and retry.

## Actor input object example

```json
{
  "searchQueries": [
    "portable blender"
  ],
  "maxItemsPerQuery": 20,
  "maxItemsPerStore": 100,
  "sortBy": "relevance",
  "includeDetails": true,
  "onlyDiscounted": false,
  "trackChanges": false,
  "monitorName": "default",
  "debugLog": false
}
```

# Actor output Schema

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

Price, original price, discount, items sold, rating, reviews, stock, variants, GTIN, shop.

## `tracker` (type: `string`):

Items sold, price and stock change since the previous run (with Track sales on).

## `all` (type: `string`):

Every field of every row: variants (SKUs) with stock and GTIN, description, specifications, images, seller address.

# 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": [
        "portable blender"
    ],
    "maxItemsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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": ["portable blender"],
    "maxItemsPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("s_actors/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": [
    "portable blender"
  ],
  "maxItemsPerQuery": 20
}' |
apify call s_actors/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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