Skip to content

Python guide

Scrape TikTok Shop products
with Python.
Search, page, save.

Titles, prices, discounts, units sold, ratings and shops for the TikTok Shop products matching a search, saved to CSV. One API key. No TikTok login or browser.

  • 2 creditsper page
  • 45products on page 1
  • 0TikTok logins
import csv
import os
import requests

API_URL = "https://www.monocrawl.com/v1/tiktokshop/search"
HEADERS = {"x-api-key": os.environ["MONOCRAWL_API_KEY"]}


def search_products(query, region="US", max_pages=10):
    params = {"query": query, "region": region}
    for _ in range(max_pages):
        body = requests.get(API_URL, params=params, headers=HEADERS, timeout=60).json()
        if not body.get("success"):
            raise RuntimeError(body["error"]["message"])
        yield from body["data"]["items"]
        cursor = body["data"].get("cursor")
        if not cursor:
            break
        params = {"query": query, "region": region, "cursor": cursor}


with open("products.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["id", "title", "price", "was", "currency", "sold", "rating", "shop", "url"])
    for product in search_products("lip oil", max_pages=2):
        price = product["price"] or {}
        writer.writerow([product["id"], product["title"], price.get("amount"), price.get("original_amount"),
                         price.get("currency"), product["sold_count"], product["rating"],
                         product["shop"], product["url"]])

$ python products.py

GET /v1/tiktokshop/search q="lip oil" · page 1

✓ 45 products · 2 credits · cursor returned

✓ page 2: 22 more products · 2 credits · 0 repeats

✓ products.csv · 67 rows for 4 credits

Replay of a real call, recorded 26 Sep 2026

Four steps

Copy, paste, run.
See what each step returns.

Terminal
export MONOCRAWL_API_KEY="mn_your_key_here"
pip install requests

What you get

MONOCRAWL_API_KEY=mn_••••••••Free plan · 1,000 credits a month · No card

What comes back

One page.
Real products.

A real page from a TikTok Shop US search for “lip oil”: 45 products for 2 credits. The first 6 are below, as returned.

  • idThe product’s TikTok Shop id
  • titleThe listing title
  • priceFormatted price, amount, currency and the pre-discount amount
  • sold_countUnits sold, as TikTok Shop shows it
  • ratingAverage star rating, when it has one
  • shopThe store selling it
  • urlThe product page
  1. Neutrogena Hydro Boost Tinted Lip Oil with Hyaluronic Acid in Light Pink Shade .2 oz - Glossy Hydrating Moisture for Daily Lip Care$13.94 (was $15.49)61,769 sold4.6Neutrogena
  2. Nooni Korean Apple Lip Tint Stain Duo/Trio Bundle | Glossy Lip Stain, Tinting & Long Lasting, Moisturizing Lip Care, Hydrate Lipgloss, Travel-Friendly, Smooth Oil Moisture, All Skin Types Travelfriendly Smoothing$25.19 (was $35.99)120,561 sold4.3NOONI
  3. COSRX 5 Peptide Lip Treatment for Barrier Repair & Hydration, 12g$15.65 (was $16.50)12,869 sold4.6COSRX US
  4. Halloween Fall Gift Peach Lip Oil, enriched with plant-based squalane, contains vitamin E and glycerin for long-lasting hydration and soft lips.$9.78 (was $13.99)1 soldno ratingLx Blend
  5. Nooni Korean Apple Lip Oil + Lip Stain | Glossy Lip Stain, Tinting & Long Lasting, Moisturizing Lip Care (17 options) Hydrate Lipgloss Lipstick Makeup Glossy Hydrating Moisturizer Plump Transfer-proof$15.00333,865 sold4.3NOONI
  6. Romantic Beauty Roller Ball Lip Oil, Hydrating Non-Sticky Lip Gloss, Nourishing Formula with Glass-Like Shine$7.99 (was $12.99)2 soldno ratingBlakes Ritual
Show the JSON
{
  "success": true,
  "data": {
    "count": 45,
    "cursor": "mlc1.…",
    "items": [
      {
        "id": "1729616740488286812",
        "title": "Neutrogena Hydro Boost Tinted Lip Oil with Hyaluronic Acid in Light Pink Shade .2 oz - Glossy Hydrating Moisture for Daily Lip Care",
        "url": "https://www.tiktok.com/shop/pdp/1729616740488286812",
        "price": {
          "formatted": "$13.94",
          "amount": 13.94,
          "currency": "USD",
          "original_amount": 15.49
        },
        "sold_count": 61769,
        "rating": 4.6,
        "shop": "Neutrogena",
        "free_shipping": false
      },
      {
        "id": "1729619454557917428",
        "title": "Nooni Korean Apple Lip Tint Stain Duo/Trio Bundle | Glossy Lip Stain, Tinting & Long Lasting, Moisturizing Lip Care, Hydrate Lipgloss, Travel-Friendly, Smooth Oil Moisture, All Skin Types Travelfriendly Smoothing",
        "url": "https://www.tiktok.com/shop/pdp/1729619454557917428",
        "price": {
          "formatted": "$25.19",
          "amount": 25.19,
          "currency": "USD",
          "original_amount": 35.99
        },
        "sold_count": 120561,
        "rating": 4.3,
        "shop": "NOONI",
        "free_shipping": false
      },
      {
        "id": "1732544930335264939",
        "title": "COSRX 5 Peptide Lip Treatment for Barrier Repair & Hydration, 12g",
        "url": "https://www.tiktok.com/shop/pdp/1732544930335264939",
        "price": {
          "formatted": "$15.65",
          "amount": 15.65,
          "currency": "USD",
          "original_amount": 16.5
        },
        "sold_count": 12869,
        "rating": 4.6,
        "shop": "COSRX US",
        "free_shipping": false
      },
      {
        "id": "1732360524508336558",
        "title": "Halloween Fall Gift  Peach Lip Oil, enriched with plant-based squalane, contains vitamin E and glycerin for long-lasting hydration and soft lips.",
        "url": "https://www.tiktok.com/shop/pdp/1732360524508336558",
        "price": {
          "formatted": "$9.78",
          "amount": 9.78,
          "currency": "USD",
          "original_amount": 13.99
        },
        "sold_count": 1,
        "rating": null,
        "shop": "Lx Blend",
        "free_shipping": false
      },
      {
        "id": "1729440860171702516",
        "title": "Nooni Korean Apple Lip Oil + Lip Stain | Glossy Lip Stain, Tinting & Long Lasting, Moisturizing Lip Care (17 options) Hydrate Lipgloss Lipstick Makeup Glossy Hydrating Moisturizer Plump Transfer-proof",
        "url": "https://www.tiktok.com/shop/pdp/1729440860171702516",
        "price": {
          "formatted": "$15.00",
          "amount": 15,
          "currency": "USD",
          "original_amount": null
        },
        "sold_count": 333865,
        "rating": 4.3,
        "shop": "NOONI",
        "free_shipping": false
      },
      {
        "id": "1732454483812323460",
        "title": "Romantic Beauty Roller Ball Lip Oil, Hydrating Non-Sticky Lip Gloss, Nourishing Formula with Glass-Like Shine",
        "url": "https://www.tiktok.com/shop/pdp/1732454483812323460",
        "price": {
          "formatted": "$7.99",
          "amount": 7.99,
          "currency": "USD",
          "original_amount": 12.99
        },
        "sold_count": 2,
        "rating": null,
        "shop": "Blakes Ritual",
        "free_shipping": false
      }
    ]
  }
}

Cost

2 credits a page.
Nothing for failures.

Every page of results costs 2 credits. The recorded search returned 45 products on page 1 and 22 on page 2. Slide to see what a search costs.

4credits, 2 per page
250searches like this a month on the free plan
2,500on Starter, $29 a month

Estimated at about 34 products a page, the average of the two recorded pages. Failed calls are free.

Two more things

A whole shop,
errors and rate limits.

Every product in one shop

To list a store’s catalogue instead of a search, call tiktokshop/shop-products with the store URL. Sort by top or new_releases; it pages by cursor the same way, 2 credits a page.

shop.py
SHOP_URL = "https://www.monocrawl.com/v1/tiktokshop/shop-products"
STORE = "https://www.tiktok.com/shop/store/goli-nutrition/7495794203056835079"

params = {"url": STORE, "sort_by": "top", "region": "US"}
body = requests.get(SHOP_URL, params=params, headers=HEADERS, timeout=60).json()
for product in body["data"]["items"]:
    print(product["price"]["formatted"], product["title"])

Errors and rate limits

A failed call returns success: false with an error type and message, and costs nothing. On HTTP 429, wait and try again.

Rate limits by plan
products.py
import time

def get_page(params, attempts=5):
    for attempt in range(attempts):
        response = requests.get(API_URL, params=params, headers=HEADERS, timeout=60)
        if response.status_code != 429:
            return response.json()
        time.sleep(2 ** attempt)
    raise RuntimeError("Still rate limited; try again later")

Other platforms

Same loop.
Swap the endpoint.

The same key searches products on other stores. Each endpoint’s reference lists its fields and paging.

Questions

Scraping TikTok Shop,
answered.

Do I need a TikTok account or a seller account?

No. You call Monocrawl with your API key and get the products back as JSON: titles, prices, units sold, ratings and shops.

How many products does one call return?

One page. The recorded search returned 45 products on page 1 and 22 new ones on page 2. Keep passing the cursor back until none comes back.

What does it cost?

2 credits for each page that comes back. The free plan’s 1,000 credits a month cover 500 pages, and failed calls are free.

Can I get every product from one shop?

Yes. Call tiktokshop/shop-products with the store’s URL. It lists the store’s products with prices, sales counts and ratings, paged by cursor.

Can I get a product’s reviews and details?

Yes. tiktokshop/product returns one product’s page and tiktokshop/product-reviews its reviews, 2 credits each.

Does TikTok Shop have an official API?

TikTok Shop’s own APIs are for sellers and their approved apps working with their own shops. Our TikTok Shop API comparison sets out the official routes and the main providers side by side.

Start free

Every product in a TikTok Shop search.
2 credits a page.

1,000 free credits every month. No card required.

Get a free API key