# TikTok Shop Product Details Scraper (`riseandcode/tiktok-shop-product-details-scraper`) Actor

$3.30/1000 products. Scrape TikTok Shop (US) product pages: stock per variant, units sold, prices, discounts, shipping fees and delivery days, seller business name, description, images and videos. No login.

- **URL**: https://apify.com/riseandcode/tiktok-shop-product-details-scraper.md
- **Developed by:** [Rise and Code](https://apify.com/riseandcode) (community)
- **Categories:** E-commerce, Social media
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 product scrapeds

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

### What does this TikTok Shop product details scraper do?

This Actor extracts full product data from [TikTok Shop](https://shop.tiktok.com/us) product pages in the **United States**. Paste product URLs or IDs and get back clean JSON for every product: **stock per variant, units sold, price and original price per variant, discount, rating, reviews, shipping options with fees and delivery days, the seller's shop, registered business name and address, category, description, product properties, images and videos**.

No browser, no login and no API key — and it handles thousands of products per run.

### Why scrape TikTok Shop product details?

- 📦 **Inventory & sell-out tracking** — stock per color/size, refreshed as often as you schedule it, to see what is selling and what is about to run out.
- 📈 **Sales velocity** — schedule daily runs and compare **units sold** to estimate how fast a product moves.
- 💸 **Price monitoring** — price, original price and discount for every variant.
- 🏭 **Seller research** — the registered business name and address behind each shop, to vet suppliers and competitors.
- 🛒 **Catalog & listing work** — titles, descriptions, properties, images and videos ready to import.
- 🤖 **Automation** — call it from your own code through the API, or send results to Google Sheets, a database or a dashboard with Apify integrations.

#### Why an Actor instead of doing it yourself?

TikTok Shop has no public product API, and its pages are built for a shopper in a browser. This Actor reads each product directly and hands you a ready-to-use dataset.

### How to use this TikTok Shop product details scraper

1. Open the Actor and click **Try for free**.
2. Paste one or more **product URLs or IDs**, one per line.
3. Click **Start**, then open the **Output** tab or download the dataset as **JSON, CSV, Excel or HTML**.

Run it through the Apify API:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/riseandcode~tiktok-shop-product-details-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "productUrls": [
      "https://shop.tiktok.com/us/pdp/1731456005003055196",
      "1732178844944535974"
    ]
  }'
```

### Input

| Field | What it does |
|---|---|
| `productUrls` | TikTok Shop US product URLs or product IDs, one per line. |

#### Which URLs work?

Any TikTok Shop US product link:

- `https://shop.tiktok.com/us/pdp/<name>/<id>` or `https://shop.tiktok.com/us/pdp/<id>`
- `https://www.tiktok.com/shop/pdp/<name>/<id>`
- `https://www.tiktok.com/view/product/<id>` (the link from the app's **Share** button)
- the bare 19-digit product ID, e.g. `1732178844944535974`

Short links (`vm.tiktok.com/…`) need to be opened once in a browser — paste the full URL it lands on. A product listed twice is scraped (and charged) once.

**Need product IDs for a keyword?** Run [TikTok Shop Search Scraper](https://apify.com/riseandcode/tiktok-shop-search-scraper) first and paste its `productId` or `url` values here.

### Output

Each product is one dataset item. You can download the dataset in various formats such as JSON, CSV, Excel or HTML, or read it through the API.

#### Output example

```json
{
  "productId": "1731456005003055196",
  "title": "LEPRO S1 Modern AI Smart 12W Dimmable RGB Colorful LED Strip Lights",
  "url": "https://shop.tiktok.com/us/pdp/1731456005003055196",
  "price": 34.99,
  "maxPrice": 103.99,
  "originalPrice": 57.99,
  "discountPercent": 40,
  "currency": "USD",
  "soldCount": 266,
  "rating": 4.7,
  "reviewCount": 36,
  "inStock": true,
  "totalStock": 333,
  "variantCount": 5,
  "variants": [
    {
      "skuId": "1731456014311133276",
      "name": "16.4FT",
      "options": { "Length": "16.4FT" },
      "price": 54.59,
      "originalPrice": null,
      "stock": 0,
      "inStock": false,
      "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/…/ce7884aa082c495299b3f9a4c9c95fd1~tplv-fhlh96nyum-crop-webp:797:797.webp"
    },
    {
      "skuId": "1731456014311198812",
      "name": "32.8FT",
      "options": { "Length": "32.8FT" },
      "price": 34.99,
      "originalPrice": 57.99,
      "stock": 94,
      "inStock": true,
      "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/…/e3b2237703854628b50d90101d276170~tplv-fhlh96nyum-crop-webp:1495:1495.webp"
    }
  ],
  "shopName": "Lepro.US",
  "sellerId": "7496228136129300572",
  "sellerBusinessName": "INNOVATION RULES INC",
  "sellerBusinessAddress": "11500 South Eastern Avenue #150, Henderson, Nevada, 89052, United States",
  "categoryId": "1264400",
  "description": "Warm Tips Before Purchase: Please select a length that closely matches your requirements…",
  "properties": { "Dangerous goods or hazardous materials": "No", "Contains batteries or cells?": "None" },
  "shipping": [
    { "name": "Standard shipping", "fee": 0, "currency": "USD", "freeShipping": true, "freeShippingMinOrder": null, "minDays": 4, "maxDays": 7 }
  ],
  "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/…/a28f7b6024ba4beaa0bc57ee666fa682~tplv-fhlh96nyum-crop-webp:797:800.webp",
  "images": ["https://p16-oec-general-useast5.ttcdn-us.com/…/a28f7b6024ba4beaa0bc57ee666fa682~tplv-fhlh96nyum-crop-webp:797:800.webp"],
  "videos": [{ "url": "https://v16m-default.tiktokcdn-us.com/…", "coverUrl": "https://p16-common-sign.tiktokcdn-us.com/…", "durationSecs": 30.059 }],
  "input": "https://shop.tiktok.com/us/pdp/1731456005003055196",
  "scrapedAt": "2026-10-12T19:50:39.962Z"
}
```

### Output fields

| Field | Description |
|---|---|
| `productId` | TikTok Shop product ID. |
| `title` | Product title. |
| `url` | Product page URL on TikTok Shop. |
| `price` / `maxPrice` | Lowest and highest current price among the variants **in stock**, in `currency` — the cheapest price you can actually buy at. When every variant is sold out, they cover all variants. |
| `originalPrice` | Price before discount of the variant in `price`; `null` when it is not discounted. |
| `discountPercent` | Discount on the variant in `price`; `null` when there is none. |
| `currency` | ISO currency code of the prices (`USD`). |
| `soldCount` | Units sold, as reported by TikTok Shop. |
| `rating` / `reviewCount` | Star rating (0–5; `null` when nobody has rated the product yet) and number of reviews. |
| `inStock` | At least one variant can be bought. |
| `totalStock` | Units available, summed across variants; `null` when TikTok Shop doesn't report stock. |
| `variantCount` / `variants` | Every variant (SKU) with its options (e.g. `{ "Color": "Pink", "Size": "M" }`), price, original price, **stock**, whether it can be bought, and image. Sold-out variants have `stock: 0` and `inStock: false`. |
| `shopName` / `sellerId` | The shop selling the product and its seller ID. |
| `sellerBusinessName` / `sellerBusinessAddress` | The seller's registered business name and address, as disclosed by TikTok Shop. |
| `categoryId` | TikTok Shop category ID. |
| `description` | Product description as plain text (bullet lists kept as "•" lines); `null` when the description is images only. |
| `properties` | Product attributes set by the seller (material, capacity, features…), name → value. |
| `shipping` | Shipping options: name, fee, currency, free shipping, order value for free shipping (`freeShippingMinOrder`) and delivery time in days (`minDays`–`maxDays`). |
| `imageUrl` / `images` | Main image and the full gallery. |
| `videos` | Product videos: video URL, cover image and duration. Video URLs are signed and expire after a few hours — download them soon after the run. |
| `input` | What you entered for this product, to match results back to your list. |
| `scrapedAt` | When the product was collected (ISO 8601). |

### How much does it cost to scrape TikTok Shop products?

This Actor uses **pay-per-event** pricing — you pay only for the products you get:

| Apify plan | Per 1,000 products | Per run start |
|---|---|---|
| Free | **$3.30** | $0.015 |
| Starter (Bronze) | **$3.20** | $0.015 |
| Scale (Silver) | **$3.10** | $0.015 |
| Business (Gold) and up | **$3.00** | $0.015 |

For example, 1,000 products cost **$3.02–$3.32** depending on your plan; 100 products cost about **$0.32–$0.35**.

The run start is charged once per run (once per GB of memory if you raise the memory above the default).

Products that don't exist, can't be loaded or are missing a required field are never charged, and a product listed twice is charged once.

#### Tips to keep costs low

- Put all your products in one run instead of one run per product.
- Use **Maximum cost per run** in the run options to cap what a single run can spend.

### FAQ

#### Is it legal to scrape TikTok Shop?

This Actor collects only publicly available product information that any visitor can see, without logging in. You are responsible for how you use the data — check TikTok's terms of service and the laws that apply to you, and consult a lawyer if unsure.

#### Do I need a TikTok account or API key?

No. Just run the Actor.

#### Which countries are supported?

The **United States** store. TikTok Shop's other web stores (including Brazil) only show their products to logged-in shoppers, so they can't be collected anonymously. Links from other countries are rejected with a clear message before the run starts.

#### What happens with a product that no longer exists?

It is skipped and not charged. The run log and the final status list products that were not found (removed, or from another country's store).

#### How fresh is the stock?

It is the stock TikTok Shop shows at the moment of the run. Schedule the Actor to track stock and units sold over time.

#### Which price does `price` show?

The **cheapest variant you can buy right now**. TikTok Shop's own "from" price sometimes points at a sold-out variant or a pricier one, so the Actor works it out from the variants itself:

- `price` / `maxPrice` are the lowest and highest price among the variants **in stock**.
- `originalPrice` and `discountPercent` belong to that same cheapest in-stock variant, so the three always describe one real offer.
- When **every variant is sold out**, all variants count (the product shows `inStock: false`).
- A product without variants uses the price TikTok Shop shows on the page.

Every variant keeps its own `price`, `originalPrice`, `stock` and `inStock` in `variants`, so you can apply a different rule if you need one.

#### Some fields come back as `null` — is that expected?

Yes, when TikTok Shop doesn't show them for that product: `originalPrice`/`discountPercent` for products without a discount, `rating` for products nobody has rated yet, `description` for image-only descriptions.

#### What's the ideal timeout?

Products are read many at a time: 400 products took about 3.5 minutes (roughly 120 per minute). The default timeout (1 hour) is enough for around 6,000 products; for bigger lists, allow about 10 minutes per 1,000 products, or split them into several runs.

#### A product failed to load — what can I do?

Products TikTok Shop declines to return are retried automatically. If a run still reports products that could not be loaded, run those again.

#### Can I schedule it?

Yes — use Apify **Schedules** to run it daily and track stock, prices and units sold, and **Integrations** to send results to Google Sheets, Slack, a webhook and more.

### Looking for something else on TikTok Shop?

- [TikTok Shop Search Scraper](https://apify.com/riseandcode/tiktok-shop-search-scraper) — search by keyword and get price, units sold, rating, shop and brand for every product found; feed its `productId` values into this Actor for stock and seller details.

### Changelog

- **2026-11-09** — `price` now always shows the cheapest variant in stock; fixed a rare delay of several minutes at the start of a run.
- **2026-11-07** — Improved reliability: fewer products left out of a run.
- **2026-10-12** — First release: TikTok Shop US product details with stock per variant, shipping, seller business details, description, properties, images and videos.

### Support

If you encounter a bug or have a suggestion for this Actor or a new one, reach out via the **Issues** tab or at <contact.riseandcode@gmail.com>. We respond in English 🇺🇸 and Portuguese 🇧🇷.

# Actor input Schema

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

TikTok Shop US product pages — one per line. Paste the product URL (shop.tiktok.com/us/pdp/…, tiktok.com/shop/pdp/… or tiktok.com/view/product/…) or just the 19-digit product ID. Each product is scraped once even if listed twice.

## Actor input object example

```json
{
  "productUrls": [
    "https://shop.tiktok.com/us/pdp/1731456005003055196",
    "1732178844944535974"
  ]
}
```

# Actor output Schema

## `results` (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/1731456005003055196"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("riseandcode/tiktok-shop-product-details-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/1731456005003055196"] }

# Run the Actor and wait for it to finish
run = client.actor("riseandcode/tiktok-shop-product-details-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/1731456005003055196"
  ]
}' |
apify call riseandcode/tiktok-shop-product-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,riseandcode/tiktok-shop-product-details-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/4vyzKOBxgfFVPpHTp/builds/WNZq6qtemlvArqdGr/openapi.json
