TikTok Shop Reviews Scraper
Pricing
from $1.50 / 1,000 review results
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
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
0
Monthly active users
10 days ago
Last modified
Categories
Features
Share
TikTok Shop Reviews Scraper — Ratings, Photos & Variants

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
- Paste one or more product URLs (or IDs) into Products.
- Pick the Region for bare IDs (a region in the URL wins).
- Set Max reviews per product and Max total reviews.
- 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
| Code | Storefront |
|---|---|
| US | United States |
| MY | Malaysia |
| TH | Thailand |
| VN | Vietnam |
| PH | Philippines |
| SG | Singapore |
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
| Control | How it works |
|---|---|
| Review order | recommended (TikTok's ranking) or newest. Applied by TikTok. |
| Star rating | 1–5 = only that rating. Applied by TikTok, so no reviews are scanned and thrown away. |
| Only reviews with photos | Applied by TikTok, then re-checked: reviews whose media URLs TikTok does not expose (video-only reviews) are dropped, for free. |
| Only verified purchases | Applied by TikTok when it is the only active filter, otherwise checked on each row. |
| Only incentivized reviews | Checked 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"]}
publishedAfteraccepts ISO dates (2026-10-01,2026-10-01T00:00:00Z) or relative values (24h,7d,2w,3m).- Setting
publishedAfterswitches 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. skipReviewIdsremoves reviews you already have, before output and before charging.publishedBeforeadds 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
| Field | Type | Default | Description |
|---|---|---|---|
productTargets | string[] | one sample product | 1–500 product URLs or numeric IDs (required) |
region | enum | US | Storefront for bare IDs; URL region wins |
maxReviewsPerProduct | integer | 20 | Max delivered reviews per product (up to 10,000) |
maxTotalReviews | integer | 1000 | Exact run-wide ceiling on unique reviews (up to 100,000) |
sortBy | enum | recommended | recommended or newest |
starRating | integer | 0 | 0 = all; 1–5 = exact rating |
mediaOnly | boolean | false | Only reviews with photo URLs |
verifiedPurchaseOnly | boolean | false | Only verified purchases |
publishedAfter | string | — | Lower date boundary (ISO or relative) |
publishedBefore | string | — | Upper date boundary |
skipReviewIds | string[] | [] | Review IDs to skip (free) |
incentivizedOnly | boolean | false | Only incentivized reviews |
includeProductContext | boolean | true | Product title, image, shop, currency, rating, review count |
includeRatingBreakdown | boolean | true | rating1Count…rating5Count |
includeReviewerContext | boolean | true | Masked reviewer name, ID, avatar, country |
includeMedia | boolean | true | media array of photo URLs |
maxPagesPerProduct | integer | 250 | Scan guard (20 reviews/page) |
maxNoMatchPages | integer | 10 | Stop a product after this many pages in a row that deliver nothing (0 = off) |
maxRetries | integer | 2 | Retries per request on transient failures |
maxConcurrency | integer | 3 | Products in parallel (1–4) |
debugMode | boolean | false | Verbose 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:

All fields tab:

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.
| Group | Fields |
|---|---|
| Review | reviewId, rating, text (null for rating-only reviews), reviewedAt (ISO 8601) |
| Purchase | variant, skuId, variantAttributes (needs product context), verifiedPurchase, incentivized |
| Media | media[] ({ type, url }), mediaCount, hasMedia |
| Reviewer | reviewerName (masked by TikTok), reviewerId, reviewerAvatarUrl, reviewerCountry |
| Product | productId, productUrl, productTitle, productImageUrl, shopId, shopName, shopUrl, region, currency, overallRating, totalReviewCount |
| Rating breakdown | rating1Count … rating5Count |
| Lineage | sourceInput, 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:
| Field | Meaning |
|---|---|
reportedReviewCount | Total TikTok reports for the product |
uniqueReviewsSeen / reviewsDelivered | What was found and what was delivered |
isComplete | true when TikTok's feed reported no more pages for your order/filter, or the date boundary was reached |
stopReason / truncationReason | Why collection stopped: feedExhausted, publishedAfter, maxReviewsPerProduct, maxTotalReviews, maxPagesPerProduct, noMatchPages, spendingLimit, sourceError, repeatedPage, duplicateOnlyPages, timeout |
status | ok, ok_no_matches, no_reviews, partial, failed, skipped |
candidatesFetched, filteredOut, duplicatesSkipped, skippedByReviewId, outsideDateRange, pagesRequested | Scan accounting |
newestReviewAt, oldestReviewAt | Date 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
maxTotalReviewsis an exact run-wide ceiling.maxReviewsPerProductis 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, andmaxPagesPerProductcaps 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
mediaholds 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.
variantAttributesneeds 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
| Symptom | What 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 requested | Check stopReason, filteredOut and outsideDateRange in PRODUCT_SUMMARIES. |
| An input was skipped | It 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
maxNoMatchPagesscan guard (default 10), with stop reasonnoMatchPages.PRODUCT_SUMMARIES.productContextStatuscan now benot_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.