# TikTok Shop Scraper (`lurkapi/tiktok-shop-scraper`) Actor

Scrape TikTok Shop products by URL, ID, keyword, or hashtag. Returns title, price, sold count, ratings, reviews, seller info, variants, images, launch date, and creator-promoter count.

- **URL**: https://apify.com/lurkapi/tiktok-shop-scraper.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Automation, E-commerce, Social media
- **Stats:** 5 total users, 2 monthly users, 93.3% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.96 / 1,000 product scraped (us)s

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

Find what's selling on TikTok Shop before your competitors do. Search by keyword or seller, get rich product data (sold counts, ratings, prices, sellers, variants), and rank by whatever signal matters to you.

### 🛍️ What it does

Most TikTok Shop scrapers expect you to already know the product URL. But TikTok Shop value is the products you don't know about yet, the ones that go from 0 to 50,000 units in a week.

This scraper is built around discovery:

- **Keyword catalog search**: feed it `vitamin c serum` and it returns the top products for that term, ranked by relevance, sales, newest, or price. Like Amazon Best Sellers but for TikTok.
- **Sold counts and creator counts**: rank discovered products by actual sales velocity or by how many creators are pushing them. That's the signal for what's about to go viral.
- **Bulk processing**: screen thousands of products in one run. Pair with Apify Schedules for daily winner-spotting feeds.

Built for dropshippers spotting winners, brand owners monitoring the competitive landscape, and analysts tracking what's trending.

### 💎 Add-ons

Optional fields, all off by default. Turn on only what a run needs.

- **Creator count** *(paid)*: How many TikTok creators are promoting the product in videos, plus their video links. A high or rising creator count is the earliest public sign a product is being pushed hard and about to trend.
- **First-seen date** *(free)*: An estimate of when the product first went live, so you can tell a fresh opportunity from a saturated one.
- **Extra reviews** *(paid per extra review)*: Up to 600 reviews per product, beyond the 5 bundled free, for sentiment analysis and catching product issues before you commit inventory.

### 📋 How to use it

#### Step 1: Pick your inputs
Mix and match any of the following:
- **Product URLs**: any TikTok Shop product link, including short links (`vm.tiktok.com/...`)
- **Shop URLs**: `tiktok.com/shop/s/SHOP_ID` or `tiktok.com/shop/store/SLUG/SHOP_ID` (the URL must contain the numeric shop ID; `@username/shop` links are not supported)
- **Product IDs**: the 18 to 19 digit numeric IDs
- **Shop IDs**: the numeric ID of a shop
- **Keywords**: catalog search terms like `vitamin c serum`

All runs scrape the **United States** storefront, the only region available today. [Vote for the market we add next.](https://strawpoll.com/PbZqb8AeByN)

#### Step 2: Tune the run
- **Max products per source**: cap how many products to fetch per shop or keyword (URLs and IDs always return one)
- **Sort by**: Relevance, Best selling, Newest, Price low to high, or Price high to low
- **Add-ons**: turn on 'Include more than 5 reviews', Creator count, or First-seen date if you want them. All off by default. Up to 5 reviews per product are always included for free.
- **Output toggles**: switch off any field you don't need so rows stay lean

#### Step 3: Read your results
Click Start. Each row in the Output tab is one product. Always check the `status` field first. `Success` means the row is good. Anything else explains what happened (geo-block, region restriction, delisted product) and is not billed.

#### Example output

A complete row, with the Creator count, First-seen date, and Extra reviews
add-ons all enabled. The `videoCount`, `creatorCount`, `promoterVideoUrls`,
`firstSeen`, and `reviews` fields appear only when their add-on is turned on.

```json
{
    "status": "Success",
    "productId": "1731349100249977343",
    "source": "url",
    "inputUrl": "https://www.tiktok.com/shop/pdp/1731349100249977343",
    "productUrl": "https://www.tiktok.com/shop/pdp/perfectamino-powder-essential-aminos-for-muscle-collagen/1731349100249977343",
    "title": "BODYHEALTH Perfect Amino Powder - Essential Amino Acids for Muscle Recovery",
    "description": "Build protein, muscle and collagen without the caloric impact of a full meal.",
    "currentPrice": 32.95,
    "priceDisplay": "$32.95",
    "originalPrice": 45.95,
    "discountPercent": 28,
    "currency": "USD",
    "rating": 4.8,
    "reviewCount": 8807,
    "soldCount": 10347,
    "sellerId": "7495492798404069887",
    "sellerName": "BODYHEALTH",
    "sellerFollowers": 8600,
    "sellerRating": 4.2,
    "sellerSold": 30100,
    "sellerResponseRatePct": 66,
    "sellerShipsWithinDays": 2,
    "sellerPositiveFeedbackPct": 79,
    "sellerProductCount": 24,
    "sellerReviewCount": 3120,
    "sellerVideoCount": 410,
    "sellerUrl": "https://www.tiktok.com/shop/store/bodyhealth/7495492798404069887",
    "sellerIsOfficial": true,
    "businessName": "BodyHealth LLC",
    "brand": "BODYHEALTH",
    "categoryPath": "Health > Nutrition & Wellness > Fitness Supplements > Protein Supplements",
    "videoCount": 312,
    "creatorCount": 214,
    "promoterVideoUrls": [
        "https://www.tiktok.com/@fitwithjen/video/7401234567890123456",
        "https://www.tiktok.com/@gymrattips/video/7402345678901234567"
    ],
    "firstSeen": "2024-11-03T08:12:40.000Z",
    "imageUrls": [
        "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/5dc8403f93fc457183c1f001c4adc60a~tplv-fhlh96nyum-crop-webp:1600:1600.webp"
    ],
    "shippingOrigin": "745 Main St, Dunedin, Florida, 34698, United States",
    "variants": [
        { "skuId": "1731349107483185663", "price": 32.95, "currency": "USD", "properties": "Flavor: Unflavored", "available": 1240 },
        { "skuId": "1731349107483251199", "price": 34.95, "currency": "USD", "properties": "Flavor: Mixed Berry", "available": 86 }
    ],
    "variantOptions": ["Flavor"],
    "reviews": [
        {
            "reviewId": "7405512340987654321",
            "rating": 5,
            "timestamp": "2026-04-22T17:31:09.000Z",
            "user": "Marcus T.",
            "userId": "7298471230984712309",
            "userAvatar": "https://p16-oec-general-useast5.ttcdn-us.com/.../avatar.webp",
            "verified": true,
            "incentivized": false,
            "content": "Mixes clean, no aftertaste. Down 6 lbs and keeping muscle.",
            "skuId": "1731349107483185663",
            "images": ["https://p16-oec-general-useast5.ttcdn-us.com/.../review-photo.webp"],
            "source": "api"
        },
        {
            "reviewId": "7404998877665544332",
            "rating": 4,
            "timestamp": "2026-04-18T09:05:44.000Z",
            "user": "Dana R.",
            "userId": "7301122334455667788",
            "userAvatar": "https://p16-oec-general-useast5.ttcdn-us.com/.../avatar.webp",
            "verified": true,
            "incentivized": false,
            "content": "Good value. Wish the berry flavor was a little less sweet.",
            "skuId": "1731349107483251199",
            "images": null,
            "source": "api"
        }
    ],
    "scrapeTimestamp": "2026-05-17T14:22:11.000Z",
    "error": null
}
````

### 💰 Pricing

Pay only for products successfully delivered. No subscription, no minimum.

| Event | Price | When |
|---|---|---|
| Product scraped | **$10 per 1,000 products** | per product successfully returned. Always includes up to 5 reviews for free. |
| Review extras | **$2 per 1,000 reviews** | each review past the 5th, only when 'Include more than 5 reviews' is enabled. |
| Creator count | **$20 per 1,000 products** | only when the count was successfully resolved. |

No charge for failed rows, geo-blocked rows, or rows where the seller has delisted the product.

#### Examples

- 1,000 products, no add-ons: **$10.00**
- 1,000 products, 25 reviews each: $10.00 + (20,000 × $0.002) = **$50.00**
- 1,000 products with creator count: $10.00 + $20.00 = **$30.00**

### 💡 Good to know

- **US storefront only in v1.** UK, France, Indonesia, Malaysia, Thailand, Vietnam, Singapore, and the Philippines are on the roadmap. [Vote for which region we add next.](https://strawpoll.com/PbZqb8AeByN)
- **Auto-deduplication**: the same product surfacing through a URL and a keyword is only billed once.
- **Geo-blocked rows** ("Product not available in this country or region") are detected and not billed.
- **Reviews come sorted newest-first.** Up to 5 are bundled in the base charge.
- **Output toggles** let you trim each row to just the fields you actually need.
- Files and datasets are stored in your Apify storage. How long they're kept depends on your Apify plan.

### ❓ FAQ

**Why did some products fail?**
Most failures are because the seller delisted the product, the listing is region-restricted, or the IP got temporarily flagged. Check the `status` field on each row, it explains exactly what happened. None of these cases are billed.

**Why is the price different from what I see on TikTok Shop?**
TikTok shows different promotional discounts to anonymous visitors than to logged-in users; anonymous visitors get a larger discount on the same SKU. The Actor reports prices as a logged-out shopper sees them at scrape time. In our tests, anonymous `currentPrice` runs roughly 5-15% below the logged-in promo price for the same SKU. The `originalPrice` field is the seller's list price (struck-through MSRP) and is identical for both viewer types; use it if you need a stable catalog reference. Prices reflect a single scrape moment; TikTok rotates promotional discounts continuously, so a re-run minutes later may report slightly different `currentPrice` values for the same SKU.

**Which proxy should I use?**
Nothing on your side. Networking is managed by the Actor automatically. It's tuned to keep success rates high and runs cheap.

**Can I scrape outside the US?**
Not in v1. Other regions (UK, FR, ID, MY, TH, VN, SG, PH) are on the roadmap. [Vote for which region we add next.](https://strawpoll.com/PbZqb8AeByN)

**Can I run this on a schedule?**
Yes. Use Apify Schedules to run the Actor on any cadence (hourly, daily, custom cron).

**How long are my results stored?**
Results live in your Apify dataset. How long they're kept depends on your Apify plan.

### 🔗 Other tools you might like

- [TikTok Video Downloader](https://apify.com/lurkapi/tiktok-video-downloader) - Download TikTok videos without watermark in bulk.

### ⚖️ Disclaimer

This tool is intended for personal, research, and educational use. You are responsible for complying with TikTok's Terms of Service and applicable laws in your jurisdiction. The developer is not liable for misuse. Data availability depends on TikTok at run time.

**Keywords:** TikTok Shop scraper, TikTok Shop API, ecommerce scraper, product data, sales data, TikTok products, dropshipping research, TikTok Shop crawler

# Actor input Schema

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

Search the TikTok Shop catalog for each term and scrape the top matching products. Works like an Amazon Best Sellers list for that search (e.g. vitamin c serum). One keyword per line.

## `urls` (type: `array`):

Scrape specific products or shops by link: product URLs (tiktok.com/shop/pdp/...), shop URLs with a numeric ID (tiktok.com/shop/s/SHOP\_ID), or short links (vm.tiktok.com/...), all auto-detected. @username/shop links aren't supported; use a URL with the numeric shop ID.

## `productIds` (type: `array`):

Scrape specific products by ID. The product ID is the 18 to 19 digit number in any product URL (e.g. 1731349100249977343). One per line.

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

Scrape every product a shop lists, by its numeric shop ID. One per line.

## `maxProductsPerSource` (type: `integer`):

Cap on products returned per keyword or shop. URL and product ID inputs always return one each, regardless of this cap.

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

The regional storefront to scrape. The United States is the only region available today. The UK, France, and Southeast Asian markets are on the roadmap.

## `includeReviews` (type: `boolean`):

Up to 5 reviews per product are always included free. Turn on only to pull more than 5. Each review past the 5th is billed.

## `maxReviewsPerProduct` (type: `integer`):

How many reviews to return per product when 'Extra reviews' is on. The first 5 are free, the rest are billed.

## `reviewsSortBy` (type: `string`):

How to order the reviews returned. 'newest' picks the most recent first; 'recommended' uses TikTok's relevance ranking (tends to surface higher-quality reviews with photos).

## `reviewsStarRating` (type: `integer`):

Limit reviews to one specific star rating (1-5). Use 0 (default) to disable the filter and return reviews of any star rating.

## `includeCreatorCount` (type: `boolean`):

Adds a creatorCount field showing how many TikTok creators are promoting each product. A strong momentum signal for spotting rising winners.

## `includeFirstSeen` (type: `boolean`):

Adds a firstSeen field: the date the product was first seen active. Use it as a rough launch-date estimate. Free. Adds one request per product, so runs take slightly longer.

## `outputTitle` (type: `boolean`):

Include the product title.

## `outputDescription` (type: `boolean`):

Include the product description.

## `outputCurrentPrice` (type: `boolean`):

Include the discounted current price.

## `outputOriginalPrice` (type: `boolean`):

Include the pre-discount list price.

## `outputDiscountPercent` (type: `boolean`):

Include the percent discount.

## `outputCurrency` (type: `boolean`):

Include the price currency code (USD, GBP, etc.).

## `outputRating` (type: `boolean`):

Include the average product rating (0-5).

## `outputReviewCount` (type: `boolean`):

Include the total number of reviews.

## `outputSoldCount` (type: `boolean`):

Include the lifetime sold count.

## `outputSellerId` (type: `boolean`):

Include the seller's TikTok Shop ID.

## `outputSellerName` (type: `boolean`):

Include the seller's shop name.

## `outputSellerFollowers` (type: `boolean`):

Include the seller's follower count.

## `outputSellerRating` (type: `boolean`):

Include the seller's overall shop rating.

## `outputSellerSold` (type: `boolean`):

Include the seller's shop-wide sold count.

## `outputSellerResponseRatePct` (type: `boolean`):

Include the seller's customer-message response rate.

## `outputSellerShipsWithinDays` (type: `boolean`):

Include the seller's typical ship-within days. Only available when the desktop fallback handles the product (DOM-only field).

## `outputSellerPositiveFeedbackPct` (type: `boolean`):

Include the seller's positive-feedback percentage.

## `outputBrand` (type: `boolean`):

Include the product brand name.

## `outputCategoryPath` (type: `boolean`):

Include the breadcrumb category path.

## `outputImageUrls` (type: `boolean`):

Include the product image URLs.

## `outputShippingOrigin` (type: `boolean`):

Include the shipping origin country/region.

## `outputVariants` (type: `boolean`):

Include the array of variants/SKUs with sizes, colors, and per-SKU prices.

## `outputSellerProductCount` (type: `boolean`):

Include how many products the seller currently lists.

## `outputSellerReviewCount` (type: `boolean`):

Include the seller's shop-wide review count.

## `outputSellerVideoCount` (type: `boolean`):

Include how many videos promote the seller's shop.

## `outputSellerUrl` (type: `boolean`):

Include the seller's storefront URL.

## `outputSellerIsOfficial` (type: `boolean`):

Include whether the seller is an official TikTok Shop.

## `outputBusinessName` (type: `boolean`):

Include the seller's registered business name.

## Actor input object example

```json
{
  "keywords": [
    "vitamin c serum"
  ],
  "urls": [],
  "productIds": [],
  "shopIds": [],
  "maxProductsPerSource": 5,
  "country": "US",
  "includeReviews": false,
  "maxReviewsPerProduct": 5,
  "reviewsSortBy": "newest",
  "reviewsStarRating": 0,
  "includeCreatorCount": false,
  "includeFirstSeen": false,
  "outputTitle": true,
  "outputDescription": true,
  "outputCurrentPrice": true,
  "outputOriginalPrice": true,
  "outputDiscountPercent": true,
  "outputCurrency": true,
  "outputRating": true,
  "outputReviewCount": true,
  "outputSoldCount": true,
  "outputSellerId": true,
  "outputSellerName": true,
  "outputSellerFollowers": true,
  "outputSellerRating": true,
  "outputSellerSold": true,
  "outputSellerResponseRatePct": true,
  "outputSellerShipsWithinDays": true,
  "outputSellerPositiveFeedbackPct": true,
  "outputBrand": true,
  "outputCategoryPath": true,
  "outputImageUrls": true,
  "outputShippingOrigin": true,
  "outputVariants": true,
  "outputSellerProductCount": true,
  "outputSellerReviewCount": true,
  "outputSellerVideoCount": true,
  "outputSellerUrl": true,
  "outputSellerIsOfficial": true,
  "outputBusinessName": true
}
```

# Actor output Schema

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

No description

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

No description

## `seller` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `creators` (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": [
        "vitamin c serum"
    ],
    "urls": [],
    "productIds": [],
    "shopIds": [],
    "maxProductsPerSource": 5,
    "country": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/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": ["vitamin c serum"],
    "urls": [],
    "productIds": [],
    "shopIds": [],
    "maxProductsPerSource": 5,
    "country": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("lurkapi/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 '{
  "keywords": [
    "vitamin c serum"
  ],
  "urls": [],
  "productIds": [],
  "shopIds": [],
  "maxProductsPerSource": 5,
  "country": "US"
}' |
apify call lurkapi/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Shop Scraper",
        "description": "Scrape TikTok Shop products by URL, ID, keyword, or hashtag. Returns title, price, sold count, ratings, reviews, seller info, variants, images, launch date, and creator-promoter count.",
        "version": "0.0",
        "x-build-id": "vqfFOnryr12RqKJ4v"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/lurkapi~tiktok-shop-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-lurkapi-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/lurkapi~tiktok-shop-scraper/runs": {
            "post": {
                "operationId": "runs-sync-lurkapi-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/lurkapi~tiktok-shop-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-lurkapi-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",
                "properties": {
                    "keywords": {
                        "title": "Keyword search",
                        "type": "array",
                        "description": "Search the TikTok Shop catalog for each term and scrape the top matching products. Works like an Amazon Best Sellers list for that search (e.g. vitamin c serum). One keyword per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "urls": {
                        "title": "Product or shop URLs",
                        "type": "array",
                        "description": "Scrape specific products or shops by link: product URLs (tiktok.com/shop/pdp/...), shop URLs with a numeric ID (tiktok.com/shop/s/SHOP_ID), or short links (vm.tiktok.com/...), all auto-detected. @username/shop links aren't supported; use a URL with the numeric shop ID.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "productIds": {
                        "title": "Product IDs",
                        "type": "array",
                        "description": "Scrape specific products by ID. The product ID is the 18 to 19 digit number in any product URL (e.g. 1731349100249977343). One per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "shopIds": {
                        "title": "Shop IDs",
                        "type": "array",
                        "description": "Scrape every product a shop lists, by its numeric shop ID. One per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxProductsPerSource": {
                        "title": "Max products per source",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on products returned per keyword or shop. URL and product ID inputs always return one each, regardless of this cap.",
                        "default": 50
                    },
                    "country": {
                        "title": "TikTok Shop region",
                        "enum": [
                            "US"
                        ],
                        "type": "string",
                        "description": "The regional storefront to scrape. The United States is the only region available today. The UK, France, and Southeast Asian markets are on the roadmap.",
                        "default": "US"
                    },
                    "includeReviews": {
                        "title": "Extra reviews per product ($)",
                        "type": "boolean",
                        "description": "Up to 5 reviews per product are always included free. Turn on only to pull more than 5. Each review past the 5th is billed.",
                        "default": false
                    },
                    "maxReviewsPerProduct": {
                        "title": "Max reviews per product",
                        "minimum": 1,
                        "maximum": 600,
                        "type": "integer",
                        "description": "How many reviews to return per product when 'Extra reviews' is on. The first 5 are free, the rest are billed.",
                        "default": 5
                    },
                    "reviewsSortBy": {
                        "title": "Reviews sort order",
                        "enum": [
                            "newest",
                            "recommended"
                        ],
                        "type": "string",
                        "description": "How to order the reviews returned. 'newest' picks the most recent first; 'recommended' uses TikTok's relevance ranking (tends to surface higher-quality reviews with photos).",
                        "default": "newest"
                    },
                    "reviewsStarRating": {
                        "title": "Reviews star filter",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Limit reviews to one specific star rating (1-5). Use 0 (default) to disable the filter and return reviews of any star rating.",
                        "default": 0
                    },
                    "includeCreatorCount": {
                        "title": "Creator count ($)",
                        "type": "boolean",
                        "description": "Adds a creatorCount field showing how many TikTok creators are promoting each product. A strong momentum signal for spotting rising winners.",
                        "default": false
                    },
                    "includeFirstSeen": {
                        "title": "First-seen date",
                        "type": "boolean",
                        "description": "Adds a firstSeen field: the date the product was first seen active. Use it as a rough launch-date estimate. Free. Adds one request per product, so runs take slightly longer.",
                        "default": false
                    },
                    "outputTitle": {
                        "title": "Output: title",
                        "type": "boolean",
                        "description": "Include the product title.",
                        "default": true
                    },
                    "outputDescription": {
                        "title": "Output: description",
                        "type": "boolean",
                        "description": "Include the product description.",
                        "default": true
                    },
                    "outputCurrentPrice": {
                        "title": "Output: current price",
                        "type": "boolean",
                        "description": "Include the discounted current price.",
                        "default": true
                    },
                    "outputOriginalPrice": {
                        "title": "Output: original price",
                        "type": "boolean",
                        "description": "Include the pre-discount list price.",
                        "default": true
                    },
                    "outputDiscountPercent": {
                        "title": "Output: discount %",
                        "type": "boolean",
                        "description": "Include the percent discount.",
                        "default": true
                    },
                    "outputCurrency": {
                        "title": "Output: currency",
                        "type": "boolean",
                        "description": "Include the price currency code (USD, GBP, etc.).",
                        "default": true
                    },
                    "outputRating": {
                        "title": "Output: rating",
                        "type": "boolean",
                        "description": "Include the average product rating (0-5).",
                        "default": true
                    },
                    "outputReviewCount": {
                        "title": "Output: review count",
                        "type": "boolean",
                        "description": "Include the total number of reviews.",
                        "default": true
                    },
                    "outputSoldCount": {
                        "title": "Output: sold count",
                        "type": "boolean",
                        "description": "Include the lifetime sold count.",
                        "default": true
                    },
                    "outputSellerId": {
                        "title": "Output: seller ID",
                        "type": "boolean",
                        "description": "Include the seller's TikTok Shop ID.",
                        "default": true
                    },
                    "outputSellerName": {
                        "title": "Output: seller name",
                        "type": "boolean",
                        "description": "Include the seller's shop name.",
                        "default": true
                    },
                    "outputSellerFollowers": {
                        "title": "Output: seller followers",
                        "type": "boolean",
                        "description": "Include the seller's follower count.",
                        "default": true
                    },
                    "outputSellerRating": {
                        "title": "Output: seller rating",
                        "type": "boolean",
                        "description": "Include the seller's overall shop rating.",
                        "default": true
                    },
                    "outputSellerSold": {
                        "title": "Output: seller sold count",
                        "type": "boolean",
                        "description": "Include the seller's shop-wide sold count.",
                        "default": true
                    },
                    "outputSellerResponseRatePct": {
                        "title": "Output: seller response rate %",
                        "type": "boolean",
                        "description": "Include the seller's customer-message response rate.",
                        "default": true
                    },
                    "outputSellerShipsWithinDays": {
                        "title": "Output: seller ships-within days",
                        "type": "boolean",
                        "description": "Include the seller's typical ship-within days. Only available when the desktop fallback handles the product (DOM-only field).",
                        "default": true
                    },
                    "outputSellerPositiveFeedbackPct": {
                        "title": "Output: seller positive feedback %",
                        "type": "boolean",
                        "description": "Include the seller's positive-feedback percentage.",
                        "default": true
                    },
                    "outputBrand": {
                        "title": "Output: brand",
                        "type": "boolean",
                        "description": "Include the product brand name.",
                        "default": true
                    },
                    "outputCategoryPath": {
                        "title": "Output: category path",
                        "type": "boolean",
                        "description": "Include the breadcrumb category path.",
                        "default": true
                    },
                    "outputImageUrls": {
                        "title": "Output: image URLs",
                        "type": "boolean",
                        "description": "Include the product image URLs.",
                        "default": true
                    },
                    "outputShippingOrigin": {
                        "title": "Output: shipping origin",
                        "type": "boolean",
                        "description": "Include the shipping origin country/region.",
                        "default": true
                    },
                    "outputVariants": {
                        "title": "Output: variants / SKUs",
                        "type": "boolean",
                        "description": "Include the array of variants/SKUs with sizes, colors, and per-SKU prices.",
                        "default": true
                    },
                    "outputSellerProductCount": {
                        "title": "Output: seller product count",
                        "type": "boolean",
                        "description": "Include how many products the seller currently lists.",
                        "default": true
                    },
                    "outputSellerReviewCount": {
                        "title": "Output: seller review count",
                        "type": "boolean",
                        "description": "Include the seller's shop-wide review count.",
                        "default": true
                    },
                    "outputSellerVideoCount": {
                        "title": "Output: seller video count",
                        "type": "boolean",
                        "description": "Include how many videos promote the seller's shop.",
                        "default": true
                    },
                    "outputSellerUrl": {
                        "title": "Output: seller URL",
                        "type": "boolean",
                        "description": "Include the seller's storefront URL.",
                        "default": true
                    },
                    "outputSellerIsOfficial": {
                        "title": "Output: official shop flag",
                        "type": "boolean",
                        "description": "Include whether the seller is an official TikTok Shop.",
                        "default": true
                    },
                    "outputBusinessName": {
                        "title": "Output: business name",
                        "type": "boolean",
                        "description": "Include the seller's registered business name.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
