# TikTok Shop Product Data Scraper (`fetch_cat/tiktok-shop-product-data-scraper`) Actor

Enrich public TikTok Shop product URLs and IDs with prices, variants, stock, sellers, ratings, sales signals and media.

- **URL**: https://apify.com/fetch_cat/tiktok-shop-product-data-scraper.md
- **Developed by:** [Fetch Cat](https://apify.com/fetch_cat) (community)
- **Categories:** E-commerce, Social media
- **Stats:** 2 total users, 1 monthly users, 84.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 tiktok shop product saveds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Shop Product Data Scraper

Enrich public TikTok Shop product URLs or IDs with current US prices, variants, availability signals, seller metadata, media, ratings, and visible sales signals. Built for marketplace sellers, ecommerce analysts, affiliate teams, and product-monitoring workflows.

### Who is it for?

- **Marketplace sellers** tracking price, stock, and seller changes across a known catalog.
- **Ecommerce analysts** comparing normalized product and variant attributes.
- **Affiliate teams** screening known public products without private creator analytics.
- **Developers and agencies** loading public product details into databases, dashboards, and automations.

### Common use cases

1. Refresh a product shortlist before a merchandising review.
2. Compare SKU prices and public availability across affiliate candidates.
3. Monitor seller and visible sales signals for selected products.
4. Enrich product IDs discovered by the separate TikTok Shop Search Scraper.

### Input

```json
{
  "productUrls": ["https://shop.tiktok.com/us/pdp/1732526446300467962"],
  "productIds": ["1732600742000628072"],
  "region": "US",
  "maxItems": 20
}
```

| Setting | Description | Default |
|---|---|---|
| `productUrls` | Public TikTok Shop product pages | `[]` |
| `productIds` | Numeric product IDs when URLs are unavailable | `[]` |
| `region` | Verified storefront market (`US`) | `US` |
| `maxItems` | Maximum unique records saved (1–500) | Number of unique inputs |
| `proxyConfiguration` | Optional region-matched Apify Proxy settings | US residential |

Provide at least one URL or ID. Inputs are deduplicated by region and product ID. A URL whose market differs from `region` is rejected rather than silently rewritten.

### Output

Each successful target produces one analysis-ready record:

```json
{
  "productId": "1732526446300467962",
  "productUrl": "https://shop.tiktok.com/us/pdp/1732526446300467962",
  "title": "Public product title",
  "price": 16.99,
  "originalPrice": 22.99,
  "currency": "USD",
  "variants": [{"skuId":"1732526500000000000","name":"Blue","stock":42,"price":16.99,"currency":"USD"}],
  "sellerName": "Public shop name",
  "rating": null,
  "reviewCount": null,
  "soldCount": 1200,
  "requestedInput": "1732526446300467962",
  "region": "US",
  "scrapedAt": "2026-09-29T12:00:00Z",
  "warnings": ["Public source did not expose review count."]
}
```

Available fields include description, category hierarchy, images, videos, variant properties and stock, shipping estimates, seller rating/followers/sold signals, and product rating/review signals when publicly exposed. On current product pages, `soldCount` represents the product’s visible sales and `sellerSoldCount` represents sales across the shop. Out-of-stock variants retain their public prices and a stock value of zero. Temporary access challenges receive a small, bounded number of retries.

Missing optional values remain `null` and are described in `warnings`; the Actor never invents unavailable data.

### Behavior and limits

- Uses public anonymous TikTok Shop product pages with a first-party public JSON fallback.
- Verifies the returned product ID and USD market before saving a record.
- Continues a batch when one product is inaccessible; inaccessible products are reported in the run summary and are not fabricated.
- Stops at `maxItems`, removes duplicate IDs deterministically, and preserves completed IDs for run recovery.
- Supports public US storefront data only in this release. No login, buyer/order data, Seller Center analytics, review-author profiles, inferred GMV, or CAPTCHA bypass.

### Example inputs

**One product URL**

```json
{"productUrls":["https://shop.tiktok.com/us/pdp/1732526446300467962"],"region":"US","maxItems":1}
```

**A deduplicated ID shortlist**

```json
{"productIds":["1732526446300467962","1732600742000628072"],"region":"US","maxItems":2}
```

For recurring monitoring, save a stable list as an Apify Task and schedule it. Products unavailable in the selected storefront are reported without fabricated rows.

### Input recipes

- **Enrich one product:** provide one `productUrls` or `productIds` value, set `region` to `US`, and use `maxItems: 1`.
- **Monitor a product catalog:** provide a stable list of known product URLs or IDs, set a matching `maxItems`, and save the input as your own private Apify Task for scheduled refreshes.
- **Compare affiliate products:** submit a bounded candidate list and export the normalized dataset for side-by-side analysis.

Replace the example IDs or URLs with your own public TikTok Shop products. Saved tasks are private unless you explicitly publish them, so this README does not link to private task pages.

### API usage

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~tiktok-shop-product-data-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"productIds":["1732526446300467962"],"region":"US","maxItems":1}'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/tiktok-shop-product-data-scraper').call({
  productIds: ['1732526446300467962'], region: 'US', maxItems: 1,
});
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/tiktok-shop-product-data-scraper').call(run_input={
    'productIds': ['1732526446300467962'],
    'region': 'US',
    'maxItems': 1,
})
print(run['defaultDatasetId'])
```

### Integrations and exports

Download the dataset as JSON, CSV, Excel, XML, or RSS, or consume it through the Apify API. Use webhooks to notify a downstream workflow after each run. Dataset rows are flat for common analytics columns while `variants`, `images`, `videos`, and `warnings` retain structured arrays.

Use from MCP at `https://mcp.apify.com/?tools=fetch_cat/tiktok-shop-product-data-scraper`.

### Pricing

Pay per event: one `start` charge per run and one `item` charge for each unique product record saved. Failed or inaccessible targets do not create item charges. See the live [Pricing tab](https://apify.com/fetch_cat/tiktok-shop-product-data-scraper/pricing) for current account-visible rates.

| Charge event | Unit | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
| --- | --- | --- | --- | --- | --- | --- | --- |
| TikTok Shop product saved | Per 1 output record (rounded up) | $0.0015 | $0.0015 | $0.0015 | $0.0015 | $0.0015 | $0.0015 |
| Product enrichment run started | Per run | $0.018 | $0.018 | $0.018 | $0.018 | $0.018 | $0.018 |

### FAQ

#### Does it require a TikTok account?

No. It uses public anonymous product surfaces and does not accept login credentials.

#### Can it discover products by keyword?

No. Use the related US TikTok Shop Search Scraper for discovery, then pass known URLs or IDs here for detail enrichment.

#### Why is a field null or listed in warnings?

Public fields vary by product and session. The Actor returns only what the ID-bound source exposes and records important omissions instead of guessing.

#### What happens when one product is unavailable?

The Actor continues the remaining bounded batch. It does not save a fabricated row for the unavailable target. If every target fails, the run fails with a concise diagnostic.

#### Can I use API, MCP, schedules, or webhooks?

Yes. Call it with the Apify API clients or MCP, save the input as a Task for schedules, and connect run completion through webhooks.

#### How many products can one run accept?

Up to 500 unique targets, additionally bounded by `maxItems`. Start with a small representative batch before scaling.

### Related Actors

Use [US TikTok Shop Search Scraper](https://apify.com/fetch_cat/tiktok-shop-search-scraper) for broad keyword/category discovery. This Actor intentionally focuses on known product URL/ID enrichment.

### Support

Open an issue on the Actor page with the input, expected behavior, and run link. Never include passwords, cookies, or private account data.

# Changelog

This Actor's version history is a separate document: https://apify.com/fetch_cat/tiktok-shop-product-data-scraper/changelog.md

# Actor input Schema

## `productUrls` (type: `array`):

One or more public US TikTok Shop product pages to enrich.

## `productIds` (type: `array`):

Numeric product IDs to enrich when canonical URLs are unavailable.

## `region` (type: `string`):

The independently verified TikTok Shop market for this release.

## `maxItems` (type: `integer`):

Maximum number of unique product records saved.

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

Optional US-matched Apify Proxy configuration for resilient public access.

## Actor input object example

```json
{
  "productUrls": [
    "https://shop.tiktok.com/us/pdp/1732526446300467962"
  ],
  "productIds": [],
  "region": "US",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# 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 = {
    "productUrls": [
        "https://shop.tiktok.com/us/pdp/1732526446300467962"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/tiktok-shop-product-data-scraper").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 = { "productUrls": ["https://shop.tiktok.com/us/pdp/1732526446300467962"] }

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/tiktok-shop-product-data-scraper").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 '{
  "productUrls": [
    "https://shop.tiktok.com/us/pdp/1732526446300467962"
  ]
}' |
apify call fetch_cat/tiktok-shop-product-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetch_cat/tiktok-shop-product-data-scraper"
        }
    }
}
```

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/4legUIlTyCesXRBsm/builds/o5KxHTKIVFEJ3SXyT/openapi.json
