Use it for product research and dropshipping, TikTok Shop affiliate and creator scouting, price and competitor monitoring, best-seller tracking, or review and sentiment analysis. It runs in your Apify account, and you do not need a TikTok login, cookies or request signing.
What it collects
- Listing products, from keywords and stores: ID, URL, title, image, price, original price, discount, currency, rating, units sold, shop and categories.
- Full product records, from product URLs: images, review count, variants, and the price, stock and purchase limit of each SKU, plus the description and specifications when TikTok Shop provides them.
- Shops and shipping: the shop’s name, logo, product count and rating, and the shipping fee and delivery window when TikTok Shop provides them.
- Creator videos linked to a product, with play and like counts and an affiliate flag.
- Buyer reviews: rating, text, date, photos, the SKU bought, and verified-purchase and incentivized flags.
- Attribution: every item records the keyword, store URL or product URL that produced it.
How it works
TikTok Shop Scraper collects public US TikTok Shop data in three ways, which you can combine in one run: keyword search, store listings and product URLs. There is no headless browser, no login and no cookies on your end. It pages through each keyword and store, fetches the full record and the reviews of each product you list, removes duplicates, and stops at your maxItemsPerQuery, maxReviewsPerProduct and maxItems limits or your pay-per-event budget.
A keyword returns the products TikTok Shop shows for it, and a keyword search ends by itself at about 100–200 products, depending on the keyword. A store is paged, best selling or newest first, until its catalogue ends, up to 1,200 products, or your limit is reached. A product URL returns the full product record, and maxReviewsPerProduct adds its buyer reviews.
Use cases
- E-commerce sellers and dropshippers — find winning products, prices and units sold before you source.
- TikTok Shop affiliates and 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 and sentiment analysts — collect buyer reviews with ratings, photos and verified-purchase flags.
- Agencies — research stores and products for TikTok Shop campaigns.
Input
Set these in the Actor’s input form on Apify, or send them as JSON through the API.
-
searchQueries— Keywords to search TikTok Shop for, one per line. Each keyword returns up to about 100 products, and a product found by several keywords is delivered, and charged, once. At least one ofsearchQueries,shopUrlsorproductUrlsis required; they can be combined in one run. -
shopUrls— TikTok Shop store URLs, ashttps://www.tiktok.com/shop/store/<store-name>/<store-id>. Lists each store’s products. -
shopSort— Order of store products:top(“Best selling”), the default, ornewest(“Newest”). -
productUrls— Product pages (/shop/pdp/...orshop.tiktok.com/view/product/...) or product IDs to fetch full records for. Short links (vt.tiktok.com,vm.tiktok.com) are not supported: open them and paste the full link. Invalid entries are skipped with a warning in the log. -
includeProductDetails— Fetch the full product record for each product URL. The default istrue; turn it off to collect only reviews. -
maxReviewsPerProduct— Reviews to collect for each product URL, from 0 to 5,000. The default,0, collects no reviews. -
maxItemsPerQuery— Maximum products per keyword or store. Empty means 100, the pre-filled value;0removes the limit, up to 5,000. It does not apply to reviews, which usemaxReviewsPerProduct. -
maxItems— Overall cap across all keywords, stores and products combined, counting listing products, product records and reviews together.0or empty means unlimited. The form pre-fills 1,000. -
customMapFunction— Optional(object) => objectJavaScript function applied to every item, to reshape or enrich it. It must not be used for filtering. Leave it empty to store items unchanged.
Custom map function
Use customMapFunction to reshape or enrich items on the fly. The input form pre-fills a function that returns each item unchanged, a starting point to edit:
(object) => { return {...object} } The README sets one rule:
- No filtering. The function takes an item and returns an item.
The input form adds that the function must not be used for filtering, and that accounts using it for filtering may be banned.
Input tips
Take a quick sample
Run a single keyword with maxItems set to 10: a cheap, fast check that the Actor and your keyword return what you expect.
Choose listing rows or full product records
Keyword and store results are listing rows: price, original price, discount, rating, units sold, shop and categories. For variants, stock and price per SKU, review counts, shop details or creator videos, and the description, specifications and shipping when TikTok Shop provides them, 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.
Search several product keywords
This input searches three keywords in the United States, up to 100 products each:
{
"searchQueries": [
"wireless earbuds",
"led strip lights",
"phone case"
],
"maxItemsPerQuery": 100,
"maxItems": 300
} List a store’s entire catalogue
Set maxItemsPerQuery to 0 to page a store until its catalogue ends, and raise maxItems to match. This input lists one store, newest products first:
{
"shopUrls": [
"https://www.tiktok.com/shop/store/<store-name>/<store-id>"
],
"shopSort": "newest",
"maxItemsPerQuery": 0,
"maxItems": 0
} Collect a product’s record and reviews
List the product 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 pre-filled 1,000 counts reviews too. Turn off includeProductDetails if you only want the reviews:
{
"productUrls": [
"https://www.tiktok.com/shop/pdp/<product-name>/<product-id>"
],
"includeProductDetails": true,
"maxReviewsPerProduct": 200,
"maxItems": 0
} Map more products with more keywords
Raise maxItemsPerQuery, or set it to 0, to follow each keyword search to its end, at about 100–200 products depending on the keyword. Beyond that, extra depth comes from extra keywords, such as brand names, product types and common variations. Dedup works across keywords and stores, so overlaps are stored and charged once.
Output
Each run writes its results to an Apify dataset. Each item is one unique result, and its type field says what it is: 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, adds no items and is not charged. In Apify Console, the dataset’s Overview shows the type, title, URL, price, currency, units sold, rating and shop, and its Reviews view shows the product ID, rating, text, reviewer, date and verified-purchase flag.
These are the main fields of an item.
-
type—product,productDetailorreview. Use it to split the dataset; it also decides which result event charges the item. -
idurltitle— The product ID, product page URL and title. A review has its ownidand the product’sproductId. -
priceoriginalPricediscountPercentcurrency— The current price, the price before the discount and the discount in percent, in the listing’s currency (USD). -
ratingsoldCountreviewCount— The rating and units sold; product records add the review count. A listing row leaves out a rating or review count TikTok Shop doesn’t show on it. -
shopMeta— The shop’s ID and name on search products, only its ID on store products, and its logo, product count and rating on product records. -
specificationsvariantsskus— Product records: specification name–value pairs when provided, option names and values, and one entry per purchasable variant with its price, stock and purchase limit. -
shippingrelatedVideos— Product records: the shipping fee and delivery window when provided, and creator videos linked to the product, with play and like counts and an affiliate flag. -
skuSpecificationisVerifiedPurchaseisIncentivized— Reviews: the SKU bought, whether the reviewer bought the product, and whether the review was marked as incentivized. A review also has a rating, text, date, photos and reviewer. -
searchKeywordinputKeywordinputShopUrlinputProductUrl— The input that produced the item: keyword fields on search products,inputShopUrlon store products, andinputProductUrl, exactly as you typed it, on product records and reviews.
{
"type": "product",
"id": "1700000000000000001",
"url": "https://www.tiktok.com/shop/pdp/1700000000000000001",
"title": "Example wireless earbuds with charging case",
"imageUrl": "https://example.com/product-1.jpg",
"price": 24.99,
"originalPrice": 31.99,
"discountPercent": 22,
"currency": "USD",
"currencySymbol": "$",
"rating": 4.6,
"soldCount": 1250,
"shopMeta": {
"id": "7400000000000000001",
"name": "Example Store"
},
"categories": [
"Electronics",
"Audio"
],
"searchPosition": 0,
"searchKeyword": "wireless earbuds",
"inputKeyword": "wireless earbuds"
} {
"type": "productDetail",
"id": "1700000000000000001",
"url": "https://www.tiktok.com/shop/pdp/1700000000000000001",
"title": "Example wireless earbuds with charging case",
"description": "An example product description.",
"images": [
"https://example.com/product-1.jpg"
],
"price": 24.99,
"originalPrice": 31.99,
"discountPercent": 22,
"currency": "USD",
"soldCount": 1250,
"specifications": [
{
"name": "Brand",
"value": "Example"
}
],
"rating": 4.6,
"reviewCount": 320,
"variants": [
{
"name": "Color",
"values": [
"Black",
"White"
]
}
],
"skus": [
{
"id": "1700000000000000101",
"name": "Black",
"price": 24.99,
"originalPrice": 31.99,
"currency": "USD",
"stock": 500,
"purchaseLimit": 5
}
],
"shopMeta": {
"id": "7400000000000000001",
"name": "Example Store",
"logoUrl": "https://example.com/shop-logo.jpg",
"productCount": 40,
"rating": 4.7
},
"shipping": {
"name": "Standard shipping",
"fee": 0,
"currency": "USD",
"freeShipping": true,
"deliveryMinDays": 4,
"deliveryMaxDays": 6
},
"relatedVideos": [
{
"id": "7400000000000000201",
"url": "https://www.tiktok.com/@example_creator/video/7400000000000000201",
"durationSec": 30,
"playCount": 15000,
"likeCount": 900,
"authorName": "Example Creator",
"isAffiliate": true
}
],
"inputProductUrl": "https://www.tiktok.com/shop/pdp/1700000000000000001"
} {
"type": "review",
"id": "7500000000000000001",
"productId": "1700000000000000001",
"skuSpecification": "Color: Black",
"rating": 5,
"text": "An example review text.",
"createTime": 1791288000,
"createDate": "2026-10-06",
"images": [],
"isVerifiedPurchase": true,
"isIncentivized": false,
"authorMeta": {
"id": "6600000000000000001",
"name": "Example buyer"
},
"inputProductUrl": "https://www.tiktok.com/shop/pdp/1700000000000000001"
} Field reference
Every documented key of a dataset item, with its JSON type. A dot marks a key inside an object.
| Field | Type | Meaning |
|---|---|---|
type | string | product, productDetail or review. product and review items are charged as “Product or review”, productDetail items as “Product details”. |
id | string | The product ID; on a review, the review ID. |
url | string | The product page, as https://www.tiktok.com/shop/pdp/<id>. Not on reviews. |
title | string | The product title. Not on reviews. |
imageUrl | string | Search and store products: the product image URL. |
description | string | Product records: the product description, left out when TikTok Shop doesn’t provide one. |
images | array | Product records: product image URLs. Reviews: review photo URLs. |
price originalPrice | number | The current price and the price before the discount, in currency. |
discountPercent | number | The discount in percent. Left out when there is no discount. |
currency currencySymbol | string | The listing’s currency code and symbol: USD and $. |
rating | number | The product rating; on a review, the reviewer’s rating. Left out of a listing row that doesn’t show one. |
soldCount | number | Units sold. |
reviewCount | number | Product records: the number of reviews. |
shopMeta.id shopMeta.name | string | The shop’s ID and name. Store products carry only the ID. |
shopMeta.logoUrl | string | Product records: the shop’s logo URL. |
shopMeta.productCount shopMeta.rating | number | Product records: the shop’s product count and rating. |
trustLabel | string | Search products only: a badge TikTok Shop shows on search results, such as blue_v, most_loved or best_seller, when the product has one. |
categories | array | Search and store products: the product’s categories. |
isVerifiedSeller | boolean | Product records: a verified-seller flag, left out when TikTok Shop doesn’t provide it. |
categoryPath | array | Some product records: the full category path. |
specifications | array | Product records: specifications as name and value pairs, left out when TikTok Shop doesn’t provide them. |
variants | array | Product records: the option names and their values. |
skus | array | Product records: one entry per purchasable variant, with its own id, name, price, originalPrice, currency, stock and purchaseLimit. |
shipping | object | Product records: the shipping option’s name, fee, currency, freeShipping flag, deliveryMinDays, deliveryMaxDays and leadTime. Left out when TikTok Shop doesn’t provide it. |
relatedVideos | array | Product records: creator videos linked to the product, with play and like counts; isAffiliate marks affiliate creators. |
productId | string | Reviews: the ID of the product reviewed. |
skuSpecification | string | Reviews: the SKU bought, such as Item: Default. |
text | string | Reviews: the review text. |
createTime | number | Reviews: the publish time as a Unix timestamp in seconds. |
createDate | string | Reviews: the same moment as a YYYY-MM-DD date. |
isVerifiedPurchase isIncentivized | boolean | Reviews: whether the reviewer bought the product, and whether the review was marked as incentivized. |
authorMeta.name | string | Reviews: the reviewer’s name. |
authorMeta.avatar | string | Reviews: the reviewer’s avatar URL, a signed link that expires, so fetch it soon after the run if you need it. |
searchPosition | number | Search products: the position in the keyword’s results, starting at 0. |
searchKeyword inputKeyword | string | Search products: the keyword that found the product. A product found by several inputs is stored once, under whichever found it first. |
inputShopUrl | string | Store products: the store URL that listed the product. |
inputProductUrl | string | Product records and reviews: the product URL, exactly as you typed it. |
labels | array | In the README’s search sample, as ["Free shipping"]; the README does not describe it. Check a run of your own before relying on it. |
hasVideo | boolean | In the README’s search sample, as true; the README does not describe it. Check a run of your own before relying on it. |
category categoryId country authorMeta.id | string | In the README’s product-record and review samples; the README does not describe them. Check a run of your own before relying on them. |
How to run it
- Open the Actor on Apify, listed as “Tiktok Shop Scraper”, and sign in. You need an Apify account.
- Fill in the Input tab, then click Start.
- When the run finishes, open the Output tab and click Export to download the dataset as JSON, CSV or another format.
Or send the same input to the Apify API. This call runs the Actor and returns its dataset items. Replace $APIFY_TOKEN with the API token from your Apify Console.
curl -X POST \
"https://api.apify.com/v2/actors/batscrape~tiktok-shop-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries":["wireless earbuds"],"maxItems":10}' The call waits up to 300 seconds. For a longer run, start it asynchronously and read the dataset when it finishes. Read the Apify API reference.
New to Apify? See how BatScrape Actors run on Apify. To run it on a schedule, or send results on when a run finishes, see schedules and webhooks.
Pricing
Pay per event. A run is charged when it starts, then one result event for every item delivered. Listing products from keywords and stores and buyer reviews share one result event; full product records from product URLs have their own, priced separately. A product found by several keywords, or by a keyword and a store, is stored and charged once, and a keyword or store with no matches, or a product that is not found, adds no result charges. There are no free result pages, and every result is checked against the run’s charge budget before it’s stored, so a run stops cleanly instead of overspending. See current rates on Apify .
Limitations
- A keyword search ends by itself at about 100–200 products, depending on the keyword: that is where TikTok Shop’s search ends, not a partial result, so add keywords for more. A store is paged up to 1,200 products.
- Reviews come only from product URLs, up to 5,000 per product, and
maxReviewsPerProductdefaults to0, which collects none. - This Actor currently collects United States TikTok Shop data. The current input has no region selector; other TikTok Shop markets are not advertised as supported.
- Short links (
vt.tiktok.com,vm.tiktok.com) are not supported, and invalid store or product links are skipped with a warning in the log. - It returns image and video page URLs but does not download or store the files. Reviewer avatar URLs are signed links that expire.
- Fields an item doesn’t have, such as a discount, a trust badge or review photos, are left out rather than set to
null. - On the Apify free plan, a run is limited to one request: the first page of products for the first keyword or store (about 20–40 products), the full record of the first product, or its first 10 reviews when
includeProductDetailsis off. Keywords come first, then stores, then product URLs, and everything else in the run is skipped. A paid plan removes that limit.
FAQ
Answers from the Actor’s README on Apify.
Do I need a TikTok account or login?
No. It collects public data only, through a backend service, and no login, cookies or request signing are required on your end. You need an Apify account to run it.
Which TikTok Shop markets are supported?
The current Actor supports the United States TikTok Shop market. There is no region input in the current build. Customers outside the US can use it to research US products; this does not mean their local TikTok Shop market is supported.
How many products or reviews do I get?
A keyword search ends at about 100–200 products, depending on the keyword. A store is paged until its catalogue ends, up to 1,200 products per store. Reviews can go deep, 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, and on the Apify free plan a run is limited to one request.
What’s the difference between a listing product and a product record?
Listing products, from keywords and stores, have the price, discount, rating, units sold, shop and categories. Product records, from product URLs, add images, the review count, variants, stock and price per SKU, shop details and related creator videos, plus the description, specifications, shipping and a verified-seller flag when TikTok Shop provides them. They 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 add no result charges. There are no free result pages: every delivered result is charged.
Does it 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 them promptly if you need them.
Why did a run return few or no results?
Check these first:
- Your plan: on the Apify free plan a run is limited to one request, and everything after it is skipped. The log says so when the limit applies.
- The log: every keyword, store and review list ends with a line that says which limit stopped it.
-
maxItemsPerQuery: left empty, a keyword or store stops at 100 products. Set it to0for no per-query limit. -
maxReviewsPerProduct: it is0by default, which means no reviews. -
maxItems: the whole run stops once it’s reached, and it counts products, product records and reviews together. - The links: store URLs must look like
https://www.tiktok.com/shop/store/..., and product URLs must be product pages or product IDs. - The market: use US TikTok Shop product and store URLs. Other markets are not supported by the current Actor.
How do I keep the cost of a run down?
Four settings help:
- Set
maxItemsto a hard cap that matches your budget, and keepmaxItemsPerQuerylow 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
includeProductDetailswhen you only want reviews. - Batch related keywords and stores into one run: cross-query dedup means overlaps are never charged twice.
Related reading
- What to check before budgeting an Actor run — Understand the questions behind a scraping budget: the Actor’s current pricing, your input limits, sample output, and the effect of retries or incomplete runs.
- Planning predictable output for our Apify Actors — How we’re approaching output schemas for BatScrape: explicit fields, example records, and clear change notes before consumers build on a dataset.
- Planning a scraper around the data you need — A practical starting checklist for a scraping task: define the records, inspect a sample, identify useful fields, and make the output easy to validate.
- How to use BatScrape Actors on Apify — Run an Actor in Apify Console or through the API, export its dataset, schedule runs and pass results to automation tools.
Other BatScrape Actors
- Reddit Scraper — Search Reddit posts or comments by keyword across all subreddits. Export titles, text, subreddits, authors, scores and comment counts, sorted by relevance, newest, top or most comments.
- Threads Scraper — Search Threads by keyword or collect a public account’s latest posts. Export text, authors, engagement, topics, mentions, links and media URLs without a Threads login.
- Realtor.com Scraper — Scrape Realtor.com for-sale, rental and sold listings by city, ZIP code or URL. Export price, beds, baths, photos, sale and tax history, schools and agents.
- TikTok Scraper — Search TikTok by keyword and export unique videos with creator profiles, engagement stats, music, hashtags and media URLs. Sort by relevance or likes, filter by date and region.
- Douyin Scraper — Search Douyin (抖音), also known as TikTok China, by keyword. Export unique posts with creator profiles, engagement stats, music and media URLs.
- FollowScores Scraper — Extract live football fixtures, results and team profiles for 11 European competitions and 214 teams.
Every published Actor is on the scrapers hub.