TikTok Shop Scraper: Products, Sales & Prices, No Login avatar

TikTok Shop Scraper: Products, Sales & Prices, No Login

Pricing

from $1.40 / 1,000 product saveds

Go to Apify Store
TikTok Shop Scraper: Products, Sales & Prices, No Login

TikTok Shop Scraper: Products, Sales & Prices, No Login

Collect TikTok Shop products, prices, units sold, ratings, variants, shipping and shop stats from keywords, categories or links. Find what sells and track price and sales changes between runs. No login or cookies.

Pricing

from $1.40 / 1,000 product saveds

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

Give this Actor search keywords or public TikTok Shop 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.

TikTok Shop Scraper: keywords or links go in, product rows and change tracking come out

Table of contents

What it does

You want to know which TikTok Shop products sell, at what price, and who sells them. This Actor reads the public US storefront and saves each product as one row. You can search by keyword or start from product, category or shop links. You can then filter, sort and download the rows, or run the same input again to see what changed.

Good fit

  • 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.

It is not a good fit if you need markets other than the US, every review of a product, or a sales rank across all of TikTok Shop.

πŸ‘‰ Try it now: open the input form

How it works

  1. You add keywords or public links, and set how many products you want.
  2. The Actor opens the public result pages. It opens each product too, if you keep full details on.
  3. You get a table of products, a shop summary and a short run report. With Track changes on, each row also shows what is new or different since the last run.

πŸ‘‰ Try it now: open the input form

Quick start

You need a free Apify account. The form below opens with a small example, so you can run it as it is.

The input form with Mode, Search keywords, Maximum products and Full product details marked

  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.

The output table with product, price, units sold and shop columns marked

Expected result: 10 product rows in about 40 seconds, for about $0.03 on the Free plan. The products and numbers are live, so they change over time.

πŸ‘‰ Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Find products that sellKeywords, sort by Most units soldOne product rowtitle, price, soldCount, rating, shopNameGoogle Sheets, CSV
Check a competitor shopShop linksProduct rows and a shop summaryprice, soldCount, shop, skusExcel, API
Watch prices and sales every dayProduct links, Track changes on, scheduleRows with a change statuschangeStatus, salesDelta, price, previousFetchedAtSlack, Notion, webhook
Explore one categoryCategory links, price and rating filtersFiltered product rowscategories, price, rating, reviewCountDataset API
Find creators who promote a productKeywords, Full product details offRows with a promotional videovideo, soldCount, urlCSV

πŸ‘‰ Try it now: open the input form

Input

Start with Mode and one list of keywords or links. All other fields are optional.

Input fields

FieldPlain nameTypeRequiredDefault or prefillAllowedEffectExampleRecommendation
modeModeTextNosearchsearch, product, category, shopPicks what to start fromsearchKeep Search unless you only use links
keywordsSearch keywordsListNoPrefill phone standAny phrasesRuns one search per phrase, in Search mode onlyphone standUse a few words, as a shopper would
maxItemsMaximum productsWhole numberNo101 or moreStops after this many saved rows, across all inputs50Start small, then raise it
scanLimitProducts to check per inputWhole numberNo1001 or moreLimits how many products each input looks through for filters, sorting and changes300Raise it when a filter finds too little
includeProductDetailsFull product detailsYes or noNoYesYes, noOpens each product for variants, shipping and reviewsYesTurn off for long lists
regionsMarketsListNoPrefill USUSPicks the storefrontUSKeep US
regionPrimary marketTextNoUSUSUsed when Markets is emptyUSKeep US
monitorTrack changesYes or noNoNoYes, noCompares each run with the last oneYesUse with a schedule
stateNameMonitor nameTextNoMade from the inputsLetters, numbers, dashes, up to 63Names the saved comparisonphone-stands-dailySet one name per watch list
onlyChangesOnly changed productsYes or noNoNoYes, noSaves new and changed products onlyYesNeeds Track changes
outputFormatOutput formatTextNonestednested, flatflat stores lists as JSON text in a cellflatUse flat for Google Sheets
sortBySort productsTextNorelevancerelevance, sales, priceAscending, priceDescendingRanks the checked products, then saves the top onessalesSet scanLimit with it
productUrlsProduct linksListNoEmptyPublic linksAdds these products in any modeSee the formUse for a fixed watch list
categoryUrlsCategory linksListNoEmptyPublic linksAdds these categories in any modeSee the formAdd filters for large categories
shopUrlsShop linksListNoEmptyPublic linksAdds these shops in any modeSee the formUse for competitor checks
minPriceMinimum priceNumberNoEmpty0 or moreKeeps this price or higher10Rows with no price are left out
maxPriceMaximum priceNumberNoEmpty0 or moreKeeps this price or lower30Rows with no price are left out
minRatingMinimum ratingNumberNoEmpty0 or moreKeeps this rating or higher4.5Rows with no rating are left out
minSoldCountMinimum units soldNumberNoEmpty0 or moreKeeps at least this many units sold1000Rows with no count are left out
titleContainsTitle must containListNoEmptyAny wordsKeeps titles with all of these wordsmagneticUpper or lower case does not matter
excludeKeywordsExclude title wordsListNoEmptyAny wordsLeaves out titles with any of these wordscaseUpper or lower case does not matter
deliveryConnectorSend results toConnectorNoEmptyYour MCP connectorSends a few lines about the finished runYour SlackSee Send results to Slack or Notion
deliveryTargetNotion page or channelTextNoEmptyNotion link or Slack channel IDPicks where the summary goesA channel IDLeave empty to let the connector decide

Empty input: a run with no input searches for phone stand and saves up to 10 products.

Duplicates: the same product found twice in one run is saved and charged once.

Interacting settings

  • Links always run, in any mode. Keywords only run in Search mode.
  • Filters look only at the products an input checks. Raise scanLimit if a filter finds too few rows.
  • sortBy ranks the checked products for each input, not the whole store. It also makes the Actor check up to scanLimit products before it saves any.
  • onlyChanges needs monitor. Without it, the run stops with a clear error and only pays the start fee.
  • A new stateName starts with no history, so every product shows as new.
  • Full details add one paid page check per product and about 3 seconds per product.

Input examples

Find top sellers for a keyword

{
"mode": "search",
"keywords": ["phone stand"],
"maxItems": 5,
"scanLimit": 50,
"sortBy": "sales",
"includeProductDetails": false
}

Expected behavior: the Actor checks up to 50 products, ranks them by units sold and saves the top 5. Expected output: 5 rows, without variants or shipping. scanLimitReached is true if it stopped at 50. Limit: this ranks the 50 checked products, not all of TikTok Shop.

Check one shop

{
"mode": "shop",
"shopUrls": ["https://shop.tiktok.com/us/store/putare/7495880414145841487"],
"maxItems": 3
}

Expected behavior: the Actor opens the shop and saves 3 products with full details. Expected output: 3 rows and one shop in the SHOPS record. Limit: a small shop can have fewer products than you ask for.

Track changes every day

{
"mode": "product",
"productUrls": ["https://shop.tiktok.com/us/pdp/product/1730860052779143503"],
"monitor": true,
"stateName": "my-watch-list",
"onlyChanges": true
}

Expected behavior: the first run saves the product as new. Later runs save it only if its title, price, units sold, rating, review count or stock changed. Expected output: one row when something changed. No rows and the status No changes since the last run. when nothing changed. Limit: page checks are paid even when nothing changed. Do not run two runs with the same stateName at the same time.

πŸ‘‰ Try it now: open the input form

Output

The Output tab shows the products. Download them as JSON, CSV or Excel. The table has five views: Products, Sales and changes, Product details, Promotion and All fields.

Output fields

A value is null when TikTok Shop does not show it for that product. Without full details, description, shipping and ratingDistribution are null, and skus and reviews are empty lists.

FieldTypeWhat it meansExample
productIdTextTikTok Shop product ID1730860052779143503
titleTextProduct titleRemote Control for TikTok Scrolling…
priceNumber or nullLowest current price20.79
currencyText or nullCurrency of the priceUSD
originalPriceNumber or nullPrice before the discount45.49
discountPercentNumber or nullDiscount on the cheapest variant54
soldCountNumber or nullTotal units sold, as the store shows it11690
ratingNumber or nullAverage stars, from 1 to 54.4
reviewCountNumber or nullNumber of reviews the store reports1497
ratingDistributionObject or nullReview count per star{"5": "1149"}
reviewsListA public sample of reviews, without buyer namesFirst page only
reviewsHasMoreYes, no or nullMore reviews exist beyond the sampletrue
shopNameText or nullShop that sells the productPUTARE
sellerIdText or nullTikTok Shop seller ID7495880414145841487
shopObject or nullShop totals: units sold, products, reviews, followers, rating{"sold_count": 576817}
urlTextPublic product linkhttps://shop.tiktok.com/us/pdp/…
imagesListGallery images. These links can expireImage links
descriptionImagesListImages inside the descriptionImage links
descriptionText or nullProduct descriptionText
specificationsListName and value pairs, such as materialBrand: PUTARE
brandText or nullBrand, when the store shows one. Often emptyPUTARE
categoriesListCategory pathPhones & Electronics
variantsListVariant names and valuesColor: Green, Black
skusListPrice, stock and properties of each variantStock may be empty
shippingObject or nullDelivery days, fee and free shipping, without a buyer address{"delivery_min_days": 7}
availableYes, no or nullThe store says it can deliver the producttrue
videoObject or nullPromotional video from search, with creator and views{"creatorName": "…"}
productVideoObject or nullVideo on the product page{"durationSeconds": 21}
sourceGeneratedObjectText that TikTok Shop generated, kept apart from the descriptionSummary text
regionTextMarketUS
sourceTextWebsiteshop.tiktok.com
fetchedAtTextUTC time of the read2026-11-04T02:50:11+00:00
detailsFetchedYes or noThe product page was openedtrue
changeStatusText or nullWith Track changes: new, changed, unchanged or unknownchanged
salesDeltaNumber or nullUnits sold since the last run. Null when new or when the counter was reset120
salesTrendTextrising, flat or unknownrising
salesCounterResetYes or noThe sold counter went down between runsfalse
previousFetchedAtText or nullTime of the last run that saw this productA UTC time

Output entities and surfaces

SurfaceNormalDomain-emptyPartialTechnical failure
Dataset (Products)One row per productNo rowsThe rows saved before the stopThe rows saved before the failure, or none
RUN_SUMMARY recordstatus: complete and countsemptyReason: NO_MATCHING_PRODUCTS or NO_CHANGESstatus: partial, stopReason, failedInputs, unprocessedInputssourceError and the same lists
SHOPS recordShop stats by seller IDEmptyShops seen so farShops seen so far
Run statusSUCCEEDEDSUCCEEDED, with a messageSUCCEEDED, with a messageFAILED, with a message

The empty cases are not errors. A search with no results and a filter with no matches both end as SUCCEEDED.

Output example

This row comes from the Quick start input, shortened:

{
"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
}

Send results to Slack or Notion

You can get a short summary after each run, with the run status and the first products.

  1. Connect Slack, Notion or another service once in Apify Console, under MCP connectors.
  2. Pick the connector in Send results to.
  3. Optional: in Notion page or channel, paste the link of your Notion page, or the ID of your Slack channel. Each run is added on top of a Notion page.

If sending fails, your data stays safe in the Dataset and the run keeps its status. RUN_SUMMARY shows the result under delivery.

Use case β†’ fields

Use caseFields to use
Product researchtitle, price, soldCount, rating, reviewCount
Competitor shop checkshopName, shop, price, soldCount, skus
Daily price and sales watchchangeStatus, salesDelta, salesTrend, price, previousFetchedAt
Listing analysisdescription, specifications, variants, images, reviews
Creator researchvideo, soldCount, url

πŸ‘‰ Try it now: open the input form

Pricing

You pay per event, and Apify platform usage is included in these prices.

Pricing unit

EventFree plan priceWhen you pay
Actor start$0.002Once per run. Apify charges it per GB of memory, and this Actor uses at most 512 MB, so you pay it once
Product$0.002For each saved row
Page check$0.0005For each result page or product page the Actor opens. Automatic retries of the same page are free

On paid Apify plans, product and page check cost 10% to 30% less, and the Actor start price stays the same. The Store page shows the price for your plan.

  • Empty run: a search with no results pays the start fee and its page check.
  • Filter with no matches: you pay the start fee and each checked page, but no product.
  • Unchanged monitor: you pay the start fee and the page checks, but no product.
  • Partial or failed run: you pay for rows already saved and pages already opened. Rows stay in the Dataset.
  • Spending limit: set Maximum cost per run in the run options. The Actor saves rows up to that limit and stops as a partial run. The lowest limit it accepts is $0.005.

Cost examples

These are Free plan prices.

RunEventsCostSource
Quick start: 10 products, full details1 start, 10 products, 11 page checks$0.0275Measured
One product link1 start, 1 product, 1 page check$0.0045Measured
Search with no results1 start, 1 page check$0.0025Measured
Filter with no matches1 start, 2 page checks$0.003Measured
Monitor, 3 products, no changes1 start, 4 page checks$0.004Measured
110 products, full details1 start, 110 products, 115 page checks$0.2795Measured
114 products, details off1 start, 114 products, 6 page checks$0.233Measured
200 products from 5 keywords, details off1 start, 200 products, 10 page checks$0.407Measured
1,000 products, full details1 start, 1,000 products, about 1,050 page checksAbout $2.53Estimate

πŸ‘‰ Try it now: open the input form

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.
  • Sales numbers: soldCount is the counter that the store shows. salesDelta is the difference we saw between two runs, not a verified sales report.
  • Stock and shipping: these depend on the storefront, with no buyer address. Stock may be empty.
  • Image and video links can expire. Save the files soon if you need them.
  • Monitor: the comparison is kept in a named store under your Apify account. If the name is taken by another store, the Actor uses a new name and writes a warning.
  • Source terms: this Actor reads public pages only. TikTok's Terms of Service limit automated collection without written approval. You are responsible for how you use the data, so check these terms and your local law first.

πŸ‘‰ Try it now: open the input form

API, export and integrations

API: start a run and get the rows in one call. Use your Apify API token in the Authorization header.

curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~tiktok-shop-scraper/run-sync-get-dataset-items?timeout=120" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["phone stand"],"maxItems":10}'

Export: save the Dataset in JSON, CSV, Excel, XML or HTML format. Use Flat cells for Google Sheets.

Scheduling: create a Schedule in Apify Console, with Track changes on and a fixed Monitor name.

Webhooks: add a webhook to your Task or run, and call your own link when the run ends.

SDK: use the Apify client for Python or JavaScript.

Use with AI agents (MCP)

Add this Actor to any MCP client with this link:

https://mcp.apify.com?tools=cliqtomedia/tiktok-shop-scraper

The smallest useful input:

{ "keywords": ["phone stand"], "maxItems": 5, "includeProductDetails": false }

Read these fields first: title, price, soldCount, rating, url. A run like this takes about 5 seconds and costs about $0.013. It reads the US storefront only, and the limits above apply.

πŸ‘‰ Try it now: open the input form

Troubleshooting

The run succeeded but there are no rows

Likely reason: TikTok Shop has no results for the search, or your filters removed everything. Check: emptyReason and scanLimitReached in RUN_SUMMARY. Action: use wider words, or remove a filter, or raise Products to check per input.

I got fewer rows than I asked for

Likely reason: the list for this keyword ended, or the Timeout ended, or your spending limit ended. Check: stopReason and unprocessedInputs in RUN_SUMMARY. Action: add keywords, or raise Timeout, or raise Maximum cost per run.

Likely reason: the product is gone, or the link is not a public TikTok Shop page. Check: paste the link into an incognito window. Action: remove the link. The other inputs still run.

The run failed

Likely reason: the input is not valid, or TikTok Shop blocked the run before any product was saved. Check: the status message, and sourceError in RUN_SUMMARY. Action: fix the input, or try again later.

The run stopped early with SOURCE_ERROR

Likely reason: TikTok Shop answered with a security check or a network error. It is rare, and more likely when you start many runs at once. Check: stopReason, sourceError and unprocessedInputs in RUN_SUMMARY. Action: the saved rows stay in the Dataset. Run the unprocessed inputs again, one run at a time.

salesDelta is empty

Likely reason: this is the first run for the product, or salesCounterReset is true. Check: changeStatus and previousFetchedAt. Action: run again with the same Monitor name.

Brand or stock is empty

Likely reason: the store does not show this value for the product. Check: open the product link. Action: use shopName or specifications instead.

πŸ‘‰ Try it now: open the input form

FAQ

Do I need a TikTok account or cookies? No. Only public pages are read, so you stay logged out.

Do I need my own proxy? No. The Actor uses Apify proxy, and the price includes it.

Can I get markets other than the US? Not in this version. Only the US storefront is verified.

Is soldCount the real number of sales? It is the counter that TikTok Shop shows on the page. We do not verify it.

How do I get only what changed? Turn on Track changes and Only changed products, and keep the same Monitor name in each run.

Why did I pay when I got no rows? The page checks were still done. An empty result costs $0.0025 to $0.004 in most cases.

How many products can I get? It depends on Timeout and on how many products the source lists. See Limits. The most we saved in one test run is 200 products, from several keywords.

Does it collect buyer data? No. Reviews come without buyer names, and the Actor does not collect personal contacts.

πŸ‘‰ Try it now: open the input form

πŸ‘‰ Try it now: open the input form

Support

Open the Issues tab on this page and write what happened. Add the run ID, the mode and the error text. Do not send API tokens, cookies or passwords.

πŸ‘‰ Try it now: open the input form