TikTok Shop
GET /v1/tiktok-shop/shop-search

TikTok Shop Search API

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

2 credits per request
TL;DR
TikTok Shop keyword search — priced products with sold, rating/reviews, typed discount, seller id. The TikTok Shop Search API (TikTok Shop) is a single authenticated GET request to /v1/tiktok-shop/shop-search that responds with clean JSON and costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.

What is the TikTok Shop Search API?

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 SERP window (Google/DDG site:tiktok.com/shop/pdp → PDP hydrate) — Shop search HTML is WAF-gated, so this is not TikTok's full catalog and there is no cursor. limit equals windowMax: default 10, max 10 (Google's first-page organic PDP links). 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 (true only when you sliced below the 10-cap — raise limit, do not pass a cursor), windowKind (serp-pdp, or extended when the native SERP missed and the scraper tier served — matching the source vocabulary, no vendor names), 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.

What you get

  • rating + reviews always keyed on every hit
  • originalPrice + discountPercent + savingsAmount (typed; no display strings)
  • Honest envelope: requested / serpHits / windowMax=10 / hydrateFailures / hasMore
  • seller{id,name,url}
  • region = request param echo (not AI / no regionSource)
  • Flat 2 credits

Try it

Open in Playground

Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).

Parameters

Sign in to run live
curl "https://api.captapi.com/v1/tiktok-shop/shop-search?q=phone%20case" \
  -H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."

Edit the parameters and the code updates instantly. Switch languages and hit copy.

Example response

{
  "success": true,
  "data": {
    "query": "phone case",
    "region": "US",
    "totalReturned": 2,
    "products": [
      {
        "platform": "tiktok_shop",
        "id": "1732313842426745420",
        "url": "https://shop.tiktok.com/us/pdp/plum-polka-dot-cute-phone-case-for-iphone-x-17-tough-stylish/1732313842426745420?source=product_detail&enter_method=url_semantic_301",
        "title": "Plum Polka Dot Cute Phone Case for iPhone - Durable & Stylish",
        "price": 12.68,
        "originalPrice": 21.2,
        "currency": "USD",
        "discount": "40%",
        "sold": 532,
        "image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/db875350dd404f64bb4b6bc79ae26a09~tplv-fhlh96nyum-crop-webp:1290:1290.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=607f11de&idc=useast5&from=2378011839",
        "seller": {
          "id": "7495626050433419852",
          "name": "Anthony Z Sierra Store",
          "url": "https://www.tiktok.com/shop/store/Anthony%20Z%20Sierra%20Store/7495626050433419852"
        },
        "rating": 4.8,
        "reviews": 2493,
        "savings": null
      },
      {
        "platform": "tiktok_shop",
        "id": "1731098552908944370",
        "url": "https://shop.tiktok.com/us/pdp/trendy-pink-ed-hardy-tough-phone-cases-impact-resistant-wireless-charging-shock-absorption/1731098552908944370?source=product_detail&enter_method=url_semantic_301",
        "title": "Trendy Pink Ed Hardy Inspired Tough Phone Cases, Phone Durable, Gift, Accessories Top Trendy Phone Cases Phone Cover Hard Case Tough 2-piece Phone Case",
        "price": 22.54,
        "originalPrice": 24.09,
        "currency": "USD",
        "discount": "6%",
        "sold": 512,
        "image": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/cc79ccfd6a324d548de31cb761b6c3c4~tplv-fhlh96nyum-crop-webp:794:794.webp?dr=12190&t=555f072d&ps=933b5bde&shp=8dbd94bf&shcp=e1be8f53&idc=useast5&from=2378011839",
        "seller": {
          "id": "7496126292994264050",
          "name": "Timeless Teapot Creations",
          "url": "https://www.tiktok.com/shop/store/timeless-teapot-creations/7496126292994264050"
        },
        "rating": 4.6,
        "reviews": 48,
        "savings": "Saving $1.55"
      }
    ]
  }
}

Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.

Response structure

A successful call returns success and a data object with the following fields:

Top-level fields

  • queryThe search query you sent.
  • regionEcho 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.
  • totalReturnedNumber of items returned in this response.

Products

Each item in products contains:

  • platformPlatform identifier for this response (matches the endpoint's platform).
  • idId of this products item.
  • urlCanonical URL of the item.
  • titleTitle of this products item.
  • priceSERP 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.
  • originalPricePre-discount price on the SERP promo-min tier; null when there is no promo. Same basis as price — not Product Details' pdp-promo-min.
  • currencyISO currency of price / originalPrice. Omitted when both amounts are unknown — a row with no price does not assert USD.
  • discountDiscount amount, percentage, or display string when the platform exposes one.
  • soldList-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.
  • imagePrimary product image URL (TikTok Shop search has no separate thumbnail field).
  • sellerSeller shop card: id, name, and store url — not a content author.
  • ratingProduct star score from the PDP when TikTok exposes one; null when the product has no reviews yet.
  • reviewsProduct review count from the PDP when exposed; null when unknown/zero with no score.
  • savingsSavings.

Parameters

NameTypeRequiredDescription
qstringYesProduct search query (min 2 characters), e.g. phone case.
regionstringNoTwo-letter market region for the search (default US). Echoed on the response as data.region — not a creator home country. Native search is a SERP window (not TikTok's full catalog); compare requested to serpHits / windowMax.
limitintegerNoMax items to return (default 10, max 10). Flat 2 credits per call.
cachebooleanNoSet true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.

Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 2 credits. Pass cache=true for a free 24h cache hit; default is always fresh.

Using an AI agent? This endpoint is the MCP tool tiktok_shop_search via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/tiktok-shop/shop-search and parse the JSON response.

Use cases

Product Discovery

Find TikTok Shop listings by keyword with price, sold, and rating in one call.

Promo & Price Screening

Filter hits by originalPrice/discountPercent/savingsAmount before opening a PDP.

Quality Ranking

Sort or threshold on rating/reviews without a second Product Details hop.

Seller Follow-up

Take seller.id / seller.url into Shop Products for the full store catalog.

Frequently asked questions

What does the TikTok Shop Search API do?+

The TikTok Shop Search API lets you search and return matching results from a public TikTok Shop query using one GET request to /v1/tiktok-shop/shop-search. It returns clean JSON — no OAuth or infrastructure setup required.

How many credits does the TikTok Shop Search API cost?+

Each successful call costs 2 credits. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Failed or empty results are never charged.

Do I need a TikTok Shop API key or OAuth?+

No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.

Is the TikTok Shop Search API suitable for production use?+

Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.

More TikTok Shop APIs

Ready to use the TikTok Shop Search API?

Sign up, grab your key, and make your first call in 60 seconds.

TikTok Shop Search API | Captapi — Captapi