TikTok Shop Scraper - Products, Prices & Categories avatar

TikTok Shop Scraper - Products, Prices & Categories

Pricing

from $2.20 / 1,000 results

Go to Apify Store
TikTok Shop Scraper - Products, Prices & Categories

TikTok Shop Scraper - Products, Prices & Categories

Extract TikTok Shop products, prices, ratings, seller details and categories from regional storefronts such as the Philippines, US and UK. Pay per delivered row plus a run start fee.

Pricing

from $2.20 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

16

Total users

6

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

TikTok Shop Scraper

Extract TikTok Shop products, prices, seller details and categories from regional storefronts as rows you can export.

  • Search products by keyword, category or product link.
  • Collect prices, ratings, sold counts and images where available.
  • Explore category trees and region reference data.
  • Add separately billed SKU rows when you need variants.
  • Pay $3.00 per 1,000 delivered rows on the Free plan, plus a start fee.

What does TikTok Shop Scraper do?

TikTok Shop Scraper collects public data from shop.tiktok.com. Use it for price comparisons, catalog research and assortment tracking. Region codes include ph, us, gb, id, my, th, vn and sg; accepting a code does not guarantee that its storefront is accessible.

  • keywordSearch: product search using query or keywords.
  • categorySearch: products from a category link, ID or slug.
  • homeDiscover: products and categories shown on a storefront home page.
  • productDetail: one product's details using a link or ID.
  • categoryDiscover: categories from the current storefront.
  • regions: region reference rows followed by saved category reference rows, not a live availability check.

enrichDetails adds detail-page information to selected listing rows. includeSkus adds separate variant rows, each billed like any other row and sharing the input's row allowance. Both options are off by default.

What data can you extract from TikTok Shop?

rowType distinguishes product, category, region and sku. The tables highlight useful fields; availability varies by page and mode.

Product rows

FieldDescriptionExample
productIdProduct identifier1734757061426971851
titleProduct nameLip tint
urlProduct linkhttps://shop.tiktok.com/ph/pdp/lip-tint/1734757061426971851
salePriceCurrent sale price199.00
priceOriginal/list price; aliases originPrice on product rows299.00
currencyCurrency codePHP
ratingProduct rating4.7
reviewCountNumber of reviews120
soldCountReported units sold1500
shopNameSeller's display nameExample Shop
imageMain image linkhttps://example.com/product.jpg
imagesDetail-page image gallery[]
descriptionDetail-page descriptionLightweight lip tint
skuCountNumber of known variants3
productPropertiesDetail-page attributes[]

Category rows

FieldDescriptionExample
categoryIdCategory identifier601450
categorySlugLive category URL slugbeauty-personal-care
nameCategory nameBeauty & Personal Care
parentIdParent category when available601450
levelDepth in the category tree2

Saved category reference rows use slug rather than categorySlug and may lack a URL or parent ID.

Region rows

FieldDescriptionExample
codeAccepted region codeph
nameRegion namePhilippines
localeRegion localeen_PH
currencyRegion currencyPHP
statusRecorded availability assessment, not a live checkunverified

SKU rows

FieldDescriptionExample
idSKU ID, or product ID plus variant index1734757061426971851:0
skuIdSource SKU ID, if availablenull
productIdParent product identifier1734757061426971851
productTitleParent product name; SKU title stays emptyLip tint
priceVariant sale price, unlike product-row price199.00

How to scrape TikTok Shop

  1. Open TikTok Shop Scraper in Apify Console.
  2. Leave mode on auto and fill one target field.
  3. Set region if your target is not a full link. Start with maxResults: 3.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and download rows or read them through the API.

Empty input uses the form's Philippines beauty category example: categoryId: "601450", categorySlug: "beauty-personal-care", up to 3 rows. This is a billed example run, not a free preview. Example runs are capped at 10 rows even if a larger limit is supplied.

Fill query, or supply a keywords list. With auto, this selects keywordSearch. Each keyword has its own row allowance.

Fill categoryUrl, or use categoryId and categorySlug. A known bucket can select a saved category. Category availability varies by region.

Product detail

Fill productUrl or productId. A full link identifies the storefront region. Product links must include a region path; arbitrary TikTok video or profile links are not product targets.

Home discovery

Choose homeDiscover explicitly and set region. No target field is required.

Category discovery

Choose categoryDiscover explicitly to retrieve categories rather than products.

Region reference data

Choose regions explicitly. A small row limit returns only the first region rows; category reference rows follow them. These three target-free modes retain your chosen limit instead of starting the example.

What to fill in

FieldWhat to enterDefault
modeauto or one of the six modes aboveauto
queryOne search phraseEmpty
keywordsList of search phrasesEmpty
keywordAlternative name for queryEmpty
categoryUrlFull regional category linkEmpty
categoryIdNumeric category IDEmpty; example 601450
categorySlugCategory slug from its linkEmpty; example beauty-personal-care
catIdAlternative name for categoryIdEmpty
bucketSaved category group, such as beautyEmpty
productUrlFull regional product linkEmpty
productIdNumeric product IDEmpty
goodsIdAlternative name for productIdEmpty
regionAccepted storefront codeph when omitted
browseCountryAlternative region settingEmpty
currencyCompatibility field; currency follows the selected regionRegion currency
maxResultsMaximum rows per input, from 1 to 50070; form example 3
maxPagesPagination setting, from 1 to 201
enrichDetailsAdd details to selected listingsfalse
enrichLimitDetail-enrichment limit, from 0 to 503
includeSkusAdd separately billed SKU rowsfalse
pageRetryPage retry setting, from 1 to 52

Keyword search:

{"query": "lipstick", "region": "ph", "maxResults": 3}

Category search:

{"categoryId": "601450", "categorySlug": "beauty-personal-care", "region": "ph", "maxResults": 3}

Product detail, using an illustrative ID to replace with your target:

{"productId": "1734757061426971851", "region": "ph", "maxResults": 1}

Home discovery:

{"mode": "homeDiscover", "region": "ph", "maxResults": 3}

Category discovery:

{"mode": "categoryDiscover", "region": "ph", "maxResults": 3}

Region reference data:

{"mode": "regions", "maxResults": 3}
  • maxItems and limit are accepted as maxResults.
  • Close field-name misspellings are corrected when recognized; other unknown fields are ignored with a note.
  • In auto, product links take priority over category links, then product IDs, category IDs or slugs, then keywords. Conflicting targets are ignored with a warning.
  • A product or category link's region overrides browseCountry and region. Currency follows that region; currency does not convert prices.
  • Invalid targets or unsupported regions stop the run with INVALID_INPUT: <field> — <how to fix>, before any row charge. Some invalid numeric settings are corrected or ignored instead.
  • Each run writes its input interpretation to INPUT_REPORT in the default key-value store, including filled, corrected and ignored fields.

Output example

Illustrative product row; values are not a live price quote:

{
"rowType": "product",
"id": "1734757061426971851",
"productId": "1734757061426971851",
"title": "Lip tint",
"salePrice": "199.00",
"price": "299.00",
"originPrice": "299.00",
"currency": "PHP",
"region": "ph",
"rating": 4.7,
"reviewCount": 120,
"soldCount": 1500,
"shopName": "Example Shop",
"url": "https://shop.tiktok.com/ph/pdp/lip-tint/1734757061426971851",
"mode": "categorySearch"
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. RUN_SUMMARY records the run outcome and row count; INPUT_ECHO shows normalized input.

Why use this TikTok Shop scraper?

  • Row-based pricing. The data charge is for delivered rows, not pages attempted; a start fee also applies.
  • Partial delivery. Available rows returned after a collection stop or timeout are delivered. Rows already saved remain in the dataset.
  • Explainable input. Input reports show corrections, and validation errors identify what needs fixing.
  • Missing values stay missing. Unavailable product details remain empty rather than being invented.
  • Several inputs per run. Supply multiple search phrases through keywords.
  • No proxy setup. You do not need to set up proxies.

How much does it cost to scrape TikTok Shop?

The Actor uses pay-per-event pricing. The start event costs $0.005 per GB of memory, with a minimum of one event. At the default 512 MB, the start charge is $0.005. Platform usage is included in these prices.

Apify planStart at 512 MBPrice per rowPrice per 1,000 rows
Free$0.005$0.003$3.00
Starter$0.005$0.003$3.00
Scale$0.005$0.0026$2.60
Business$0.005$0.0022$2.20
Platinum$0.005$0.002$2.00
Diamond$0.005$0.0016$1.60

maxResults applies to each keyword; a category, product or discovery target counts as one input. The default is 70, with larger requests collected in parts of 70. All row types share the allowance, including optional SKU rows. The Free plan is limited to 200 rows per run and 10 runs of this Actor. The whole run stops at your Maximum cost per run (maxTotalChargeUsd in the API).

Example: three keywords delivering 50 rows each produce 150 rows. On the Free plan at 512 MB, one start plus those rows costs $0.005 + 150 × $0.003 = $0.455. Fewer delivered rows mean a lower row charge.

What happens when the run timeout is too short

A run can pause while waiting for results rather than fail solely because the chosen timeout is short. Its status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It temporarily shows ABORTED.

When results are ready, the same run resumes automatically, writes to the same dataset and can finish as SUCCEEDED. A resumed delivery can show "Resumed: delivering N rows." Previously delivered rows are not delivered or charged twice. No manual restart is needed for this pause; an unrelated failure is not a successful resume.

  • Automatic pauses are limited to 3 per run. Keep the default 3600-second timeout to reduce interruptions.
  • Synchronous endpoints (run-sync, run-sync-get-dataset-items) wait at most 300 seconds and may return an empty dataset while the run is paused.
  • For longer jobs, start asynchronously and read the dataset after SUCCEEDED, or use an ACTOR.RUN.SUCCEEDED webhook.

Use with AI agents and the API

Apify MCP server

Add the remote server in Claude, ChatGPT, Cursor, VS Code or another compatible MCP client:

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

Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read rows with get-dataset-items. Clients without remote support can use npx @apify/actors-mcp-server --tools lentic_clockss/tiktok-shop-scraper with APIFY_TOKEN set.

Example prompt: "Find three TikTok Shop products matching lipstick in the Philippines and return their titles, prices and product links."

Apify API

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/tiktok-shop-scraper").call(
run_input={"query": "lipstick", "region": "ph", "maxResults": 3}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row)
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/tiktok-shop-scraper').call({
query: 'lipstick', region: 'ph', maxResults: 3,
});
const { items: rows } = await client.dataset(run.defaultDatasetId).listItems();
console.log(rows);

These examples wait for a run; apply the timeout guidance above for longer jobs. To start asynchronously, send POST https://api.apify.com/v2/acts/lentic_clockss~tiktok-shop-scraper/runs with JSON input and an Authorization: Bearer token header. Read results with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json.

Integrations

Use the Integrations tab to connect Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Apify Schedules can run the same input regularly.

FAQ

This Actor collects public data. You are responsible for complying with the site's terms and applicable data protection law. Processing personal data requires a lawful basis; public availability alone does not supply one.

Why did my run end as ABORTED?

An automatic pause can show ABORTED until results are ready. Check the status message: a manual abort or another failure is not the same as a scheduled resume.

How many results can I get?

Set maxResults from 1 to 500 per input. Available matches, the run's cost cap and Free-plan limits can reduce the total. A product-detail input normally returns one product, with extra SKU rows only when requested.

Why are some fields empty?

Listing cards contain less detail than product pages. The source may omit a price, rating or seller field. Enrichment can add detail but does not guarantee every field.

Which regions work?

Use an accepted region code or a regional product/category link. regions lists reference codes, not guaranteed live coverage. Start with a small run in your target market.

How do I get variants?

Set includeSkus to true for separate SKU rows. Product-detail rows also retain inline skus; listing rows keep variant summaries instead. With a row limit of 1, the parent product can use the entire allowance.

Is this an official TikTok API?

No. This Actor is not affiliated with TikTok and does not provide official TikTok API access, login or checkout.

What if TikTok Shop shows a verification page?

A verification page can prevent collection. Check the run's error message and try a smaller request later. An accepted input does not guarantee accessible results.

Limitations

  • No complete-market coverage guarantee; region reference data is not live availability evidence.
  • No creator analytics, affiliate revenue estimates, login or purchasing.
  • Contact fields such as phone numbers and emails are not a supported contact-discovery service.
  • Product images, attributes and other reference lists are capped at 50 entries.
  • Pagination and detail enrichment depend on what the source exposes. Raising a limit does not guarantee more rows.
  • The Actor does not expose date-window searches or automatic search-word translation.

More e-commerce and marketplace scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Report a problem or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.