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

# TikTok Shop Search API

`GET /v1/tiktok-shop/shop-search`

## Request

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

TikTok Shop keyword search — priced products with sold, rating/reviews, typed discount, seller id.

Search TikTok Shop by keyword and get products as clean JSON: id, url, title, price + originalPrice + discountPercent + savingsAmount, currency (only when an amount exists), sold when the PDP exposes a per-product figure, rating + reviews (always keyed; null when the PDP has no score yet), image, and seller{id,name,url}. Native search is a single search-results window of product pages, each hydrated — TikTok's own Shop search is gated, so this is not TikTok's full catalog and there is no cursor. limit equals windowMax: default 10, max 10. Asking for more than 10 is a 422. The envelope names the yield: requested, totalReturned, serpHits, windowMax=10, hydrateFailures (SERP ids that did not become a priced row), hasMore (serp-pdp: true only when you sliced below the 10-cap — raise limit, do not pass a cursor; extended: also true on a full page, since a full fallback page is not proof the catalog is exhausted), windowKind (serp-pdp, or extended when the native window missed and the fallback path served), and truncatedReason=serp-window when the window is exhausted. timings{serpMs,hydrateMs,totalMs} show where the seconds went. top-level region is an echo of the region query param you sent (default US) — market selection, not a creator country and not AI-inferred. price is the SERP promo-min (priceBasis=serp-promo-min) — a different promo tier than Product Details' pdp-promo-min on the same product. sold is a list-row field here and on Shop Products; Product Details omits it. Flat 2 credits per call. Pass cache=true for the 24h shared cache.

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

## Query parameters

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

## Response `200`

Success. The data object for this endpoint.

- object
  - `success` unknown, required
  - `data` object, required
    - `query` string: The search query you sent.
    - `region` string: Echo of the region query parameter you sent (default US) — the market used for this search. Not a creator country, not AI-inferred, and there is no regionSource on this endpoint.
    - `totalReturned` integer: Number of items returned in this response.
    - `products` object[]
      - `platform` string: Platform identifier for this response (matches the endpoint's platform).
      - `id` string: Id of this products item.
      - `url` string: Canonical URL of the item.
      - `title` string: Title of this products item.
      - `price` number: SERP promo-min (priceBasis=serp-promo-min) at fetch time. Not the same number as Product Details' pdp-promo-min — details is always a bit higher and the ratio drifts. TikTok may also move promos between calls.
      - `originalPrice` number: Pre-discount price on the SERP promo-min tier; null when there is no promo. Same basis as price — not Product Details' pdp-promo-min.
      - `currency` string: ISO currency of price / originalPrice. Omitted when both amounts are unknown — a row with no price does not assert USD.
      - `discount` string: Discount amount, percentage, or display string when the platform exposes one.
      - `sold` integer: List-row field. Per-product units sold (sold_info.sold_count, or product_model.sold_count when it is not the shop total). Omitted when the only number on the page is shop sold. Product Details never returns sold — compare units here or on Shop Products.
      - `image` string: Primary product image URL (TikTok Shop search has no separate thumbnail field).
      - `seller` object: Seller shop card: id, name, and store url — not a content author.
        - `id` string: Id of this products item.
        - `name` string
        - `url` string: Canonical URL of the item.
      - `rating` number: Product star score from the PDP when TikTok exposes one; null when the product has no reviews yet.
      - `reviews` integer: Product review count from the PDP when exposed; null when unknown/zero with no score.
      - `savings` string, nullable: Savings.

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