# TikTok Shop Scraper (`sian.agency/tiktok-shop-scraper`) Actor

TikTok Shop scraper — product listings, prices, ratings, sellers, and search results across US, UK, Singapore, Malaysia, Philippines, Thailand, Vietnam, and Indonesia. Two operations, one clean dataset per run. No API key required, no account setup.

- **URL**: https://apify.com/sian.agency/tiktok-shop-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** E-commerce, Automation, Social media
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 search products results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 — Products, Prices, Sellers, Multi-Region Search 🛒

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Pair with Taobao & Tmall](https://img.shields.io/badge/Pair-Taobao%20%26%20Tmall%20Scraper-FF4906)](https://apify.com/sian.agency/taobao-tmall-product-scraper?fpr=sian) [![Pair with TikTok Transcripts](https://img.shields.io/badge/Pair-TikTok%20Transcript%20Extractor-FE2C55)](https://apify.com/sian.agency/best-tiktok-ai-transcript-extractor?fpr=sian)

#### 🎉 Two scrapers in one — extract TikTok Shop product details, prices, sellers, and keyword search across 8 regions
##### Built for dropshippers, e-commerce sellers, market researchers, brand teams, and creator-affiliate agencies who need clean structured TikTok Shop data — no API key, no setup, no scraping headaches

---

### 📋 Overview

**Tired of brittle DIY scrapers that break every time TikTok Shop ships a UI tweak?** This actor delivers reliable, flat structured datasets from the fastest-growing live commerce platform of 2026 — one clean run per task, one tidy dataset out.

**Why teams choose SIÁN for TikTok Shop data:**
- ✅ **Two operations, one actor**: product detail (deep) · product search (paginated, real prices)
- 🌍 **8 regions covered**: United States, United Kingdom, Singapore, Malaysia, Philippines, Thailand, Vietnam, Indonesia
- 💰 **Real prices from search**: sale price, original price, currency, discount %, sold count — no masking on the search endpoint
- 🏪 **Deep seller intelligence on detail**: shop name, rating, sold count, followers, products count, region, business compliance info
- 🎯 **Production-ready data shape**: curated camelCase aliases (productId, productTitle, price, sellerName…) PLUS the raw upstream fields for power users
- 💎 **No API key, no setup, no proxies** — paste a keyword or product ID and run
- ✨ **NEW**: 19-digit TikTok Shop product IDs preserved at full precision; HTTPS auto-normalized on every image URL; silent failover keeps runs reliable when upstream flakes

---

### ✨ Features

- 🛒 **Product Detail**: title, description (decoded from rich-text blocks), full SKU list with variants & stock, seller profile (rating, sold count, followers, region, products count), product rating, review count, business compliance info, image gallery
- 🔍 **Search Products**: keyword-based product search with **real prices** (sale + original + discount %), rating, sold count, seller info, slug-based product URL — up to ~55 unique products per keyword
- 🌍 **Multi-region**: US · GB · SG · MY · PH · TH · VN · ID — same keyword, different markets
- 🖼️ **HTTPS-normalized URLs**: every product image and seller logo ready to embed
- 🆔 **BigInt-safe IDs**: 19-digit TikTok Shop product/seller IDs preserved (no precision loss → no broken cross-operation joins)
- 📄 **Smart pagination + dedup**: stream through search results with auto-stop when the upstream caps; duplicates removed and not charged
- 📊 **HTML run report**: saved automatically to key-value store with success rate, errors, duration, inputs
- 🛡️ **Silent failover**: if a primary data source flakes, runs transparently re-route through a backup — no broken datasets, no user-visible noise

---

### 🎬 Quick Start

Paste a keyword to search trending TikTok Shop products across any region — no TikTok Shop API or developer account required.

```bash
curl -X POST https://api.apify.com/v2/acts/sian.agency~tiktok-shop-scraper/runs?token=YOUR_TOKEN \
-d '{"operation":"searchProducts","keyword":"phone case","region":"US","maxPages":2}'
````

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Pick an operation

Choose what you want to extract: **Search Products** (keyword discovery) or **Product Detail** (deep single-product scrape).

#### Step 2: Enter the input

A keyword (search) or a numeric product ID (detail), plus optionally a target region.

#### Step 3: Click "Start"

Results stream into the Apify dataset as they come back. Download as JSON, CSV, or Excel directly from the Console.

**That's it! In under 60 seconds, you'll have:**

- A flat, structured dataset (no nested page-bundle JSON to parse)
- Curated camelCase fields plus the raw response for power users
- An HTML report summarizing the run
- Ready-to-embed HTTPS image URLs

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string (enum) | Yes | One of: `productDetail` · `searchProducts` |
| `productId` | string | If operation is `productDetail` | TikTok Shop product ID (18–19 digits). Find it in any product URL: `tiktok.com/shop/pdp/{slug}/{ID}`, or in the `productId` field of any Search Products result row. |
| `keyword` | string | If operation is `searchProducts` | Search query (English or native-language — e.g. `phone case`, `wireless earbuds`, `護膚`) |
| `region` | string (enum) | No | Target region: `US` · `GB` · `SG` · `MY` · `PH` · `TH` · `VN` · `ID` (default `US`) |
| `maxPages` | integer | No | Pages to fetch for Search Products (default 2, max 3 — upstream caps ~55 unique products per keyword) |

**Example — Search trending TikTok Shop products in the US:**

```json
{
  "operation": "searchProducts",
  "keyword": "phone case",
  "region": "US",
  "maxPages": 2
}
```

**Example — Pull a product's full detail (description, SKUs, seller, ratings):**

```json
{
  "operation": "productDetail",
  "productId": "1731743608991158724",
  "region": "US"
}
```

**Example — Compare the same product across regions:**

```json
{
  "operation": "searchProducts",
  "keyword": "wireless earbuds",
  "region": "SG",
  "maxPages": 2
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **30+ curated fields** plus all raw upstream fields. Filter by `_operation` to split modes.

| Field | Type | Description |
|-------|------|-------------|
| `productId` | string | TikTok Shop product ID (19-digit, precision preserved) |
| `productTitle` | string | Product display title |
| `productDescription` | string | Full description (decoded from rich-text blocks) — detail rows only |
| `productUrl` | string | Direct link to the product on TikTok Shop |
| `productSlug` | string | SEO slug from search results |
| `price` | number | Current sale price (real value — not masked on search rows) |
| `originalPrice` | number | Pre-discount price |
| `currency` | string | ISO currency code (e.g. `USD`, `GBP`, `SGD`) |
| `currencySymbol` | string | Display symbol (e.g. `$`, `£`, `S$`) |
| `discountRate` | number | Discount fraction (e.g. `0.59` = 41% off) |
| `discountFormat` | string | Human-readable discount label (detail rows) |
| `sellerSubsidy` | number | Seller-funded deduction on top of base discount (detail rows) |
| `priceRange` | object | SKU-level price band (`{min, max}`, detail rows) |
| `coverUrl` | string | Primary product thumbnail (HTTPS) |
| `gallery` | array | Up to 9 product images (HTTPS) |
| `rating` | number | Product overall rating (0–5) |
| `ratingCount` | integer | Review count |
| `soldCount` | integer | Lifetime units sold |
| `skuCount` | integer | Number of SKU variants |
| `skus` | array | SKU list with variants and stock |
| `sellerId` | string | Seller / shop numeric ID |
| `sellerName` | string | Shop display name |
| `sellerLogo` | string | Shop avatar (HTTPS) |
| `sellerRating` | number | Shop rating (detail rows) |
| `sellerSoldCount` | integer | Shop lifetime units sold (detail rows) |
| `sellerFollowersCount` | integer | Shop followers (detail rows) |
| `sellerProductsCount` | integer | Total products in the shop (detail rows) |
| `sellerReviewCount` | integer | Shop review count (detail rows) |
| `sellerRegion` | string | Shop registered region (detail rows) |
| `sellerUrl` | string | Direct link to the shop |
| `businessName` | string | Business compliance name (detail rows) |
| `businessAddress` | string | Business compliance address (detail rows) |

**Example dataset row (Search Products):**

```json
{
  "_operation": "searchProducts",
  "_sourceKeyword": "phone case",
  "_sourceRegion": "US",
  "productId": "1731743608991158724",
  "productTitle": "Cute Soft Silicone Phone Case",
  "price": 6.99,
  "originalPrice": 16.99,
  "currency": "USD",
  "currencySymbol": "$",
  "discountRate": 0.41,
  "rating": 4.7,
  "ratingCount": 1342,
  "soldCount": 12000,
  "sellerId": "7494516024328356",
  "sellerName": "GadgetHaus",
  "coverUrl": "https://p16-oec-general.ttcdn-us.com/...",
  "productUrl": "https://www.tiktok.com/shop/pdp/cute-soft-silicone-phone-case/1731743608991158724",
  "status": "success"
}
```

***

### 💼 Use Cases & Examples

#### 1. Dropshipping Product Discovery

**Dropshippers and DTC operators** hunting winning SKUs before they hit saturation.

**Input:** Search Products with keyword "phone case", "kitchen gadgets", or "skincare" across `US` and `GB`
**Output:** 50+ trending products with price, sold count, rating, and seller info per region
**Use:** Spot velocity SKUs hours before they trend. Pivot on `soldCount` and `discountRate` to rank winners.

#### 2. Competitor Price Monitoring

**E-commerce sellers** tracking competitor pricing, discounts, and stock movement.

**Input:** Scheduled Product Detail runs across a watchlist of competitor product IDs
**Output:** Daily snapshots of `price`, `originalPrice`, `discountRate`, `soldCount`, `rating`
**Use:** Auto-alert on price drops, restocks, and rating shifts. Feed a competitive intelligence dashboard.

#### 3. Seller & Brand Intelligence

**Brand teams and category managers** mapping the seller landscape in any niche.

**Input:** Search Products + Product Detail across a category keyword
**Output:** Full seller catalog with shop ratings, followers, products count, region
**Use:** Identify rising brands, benchmark against incumbents, surface partnership candidates.

#### 4. Multi-Region Market Entry Research

**Market intelligence analysts** comparing TikTok Shop demand across regions before launching a new SKU.

**Input:** Same Search Products keyword across `US`, `GB`, `SG`, `MY`, `PH`, `TH`, `VN`, `ID`
**Output:** Per-region price bands, rating distributions, top sellers, and demand signals
**Use:** Spot markets where a product is winning before competition arrives. Validate pricing for a regional launch.

#### 5. Creator-Affiliate Sourcing

**Influencer marketing and affiliate agencies** building a TikTok Shop creator-affiliate pipeline.

**Input:** Search Products with category keyword, filter for `rating >= 4.5` and `soldCount >= 10000`
**Output:** A vetted list of products with proven sales velocity to brief to creators
**Use:** Match creator audience demographics to product fit; build affiliate-ready product feeds.

#### 6. Trend Mining & Viral SKU Detection

**Trend analysts and content strategists** spotting breakout products before they go mainstream.

**Input:** Daily scheduled Search Products across rotating trend keywords
**Output:** Time-series of `soldCount`, `rating`, and discount activity per SKU
**Use:** Surface SKUs with sudden velocity spikes. Feed a viral-product dashboard or Slack alert.

#### 7. Marketplace Reseller Sourcing

**Amazon / eBay resellers** sourcing products that haven't yet saturated Western marketplaces.

**Input:** Search Products across `SG`, `MY`, `TH`, `VN`, `ID` for low-competition niches
**Output:** SEA-side prices + product details for arbitrage analysis
**Use:** Identify cross-border arbitrage opportunities; price-test against Amazon Best Sellers.

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/tiktok-shop-scraper').call({
  operation: 'searchProducts',
  keyword: 'phone case',
  region: 'US',
  maxPages: 2,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/tiktok-shop-scraper').call(
    run_input={'operation': 'productDetail', 'productId': '1731743608991158724', 'region': 'US'}
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~tiktok-shop-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation":"searchProducts","keyword":"wireless earbuds","region":"SG","maxPages":2}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: schedule daily or webhook from a category-watcher
2. **HTTP Request**: call the actor's run-sync endpoint with `operation` + input
3. **Process**: filter by `_operation` and pivot on `productId` / `sellerId`
4. **Action**: push to BigQuery, Notion, Airtable, or a Slack price-drop alert

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **Full feature access** — every operation, every field, every region
- No credit card required
- Perfect for evaluating data depth before you commit

#### PAID Tier (Production Ready)

- **Unlimited** results per run
- Faster processing — no FREE-tier throttling
- Pay-per-result: only charged for successful rows, never for errors or deduplicated entries
- Volume discounts up to 50% off at GOLD/PLATINUM/DIAMOND Apify tiers

💰 **Best price on the market for premium TikTok Shop data** — see the pricing tab for the full per-event ladder. Product Detail carries richer payloads at premium pricing; Search Products is priced to scale with you.

🔗 [View current pricing](https://apify.com/sian.agency/tiktok-shop-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: How many products can I extract per search?**
A: TikTok Shop caps at ~55 unique products per keyword across pages. To extend coverage, run the same keyword in multiple regions or use narrower queries.

**Q: Why does Product Detail mask the unit price?**
A: TikTok Shop hides raw unit prices on the detail endpoint as an anti-scraping measure. For real prices, use the **Search Products** operation — it returns clean `price`, `originalPrice`, and `discountRate`. Product Detail still gives you the full description, SKU list, seller stats, ratings, sold count, and image gallery.

**Q: Does it work with regions outside the listed 8?**
A: TikTok Shop is currently only live in US, UK, Singapore, Malaysia, Philippines, Thailand, Vietnam, and Indonesia. As new markets open, we'll add region codes.

**Q: What output formats are available?**
A: JSON, CSV, Excel, RSS, HTML, XML — export directly from the Apify dataset UI or via API.

**Q: Are product image URLs permanent?**
A: TikTok Shop CDN URLs are stable for several days. For long-term archival, download images at scrape time.

**Q: Why are TikTok Shop product IDs 19 digits — does the dataset preserve them?**
A: Yes. We use a bigint-safe JSON parser so 19-digit IDs (`productId`, `sellerId`) round-trip without precision loss. Most scrapers silently corrupt these and break cross-operation joins.

**Q: Can I search in non-English keywords?**
A: Absolutely. Native-language queries work — `護膚` (Chinese skincare), `kulit` (Indonesian skin), `กระเป๋า` (Thai bags). Native queries surface more region-relevant results.

**Q: Is this legal?**
A: Yes — we only extract publicly available product listings. See the [Legal section](#-is-it-legal-to-scrape-data) below.

**Q: How long does processing take?**
A: ~3–10 seconds per page for Search Products; ~5–10 seconds for Product Detail.

***

### 🐛 Troubleshooting

**Search returned fewer products than expected**

- TikTok Shop caps at ~55 unique products per keyword. The actor auto-dedupes across pages and stops when the upstream cycles back. Run the same keyword in multiple regions to expand coverage.

**Product Detail returns "not exist" or empty product**

- The product may have been delisted or restricted in the requested region. Verify the URL works in a browser, and try a different `region`.

**HTTP errors / "Data source temporarily unavailable" rows**

- The actor auto-retries transient failures and silently fails over to a backup source. If you still see error rows, the upstream is rate-limited or down — retry the run after a few minutes.

**19-digit product IDs look truncated in spreadsheet exports**

- Spreadsheet apps (Excel, Google Sheets) auto-cast long integers to scientific notation. The actor preserves them as strings in JSON; in CSV exports, format the `productId` and `sellerId` columns as Text before opening.

**Different prices in different runs**

- TikTok Shop runs frequent flash sales. Schedule recurring runs to track price history rather than relying on a single snapshot.

***

### ⚠️ Trademark Disclaimer

This actor is an **independent scraping tool** and is not affiliated with, endorsed by, or sponsored by TikTok Pte. Ltd., ByteDance Ltd., or any of their subsidiaries. "TikTok" and "TikTok Shop" are used solely in a descriptive sense to identify the public data source the actor reads from. **TikTok®** and **TikTok Shop®** are trademarks of their respective owners. All other trademarks are the property of their respective owners.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the seller has chosen to make publicly available on TikTok Shop. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data (seller business compliance info is published by TikTok Shop itself for consumer-protection reasons). Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

***

### ✨ More by SIÁN Agency

Part of the SIÁN Agency Apify portfolio — production-grade scrapers and AI tools used by agencies, research teams, and brands. A few that pair well with TikTok Shop:

**China & E-commerce**

- [Taobao & Tmall Product Scraper](https://apify.com/sian.agency/taobao-tmall-product-scraper?fpr=sian) — China's #1 marketplace: products, search, shop catalogs
- [Uber Eats Menu Scraper](https://apify.com/sian.agency/uber-eats-menu-scraper?fpr=sian) — restaurant menus + prices

**Short-Video & Creator Discovery**

- [Kwai & Kuaishou Scraper](https://apify.com/sian.agency/kwai-kuaishou-scraper?fpr=sian) — China's #2 short-video platform: KOL data, video metrics, comments
- [Douyin Scraper](https://apify.com/sian.agency/douyin-scraper?fpr=sian) — Chinese TikTok counterpart with deep KOL & video data
- [Best TikTok AI Transcript Extractor](https://apify.com/sian.agency/best-tiktok-ai-transcript-extractor?fpr=sian) — TikTok video → text with metadata
- [Instagram AI Transcript Extractor](https://apify.com/sian.agency/instagram-ai-transcript-extractor?fpr=sian) — Reels & Stories transcription

**Real Estate (Global)**

- [Zillow Property Scraper](https://apify.com/sian.agency/zillow-property-scraper?fpr=sian) · [Airbnb Scraper](https://apify.com/sian.agency/airbnb-property-scraper?fpr=sian) · [Bayut (Dubai)](https://apify.com/sian.agency/bayut-property-scraper?fpr=sian) · [Redfin](https://apify.com/sian.agency/redfin-property-scraper?fpr=sian) · [StreetEasy (NYC)](https://apify.com/sian.agency/streeteasy-property-scraper?fpr=sian) · [Zoopla (UK)](https://apify.com/sian.agency/zoopla-property-scraper?fpr=sian) · [Realtor.com](https://apify.com/sian.agency/realtor-property-scraper?fpr=sian)

[Browse all SIÁN actors →](https://apify.com/sian.agency?fpr=sian)

***

### ⭐ Leave a 5-Star Review

Love this actor? **[Leave a 5-star review here](https://apify.com/sian.agency/tiktok-shop-scraper/reviews)** — it helps us build more features for you and lets other teams find it.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue in the actor's Apify Console Issues tab
- 📧 <hello@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

🎯 **PICK ONE OPERATION PER RUN.** Each run produces one clean dataset matching the chosen mode.

- **🛒 Product Detail** — deep scrape of a single product by ID (title, description, price, gallery, seller, rating, sold count, currency)
- **🔍 Search Products** — keyword-based product search across TikTok Shop, paginated

💡 **TIP:** To analyze a batch of products, run `Search Products` first, then loop over the `productId` values with `Product Detail`.

## `productId` (type: `string`):

🛒 **Required for the `Product Detail` operation.**

The numeric TikTok Shop product ID (typically 18–19 digits). You can find it:

- In any TikTok Shop product URL: `https://www.tiktok.com/shop/pdp/{slug}/{ID}` → the trailing numeric segment
- In the `productId` field of any Search Products result row

💡 **TIP:** Run `Search Products` first to gather a batch of IDs, then process them one by one with `Product Detail`.

📝 **Note on prices:** TikTok Shop masks raw unit prices on the detail endpoint with placeholders. For hard pricing data (sale price, original price), use `Search Products` — it returns real prices. Detail still returns full product description, SKU list, seller stats, ratings, sold count, and image gallery.

⚠️ **Ignored** for the Search Products operation.

## `keyword` (type: `string`):

🔍 **Required for the `Search Products` operation.**

Any TikTok Shop search query — English or native-language. Examples:

- `phone case`
- `wireless earbuds`
- `kitchen gadgets`
- `skincare`

💡 **TIP:** Narrow queries return higher-relevance results. Combine with `region` to surface market-specific trends.

## `region` (type: `string`):

🌍 **Target TikTok Shop region.** Defaults to `US` if unset.

- **US** — United States
- **GB** — United Kingdom
- **SG** — Singapore
- **MY** — Malaysia
- **PH** — Philippines
- **TH** — Thailand
- **VN** — Vietnam
- **ID** — Indonesia

💡 **TIP:** Same product can have different prices, ratings, and availability per region. Run the same keyword across multiple regions to map global demand.

## `maxPages` (type: `integer`):

📄 **Applies to the `Search Products` operation only.** Ignored for `Product Detail`.

Each page returns up to 30 products. TikTok Shop caps results at ~50–60 unique products per keyword, so 2 pages is usually sufficient. Duplicates across pages are auto-deduplicated and not charged.

💡 **TIP:** Use narrower keywords to surface more unique results per run. Run the same keyword across multiple regions to expand coverage.

## Actor input object example

```json
{
  "operation": "searchProducts",
  "productId": "1731743608991158724",
  "keyword": "phone case",
  "region": "US",
  "maxPages": 2
}
```

# Actor output Schema

## `output` (type: `string`):

Products or search results — one flat row per upstream item with curated camelCase aliases (productId, productTitle, price, originalPrice, currency, coverUrl, gallery, sellerId, sellerName, rating, ratingCount, soldCount, productUrl, …) plus the raw upstream fields spread alongside.

## `report` (type: `string`):

HTML report with run status, success/error row counts, success rate, pages fetched, duration, and the inputs used — written even on fatal crash.

# 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 = {
    "productId": "1731743608991158724",
    "keyword": "phone case"
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/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 = {
    "productId": "1731743608991158724",
    "keyword": "phone case",
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/tiktok-shop-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "productId": "1731743608991158724",
  "keyword": "phone case"
}' |
apify call sian.agency/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=sian.agency/tiktok-shop-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Shop Scraper",
        "description": "TikTok Shop scraper — product listings, prices, ratings, sellers, and search results across US, UK, Singapore, Malaysia, Philippines, Thailand, Vietnam, and Indonesia. Two operations, one clean dataset per run. No API key required, no account setup.",
        "version": "1.0",
        "x-build-id": "OSKzHZo5pT2DaVlCc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sian.agency~tiktok-shop-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sian.agency-tiktok-shop-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/sian.agency~tiktok-shop-scraper/runs": {
            "post": {
                "operationId": "runs-sync-sian.agency-tiktok-shop-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/sian.agency~tiktok-shop-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-sian.agency-tiktok-shop-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "operation"
                ],
                "properties": {
                    "operation": {
                        "title": "🎯 Operation — what do you want to scrape?",
                        "enum": [
                            "productDetail",
                            "searchProducts"
                        ],
                        "type": "string",
                        "description": "🎯 **PICK ONE OPERATION PER RUN.** Each run produces one clean dataset matching the chosen mode.\n\n- **🛒 Product Detail** — deep scrape of a single product by ID (title, description, price, gallery, seller, rating, sold count, currency)\n- **🔍 Search Products** — keyword-based product search across TikTok Shop, paginated\n\n💡 **TIP:** To analyze a batch of products, run `Search Products` first, then loop over the `productId` values with `Product Detail`.",
                        "default": "searchProducts"
                    },
                    "productId": {
                        "title": "🛒 Product ID (for Product Detail)",
                        "type": "string",
                        "description": "🛒 **Required for the `Product Detail` operation.**\n\nThe numeric TikTok Shop product ID (typically 18–19 digits). You can find it:\n- In any TikTok Shop product URL: `https://www.tiktok.com/shop/pdp/{slug}/{ID}` → the trailing numeric segment\n- In the `productId` field of any Search Products result row\n\n💡 **TIP:** Run `Search Products` first to gather a batch of IDs, then process them one by one with `Product Detail`.\n\n📝 **Note on prices:** TikTok Shop masks raw unit prices on the detail endpoint with placeholders. For hard pricing data (sale price, original price), use `Search Products` — it returns real prices. Detail still returns full product description, SKU list, seller stats, ratings, sold count, and image gallery.\n\n⚠️ **Ignored** for the Search Products operation."
                    },
                    "keyword": {
                        "title": "🔍 Search Keyword (for Search Products)",
                        "type": "string",
                        "description": "🔍 **Required for the `Search Products` operation.**\n\nAny TikTok Shop search query — English or native-language. Examples:\n- `phone case`\n- `wireless earbuds`\n- `kitchen gadgets`\n- `skincare`\n\n💡 **TIP:** Narrow queries return higher-relevance results. Combine with `region` to surface market-specific trends."
                    },
                    "region": {
                        "title": "🌍 Region",
                        "enum": [
                            "US",
                            "GB",
                            "SG",
                            "MY",
                            "PH",
                            "TH",
                            "VN",
                            "ID"
                        ],
                        "type": "string",
                        "description": "🌍 **Target TikTok Shop region.** Defaults to `US` if unset.\n\n- **US** — United States\n- **GB** — United Kingdom\n- **SG** — Singapore\n- **MY** — Malaysia\n- **PH** — Philippines\n- **TH** — Thailand\n- **VN** — Vietnam\n- **ID** — Indonesia\n\n💡 **TIP:** Same product can have different prices, ratings, and availability per region. Run the same keyword across multiple regions to map global demand.",
                        "default": "US"
                    },
                    "maxPages": {
                        "title": "📄 Max pages to fetch",
                        "minimum": 1,
                        "maximum": 3,
                        "type": "integer",
                        "description": "📄 **Applies to the `Search Products` operation only.** Ignored for `Product Detail`.\n\nEach page returns up to 30 products. TikTok Shop caps results at ~50–60 unique products per keyword, so 2 pages is usually sufficient. Duplicates across pages are auto-deduplicated and not charged.\n\n💡 **TIP:** Use narrower keywords to surface more unique results per run. Run the same keyword across multiple regions to expand coverage.",
                        "default": 2
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
