# Tiktok Shop Scraper (`batscrape/tiktok-shop-scraper`) Actor

Scrape TikTok Shop products by keyword or store, plus full product pages with variants, SKU stock, shipping, creator videos and buyer reviews, with prices, discounts, ratings and units sold, no login required.

- **URL**: https://apify.com/batscrape/tiktok-shop-scraper.md
- **Developed by:** [BatScrape](https://apify.com/batscrape) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 product or reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Shop Scraper: Products, Stores, Product Details & Reviews with Prices, Stock and Sales Data 🛍️

Scrape TikTok Shop products by keyword or by store, and pull full product pages and buyer reviews, as clean JSON: title, price, original price, discount, currency, rating, units sold, shop, categories, plus (for product URLs) description, specifications, variants, stock and price per SKU, shipping, and the creator videos that sell the product. Transparent flat per-result pricing: one price per listing product or review, another per full product record. No TikTok login, no cookies, no request signing on your end. Perfect for product research and dropshipping, TikTok Shop affiliate and creator scouting, price and competitor monitoring, best-seller tracking and review or sentiment analysis (also searched for as TikTok Shop product scraper, TikTok Shop API or TikTok Shop reviews scraper).

💰 Price: $0.0005 per run + $0.00099 per product or review ($0.99 / 1,000) and $0.00529 per full product record ($5.29 / 1,000) 🌏 Coverage: United States by default, 15 more TikTok Shop markets selectable 📊 Data: Prices, discounts, ratings, units sold, shop, variants, SKU stock, shipping, creator videos, buyer reviews 🎯 Filters: Market, store sort order, per-keyword / per-store limit, reviews per product, overall item cap 🛡️ Flat Per-Result Pricing

### Quick Navigation

- [🧭 What Does This Actor Do?](#🧭-what-does-this-actor-do)
- [🛍️ Features and Functionality](#🛍️-features-and-functionality)
- [💰 Pricing: Transparent Event-Based Costs](#💰-pricing-transparent-event-based-costs)
- [🏷️ Who Needs This?](#🏷️-who-needs-this)
- [📦 Input Parameters](#📦-input-parameters)
- [💡 Input Strategy Guide](#💡-input-strategy-guide)
- [🔎 Example Requests](#🔎-example-requests)
- [📦 Output](#📦-output)
- [🔧 Troubleshooting](#🔧-troubleshooting)
- [❔ FAQ](#❔-faq)
- [📞 Contact](#📞-contact)

### 🧭 What Does This Actor Do?

This actor collects public TikTok Shop data in three ways, which you can combine in one run: keyword search, store listings and product URLs. It pushes every unique result to your dataset as structured JSON, with no headless browser, no login and no cookies on your end. Give it keywords, store URLs, product URLs, or any mix; it pages through each keyword and store, fetches the full record and the reviews of each product you list, removes duplicates, and respects your `maxItemsPerQuery`, `maxReviewsPerProduct` and `maxItems` limits and your pay-per-event budget as it goes.

**🔍 Keyword Search** — search as many keywords as you like in one run. Each keyword returns the products TikTok Shop shows for it, up to `maxItemsPerQuery` (100 when left empty); a keyword search ends by itself at about 100-110 products.

**🏪 Store Listings** — pass TikTok Shop store URLs and get the store's products, sorted by best selling or newest. A store is paged until its catalogue ends (up to 1,200 products per store) or your limit is reached.

**📋 Product Details & Reviews** — pass product URLs (or product IDs) to get the full product record: description, specifications, variants, stock and price per SKU, shipping, shop details and related creator videos. Set `maxReviewsPerProduct` to also collect its buyer reviews, with rating, text, photos and verified-purchase flag.

### 🛍️ Features and Functionality

| Feature                         | Description                                                                                                  | Benefit                                                          |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- |
| 💰 Flat Per-Result Pricing      | One price per listing product or review, one price per full product record, no separate query or page fee   | Predictable cost, you only pay for results delivered             |
| 🔍 Multi-Keyword & Store Search | Many keywords and store URLs in one run, each paged until it ends or reaches its limit                       | Hundreds of products per run without extra tools                 |
| 📋 Full Product Records         | Description, specifications, variants, SKU stock and prices, shipping, shop rating and creator videos        | Everything needed for product research in one item               |
| ⭐ Buyer Reviews                | Up to 5,000 reviews per product with rating, text, photos, SKU and verified-purchase flag                    | Review and sentiment analysis at scale                           |
| 🧹 Cross-Query Dedup            | A product found by several keywords, or by a keyword and a store, is stored once                             | Never pay twice for the same product                             |
| 🎯 Filters & Limits             | Market, store sort order, `maxItemsPerQuery`, `maxReviewsPerProduct` and `maxItems`                          | Decide which market and how many results, per query and per run |
| 🔧 Custom Map Function          | JavaScript function to reshape or enrich output on the fly                                                   | Shape results to match your exact requirements                   |
| 💵 Budget-Aware                 | Every result is checked against the run's charge budget before it's stored                                   | A run stops cleanly instead of overspending                      |

### 💰 Pricing: Transparent Event-Based Costs

Pay-per-event pricing — no subscription, no hidden fees. A flat run fee, and one charge per unique result actually delivered. There are two result prices: listing products and reviews are cheap, full product records cost more because each one is a complete product page.

#### Pricing Structure

| Event              | Price (USD) | Charged For                                                                 |
| ------------------ | ----------- | --------------------------------------------------------------------------- |
| 🚀 Actor Start     | $0.0005     | Once per run, regardless of input                                           |
| 🛍️ Product or review | $0.00099    | Each unique product from a keyword search or store, and each buyer review   |
| 📋 Product details | $0.00529    | Each full product record fetched from a product URL                         |

#### 💵 Real-World Pricing Examples

| Use Case                   | Configuration                                                                                                 | Total Cost | Breakdown                                           |
| -------------------------- | ------------------------------------------------------------------------------------------------------------- | ---------- | --------------------------------------------------- |
| One keyword, default limit | 1 keyword, `maxItemsPerQuery` left at its default of 100 (100 products)                                       | $0.0995    | $0.0005 + (100 × $0.00099)                          |
| Competitor store catalogue | 1 store URL, `maxItemsPerQuery: 0` (a store with about 300 products)                                          | $0.2975    | $0.0005 + (300 × $0.00099)                          |
| Product research batch     | 50 product URLs, product details only (50 full product records)                                               | $0.2650    | $0.0005 + (50 × $0.00529)                           |
| Details plus reviews       | 10 product URLs, `maxReviewsPerProduct: 200`, `maxItems: 0` (10 product records + 2,000 reviews)               | $2.0334    | $0.0005 + (10 × $0.00529) + (2,000 × $0.00099)      |

Result counts vary from keyword to keyword, store to store and product to product — a niche keyword, a small store or a product with few reviews simply returns fewer results (and costs less); the rows above are illustrative at the volumes shown.

### 🏷️ Who Needs This?

- **📦 E-commerce sellers & dropshippers** — find winning products, prices and units sold before you source.
- **🎥 TikTok Shop affiliates & creators** — discover products to promote and the creator videos already selling them.
- **🏷️ Brands** — monitor prices, discounts and stock of your own and competing products.
- **📈 Market researchers** — track best-sellers by keyword, category and store over time.
- **⭐ Review & sentiment analysts** — collect buyer reviews with ratings, photos and verified-purchase flags.
- **🤝 Agencies** — research stores and products for TikTok Shop campaigns.

### 📦 Input Parameters

At least one of `searchQueries`, `shopUrls` or `productUrls` is required; they can be combined in one run.

| Field                   | Description                                                                                                                                                                                                                                                                                                  | Default                                        |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- |
| `searchQueries`         | Keywords to search TikTok Shop for, one per line. Each keyword returns up to ~100 products. Products found by several keywords are delivered (and charged) once.                                                                                                                                            | prefilled `["wireless earbuds"]`               |
| `shopUrls`              | TikTok Shop store URLs, e.g. `https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079`. Lists the store's products.                                                                                                                                                                             | (none)                                         |
| `shopSort`              | Order of store products: `top` (Best selling) or `newest` (Newest).                                                                                                                                                                                                                                          | `top`                                          |
| `productUrls`           | TikTok Shop product URLs (or product IDs) to fetch full details for: description, variants, stock per SKU, shipping and related creator videos. Example: `https://www.tiktok.com/shop/pdp/goli-ashwagandha-gummies-with-vitamin-d-ksm-66-vegan-non-gmo/1729587769570529799`. Short links (`vt.tiktok.com`) are not supported; open them and paste the full link. | (none)                                         |
| `includeProductDetails` | Fetch the full product record for each product URL. Turn off to collect only reviews.                                                                                                                                                                                                                       | `true`                                         |
| `maxReviewsPerProduct`  | Reviews to collect for each product URL. `0` = no reviews. Minimum `0`, maximum `5000`.                                                                                                                                                                                                                      | `0`                                            |
| `region`                | TikTok Shop market: `US` (United States), `GB` (United Kingdom), `DE` (Germany), `FR` (France), `IT` (Italy), `ID` (Indonesia), `MY` (Malaysia), `MX` (Mexico), `PH` (Philippines), `SG` (Singapore), `ES` (Spain), `TH` (Thailand), `VN` (Vietnam), `BR` (Brazil), `JP` (Japan), `IE` (Ireland). The United States is the most complete; other markets may return fewer results. | `US`                                           |
| `maxItemsPerQuery`      | Maximum products per keyword or store. Empty means `100`; `0` means no limit (up to 5,000). Does not apply to reviews, which use `maxReviewsPerProduct`. Minimum `0`.                                                                                                                                       | prefilled `100`                                |
| `maxItems`              | Overall cap across all keywords, stores and products combined. `0` or empty means unlimited (each keyword or store is still separately capped by `maxItemsPerQuery`). Minimum `0`.                                                                                                                          | prefilled `1000`                               |
| `customMapFunction`     | `(object) => object` applied to every item. Must not be used for filtering.                                                                                                                                                                                                                                  | prefilled `(object) => { return {...object} }` |

### 💡 Input Strategy Guide

**Just want a quick sample?** Run a single keyword with `maxItems` set to 10. It is a cheap, fast check that the actor and your keyword return what you expect.

**Listing rows or full product records?** Keyword and store results are listing rows: price, original price, discount, rating, units sold, shop and categories, at the lower price. When you need description, specifications, variants, stock per SKU, shipping or creator videos, put the product URLs in `productUrls` to get full product records, which are priced separately. A common pattern is to search first, then pass the most interesting product URLs from that dataset to a second run.

**Collecting reviews?** List the products in `productUrls` and set `maxReviewsPerProduct`. A popular product can have thousands of reviews, so pick a number that fits your budget, and raise `maxItems` (or set it to `0`) because its prefilled value of 1,000 counts reviews too. Turn off `includeProductDetails` if you only want the reviews.

**Mapping a whole store or many keywords?** Set `maxItemsPerQuery` to `0` to page a store until its catalogue ends, and raise `maxItems` to match. For keywords, extra depth comes from extra keywords (brand names, product types, common variations) rather than a higher limit, since one keyword search ends at about 100-110 products. Dedup works across keywords and stores, so overlaps are stored and charged once.

### 🔎 Example Requests

Search several product keywords in the United States, up to 100 products each:

```json
{
    "searchQueries": ["wireless earbuds", "led strip lights", "phone case"],
    "region": "US",
    "maxItemsPerQuery": 100,
    "maxItems": 300
}
```

List a store's entire catalogue, newest products first:

```json
{
    "shopUrls": ["https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079"],
    "shopSort": "newest",
    "maxItemsPerQuery": 0,
    "maxItems": 0
}
```

Fetch the full product record and up to 200 buyer reviews for one product:

```json
{
    "productUrls": ["https://www.tiktok.com/shop/pdp/goli-ashwagandha-gummies-with-vitamin-d-ksm-66-vegan-non-gmo/1729587769570529799"],
    "includeProductDetails": true,
    "maxReviewsPerProduct": 200,
    "maxItems": 0
}
```

### 📦 Output

One dataset item per unique result, and every item says what it is in its `type` field: `product` (a listing row from a keyword search or a store), `productDetail` (a full product record from a product URL) or `review` (one buyer review). A keyword or store with no matches, or a product that is not found, simply contributes no items — it isn't stored as a placeholder row and isn't charged.

Captured from a real run on 2026-10-15 (trimmed for brevity — long arrays are cut to their first entries, the description is shortened and signed CDN URLs are shortened with `…`).

A `product` from the keyword search `goli ashwagandha`:

```json
{
    "type": "product",
    "id": "1729587769570529799",
    "url": "https://www.tiktok.com/shop/pdp/1729587769570529799",
    "title": "3 Bottles of Goli Ashwagandha & Vitamin D Gummy - Mixed Berry, KSM-66, Vegan, Plant Based, Non-GMO, Gluten & Gelatin Free",
    "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/…",
    "price": 44.98,
    "originalPrice": 57,
    "discountPercent": 21,
    "currency": "USD",
    "currencySymbol": "$",
    "rating": 4.7,
    "soldCount": 865668,
    "shopMeta": { "id": "7495794203056835079", "name": "Goli Nutrition" },
    "labels": ["Free shipping"],
    "trustLabel": "blue_v",
    "categories": ["Health", "Nutrition & Wellness", "Vitamins, Minerals & Wellness Supplements"],
    "hasVideo": true,
    "searchPosition": 0,
    "searchKeyword": "goli ashwagandha",
    "inputKeyword": "goli ashwagandha"
}
```

A `productDetail` for the same product, from its product URL:

```json
{
    "type": "productDetail",
    "id": "1729587769570529799",
    "url": "https://www.tiktok.com/shop/pdp/1729587769570529799",
    "title": "3 Bottles of Goli Ashwagandha & Vitamin D Gummy - Mixed Berry, KSM-66, Vegan, Plant Based, Non-GMO, Gluten & Gelatin Free",
    "description": "Goli Nutrition has sold over 90 Million bottles of gummy vitamins.\nVegan, Non-GMO, Gluten-free & Gelatin-free: …",
    "images": ["https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/…"],
    "price": 44.98,
    "originalPrice": 57,
    "discountPercent": 21,
    "currency": "USD",
    "currencySymbol": "$",
    "soldCount": 865668,
    "category": "Health",
    "categoryId": "700645",
    "specifications": [
        { "name": "Brand", "value": "Goli" },
        { "name": "Product form", "value": "Gummy" }
    ],
    "rating": 4.7,
    "reviewCount": 71757,
    "variants": [{ "name": "Specifications", "values": ["Default"] }],
    "skus": [
        { "id": "1729587788239049223", "name": "Default", "price": 44.98, "originalPrice": 57, "currency": "USD", "stock": 241371, "purchaseLimit": 20 }
    ],
    "shopMeta": {
        "id": "7495794203056835079",
        "name": "Goli Nutrition",
        "logoUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/…",
        "productCount": 52,
        "rating": 4.6
    },
    "isVerifiedSeller": true,
    "shipping": {
        "name": "Standard shipping",
        "fee": 0,
        "currency": "USD",
        "freeShipping": true,
        "deliveryMinDays": 4,
        "deliveryMaxDays": 6,
        "leadTime": "Oct 19 - Oct 21"
    },
    "relatedVideos": [
        {
            "id": "7419446014324624686",
            "url": "https://www.tiktok.com/@6596631738335674373/video/7419446014324624686",
            "title": "Las gomitas de ashwagandha de goli me han ayudado muchisimo. …",
            "durationSec": 132,
            "playCount": 8424118,
            "likeCount": 505954,
            "createTime": 1727474395,
            "authorId": "6596631738335674373",
            "authorName": "Gonzalo",
            "authorUrl": "https://www.tiktok.com/@6596631738335674373",
            "isAffiliate": true
        }
    ],
    "inputProductUrl": "https://www.tiktok.com/shop/pdp/1729587769570529799"
}
```

A `review` of the same product:

```json
{
    "type": "review",
    "id": "7502637593889294122",
    "productId": "1729587769570529799",
    "skuSpecification": "Item: Default",
    "rating": 5,
    "text": "Got a great deal the first week of May, but also I've been using this product for the past 6 months. …",
    "createTime": 1746844118,
    "createDate": "2025-05-10",
    "images": ["https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/…"],
    "isVerifiedPurchase": true,
    "isIncentivized": false,
    "country": "US",
    "authorMeta": {
        "id": "6627258701311541253",
        "name": "Megan",
        "avatar": "https://p16-common-sign.tiktokcdn-us.com/tos-useast5-avt-0068-tx/…"
    },
    "inputProductUrl": "https://www.tiktok.com/shop/pdp/1729587769570529799"
}
```

Fields worth knowing about:

- **`type`** — `product`, `productDetail` or `review`. It also decides the price: `product` and `review` items are charged as "Product or review", `productDetail` items as "Product details". Use it to split the dataset; the Console's Overview and Reviews views do the same.
- **Input fields** — every item records the input that produced it. Search products carry `searchKeyword` and `inputKeyword`, store products carry `inputShopUrl`, and product details and reviews carry `inputProductUrl` (exactly as you typed it). A product found by several inputs is stored once, under whichever found it first.
- **`shopMeta`** — on search products it holds the shop `id` and `name`; on store products only the shop `id`; on product details it adds `logoUrl`, `productCount` and the shop `rating`.
- **`trustLabel`** — a badge TikTok Shop shows on search results, such as `blue_v`, `most_loved` or `best_seller`. Only on search products, and only when the product has one.
- **`searchPosition`** — the product's position in the keyword's results, starting at `0`.
- **`price` / `originalPrice` / `discountPercent`** — the current price, the price before the discount, and the discount in percent, in the market's `currency`.
- **`skus`** — one entry per purchasable variant, with its own price, `stock` and `purchaseLimit`; `variants` lists the option names and values.
- **`relatedVideos`** — creator videos linked to the product, with play and like counts; `isAffiliate` marks affiliate creators.
- **`isVerifiedPurchase` / `isIncentivized`** — whether the reviewer bought the product, and whether the review was marked as incentivized.
- **Optional fields** — fields the product or review doesn't have (no discount, no trust badge, no review photos, a rating or review count TikTok Shop doesn't show on listing rows) are left out of the item rather than set to `null`.
- **`createTime` / `createDate`** — the review's publish time as a Unix timestamp in seconds, and the same moment as a `YYYY-MM-DD` date.
- **Image URLs** — product images, shop logos, review photos and reviewer avatars are links, not files. Reviewer avatar URLs are signed and expire, so fetch them soon after the run if you need them.

### 🔧 Troubleshooting

#### ❓ Getting Few or No Results?

- ✅ Check your plan — runs on the free plan are limited to one request: the first page of products for the first keyword or store (about 20-40 products), or the full record of the first product, or its first 10 reviews when `includeProductDetails` is off. Keywords come first, then stores, then product URLs; everything else in the run is skipped. The log says so when the limit applies; a paid plan removes it
- ✅ Read the log — every keyword, store and review list ends with a line such as `Collected 100 products for "wireless earbuds". Stopped because the limit of 100 products per keyword was reached.`, which tells you exactly which limit applied
- ✅ Check `maxItemsPerQuery` — when left empty a keyword or store stops at 100 products; set it to `0` for no per-query limit
- ✅ Expect about 100-110 products per keyword — that is where a TikTok Shop keyword search ends, not a partial result; add more keywords for more products
- ✅ Check `maxReviewsPerProduct` — it is `0` by default, which means no reviews
- ✅ Check `maxItems` — the whole run stops once it is reached, and it counts products, product details and reviews together
- ✅ Check the charge budget — a run that can't afford another result stops cleanly rather than erroring
- ✅ Check the links — store URLs must look like `https://www.tiktok.com/shop/store/...` and product URLs must be product pages (`/shop/pdp/...` or `shop.tiktok.com/view/product/...`) or a product ID; short links (`vt.tiktok.com`, `vm.tiktok.com`) are not supported, so open them and paste the full link. Invalid entries are skipped with a warning in the log
- ✅ Check the market — the United States is the most complete; a product or store from another market may only be found with the matching `region`

#### 💡 Want to Minimize Costs?

- ✅ Set `maxItems` to a hard cap matching your budget, and keep `maxItemsPerQuery` low when you only need the top products of each keyword or store
- ✅ Use listing rows from keywords and stores where they are enough, and request full product records only for the products you need
- ✅ Turn off `includeProductDetails` when you only want reviews
- ✅ Batch related keywords and stores into one run — cross-query dedup means overlaps are never charged twice

### ❔ FAQ

**Do I need a TikTok account or login to use this actor?**
No — it collects public data only, through a backend service; no login, cookies or request signing are required on your end.

**Which markets are supported?**
The United States by default, plus the United Kingdom, Germany, France, Italy, Indonesia, Malaysia, Mexico, the Philippines, Singapore, Spain, Thailand, Vietnam, Brazil, Japan and Ireland via `region`. The United States is the most complete; other markets may return fewer results.

**How many products or reviews do I get?**
A keyword search ends at about 100-110 products. A store is paged until its catalogue ends, up to 1,200 products per store. Reviews can go deep — popular products have thousands — and you collect up to `maxReviewsPerProduct` (at most 5,000) per product URL. All of these are also bounded by `maxItems` and the run's maximum charge. On the free plan a run is limited to one request (see Troubleshooting).

**What's the difference between a listing product and product details?**
Listing products (from keywords and stores) have price, discount, rating, units sold, shop and categories. Product details (from product URLs) add the description, specifications, variants, stock and price per SKU, shipping, shop rating and related creator videos, and are priced separately.

**What's included at no extra charge?**
Every field of an item comes with it; there are no add-on fees. Duplicates across keywords and stores are removed for free, and products that are not found cost nothing beyond the start fee. There are no free result pages: every delivered result is charged.

**Does this actor download images or videos?**
No — it returns image and video page URLs but does not download or store the files. Reviewer avatar URLs are signed links that expire, so download promptly if you need them.

### 📞 Contact

Reach out to the maintainers directly for support.

- ✉️ Email: batscrape@gmail.com
- 💬 Discord: discord.com/invite/ZRANXwhWU
- 🐦 X (Twitter): x.com/batscrape
- 🛒 Apify: apify.com/batscrape

# Actor input Schema

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

Keywords to search TikTok Shop for, one per line. Each keyword returns up to ~100 products. Products found by several keywords are delivered (and charged) once.

## `shopUrls` (type: `array`):

TikTok Shop store URLs, e.g. https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079. Lists the store's products.

## `shopSort` (type: `string`):

Order of store products.

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

TikTok Shop product URLs (or product IDs) to fetch full details for: description, variants, stock per SKU, shipping and related creator videos. Example: https://www.tiktok.com/shop/pdp/goli-ashwagandha-gummies-with-vitamin-d-ksm-66-vegan-non-gmo/1729587769570529799. Short links (vt.tiktok.com) are not supported; open them and paste the full link.

## `includeProductDetails` (type: `boolean`):

Fetch the full product record for each product URL. Turn off to collect only reviews.

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

Reviews to collect for each product URL. 0 = no reviews.

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

TikTok Shop market. The United States is the most complete; other markets may return fewer results.

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

Maximum products per keyword or store. Empty means 100; 0 means no limit (up to 5,000). Does not apply to reviews, which use "Max reviews per product".

## `maxItems` (type: `integer`):

Overall cap across all keywords, stores and products combined. 0 or empty means unlimited (each keyword or store is still separately capped by "Max products per keyword or store").

## `customMapFunction` (type: `string`):

A function that takes each output object and returns a transformed object. MUST NOT be used for filtering — accounts using it for filtering may be banned. Leave empty to store items unchanged.

## Actor input object example

```json
{
  "searchQueries": [
    "wireless earbuds"
  ],
  "shopSort": "top",
  "includeProductDetails": true,
  "maxReviewsPerProduct": 0,
  "region": "US",
  "maxItemsPerQuery": 100,
  "maxItems": 1000,
  "customMapFunction": "(object) => { return {...object} }"
}
```

# Actor output Schema

## `overview` (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 = {
    "searchQueries": [
        "wireless earbuds"
    ],
    "maxItemsPerQuery": 100,
    "maxItems": 1000,
    "customMapFunction": (object) => { return {...object} }
};

// Run the Actor and wait for it to finish
const run = await client.actor("batscrape/tiktok-shop-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchQueries": ["wireless earbuds"],
    "maxItemsPerQuery": 100,
    "maxItems": 1000,
    "customMapFunction": "(object) => { return {...object} }",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "wireless earbuds"
  ],
  "maxItemsPerQuery": 100,
  "maxItems": 1000,
  "customMapFunction": "(object) => { return {...object} }"
}' |
apify call batscrape/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,batscrape/tiktok-shop-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/OPKqBVL6kCuvwd2CX/builds/4AdJa5gdcCJeia1Iu/openapi.json
