# TikTok Shop Trending Products (`maximedupre/tiktok-trending-products`) Actor

Find public TikTok Shop products in the US. Search by trend, product term, hashtag, or public product or storefront link. Get ranked trend data, price, seller, demand, and other details when available.

- **URL**: https://apify.com/maximedupre/tiktok-trending-products.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Social media, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.70 / 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?

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

### 🛍️ Find TikTok Shop products that are trending

For ecommerce sellers, product researchers, and marketing teams, this Actor finds public TikTok Shop products in the US, saves one row for each product, and keeps the first match. Rows can include product links, trend rank, prices, demand signals, seller details, variants, shipping, linked videos, and source warnings when available. Use the data to compare product ideas, inspect a product, and build a simple trend list with less manual copying.

- Review the **[TikTok Shop Marketplace](https://apify.com/maximedupre/tiktok-trending-products/examples/tiktok-shop-marketplace)** for ranked products and seller details.
- Compare current ranks with **[Trending Items on TikTok This Week](https://apify.com/maximedupre/tiktok-trending-products/examples/trending-items-on-tiktok-this-week)**.
- Find public demand signals for **[Top Selling TikTok Products](https://apify.com/maximedupre/tiktok-trending-products/examples/top-selling-tiktok-products)**.
- Scan **[Viral Products Right Now](https://apify.com/maximedupre/tiktok-trending-products/examples/viral-products-right-now)** for product ideas with trend context.
- Use **[Viral Things to Buy](https://apify.com/maximedupre/tiktok-trending-products/examples/viral-things-to-buy)** to review public product details.
- Explore **[TikTok Trending Products 2026](https://apify.com/maximedupre/tiktok-trending-products/examples/tiktok-trending-products-2026)** for current product ranks.

#### 📊 Ranked TikTok Shop product rows

Each saved row is the first match for one source product. If the same product appears again through another keyword, hashtag, URL, or other submitted value, later matches are ignored. A row can include public product, trend, pricing, demand, seller, variant, shipping, and linked video data. Fields may be omitted when the public source does not expose them.

Sales counts and movement values are estimates from public signals. They are not official platform totals. `parseQualityWarnings` records source-backed notes when extraction is incomplete or uncertain.

#### ▶️ Pick one way to find products

Choose one discovery method for each run. The matching input field is used for that method, while other discovery fields are ignored. The current supported market is `US`. You can limit a query by category, choose a complete feed or a lighter leaderboard, and carry optional attribution on purchase links.

To keep a run smaller, set **Maximum products** or choose **Leaderboard only**. For repeated scheduled runs, later snapshots can provide estimated sales velocity, price movement, rank movement, and new-entry signals when the source provides enough data.

#### ⚙️ Input

Choose one discovery method, then set the options that apply to it.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `discoveryMethod` | string | Chooses `trending`, `searchTerm`, `hashtag`, or `publicReferences` as the one discovery path for the run. |
| `searchTerm` | string | Supplies one product search term when `discoveryMethod` is `searchTerm`. |
| `hashtag` | string | Supplies one product-related TikTok hashtag, with or without `#`, when `discoveryMethod` is `hashtag`. Related public videos, creators, descriptions, and links may be returned. |
| `publicReferences` | array of objects | Supplies one or more public TikTok Shop product or storefront links when `discoveryMethod` is `publicReferences`. |
| `publicReferences[].url` | string | Gives a public TikTok Shop product or storefront URL. |
| `market` | string | Chooses the supported market. The current value is `US`. |
| `category` | string | Optionally limits discovery to one product category. Leave it empty to include all categories. |
| `outputView` | string | Chooses `enriched` for the complete trend feed or `leaderboard` for the lighter ranked view. |
| `affiliateAttribution` | string | Optionally carries buyer-supplied attribution on included TikTok Shop purchase links. Leave it empty to omit it. |
| `maxItems` | integer | Optionally limits the number of product rows. Leave it empty to return all available results until the source is exhausted. The form starts with a prefill of `50`. |

**Default input**

This is the public input from the successful Hosted QA default-input run:

```json
{
  "discoveryMethod": "trending",
  "market": "US",
  "outputView": "enriched",
  "maxItems": 50
}
```

#### 🧾 Output

The run output contains a link to the default Apify dataset.

**Run output**

| Field | Type | What it does |
|---|---|---|
| `datasetItems` | string | Links to the items in the run's default Apify dataset. |

**Complete feed rows (`enriched`)**

Every row has `product`. Other sections and nested fields appear when the public source exposes them. This table covers the complete enriched row shape.

| Field | Type | What it does |
|---|---|---|
| `product` | object | Product identity, description, category, images, and purchase link. |
| `product.id` | string | Stable source product ID. |
| `product.name` | string | Product name shown by the public source. |
| `product.description` | string | Product description shown by the public source when available. |
| `product.category` | string | Product category shown by the public source when available. |
| `product.purchaseUrl` | string | Usable public TikTok Shop product link, with requested attribution when it was applied. |
| `product.images` | array of strings | Public image links for the product. |
| `trend` | object | Rank and movement signals from the trend feed and successive snapshots when ranking context is available. |
| `trend.rank` | integer | Product rank in the public trend feed. |
| `trend.estimatedSalesVelocity` | number | Estimated products sold per day from public signals or successive snapshots. |
| `trend.estimatedRankChange` | integer | Estimated change in trend rank between successive snapshots. A positive value means the rank number increased. |
| `trend.estimatedPriceChange` | object | Estimated product price movement between successive snapshots. |
| `trend.estimatedPriceChange.amount` | number | Estimated price change. A negative value means the price fell. |
| `trend.estimatedPriceChange.currency` | string | Currency used for the estimated price change. |
| `trend.isNewEntry` | boolean | Says whether the product is new in the successive trend snapshots. |
| `pricing` | object | Current and original public prices, currency, and sale text when available. |
| `pricing.current` | number | Current public product price. |
| `pricing.original` | number | Original public product price before a sale when available. |
| `pricing.currency` | string | Currency shown for the product prices. |
| `pricing.discountText` | string | Sale or discount text shown by the public source when available. |
| `demand` | object | Public sold-count, rating, and review signals. |
| `demand.estimatedSoldCount` | integer | Estimated units sold from the public source. It is not an official platform total. |
| `demand.rating` | number | Public product rating. |
| `demand.reviewCount` | integer | Public number of product reviews. |
| `seller` | object | Public shop or seller context linked to the product. |
| `seller.name` | string | Seller or shop name shown by the public source. |
| `seller.url` | string | Public seller or shop link. |
| `variants` | array of objects | Available product variants with public price and stock details. |
| `variants[].id` | string | Source variant ID used to match the variant to price or stock data. |
| `variants[].name` | string | Variant name or option shown by the public source. |
| `variants[].currentPrice` | number | Current public price for the variant. |
| `variants[].currency` | string | Currency shown for the variant price. |
| `variants[].stock` | integer | Public stock count for the variant. |
| `variants[].availability` | string | Availability text or state shown by the public source. |
| `shipping` | object | Public shipping cost, method, and delivery estimate. |
| `shipping.cost` | number | Public shipping cost. A value of zero means shipping is free. |
| `shipping.currency` | string | Currency shown for the shipping cost. |
| `shipping.method` | string | Shipping method shown by the public source. |
| `shipping.deliveryEstimate` | string | Public delivery estimate shown by the source. |
| `videos` | array of objects | Public promotional or product-related TikTok videos linked to the product. |
| `videos[].url` | string | Public TikTok video link. |
| `videos[].description` | string | Public video description. |
| `videos[].creator` | object | Public creator context for the video. |
| `videos[].creator.name` | string | Creator name shown by the public source. |
| `videos[].creator.handle` | string | Creator handle shown by the public source. |
| `videos[].creator.url` | string | Public creator profile link. |
| `videos[].engagement` | object | Public engagement counts for the video. |
| `videos[].engagement.views` | integer | Public number of video views. |
| `videos[].engagement.likes` | integer | Public number of video likes. |
| `videos[].engagement.comments` | integer | Public number of video comments. |
| `videos[].engagement.shares` | integer | Public number of video shares. |
| `parseQualityWarnings` | array of strings | Source-backed warnings about incomplete or uncertain extraction. It is omitted when no warning applies. |
| `parseQualityWarnings[]` | string | One source-backed extraction warning. |

**Example complete feed row**

This is one complete, unshortened row from a successful current-beta run. The source did not link videos to this product, so `videos` is absent from this row.

```json
{
  "product": {
    "id": "1729474720341987991",
    "name": "Magnetic Mobile Phone Neck Mount - Silicone-Steel Metal Hands-Free Holder with Plug, Landscape-Ready POV/Vlog Chest Strap for iPhone 17/16/15/14, Cellphone Accessories for Android Smartphones",
    "purchaseUrl": "https://shop.tiktok.com/us/pdp/magnetic-neck-mount-by-brand-for-iphone-16-android-hands-free-vlog-holder/1729474720341987991",
    "description": "【Effortless Quick-Release】Say goodbye to fussy setups! Our innovative neck mount features one-button quick release technology. With just one click, you can effortlessly unlock and operate it. Truly plug and play, making it easy to wear.\n【Secure Magnetic Disassembly】Fearlessly shoot with our magnetic fast disassembly design. Equipped with 20 robust aluminum magnets, your phone stays firmly in place. The integrated zinc alloy rod lift structure ensures fast and easy installation, enabling first-person shooting without the hassle of dismantling.\n【Versatile Shooting Angles】Switch between portrait and landscape modes effortlessly with our necklace phone holder. Perfect for content creators, it offers various shooting modes: landscape, portrait, overhead, and low-angle, giving you the flexibility to capture your vision.\n【Durable and Comfortable】Crafted with a triple-layer structure, our magnetic neck brace ensures durability and comfort. A stainless steel gooseneck encased in solid aluminum provides sturdy support, while a skin-friendly silicone exterior prevents deformation, cracking, and breakage.\n【Wide Compatibility】Compatible with a wide range of phone models including iPhone , 13, 14, 15, 16 and 17 series, as well as Samsung Galaxy, LG, Motorola, Moto, Google Pixel series, and more. Note: For phones without built-in magnetism, simply use the included metal ring and case.\nNote: Please avoid using your phone to shoot videos during intense or extreme sports.",
    "category": "phones electronics",
    "images": [
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/ff9cf76d1cb94a2ab992c6397f0b1b49~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/ff9cf76d1cb94a2ab992c6397f0b1b49~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/7755f340c63241efad1b71129fa837de~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/7755f340c63241efad1b71129fa837de~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ff68ad5e8a974436aa1ad0e8a4eba539~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ff68ad5e8a974436aa1ad0e8a4eba539~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/92c16d8a524b403882da659f59db669d~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/92c16d8a524b403882da659f59db669d~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/103fba3fc48547f790fcd705254f55f0~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/103fba3fc48547f790fcd705254f55f0~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/3def021915cb4e0984d218938e3fb615~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/3def021915cb4e0984d218938e3fb615~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/c7163ef858814270bb51b7ed713caff6~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/c7163ef858814270bb51b7ed713caff6~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839"
    ]
  },
  "trend": {
    "rank": 1,
    "estimatedRankChange": 0,
    "estimatedSalesVelocity": 0,
    "estimatedPriceChange": {
      "amount": 0,
      "currency": "USD"
    },
    "isNewEntry": false
  },
  "pricing": {
    "current": 15.99,
    "currency": "USD"
  },
  "demand": {
    "estimatedSoldCount": 97967,
    "rating": 4.5,
    "reviewCount": 9072
  },
  "seller": {
    "name": "Erligpowht",
    "url": "https://shop.tiktok.com/us/store/erligpowht/7495282776778771095"
  },
  "variants": [
    {
      "id": "1729474729955070615",
      "name": "114-GBZJ01-GY",
      "currentPrice": 15.99,
      "currency": "USD",
      "stock": 23218,
      "availability": "available"
    }
  ],
  "shipping": {
    "cost": 0,
    "currency": "USD",
    "method": "LSV-TTS-US-NEW-4PL-Std",
    "deliveryEstimate": "7-11 days"
  },
  "parseQualityWarnings": [
    "Some optional product details were not available from the live source.",
    "The live ranking response did not include original price.",
    "The live ranking response did not include discount text."
  ]
}
```

**Leaderboard rows (`leaderboard`)**

Leaderboard rows from trend or hashtag discovery keep the product identity, trend signals, current public price, demand signals, and source warnings. Seller, variants, shipping, and linked videos are not part of this lightweight row shape.

| Field | Type | What it does |
|---|---|---|
| `product` | object | Product identity, images, and purchase link. |
| `product.id` | string | Stable source product ID. |
| `product.name` | string | Product name shown by the public source. |
| `product.purchaseUrl` | string | Public TikTok Shop product link. |
| `product.images` | array of strings | Public image links for the product. |
| `trend` | object | Rank and movement signals from the trend feed when ranking context is available. |
| `trend.rank` | integer | Product rank in the public trend feed. |
| `trend.estimatedSalesVelocity` | number | Estimated products sold per day from public signals or successive snapshots. |
| `trend.estimatedRankChange` | integer | Estimated change in trend rank between successive snapshots. A positive value means the rank number increased. |
| `trend.estimatedPriceChange` | object | Estimated product price movement between successive snapshots. |
| `trend.estimatedPriceChange.amount` | number | Estimated price change. A negative value means the price fell. |
| `trend.estimatedPriceChange.currency` | string | Currency used for the estimated price change. |
| `trend.isNewEntry` | boolean | Says whether the product is new in the successive trend snapshots. |
| `pricing` | object | Current public price and currency, with original price or sale text when available. |
| `pricing.current` | number | Current public product price. |
| `pricing.original` | number | Original public product price when available. |
| `pricing.currency` | string | Currency shown for the product price. |
| `pricing.discountText` | string | Sale or discount text shown by the public source when available. |
| `demand` | object | Public sold-count, rating, and review signals. |
| `demand.estimatedSoldCount` | integer | Estimated units sold from the public source. It is not an official platform total. |
| `demand.rating` | number | Public product rating. |
| `demand.reviewCount` | integer | Public number of product reviews when available. |
| `parseQualityWarnings` | array of strings | Source-backed warnings about incomplete or uncertain extraction. |
| `parseQualityWarnings[]` | string | One source-backed extraction warning. |

**Example leaderboard row**

This is one genuine row from a successful current-beta leaderboard run.

```json
{
  "product": {
    "id": "1729474720341987991",
    "name": "Magnetic Mobile Phone Neck Mount - Silicone-Steel Metal Hands-Free Holder with Plug, Landscape-Ready POV/Vlog Chest Strap for iPhone 17/16/15/14, Cellphone Accessories for Android Smartphones",
    "purchaseUrl": "https://shop.tiktok.com/us/pdp/magnetic-neck-mount-by-brand-for-iphone-16-android-hands-free-vlog-holder/1729474720341987991",
    "images": [
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/ff9cf76d1cb94a2ab992c6397f0b1b49~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=a6e80448&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/e57ed37c0a98478e841394682ce152f1~tplv-fhlh96nyum-origin-image.image?dr=12179&t=555f072d&ps=933b5bde&shp=cde50ccb&shcp=9b759fb9&idc=useast5&from=3454340299",
      "https://p16-oec-general.ttcdn-us.com/tos-maliva-i-o3syd03w52-us/flash_fill_icon_light_20250430.png~tplv-fhlh96nyum-resize-png:800:800.png?dr=12184&t=555f072d&ps=933b5bde&shp=cde50ccb&shcp=d9d491bf&idc=useast5&from=3454340299"
    ]
  },
  "trend": {
    "rank": 1,
    "estimatedRankChange": 0,
    "estimatedSalesVelocity": 19225.763818180592,
    "estimatedPriceChange": {
      "amount": 0,
      "currency": "USD"
    },
    "isNewEntry": false
  },
  "pricing": {
    "current": 15.99,
    "currency": "USD"
  },
  "demand": {
    "estimatedSoldCount": 98000,
    "rating": 4.5
  },
  "parseQualityWarnings": [
    "The live ranking response did not include original price.",
    "The live ranking response did not include discount text."
  ]
}
```

**Direct reference rows (`publicReferences`)**

When a public product or storefront link does not provide ranking context, a row can omit `trend` and `videos`. It keeps the available product, pricing, demand, seller, variant, shipping, and warning fields below.

| Field | Type | What it does |
|---|---|---|
| `product` | object | Product identity, description, category, images, and purchase link. |
| `product.id` | string | Stable source product ID. |
| `product.name` | string | Product name shown by the public source. |
| `product.description` | string | Product description shown by the public source when available. |
| `product.category` | string | Product category shown by the public source when available. |
| `product.purchaseUrl` | string | Usable public TikTok Shop product link, with requested attribution when it was applied. |
| `product.images` | array of strings | Public image links for the product. |
| `pricing` | object | Current and original public prices, currency, and sale text when available. |
| `pricing.current` | number | Current public product price. |
| `pricing.original` | number | Original public product price before a sale when available. |
| `pricing.currency` | string | Currency shown for the product prices. |
| `pricing.discountText` | string | Sale or discount text shown by the public source when available. |
| `demand` | object | Public sold-count, rating, and review signals. |
| `demand.estimatedSoldCount` | integer | Estimated units sold from the public source. It is not an official platform total. |
| `demand.rating` | number | Public product rating. |
| `demand.reviewCount` | integer | Public number of product reviews when available. |
| `seller` | object | Public shop or seller context when the lookup provides it. |
| `seller.name` | string | Seller or shop name shown by the public source. |
| `seller.url` | string | Public seller or shop link. |
| `variants` | array of objects | Available product variants with public price and stock details when available. |
| `variants[].id` | string | Source variant ID used to match the variant to price or stock data. |
| `variants[].name` | string | Variant name or option shown by the public source. |
| `variants[].currentPrice` | number | Current public price for the variant. |
| `variants[].currency` | string | Currency shown for the variant price. |
| `variants[].stock` | integer | Public stock count for the variant. |
| `variants[].availability` | string | Availability text or state shown by the public source. |
| `shipping` | object | Public shipping cost, method, and delivery estimate when available. |
| `shipping.cost` | number | Public shipping cost. A value of zero means shipping is free. |
| `shipping.currency` | string | Currency shown for the shipping cost. |
| `shipping.method` | string | Shipping method shown by the public source. |
| `shipping.deliveryEstimate` | string | Public delivery estimate shown by the source. |
| `parseQualityWarnings` | array of strings | Source-backed warnings about incomplete or uncertain extraction. |
| `parseQualityWarnings[]` | string | One source-backed extraction warning. |

**Example direct reference row**

This is one genuine row from a successful current-beta public-reference run.

```json
{
  "product": {
    "id": "1729474720341987991",
    "name": "Magnetic Mobile Phone Neck Mount - Silicone-Steel Metal Hands-Free Holder with Plug, Landscape-Ready POV/Vlog Chest Strap for iPhone 17/16/15/14, Cellphone Accessories for Android Smartphones",
    "purchaseUrl": "https://shop.tiktok.com/us/pdp/magnetic-neck-mount-by-brand-for-iphone-16-android-hands-free-vlog-holder/1729474720341987991",
    "images": [
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/ff9cf76d1cb94a2ab992c6397f0b1b49~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/ff9cf76d1cb94a2ab992c6397f0b1b49~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/7755f340c63241efad1b71129fa837de~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/7755f340c63241efad1b71129fa837de~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ff68ad5e8a974436aa1ad0e8a4eba539~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/ff68ad5e8a974436aa1ad0e8a4eba539~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/92c16d8a524b403882da659f59db669d~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/92c16d8a524b403882da659f59db669d~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/103fba3fc48547f790fcd705254f55f0~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/103fba3fc48547f790fcd705254f55f0~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/3def021915cb4e0984d218938e3fb615~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/3def021915cb4e0984d218938e3fb615~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/c7163ef858814270bb51b7ed713caff6~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
      "https://p19-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/c7163ef858814270bb51b7ed713caff6~tplv-fhlh96nyum-crop-webp:3000:3000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839"
    ]
  },
  "pricing": {
    "current": 15.99,
    "currency": "USD"
  },
  "demand": {
    "estimatedSoldCount": 97967,
    "rating": 4.5,
    "reviewCount": 9072
  },
  "parseQualityWarnings": [
    "Some optional product details were not available from the live source."
  ]
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The primary event covers one public product saved to your dataset. The current per-event price is shown in the Apify pricing panel.

| Event | What it covers |
|---|---|
| `tiktok_shop_product` | One public product saved to your dataset. |

#### 🔌 Integrations

See the workflow video:

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

Use the standard Apify console or API to start a run and read the `datasetItems` link.

#### ❓ FAQ

##### What if the source does not show a price or seller?

The Actor keeps the fields that the public source provides. Missing optional fields are omitted, and `parseQualityWarnings` can explain incomplete extraction.

##### What does Leaderboard only return?

It returns a lighter ranked view with product identity, trend signals, public price, demand signals, and source warnings when available. It does not include the enriched seller, variant, shipping, or linked-video sections.

##### Are sold counts and movement numbers official?

No. Public sold counts and movement values are estimates. They are not official TikTok Shop totals or guaranteed sales figures.

##### Can I search by a product term or hashtag?

Yes. Choose `Search term` or `Hashtag`, then fill only its matching field. A hashtag run may also return related public videos, creators, descriptions, and links.

##### Can I inspect a direct product or storefront link?

Yes. Choose `Public product or storefront links` and add one or more public TikTok Shop URLs.

##### How can I get all available results?

Clear `Maximum products`. Leaving it empty returns all available results until the source is exhausted.

##### Can I track changes over time?

Yes. Repeat the run on a schedule and compare successive snapshots for estimated sales velocity, price movement, rank movement, and new-entry signals when enough public data is available.

##### Do I need a TikTok Shop account or Shop API access?

No buyer-provided seller account, Shop API access, or source credential is required. The Actor uses public TikTok and TikTok Shop surfaces.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~tiktok-trending-products/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [TikTok Shop Scraper No Cookies](https://apify.com/maximedupre/tiktok-shop-scraper-no-cookies) - Inspect public TikTok Shop product pages and rankings for product and seller details.
- [TikTok Hashtag Search Scraper](https://apify.com/maximedupre/tiktok-hashtag-search-scraper) - Find public hashtag metrics to expand product trend research.
- [TikTok Search Scraper](https://apify.com/maximedupre/tiktok-search-results-scraper) - Search public TikTok videos for broader product-related context.
- [TikTok Keywords Discovery Tool](https://apify.com/maximedupre/tiktok-keywords-discovery-tool) - Expand product seeds into TikTok autocomplete suggestions.
- [Amazon Price Tracker](https://apify.com/maximedupre/amazon-price-tracker) - Compare candidate product prices with public Amazon snapshots.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find publicly visible TikTok Shop products. The selected method uses only its matching input field.

## `searchTerm` (type: `string`):

Enter one product search term for TikTok Shop discovery.

## `hashtag` (type: `string`):

Enter one product-related TikTok hashtag, with or without the # sign. This method also finds related public videos, creators, descriptions, and links.

## `publicReferences` (type: `array`):

Add one or more public TikTok Shop product or storefront URLs. The results include the available product and seller context.

## `market` (type: `string`):

Use the US market. It is the only market supported by this Actor.

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

Optional. Enter one product category to limit discovery. Leave it empty to include all categories.

## `outputView` (type: `string`):

Choose the product rows to return. The complete trend feed includes available trend, pricing, seller, demand, variant, shipping, and video context. Leaderboard only returns the ranked lightweight view.

## `affiliateAttribution` (type: `string`):

Optional affiliate attribution to carry on included TikTok Shop purchase links. Leave it empty to omit it.

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

Optional positive limit for the number of product rows to return. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "discoveryMethod": "trending",
  "market": "US",
  "outputView": "enriched",
  "maxItems": 50
}
```

# Actor output Schema

## `datasetItems` (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 = {
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/tiktok-trending-products").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 = { "maxItems": 50 }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/tiktok-trending-products").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 '{
  "maxItems": 50
}' |
apify call maximedupre/tiktok-trending-products --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/tiktok-trending-products"
        }
    }
}

```

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/T67UXjVR1g0h7xsqO/builds/xQMG0m2bV4uBQ2A8g/openapi.json
