TikTok Shop Search Scraper | Products, Sales & Sellers avatar

TikTok Shop Search Scraper | Products, Sales & Sellers

Pricing

from $1.22 / 1,000 product results

Go to Apify Store
TikTok Shop Search Scraper | Products, Sales & Sellers

TikTok Shop Search Scraper | Products, Sales & Sellers

Scrape TikTok Shop search results by keyword β€” no browser needed. Get product titles, prices, sellers, ratings, sold counts, images and URLs. Bulk keywords, real pagination past page 1, filters, sorting, dedupe, retries and proxy support.

Pricing

from $1.22 / 1,000 product results

Rating

0.0

(0)

Developer

Blynx

Blynx

Maintained by Community

Actor stats

0

Bookmarked

70

Total users

46

Monthly active users

6 days ago

Last modified

Share

πŸ›οΈ TikTok Shop Search Scraper

Turn any TikTok Shop keyword into a clean, spreadsheet-ready table of products β€” price, seller, rating, sold count, images, free‑shipping signals and direct links. No browser, no login, just fast HTTP.

🟒 HTTP-only ⚑ Β· πŸ”‘ Multi-keyword Β· πŸ“„ Real pagination Β· 🌍 15 regions Β· 🧾 Flat CSV/Excel output


✨ 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)

πŸ”₯ 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
  • πŸ§ͺ Log issues separately β€” failed pages go to an Errors dataset, never billed as products

πŸ—ΊοΈ 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.

πŸš€ 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"
}
}

πŸ’‘ 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
keywordsarray["water bottle"]One or many search keywords.
keywordstringβ€”Single 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 / maxPricenumberβ€”Filter 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).
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"
}

🧾 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

πŸ“Š Ready‑made table views

The main dataset ships three table views in the Output tab:

  • πŸ›οΈ 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

Two 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)

πŸ§ͺ 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.
  • 🧾 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.


πŸ› 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 Β· Multi‑keyword Β· Real pagination Β· Flat product‑card output