Skip to content

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
ParameterTypeRequiredDescription
urlstringyesProduct id, or a tiktok.com/shop/pdp/… URL
countnumbernoItems per page (default 20, max 50)
cursorstringnopagination.cursor from a previous response
regionstringnoTwo-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
FieldTypePresentDescription
platform"tiktok"always
idstringalways
productIdstring | nullalways
textstringalways
ratingnumber | nullalways
authorNamestring | nullalways
authorAvatarUrlstring | nullalways
imageUrlsstring[]always
variantstring | nullalwaysThe variant the reviewer actually bought, when TikTok attaches it.
publishedAtstring | nullalways

Cost and behaviour

Credits1 per live request, 0 on a cache hit
Cacheableyes: cache_max_age accepts a cached copy
Batchableyes: usable as a target in POST /v1/jobs/batch
Subscribableyes: as often as every 3600 seconds, firing a webhook only on a change

Other TikTok endpoints