All-in-one TikTok Shop scraper: search products by keyword, browse categories, get full product details with variants & reviews, seller info, and creator analytics (GMV, sales, engagement). Fast
Fixed category and store runs failing with SSLError: curl: (35) TLS connect error ... invalid library (0). That error is a residential exit node resetting the TLS handshake, and three network calls on the pagination path had no retry at all — a single reset on any of them killed the whole query, so a category run that had already parsed 15 products pushed 0 items. Every network call now retries (src/net.py), and a request that keeps failing raises NetworkError, which restarts the query on a new proxy IP instead of ending it.
Pagination endpoints are now called unsigned first. They answer code=0 as long as the request carries the cookies TikTok's own page handed out; the X-Tts-Oec-Bsid signer (Node.js sidecar, Bablosoft fingerprint, /bs/rt bootstrap) is spawned only if TikTok answers with code=10000/100000. A 60-product category scrape went from a ~90 s signer warmup plus a hard failure to ~13 s end to end.
Store products work again. They were fetched from an endpoint that answered code=10000 for every unverified session; unsigned requests get the real listing, and the products already rendered on the store page are used as the first page, so store products survive even when the endpoint is risk-controlled.
Items now reach the dataset as they are scraped instead of in one dump when the query ends: every SSR page, every pagination page and every store product is pushed the moment it is parsed, so a 3000-item run is usable while it is still running, and a query that dies on page 40 keeps the 39 pages that worked. Retries that re-scrape the first pages do not create duplicates — items are deduplicated by id before being pushed.
An empty product feed is now treated as a soft block instead of a result. TikTok serves the same category or search page with an empty feed on some residential exits (measured 1 in 5) — the query is retried on a fresh IP, and only if every attempt comes back empty does it report "no products found".
Bablosoft's fingerprint endpoint is now given one fast attempt per run instead of three slow ones per session — it is a paid endpoint and unreachable through most residential exits, and the bundled fingerprint is what actually gets used (this used to cost ~50 s of every query).
Input form rebuilt: the scrape type, all six input fields and the item limit are on the form itself instead of behind six collapsible sections. Only fine-tuning options and the proxy stay collapsed.
0.2 (2026-07-25)
Fixed product, reviews and store modes returning captcha errors. curl_cffi's impersonate="chrome" alias follows the newest profile in the installed library (0.15.0 → chrome146), and TikTok blocks the TLS fingerprints of recent Chrome builds — PDP and store pages answered with a captcha on every request. The profile is now pinned to chrome124 (IMPERSONATE in src/signer.py).
Reviews now come from the product page itself (review_info in the SSR payload) instead of the reviews API, which answers code=10000 for signed and unsigned requests alike. Total review count and the full star breakdown stay exact; sorting, filtering and the item limit are applied to the reviews we actually have. The API is still tried when more reviews are requested than the page carries, so extra pages are picked up automatically if TikTok reopens it.
Product mode with includeReviews no longer makes a second request or starts the signer — the reviews ship with the product page response.
Added the bundled signer/fingerprint.json fallback. Bablosoft turned its fingerprint endpoint into a paid one ({"valid":false,"message":"Key is empty"}), and the fallback pointed at a file that did not exist, so category and store runs failed outright. Sessions no longer waste retries on that endpoint either.
Target pages are now always the session's first request. A session that already carried a ttwid cookie from the warmup GET got a captcha on product and store pages.
0.1 (2026-07-07)
Six scrape modes in one Actor: search keywords, category URLs, product detail URLs, product reviews, store URLs, and creator usernames.
Search and category modes return product cards with productId, title, currentPrice, originalPrice, discountPercent, rating, reviewCount, salesVolume, sellerName, tags, imageUrls, and searchRank.
Product detail mode returns full data: description, category, price range, variants (SKUs with per-variant price and stock), specifications, selling points, brand, shipping info, seller/shop stats, and experience scores. Optionally embeds full reviews via includeReviews.
Reviews mode outputs one dataset item per review with reviewId, reviewerName, rating, text, date, variant, country, verified-purchase flag, images, and product-level ratings breakdown.
Store mode returns shop analytics (ratings, sold counts, followers, sub-scores, identity label) plus scraped store products and an estimated GMV summary.