# TikTok Shop Scraper | Products, Sold Count, Prices & Sellers (`tactful_anvil/tiktok-shop-scraper`) Actor

Search TikTok Shop US by keyword: sold count, price, discount, rating, reviews, shop, brand, labels, image and the bound TikTok video. Add product URLs/IDs for full details: every SKU with live stock, description, images, delivery days, seller business info. No browser, no proxy. $12/1k products.

- **URL**: https://apify.com/tactful\_anvil/tiktok-shop-scraper.md
- **Developed by:** [Mr Zack](https://apify.com/tactful_anvil) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.00 / 1,000 product (search result)s

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?

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 Product Scraper — Sold Count, Prices, Sellers & SKUs (US)

Search TikTok Shop US by keyword and get every product as clean JSON — **sold count**, price, original price, discount %, rating, review count, shop name & seller id, brand, free-shipping / limited-time-deal labels, image, and the **TikTok video bound to the listing** (creator, plays, likes). Add product URLs or IDs to pull **full product details**: every SKU with **live stock**, per-SKU price, weight & dimensions, description text, all images, video count, delivery days, and the seller's registered business name & address.

No browser, no cookies, no proxies to configure. Straight from TikTok Shop's own web endpoints, fast and cheap — **$12 per 1,000 products** (leaders charge $15–25).

### Who uses this

- **TikTok Shop sellers & brands** — track what sells in your niche (sold count is public here, unlike Amazon), spot price drops, watch competitor stock.
- **Product researchers / dropshippers** — validate a niche in one run: median price, total units sold, estimated GMV, share of listings with creator videos (free `market-summary` row).
- **Affiliates & creators** — find products with momentum and which creators' videos are attached; `isCreatorCommission` flags affiliate listings.
- **Agencies & analysts** — monitor shops, SKUs and stock over time by scheduling runs and feeding the dataset to Sheets/DB.

### Input

| Field | Description |
|---|---|
| `keywords` | Searches, one per line (`"air fryer"`). |
| `maxResultsPerKeyword` | Products per keyword (30/page, max 600). Default 60. |
| `productUrls` | `shop.tiktok.com/us/pdp/…/<id>`, `tiktok.com/view/product/<id>` or bare 19-digit ids → detail rows. |
| `enrichDetails` | Fetch full details for every search result (charged per detail). |
| `includeMarketSummary` | Free aggregate row per keyword (default on). |

```json
{ "keywords": ["air fryer", "led strip lights"], "maxResultsPerKeyword": 90,
  "productUrls": ["https://shop.tiktok.com/us/pdp/9qt-dual-air-fryer/1732304925049327689"] }
```

### Output

**`product`** (one per search result):

```json
{ "type": "product", "position": 1, "keyword": "air fryer", "productId": "1732306737130869211",
  "title": "6-Quart Air Fryer with Window, 12-in-1 Square Design …", "url": "https://shop.tiktok.com/us/pdp/6-quart-air-fryer-with-window/1732306737130869211",
  "price": 59.03, "originalPrice": 81.98, "discountPct": 28, "currency": "USD", "saving": 22.95,
  "rating": 5, "reviewCount": 6, "soldCount": 25, "sellerId": "7496210586501679579", "shopName": "Floft", "brand": null,
  "freeShipping": true, "limitedTimeDeal": true, "labels": ["Limited time deal", "Free shipping"], "skuCount": 4,
  "image": "https://p16-oec-general-useast5.ttcdn-us.com/…600.webp",
  "video": { "itemId": "7648948884764462367", "authorName": "Brenda Paola", "playCount": 1500, "likeCount": 161, "durationSec": 82, "isCreatorCommission": true, "url": "https://www.tiktok.com/@_/video/7648948884764462367" } }
```

**`product-detail`** (one per product id):

```json
{ "type": "product-detail", "productId": "1732306737130869211", "title": "6-Quart Air Fryer with Window …", "price": 59.03, "originalPrice": 81.98, "discountPct": 28,
  "rating": 5, "reviewCount": 6, "soldCount": 25, "shopName": "Floft", "available": true, "freeShipping": true, "deliveryMinDays": 3, "deliveryMaxDays": 6,
  "description": "6 Quart Air Fryer with Window: Your Versatile Kitchen Companion\n✨ Spacious 6.34QT Capacity …",
  "images": ["https://p16-oec-general-useast5.ttcdn-us.com/…"], "videoCount": 1,
  "skuCount": 4, "totalStock": 311, "variantDimensions": { "Color": ["pink", "black", "White", "Gray"] },
  "skus": [{ "skuId": "1732306737131000283", "options": { "Color": "pink" }, "price": 59.03, "originalPrice": 81.98, "stock": 311, "inStock": true, "weightKg": 5.448, "dimensionsCm": "31x39x38" }],
  "properties": { "CA prop 65: repro. chems": "No" }, "businessName": "Shenzhen Yunqi Network Technology Co Ltd", "businessAddress": "Room 502, …, Shenzhen, Guangdong, China" }
```

**`market-summary`** (free, per keyword): `listings, priceMin, priceMedian, priceMax, avgRating, totalSoldCount, avgSoldCount, estimatedGmv, withVideoPct, freeShippingPct, topShops[]`.

Failed ids / blocked keywords are pushed as `type: "failed"` rows and are **never charged**.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Product (search result) | $0.012 |
| Product detail | $0.02 |
| Actor start | $0.001 |

1,000 search results ≈ **$12** · 1,000 full product pages ≈ **$20**. Summary, failed and duplicate rows are free.

### Notes

- **US marketplace only** (shop.tiktok.com/us). Other regions are served by different storefronts and are not covered yet — open an issue if you need one.
- `soldCount` is TikTok's own lifetime counter shown on the listing; `estimatedGmv` in the summary = Σ soldCount × current price (rough, lower-bound-ish).
- Sort is TikTok's default relevance. Results are de-duplicated per keyword.
- TikTok changes its storefront often; if a field turns `null` where you can see it on the page, open an issue with the product id.

# Actor input Schema

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

One TikTok Shop (US) search per line, e.g. "air fryer", "led strip lights", "protein powder".

## `maxResultsPerKeyword` (type: `integer`):

Products to collect per keyword (30 per page, max 600).

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

shop.tiktok.com/us/pdp/…/<id>, tiktok.com/view/product/<id> or the 19-digit product id. Each returns a product-detail row (SKUs, stock, description, delivery, seller compliance).

## `enrichDetails` (type: `boolean`):

Adds a product-detail row for each product found by keyword — charged per detail.

## `includeMarketSummary` (type: `boolean`):

Median/min/max price, avg rating, total & avg sold count, estimated GMV, video share, free-shipping share, top shops. Never charged.

## Actor input object example

```json
{
  "keywords": [
    "air fryer"
  ],
  "maxResultsPerKeyword": 60,
  "enrichDetails": false,
  "includeMarketSummary": true
}
```

# Actor output Schema

## `products` (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 = {
    "keywords": [
        "air fryer"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tactful_anvil/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": ["air fryer"] }

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

```

## MCP server setup

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