TikTok Shop Product Scraper avatar

TikTok Shop Product Scraper

Pricing

from $0.01 / 1,000 results

Go to Apify Store
TikTok Shop Product Scraper

TikTok Shop Product Scraper

Pull TikTok Shop products from keyword searches or shop/product URLs. Get title, price, discounts, units sold, ratings, reviews, seller and images for product research, sourcing and competitor tracking.

Pricing

from $0.01 / 1,000 results

Rating

0.0

(0)

Developer

Assia Fadli

Assia Fadli

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Turn TikTok Shop into a structured product feed. Give the actor a few keywords or paste shop / product URLs, and it returns one clean JSON record per product — price, discount, units sold, rating, review count, seller, images, category and (optionally) recent reviews. Built for sourcing, price tracking, catalog research and competitor monitoring.

Heads-up — read Limitations first. TikTok Shop is a JavaScript-heavy storefront with strong bot protection. Extraction is fully defensive, but the CSS selectors are best-effort and may need re-tuning against the live site. Use residential proxies.


What you get

  • Keyword search — one search per keyword, across the region you choose.
  • Direct URLs — drop in shop pages, category/listing pages, or single product links. Product links are scraped immediately; listing links are crawled for the product cards they contain.
  • Infinite scroll handling on listing grids.
  • Optional reviews — up to ~10 recent reviews per product.
  • Region targeting (US, GB, ID, MY, TH, VN, …) for the right storefront and currency.
  • Human-like browsing — rotating user-agents, randomized viewport and delays, overlay/consent dismissal.

Input

FieldTypeDefaultWhat it does
searchKeywordsstring[][]Keywords to search on TikTok Shop; each becomes its own search.
shopUrlsstring[][]Shop / listing / product URLs to scrape directly.
regionstring"US"Marketplace to target. Affects storefront and currency.
includeReviewsbooleanfalseOpen each product page and capture up to ~10 recent reviews. Slower.
maxItemsinteger100Hard cap on products collected per run.
proxyConfigurationobjectApify residentialProxy applied to every request. Residential strongly recommended.

Provide at least one of searchKeywords or shopUrls. Common alternative field names (keywords, productUrls, urls, startUrls, maxProducts, country, withReviews, proxyConfig) are also accepted.

Example input

{
"searchKeywords": ["wireless earbuds", "phone case"],
"shopUrls": [],
"region": "US",
"includeReviews": true,
"maxItems": 100,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output

Each dataset item is one product:

{
"title": "Wireless Bluetooth Earbuds Noise Cancelling",
"price": 19.99,
"currency": "$",
"originalPrice": 39.99,
"soldCount": 12000,
"rating": 4.8,
"reviewCount": 3405,
"sellerName": "SoundGear Official",
"sellerUrl": "https://www.tiktok.com/shop/...",
"productUrl": "https://www.tiktok.com/view/product/...",
"images": [
"https://p16-.../image1.jpeg",
"https://p16-.../image2.jpeg"
],
"category": "Electronics",
"description": "Long battery life, IPX5 waterproof ...",
"region": "US",
"reviews": [
{ "author": "j***n", "rating": 5, "text": "Great sound for the price!", "date": "2026-06-30" }
],
"source": "search:wireless earbuds",
"scrapedAt": "2026-07-21T10:12:00.000Z"
}

Fields that can't be located come back as null (or [] for arrays) rather than being dropped, so every record shares the same shape.


How it works

  1. Builds a search URL per keyword and/or uses your shopUrls.
  2. Drives a real Chromium browser via Crawlee's PlaywrightCrawler.
  3. On listing pages it auto-scrolls, reads each product card, and enqueues the product's detail page.
  4. On detail pages it extracts the full record, merges in the card-level data, and (optionally) captures reviews.
  5. Delivers each product to the dataset and charges for it (see Pricing).

All selectors live in one place — src/selectors.ts. Each field lists several candidate selectors tried in order (first match wins), so when TikTok changes its markup you only edit that one file.


Pricing — pay per event

This actor uses Apify's pay-per-event model. You are charged once per product delivered to the dataset, under the product-scraped event. When your event budget (or the maxItems cap) is reached, the crawler stops so nothing further is fetched or billed.


Limitations

  • Anti-bot protection. TikTok Shop uses device fingerprinting, challenges and rate limiting. Some requests may be blocked or served CAPTCHAs. Residential proxies are essentially required, and even then a share of requests can fail. The actor retries and logs blocks.
  • Selectors are best-effort. The live DOM and endpoints change often and vary by region / A-B bucket. Watch the log for No product cards found / No reviews matched warnings — those flag a selector that needs updating in src/selectors.ts.
  • URL formats (/shop/s/<query>, product paths) are best guesses and may need adjusting per region.
  • Reviews render lazily; the actor captures the first ~10 that appear.

If extraction returns mostly null, open a live product/listing page, inspect the real elements, and update the matching entries in src/selectors.ts.


Disclaimer

Scrape responsibly and in line with TikTok's Terms of Service and applicable law. Collect only publicly available data and respect rate limits. Intended for legitimate product research and competitor monitoring.


Made by Assia Fadli. Licensed under the MIT License.