# TikTok Shop Category Products Scraper (`toolzerhub/tiktok-shop-category-products-scraper`) Actor

Browse any TikTok Shop category by name or ID and export every product in it, with brand, variant, price, and sales data on each row, automatic pagination, and optional full product-detail enrichment.

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

## Pricing

from $5.00 / 1,000 results

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 Category Products Scraper

Browse a TikTok Shop category and export everything in it — prices, brands, variants, ratings, and sold counts — without needing a keyword.

Keyword search only finds what you already thought to ask for. A category is the whole shelf, including the products you would never have typed. Give it **Beauty & Personal Care** and you get the category as TikTok itself organises it.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `category` | string | — | **Required.** A category name, or a numeric category ID. |
| `region` | enum | `US` | `US`, `GB`, `SG`, `MY`, `PH`, `TH`, `VN`, `ID`. |
| `maxItems` | integer | `100` | Caps how many products are saved. `0` means no limit. |
| `addonProductDetails` | boolean | `false` | Adds the detail fields below. One extra request per product. |

```json
{
  "category": "Beauty & Personal Care",
  "region": "US",
  "maxItems": 100,
  "addonProductDetails": false
}
```

You don't need to look up an ID first. Type the name as you'd say it — **Hand & Foot Care**, `hand-foot-care`, or `hand foot care` all land on the same category. Punctuation and case don't matter. If you already have the numeric ID, pass that instead and it's used directly.

Names are matched against the live category tree, so a name that doesn't exist fails immediately with the list of top-level categories rather than running and returning nothing.

### Output

One row per product.

| Field | What it holds |
|---|---|
| `product_id` | TikTok Shop product ID |
| `title` | Product title |
| `category_id` | The category the row came from |
| `category_name` | That category's display name |
| `image` | Primary product image |
| `product_price_info` | Real price, original price, currency, discount |
| `rate_info` | Star score and review count |
| `sold_info` | Units sold |
| `seller_info` | Seller ID and shop name |
| `brand_info` | Brand, when TikTok records one |
| `sku_info` | Every purchasable variant with its own ID, price, and stock |
| `product_marketing_info` | Promotion and campaign labels on the listing |
| `seo_url` | Canonical product URL |

```json
{
  "product_id": "1732046166861714198",
  "title": "Portable Travel Hand Sanitizer Spray Set, 10-Piece",
  "category_id": "849032",
  "category_name": "Hand & Foot Care",
  "rate_info": { "score": 4.7, "review_count": "3" },
  "sold_info": { "sold_count": 27 },
  "brand_info": { "brand_name": "Clarins" }
}
```

`brand_info`, `sku_info`, and `product_marketing_info` don't come back from keyword search — they're specific to the category feed. That's the reason to use this Actor over [TikTok Shop Search Scraper](https://apify.com/toolzerhub/tiktok-shop-search-scraper) when you want variant-level or brand data.

#### With `addonProductDetails` enabled

Eight more fields are merged into each row — `product_detail`, `product_info`, `shop_info`, `reviews_info`, `hot_reviews`, `vouchers`, `category_info`, `shop_performance`. It costs one extra request and one extra billed event per product. Leave it off for a first pass, then re-run with it on for the products worth the spend.

### What people use it for

- **Find products you didn't know to search for.** Category browsing surfaces the long tail; keyword search can't.
- **Price a shelf.** Every row carries `product_price_info` and `sku_info`, so you get the real spread across a category, variant by variant.
- **See which brands hold a category.** `brand_info` on every row, counted, is a share-of-shelf estimate.
- **Spot what's selling.** Sort on `sold_info.sold_count` and `rate_info.review_count` together — high sales with few reviews usually means the listing is new.

### Questions

**How do I find TikTok Shop products without a keyword?**
That's what this does. TikTok organises its catalogue as a tree — 28 top-level categories in the US, each with its own subcategories, around 240 in total. You name a category and get its products. Keyword search needs you to guess the wording; a category doesn't.

**Why did I get fewer products than `maxItems`?**
The category ran out. Categories are finite and often smaller than they look — asking for 200 from **Hand & Foot Care** returns 162, because that's everything TikTok will serve for it. The run stops when TikTok reports no more pages. Setting `maxItems: 0` takes everything available, which is the same number.

**Why aren't all the products in a category showing up?**
TikTok's category feed doesn't expose a complete index. It pages through an offset and stops handing out new products well before the category is genuinely exhausted — the same behaviour you see scrolling the app, where the feed eventually stops. You get what the feed serves, which is a large sample, not a guaranteed census.

**Do I get duplicate rows?**
No. The feed re-serves the same product at different offsets — a 120-row walk returned 117 distinct products before deduplication was added. Products already saved in a run are skipped, so every row in your dataset is a distinct `product_id`, and you're not billed for repeats.

**What happens if I type a category name that doesn't exist?**
The run fails straight away with the list of valid top-level categories in your region, instead of quietly returning zero rows. Category names differ by region, so a name valid in `US` may not exist in `GB`.

**Does using a name instead of an ID cost more?**
One extra request per run, once, to fetch the category tree. Passing a numeric ID skips it. On a 100-product run that's a rounding error, so use whichever is easier to read.

**Which regions work?**
All eight — `US`, `GB`, `SG`, `MY`, `PH`, `TH`, `VN`, `ID`. The category tree is fetched per region, so IDs and names are resolved against the region you set, not against the US tree.

### Other TikTok Shop Actors

| Actor | Use when |
|---|---|
| [TikTok Shop Search Scraper](https://apify.com/toolzerhub/tiktok-shop-search-scraper) | You have a keyword and want listing fields only |
| [TikTok Shop Products Scraper](https://apify.com/toolzerhub/tiktok-shop-products-scraper) | You have a keyword and want full detail too |
| [TikTok Shop Product Scraper](https://apify.com/toolzerhub/tiktok-shop-product-scraper) | You already have one product ID or URL |
| [TikTok Shop Seller Products Scraper](https://apify.com/toolzerhub/tiktok-shop-seller-products-scraper) | You want one shop's entire catalogue |
| [TikTok Shop Reviews Scraper](https://apify.com/toolzerhub/tiktok-shop-reviews-scraper) | You want what buyers said about a product |

### Support

Questions, bugs, or feature requests: **contact@toolzerhub.com**

Browse the rest: [apify.com/toolzerhub](https://apify.com/toolzerhub)

# Actor input Schema

## `category` (type: `string`):

TikTok Shop category name (for example Beauty & Personal Care, or a subcategory like Hand & Foot Care) or a numeric category ID.

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

TikTok Shop region code.

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

Maximum number of products to save in search mode. Set 0 for no limit.

## `addonProductDetails` (type: `boolean`):

Add product, shop, review, voucher, category, and performance detail to every product found. This makes one extra request per product.

## Actor input object example

```json
{
  "category": "Beauty & Personal Care",
  "region": "US",
  "maxItems": 20,
  "addonProductDetails": false
}
```

# Actor output Schema

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

Dataset containing all scraped data

# 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 = {
    "category": "Beauty & Personal Care",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("toolzerhub/tiktok-shop-category-products-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 = {
    "category": "Beauty & Personal Care",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("toolzerhub/tiktok-shop-category-products-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "category": "Beauty & Personal Care",
  "maxItems": 20
}' |
apify call toolzerhub/tiktok-shop-category-products-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=toolzerhub/tiktok-shop-category-products-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/d1DA1l7VsonkqLRft/builds/JzmbbTvFGNmWZdRjM/openapi.json
