TwoSec

Available on RapidAPI

TikTok Shop API

Search products in the US TikTok Shop storefront, get product details, list a shop's products, look up search suggestions and read product reviews. Responses are JSON, prices are in USD, and the product and seller IDs in each response work as inputs for follow-up requests.

Quick start

Subscribe to the API on RapidAPI to get a key. Send every request to https://tiktok-shop-api5.p.rapidapi.com with both headers below. This example searches for adjustable dumbbell and asks for two products.

curl

curl --request GET \
  --url 'https://tiktok-shop-api5.p.rapidapi.com/v1/search?q=adjustable%20dumbbell&count=2' \
  --header 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
  --header 'X-RapidAPI-Host: tiktok-shop-api5.p.rapidapi.com'

Python

import requests

BASE = "https://tiktok-shop-api5.p.rapidapi.com"
HEADERS = {
    "X-RapidAPI-Key": "YOUR_RAPIDAPI_KEY",
    "X-RapidAPI-Host": "tiktok-shop-api5.p.rapidapi.com",
}

response = requests.get(
    f"{BASE}/v1/search",
    headers=HEADERS,
    params={"q": "adjustable dumbbell", "count": 2},
)
response.raise_for_status()
print(response.json()["products"])

The Python examples further down reuse BASE, HEADERS and requests from this snippet.

Endpoints

MethodPathReturns
GET/v1/searchProduct cards for a keyword
GET/v1/products/{id}Product detail
GET/v1/shops/{id}/productsProduct cards for a shop
GET/v1/suggestSearch suggestions
GET/v1/products/{id}/reviewsReviews and rating summary

GET/v1/search

Search by keyword. Each product card has the product ID, title, URL, image, price, rating, sold count and seller.

ParameterRequiredDefaultDescription
qYes—Search query
offsetNo0Number of results to skip
countNo20Results per page; maximum 50
regionNoUSStorefront region

Example response, shortened to one product card

{
  "products": [
    {
      "id": "1732630664915882459",
      "title": "5-in-1 Adjustable Dumbbell Set 20/40/60 lbs – Multi-Functional Home Gym Equipment for Muscle Building, Squats & Strength Training",
      "url": "https://shop.tiktok.com/us/pdp/5-in-1-adjustable-dumbbell-set-20-40-60-lbs-for-home-gym/1732630664915882459",
      "image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/70876a34b3384f51a3e59327a2e9438b~tplv-fhlh96nyum-crop-webp:2200:2200.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=a6e80448&idc=useast8&from=2378011839",
      "price": {
        "currency": "USD",
        "symbol": "$",
        "value": "38.38",
        "formatted": "38.38",
        "original": "53.29",
        "discount": "28%"
      },
      "rating": {
        "score": 4.8,
        "count": "9"
      },
      "sold": {
        "count": "246"
      },
      "seller": {
        "id": "7496210586501679579",
        "name": "Floft",
        "logo": "https://p16-oec-general-useast8.ttcdn-us.com/tos-useast8-i-rt0ujvrtvp-tx2/d7a9099929d745599c8ef27e40287bba~tplv-fhlh96nyum-resize-png:300:300.png?dr=12184&t=555f072d&ps=933b5bde&shp=905da467&shcp=d9d491bf&idc=useast8&from=2422056039"
      }
    }
  ],
  "has_more": true,
  "next_offset": 2
}

price.original and price.discount appear only when the product is on sale. When has_more is true, pass next_offset as the next request's offset.

Product detail

GET/v1/products/{id}

Get one product by ID. Returns id, title, description, sold, url, images and seller_id.

ParameterRequiredDescription
idYesProduct ID from search or a shop catalog

Example response with description and later images omitted

{
  "id": "1731016350288417305",
  "title": "PU Leather Compact Armless Height-Adjustable Rolling Swivel Office Chair - Sturdy Modern Vertical Grain, Airflow Seat, U-Shape Lumbar, Easy Setup, Space-Saving for Home Use, Designed for Small Spaces",
  "sold": "2354",
  "url": "https://shop.tiktok.com/us/pdp/1731016350288417305",
  "images": [
    "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/bd578b0b2199460d83dd1dbc2314349e~tplv-fhlh96nyum-crop-webp:1600:1600.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
    "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/a4870f20bfad4106a18781fc0e1f9d93~tplv-fhlh96nyum-crop-webp:1600:1600.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839"
  ],
  "seller_id": "7495957834594814489"
}

description is a JSON-encoded string of rich-text blocks; parse it if you need the full description. title and images cover most product displays. An unknown product ID returns 404.

Shop catalog

GET/v1/shops/{id}/products

List a seller's products. Catalog products use the same card fields as search.

ParameterRequiredDefaultDescription
idYes—Seller ID from a product card's seller.id or product detail's seller_id
cursorNo—next_cursor from the previous page; omit on the first page
offsetNo0Number of results to skip
countNo20Results per page; maximum 50

Example response, shortened to one product card

{
  "products": [
    {
      "id": "1732242819673461273",
      "title": "Sweetcrispy 3-Wheel Foldable Compact All-Seasons Pet Stroller Carrier for Small-Med Dogs - Durable Frame, Smooth Ride, Stability, Breathable Mesh Window, Large Storage Basket (Room for Groceries), Cup Holder, Push Handle, Rear Brakes (Blue) for Outings",
      "url": "https://shop.tiktok.com/us/pdp/sweetcrispy-3-wheel-pet-stroller-with-mesh-window-foldable/1732242819673461273",
      "image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/27d0b8a232c54651b30aa8e240a1b4ef~tplv-fhlh96nyum-crop-webp:2000:2000.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=a6e80448&idc=useast5&from=2378011839",
      "price": {
        "currency": "USD",
        "symbol": "$",
        "value": "70.17",
        "formatted": "70.17",
        "original": "142.97",
        "discount": "51%"
      },
      "rating": {
        "score": 4.6,
        "count": "633"
      },
      "sold": {
        "count": "4855"
      },
      "seller": {
        "id": "7495957834594814489",
        "name": "Sweetcrispy Shop",
        "logo": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/2e1aec6dbb7b44bf95884dd5cf42908a~tplv-fhlh96nyum-resize-png:300:300.png?dr=12184&t=555f072d&ps=933b5bde&shp=905da467&shcp=d9d491bf&idc=useast5&from=2422056039"
      }
    }
  ],
  "has_more": true,
  "next_offset": 20,
  "next_cursor": "40_WzE4MTEsODk5OTAwMDAsMTczNTgxMTQxNTg1OCwiMTczMDQwNTU5MjM1OTM0MjYxNyJd"
}

For the next page, pass the response's next_cursor as cursor. Use the value from your own response; the one above belongs to the example page.

Search suggestions

GET/v1/suggest

Return search terms for a partial query.

ParameterRequiredDefaultDescription
qNo—Partial search query
countNo10Number of suggestions

Example response for q=office&count=5

{
  "suggestions": [
    "office accessories",
    "office chair",
    "office outfits women",
    "office decor at work",
    "office desk chair"
  ]
}

Product reviews

GET/v1/products/{id}/reviews

Get review pages and a rating summary for a product.

ParameterRequiredDefaultDescription
idYes—Product ID
pageNo1Page number, starting at 1
page_sizeNo20Reviews per page; maximum 50
sortNo2Sort value

Example response, shortened to one review with the avatar URL omitted

{
  "has_more": true,
  "total": "409",
  "summary": {
    "count": "409",
    "score": 4.6,
    "breakdown": {
      "1": 22,
      "2": 6,
      "3": 12,
      "4": 33,
      "5": 336
    }
  },
  "reviews": [
    {
      "id": "7685937594455688974",
      "rating": 5,
      "text": "This little chair is not only cute,  I chose the blue color,  but also very comfortable.",
      "author": "c**7",
      "time": "2026-09-16T01:23:26Z",
      "sku": "Blue",
      "country": "US",
      "verified": true,
      "incentivized": false
    }
  ]
}

rating is an integer from 1 to 5. author is masked, time is ISO-8601 UTC, and avatar and images may be absent. A product with no reviews returns total: "0", an empty summary.breakdown and reviews: null.

Pagination

Search: start with offset=0 and keep requesting with offset=next_offset while has_more is true.

Shop catalog: omit cursor on the first page, then pass each response's next_cursor:

url = f"{BASE}/v1/shops/7495957834594814489/products"
first = requests.get(url, headers=HEADERS, params={"count": 20})
first.raise_for_status()
page = first.json()
if page["has_more"] and page.get("next_cursor"):
    second = requests.get(
        url,
        headers=HEADERS,
        params={"count": 20, "cursor": page["next_cursor"]},
    )
    second.raise_for_status()
    print(second.json()["products"])

Reviews: increment page while has_more is true. total can be a few higher than the number of rows returned, so use has_more to decide when to stop.

def all_reviews(product_id):
    reviews = []
    page = 1
    while True:
        response = requests.get(
            f"{BASE}/v1/products/{product_id}/reviews",
            headers=HEADERS,
            params={"page": page, "page_size": 50},
        )
        response.raise_for_status()
        data = response.json()
        reviews.extend(data.get("reviews") or [])
        if not data["has_more"]:
            return reviews
        page += 1

Errors

StatusMeaningWhat to do
400Missing or invalid parameterCheck the request parameters
404Unknown product IDCheck the ID
429Plan rate limit exceededCheck your plan's limits
502Upstream temporarily unavailableRetry with backoff

Region and currency

The API covers the US storefront and prices are in USD. Rating counts and sold counts are strings as TikTok formats them, such as "1200" or "1.2K"; rating.score is a number.

Plans and support

Plans, monthly quotas and rate limits are listed on the RapidAPI listing. For questions or bug reports, use Contact provider on the listing.