Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
TikTok Shop Scraper icon

TikTok Shop Scraper

Scrape TikTok Shop products by keyword, collection or store URL. Rows carry price, discount, rating, reviews, units sold and images. US only. $1.10 per 1,000.

269 runs on Apify $0.0011 per product ($1.1 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchTerms, startUrls, sortBy (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0011 per product = $1.1 per 1,000

You are charged forWhenPrice
Product scrapedOne TikTok Shop product row delivered to the dataset. Sample rows and diagnostic rows are never charged.$0.0011

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchTermsKeywords to search TikTok Shop for, for example "makeup brush" or "wireless earbuds". Up to 20 targets per run in total, counting the URLs below. Each term is searched in turn until the run reaches the row limit.array
startUrlsTikTok Shop pages to read instead of, or as well as, search terms. Three shapes are understood: a collection page (https://shop.tiktok.com/us/k/probiotic-sodas), a store page (https://www.tiktok.com/shop/store/bk-beauty-brushes/7495182121564604692) and a search page (https://www.tiktok.com/shop/s/makeup%20brush). A bare seller id also works.array
sortByHow TikTok orders the products it returns for a search term or a collection URL. Store pages always come back in the shop's own order. "relevance" is what the site shows by default.string
maxItemsTotal number of products to return across all search terms and URLs. The budget is shared evenly between the targets, so four targets and 100 rows gives you 25 of each. Keep it low while you are testing - you pay per product.integer
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array
sessionCookiesOptional. Leave this empty. TikTok Shop search, collection and store pages are read without any account and that is the normal path. Supply your own TikTok account cookie only if you run heavily, and the run uses it where an account is needed. In Chrome: F12 -> Application -> Cookies -> tiktok.com, and copy the value of sessionid (a whole "sessionid=...; sid_tt=..." cookie string is also accepted). Anyone with this value can act as your account, so treat it like a password.array

What you get

A structured dataset — each result includes fields like:

productIdtitlepricecurrencyoriginalPricediscountPercentratingreviewCountsoldCountshopNameproductUrlimageUrlstockStatussearchTerm

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

1 ready-to-run use cases

TikTok Shop Best Sellers by Keyword

Find best-selling TikTok Shop products for any keyword: title, price, units sold, rating and shop.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

TikTok Shop Scraper: products, prices and units sold, by keyword or shop link

Type the searches you would type into TikTok Shop, or paste collection and store links, and get one row per product: title, price, the crossed-out original price, the discount, star rating, review count, units sold, the shop behind it and the images. Units sold sits on the card, so sorting a category by what actually moves needs no second lookup.

The awkward part first. This reads the US storefront, and a row describes the shelf rather than the product page: no per-unit stock count, no variant or SKU prices, no shipping, no description, no individual reviews. A single product link is not a valid target either.

InputSearch terms, collection links, store links, or a bare seller id
OutputOne row per product
Ceiling5,000 products and 20 targets per run
Account neededNone
Price$1.10 per 1,000 products, flat on every plan

🛒 What TikTok Shop Scraper does

Three ways in, and you can mix them in one run.

Search terms. makeup brush, wireless earbuds, whatever you would type into the shop's own search box. Each term is worked through in turn until the run reaches your row limit.

Collection and store links. A collection page like https://shop.tiktok.com/us/k/probiotic-sodas gives you that shelf. A store page gives you a seller's catalogue in the shop's own order. A bare 15 to 25 digit number is read as a seller id, so you can paste one straight out of a URL.

Products are deduplicated on product id across the whole run, so a listing that matches two of your terms comes back once.

📥 What you give it

{
  "searchTerms": ["makeup brush", "wireless earbuds"],
  "startUrls": ["https://www.tiktok.com/shop/store/bk-beauty-brushes/7495182121564604692"],
  "sortBy": "best_sellers",
  "maxItems": 200
}
FieldStarts atWhat it is
searchTermsbox holds makeup brush and wireless earbudsKeywords to search TikTok Shop for. Delete the examples before you run your own.
startUrlsemptyCollection, store or search pages, or a bare seller id. Up to 20 targets per run counting the terms above.
sortByrelevancerelevance, best_sellers or newest. Store pages always come back in the shop's own order.
maxItemsbox holds 50Total products across every target, up to 5,000. The budget is split evenly, so four targets and 100 rows gives you 25 of each.
proxyUrlsemptyOptional. Your own servers, in the form http://user:pass@host:port, used exactly as given. They have to land in a country where TikTok Shop operates.
sessionCookiesemptyOptional. Your own TikTok sessionid, for heavy runs; the run uses it where an account is needed. Anyone holding that value can act as your account, so treat it like a password.

Run it with the input empty and you get one labelled sample row and nothing else, so you can see the shape of a row before you spend anything.

📤 What you get back

A real product row from a recent run, with the image links trimmed:

{
  "ok": true,
  "charged": true,
  "recordType": "product",
  "productId": "1732461774795346037",
  "title": "14/8pcs Professional Beauty Brush Set with Storage Bag - Metal Frame, Cosmetics Brush...",
  "price": 10.26,
  "currency": "USD",
  "priceFormatted": "$10.26",
  "originalPrice": 20.8,
  "discountPercent": 51,
  "rating": 4.5,
  "reviewCount": 281,
  "soldCount": 2349,
  "shopName": "Jovial US",
  "sellerId": "7494658995239093365",
  "shopUrl": "https://www.tiktok.com/shop/store/jovial-us/7494658995239093365",
  "brand": null,
  "productUrl": "https://shop.tiktok.com/us/pdp/14pcs-professional-beauty-brush-set.../1732461774795346037",
  "imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/edfbc3...",
  "images": ["https://p16-oec-general-useast5.ttcdn-us.com/...", "https://p19-oec-general-useast5.ttcdn-us.com/..."],
  "promotionLabels": ["Limited time deal", "Free shipping"],
  "stockStatus": null,
  "searchTerm": "makeup brush",
  "sourceType": "search",
  "sourceUrl": "https://www.tiktok.com/shop/s/makeup%20brush",
  "region": "US",
  "scrapedAt": "2026-09-14T05:47:20.586Z"
}
FieldWhat it is
price, priceFormattedWhat is being charged now, as a number and as the site prints it.
originalPrice, discountPercentThe crossed-out price and the percentage off, both numbers. Both null when the listing is not discounted.
ratingStars out of five. null on a listing with no score yet, rather than 0.
soldCountLifetime units sold as the card reports it. null when the card carries no figure.
sellerId, shopUrlThe seller behind the listing. Feed shopUrl back in as a startUrls entry to pull the whole catalogue.
brandOnly when the seller filled it in, which many do not.
imagesEvery image link on the card. imageUrl is the first one. These carry an expiry, so download what you want to keep.
stockStatussold_out, low_stock or null. Only set where the listing itself says something definite, which is rare.
searchTerm, sourceType, sourceUrlWhich of your targets produced the row, so a mixed run stays sortable.
regionThe storefront that answered, as a two-letter code.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot it
A productok: true and recordType: "product"
The sample row_sample: true, written only when the input was empty
A diagnosticok: false, _diagnostic: true and an errorCode

charged: true marks a real product row and false marks a sample or diagnostic one. Read it as the row type: it is stamped as the row is built, so it is not a receipt. Your run's own event count in Apify is the billing record.

CodeWhat it means
BAD_INPUTThat link is not a TikTok Shop page this Actor can use. A single product link lands here.
NOT_FOUNDThe page or the seller id does not exist.
BLOCKEDTikTok would not serve that target this time. Worth one re-run.
NETWORKThe site was unreachable or answered badly.
NO_RESULTSThe target returned nothing usable. Rare on searches, since TikTok matches loosely.
TIME_BUDGETThe run ran out of time before reaching that target.
PROXY_INPUT_ADJUSTEDSomething you put in proxyUrls was unusable, so the run carried on without it.
CHARGE_ERRORA charge could not be recorded. A couple in a row stops the run.

One bad target never stops the others, and a diagnostic row never fails the run.

▶️ How to run it

1. Open TikTok Shop Scraper and click Try for free. 2. Put your keywords into Search terms, deleting the two examples, or paste links into TikTok Shop URLs. 3. Pick a Sort search results by. Best sellers is the ordering TikTok's own ranking pages use. 4. Set Maximum products. Start around 20 to see what the rows look like, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$1.10 per 1,000 products. Flat on every Apify plan, no volume tiers.

You are charged per product row delivered. Duplicates dropped inside a run, the sample row and every diagnostic row are not charged.

💡 What people use it for

  • Category research: pull a shelf, sort on soldCount, and filter out the one-review listings before

deciding what to stock.

  • Shelf tracking: feed in a store link, re-run on a schedule, and diff on productId.
  • Price history: price, originalPrice and discountPercent are numbers, so a daily run turns

into a series with no parsing.

  • Finding the seller behind a product that is moving, through shopUrl.
  • Watching which listings are running a promotion right now, through promotionLabels.

🚧 What it does not do

  • US storefront. TikTok decides which catalogue to serve from where the request lands. For

another country, supply your own servers in proxyUrls. region on every row tells you which storefront actually answered.

  • No product detail. Per-unit stock, variant and SKU prices, shipping, delivery estimates,

descriptions and reviews are not on the listing surface this reads.

  • A single product link is not a target. This returns lists of products. Paste the shop link from

that page instead, or search the product name.

  • sortBy does not reach store pages. A shop's own shelf order is the only one TikTok offers

there.

  • Search depth stops at a few hundred products per term. When TikTok stops handing out pages the

run moves on rather than repeating rows. Add more terms to go wider.

  • Some store pages will not open for a signed-out reader. The run then looks that shop up by name

and keeps what it finds, which usually recovers most of the shelf but not always all of it.

  • Rows are a snapshot. Prices, ratings and sold counts move, sometimes hourly during a sale.

🧭 Which TikTok scraper do you need?

If you wantUse
Products, prices and units sold on TikTok ShopThis one
Videos under a hashtagTikTok Hashtag Scraper
Comments under a videoTikTok Comments Scraper
Follower counts and profile statsTikTok Profile Scraper
Trending hashtags by countryTikTok Trending Hashtags

❓ Questions people ask

Do I need a TikTok account or an API key? No. There is no key to apply for and nothing to log into. Runs read the same public shop pages a signed-out visitor sees.

Then what is sessionCookies for? Heavy use, where you would rather have a rate limit nobody else shares. It is optional and most people should leave it empty.

Can I get a storefront outside the US? Only by putting your own servers into proxyUrls, landing in a country where TikTok Shop operates. Check region on the rows that come back.

What happens when a term matches nothing? You get one uncharged diagnostic row for that target and the run carries on with the rest.

Can I run it on a schedule? Yes. productId is stable, so working out what is new since last time is a join.

Is scraping TikTok Shop legal? These are public listings. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the term or the link that misbehaved and the run ID. The errorCode on the diagnostic row usually names the problem on its own.