TikTok Shop Reviews Scraper avatar

TikTok Shop Reviews Scraper

Pricing

from $1.50 / 1,000 review results

Go to Apify Store
TikTok Shop Reviews Scraper

TikTok Shop Reviews Scraper

Scrape public TikTok Shop product reviews in bulk: star rating, text, date, photos, purchased variant, verified/incentivized flags, reviewer context and product rating data. Monitor new reviews with date and skip-ID controls. No TikTok login.

Pricing

from $1.50 / 1,000 review results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

0

Monthly active users

10 days ago

Last modified

Categories

Features

Limited permissions

Share

TikTok Shop Reviews Scraper — Ratings, Photos & Variants

TikTok Shop Reviews Scraper

Scrape public TikTok Shop buyer reviews from product URLs or IDs and export one clean row per review: star rating, text, date, photos, purchased variant, verified/incentivized flags, public reviewer context and product rating data. Use newest-first order with date and skip-ID controls to collect only new reviews on scheduled runs. No TikTok login, cookies or API key required.

⚡ Need a real-time API?

This Actor also powers the TikTok Shop API on RapidAPI. GET /reviews returns a TikTok Shop product's reviews and ratings as JSON in a single HTTP request, with a free Basic plan and no Apify account needed.

Use the API for on-demand lookups inside your app. Use this Actor for bulk runs, schedules, datasets and integrations.

What this Actor does

  • Takes up to 500 TikTok Shop product URLs or numeric product IDs.
  • Returns one row per unique public review, with product, shop and variant context attached.
  • Stops exactly at your limits: per product, per run, by date, or at your spending limit.
  • Reports how complete each product's collection was, instead of claiming "all reviews".
  • Only charges for unique reviews delivered. Duplicates, skipped IDs and filtered rows are free.

Good for: finding 1–2 star complaints before sourcing a product, comparing feedback across competing listings, spotting variant-specific defects, collecting photo reviews (UGC), measuring verified and incentivized review share, monitoring new reviews on your own or competitor products, and building sentiment or topic datasets.

Quick start

  1. Paste one or more product URLs (or IDs) into Products.
  2. Pick the Region for bare IDs (a region in the URL wins).
  3. Set Max reviews per product and Max total reviews.
  4. Click Start.

Running with the defaults returns 20 reviews (one page) from one public US product, which is a quick way to see the output format.

{
"productTargets": ["https://www.tiktok.com/shop/pdp/your-product/1731649211243074211"],
"region": "US",
"maxReviewsPerProduct": 100,
"maxTotalReviews": 500,
"sortBy": "recommended"
}

Supported TikTok Shop regions

CodeStorefront
USUnited States
MYMalaysia
THThailand
VNVietnam
PHPhilippines
SGSingapore

These are the storefronts where we have tested the review feed with native products. The UK (GB) storefront is not supported because its review feed is currently unavailable. Indonesia, Japan and Mexico are not listed either. A URL from an unsupported storefront is skipped with a warning and is not charged.

Accepted product URL / ID formats

  • https://www.tiktok.com/shop/pdp/<slug>/<productId>
  • https://shop.tiktok.com/<region>/pdp/<slug>/<productId>
  • https://www.tiktok.com/view/product/<productId>
  • https://shop.tiktok.com/view/product/<productId>?region=MY
  • <productId> (e.g. 1731649211243074211)

Shop pages, videos, search pages and non-TikTok links are rejected with a clear warning. Duplicate products are merged before any work starts. Every original input is kept in sourceInput and in the per-product summary.

Review order and filters

ControlHow it works
Review orderrecommended (TikTok's ranking) or newest. Applied by TikTok.
Star rating1–5 = only that rating. Applied by TikTok, so no reviews are scanned and thrown away.
Only reviews with photosApplied by TikTok, then re-checked: reviews whose media URLs TikTok does not expose (video-only reviews) are dropped, for free.
Only verified purchasesApplied by TikTok when it is the only active filter, otherwise checked on each row.
Only incentivized reviewsChecked on each fetched row.

TikTok applies one filter per request. If you combine filters, the first one in the priority order star rating → photos → verified is applied by TikTok and the others are checked on each row. Filters checked on each row can mean more pages are scanned per delivered review, and very restrictive combinations can return fewer rows than you asked for. Filtered-out rows are never charged. If 10 pages in a row (200 reviews) deliver nothing, the product stops with truncationReason: "noMatchPages". Change this with maxNoMatchPages. maxPagesPerProduct caps the scan overall.

Incremental / new-review monitoring

{
"productTargets": ["1731649211243074211", "1729408816995078528"],
"region": "US",
"maxReviewsPerProduct": 500,
"maxTotalReviews": 1000,
"sortBy": "newest",
"publishedAfter": "7d",
"skipReviewIds": ["7700394439423919885"]
}
  • publishedAfter accepts ISO dates (2026-10-01, 2026-10-01T00:00:00Z) or relative values (24h, 7d, 2w, 3m).
  • Setting publishedAfter switches to newest-first order automatically. Each product's scan stops as soon as it passes the date boundary, so a daily run only reads the first page or two.
  • skipReviewIds removes reviews you already have, before output and before charging.
  • publishedBefore adds an optional upper boundary.

Negative-review research:

{
"productTargets": ["1731649211243074211"],
"region": "US",
"maxReviewsPerProduct": 1000,
"maxTotalReviews": 1000,
"sortBy": "newest",
"starRating": 1
}

To collect both 1 and 2 star reviews, run once with starRating: 1 and once with starRating: 2.

Sample input from a real run (it produced the sample output below). The URL and the bare ID point to the same product, so they are merged and the product is scanned once:

{
"productTargets": [
"https://shop.tiktok.com/us/pdp/x/1731649211243074211",
"1731649211243074211"
],
"region": "US",
"maxReviewsPerProduct": 30,
"maxTotalReviews": 30,
"starRating": 1,
"publishedAfter": "365d"
}

This returned 30 one-star reviews in newest-first order (TikTok reports 86 one-star reviews for the product), from 2 review pages and 1 product-detail lookup.

Input reference

FieldTypeDefaultDescription
productTargetsstring[]one sample product1–500 product URLs or numeric IDs (required)
regionenumUSStorefront for bare IDs; URL region wins
maxReviewsPerProductinteger20Max delivered reviews per product (up to 10,000)
maxTotalReviewsinteger1000Exact run-wide ceiling on unique reviews (up to 100,000)
sortByenumrecommendedrecommended or newest
starRatinginteger00 = all; 1–5 = exact rating
mediaOnlybooleanfalseOnly reviews with photo URLs
verifiedPurchaseOnlybooleanfalseOnly verified purchases
publishedAfterstring—Lower date boundary (ISO or relative)
publishedBeforestring—Upper date boundary
skipReviewIdsstring[][]Review IDs to skip (free)
incentivizedOnlybooleanfalseOnly incentivized reviews
includeProductContextbooleantrueProduct title, image, shop, currency, rating, review count
includeRatingBreakdownbooleantruerating1Count…rating5Count
includeReviewerContextbooleantrueMasked reviewer name, ID, avatar, country
includeMediabooleantruemedia array of photo URLs
maxPagesPerProductinteger250Scan guard (20 reviews/page)
maxNoMatchPagesinteger10Stop a product after this many pages in a row that deliver nothing (0 = off)
maxRetriesinteger2Retries per request on transient failures
maxConcurrencyinteger3Products in parallel (1–4)
debugModebooleanfalseVerbose logs, secrets never logged

Output fields

One row per review (recordType: "review"). Every field is always present. Values TikTok does not expose, or that you turned off, are null. Nothing is invented.

The samples below come from a real run: the 1-star reviews from the last 365 days of one US product, using the "Sample input from a real run" above. Long CDN query strings are shortened.

Output preview

Reviews tab:

Reviews table view

All fields tab:

All fields table view

Sample record — Reviews tab

{
"productTitle": "DRMITSUI Seiyaku FARINFRARED BonePainPatch Thermal Patches 6 Patches Bag for Recommended Use",
"rating": 1,
"text": "I’m not saying the product doesn’t work. It just didn’t do any thing for me sorry.",
"reviewedAt": "2026-09-24T06:00:51.607Z",
"variant": "2 bags",
"verifiedPurchase": true,
"incentivized": false,
"reviewerName": "T**y",
"mediaCount": 0,
"reviewId": "7688977697074333454",
"productId": "1731649211243074211",
"region": "US"
}

Sample record — All fields (a photo review)

{
"recordType": "review",
"reviewId": "7620952175421703950",
"productId": "1731649211243074211",
"productUrl": "https://shop.tiktok.com/us/pdp/x/1731649211243074211",
"productTitle": "DRMITSUI Seiyaku FARINFRARED BonePainPatch Thermal Patches 6 Patches Bag for Recommended Use",
"productImageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/b12ff44cc34d469e98143e219098f0ae~tplv-fhlh96nyum-crop-webp:800:800.webp",
"shopId": "7495809471398382243",
"shopName": "DRMITSUI Global Store",
"shopUrl": "https://shop.tiktok.com/us/store/drmitsui-global-store/7495809471398382243",
"region": "US",
"currency": "USD",
"overallRating": 4.3,
"totalReviewCount": 717,
"rating1Count": 86,
"rating2Count": 20,
"rating3Count": 42,
"rating4Count": 71,
"rating5Count": 498,
"rating": 1,
"text": "No sirven solo queman la piel",
"reviewedAt": "2026-03-24T22:26:59.212Z",
"variant": "1 bag",
"skuId": "1732083369415578275",
"variantAttributes": null,
"verifiedPurchase": true,
"incentivized": false,
"reviewerName": "e**s",
"reviewerId": null,
"reviewerAvatarUrl": null,
"reviewerCountry": "US",
"media": [
{
"type": "image",
"url": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/69ae010b8d9546ef8d1f38f5c49034db~tplv-fhlh96nyum-crop-webp:300:300.webp"
}
],
"mediaCount": 1,
"hasMedia": true,
"sourceInput": "https://shop.tiktok.com/us/pdp/x/1731649211243074211",
"scrapedAt": "2026-11-02T11:44:03.471Z"
}

Rating-only reviews have "text": null. variantAttributes is filled when the product lists properties for that SKU (e.g. { "Quantity": "2 bags" } on this product's two-bag SKU) and is null otherwise. reviewerId and reviewerAvatarUrl are null when TikTok hides them.

GroupFields
ReviewreviewId, rating, text (null for rating-only reviews), reviewedAt (ISO 8601)
Purchasevariant, skuId, variantAttributes (needs product context), verifiedPurchase, incentivized
Mediamedia[] ({ type, url }), mediaCount, hasMedia
ReviewerreviewerName (masked by TikTok), reviewerId, reviewerAvatarUrl, reviewerCountry
ProductproductId, productUrl, productTitle, productImageUrl, shopId, shopName, shopUrl, region, currency, overallRating, totalReviewCount
Rating breakdownrating1Count … rating5Count
LineagesourceInput, scrapedAt

Dataset views

Reviews, Review Text & Variants, Media Reviews, Product & Rating Context, Reviewer Context and Full Data. Views show different columns of the same rows, so nothing is billed twice. Apify views can select columns but cannot filter rows. For negative, photo or verified-only datasets, use the starRating, mediaOnly and verifiedPurchaseOnly inputs, which also avoid paying for rows you don't want.

Product and rating context

Product context (title, image, shop, currency, overall rating, total review count, SKU attributes) is fetched once per product and attached to every review row. It is fetched only when the product has a review to deliver, so a product with no new or matching reviews costs one lookup instead of two. The 1–5 star breakdown comes with the first review page. Both are free. If product context can't be fetched, reviews still arrive, and the product title falls back to the one in the review feed.

Review depth and completeness

TikTok does not always expose a product's full review history, and the reported review count can be higher than the number of reviews you can actually page through. This Actor does not claim "all reviews". Instead, the key-value store record PRODUCT_SUMMARIES reports for every product:

FieldMeaning
reportedReviewCountTotal TikTok reports for the product
uniqueReviewsSeen / reviewsDeliveredWhat was found and what was delivered
isCompletetrue when TikTok's feed reported no more pages for your order/filter, or the date boundary was reached
stopReason / truncationReasonWhy collection stopped: feedExhausted, publishedAfter, maxReviewsPerProduct, maxTotalReviews, maxPagesPerProduct, noMatchPages, spendingLimit, sourceError, repeatedPage, duplicateOnlyPages, timeout
statusok, ok_no_matches, no_reviews, partial, failed, skipped
candidatesFetched, filteredOut, duplicatesSkipped, skippedByReviewId, outsideDateRange, pagesRequestedScan accounting
newestReviewAt, oldestReviewAtDate range delivered

RUN_SUMMARY has run-wide totals: products processed/failed, candidates, delivered, duplicates, filtered, pages, rate-limit and retry counts, duration and the overall stop reason.

Cost controls

  • maxTotalReviews is an exact run-wide ceiling. maxReviewsPerProduct is an exact per-product ceiling.
  • Spending limit: if you set a maximum cost per run, the Actor delivers only as many reviews as it allows and then stops.
  • Scan guards: maxNoMatchPages (default 10) stops a product after a run of pages that deliver nothing, and maxPagesPerProduct caps the total pages per product.
  • Dedupe before charging: a review is charged once per run, even if two inputs point to the same product.

Pricing

Pay per event: you pay per unique review delivered to the dataset (review-result). There is no start fee.

Free: duplicate reviews, skipped review IDs, filtered-out reviews, invalid or unsupported inputs, products with zero reviews, failed product fetches, product context, rating breakdown, and the RUN_SUMMARY / PRODUCT_SUMMARIES records.

See the Pricing tab for current rates. This README deliberately doesn't quote figures.

Performance

Reviews are written page by page (20 per page), so the first rows usually appear within seconds, and earlier pages are kept even if a later page fails. Products are processed in parallel (up to 4). Throughput depends on TikTok's rate limits, which come and go, so we don't publish a reviews-per-minute figure.

No-login / transport posture

  • You don't need a TikTok account, cookies, session IDs, seller credentials or API key.
  • It doesn't run a browser or need a proxy. Review data is fetched as JSON through a hosted TikTok Shop data API.
  • Your URLs are never fetched. The Actor only reads the product ID and storefront from them.

Limitations

  • Only the storefronts listed above are supported.
  • Reviewer names are masked by TikTok (e.g. n**o r**o) and may be missing. They are passed through as-is.
  • Video review media is not supported: TikTok's feed doesn't expose video URLs, so media holds photo URLs only.
  • The reported review count can be higher than the number of accessible reviews. Hidden, deleted or private reviews can't be recovered.
  • variantAttributes needs product context. variant (e.g. "2 bags") is always available when TikTok shows it.
  • TikTok's review feed sometimes throttles. The Actor retries with backoff and reports failures per product. A failed product never stops the batch and is never charged.

Troubleshooting

SymptomWhat to do
A product shows status: "failed", errorType: "rate_limited_or_blocked"TikTok throttled the review feed. Re-run later, or raise maxRetries. Nothing was charged for it.
status: "no_reviews"The product has no public reviews in that storefront.
status: "ok_no_matches"Reviews exist, but none matched your filters or date window.
Fewer rows than requestedCheck stopReason, filteredOut and outsideDateRange in PRODUCT_SUMMARIES.
An input was skippedIt wasn't a product URL/ID, or its storefront isn't supported. See invalidInputs in RUN_SUMMARY.

API and integrations

Call it from the Apify API, the JavaScript or Python clients, Make, Zapier, n8n or any HTTP client. Small jobs (a few hundred reviews) work well with the synchronous run-and-get-dataset endpoint. For large or scheduled jobs, run it asynchronously and read the dataset when the run finishes. reviewId and productId are stable, so you can upsert into a warehouse and feed new IDs back as skipReviewIds.

Privacy and responsible use

This Actor collects only publicly visible TikTok Shop review data. Reviewer information is pseudonymous or masked but may still count as personal data under applicable laws. The Actor doesn't unmask names, infer real identities or sensitive traits, or look up emails or social profiles. You are responsible for using the data lawfully and in line with TikTok's terms and applicable privacy and data-protection law.

Changelog

  • 1.0 update (2026-11-03) — Product context is fetched only for products that deliver reviews (faster monitoring runs). New maxNoMatchPages scan guard (default 10), with stop reason noMatchPages. PRODUCT_SUMMARIES.productContextStatus can now be not_needed.
  • 1.0 — Initial release: bulk product URLs/IDs, six storefronts, recommended/newest order, star/photo/verified/incentivized filters, date window and skip IDs for incremental runs, product and rating context, per-product completeness reporting, and pay-per-review charging with dedupe before billing.