TikTok Shop Scraper Guide: Product Data, Prices, and SKUs
Advanced Data Extraction Specialist
TL;DR:
- A TikTok Shop scraper starts with a known product. Send
product_idandregiontoscraper.tiktok.shop.page. - Product and variant records need separate tables. Product-level price, stock, seller, and shipping should not overwrite SKU-level options and availability.
- Region and currency belong on every observation. The returned region represents the page that resolved, while currency gives the price its meaning.
- Sales labels have limits. Preserve
sold_countas returned; do not reinterpret it as GMV, an order ledger, or sales for a chosen period. - Snapshots support monitoring. The actor returns product data; scheduling and history are built by the calling application.
- Free to start. New Scrapeless accounts include free credit through the Scrapeless Dashboard.
Introduction: model the product before building the feed
A TikTok Shop product page combines several kinds of data: product identity, seller identity, displayed price, aggregate stock, selectable options, SKUs, images, ratings, reviews, categories, and shipping details. Flattening all of that into one row works until a product has several variants or a field is missing in one region.
The Scrapeless TikTok Shop scraper returns a structured product response from a known product ID and region. This guide shows the request, maps the fields, and builds a clean Python normalizer for product and SKU records. For the common request envelope used by managed data actors, read the published Scrapeless data actor guide.
What the TikTok Shop Scraper Returns
The scraper.tiktok.shop.page actor is designed for product detail lookup. It can return:
- product ID, name, region, seller, and sold count
- displayed price and currency
- aggregate stock
- rating and review count
- product images
- option definitions and SKU records
- SKU availability
- seller details, categories, and shipping information
The response describes a requested public product page at collection time. It is not a full catalog export, checkout result, order history, or automatic price history.
TikTok's own commerce documentation distinguishes products from SKUs in the Products API overview. That distinction is also the right database boundary for scraped product-page records: one product can own many sellable variants.
Request Parameters
The endpoint is POST https://api.scrapeless.com/api/v1/scraper/request, authenticated with x-api-token.
The body has two required inputs:
| Parameter | Type | Purpose |
|---|---|---|
product_id |
string | Identifies the Shop product page |
region |
string | Selects the market context for the request |
The documentation shows region examples such as GB, SG, JP, and US. Do not treat that short example set as a complete market directory. Confirm the market needed by the product workflow and retain the region returned in the result.
The full input and output example is in the TikTok Shop page actor documentation.
Prerequisites
- A Scrapeless account and API token from the Scrapeless Dashboard
- A known public TikTok Shop product ID
- The market region needed by the research task
- A storage schema that can keep product and SKU snapshots separately
The code requires a live token in SCRAPELESS_API_KEY and a real product ID in TIKTOK_SHOP_PRODUCT_ID.
Quick Capture With curl
bash
curl --request POST 'https://api.scrapeless.com/api/v1/scraper/request' \
--header "x-api-token: ${SCRAPELESS_API_KEY}" \
--header 'content-type: application/json' \
--data "{\"actor\":\"scraper.tiktok.shop.page\",\"input\":{\"product_id\":\"${TIKTOK_SHOP_PRODUCT_ID}\",\"region\":\"GB\"}}"
The response is JSON. The registered application/json type is maintained in IANA's media type registry, so standard HTTP clients can parse the body without a site-specific decoder.
Normalize Product and SKU Data in Python
The normalizer below preserves the raw response, creates one product record, and emits one row per SKU. It deliberately avoids assuming that every optional field exists.
python
import json
import os
from datetime import datetime, timezone
from urllib.request import Request, urlopen
ENDPOINT = "https://api.scrapeless.com/api/v1/scraper/request"
def fetch_product(product_id, region):
payload = {
"actor": "scraper.tiktok.shop.page",
"input": {"product_id": str(product_id), "region": region},
}
request = Request(
ENDPOINT,
data=json.dumps(payload).encode(),
headers={
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
"content-type": "application/json",
},
method="POST",
)
with urlopen(request, timeout=60) as response:
return json.load(response)
def normalize(raw):
observed_at = datetime.now(timezone.utc).isoformat()
product_id = str(raw.get("product_id", ""))
product = {
"observed_at": observed_at,
"product_id": product_id,
"region": raw.get("region"),
"name": raw.get("name"),
"seller": raw.get("seller"),
"price": raw.get("price"),
"currency": raw.get("currency"),
"stock": raw.get("stock"),
"sold_count": raw.get("sold_count"),
"rating": raw.get("rating"),
"review_count": raw.get("review_count"),
}
sku_rows = []
for sku in raw.get("skus") or []:
sku_rows.append({
"observed_at": observed_at,
"product_id": product_id,
"region": raw.get("region"),
"sku_id": str(sku.get("sku_id") or sku.get("id") or ""),
"options": sku.get("options"),
"availability": sku.get("availability"),
"price": sku.get("price"),
"currency": sku.get("currency") or raw.get("currency"),
})
return product, sku_rows
raw_product = fetch_product(os.environ["TIKTOK_SHOP_PRODUCT_ID"], "GB")
product_row, sku_rows = normalize(raw_product)
print(json.dumps({"product": product_row, "skus": sku_rows}, indent=2))
Start Scraping with Scrapeless
Power up your web scraping and automation workflow with Scrapeless!
Sign up today and get $5 in free credit — no credit card required.Claim your free credit now in the Scrapeless Dashboard.
How to Read the Product Fields
Identity and seller
Store product_id as a string. Keep the seller object or seller identifier with the product snapshot, because a name alone may not be a durable join key.
Price and currency
A price without currency and region is incomplete. Preserve the value exactly as returned, then normalize its numeric representation only in a separate field. The ISO currency code reference explains why currency identifiers belong beside monetary values.
Stock and availability
Product-level stock is an aggregate view. SKU availability describes a specific option combination. TikTok Shop's inventory documentation also identifies product and SKU as separate inventory dimensions. Preserve both levels and avoid substituting a missing SKU field with the product aggregate.
Sold count, rating, and reviews
Keep sold_count, rating, and review count as observed labels. A product-page sold count does not establish a reporting window and does not expose an order ledger. Rating and review count describe the current page response, not the text of individual reviews.
Options and SKUs
Options describe dimensions such as color or size; SKU records represent concrete combinations when the page exposes them. Store the raw option structure beside a normalized label so a newly introduced option does not break older rows.
Build a Snapshot-Ready Schema
A practical model uses three stores:
| Store | Key fields | Reason |
|---|---|---|
| Raw responses | collection ID, observed time, product ID, region | Supports later reprocessing |
| Product snapshots | observed time, product ID, region, price, currency, stock | Supports product-level comparisons |
| SKU snapshots | observed time, product ID, SKU ID, options, availability | Supports variant-level comparisons |
Missing and zero are different. Zero stock is a value; absent stock is unknown. Keep that distinction in databases, analytics jobs, and alert rules.
Scrapeless provides this actor through Scraping API. Use the current pricing page when sizing a product set and collection cadence.
Common Problems to Prevent
- Sending a numeric product ID. Keep identifiers as strings through configuration, requests, and storage.
- Dropping region after the request. Region is part of the observation and belongs in each normalized row.
- Assuming every product has SKUs. Use an empty list when no SKU array is present.
- Turning missing availability into zero. Preserve null or absence until the source provides a definite state.
- Calling sold count revenue. The field is not a price-times-orders ledger and should not be used as GMV.
Conclusion: preserve the product hierarchy
A reliable TikTok Shop scraper starts with a known product ID and region, then keeps product and SKU data at their natural levels. That structure makes one-off research useful now and leaves room for timestamped comparison later.
Ready to Build Your TikTok Shop Dataset?
Discuss schemas in the Scrapeless Discord or Telegram community. Open the Scrapeless Dashboard when your product list and region rules are ready.
FAQ
Q: What does a TikTok Shop scraper collect?
The actor covered here collects a known public product page's product, seller, price, currency, stock, rating, review count, image, option, SKU, category, and shipping fields when available.
Q: How do I scrape TikTok Shop products with Python?
Send a JSON POST request to the Scrapeless Scraper API with actor scraper.tiktok.shop.page, plus product_id and region in the input object.
Q: Can the actor discover every product in a shop?
No. This product-page actor expects a known product ID; it should not be described as a complete catalog discovery API.
Q: Does the response include product variants?
It can include options and SKU records with availability. Keep those records separate from product-level fields.
Q: Does the actor track prices automatically?
No. It returns a snapshot. Your application schedules calls, stores timestamps, compares snapshots, and sends any alerts.
Q: Is scraping TikTok Shop data legal?
Legality depends on the market, purpose, data, access method, and applicable terms. Collect public product data for a permitted purpose and confirm obligations for the regions in scope.
Q: Do I need to manage a proxy or page-defense parser?
The managed actor handles the collection surface. Your code supplies valid product context and handles the structured response.
Q: Can this run without an AI agent?
Yes. The example uses ordinary HTTP requests and does not depend on an agent.
At Scrapeless, we only access publicly available data while strictly complying with applicable laws, regulations, and website privacy policies. The content in this blog is for demonstration purposes only and does not involve any illegal or infringing activities. We make no guarantees and disclaim all liability for the use of information from this blog or third-party links. Before engaging in any scraping activities, consult your legal advisor and review the target website's terms of service or obtain the necessary permissions.



