
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape products from any WooCommerce store: names, prices, sale prices, stock, ratings, reviews, SKUs, images, categories, tags, attributes and variations. Paste a store domain, category or product URL. No login needed.
Get every product from any WooCommerce store: names, prices, sale prices, stock, ratings, review counts, SKUs, images, categories, tags, attributes and, if you want them, every variation's own price and stock. Paste a store domain, a category URL or a product URL. No login, no API keys, no browser: the scraper reads the store's public Store API, so even big catalogues come back in seconds.
/product-category/ URL one category, a /product-tag/ URL one tag, a /product/ URL one product.available, isOnBackorder, lowStockRemaining and the store's stock text show when products run low.mystore.com, https://www.mystore.com, a category URL or a product URL).Not sure a site runs WooCommerce? Open https://the-store.com/wp-json/wc/store/v1/products in your browser: a JSON list means it works.
| Field | What it does |
|---|---|
startUrls | Store domains, home pages, category, tag or product URLs |
maxResults | Maximum products per store address (0 = no limit) |
search | Keyword for the store's own product search |
categories, tags | Only products in these categories / tags (name, slug or id) |
minPrice, maxPrice | Price range in the store's currency |
onSaleOnly, inStockOnly, featuredOnly | Only sale, in-stock or featured products |
sortBy, sortOrder | Newest, price, popularity, rating, name, store order... |
includeVariations | Add every variation's price, SKU, stock and image |
includeHtml | Also keep the descriptions' original HTML |
proxyConfiguration | Datacenter by default; residential is used automatically when a store blocks datacenter |
{
"startUrls": ["https://porterandyork.com", "https://www.mandarinstone.com/product-category/new-arrivals/"],
"maxResults": 100,
"inStockOnly": true,
"includeVariations": true
}
One row per product.
| Field | Description |
|---|---|
store, storeUrl | Store domain and home page |
id, name, url, slug, sku, type | Product identity (type: simple, variable, grouped, external) |
featuredImage, images, imageCount | Image URLs |
currency, currencySymbol | ISO currency code and symbol |
price, regularPrice, salePrice, priceMin, priceMax | Prices as numbers; salePrice is null when not on sale; min/max cover all variations |
onSale, discountPercent | Sale flag and discount |
available, isPurchasable, isOnBackorder, lowStockRemaining, stockStatus | Stock data |
averageRating, reviewCount | Ratings (rating is null without reviews) |
variationCount, variants | Number of variations, and the variation details when turned on |
categories, tags, brands | Names |
attributes, attributeValues | Attribute names, and each attribute's values |
shortDescription, description | Plain text (HTML in descriptionHtml when turned on) |
scrapedAt | When the row was saved (UTC) |
Example from a real run (description shortened):
{
"store": "porterandyork.com",
"storeUrl": "https://porterandyork.com",
"id": 63346,
"name": "31/40 Shrimp – 2LB",
"url": "https://porterandyork.com/product/31-40-shrimp-2lb/",
"sku": "PY5460",
"type": "simple",
"featuredImage": "https://porterandyork.com/wp-content/uploads/31-40-Shrimp-Website-photo-scaled.jpg",
"imageCount": 1,
"currency": "USD",
"price": 24,
"regularPrice": 24,
"salePrice": null,
"onSale": false,
"available": true,
"isOnBackorder": false,
"averageRating": null,
"reviewCount": 0,
"variationCount": 0,
"categories": ["Seafood"],
"description": "2 lbs of succulent 31/40 count shrimp: peeled, vein removed, tail removed, and ready to cook. ..."
}
A variation in variants (with Include variations on):
{
"id": 472106,
"title": "Size: 1200x600x10",
"options": {"Size": "1200x600x10"},
"sku": "PAURM12x6",
"price": 44.64,
"regularPrice": 44.64,
"salePrice": null,
"available": true,
"stockStatus": "902 in stock"
}
The run's OUTPUT record lists every store address with its status, the number of matching products and how many were saved, plus the reason when a store could not be read.
$0.70 per 1,000 products ($0.0007 per product), charged only for products saved. Variations, descriptions and stores that could not be read cost nothing extra. Platform usage (compute and proxy traffic) is billed separately and is small: in our test runs a 1,070-product store used about $0.001 and a 1,847-product store about $0.009 of usage.
Example: 1,000 products ≈ $0.70 in product charges plus well under one cent of usage.
Is it legal? The scraper reads only the public Store API that the store's own pages use, with no login. Check each store's terms before large commercial use, and handle any personal data according to the law that applies to you.
Do I need a login, API key or proxy? No login or key. The default datacenter proxy works for most stores; when a store's firewall refuses it, that store switches to residential exits in its own country automatically.
How many products can I get? As many as the store publishes: set the limit to 0 for the whole catalogue. Use the run's maximum charge to cap spending on very large stores.
Why is a field empty? The store did not fill it (many stores have no SKU, short description, tags or reviews). salePrice is null when a product is not on sale and averageRating is null when it has no reviews.
Can I schedule it or use the API? Yes. Schedule daily runs for price monitoring, or start runs and read results through the API and export them as JSON, CSV or Excel.
Can I come from a similar actor on another platform? Yes: the domains and maxProducts input names are accepted too.
OUTPUT.price is the lowest variation price; turn on Include variations for every variation's own price.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalStore URLs or domains
WooCommerce stores to scrape. A domain or home page (mystore.com) scrapes the whole catalogue, a category URL (/product-category/...) scrapes that category, a tag URL (/product-tag/...) that tag, and a product URL (/product/...) saves that one product. Any format works: with or without https:// and www.
maxResultsintegerOptionaldefault 20Maximum products per store
Stop after this many products from each store address. 0 means no limit: the whole catalogue (or category) is saved, so use the run's maximum charge to bound very large stores.
searchstringOptionalSearch keyword
Only products that match this keyword in the store's own product search (name, description, SKU). Leave empty to get every product.
Optional. Filters run on the store's side, so you only pay for products that match.
categoriesarrayOptionalCategories
Only products in these categories. Use the category name, slug (the part after /product-category/) or numeric id. Several categories match any of them.
tagsarrayOptionalTags
Only products with these tags (name, slug or id).
minPricenumberOptionalMinimum price
Only products priced at or above this amount, in the store's own currency (19.99 means 19.99).
maxPricenumberOptionalMaximum price
Only products priced at or below this amount, in the store's own currency.
onSaleOnlybooleanOptionaldefault falseOn sale only
Only products that currently have a sale price.
inStockOnlybooleanOptionaldefault falseIn stock only
Only products that are in stock.
featuredOnlybooleanOptionaldefault falseFeatured only
Only products the store marks as featured.
Sort order and extra data.
sortByenumOptionaldefault "date"Sort by
Order in which products are read. With a product limit this decides which products you get (for example the cheapest or the best rated).
sortOrderenumOptionalSort direction
Descending gives newest, most expensive, most popular or best rated first. Leave empty for the natural direction of the chosen sort (A to Z for names, newest or highest first otherwise).
includeVariationsbooleanOptionaldefault falseInclude variations
Add a variants list to variable products, with each size or colour's own price, sale price, SKU, stock and image. Adds about one request per 100 variations; no extra charge.
includeHtmlbooleanOptionaldefault falseInclude description HTML
Also save the descriptions as the store's original HTML, next to the plain text versions.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Most stores answer through datacenter proxies. When a store's firewall refuses them, the scraper switches that store to residential exits in the store's country automatically.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| store | string | Store domain |
| storeUrl | string | Store home page |
| id | number | null | WooCommerce product id |
| name | string | null | Product name |
| url | string | null | Product page URL |
| slug | string | null | |
| sku | string | null | Stock keeping unit |
| type | string | null | simple, variable, grouped or external |
| featuredImage | string | null | |
| images | array | |
| imageCount | number | |
| currency | string | null | ISO 4217 currency code |
| currencySymbol | string | null | |
| price | number | null | Current price (lowest variation price for variable products) |
| regularPrice | number | null | |
| salePrice | number | null | Sale price, null when not on sale |
| priceMin | number | null | |
| priceMax | number | null | |
| onSale | boolean | |
| discountPercent | number | null | |
| available | boolean | In stock |
| isPurchasable | boolean | |
| isOnBackorder | boolean | |
| lowStockRemaining | number | null | |
| stockStatus | string | null | Stock text shown by the store, e.g. 3 in stock |
| averageRating | number | null | 0 to 5, null without reviews |
| reviewCount | number | |
| variationCount | number | |
| categories | array | |
| tags | array | |
| brands | array | |
| attributes | array | |
| attributeValues | array | |
| variants | array | Only with Include variations |
| shortDescription | string | null | |
| description | string | null | |
| descriptionHtml | string | null | |
| shortDescriptionHtml | string | null | |
| scrapedAt | string |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Product | Charged once per product saved, with its prices, stock, rating, images, categories, attributes and (when turned on) variations. | $0.0007 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/woocommerce-scraper').call({
"startUrls": [
"https://porterandyork.com",
"https://www.mandarinstone.com"
],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/woocommerce-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/woocommerce-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
A store category URL, with each variation's own price, SKU and stock.
Keyword search with in-stock and price-range filters on a European store.
Only discounted products, sorted by price from low to high.
A store's most popular products, keeping the original description HTML.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.