TikTok Product Reviews API
The reviews a TikTok Shop product page shows, with star rating, reviewer, photos and the purchased variant. That is the page's first screen, not every review. region picks the market, default US. Calls cost 1 credit each. A cache hit is free, and a failed or empty response is never charged.
Try it
Prefilled with the request that produced the example below. No key yet? Get a free key.
Request
GET
/v1/tiktok/shop/product/reviews| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | yes | Product id, or a tiktok.com/shop/pdp/… URL |
| count | number | no | Items per page (default 20, max 50) |
| cursor | string | no | pagination.cursor from a previous response |
| region | string | no | Two-letter market code (US, GB, ID…). TikTok feeds and catalogues are per-market. |
Also accepts cache_max_age (a hit costs 0 credits) and include_raw (returns the untouched upstream payload under raw).
curl
curl "$API/v1/tiktok/shop/product/reviews?url=https%3A%2F%2Fshop.tiktok.com%2Fus%2Fpdp%2Fxtep-2000km-series-mens-pro-running-shoes-breathable-stable%2F1732423766407353143&cache_max_age=7d" \
-H "x-api-key: $KEY"JavaScript
const query = new URLSearchParams({
url: 'https://shop.tiktok.com/us/pdp/xtep-2000km-series-mens-pro-running-shoes-breathable-stable/1732423766407353143',
cache_max_age: '7d',
});
const response = await fetch(`${API}/v1/tiktok/shop/product/reviews?${query}`, {
headers: { 'x-api-key': KEY },
});
const body = await response.json();
if (!body.success) throw new Error(body.error.code);
// 1 credit, 0 on a cache hit
console.log(body.data, body.meta.creditsCharged);Python
import os, httpx
r = httpx.get(
f"{os.environ['API']}/v1/tiktok/shop/product/reviews",
params={
"url": "https://shop.tiktok.com/us/pdp/xtep-2000km-series-mens-pro-running-shoes-breathable-stable/1732423766407353143",
"cache_max_age": "7d",
},
headers={"x-api-key": os.environ["KEY"]},
timeout=30,
)
body = r.json()
if not body["success"]:
raise RuntimeError(body["error"]["code"])
print(body["data"], body["meta"]["creditsCharged"])Example response
Captured on , with raw removed and lists cut to two items. A live call returns current data.
response
{
"success": true,
"data": {
"items": [
{
"platform": "tiktok",
"id": "7690365834409854733",
"productId": "1732423766407353143",
"text": "Nothing wrong with the shoes just the box came all broken but that’s fine with me",
"rating": 4,
"authorName": "Example User 1",
"authorAvatarUrl": "https://example.com/media/1.jpg",
"imageUrls": [
"https://example.com/media/1.jpg"
],
"variant": "5.0 Pro Fluorescent Lemon Yellow/Black, 10.5",
"publishedAt": "2026-09-27T23:47:10.810Z"
},
{
"platform": "tiktok",
"id": "7660163125603911438",
"productId": "1732423766407353143",
"text": "The one start review is not about the shoes the shoes is comfortable, light etc... I own a pair of the gray one . I orderded a size 10 of the black ones they sent me the wrong size and it was supposed to b the shoes that i bring to basic military training yall fked me over bad",
"rating": 1,
"authorName": "Example User 2",
"authorAvatarUrl": "https://example.com/media/2.jpg",
"imageUrls": [
"https://example.com/media/2.jpg"
],
"variant": "Black, 10",
"publishedAt": "2026-07-08T14:25:18.630Z"
}
]
},
"pagination": {
"cursor": null,
"hasMore": false,
"count": 5
},
"meta": {
"platform": "tiktok",
"endpoint": "tiktok.productReviews",
"creditsCharged": 1,
"cached": false,
"cacheAgeSeconds": null,
"durationMs": 4477,
"requestId": "req_4qd9idp44m7l8xo8gs2m"
}
}Returns
Returns a list of object in data.items.
Fields
| Field | Type | Present | Description |
|---|---|---|---|
| platform | "tiktok" | always | |
| id | string | always | |
| productId | string | null | always | |
| text | string | always | |
| rating | number | null | always | |
| authorName | string | null | always | |
| authorAvatarUrl | string | null | always | |
| imageUrls | string[] | always | |
| variant | string | null | always | The variant the reviewer actually bought, when TikTok attaches it. |
| publishedAt | string | null | always |
Cost and behaviour
| Credits | 1 per live request, 0 on a cache hit |
| Cacheable | yes: cache_max_age accepts a cached copy |
| Batchable | yes: usable as a target in POST /v1/jobs/batch |
| Subscribable | yes: as often as every 3600 seconds, firing a webhook only on a change |
Other TikTok endpoints
- /v1/tiktok/ad-library/ad One TikTok ad
- /v1/tiktok/ad-library/search Search the TikTok Ads Library
- /v1/tiktok/collection/videos Collection videos
- /v1/tiktok/comment-replies Replies to a comment
- /v1/tiktok/comments Comments on a video
- /v1/tiktok/creators/popular Popular creators
- /v1/tiktok/followers Accounts following a creator
- /v1/tiktok/following Accounts a creator follows