---
title: "TikTok Shop Products API"
method: GET
path: "/v1/tiktok-shop/shop-products"
tags: ["TikTok Shop"]
---

# TikTok Shop Products API

`GET /v1/tiktok-shop/shop-products`

## Request

- Base URL: `https://api.captapi.com`
- URL: `https://api.captapi.com/v1/tiktok-shop/shop-products`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-API-Key`

Store catalog with shopInfo (sold/followers/rating) + products priced with sold, rating, typed discount.

Pass a TikTok Shop store URL and get that shop's public catalog as clean JSON — products and the store card from the same SSR call. Top-level shopInfo: sold + formatSold (e.g. 5.6M), reviews, followers, rating, productCount, videoCount, isOfficial + identityLabel (OFFICIAL SHOP), region, logo, storeScores[]. Each products[] row: id/url/slug, title, numeric price + originalPrice + discountPercent + savingsAmount (same typed promo fields as Shop Search / Product Details — not "21%" / "Saving $4.02" strings), currency, sold, rating, reviews, image, seller{id,name,url}. Optional region (default US). Billing: 2 credits when served natively (limit ≤ 30 and the store page loads). With limit above 30, or when the native page misses, the fallback path serves it (source: extended, may take longer) and bills per result: 2.8 credits per product returned, rounded up, minimum 2 — up to 560 at limit=200. In the last 30 days those calls cost 17–28 credits, and 14 of 21 calls took that path. No cursor/sort_by yet. Non-US coverage depends on TikTok exposing that shop in the selected region — empty results outside the US are often a platform limit, not a Captapi bug.

Docs: https://captapi.com/apis/tiktok-shop-products

## Query parameters

- `url` string, required
- `region` string
- `limit` integer
- `cache` boolean

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `url` string: Canonical URL of the item.
    - `region` string: Echo of the region query parameter you sent (default US) — the market used for this catalog fetch. Not a creator country, not AI-inferred, and there is no regionSource here.
    - `shopInfo` object
      - `id` string: Id of this shop info item.
      - `name` string: Name of this shop info item.
      - `url` string: Canonical URL of the item.
      - `logo` string: Logo image URL.
      - `sold` integer: Units sold (product row) or lifetime shop sold (inside shopInfo).
      - `formatSold` string: Compact shop sold string from TikTok (e.g. "5.6M").
      - `reviews` integer: Review count (product or shop).
      - `followers` integer: Follower count.
      - `rating` number: Star rating (product or shop).
      - `productCount` integer: Product count. Example: 55.
      - `videoCount` integer: Population video count when the source is authoritative (e.g. TikTok challenge/detail statsV2 on popular-hashtags, or a channel's uploaded-video total). Never a sample tally — sample sizes use sampleVideoCount / sampleSize.
      - `identityLabel` string: Identity label. Example: "OFFICIAL SHOP".
      - `isOfficial` boolean: true when identityLabel indicates an official shop (e.g. "OFFICIAL SHOP").
      - `region` string: Echo of the region query parameter you sent (default US) — the market used for this catalog fetch. Not a creator country, not AI-inferred, and there is no regionSource here.
      - `storeScores` object[]: TikTok store sub-scores [{score, scorePercentage, type}].
        - `score` number
        - `scorePercentage` string
        - `type` integer
    - `totalReturned` integer: Number of items returned in this response.
    - `products` object[]
      - `platform` string: Always "tiktok_shop" on this endpoint (not youtube/instagram).
      - `id` string: Id of this products item.
      - `url` string: Canonical URL of the item.
      - `title` string: Title of this products item.
      - `price` number: Catalog tile sale price from store SSR (product_price_info). Not labelled with priceBasis — this is not the SERP or PDP promo tier.
      - `originalPrice` integer: List/original price before discount (numeric when unmasked).
      - `currency` string: Currency code.
      - `discountPercent` integer: Integer percent off vs originalPrice when both prices exist (e.g. 21). Derived — not a "21%" display string. Omitted when either price is unknown.
      - `savingsAmount` number: Numeric amount saved (originalPrice − price) when both prices exist (e.g. 4.02). Omitted when either price is unknown.
      - `slug` string: SEO slug from seo_url.slug (also embedded in the product URL).
      - `rating` number: Star rating (product or shop).
      - `reviews` integer: Review count (product or shop).
      - `sold` integer: Units sold (product row) or lifetime shop sold (inside shopInfo).
      - `image` string: Image URL.
      - `seller` object: Object with id, name, url.
        - `id` string: Id of this shop info item.
        - `name` string: Name of this shop info item.
        - `url` string: Canonical URL of the item.

## Other responses

- `400`: Bad request: wrong platform URL, unknown endpoint, or an invalid parameter value. Not billed.
- `401`: Missing, invalid or revoked API key. Not billed.
- `402`: Not enough credits for this request. Not billed.
- `404`: The resource does not exist or is not public. Not billed.
- `422`: A required parameter is missing or has the wrong type. Not billed.
- `429`: Rate limit reached. Wait for Retry-After seconds. Not billed.
- `502`: The platform could not be reached or returned nothing usable. Retryable, not billed. 503 and 504 use the same envelope.

---

[API](https://skmtc.dev/captapi/apis/captapi-api.md) · [All operations](https://skmtc.dev/captapi/apis/captapi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/captapi/apis/captapi-api/revisions/c9b9ac5ff1bd?raw)
