# TikTok Shop Scraper: Products, Prices and Units Sold

> TikTok Shop scraper: get products, prices, units sold, ratings, variants and shop stats from keywords, categories or links. No login or cookies.

URL: https://cliqtomedia.com/actors/tiktok-shop-scraper/

Category: E-commerce & prices · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/tiktok-shop-scraper?fpr=cliqto

Get public TikTok Shop products without login or cookies. Search by keyword, or start from product, category or shop links. Each row has price, units sold, rating and shop stats.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `phone stand` in Search keywords. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Give this Actor search keywords or public [TikTok Shop](https://shop.tiktok.com/us) links, and get one table row per product with price, units sold, rating, variants, shipping and shop stats. It needs no login or cookies, and a typical run of 10 products costs about $0.03.



### Good for

- You research products before you sell them.
- You compare prices and units sold across shops.
- You watch a list of products or a shop every day.
- You need public data in a spreadsheet or an API, without a TikTok account.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.002 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Product saved | $0.002 (from $0.0014 on paid Apify plans) | One product saved to your dataset. |
| Page checked | $0.0005 (from $0.00035 on paid Apify plans) | One TikTok Shop page checked, including product pages opened for full details and pages with no new results. |

- One result: about $0.004.
- 1,000 results: about $2.00.
- Every day 100 results, for 30 days: about $6.06 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 8 November 2026. Current price: https://apify.com/cliqtomedia/tiktok-shop-scraper?fpr=cliqto

## Questions

### Do I need a TikTok account or cookies?

No. Only public pages are read, so you stay logged out.

### Is soldCount the real number of sales?

It is the counter that TikTok Shop shows on the page. We do not verify it.

### Can I get markets other than the US?

Not in this version. Only the US storefront is verified.

## Data fields

- `productId` (string): TikTok Shop product ID, for example 1730860052779143503.
- `title` (string): Product title shown in the store.
- `price` (number): Lowest current sale price, in the currency below. Null when the store shows no price.
- `currency` (string): Currency code for the observed price.
- `originalPrice` (number): Price before the discount. Null when the store shows no old price.
- `discountPercent` (number): Discount percentage reported for the cheapest SKU.
- `soldCount` (number): Cumulative units sold reported by the storefront.
- `rating` (number): Average star rating from 1 to 5. Null when the product has no rating.
- `reviewCount` (number): Number of reviews the store reports.
- `shopName` (string): Name of the shop that sells the product.
- `sellerId` (string): TikTok Shop seller ID.
- `url` (string): Public product page link.
- `images` (array/string): Product gallery image links. These links can expire.
- `region` (string): Market of the storefront, for example US.
- `source` (string): Website that gave the data: shop.tiktok.com.
- `fetchedAt` (string): UTC time when this product was fetched.
- `video` (object/string): Public promotional video attached to a search result, with creator and engagement data.
- `description` (string): Product description text. Null when full details are off.
- `skus` (array/string): Variant IDs, prices, properties and stock reported by the storefront.
- `shipping` (object/string): Public delivery information for the storefront context, without a buyer address.
- `ratingDistribution` (object/string): Counts of reviews with one through five stars.
- `reviews` (array/string): Public review sample with buyer names removed. This is not the full history.
- `detailsFetched` (boolean): True when the Actor opened the product page for full details.
- `specifications` (array/string): Name and value pairs from the product page, such as material or model.
- `available` (boolean): True when the store says the product can be delivered in this storefront context.
- `reviewsHasMore` (boolean): Whether the storefront reports more reviews beyond the public sample.
- `shop` (object/string): Shop totals: units sold, products on sale, reviews, followers, videos and rating.
- `changeStatus` (string): Only with Track changes: new, changed, unchanged, or unknown when full details could not be read. Empty otherwise.
- `salesDelta` (number): Increase in the sold counter since the previous observation; null for a new or reset counter.
- `previousFetchedAt` (string): Time of the previous observation. Only with Track changes.
- `productVideo` (object/string): Product demonstration media. It may have no associated public creator profile.
- `sourceGenerated` (object/string): Text generated by TikTok Shop, kept separate from the product description.
- `categories` (array/string): Category path reported on the product page.
- `brand` (string): Brand reported in the listing or specifications.
- `variants` (array/string): Variant property names and available values.
- `salesTrend` (string): Rising or flat based on the observed sales delta; unknown without a comparable baseline.
- `salesCounterReset` (boolean): True when the source sold counter decreased between observations.
- `descriptionImages` (array/string): Images embedded in the product description, separate from the product gallery.

## Input settings

- `mode` (string): Choose what to start from. Search uses Search keywords. Links in the fields below always run too, in any mode. Default: Search by keywords.
- `keywords` (array): Words to search in TikTok Shop, one phrase per line. Example: phone stand. Used only in Search mode. Leave empty with no links to search for phone stand.
- `maxItems` (integer): Stop after saving this many products across all inputs. Example: 50. Default: 10.
- `scanLimit` (integer): How many products to look through for each input when filters, sorting or Only changed products need more than Maximum products. Example: 300. Default: 100. Maximum products is used if it is higher. Each results page is a paid page check.
- `includeProductDetails` (boolean): Open each product for its description, variants, stock, shipping and public review sample. Each opened product is one more paid page check and takes about 3 seconds. Turn off for faster, cheaper lists. Default: on.
- `regions` (array): Storefront markets as two-letter codes. Example: US. Only US works in this release. Any other market stops the run with an error.
- `monitor` (boolean): Keep a baseline in a named store and compare price, units sold and stock with the previous run. Default: off.
- `stateName` (string): Use the same name to compare repeated runs. Letters, numbers and dashes, up to 63 characters. Example: phone-stands-daily. Leave empty to name it from the inputs.
- `onlyChanges` (boolean): With Track changes, save new and changed products only. Page checks are still paid. Default: off.
- `outputFormat` (string): Nested JSON keeps lists and objects. Flat cells store them as JSON text, which suits spreadsheets. Default: Nested JSON.
- `sortBy` (string): Rank the products checked for each input (see Products to check per input), then save the top ones. This does not rank the whole TikTok Shop catalogue. Default: TikTok Shop order.
- `productUrls` (array): One public link per line. Example: https://shop.tiktok.com/us/pdp/product/1730860052779143503
- `categoryUrls` (array): One public link per line. Example: https://shop.tiktok.com/us/c/cases-screen-protectors-stickers/601925
- `shopUrls` (array): One public link per line. Example: https://shop.tiktok.com/us/store/putare/7495880414145841487
- `minPrice` (number): Keep products at this price or higher. Example: 10. Products without this value are left out.
- `maxPrice` (number): Keep products at this price or lower. Example: 30. Products without this value are left out.
- `minRating` (number): Keep products with this rating or higher, from 1 to 5. Example: 4.5. Products without this value are left out.
- `minSoldCount` (number): Keep products with at least this many units sold. Example: 1000. Products without this value are left out.
- `titleContains` (array): Keep products whose title has all of these words. Upper or lower case does not matter. Example: magnetic.
- `excludeKeywords` (array): Leave out products whose title has any of these words. Upper or lower case does not matter. Example: case.
- `region` (string): Used when Markets is empty. US is the only verified storefront. Default: US.
- `deliveryConnector` (string): Your Slack, Notion or other MCP connector. After the run the Actor posts a short summary there. Connect services once in Apify Console → MCP connectors.
- `deliveryTarget` (string): Where to post the summary: a Notion page link (each run is added on top of that page) or a Slack channel ID. Leave empty to let the connector decide.

## Step by step on Apify

1. Open the input form. In box 1, keep Search by keywords.
2. In box 2, type what you want to find, one phrase per line. The example is `phone stand`.
3. In box 3, set Maximum products. The example is `10`.
4. In box 4, keep Full product details on to get variants, shipping and reviews. Turn it off for a faster and cheaper list.
5. Click Start. When the run ends, open the Output tab and download the table. Box 5 shows the main columns.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Find products that sell | Keywords, sort by Most units sold | One product row | `title`, `price`, `soldCount`, `rating`, `shopName` | Google Sheets, CSV |
| Check a competitor shop | Shop links | Product rows and a shop summary | `price`, `soldCount`, `shop`, `skus` | Excel, API |
| Watch prices and sales every day | Product links, Track changes on, schedule | Rows with a change status | `changeStatus`, `salesDelta`, `price`, `previousFetchedAt` | Slack, Notion, webhook |
| Explore one category | Category links, price and rating filters | Filtered product rows | `categories`, `price`, `rating`, `reviewCount` | Dataset API |
| Find creators who promote a product | Keywords, Full product details off | Rows with a promotional video | `video`, `soldCount`, `url` | CSV |

## Tips

- Only the US storefront is verified. Other markets stop the run before any page is paid for.
- Add more keywords or category links. One keyword gives a limited list.
- Turn on Track changes and keep the same Monitor name to see what changed.

## Limits



- Market: only the US storefront is verified. Any other market, in Markets or in a link, stops the run with an error before any page is paid for.
- Speed: full details take about 3 seconds per product. With the default Timeout of 300 seconds, three tests stopped at 89, 96 and 110 products. The source can block a run sooner when many runs go at the same time. The run then stops as partial and keeps the saved rows. For more, raise Timeout or turn off full details. With details off, 114 products took 24 seconds.
- Inputs run in order: in one test with 4 inputs and 300 seconds, the first keyword used the whole time and saved 89 products. The other inputs are listed in `unprocessedInputs`, and the run ends as a partial SUCCEEDED. Use a longer Timeout for many inputs.
- One keyword has a limited list: TikTok Shop gave 50 to 114 different products for one keyword on the test dates. Add more keywords or category links to get more.
- Products to check: `scanLimit` is 100 by default, per input.
- Retries: each page gets up to 3 tries. A product page that still fails keeps its row from the list, with `detailsFetched: false` and a warning. After 3 blocked product pages in a row, or one blocked list page, the run stops as partial and keeps the saved rows. A bad link goes to `failedInputs`, and the next input runs.
- Reviews: you get the public sample and the star counts, not the full history.
- Sales rank and videos: there is no rank across all of TikTok Shop. `video` shows the one video that search gives, not every promo video.

## Sample result

```json
{
  "productId": "1730860052779143503",
  "title": "Remote Control for TikTok Scrolling, Wireless Page Turner & Selfie with Smartphone Holder Stand",
  "price": 20.79,
  "currency": "USD",
  "originalPrice": 45.49,
  "discountPercent": 54,
  "soldCount": 11690,
  "rating": 4.4,
  "reviewCount": 1497,
  "shopName": "PUTARE",
  "sellerId": "7495880414145841487",
  "url": "https://shop.tiktok.com/us/pdp/remote-control-by-putare-for-tiktok-kindle-with-wireless-page-turner/1730860052779143503",
  "region": "US",
  "source": "shop.tiktok.com",
  "brand": "PUTARE",
  "variants": [{ "name": "Color", "values": ["Green", "Purple", "Black", "Pink"] }],
  "shipping": {
    "free_shipping": false,
    "reachable": true,
    "delivery_min_days": 7,
    "delivery_max_days": 10,
    "delivery_name": "Standard shipping",
    "shipping_fee": { "price_str": "$5.99" }
  },
  "ratingDistribution": { "1": "111", "2": "51", "3": "68", "4": "118", "5": "1149" },
  "shop": {
    "sold_count": 576817,
    "on_sell_product_count": 7,
    "review_count": 63638,
    "followers_count": "41189",
    "video_count": "1219",
    "shop_rating": "4.5"
  },
  "changeStatus": null,
  "salesDelta": null,
  "salesTrend": "unknown",
  "detailsFetched": true
}
```

## Use it from code

Actor ID: `cliqtomedia/tiktok-shop-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/tiktok-shop-scraper").call(run_input={
    "mode": "search",
    "keywords": [
        "phone stand"
    ]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~tiktok-shop-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode": "search", "keywords": ["phone stand"]}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/tiktok-shop-scraper")
result = tool.invoke({"run_input": {"mode": "search", "keywords": ["phone stand"]}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Similar tools

- [TikTok Transcript Scraper: Captions & Speech to Text](https://cliqtomedia.com/actors/tiktok-transcript/)
- [AliExpress Scraper: Products, Prices & Reviews, No Login](https://cliqtomedia.com/actors/aliexpress-scraper/)
- [Shopify Store Products Export - No Login, Any Store](https://cliqtomedia.com/actors/shopify-products-scraper/)
- [Google Trends Scraper - Interest by Time, Region & Queries](https://cliqtomedia.com/actors/google-trends-scraper/)
- [Amazon Product Scraper: Prices, Reviews, BSR, No Login](https://cliqtomedia.com/actors/amazon-scraper/)
- [Coles, Woolworths & Aldi Price Scraper - No Login](https://cliqtomedia.com/actors/au-supermarket-prices/)
