# TikTok Shop Vietnam Scraper: Every Product of a Seller (`luzivanlt/tiktok-shop-scraper`) Actor

Every product a TikTok Shop seller sells in Vietnam or the US, checked against the shop's count. $1.50 per 1,000 products. Price, variants, units sold, rating, shop profile.

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

## Pricing

from $1.05 / 1,000 products

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 Vietnam Scraper: Every Product of a Seller

Get every product a TikTok Shop seller sells in Vietnam or the US, from one
link to the seller's store or to any one of their products, and know whether
you got them all: the run's status says, for each shop, whether every product
the shop lists was read. Each product comes with its price, every variant's
price, discount, units sold, rating, review count, brand and image, plus the
shop's rating, followers, units sold and scores. No TikTok account, login or
cookies needed.

Tested daily. Latest full checks: 171 of 171 products from two Vietnamese
shops, and 161 of 161 from a US shop.

### What does this Actor do?

You give it links to TikTok Shop stores, or to products. For each link it
finds the seller and reads their whole catalogue, 20 products at a time,
saving one row per product until it reaches your limit or the last product.
When the run ends, its status compares each shop's rows with the number of
products the shop says it has on sale.

Each product comes with:

- its title, link and main image
- the price, the price before discount and the discount, in the shop's
  currency, and the same for each of its variants
- how many units have sold, its star rating and its number of reviews
- the brand, when the seller names one
- the seller's id and shop name, the shop's link and logo, how many products
  it has on sale, and its star rating, reviews, units sold, followers, videos,
  description and scores (such as how fast it ships)

### Why use it?

- **Watch a competitor's catalogue.** See every product, price and discount a
  seller has, and how well each one sells.
- **Know the list is complete.** Each shop is checked against its own product
  count, so a shop that was read only in part is named in the run's status.
- **Track prices and sales over time.** Run it daily and compare.
- **Works in Vietnam.** Vietnamese TikTok Shop has no store pages on the web;
  a link to any one product is enough here.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Paste one or more links into **Store or product links**. All links in one
   run must be from the same country.
2. Optionally, set **Max products per shop**.
3. Click **Start**. When the run ends, open the **Output** tab to view the
   products or download them.

Run it with no input to see a sample: up to 100 products from one Vietnamese
shop, charged as usual.

#### Links that work

| Link                                                           | Looks like                                                          |
| -------------------------------------------------------------- | ------------------------------------------------------------------- |
| A store page                                                   | `https://shop.tiktok.com/us/store/<shop-name>/7495938447270677412`  |
| A product page (any product of the seller; Vietnam's only way) | `https://shop.tiktok.com/vn/pdp/<product-name>/1732270227433686258` |

Links with tracking parameters work, and a shop pasted twice is read once.
Short share links (`vt.tiktok.com/…`), search and category links are not
supported: open the share link in a browser and paste the page's address.
Paste the links into the list: uploading a file of links is not supported
yet.

### Input

| Field                                            | What it does                                                   | Default |
| ------------------------------------------------ | -------------------------------------------------------------- | ------- |
| **Store or product links** (`startUrls`)         | The sellers to read. Required.                                 | —       |
| **Max products per shop** (`maxProductsPerShop`) | Stop reading a shop after this many products, from 1 to 10,000 | `500`   |

Example input:

```json
{
  "startUrls": [
    {
      "url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
    }
  ],
  "maxProductsPerShop": 500
}
```

### Output

One row per product. An example, with made-up values:

```json
{
  "product_id": "1732270227433686258",
  "title": "Badminton shoes, breathable, non-slip",
  "product_url": "https://shop.tiktok.com/vn/pdp/badminton-shoes/1732270227433686258",
  "price": 1185291,
  "original_price": 2363799,
  "currency": "VND",
  "discount_percent": 50,
  "single_item_price": 1390000,
  "seller_subtotal_deduction": 1100000,
  "price_sku_id": "1732270227434000001",
  "skus": [
    {
      "sku_id": "1732270227434000001",
      "price": 1185291,
      "original_price": 2363799,
      "discount_percent": 50,
      "single_item_price": 1390000,
      "seller_subtotal_deduction": 1100000
    },
    {
      "sku_id": "1732270227434000002",
      "price": 1210000,
      "original_price": 2363799,
      "discount_percent": 49,
      "single_item_price": 1420000,
      "seller_subtotal_deduction": 1100000
    }
  ],
  "rating": 4.8,
  "review_count": 379,
  "sold_count": 4290,
  "brand": "Kawasaki",
  "labels": ["Deal"],
  "shipping_fee": null,
  "image_url": "https://…/image.webp",
  "transparent_image_url": "https://…/cutout.png",
  "url_updated_at": "2026-03-02T08:15:00.000Z",
  "seller_id": "8600000000000000001",
  "global_seller_id": "7400000000000000001",
  "shop_name": "Example Sports Store",
  "shop_url": "https://shop.tiktok.com/vn/store/example-sports-store/8600000000000000001",
  "shop_logo_url": "https://…/logo.webp",
  "shop_rating": 4.7,
  "shop_review_count": 860,
  "shop_sold_count": 12500,
  "shop_global_sold_count": 12500,
  "shop_followers_count": 2100,
  "shop_video_count": 45,
  "shop_product_count": 128,
  "shop_description": "Official sports shoes and rackets.",
  "shop_creator_name": "examplesports",
  "shop_creator_id": null,
  "shop_banner_url": null,
  "shop_scores": [
    { "name": "24h response rate", "value": "96%", "score": null, "level": null },
    { "name": "Ships within 48h", "value": "82%", "score": null, "level": null }
  ],
  "region": "VN",
  "source_url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
}
```

| Field                       | What it holds                                                                                           |
| --------------------------- | ------------------------------------------------------------------------------------------------------- |
| `product_id`                | TikTok Shop's id for the product                                                                        |
| `title`                     | The product's title                                                                                     |
| `product_url`               | The product's page                                                                                      |
| `price`                     | The price now, as a number in the shop's currency (`1185291` VND, `12.99` USD)                          |
| `original_price`            | The price before discount. Empty when the product has no discount                                       |
| `currency`                  | `VND`, `USD`, …                                                                                         |
| `discount_percent`          | The discount, in percent. Empty when the product has no discount                                        |
| `single_item_price`         | The single-item price TikTok Shop gives beside the price. It can differ from `price`                    |
| `seller_subtotal_deduction` | The seller's deduction TikTok Shop states for the product, in the shop's currency                       |
| `price_sku_id`              | The variant whose price `price` shows                                                                   |
| `skus`                      | Each variant: its id, price, price before discount, discount, single-item price and seller deduction    |
| `rating`                    | Average stars, 0 to 5                                                                                   |
| `review_count`              | How many reviews the product has                                                                        |
| `sold_count`                | Units sold, as TikTok Shop shows it                                                                     |
| `brand`                     | The brand, when the seller names one                                                                    |
| `image_url`                 | The product's main image                                                                                |
| `url_updated_at`            | When TikTok Shop last updated the product's link                                                        |
| `seller_id`                 | TikTok Shop's id for the seller                                                                         |
| `global_seller_id`          | TikTok Shop's global id for the seller                                                                  |
| `shop_name`                 | The shop's name                                                                                         |
| `shop_url`                  | The shop's page                                                                                         |
| `shop_logo_url`             | The shop's logo                                                                                         |
| `shop_rating`               | The shop's average stars, 0 to 5                                                                        |
| `shop_review_count`         | How many reviews the shop has                                                                           |
| `shop_sold_count`           | Units the shop has sold, as TikTok Shop states it                                                       |
| `shop_global_sold_count`    | The shop's sold count across TikTok Shop, as TikTok Shop states it; can be above `shop_sold_count`      |
| `shop_followers_count`      | The shop's followers                                                                                    |
| `shop_video_count`          | How many videos the shop has                                                                            |
| `shop_product_count`        | How many products the shop has on sale, as TikTok Shop states it                                        |
| `shop_description`          | The shop's description                                                                                  |
| `shop_creator_name`         | The name of the TikTok account behind the shop                                                          |
| `shop_scores`               | The shop's scores as its page shows them: `name`, the shown `value`, and `score` and `level` when given |
| `region`                    | The country of the link (`VN`, `US`, …)                                                                 |
| `source_url`                | The link this product was read from, without tracking parameters                                        |

Some rows also carry, when TikTok Shop shows them: `price_prefix` (such as
`From`, when the price is the lowest of several variants), `labels` (such as
`Deal` or `Free shipping`), `shipping_fee`, `transparent_image_url` (the
product on a plain background), `shop_creator_id` and `shop_banner_url`.

Not included: variant names (size, colour) and stock, each product's
description, the reviews themselves, and the seller's videos.

### How much does it cost?

One extra event, $0.003 per shop read; nothing else is added.

You pay for what you get:

- **$1.50 per 1,000 products** ($0.0015 a product). Each product is charged once per run.
- **$0.003 per shop read.** A shop that could not be read is not charged. No start fee.

So a shop with 500 products costs $0.753: $0.75 for the products and $0.003 for the shop. If you set a maximum cost for a run, the Actor stops when it reaches it and keeps every product saved so far.

### How long does a run take?

About 20 products every few seconds. In testing, 171 products from two
Vietnamese shops took about 2.5 minutes, and 161 products from a US shop
under 30 seconds.

### Good to know

- **Vietnam and the US are tested.** Links from other TikTok Shop countries
  are accepted but have not been tested.
- **The run's status says whether each shop was read in full.** It compares
  each shop's rows with `shop_product_count` and names any shop that came up
  short, and whether your **Max products per shop** stopped it.
- **Prices move.** TikTok Shop changes some prices several times an hour; a
  row's price is the price at the moment it was read.
- **`shop_product_count` is TikTok Shop's own count.** It can differ from the
  number of rows by a few while the seller is adding or removing products.
- **Check your links first.** A link that is not a TikTok Shop store or
  product link, or links from two countries in one run, stop the run before
  anything is read, and the message names the problem.
- **One shop that cannot be read does not stop the run.** The other shops
  carry on, and the run's status lists the shops that could not be read. The
  run fails only when no shop could be read.
- **One link per seller is enough.** Two links to the same seller (two of
  their products, or their store and a product) read the shop once; the
  second link saves nothing.
- **Running it daily?** Remove repeats by `product_id`.

### More Actors from us

- [TikTok Comments Scraper: With Replies](https://apify.com/luzivanlt/tiktok-comments-scraper): TikTok video comments with their replies, threaded: who replied to whom, likes, creator pins.
- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Woolworths Coles ALDI Scraper: AU Grocery Prices](https://apify.com/luzivanlt/au-supermarkets-scraper): Woolworths, Coles and ALDI products for any search in one run, every results page to the end.
- [Bilibili Video Scraper: Search & Channel Videos](https://apify.com/luzivanlt/bilibili-videos-scraper): Bilibili videos from searches or whole channels, each with its full detail page's data.
- [Career Site Jobs Scraper: Workday, Greenhouse, Lever](https://apify.com/luzivanlt/career-site-jobs-scraper): Every job on Greenhouse, Lever, Ashby, SmartRecruiters and Workday boards, checked against each board's count.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~tiktok-shop-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "startUrls": [
    {
      "url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
    }
  ],
  "maxProductsPerShop": 100
}
```

Its inputs, in the order of the input form:

| Input                                        | What it takes                                                                                                                                                                                                                            | Default |
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `startUrls` (Store or product links)         | Links to TikTok Shop store pages (shop.tiktok.com/us/store/…) or to any product of the seller (shop.tiktok.com/vn/pdp/…), e.g. https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258. | —       |
| `maxProductsPerShop` (Max products per shop) | Stop reading a shop after this many products, from 1 to 10,000; default 500 (the form starts at 100).                                                                                                                                    | `500`   |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/tiktok-shop-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/tiktok-shop-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per product delivered; the sample input above costs at most $0.16.

### FAQ

**Do I need a TikTok account or cookies?**
No. The Actor reads what anyone can see on TikTok Shop.

**Can I search TikTok Shop by keyword or category?**
Not yet: this Actor reads a seller's whole catalogue.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape TikTok Shop?

This Actor reads only product listings and shop profiles that anyone can see
without logging in, and saves no personal data about buyers. Check TikTok's
terms and the laws that apply to you before you use the data. If you are
unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by TikTok or
ByteDance.

# Changelog

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

# Actor input Schema

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

Links to TikTok Shop store pages (shop.tiktok.com/us/store/…) or to any product of the seller (shop.tiktok.com/vn/pdp/…), e.g. https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258. Each link gives you every product its seller sells. All links in one run must be from the same country. Each shop read costs $0.003; a seller linked twice is read once.

## `maxProductsPerShop` (type: `integer`):

Stop reading a shop after this many products, from 1 to 10,000; default 500 (the form starts at 100). Each product is charged once per run ($1.50 per 1,000 products), plus $0.003 per shop read. Example: a shop with 500 products costs $0.753. The run's status says when this limit stopped a shop.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
    }
  ],
  "maxProductsPerShop": 100
}
```

# Actor output Schema

## `products` (type: `string`):

Every product the run saved, one row per product.

## `allFields` (type: `string`):

The same rows with every field.

# 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://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
        }
    ],
    "maxProductsPerShop": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/tiktok-shop-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 = {
    "startUrls": [{ "url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258" }],
    "maxProductsPerShop": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/tiktok-shop-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 '{
  "startUrls": [
    {
      "url": "https://shop.tiktok.com/vn/pdp/giay-cau-long-nam-nu-kawasaki-k2b31-c32016-thoang-khi/1732270227433686258"
    }
  ],
  "maxProductsPerShop": 100
}' |
apify call luzivanlt/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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