# TikTok Shop Product Scraper — $0.006/item + $0.01 run fee (`crawleast/tiktok-shop-product-scraper`) Actor

Paste TikTok Shop product URLs — get title, price, units sold, rating, reviews & shop, no search or login. Each product via its own residential IP; honest per-URL ledger: $0.006/delivered item + $0.01 run fee, CAPTCHA-blocked or failed URLs never charged. CAPTCHA risk disclosed up front.

- **URL**: https://apify.com/crawleast/tiktok-shop-product-scraper.md
- **Developed by:** [Kyle Wang](https://apify.com/crawleast) (community)
- **Categories:** E-commerce, Agents
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.20 / 1,000 detail-items

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?

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 Scraper — $0.006/item + $0.01 run fee

**Paste up to 100 TikTok Shop product links — get structured, decision-ready product details back: title, price with currency, units sold, rating, review count and shop identity.**

No TikTok account. No login. No captcha step for you — the Actor runs on residential exits and automatically solves the occasional slider puzzle behind the scenes. Pay **$0.006 per delivered product** plus a **transparent $0.01 run fee on successful runs**. Failed, blocked or not-found URLs are never charged. Every run writes a per-URL ledger, so you can audit exactly what happened to every link you paid with.

**Keywords:** TikTok Shop scraper, TikTok product scraper, TikTok Shop price tracker, product research, ecommerce data, sold count, social commerce, dropshipping, trend tracking

***

#### 🎯 What you can do with it

- **Competitor price monitoring** — feed your competitors' product links, get current price + units sold on a schedule and catch price moves early
- **Winning-product validation** — before you source a trending product, pull its real sold count and rating straight from TikTok Shop
- **Trend batch research** — paste a batch of links collected from TikTok videos/lives and turn them into a spreadsheet of prices, sales and ratings
- **Store audit at scale** — up to 100 product URLs per run: your own store or a supplier's, one dataset out
- **AI-agent product lookups** — one API call per batch of URLs, machine-readable failure semantics, hard budget cap — built to be called by software

***

#### ⚡ Three points that matter

1. **Data you can act on, not raw HTML** — each row carries price with currency, units sold, rating, review count and shop identity, with a `dataQuality` marker and a `scrapedAt` freshness timestamp on every row.
2. **Honest billing** — you pay only for products actually delivered ($0.006 each), plus a transparent $0.01 run fee on successful runs. Captcha-blocked, not-found and failed URLs cost **$0.00** — the SUMMARY ledger shows the verdict for every input URL.
3. **A budget cap you control** — set `maxTotalChargeUsd` and billing hard-stops at your ceiling. Items beyond the cap are still delivered but marked uncharged — never silently dropped, never over-billed.

***

#### 🚀 One-click examples

- **[Single product check](https://apify.com/crawleast/tiktok-shop-product-scraper/tiktok-single-product-check)** — one product link, full detail row (cheapest trial)
- **[Competitor price scan — 10 products](https://apify.com/crawleast/tiktok-shop-product-scraper/tiktok-competitor-price-scan)** — the standard monitoring batch
- **[Trend batch — 30 products](https://apify.com/crawleast/tiktok-shop-product-scraper/tiktok-trend-batch)** — links from videos/lives to a research sheet
- **[Full catalog audit — 100 products](https://apify.com/crawleast/tiktok-shop-product-scraper/tiktok-catalog-audit)** — maximum batch in one run
- **[Region-labelled run — UK](https://apify.com/crawleast/tiktok-shop-product-scraper/tiktok-region-label-uk)** — same pipeline with a marketplace label on every row

***

#### 📦 Sample output

One dataset row per delivered product:

```json
{
  "productId": "1729493620818874839",
  "title": "AUTOMET Women's 3-Piece Long Sleeve Crop Tops",
  "price": { "value": 39.99, "currency": "USD" },
  "soldCount": 140700,
  "rating": 4.8,
  "reviewCount": 10104,
  "shop": { "name": "AUTOMET", "id": null },
  "productUrl": "https://www.tiktok.com/view/product/1729493620818874839",
  "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-…webp",
  "region": "US",
  "dataQuality": "FULL",
  "scrapedAt": "2026-09-01T03:23:06.308Z"
}
```

Fields the page doesn't expose are `null` — and `dataQuality` (`FULL` / `PARTIAL` / `MINIMAL`) tells you exactly how complete each row is. The `SUMMARY` key-value record additionally accounts for **every input URL** (delivered / captcha / 404 / deadline, plus `INVALID_URL` for non-TikTok links and `INVALID_ID` for obvious placeholder IDs — nothing is dropped silently) with the billing ledger attached.

Any product-link shape works: `www.tiktok.com/view/product/<id>`, `shop.tiktok.com/view/product/<id>`, regional `…/pdp/<slug>/<id>` links, even partner links full of tracking parameters — the numeric product ID is extracted automatically and duplicates are removed.

***

### Pricing (pay-per-event)

All-inclusive, predictable pricing. **$0.006 per delivered product** + **$0.01 run base fee** (charged once at run completion, only when at least one product was delivered). Failed, captcha-blocked or not-found URLs are never charged.

> **The $0.01 run base fee is in effect now** — it is charged once at run completion on every run that delivers at least one product (live since 2026-09-01, aligned to the platform pricing record). Runs that deliver nothing are never charged, and every base-fee charge is itemized in the per-URL SUMMARY ledger so you can audit it.

| Event | Price | When it's charged |
| --- | --- | --- |
| `detail-item` | **$0.006** | Per product row **actually delivered** (primary event) |
| `run-base-fee` | **$0.01** | Once per run, at completion — only when ≥1 product was delivered |

Subscription discounts apply to `detail-item`: BRONZE −10%, SILVER −20%, GOLD / PLATINUM / DIAMOND −30%.

| Tier | detail-item | ≈ per 1,000 products |
| --- | --- | --- |
| FREE | $0.006 | $6.00 |
| BRONZE | $0.0054 | $5.40 |
| SILVER | $0.0048 | $4.80 |
| GOLD+ | $0.0042 | $4.20 |

**Budget protection parameter:** the platform's per-run minimum charge is **$0.04** — very small runs are billed this floor instead of their computed total, protecting both sides from sub-cent run spam. Runs that deliver **zero** products are never charged at all (fail-not-billed).

**Worked examples** (FREE tier, base fee included):

| Order | Calculation | Total |
| --- | --- | --- |
| 1 product | min-charge floor applies | **$0.04** |
| 10 products | $0.01 base fee + 10 × $0.006 | **$0.07** |
| 30 products | $0.01 base fee + 30 × $0.006 | **$0.19** |
| 100 products | $0.01 base fee + 100 × $0.006 | **$0.61** |

The flat $0.01 base fee amortizes across the batch — the larger the run, the closer your effective per-product price gets to the raw $0.006 (or $0.0042 on GOLD+).

#### How this compares to alternatives

| | **This Actor** | Manual checking | Generic browser automation |
| --- | --- | --- | --- |
| Input per run | Up to **100 product URLs** in one batch | One page at a time | You build & maintain selectors |
| Output | Typed rows: price/sold/rating/shop + freshness timestamp | Notes & screenshots | Raw HTML you parse yourself |
| Anti-bot handling | Residential exits + proven captcha-free route, included | Your own account risk | Your problem |
| Billing | Per delivered product; failures cost $0; hard budget cap | Your hours | Your infra bill |
| Failure honesty | Per-URL verdict ledger (delivered / captcha / 404 / deadline) | — | — |

***

### Limits & caveats (read once, trust us more)

- **US-first.** The captcha-free route is proven for US-marketplace products. Other regions (UK/ID/TH/VN/MY/PH) are accepted and labelled; if a regional page serves a captcha, the row is marked `CAPTCHA` and **not charged**.
- **Keyword search is not in v1** — this Actor takes product URLs directly. Search is on the roadmap (v1.5). Collect links from TikTok videos, lives or your own catalog.
- **Visible-data only.** What the storefront page shows, we extract; private backend data (exact inventory, ad metrics) is not available to any scraper.
- **Pacing by design.** Requests are spaced 6–8s on rotating residential exits — 100 URLs take ~15 minutes. Fast enough for research, gentle enough to stay under the radar.
- **Typical delivery rate is ~1 in 3 under the current CAPTCHA wall.** TikTok Shop serves an intermittent slider puzzle on the product route; our in-page solver clears most of them, but in real batch runs roughly a third of live URLs come back delivered while the rest are marked `CAPTCHA`. **This is disclosed on purpose:** every blocked URL costs **$0.00** (fail-not-billed), and the per-URL SUMMARY ledger shows the exact verdict for each link, so you only ever pay for what you receive. Paste more URLs than you strictly need, or re-run the blocked ones — you are never charged for a link we could not open.

### FAQ

**Do I need a TikTok account?** No.
**What if a URL is dead or delisted?** It's classified (`ROUTE_404`), listed in the SUMMARY ledger and never charged.
**What if a page hits a captcha?** Same: `CAPTCHA` verdict, honest ledger, no charge for that URL.
**Can I schedule this?** Yes — run a Task on a schedule (e.g. daily) for price/sold-count tracking; each scheduled run pays only for what it delivers.
**How do I get product URLs?** From TikTok video product anchors, live-shopping carts, your store backend export, or any shared product link — every shape is accepted.

### For AI agents

Built to be called by software, not just clicked by people:

- **Complete output schema** — every field typed and documented (input, dataset, key-value and output schemas), so tool-calling loops parse results without guesswork.
- **API-first** — one POST to `run-sync-get-dataset-items` returns the final dataset in a single call; no browser session, login or captcha step.
- **Agentic payments ready** — `maxTotalChargeUsd` sets a hard per-run budget the platform enforces, fail-not-billed (zero-delivery runs cost $0), machine-readable per-URL verdict semantics in SUMMARY (`OK` / `CAPTCHA` / `ROUTE_404` / `PARSE_EMPTY` / `RATE_LIMITED` / `IP_BLOCK` / `DEADLINE` / `INVALID_URL` / `INVALID_ID`), and a machine-readable run-level `errorCode` (`NO_INPUT` / `CAPTCHA` / `ROUTE_404` / `PARSE_EMPTY` / `PARTIAL_DEADLINE`). Safe to hand an autonomous agent a budget and let it decide.

### Copy to your AI assistant

```text
Use the Apify Actor crawleast/tiktok-shop-product-scraper to fetch TikTok
Shop product details. POST this JSON to
https://api.apify.com/v2/acts/crawleast~tiktok-shop-product-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>
body: {"productUrls": ["https://www.tiktok.com/view/product/<id>"],
"region": "US", "maxTotalChargeUsd": 2}.
Each dataset row is one product: price, units sold, rating, shop. The
SUMMARY key-value record accounts for every input URL and the billing
ledger. Report price, soldCount and rating per product.
```

For large batches (100 URLs ≈ 15 minutes), append `?timeout=1500` (seconds) to the sync endpoint or poll `runs/{runId}` — otherwise the gateway may return 408 while the run keeps working.

***

### Input reference

| Field | Type | Default | Description |
| --- | --- | --- | --- |
| `productUrls` | array of strings **or** a single string | — | Up to 100 TikTok Shop product URLs; any link shape, duplicates removed. A lone string is normalized to a one-item array, and single-value aliases `productUrl` / `url` are accepted too. Leave it empty (or omit it) and the run ends honestly as `NO_INPUT` at $0 |
| `region` | select | `US` | Marketplace label attached to each row (US/UK/ID/TH/VN/MY/PH) |
| `enrichShop` | boolean | `false` | Best-effort shop identity from on-page signals (shop storefronts themselves are captcha-walled) |
| `maxTotalChargeUsd` | number | `2` | Hard per-run billing ceiling; overflow delivered uncharged and declared |

### Related Actors

| Actor | Use it for | Then… |
| --- | --- | --- |
| **[TikTok Shop Product Scraper](https://apify.com/crawleast/tiktok-shop-product-scraper)** (this one) | Price/sold/rating detail from TikTok Shop product URLs | — |
| **[1688 Product Scraper](https://apify.com/crawleast/1688-product-scraper)** | Keyword research across ANY 1688 category: factory prices, MOQ ladders, landed cost | Find the China source behind a TikTok winner |
| **[1688 Image Search Scraper](https://apify.com/crawleast/1688-image-search-scraper)** | Reverse image search on 1688 — find the factory from a product photo | Screenshot a TikTok product → match its supplier |
| **[1688 Pet Supplies Scraper](https://apify.com/crawleast/china-pet-supplies-scraper)** | Keyword-driven 1688 market research for the pet vertical | Niche deep-dives before you commit |

Pipeline: spot a trending product on TikTok → check its real price/sold count with **this Actor** → find the factory behind it with the **Image Search Scraper** (photo) or the **Product Scraper** (keyword) → validate landed cost before you source.

### Reviews & changelog

Found a bug or have a wishlist? Open an **Issue** — a fixed bug helps you more than a one-star rating, and we answer fast.

If this run saved you time, a quick review on the Store page helps other buyers find it — 10 seconds, hugely appreciated.

**Changelog**

- **0.1.0 (2026-09-01)** — Narrow-gate v1: productUrls direct-detail scraper (up to 100/run), www-domain SSR channel (proven captcha-free), 13-field rows with dataQuality markers, per-URL honest ledger, $0.006/item + $0.01 run base fee on success, hard budget cap. Keyword search deferred to v1.5.

**Roadmap / post-launch backlog** (tracked here for transparency — not yet shipped):

- **Raise the delivery rate above the ~1-in-3 CAPTCHA baseline.** Two concrete follow-ups are queued: (1) *solver hardening* — after a puzzle is marked solved, re-verify that real product signals hydrated before declaring success, and (2) *automatic single retry* of `CAPTCHA` URLs on a fresh residential session within the same run. Both aim to convert more live URLs into delivered rows without touching the fail-not-billed contract. Until they land, blocked URLs stay $0.00 and fully auditable in the ledger.
- **Keyword search (v1.5)** — turn a search term into product URLs, gated on proving the search entry route is reliably captcha-survivable.

# Actor input Schema

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

TikTok Shop product page URLs to fetch (up to 100 per run, duplicates auto-removed). Accepts any product-link shape: https://www.tiktok.com/view/product/<id>, https://shop.tiktok.com/view/product/<id>, regional pdp links (https://shop.tiktok.com/us/pdp/<slug>/<id>) and partner links with tracking parameters — the numeric product ID is extracted automatically. You may also pass a single URL string, or use the single-value aliases "productUrl" / "url"; the Actor normalizes any of these to a one-item list. Leaving this empty ends the run honestly as NO\_INPUT at $0.

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

Marketplace label attached to every delivered row (informational; the scraper fetches the product page as served). US is the primary market.

## `enrichShop` (type: `boolean`):

Best-effort shop identity extraction (name and ID) from on-page signals. Note: shop.tiktok.com storefront pages are captcha-walled, so shop fields come only from the product page itself — no extra requests are made.

## `maxTotalChargeUsd` (type: `number`):

Hard per-run billing ceiling. Charging stops at this amount; items beyond the cap are still delivered but marked uncharged in the SUMMARY ledger — nothing is dropped silently. Default $2 covers ~330 products at the $0.006 per-item rate.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.tiktok.com/view/product/1729493620818874839"
  ],
  "region": "US",
  "enrichShop": false,
  "maxTotalChargeUsd": 2
}
```

# Actor output Schema

## `results` (type: `string`):

One row per delivered TikTok Shop product: title, price with currency, sold count, rating and review count where visible, shop identity, product URL, image URL, region, data-quality marker and a scrapedAt freshness timestamp. Field meanings are described in the dataset schema (Overview view).

## `runSummary` (type: `string`):

Machine-readable run report stored under the SUMMARY key: run-level outcome errorCode (NO\_INPUT / CAPTCHA / ROUTE\_404 / PARSE\_EMPTY / PARTIAL\_DEADLINE or null on success), item totals, and a per-URL verdict ledger accounting for every input URL. Each ledger entry carries a semantics label — OK, CAPTCHA, ROUTE\_404, PARSE\_EMPTY, RATE\_LIMITED, IP\_BLOCK, DEADLINE, or the deterministic input rejections INVALID\_URL (not a TikTok product link) and INVALID\_ID (obvious placeholder id) — plus the billing ledger (charged vs intended events, budget-cap truncation) and channel diagnostics.

# 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://www.tiktok.com/view/product/1729493620818874839"
    ],
    "region": "US",
    "enrichShop": false,
    "maxTotalChargeUsd": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawleast/tiktok-shop-product-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://www.tiktok.com/view/product/1729493620818874839"],
    "region": "US",
    "enrichShop": False,
    "maxTotalChargeUsd": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("crawleast/tiktok-shop-product-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://www.tiktok.com/view/product/1729493620818874839"
  ],
  "region": "US",
  "enrichShop": false,
  "maxTotalChargeUsd": 2
}' |
apify call crawleast/tiktok-shop-product-scraper --silent --output-dataset

```

## MCP server setup

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