# TikTok Shop UK Scraper (No Login) - Sales, Stock & Prices (`headply/tiktok-shop-uk-scraper`) Actor

Scrape TikTok Shop UK products without an account: price in GBP, units sold, stock per variant, ratings, reviews, delivery and shop stats. By UK category or product link, with a scheduled 'what changed' mode for daily sales and stock tracking.

- **URL**: https://apify.com/headply/tiktok-shop-uk-scraper.md
- **Developed by:** [Mayowa Ogedengbe](https://apify.com/headply) (community)
- **Categories:** E-commerce, Social media, Marketing
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.75 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TikTok Shop UK Scraper: units sold, stock and prices for UK products

See what is actually selling on **TikTok Shop UK**. Get the price in **GBP**, **units sold**, **stock for every
variant**, rating, reviews, delivery times and shop stats for any product on the UK storefront. Browse UK
categories for the current best sellers, or paste product links. No TikTok account, no login, no cookies.

Built for **UK sellers, brands and product researchers**: size up a niche once, or put it on a schedule and get only
the products whose sales, stock or price changed since the last run.

### What you get for every UK product

| | |
|---|---|
| **Sales** | Units sold (TikTok Shop's own counter), rating, number of reviews, reviews per star |
| **Price** | Current price in GBP, original price and discount, highest variant price |
| **Stock** | Stock for every variant (shade, size, colour, bundle...), total stock, in-stock flag, purchase limit |
| **Product** | Title, images, description, specifications, category path, brand |
| **Shop** | Shop name and link, shop rating, shop units sold, shop reviews, number of products, followers |
| **Delivery** | Delivery fee, free-delivery flag, delivery days and estimated delivery dates |
| **Reviews** | Up to 5 recent UK reviews: rating, text, date, variant bought, verified purchase, photos |

### How to use it

1. **Choose what to scrape.** Any mix of:
   - **Categories**: a name such as `Beauty & Personal Care`, `Home Supplies`, `Phones & Electronics`,
     `Womenswear & Underwear` or `Toys & Hobbies`, or a category link like
     `https://shop.tiktok.com/gb/c/beauty-personal-care/601450`. Each category returns a sample of its current
     best-selling products.
   - **Product URLs or IDs**, e.g. `https://shop.tiktok.com/gb/pdp/1729587741574924325`. Share links copied from
     the TikTok app work too.
2. **Set the maximum** number of products per category (default 30).
3. **Press Start.** A UK category with 30 products typically finishes in about a minute and a half.
4. **Open the results** in the **Overview** tab (one row per product) or the **Variants** tab (one row per variant
   with its own price and stock), then export to Excel, CSV or JSON, or use the API.

Example input:

```json
{
  "categories": ["Beauty & Personal Care", "Home Supplies"],
  "products": ["https://shop.tiktok.com/gb/pdp/1729587741574924325"],
  "maxProductsPerSource": 50
}
```

With no input at all, the Actor returns a small live sample (3 UK products) so you can see the output.

### Input

| Field | What it does | Default |
|---|---|---|
| `categories` | UK category names or links | — |
| `products` | UK product links, share links or product IDs | — |
| `includeSubcategories` | Also sample the category's subcategories, for wider coverage | off |
| `maxProductsPerSource` | Upper limit for each category (1-1000) | 30 |
| `includeDetails` | On: full product data. Off: list data only (title, price, units sold, rating, shop), cheaper and faster | on |
| `monitorChanges` | Return only products that are new or whose units sold, stock, rating, reviews or price changed | off |
| `monitorName` | Separate memory per schedule (e.g. `beauty-uk`, `competitors`) | `default` |
| `region` | Storefront country, United Kingdom by default | `gb` |

### Output example

A real product from a UK "Beauty & Personal Care" run on 23 October 2026 (lists shortened):

```json
{
  "type": "product",
  "detailLevel": "full",
  "productId": "1729587741574924325",
  "region": "gb",
  "url": "https://shop.tiktok.com/gb/pdp/nyx-professional-makeup-fat-oil-lip-drip-gloss-12hr-hydration-8-shades/1729587741574924325",
  "title": "NYX Professional Makeup Fat Oil Lip Drip Lip Gloss",
  "currency": "GBP",
  "price": 9.29,
  "originalPrice": null,
  "discountPercent": null,
  "priceMax": 44.6,
  "soldCount": 72468,
  "rating": 4.7,
  "reviewCount": 4236,
  "ratingBreakdown": {"five": 3495, "four": 405, "three": 181, "two": 47, "one": 108},
  "stockTotal": 888,
  "inStock": true,
  "skuCount": 24,
  "skus": [
    {
      "optionsText": "Shade: Value Creamy Bundle",
      "price": 33.9,
      "stock": 6,
      "originalPrice": 55.73,
      "available": true,
      "skuId": "1729420536439606309",
      "purchaseLimit": 200,
      "options": {"Shade": "Value Creamy Bundle"}
    }
  ],
  "brand": "NYX Professional Makeup",
  "categories": [
    {"id": "601450", "name": "Beauty & Personal Care", "level": 1},
    {"id": "848648", "name": "Makeup", "level": 2},
    {"id": "601534", "name": "Lipstick & Lip Gloss", "level": 3}
  ],
  "seller": {
    "sellerId": "7493991065975424037",
    "shopName": "NYX Cosmetics",
    "shopUrl": "https://shop.tiktok.com/gb/store/nyx-cosmetics/7493991065975424037",
    "shopRating": 4.4,
    "shopSoldCount": 452360,
    "shopReviewCount": 27864,
    "shopProductCount": 77,
    "shopFollowers": 428785
  },
  "shipping": {
    "fee": 0,
    "currency": "GBP",
    "freeShipping": true,
    "minDays": 2,
    "maxDays": 4,
    "service": "3-day delivery",
    "estimatedDelivery": "Oct 25 - Oct 27"
  },
  "reviews": [
    {
      "reviewId": "7331853656058251041",
      "rating": 5,
      "createdAt": "2024-02-04T20:58:16Z",
      "variant": "Full Fat Bundle",
      "verifiedPurchase": true,
      "country": "GB"
    }
  ],
  "source": {"type": "category", "value": "beauty-personal-care/601450"},
  "changes": null,
  "scrapedAt": "2026-10-23T15:20:43.321Z"
}
```

Every row also has `images`, `description`, `descriptionImages`, `specifications` and review texts. Fields a
product does not have are `null` (or an empty list), so every row has the same columns.

Other UK products from the same day: bBold Instant Airbrush Body Make-Up (62,541 sold, £16.45), Lash Growth Serum
(94,767 sold, £29.63), a bikini trimmer from UUPower (77,027 sold, £5.74).

### Track UK sales and stock over time (scheduled runs)

1. Turn on **Only new or changed products** and give the monitor a name.
2. Click **Schedule** and choose daily (or hourly, weekly...).
3. Every run returns only the products that are new or whose units sold, stock, rating, reviews or price moved,
   with a `changes` field:

```json
"changes": {"isNew": false, "since": "2026-10-22T08:00:00Z", "soldDelta": 37, "stockDelta": -41,
            "priceBefore": null, "ratingBefore": null, "reviewCountDelta": 4}
```

`soldDelta` over a day is that product's daily UK sales; multiply by the price for an estimate of daily revenue.
Unchanged products are not returned and **not billed**.

### Pricing

Pay only for results (Apify pay-per-event):

| Event | Price |
|---|---|
| Product with full details | **$2.50 per 1,000** on the Free plan, down to **$1.75 per 1,000** on Gold |
| Product, list data only (`includeDetails` off) | $0.80 per 1,000 |
| UK listing access (once per run when you browse UK categories) | $0.01 |
| Run start | $0.001 |

Examples:

- 100 products from a UK category, full details: about **$0.26** ($0.25 + $0.01 listing access).
- 20 UK product links: about **$0.05** (product links never trigger listing access).
- Daily monitor of 500 UK products where 60 changed today: about **$0.16** that day.

Products that do not exist, duplicates and unchanged products (monitor mode) are never billed. You can cap any run
with Apify's maximum cost setting; the run then stops cleanly with what it has.

**Free Apify plan:** runs started on Apify's free plan return up to **10 products per run**. Any paid Apify plan
removes this limit.

### Use it from code or automation

**API (cURL)**, run and get the products in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/headply~tiktok-shop-uk-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"categories": ["Beauty & Personal Care"], "maxProductsPerSource": 25}'
```

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("headply/tiktok-shop-uk-scraper").call(run_input={
    "categories": ["Home Supplies"],
    "maxProductsPerSource": 50,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["title"], product["soldCount"], product["price"])
```

**n8n / Make / Zapier:** use the Apify node, action *Run an Actor and get dataset items*, Actor
`headply/tiktok-shop-uk-scraper`, and the same JSON input. A daily schedule + Google Sheets node gives you a UK sales
log per product.

### Ideas

- **UK product research:** which products in a category sell, at what price, with how many reviews.
- **Competitor tracking:** follow UK competitors' units sold, stock and prices every day.
- **Stock alerts:** catch products and variants about to sell out (`stockTotal`, `skus[].stock`).
- **Brand monitoring:** see which shops sell your brand on TikTok Shop UK, and at what price.

### FAQ

**Do I need a TikTok account or cookies?** No. The Actor reads public TikTok Shop UK pages, as any visitor sees them.

**Is "units sold" an estimate?** No, it is the sold counter TikTok Shop shows on the product. Revenue is not shown
by TikTok; `soldCount × price` (or `soldDelta × price` in monitor mode) gives you an estimate.

**Can I search UK products by keyword?** Not yet: TikTok Shop's keyword pages exist for the US storefront only. Use
UK categories (with **Include subcategories** for wider coverage) or product links.

**Why can the same product show slightly different prices in two runs?** TikTok Shop shows different visitors
slightly different promotional prices on many products (up to about 12% within minutes). The Actor reports the price
a new visitor sees at that moment. In monitor mode, price moves of 15% or less don't count as a change.

**Why did a category return fewer products than my maximum?** Category pages show a rotating selection of the
category's products. The Actor keeps collecting, and moves on into subcategories, until it reaches your maximum or
stops finding new products.

**What if an input can't be used?** It is skipped with the reason in the run's status and in the `SUMMARY` record
(not billed), and the rest of the run goes ahead.

**Other countries?** This Actor is set up for the UK. For the US, Southeast Asia, Mexico and Japan, see
[TikTok Shop Scraper (10 countries)](https://apify.com/headply/tiktok-shop-scraper).

**Is it legal?** The Actor collects publicly available product information. You are responsible for how you use the
data; check TikTok's terms and the laws that apply to you, and do not collect personal data you have no basis to use.

### Related Actors

- [TikTok Shop Scraper (10 countries)](https://apify.com/headply/tiktok-shop-scraper): US keywords plus 9 more countries.
- [TikTok Profile Scraper](https://apify.com/headply/tiktok-profile-scraper): creators' followers, likes and videos.
- [TikTok Video Scraper](https://apify.com/headply/tiktok-video-scraper): full stats for any TikTok video.

Questions or something missing? Open an issue on the Actor's Issues tab.

# Actor input Schema

## `region` (type: `string`):

United Kingdom by default. Used for categories and bare product IDs; product URLs always use the country in the URL.

## `products` (type: `array`):

TikTok Shop United Kingdom product links (for example https://shop.tiktok.com/gb/pdp/1729587741574924325) or bare product IDs. Share links from the TikTok app work too.

## `categories` (type: `array`):

Category names (for example 'Beauty & Personal Care', 'Home Supplies', 'Phones & Electronics') or category links. Each category returns a sample of its current best-selling products.

## `includeSubcategories` (type: `boolean`):

Also sample the category's subcategories, for wider coverage.

## `maxProductsPerSource` (type: `integer`):

Upper limit for each category.

## `includeDetails` (type: `boolean`):

On: every product with variants and stock, shipping, description, reviews and shop stats. Off: only the list data (title, price, units sold, rating) - cheaper and faster. Product URLs always return full details.

## `monitorChanges` (type: `boolean`):

Remembers every product between runs and returns only products that are new or whose units sold, stock, rating, reviews or price changed, with the change in a 'changes' field. Unchanged products are not billed.

## `monitorName` (type: `string`):

Keep separate memories for different schedules (for example 'competitors').

## Actor input object example

```json
{
  "region": "gb",
  "products": [
    "https://shop.tiktok.com/gb/pdp/1729587741574924325"
  ],
  "categories": [
    "Beauty & Personal Care"
  ],
  "includeSubcategories": false,
  "maxProductsPerSource": 30,
  "includeDetails": true,
  "monitorChanges": false,
  "monitorName": "default"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "products": [
        "https://shop.tiktok.com/gb/pdp/1729587741574924325"
    ],
    "categories": [
        "Beauty & Personal Care"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("headply/tiktok-shop-uk-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "products": ["https://shop.tiktok.com/gb/pdp/1729587741574924325"],
    "categories": ["Beauty & Personal Care"],
}

# Run the Actor and wait for it to finish
run = client.actor("headply/tiktok-shop-uk-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "products": [
    "https://shop.tiktok.com/gb/pdp/1729587741574924325"
  ],
  "categories": [
    "Beauty & Personal Care"
  ]
}' |
apify call headply/tiktok-shop-uk-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,headply/tiktok-shop-uk-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/TjqNTP4J96SDOcMt2/builds/CyOPNpMwDiBKxRKmg/openapi.json
