# Tiktiok Shop Product Reviews (`reviewly/tiktiok-shop-product-reviews`) Actor

Scrapes every review from any TikTok Shop product page: rating, text, photos, variant, reviewer name/country, verified & incentivized flags. Includes product title, price, per-SKU stock, sold count, category, rating breakdown, shop stats. Sort by newest or filter by star rating

- **URL**: https://apify.com/reviewly/tiktiok-shop-product-reviews.md
- **Developed by:** [Reviewly](https://apify.com/reviewly) (community)
- **Categories:** E-commerce, Social media, Developer tools
- **Stats:** 2 total users, 1 monthly users, 91.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## TikTok Shop Product Reviews Scraper

**Export every review from any TikTok Shop product in seconds — full text, star rating, photos, dates and buyer details — plus the product's live price, stock and seller stats.**

Paste a product link. Get a clean, structured dataset. No browser automation, no login, no API keys.

- ⚡ **Fast** — 971 reviews in under 10 seconds, 3,360 reviews in 16 seconds
- 🎯 **Complete** — collects the *entire* review history, not the first page
- 💰 **Real prices** — the sale price, original price and discount TikTok hides from scrapers
- 📸 **Rich data** — review photos, verified-purchase flags, purchased variant, buyer country
- 📊 **Ready to use** — export to Excel, CSV, JSON or Google Sheets in one click

***

### 📌 What this Actor does

This **Apify Actor** scrapes **TikTok Shop product reviews** at scale. You give it one or more TikTok Shop product URLs; it returns one clean record per product with every review nested inside.

It solves a real problem: TikTok Shop shows you a handful of reviews at a time behind an infinite scroll, and offers no export. Copying thousands of reviews by hand is impossible. This **web scraping** tool turns any product page into a spreadsheet in seconds.

#### Who it's for

| You are… | You use it to… |
|---|---|
| **E-commerce seller / brand** | Monitor your own reviews and your competitors', catch quality complaints early |
| **Product researcher / dropshipper** | Validate winning products before you buy inventory |
| **Market researcher / analyst** | Mine thousands of real customer opinions for a category |
| **Marketing / agency team** | Pull social proof, testimonials and UGC photos for campaigns |
| **Developer / data team** | Feed a clean review feed into dashboards, LLMs or sentiment models |

***

### ✨ Key features

- **Every review, not a sample.** Pages through the full history until there is nothing left — thousands of reviews per product.
- **The real price.** TikTok deliberately masks prices from non-browser clients (you get `"*"` instead of `7.84`). This Actor fetches the genuine sale price, original price, discount percentage, per-variant prices and live stock.
- **Review photos included.** Direct image URLs for every customer photo.
- **Filter by star rating.** Pull only 1-star reviews to find product problems, or only 5-star for testimonials.
- **Sort by newest.** Ideal for scheduled runs that track new reviews over time.
- **Full product context.** Title, description, images, SKUs, sold count, category path and the seller's shop rating, follower count and total sales.
- **Accepts any link format.** Full `tiktok.com/shop/pdp/...` URLs, `shop.tiktok.com` regional URLs, or just the bare product ID.
- **Honest reporting.** A `partial` flag tells you when a run couldn't reach everything — you never get a truncated export silently labelled complete.
- **Multiple products per run.** Queue a whole competitor catalogue in one go.

***

### 🧠 Why this Actor is different

Most TikTok Shop scrapers drive a headless browser, which is slow, expensive and fragile. This one talks to TikTok's own data endpoints directly.

**1. It's genuinely fast and cheap.** No Chrome instance means low memory and low compute cost. A 3,370-review product finishes in about 16 seconds.

**2. It gets the real price.** TikTok serves fake, masked prices to automated clients — `"*"` for `7.84`, `"2*"` for `20.00`. Naive scrapers parse `"2*"` as **$2 for a $20 product** and quietly poison your dataset. This Actor retrieves the true price from a separate endpoint and refuses to guess when a value is masked.

**3. It doesn't stop early.** TikTok's API intermittently answers with an empty-but-successful-looking response. Treating that as "no more reviews" truncates big products at around 1,000 reviews while reporting success. This Actor detects and retries it — which is how it reliably reaches 3,360 reviews where a naive implementation stops at 995.

**4. The numbers check out.** On a 971-review product, the star ratings collected match TikTok's own published breakdown *exactly* (62 × 1★, 33 × 2★, 58 × 3★, 120 × 4★, 698 × 5★). Nothing is missing, nothing is duplicated.

**5. It's transparent about limits.** See the FAQ for what TikTok itself does not expose. No overclaiming.

***

### ⚙️ Input configuration

#### Minimal example

```json
{
  "startUrls": [
    { "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper/1731578642912612516" }
  ]
}
```

#### Full example

```json
{
  "startUrls": [
    { "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper/1731578642912612516" },
    { "url": "https://shop.tiktok.com/us/pdp/catnip-chew-toy/1731791261654290596" },
    { "url": "1731466511483113636" }
  ],
  "maxReviews": 0,
  "sortBy": "newest",
  "ratingFilter": "all",
  "includePrice": true,
  "pageSize": 500,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Fields

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | *required* | TikTok Shop product pages. Accepts `www.tiktok.com/shop/pdp/<slug>/<id>`, `shop.tiktok.com/<region>/pdp/<slug>/<id>`, or a bare product ID like `1731578642912612516`. The slug is ignored — only the trailing ID matters. |
| `maxReviews` | integer | `0` | Stop after this many reviews per product. `0` collects everything. |
| `sortBy` | select | `relevance` | `relevance` matches what the product page shows. `newest` returns the most recent first. |
| `ratingFilter` | select | `all` | Collect only `1`, `2`, `3`, `4` or `5` star reviews. |
| `includePrice` | boolean | `true` | Fetch the real price, per-variant prices and live stock (one extra request per product). |
| `pageSize` | integer | `500` | Reviews per request, up to 1500. |
| `requestDelayMs` | integer | `0` | Pause between requests. |
| `proxyConfiguration` | proxy | Residential, US | Proxy settings — see tips below. |
| `debug` | boolean | `false` | Verbose logging for troubleshooting. |

#### 💡 Tips for best results

- **Match the proxy country to the storefront.** A `/us/` product needs a US proxy. TikTok redirects mismatched regions to its homepage, and the Actor will report that the product wasn't found.
- **Use `sortBy: "newest"` for scheduled runs.** Combine with `maxReviews: 100` to cheaply capture only what's new since yesterday.
- **Use `ratingFilter: "1"` for product research.** Negative reviews are where the actionable insight lives — and it's far cheaper than pulling everything.
- **Leave `pageSize` at 500.** It's the sweet spot between fewer requests and manageable response sizes.
- **Turn off `includePrice`** if you only want review text — it saves one request per product.

***

### 📤 Output format

**One record per product, with all reviews nested inside.** This keeps product context and reviews together, so you don't need a join.

#### Sample output

```json
{
  "productId": "1731791261654290596",
  "productUrl": "https://shop.tiktok.com/us/pdp/x/1731791261654290596",
  "region": "us",
  "title": "Potaroma Interactive Catnip Chew Toy with [6000mg A+ Organic Catnip]…",
  "description": "100% Organic Catnip Inside — Relieves Stress, Triggers Instinct…",
  "images": ["https://p16-oec-general-useast5.ttcdn-us.com/…webp"],
  "price": 12.59,
  "originalPrice": 16.99,
  "currency": "USD",
  "discountPercent": 26,
  "skus": [
    {
      "skuId": "1731791107165294756",
      "name": "ACCU-Potaroma-JMBZ",
      "specification": "Default",
      "price": 12.59,
      "originalPrice": 16.99,
      "stock": 5431
    }
  ],
  "soldCount": 35121,
  "rating": 4.6,
  "reviewCount": 3370,
  "ratingBreakdown": { "1": 135, "2": 83, "3": 160, "4": 254, "5": 2738 },
  "categories": ["Pet Supplies", "Dog & Cat Accessories", "Cat Toys", "Catnip Toys"],
  "shopId": "7495813075786500260",
  "shopName": "Potaroma LLC",
  "shopUrl": "https://shop.tiktok.com/us/store/potaroma-llc/7495813075786500260",
  "shopRating": 4.4,
  "shopFollowers": 12240,
  "shopSoldCount": 182114,
  "shopProductCount": 60,
  "reviewsAvailable": 3370,
  "reviewsCollected": 3360,
  "partial": false,
  "scrapedAt": "2026-08-12T12:21:15.040Z",
  "reviews": [
    {
      "reviewId": "7578995850673604366",
      "rating": 5,
      "text": "My cats absolutely went crazy for these. They could smell it through the mail…",
      "date": "2025-12-01T20:55:16.901Z",
      "reviewerName": "K**0",
      "reviewerId": "7048016581158585350",
      "reviewerAvatar": "https://p16-common-sign.tiktokcdn-us.com/…jpg",
      "images": ["https://p16-oec-general-useast5.ttcdn-us.com/…webp"],
      "skuId": "1731791107165294756",
      "skuSpecification": "Default",
      "country": "US",
      "verifiedPurchase": true,
      "incentivized": false
    }
  ]
}
```

#### Product fields

| Field | Description |
|---|---|
| `productId`, `productUrl`, `region` | Product identity and storefront |
| `title`, `description` | Product name and full description text |
| `images`, `videos` | Product media URLs |
| `price`, `originalPrice`, `currency`, `discountPercent` | Current pricing |
| `skus[]` | Each variant: `skuId`, `name`, `specification`, `price`, `originalPrice`, `stock` |
| `soldCount` | Units sold |
| `rating`, `reviewCount` | Average star rating and TikTok's total review count |
| `ratingBreakdown` | Review count per star, `1` through `5` |
| `categories` | Category path, root to leaf |
| `shopId`, `shopName`, `shopUrl`, `shopLogo` | Seller identity |
| `shopRating`, `shopFollowers`, `shopSoldCount`, `shopProductCount` | Seller reputation |
| `reviewsAvailable` | How many reviews this query could reach |
| `reviewsCollected` | How many were actually collected |
| `partial` | `true` if the run stopped short of everything available |
| `scrapedAt` | ISO timestamp of the run |

#### Review fields

| Field | Description |
|---|---|
| `reviewId` | Unique review identifier |
| `rating` | 1–5 stars |
| `text` | The review text |
| `date` | ISO 8601 timestamp |
| `reviewerName` | Buyer's display name (TikTok masks these — see FAQ) |
| `reviewerId`, `reviewerAvatar` | Buyer ID and profile picture |
| `images[]` | Customer photo URLs |
| `skuId`, `skuSpecification` | Which variant was purchased |
| `country` | Buyer's country code |
| `verifiedPurchase` | Confirmed buyer |
| `incentivized` | Review given in exchange for a free or discounted product |

***

### ▶️ How to use

#### On the Apify platform (no code)

1. Open the Actor and click **Try for free**.
2. Paste your TikTok Shop product URLs into **Start URLs** — one per line, or click *Add* for each.
3. *(Optional)* Set **Max reviews per product**, pick a **star rating filter**, or switch sorting to **Newest first**.
4. Click **Start**.
5. When it finishes, open the **Dataset** tab and click **Export** → choose **Excel**, **CSV**, **JSON** or **Google Sheets**.

That's it — no configuration needed for a first run.

#### Where to find a product URL

Open any TikTok Shop product, copy the address bar. It looks like:

```
https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma/1731578642912612516
```

The long number at the end is the product ID — you can paste just that if you prefer.

#### Run it on a schedule

Use Apify **Schedules** to run daily or weekly. Set `sortBy: "newest"` and `maxReviews: 100` to capture new reviews cheaply, then build a monitoring dashboard or an alert on negative sentiment.

#### Call it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR~tiktok-shop-product-reviews-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "startUrls": [{ "url": "1731578642912612516" }] }'
```

The Actor also works with the official Apify clients for **JavaScript** and **Python**.

***

### 📈 Use cases

**1. Competitor review mining.** Pull every review from your top 10 competitors' bestsellers, filter to 1- and 2-star, and build a list of the exact complaints their customers have. Then fix those things in your own product listing and ad copy.

**2. Product validation before you buy stock.** Before committing to inventory, export the full review history of a trending product. Check whether the 4.6★ average is built on 3,000 genuine reviews or padded with incentivized ones — the `incentivized` and `verifiedPurchase` flags make this a one-column filter.

**3. Automated review monitoring.** Schedule a daily run sorted by newest. Push new 1- and 2-star reviews to Slack or email so your support team responds within hours, not weeks.

**4. Social proof and UGC harvesting.** Filter to 5-star reviews with photos and you have a ready-made library of customer testimonials and user-generated images for ads, landing pages and email campaigns.

**5. Category-level market research.** Run the Actor across dozens of products in a niche, then feed the combined review text to an LLM or sentiment model. Surface what buyers in that category actually care about — sizing, durability, shipping speed — backed by thousands of real data points.

***

### 🛠️ Advanced tips

**Performance.** The default `pageSize: 500` returns roughly 1,000 reviews per two requests. Raising it to 1,500 cuts request count on very large products; lowering it makes each response smaller on a slow connection. Most products complete in a handful of requests either way.

**Proxies.** Residential proxies with the country matched to the storefront are the most reliable setting, and the default. Datacenter proxies also work — no rate limiting was observed in testing (40 consecutive requests all succeeded) — so try them if you want to reduce cost on large runs.

**Scaling to many products.** Add all URLs to a single run rather than starting one run per product — the HTTP and proxy session is reused across products, and you pay Apify's per-run startup once instead of many times. Each product is written to the dataset as soon as it finishes, so an interrupted or migrated run keeps everything already collected.

**Cost control.** Set `maxReviews` when you only need a representative sample, and turn `includePrice` off when you don't need pricing. Both cut work per product.

**Non-US storefronts.** Set `apifyProxyCountry` to match the region in your URL. A UK product URL with a US proxy will not resolve.

***

### ❓ FAQ and troubleshooting

**Why are reviewer names masked, like `J** o**n`?**
That's how TikTok publishes them. The platform masks buyer names on its own website for privacy, and there is no unmasked version available to anyone — including this Actor.

**The Actor collected 3,360 reviews but the product says 3,370. Is something missing?**
No. TikTok's headline count includes a small number of reviews it filters out of its own pages — hidden, removed or moderated entries. You are getting everything the platform actually serves. The `reviewsCollected` and `reviewsAvailable` fields make the difference explicit, and `partial` stays `false` because nothing was lost on our side.

**A run finished with `partial: true`. What now?**
Something stopped the sweep early — usually a temporary network or proxy problem. Simply re-run it; the Actor retries aggressively, so a repeat run almost always completes. If it persists, enable a residential proxy and raise `requestDelayMs` to `500`.

**I got "Could not load product…". What's wrong?**
Two common causes: (1) the product ID doesn't exist or was delisted, or (2) your proxy country doesn't match the product's storefront region. Open the URL in your own browser to confirm it still works, then set `apifyProxyCountry` to that storefront's country.

**Why is `price` empty?**
Either `includePrice` was set to `false`, or TikTok didn't return pricing for that product on that run. The Actor deliberately reports `null` rather than guessing — TikTok serves deliberately corrupted price strings to automated clients, and a guessed number would be wrong, not merely missing.

**Prices changed between two runs of the same product. Why?**
TikTok personalizes promotions per session, so the price reflects what a shopper in that session would see. Treat it as a live observation rather than a fixed catalogue price.

**Can it scrape a whole shop or a search results page?**
Not yet — this Actor takes product URLs. You can pass as many as you like in one run. Contact me if shop-wide or keyword-based scraping would be useful to you.

**Does it need my TikTok login?**
No. It only reads publicly visible data. No account, cookies or API keys required.

**Is this legal?**
The Actor collects only publicly available information. You are responsible for how you use the data — check TikTok's terms and your local regulations, particularly around personal data, before using it commercially.

***

### 📞 Support

Questions, bug reports or feature requests are welcome.

- 📧 [**Email:**](mailto:me@ahmedhrid.com)
- 🐛 **Issues:** use the **Issues** tab on this Actor's Apify page
- 💡 **Feature requests:** tell me what you need — shop-wide scraping, extra fields and new marketplaces are all on the table

Include your run ID when reporting a problem, and enable the `debug` input before re-running. That gives me everything I need to diagnose it quickly.

***

#### Related keywords

TikTok Shop scraper · TikTok Shop reviews API · TikTok product data extraction · e-commerce review scraping · TikTok Shop product scraper · customer review export · Apify actor · web scraping · product research tool · competitor analysis · UGC scraping

***

*Engineering notes on how this Actor bypasses TikTok's request signing, price cloaking and transient-failure traps: [`docs/how-it-works.md`](docs/how-it-works.md).*

# Actor input Schema

## `startUrls` (type: `array`):

TikTok Shop product pages to scrape. Both URL shapes work — https://www.tiktok.com/shop/pdp/<slug>/<productId> and https://shop.tiktok.com/us/pdp/<slug>/<productId> — and so does a bare product id on its own, e.g. 1731578642912612516. The slug is ignored; only the trailing id matters.

## `maxReviews` (type: `integer`):

Stop after this many reviews per product. 0 means collect every review the API will serve.

## `sortBy` (type: `string`):

Relevance is what the product page shows by default. Newest first is the order to pick if you re-run this actor on a schedule and only care about what has come in since.

## `ratingFilter` (type: `string`):

Collect only reviews with this many stars. Leave on All to collect everything. Note that the counts shown per star in ratingBreakdown are what this filter pages through.

## `includePrice` (type: `boolean`):

TikTok masks prices in the product page HTML it serves to non-browser clients (you get "\*" instead of "7.84"). With this on, the actor makes one extra API call per product to get the real sale price, original price, discount, per-SKU prices and live stock. Prices are promotion-personalized, so expect them to move between runs.

## `pageSize` (type: `integer`):

How many reviews to ask for per API call. The API honours up to 1500; above that it returns an empty response. 500 is a good balance — most products come back in one or two calls without any single response getting huge.

## `requestDelayMs` (type: `integer`):

Pause between API calls. No rate limiting was observed while building this actor — 40 back-to-back calls on one session all succeeded — so this defaults to no delay. Raise it if you are scraping a long list of products and want to tread more lightly.

## `proxyConfiguration` (type: `object`):

Recommended. The proxy country should match the product's TikTok Shop region — a US proxy for a /us/ product — because TikTok redirects a mismatched region to its homepage instead of the product page. Prices and promotions are also regional.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
    }
  ],
  "maxReviews": 0,
  "sortBy": "relevance",
  "ratingFilter": "all",
  "includePrice": true,
  "pageSize": 500,
  "requestDelayMs": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

Each record is one product. Top level: productId, productUrl, region, title, description, images\[] and videos\[], the real price and originalPrice with currency and discountPercent, skus\[] with each variant's id, name, specification, price and available stock, soldCount, rating out of 5 with reviewCount and the ratingBreakdown by star, categories\[] as the breadcrumb path from root to leaf, the seller's shopId, shopName, shopUrl, shopLogo, shopRating, shopFollowers, shopSoldCount and shopProductCount, plus the coverage pair reviewsAvailable / reviewsCollected, a `partial` flag that is true when the run stopped short of everything available, and scrapedAt. Nested `reviews[]`: reviewId, rating out of 5, text, date as an ISO timestamp, reviewerName (TikTok serves these pre-masked, e.g. "J\*\* o\*\*n"), reviewerId, reviewerAvatar, images\[], the purchased variant as skuId and skuSpecification, country, and the verifiedPurchase and incentivized flags.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reviewly/tiktiok-shop-product-reviews").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reviewly/tiktiok-shop-product-reviews").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.tiktok.com/shop/pdp/cat-nail-clipper-by-potaroma-adjustable-sizes-built-in-file-safe-for-kittens-cats/1731578642912612516"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call reviewly/tiktiok-shop-product-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reviewly/tiktiok-shop-product-reviews"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iYeIeeAxFtTr66Lne/builds/bA7eiKqC4SDe0xI2m/openapi.json
