TikTok Shop Scraper - Products, Prices & Categories
Pricing
from $2.20 / 1,000 results
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
Maintained by CommunityActor stats
1
Bookmarked
16
Total users
6
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
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 usingqueryorkeywords.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
| Field | Description | Example |
|---|---|---|
productId | Product identifier | 1734757061426971851 |
title | Product name | Lip tint |
url | Product link | https://shop.tiktok.com/ph/pdp/lip-tint/1734757061426971851 |
salePrice | Current sale price | 199.00 |
price | Original/list price; aliases originPrice on product rows | 299.00 |
currency | Currency code | PHP |
rating | Product rating | 4.7 |
reviewCount | Number of reviews | 120 |
soldCount | Reported units sold | 1500 |
shopName | Seller's display name | Example Shop |
image | Main image link | https://example.com/product.jpg |
images | Detail-page image gallery | [] |
description | Detail-page description | Lightweight lip tint |
skuCount | Number of known variants | 3 |
productProperties | Detail-page attributes | [] |
Category rows
| Field | Description | Example |
|---|---|---|
categoryId | Category identifier | 601450 |
categorySlug | Live category URL slug | beauty-personal-care |
name | Category name | Beauty & Personal Care |
parentId | Parent category when available | 601450 |
level | Depth in the category tree | 2 |
Saved category reference rows use slug rather than categorySlug and may lack a URL or parent ID.
Region rows
| Field | Description | Example |
|---|---|---|
code | Accepted region code | ph |
name | Region name | Philippines |
locale | Region locale | en_PH |
currency | Region currency | PHP |
status | Recorded availability assessment, not a live check | unverified |
SKU rows
| Field | Description | Example |
|---|---|---|
id | SKU ID, or product ID plus variant index | 1734757061426971851:0 |
skuId | Source SKU ID, if available | null |
productId | Parent product identifier | 1734757061426971851 |
productTitle | Parent product name; SKU title stays empty | Lip tint |
price | Variant sale price, unlike product-row price | 199.00 |
How to scrape TikTok Shop
- Open TikTok Shop Scraper in Apify Console.
- Leave
modeonautoand fill one target field. - Set
regionif your target is not a full link. Start withmaxResults: 3. - Click Start and wait for the run to finish.
- 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.
Keyword search
Fill query, or supply a keywords list. With auto, this selects keywordSearch. Each keyword has its own row allowance.
Category search
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
| Field | What to enter | Default |
|---|---|---|
mode | auto or one of the six modes above | auto |
query | One search phrase | Empty |
keywords | List of search phrases | Empty |
keyword | Alternative name for query | Empty |
categoryUrl | Full regional category link | Empty |
categoryId | Numeric category ID | Empty; example 601450 |
categorySlug | Category slug from its link | Empty; example beauty-personal-care |
catId | Alternative name for categoryId | Empty |
bucket | Saved category group, such as beauty | Empty |
productUrl | Full regional product link | Empty |
productId | Numeric product ID | Empty |
goodsId | Alternative name for productId | Empty |
region | Accepted storefront code | ph when omitted |
browseCountry | Alternative region setting | Empty |
currency | Compatibility field; currency follows the selected region | Region currency |
maxResults | Maximum rows per input, from 1 to 500 | 70; form example 3 |
maxPages | Pagination setting, from 1 to 20 | 1 |
enrichDetails | Add details to selected listings | false |
enrichLimit | Detail-enrichment limit, from 0 to 50 | 3 |
includeSkus | Add separately billed SKU rows | false |
pageRetry | Page retry setting, from 1 to 5 | 2 |
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}
maxItemsandlimitare accepted asmaxResults.- 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
browseCountryandregion. Currency follows that region;currencydoes 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_REPORTin 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 plan | Start at 512 MB | Price per row | Price 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 anACTOR.RUN.SUCCEEDEDwebhook.
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 ApifyClientclient = 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
Is it legal to scrape TikTok Shop?
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.
Related scrapers
More e-commerce and marketplace scrapers from the same publisher:
- Walmart Product Scraper
- Temu Product Scraper
- Allegro Scraper
- Amazon Search, Category & Best Sellers Scraper
- Coupang Product Scraper
- MercadoLibre Scraper
- Rakuten Japan Scraper
- SHEIN Product Scraper
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.