TikTok Shop Scraper | Fast Search & Full Product Data
Pricing
from $1.22 / 1,000 product results
TikTok Shop Scraper | Fast Search & Full Product Data
Scrape TikTok Shop in two modes: fast keyword search or full product extraction. Get prices, sales, sellers, descriptions, SKUs, stock, shipping, videos, reviews, raw data and change tracking. Includes bulk keywords, pagination, filters, sorting, deduplication, retries and proxy support.
Pricing
from $1.22 / 1,000 product results
Rating
0.0
(0)
Developer
DataForge
Maintained by CommunityActor stats
2
Bookmarked
109
Total users
65
Monthly active users
7 hours ago
Last modified
Categories
Share
🛍️ TikTok Shop Search & Product Scraper
Search TikTok Shop in Fast mode, or open every result in Full mode for complete product research — details, variants, stock, shipping, videos, seller data, reviews, and change tracking. No browser or login: HTTP requests only.
🟢 HTTP-only · ⚡ Fast + Full modes · 🔑 Multi-keyword · 📄 Real pagination · 🌍 15 regions · 🧾 CSV/Excel-ready
✨ Why this scraper
Most "search" scrapers stop at the first page — about 30 products — because TikTok Shop's HTML only ships the first batch. This actor talks to TikTok's own load‑more API to keep pulling page after page, so maxPages and maxItems actually mean something.
| 🐢 First‑page‑only scrapers | 🚀 This actor | |
|---|---|---|
| Products per keyword | ~30 (hard cap) | Hundreds (real pagination) |
| Sold count / rating | Often blank | ✅ Parsed |
| Free‑shipping flag | Rarely detected | ✅ From TikTok labels |
| Output shape | Nested JSON blobs | ✅ Flat rows for CSV/Sheets |
| Browser needed | Often | ❌ Never (pure HTTP) |
⚡ Fast Search vs. 🔬 Full Product Data
Choose the depth you need without changing actors or workflows:
| ⚡ Fast Search | 🔬 Full Product Data | |
|---|---|---|
| Best for | Large searches, discovery, lead lists | Product research, monitoring, detailed exports |
| Requests | Search pages only | Search pages + one detail request per selected product + optional reviews |
| Core data | Product, price, sales, rating, seller, image, badges | Everything in Fast plus description, discounts, variants, stock, options, shipping, videos, seller/business data, safety fields, reviews |
| Change tracking | — | Optional price, sales velocity, and stock movement |
| Failure behavior | Search issue goes to Errors | Keeps the Fast row if a detail page is unavailable |
✅ Existing users:
mode: "fast"is the original Actor behavior and remains the default. Search logic, lightweight execution, and all 33 product-card fields stay unchanged. Full mode is optional.
🔥 What it does
- 🔎 Search one keyword or many in a single run
- 📄 Paginate for real — walks TikTok's load‑more feed, not just page 1
- 🌍 Pick a region — US, GB, ES, MX, DE, FR, JP and more
- 🧾 Extract clean product cards — title, ID, URL, image, seller, price, sold count, rating, reviews, badges
- 📈 Sort locally by relevance, best sellers, price or rating
- 🎚️ Filter by price, rating, sold count and free shipping
- 🧹 Deduplicate globally so the same product never floods your dataset
- 🔬 Enrich selected products on demand with descriptions, discounts, SKU variants, exact stock, product options, shipping estimates, videos, seller/business details, and safety warnings
- ⭐ Collect complete public reviews with rating, text, author, country, date, SKU, verification flags, and review images
- 📈 Track changes between runs — previous price/sales/stock, deltas, elapsed days, and estimated sales velocity
- 🧪 Log issues separately — failed pages go to an Errors dataset, never billed as products
- 🖼️ Optional visual report — a shareable product‑grid page saved to the key‑value store (toggle
htmlReport)
🗺️ How it works
┌────────────┐ ┌─────────────────────┐ ┌──────────────────────┐│ keyword │ ──▶ │ Page 1 (SSR HTML) │ ──▶ │ Parse product cards ││ + region │ │ ~30 products │ │ price · rating · │└────────────┘ └──────────┬──────────┘ │ seller · shipping ││ └──────────┬───────────┘has_more? │ load_more_params │▼ ▼┌─────────────────────┐ ┌─────────────────┐│ load-more API │ ─loop▶ │ filter · sort ││ next 30 products │ │ dedupe · save │└─────────────────────┘ └─────────────────┘(same session, no signing)
- Fetch page 1 via server‑side HTML with a Chrome‑like TLS fingerprint.
- Follow
load_more_paramsinto TikTok'sproduct_listAPI inside the same session — page after page — untilmaxPagesormaxItemsis reached. - Shape → filter → sort → dedupe → save each product as a flat row.
- In
fullmode, enrich only the final selected products. This avoids wasting detail requests on products removed by filters or deduplication.
🚀 Quick start
The actor accepts the simple competitor‑style input:
{"country_code": "US","keyword": "water bottle","maxItems": 50,"maxPages": 3}
…and a richer product‑research workflow:
{"country_code": "US","keywords": ["neck fan", "phone case", "makeup organizer"],"maxItems": 100,"maxPages": 5,"sortBy": "best_sellers","dedupe": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"],"apifyProxyCountry": "US"}}
For complete product data and reviews:
{"mode": "full","country_code": "US","keywords": ["water bottle", "tumbler"],"maxItems": 25,"maxPages": 2,"sortBy": "best_sellers","includeReviews": true,"maxReviews": 5,"trackChanges": true}
💡 Pro tip: run broad keywords first (
water bottle,phone case,hair dryer brush), sort bybest_sellers, then re‑run the winners with price/rating filters.
🌍 Supported regions
US · VN · TH · PH · MY · ID · GB · SG · ES · MX · DE · IT · FR · BR · JP
For best results, match the proxy country to
country_code.
📥 Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
mode | enum | fast | fast returns lightweight search cards; full enriches each selected product. |
keywords | array | ["water bottle"] | One or many search keywords. |
keyword | string | — | Single keyword (simple‑input compatibility). Merged with keywords. |
country_code | enum | US | TikTok Shop region. |
maxItems | int | 10 | Max products per keyword. 0 = no per‑keyword cap. |
maxPages | int | 1 | Max search pages to walk per keyword. Raise this to go past ~30 products. |
sortBy | enum | relevance | relevance, best_sellers, price_asc, price_desc, rating_desc. |
minPrice / maxPrice | number | — | Filter on normalized currentPrice. |
minRating | number | 0 | Keep products at or above this rating. |
minSoldCount | int | 0 | Keep products at or above this sold count. |
freeShippingOnly | bool | false | Keep only products TikTok tags with free shipping. |
dedupe | bool | true | Drop duplicate products across keywords and pages. |
compactOutput | bool | true | Remove empty values while keeping stable columns. |
includeRawProduct | bool | false | Attach the original TikTok card as rawProductJson (debugging). |
htmlReport | bool | true | Save a shareable visual product‑grid report to the key‑value store (report). |
includeReviews | bool | true | Full only. Attach public customer reviews. |
maxReviews | int | 5 | Full only. Reviews per product; 0 requests all available reviews. |
reviewSort | enum | recommended | Full only. recommended or recent. |
trackChanges | bool | false | Full only. Compare price, sold count, and stock with the previous run. |
includeRawDetail | bool | false | Full only. Attach TikTok's raw detail response as rawDetailJson for debugging. |
fullConcurrency | int | 3 | Full only. Product-detail requests processed in parallel. |
detailTimeoutSec | int | 25 | Full only. Product-detail/review request timeout. |
detailMaxRetries | int | 2 | Full only. Detail retries with a fresh session/proxy. |
maxConcurrency | int | 1 | Keywords processed in parallel. |
requestDelayMs | int | 0 | Optional pause between pages of one keyword. |
requestTimeoutSec | int | 20 | HTTP request timeout. |
maxRetries | int | 2 | Retries on 429/5xx, captcha and parse failures. |
maxProxyRetries | int | 2 | Dedicated retry budget for proxy/transport errors. |
proxyConfiguration | object | Residential US | Apify proxy settings. Residential strongly recommended. |
📤 Output
Every product is a flat row with type: "product_card" and status: "ok":
{"type": "product_card","status": "ok","countryCode": "US","query": "water bottle","page": 1,"searchRank": 1,"sortedRank": 1,"productId": "1731726912824578262","title": "HydroPal 32oz Motivational Sports Water Bottle","productUrl": "https://shop.tiktok.com/us/pdp/hydropal-32oz-water-bottle/1731726912824578262","currentPrice": 8.99,"originalPrice": 19.98,"currency": "USD","currencySymbol": "$","soldCount": 1397,"soldText": "1.4K sold","rating": 4.7,"reviewCount": 224,"sellerId": "7494113938193482966","sellerName": "HydroPal","sellerUrl": "https://www.tiktok.com/shop/s/7494113938193482966?region=US","imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/...webp","tags": "Free shipping","freeShipping": true,"scrapedAt": "2026-07-11T10:36:31Z"}
In Full mode the same row gains rich nested arrays and normalized summary fields:
{"dataLevel": "full","detailStatus": "success","description": "...","discountPercent": 55,"estimatedRevenue": 12558.03,"skuCount": 4,"skuInStockCount": 4,"totalStockQuantity": 1842,"variants": [{"skuId": "...","skuName": "Blue / 32oz","price": 8.99,"stockQuantity": 412,"inStock": true,"properties": {"Color": "Blue", "Size": "32oz"}}],"shippingFee": 0,"deliveryMinDays": 3,"deliveryMaxDays": 7,"videos": [{"durationSeconds": 14, "url": "https://..."}],"reviewsFetchedCount": 5,"reviews": [{"rating": 5,"text": "...","reviewerName": "...","reviewCountry": "US","verifiedPurchase": true,"createdAt": "2026-07-01T12:00:00Z"}]}
🧾 Field guide
| Column | Meaning |
|---|---|
productId · title · productUrl | Product identity and direct link |
currentPrice · originalPrice · currency | Normalized pricing |
soldCount · soldText | Units sold (number + human label) |
rating · reviewCount | Star rating and review volume |
sellerId · sellerName · sellerUrl | Seller identity and storefront |
imageUrl · imageUrls | Primary image + full list |
tags · freeShipping | TikTok badges and shipping signal |
searchRank · sortedRank | Position in TikTok's feed vs. after your sort |
dataLevel · detailStatus · detailError | Full-enrichment status and transparent fallback reason |
description · properties · options | Complete PDP text and product configuration |
variants · skuCount · skuInStockCount · totalStockQuantity | SKU-level prices, properties, images, dimensions, weight, availability, and stock |
discountPercent · savingsAmount · estimatedRevenue | Commercial calculations derived from TikTok's public values |
shipping* · delivery* | Public fulfillment, fee, service, ETA, COD, and category fields |
videos · videoUrls · videoCount | Product video metadata and media URLs |
reviews · reviewTexts · reviewRatingBreakdown | Full review objects, text-only export, and rating distribution |
reviewsFetchStatus · reviewsFetchError | complete, limited, disabled, or a transparent upstream error |
previous* · *Change · soldVelocityPerDay | Optional comparisons with the previous tracked snapshot |
📊 Ready‑made table views
The default dataset deliberately keeps the original three table views in both modes, so Fast runs look and behave exactly as before:
- 🛍️ Products — identity, image, rating, seller, direct URL
- 💵 Prices & sales — current/original price, sold count, rating, reviews, shipping
- 🏪 Sellers — seller identity and the products returned for each seller
When mode: "full", the actor also writes the enriched rows to a run-scoped Full dataset. It starts with the same three familiar views and then adds four Full-only views, in this order:
- 🛍️ Products — the original product overview
- 💵 Prices & sales — the original commercial view
- 🏪 Sellers — the original seller view
- 🔬 Full product data — descriptions, stock summaries, shipping, videos, seller/business data
- 🎨 SKUs & variants — one export row per variant, ready for Excel or a database
- ⭐ Customer reviews — one row per fetched review, including its complete
text, rating, date, author, country, SKU, flags, and images - 📈 Price & sales changes — previous/current price, sales, stock, deltas, and velocity
In a Full run, select Full products (Full mode) in the output selector to open this complete view set. The Full dataset ID and direct API/Console links are also returned in the Full run's OUTPUT summary. Fast runs never write Full rows and expose no Full fields or Full-only views in their main Products dataset.
A few more outputs live outside the main dataset:
- 🧪 Errors — a separate dataset of warning/error rows (never billed as products)
- 📋 Run summary — a
run_summaryrecord in the key‑value storeOUTPUT(input scope, saved count, issues, runtime) - 🖼️ Visual report — with
htmlReporton (default), areportrecord is saved to the key‑value store: a shareable product‑grid page (image, price, discount, rating, sold count, seller). Open it from Storage → Key‑value store →report, or use thereportUrllink inOUTPUT.
🧪 Example recipes
🏆 Find best‑selling product ideas
{"country_code": "US","keywords": ["makeup organizer", "hair dryer brush", "press on nails"],"maxItems": 100,"maxPages": 5,"sortBy": "best_sellers"}
🎯 Filter by price and rating
{"country_code": "US","keyword": "portable blender","minPrice": 10,"maxPrice": 50,"minRating": 4.5,"maxItems": 100,"maxPages": 5}
🌐 Compare regions
{"country_code": "GB","keywords": ["neck fan", "mini printer"],"maxItems": 100,"maxPages": 5,"sortBy": "rating_desc"}
🛡️ Reliability notes
- 🧠 HTTP‑only. No headless browser — fast and cheap.
- 🌐 Use a residential proxy. TikTok Shop can return empty data or a Security Check on datacenter traffic. Match the proxy country to
country_code. - 🐢 Start small, then scale. Begin with
maxConcurrency: 1and a few pages; increase once results look stable. - 🐞 Raw output is for debugging only.
includeRawProduct: truemakes rows much larger. - 🔬 Full mode is intentionally heavier. It performs a detail request for every selected product and extra requests when reviews span multiple pages. Filter and cap search results first.
- 🛟 Full has a safe fallback. If TikTok temporarily blocks or removes a PDP, the original Fast row is saved with
detailStatus: "failed"; the issue is also written to Errors. - 📈 Tracking starts on run two. The first tracked run creates the private baseline; later runs calculate changes from it.
- 🧾 Flat output is intentional. It keeps Apify "All fields", CSV and Google Sheets exports predictable.
💼 Use cases
🔬 Product research · 📈 Trend discovery · 🕵️ Competitor monitoring · 💲 Price & rating checks · 🔥 High‑volume best‑sellers · 📊 Dashboard feeds · 🌍 Marketplace analysis by country · 🛒 Dropshipping & brand scouting
❓ FAQ
Does it use a browser? No. HTTP requests only.
How do I get more than ~30 products?
Raise maxPages (and maxItems). The actor follows TikTok's real load‑more feed, so more pages = more unique products.
Why did I get warning rows? TikTok returned an empty or limited public response for that keyword/page. Try a residential proxy, lower concurrency, or re‑run the keyword.
Why are some rating or seller fields empty? TikTok doesn't expose every value for every card. Empty fields are normal for some products and regions.
Can I scrape multiple keywords?
Yes — use keywords. If keyword is also set, both are merged and deduplicated.
How do I keep exports clean?
Leave compactOutput: true and includeRawProduct: false unless debugging.
Which mode should I choose? Use Fast for broad discovery and large keyword lists. Use Full when you need SKU stock, descriptions, shipping, videos, reviews, or monitoring fields.
What happens if a Full detail request fails?
The actor preserves the Fast search row and marks it with dataLevel: "search", detailStatus: "failed", and detailError. Full enrichment is charged only after a successful detail response; current event prices are always shown in the Actor's Pricing tab.
Why are change fields empty on my first run?
The first trackChanges: true run is the baseline. Run the same region/product again to receive previous values, deltas, and sales velocity.
Do reviews contain the actual text?
Yes. reviews[].text contains each complete public review text without shortening it. reviewTexts is also provided as a simple text-only array for exports and language analysis.
🐛 Feature requests & issues
Need a new field, a different format, or a workflow this actor doesn't cover yet? Found a TikTok Shop response that doesn't parse? Open an issue on the actor page and include the run ID, your input, what you expected, and a short example of the data you need. Clear reports get fixed faster.
🏷️ Tags: tiktok shop scraper · tiktok shop search · product research · marketplace scraper · dropshipping research · best sellers · price monitoring
🔗 Built for Apify · HTTP‑only · Fast + Full · Multi‑keyword · Real pagination · Product, SKU, review, and monitoring output