TikTok Shop Scraper - Products, Prices, Sales & Reviews (US) avatar

TikTok Shop Scraper - Products, Prices, Sales & Reviews (US)

Pricing

from $1.99 / 1,000 products

Go to Apify Store
TikTok Shop Scraper - Products, Prices, Sales & Reviews (US)

TikTok Shop Scraper - Products, Prices, Sales & Reviews (US)

Search TikTok Shop US by keyword or paste product links for public product data: title, price and original price, discount, units sold, rating, review count, shop, images and URL - plus the product page's public reviews. No login, no cookies. Anything cut short is labelled, never reported as zero.

Pricing

from $1.99 / 1,000 products

Rating

0.0

(0)

Developer

Lantern Lab

Lantern Lab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

TikTok Shop Scraper — Products, Prices, Sales & Reviews (US)

A Lantern Lab Actor. Give it TikTok Shop keywords or product links and get back each product's title, price and original price, discount, units sold, rating, review count, shop, images and product URL — and, if you switch reviews on, the reviews the product page shows publicly, with rating, text, post date and country. United States storefront. No TikTok login, no cookies, no account of yours.

Price: you pay per product row and per review row. Keywords that return nothing, dead links, status rows, the run summary and any product row TikTok Shop served with the price masked are free, and there is no run-start fee.

What you get

  • Products from a keyword search, in result order, or from product links / bare product IDs.
  • price and originalPrice with discount and currency. For a product sold in a range, price is the low end and priceMax the high end. originalPrice is only the struck-through price the page actually shows; a product on sale at its list price gets null, not a made-up "was" figure. When TikTok Shop masks the price for logged-out visitors — it shows $7** - 8** on some products — price is null, priceHidden is true, the row is marked partial and you are not charged for it. It is never a guess and never 0.
  • soldCount, rating, reviewCount, shopName with shop ID and shop rating, and the product URL TikTok Shop itself publishes.
  • imageUrls — every product image from a product link, the result-list image from a keyword.
  • Reviews (optional): rating, text, publishedAt, reviewerCountry, verified-purchase flag, the review's own photos and the display name the page shows — TikTok Shop masks that itself (L**), and the reviewer's account ID and avatar are left alone. Each review is linked to its product by productId.
  • Clear status for every input. A keyword that returned nothing, a product ID TikTok Shop does not have, and an input cut short by a limit are three different, labelled records — never confused, and a blocked request is never reported as zero results.
  • No duplicates. A product found by several keywords (or by a keyword and a link) is written and charged once; so is a review.
  • Two platform-specific timestamps kept apart. collectedAt is when this run read the page; publishedAt on a product row is always null, because TikTok Shop publishes no listing date. On a review row publishedAt is the platform's own post time.
  • A hard request ceiling. maxUpstreamRequests caps the run; leave it empty and the Actor derives one from your input.

Input example

{
"searchQueries": ["coffee grinder", "air fryer"],
"productUrls": ["https://www.tiktok.com/shop/pdp/coffee-grinder-electric/1732083256138699473"],
"region": "US",
"maxProducts": 30,
"includeReviews": false
}
FieldDefaultMeaning
searchQueries—One keyword per line. Use this, productUrls, or both.
productUrls—Product links or bare product IDs. shop.tiktok.com links and links without the slug work too.
regionUSStorefront to read. This version supports US only.
maxProducts30Products to take per keyword, from the top of the result page.
includeReviewsfalseAlso return the product page's public reviews, one row each.
maxReviewsPerProduct5Reviews per product. TikTok Shop shows at most 5 publicly.
maxUpstreamRequestsderivedHard ceiling on requests to TikTok Shop for the whole run, retries included.
proxyConfigurationApify ProxyDatacenter is the default and what this Actor is measured on.

Output example

A product row (recordType: "product"):

{
"recordType": "product",
"productId": "1732083256138699473",
"title": "coffee grinder, Spice Grinder Electric with Stainless Steel Blades",
"price": 16.89,
"priceMax": null,
"originalPrice": 25,
"discount": "-32%",
"currency": "USD",
"priceHidden": false,
"priceText": "$16.89",
"soldCount": 85,
"rating": 4.5,
"reviewCount": 11,
"shopName": "REDSUNSHOP",
"shopId": "7495952906928491217",
"shopRating": 4.2,
"region": "US",
"imageUrls": ["https://p16-oec-general-useast5.ttcdn-us.com/..."],
"skuCount": 1,
"stockTotal": 499,
"availability": "default",
"url": "https://www.tiktok.com/shop/pdp/coffee-grinder-electric/1732083256138699473",
"publishedAt": null,
"fieldSource": "product_url",
"sourceType": "product_url",
"sourceQuery": null,
"sourceProductUrl": "https://www.tiktok.com/shop/pdp/coffee-grinder-electric/1732083256138699473",
"rank": null,
"partial": false,
"partialReason": null,
"collectedAt": "2026-10-24T03:12:44.182Z"
}

A review row (recordType: "review"):

{
"recordType": "review",
"reviewId": "7647381888391808781",
"productId": "1729385034780414637",
"rating": 5,
"text": "Great product. Easy setup. Fast shipping.",
"publishedAt": "2026-04-08T09:57:48.000Z",
"reviewerCountry": "US",
"isVerifiedPurchase": true,
"imageUrls": ["https://p16-oec-general-useast5.ttcdn-us.com/..."],
"nickname": "L**",
"helpfulCount": null,
"productUrl": "https://www.tiktok.com/shop/pdp/1729385034780414637",
"partial": false,
"partialReason": null,
"collectedAt": "2026-10-24T03:12:48.903Z"
}

Every keyword also gets one free query_status row and every link one free product_status row, and the last row of the dataset is RUN_SUMMARY (also in the key-value store under RUN_SUMMARY): products and reviews collected, how many of them were charged, duplicates skipped, products with a hidden price, which inputs are incomplete and why, how many requests went to TikTok Shop, and whether the run stopped early.

Limits — read these before you run

  1. 30 products per keyword. TikTok Shop's public search page serves one page of results and ignores the paging parameters in the URL, so a keyword cannot return more than about 30 products however high you set maxProducts. It also renders that page at two sizes for the same keyword — 25-30 results, or 5 that claim to be complete — so the Actor asks again from a new IP while the page comes back short and keeps the largest rendering; searchAttempts on the keyword's status row says how many it needed. The status row also says when the page held more than you asked for (max_products_reached) and when TikTok Shop itself said there is more behind a cursor only its own app can follow (platform_search_limit). Use several narrower keywords, or product links, to go wider.
  2. 5 reviews per product. The public product page shows only its first screen of reviews. A product with more gets a reviews_status row saying how many of how many arrived (platform_review_limit). Reading every review of a product is not possible without logging in, which this Actor does not do.
  3. TikTok Shop has no "no results" page for a keyword. Search for something nothing matches and it fills the result list with unrelated recommendations under a "Results for …" heading. This Actor returns what the page holds rather than inventing an empty result, so check the titles before trusting a very narrow keyword.
  4. Some prices are hidden from logged-out visitors. Those rows carry priceHidden: true, price: null and partial: true, and everything else the page published — and they are free: a row missing a field this Actor promises is not charged, and it does not consume your run's maximum charge either. RUN_SUMMARY reports them as productsWithHiddenPrice, and productsCharged excludes them. Which products those are is decided per visit, not per product: the same product can answer with a price on one read and a masked one on the next.
  5. A price is what TikTok Shop showed at collectedAt, not a stable attribute. TikTok Shop runs per-session promotions, so the same product can read $59.99, $27.99 and $31.43 within a quarter of an hour, and a product row from a keyword can differ from the same product's own page read minutes later. price is always the figure the page carried on the request this row came from; fieldSource says which page that was. Re-read a product rather than treating one row as its list price.
  6. Occasional security checks. TikTok Shop answers some requests with a captcha page instead of the data. Each retry leaves from a new IP, and a request that keeps being refused is reported as blocked on the input's status row — never as an empty result. If a run sees many of them, switch proxyConfiguration to residential.
  7. United States only. Other storefronts are refused at input validation rather than returning a US catalogue under the wrong label.
  8. Public pages only. This Actor reads the same pages a logged-out visitor sees, at /shop/pdp/… and /shop/s, and it does not read anything TikTok's robots.txt disallows. From a review it takes only what the page shows: the already-masked display name, rating, text, date, country and the review's own photos — not the reviewer's account ID and not their avatar.