TikTok Shop Product Scraper
Pricing
from $0.01 / 1,000 results
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
Maintained by CommunityActor 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
| Field | Type | Default | What it does |
|---|---|---|---|
searchKeywords | string[] | [] | Keywords to search on TikTok Shop; each becomes its own search. |
shopUrls | string[] | [] | Shop / listing / product URLs to scrape directly. |
region | string | "US" | Marketplace to target. Affects storefront and currency. |
includeReviews | boolean | false | Open each product page and capture up to ~10 recent reviews. Slower. |
maxItems | integer | 100 | Hard cap on products collected per run. |
proxyConfiguration | object | Apify residential | Proxy 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
- Builds a search URL per keyword and/or uses your
shopUrls. - Drives a real Chromium browser via Crawlee's
PlaywrightCrawler. - On listing pages it auto-scrolls, reads each product card, and enqueues the product's detail page.
- On detail pages it extracts the full record, merges in the card-level data, and (optionally) captures reviews.
- 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 matchedwarnings — those flag a selector that needs updating insrc/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.