TikTok Shop Scraper | Fast Search & Full Product Data avatar

TikTok Shop Scraper | Fast Search & Full Product Data

Pricing

from $1.22 / 1,000 product results

Go to Apify Store
TikTok Shop Scraper | Fast Search & Full Product Data

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

DataForge

Maintained by Community

Actor stats

2

Bookmarked

109

Total users

65

Monthly active users

7 hours ago

Last modified

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 / ratingOften blank✅ Parsed
Free‑shipping flagRarely detected✅ From TikTok labels
Output shapeNested JSON blobs✅ Flat rows for CSV/Sheets
Browser neededOften❌ 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 forLarge searches, discovery, lead listsProduct research, monitoring, detailed exports
RequestsSearch pages onlySearch pages + one detail request per selected product + optional reviews
Core dataProduct, price, sales, rating, seller, image, badgesEverything in Fast plus description, discounts, variants, stock, options, shipping, videos, seller/business data, safety fields, reviews
Change trackingOptional price, sales velocity, and stock movement
Failure behaviorSearch issue goes to ErrorsKeeps 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)
  1. Fetch page 1 via server‑side HTML with a Chrome‑like TLS fingerprint.
  2. Follow load_more_params into TikTok's product_list API inside the same session — page after page — until maxPages or maxItems is reached.
  3. Shape → filter → sort → dedupe → save each product as a flat row.
  4. In full mode, 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 by best_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

FieldTypeDefaultWhat it does
modeenumfastfast returns lightweight search cards; full enriches each selected product.
keywordsarray["water bottle"]One or many search keywords.
keywordstringSingle keyword (simple‑input compatibility). Merged with keywords.
country_codeenumUSTikTok Shop region.
maxItemsint10Max products per keyword. 0 = no per‑keyword cap.
maxPagesint1Max search pages to walk per keyword. Raise this to go past ~30 products.
sortByenumrelevancerelevance, best_sellers, price_asc, price_desc, rating_desc.
minPrice / maxPricenumberFilter on normalized currentPrice.
minRatingnumber0Keep products at or above this rating.
minSoldCountint0Keep products at or above this sold count.
freeShippingOnlyboolfalseKeep only products TikTok tags with free shipping.
dedupebooltrueDrop duplicate products across keywords and pages.
compactOutputbooltrueRemove empty values while keeping stable columns.
includeRawProductboolfalseAttach the original TikTok card as rawProductJson (debugging).
htmlReportbooltrueSave a shareable visual product‑grid report to the key‑value store (report).
includeReviewsbooltrueFull only. Attach public customer reviews.
maxReviewsint5Full only. Reviews per product; 0 requests all available reviews.
reviewSortenumrecommendedFull only. recommended or recent.
trackChangesboolfalseFull only. Compare price, sold count, and stock with the previous run.
includeRawDetailboolfalseFull only. Attach TikTok's raw detail response as rawDetailJson for debugging.
fullConcurrencyint3Full only. Product-detail requests processed in parallel.
detailTimeoutSecint25Full only. Product-detail/review request timeout.
detailMaxRetriesint2Full only. Detail retries with a fresh session/proxy.
maxConcurrencyint1Keywords processed in parallel.
requestDelayMsint0Optional pause between pages of one keyword.
requestTimeoutSecint20HTTP request timeout.
maxRetriesint2Retries on 429/5xx, captcha and parse failures.
maxProxyRetriesint2Dedicated retry budget for proxy/transport errors.
proxyConfigurationobjectResidential USApify 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

ColumnMeaning
productId · title · productUrlProduct identity and direct link
currentPrice · originalPrice · currencyNormalized pricing
soldCount · soldTextUnits sold (number + human label)
rating · reviewCountStar rating and review volume
sellerId · sellerName · sellerUrlSeller identity and storefront
imageUrl · imageUrlsPrimary image + full list
tags · freeShippingTikTok badges and shipping signal
searchRank · sortedRankPosition in TikTok's feed vs. after your sort
dataLevel · detailStatus · detailErrorFull-enrichment status and transparent fallback reason
description · properties · optionsComplete PDP text and product configuration
variants · skuCount · skuInStockCount · totalStockQuantitySKU-level prices, properties, images, dimensions, weight, availability, and stock
discountPercent · savingsAmount · estimatedRevenueCommercial calculations derived from TikTok's public values
shipping* · delivery*Public fulfillment, fee, service, ETA, COD, and category fields
videos · videoUrls · videoCountProduct video metadata and media URLs
reviews · reviewTexts · reviewRatingBreakdownFull review objects, text-only export, and rating distribution
reviewsFetchStatus · reviewsFetchErrorcomplete, limited, disabled, or a transparent upstream error
previous* · *Change · soldVelocityPerDayOptional 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_summary record in the key‑value store OUTPUT (input scope, saved count, issues, runtime)
  • 🖼️ Visual report — with htmlReport on (default), a report record 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 the reportUrl link in OUTPUT.

🧪 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: 1 and a few pages; increase once results look stable.
  • 🐞 Raw output is for debugging only. includeRawProduct: true makes 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