TikTok Shop Scraper — Exact Sold Counts, No Login avatar

TikTok Shop Scraper — Exact Sold Counts, No Login

Pricing

Pay per event

Go to Apify Store
TikTok Shop Scraper — Exact Sold Counts, No Login

TikTok Shop Scraper — Exact Sold Counts, No Login

Scrape TikTok Shop by keyword and get exact units sold per product — 164, not the rounded badge — plus title, price, seller, image and link. One row per product. No login, no cookies, no proxy needed.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Data Runner

Data Runner

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

TikTok Shop Scraper — Exact Sold Counts, No Login 🛍️

Scrape TikTok Shop by keyword and get the number nobody else gives you: the exact units sold per product. 164, not the rounded "164 sold" badge the page displays. Plus title, price, seller, image and link — one row per product.

No login. No cookies. No captcha solving. Runs from a plain datacenter IP.

Why this matters for product research: on TikTok Shop the winners are memes. A single read of funny shirt returns John Pork Tung Tung Tung Sahur 67 Shirt at 1,206 units and Lollipop Cat Brainrot Tee — trends that are selling right now, priced under $6, from sellers you have never heard of.


What you get — one row per product

{
"term": "funny shirt", // exactly as you typed it
"geo": "US",
"position": 1, // the storefront's order on page one
"productId": "1732481525745357276",
"title": "Funny graphic tees \"There is Motion at Your Front Door\" Tung Tung Sahur",
"sold": 164, // EXACT, not the rounded badge the page shows
"price": 4.8,
"currency": "USD",
"shop": "A2HMK",
"image": "https://p16-oec-general-useast5.ttcdn-us.com/…",
"url": "https://shop.tiktok.com/us/pdp/…/1732481525745357276",
"competingTotal": null, // TikTok does not publish it — see FAQ
"cardsOnPageOne": 30, // what THIS read returned. Not the field size.
"scrapedAt": "2026-09-05T19:00:00.000Z",
"sourceUrl": "https://shop.tiktok.com/us/s?q=funny%20shirt"
}

Who uses this

  • Print-on-demand and merch sellers — find which meme is selling on shirts today, at what price, before it is everywhere.
  • Dropshippers and product researchers — see the real winners in a category, their exact unit counts, and who is selling them.
  • DTC and brand teams — track your category on the fastest-growing marketplace, week over week.
  • Trend tools and data teams — TikTok is where a trend starts and TikTok Shop is where it sells. This is the one surface where both live in the same place.

Input

{
"searchTerms": ["funny shirt", "dolly parton"],
"geos": ["US"],
"maxProductsPerTerm": 20
}
FieldDefaultNotes
searchTermsRequired. Sent verbatim. Up to 100 per run.
geos["US"]US, GB, ID, MY, PH, SG, VN, TH and more. One row set per term × region.
maxProductsPerTerm20Page one is about 30 cards. Max 60.
sessionCookieOptional. Only for signed-in pricing.
proxyConfigurationoffMeasured unnecessary — see FAQ.

Pricing

$0.001 per product row — $1.00 per 1,000 rows.

A term that came back blocked, captcha'd or empty produces no rows and costs nothing. You pay for products, not for attempts.

⚠️ Per row and not per keyword, deliberately. The same search URL returns 5, 10 or 30 cards and the server decides — measured, fixed at page load. A per-keyword price would charge the same for five cards as for thirty, on a coin flip the buyer cannot see. The Actor's own cost is per keyword either way; that variance is ours to absorb, not yours.


What it does NOT do, on purpose

These are the decisions that make the numbers trustworthy. Each one costs a feature and buys a fact.

  • It never invents a zero. A product with no sold badge comes back sold: null, not sold: 0. A zero would rank a product TikTok simply did not count below one that genuinely sells nothing — the opposite conclusion.
  • It never writes the page size into competingTotal. Thirty cards is thirty cards, whether thirty sellers compete or thirty thousand. Turning "we could not see it" into "the field is empty" is exactly the reading that gets the wrong product made.
  • It never returns a short list when it was blocked. If TikTok's Security Check took every term, the run ends red with nothing pushed. A half-read field is indistinguishable from a thin market, and that mistake is expensive in one direction only.
  • It never normalizes your term. Dolly Parton goes out as Dolly Parton. Lower-casing on the way in has twice cost a downstream tool hundreds of already-measured terms that then read as "not measured".
  • It never truncates a title. The end of a listing title is where the detail that distinguishes one product from another lives — and for a print-on-demand brief, it is the evidence.
  • It never mixes regions. Counts are reported per region and never summed, because marketplace counts overlap: a sum is a number that exists nowhere.
  • It never solves a captcha. It does not need to — see below.

FAQ

Do I need a TikTok account, login or cookies?

No. The Security Check guards the storefront root; this Actor loads the search page, which is not walled the same way. Measured 5 Sep 2026, signed out, from a fresh browser:

pagesigned out
shop.tiktok.com/us — the root🔴 Security Check, 10 KB
shop.tiktok.com/us/s?q=funny shirt — what this Actor loads1.1 MB, 30 real products

You can still pass a sessionCookie if you want the storefront to treat you as a signed-in shopper (regional pricing, personalisation). It is optional.

Do I need a proxy?

No, and turning one on by default was costing money for nothing. Measured on the Apify platform:

runresult
6 terms, datacenter IP, no proxy, no cookie6 of 6 succeeded · 0 captchas · 50 s · 0.028 CU
1 term, same13 s · 0.0074 CU

RESIDENTIAL proxy is billed per GB. It is now off by default. Turn it on for high volume from one address, or if reads start coming back blocked — the run summary names every failed term and why, so you will see it happen.

Why is competingTotal always null? Can I get the number of competitors?

TikTok Shop does not publish it, and there is no page two to count. This was looked for properly:

triedresult
&offset=30, &page=2, &cursor=30ignored — identical first product
scrolling the results gridno request fires; the DOM stays put
the View more controlnot reachable from the results grid

The results component says has_more: true and load_more_params.offset: 30 and nothing more. Thirty is page one, not the field.

⚠️ The URL parameters appeared to work — &page=2 returned "12 new products". A control run of the unchanged URL three times returned 10, 10 and 30, which is where those "new" products came from. The server decides how many cards to serve, fixed at load.

So this Actor answers "what is winning", not "how crowded is it". If you need a competitor count, it has to come from a marketplace that publishes one.

Is sold the product's total sales?

No — it is a floor, and it is exact. TikTok publishes an integer (sold_count: 164) while the page renders a rounded badge. This Actor reports the integer. It is what the storefront chose to show for that card, from page one, so treat it as evidence that a listing moves — not as lifetime sales.

Which regions work?

US, GB, ID, MY, PH, SG, VN, TH and other TikTok Shop storefronts. Counts are per region and never summed. Some regions return fewer results for the same term; a region with no results produces no rows, and the run summary names it.

How fast and how much?

13 seconds for one term, 50 seconds for six. About $0.008 in compute for a six-term run, plus $0.001 per row.

What if TikTok changes its page?

The run ends red and the summary names which terms failed and why — captcha, no-products, navigation-failed. It never finishes green with a short list, because downstream "3 competitors" and "we were blocked" look identical and only one of them gets a product made.


Output

Two places:

  • Dataset — one row per product, as above.
  • Key-value store OUTPUT — the run summary, including which terms produced nothing and why, named rather than merely counted. A term that could not be read is not a term with no competition, and you need to be able to tell them apart.

Keywords: tiktok shop scraper, tiktok shop api, tiktok shop product scraper, tiktok shop data, scrape tiktok shop, tiktok shop sold count, tiktok shop units sold, tiktok shop search scraper, tiktok shop no login, tiktok shop without cookies, dropshipping product research, print on demand research, pod trend research, tiktok shop trending products, viral products tiktok, tiktok shop seller data, ecommerce trend research, tiktok shop scraper free.