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
| Method | Path | Returns |
|---|---|---|
| GET | /v1/search | Product cards for a keyword |
| GET | /v1/products/{id} | Product detail |
| GET | /v1/shops/{id}/products | Product cards for a shop |
| GET | /v1/suggest | Search suggestions |
| GET | /v1/products/{id}/reviews | Reviews and rating summary |
Search products
GET/v1/search
Search by keyword. Each product card has the product ID, title, URL, image, price, rating, sold count and seller.
| Parameter | Required | Default | Description |
|---|---|---|---|
q | Yes | — | Search query |
offset | No | 0 | Number of results to skip |
count | No | 20 | Results per page; maximum 50 |
region | No | US | Storefront 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.
| Parameter | Required | Description |
|---|---|---|
id | Yes | Product 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.
| Parameter | Required | Default | Description |
|---|---|---|---|
id | Yes | — | Seller ID from a product card's seller.id or product detail's seller_id |
cursor | No | — | next_cursor from the previous page; omit on the first page |
offset | No | 0 | Number of results to skip |
count | No | 20 | Results 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.
| Parameter | Required | Default | Description |
|---|---|---|---|
q | No | — | Partial search query |
count | No | 10 | Number 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.
| Parameter | Required | Default | Description |
|---|---|---|---|
id | Yes | — | Product ID |
page | No | 1 | Page number, starting at 1 |
page_size | No | 20 | Reviews per page; maximum 50 |
sort | No | 2 | Sort 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
| Status | Meaning | What to do |
|---|---|---|
400 | Missing or invalid parameter | Check the request parameters |
404 | Unknown product ID | Check the ID |
429 | Plan rate limit exceeded | Check your plan's limits |
502 | Upstream temporarily unavailable | Retry 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.