---
title: "TikTok Shop Product Details API"
method: GET
path: "/v1/tiktok-shop/product-details"
tags: ["TikTok Shop"]
---

# TikTok Shop Product Details API

`GET /v1/tiktok-shop/product-details`

## Request

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

PDP — price (sku_min when guest min is *), sold vs stock, seller id/url, images[].

Pass a TikTok Shop product URL and get the PDP as clean JSON. Price is the field this endpoint exists for: promotion_product_price.min_price.sale_price_decimal first, then per-SKU sale prices when the guest min is masked as *, then product_price_info, then a slower fallback path (native title without a price is not a finished call). priceStatus is extracted | region_restricted | not_extracted — region_restricted means TikTok shipped * / a region-locked shell (try another region); not_extracted means no path returned a number (retrying will not help). currency only when an amount exists. originalPrice + discountPercent + savingsAmount when a seller deduction exists. sold is per-product sold_info.sold_count (or the fallback path's product-level 'stock' when skus[] is empty — that number is units sold, the opposite of inventory). stock is the sum of SKU available_quantity and is omitted when TikTok does not expose variant qty. seller includes id, name, store url, rating, productCount, and logo — id/url come from seller_model and store URLs in the PDP HTML, not only product_model.seller_id. images[] are Shop CDN URLs; t=555f072d is a build token identical across the gallery, not an expiry — mediaUrlsExpireAt is present and null. Accepts www /pdp/{id} and shop.tiktok.com/view/product/{id}?region=BR — the id is the path segment; region / oec_region on the TikTok URL wins over the API default US. An unresolved product is HTTP 404 at 0 credits (never a 200 empty shell with priceStatus=not_extracted). Flat 2 credits when the product exists. relatedVideos[] and seller.tiktokUrl are not in US PDP SSR today.

Docs: https://captapi.com/apis/tiktok-shop-product-details

## Query parameters

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

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `platform` string: Always tiktok_shop for this endpoint.
    - `id` string: Stable platform ID for the item.
    - `url` string: Canonical URL of the item.
    - `title` string: Title of the item.
    - `description` string: Description text.
    - `price` number: PDP promo-min (priceBasis=pdp-promo-min). Source order: sale_price_decimal, then per-SKU sale prices when the guest min is *, then product_price_info, then a slower fallback path. Always a bit higher than Shop Search's serp-promo-min on the same product; the ratio drifts (~0.7–1.1%). Null with priceStatus=region_restricted means TikTok masked the amount (often a region/session shell) — retry with another region. Null with priceStatus=not_extracted means the product exists but no path returned an amount; retrying will not help. The 2-credit charge still applies because the product resolved. A URL that does not resolve is 404 at 0 credits — there is no priceStatus on that path.
    - `originalPrice` number: List / pre-discount price when TikTok exposes a seller deduction or origin price; null when the PDP has no promo. Same pdp-promo-min tier as price.
    - `currency` string: ISO currency of the priced amounts. Omitted when price is unknown.
    - `discount` string: Discount amount, percentage, or display string when the platform exposes one.
    - `savings` string: Savings. Example: "Saving $1.55".
    - `rating` number: Average rating.
    - `reviews` integer: Number of reviews.
    - `priceBasis` string: "pdp-promo-min" — the full-PDP promo tier. Distinct from Shop Search's serp-promo-min. Both are legitimate; they are not the same number.
    - `priceStatus` string: extracted when price is a number. region_restricted when TikTok shipped * / a region-locked guest shell (try region=US or the product's market). not_extracted when the product exists but no path returned an amount — retrying the same region will not help. Brazil (region=BR) listings are currently always not_extracted: TikTok serves BR product pages only to in-market sessions. Absent on 404 (the product did not resolve).
    - `sold` integer: Per-product units sold from sold_info.sold_count (never the shop header). The fallback path names this field stock — when skus[] is empty we remap that number here. High sold is demand, not inventory.
    - `stock` integer: Sum of available_quantity across skus[] (use skus[].stock for per-variant inventory). Omitted when TikTok does not expose SKU quantities — not null. A lone product-level 'stock' with empty skus[] is sold, not this field (TSP-2).
    - `mediaUrlsExpireAt` unknown
    - `image` string: Image URL.
    - `seller` object
      - `id` string: Id of this seller item.
      - `name` string: Name of this seller item.
      - `url` string: Canonical URL of the item.
      - `rating` number: Average rating.
      - `productCount` integer: Product count. Example: 85.
      - `logo` string: Logo image URL.
    - `skus` object[]
      - `id` string: Id of this skus item.
      - `stock` integer: Sum of available_quantity across skus[] (use skus[].stock for per-variant inventory). Omitted when TikTok does not expose SKU quantities — not null. A lone product-level 'stock' with empty skus[] is sold, not this field (TSP-2).
      - `price` number: PDP promo-min (priceBasis=pdp-promo-min). Source order: sale_price_decimal, then per-SKU sale prices when the guest min is *, then product_price_info, then a slower fallback path. Always a bit higher than Shop Search's serp-promo-min on the same product; the ratio drifts (~0.7–1.1%). Null with priceStatus=region_restricted means TikTok masked the amount (often a region/session shell) — retry with another region. Null with priceStatus=not_extracted means the product exists but no path returned an amount; retrying will not help. The 2-credit charge still applies because the product resolved. A URL that does not resolve is 404 at 0 credits — there is no priceStatus on that path.
      - `originalPrice` unknown
      - `status` string: Status value for this endpoint (see the field note on this page for enum meaning).
      - `warehouseId` string: Warehouse id. Example: "7495541999400830766".
      - `purchaseLimit` unknown
      - `saleProps` object[]: Array of objects with propName, propValue.
        - `propName` string
        - `propValue` string
    - `images` string[]: Product gallery image URLs from the PDP (not a single OG thumbnail). t=555f072d is a build/version token identical across the gallery — not a timestamp and not a per-URL signature. These Shop CDN links are durable; mediaUrlsExpireAt is present and null so the key matches popular-songs. Persist the URLs. TikTok video CDN is the surface that expires.
    - `saleProperties` object[]
      - `id` string: Id of this sale properties item.
      - `name` string: Name of this sale properties item.
      - `values` object[]: Array of objects with id, name.
        - `id` string: Stable platform ID for the item.
        - `name` string: Name of this seller item.
    - `categories` object[]
      - `id` string: Id of this categories item.
      - `name` string: Name of this categories item.
    - `region` string: Market used for the lookup. A region= / oec_region= query on the product URL wins over the API region parameter (default US). Not a creator country and not AI-inferred.
    - `source` unknown

## 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)
