TikTok Shop API — filters & query parameters
For /api/v1/tiktok-shop/* with an API key (or the same path shapes under session /api/tiktok-shop/...). Route list: API reference.
How parameters are sent
| Mechanism | Details |
|---|---|
| Query string | Usual for GET |
| POST JSON | Merged with query on explore/count (avoids 414) |
| Form POST | Also merged |
Empty / "undefined" |
Stripped |
Explore endpoints
Normal explore proxies the upstream TikTok Shop v2 payload and WinningHunter injects:
credits_remaining— TikTok Shop daily search quota (not programmatic API credits). On Standard this isnullwithcredits_unlimited: true(never-1).credits_unlimited—truewhen the TikTok Shop daily search pool is unlimitedwinninghunter_product_url/tiktok_shop_product_urlon product rows (and product-bearing video rows) — both are WinningHunter app deep links today (same host pattern)winninghunter_shop_url/tiktok_shop_urlon shop rows (and shop-bearing rows) — same WH deep-link pattern- Country codes are normalized to uppercase (
us→US) on explore/count
meta often accompanies data. success / pagination appear only when the upstream response includes them (or on favorites explore paths). Do not assume creator/video-specific winninghunter_*_url keys — those are not injected today.
/api/v1/tiktok-shop/products/exploreList / search TikTok Shop products. Also accepts POST with the same params as JSON.
X-API-Key on every request.Query parameters
countrystringperiodstringe.g. 7d, 30d, 90d, or day count.
limitintegerpageintegersortstringorderstringnamestringKeyword.
min_revenuenumbermax_revenuenumberafterstringKeyset cursor for deep pagination.
curl -sS \
-H "X-API-Key: $WH_API_KEY" \
"{origin}/api/v1/tiktok-shop/products/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string&min_revenue=0&max_revenue=0&after=string"const res = await fetch(`${ORIGIN}/api/v1/tiktok-shop/products/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string&min_revenue=0&max_revenue=0&after=string`, {
method: 'GET',
headers: {
'X-API-Key': process.env.WH_API_KEY,
},
});
const data = await res.json();import os, requests
res = requests.get(
f"{ORIGIN}/api/v1/tiktok-shop/products/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string&min_revenue=0&max_revenue=0&after=string",
headers={"X-API-Key": os.environ["WH_API_KEY"]},
)
data = res.json(){
"data": [
{
"id": "1729448464509734958",
"product_title": "Toplux Magnesium Complex 8 Essential Magnesium Supplement",
"product_image": "https://media.winninghunter.com/tiktok-shop/products/1729448464509734958_0.webp",
"unit_price": "$14.97",
"revenue": "$2.57m",
"revenue_lifetime": 29785853.91,
"sold_count": "161803",
"sold_count_lifetime": 1989703,
"creator_num": 16,
"ctr": "4.1%",
"sales_growth_rate": "-8.5%",
"launch_date": "2026-02-26",
"winninghunter_product_url": "https://app.winninghunter.com/tiktok-shop/product/1729448464509734958?period=30",
"tiktok_shop_product_url": "https://app.winninghunter.com/tiktok-shop/product/1729448464509734958?period=30"
}
],
"meta": {
"total": 245019,
"page": 1,
"limit": 20,
"period": "30d",
"next_cursor": "eyJ2IjoyNTc0Mzk0LjkxLCJpZCI6IjY5OWZmZDg3NmEzOGVlMGQzZmVhZDZiYyJ9"
},
"credits_remaining": null,
"credits_unlimited": true
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "No API credits remaining. Buy an add-on pack or wait until next monthly reset.",
"credits": {
"used": 20000,
"limit": 20000,
"remaining": 0,
"addon_remaining": 0,
"total_remaining": 0
},
"purchase": {
"url": "https://…/checkout-api-credits?credits=…"
}
}Row objects include many more upstream fields (revenue_trend, category ids, commission, …). credits_remaining is the TikTok Shop daily search quota — null + credits_unlimited: true means unlimited (Standard). Basic plans see a non-negative integer and credits_unlimited: false. This is not GET /api/v1/credits. meta.next_cursor is the keyset cursor for after.
/api/v1/tiktok-shop/shops/exploreList / search TikTok shops. Also accepts POST JSON.
X-API-Key on every request.Query parameters
countrystringperiodstringlimitintegerpageintegersortstringorderstringnamestring
curl -sS \
-H "X-API-Key: $WH_API_KEY" \
"{origin}/api/v1/tiktok-shop/shops/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string"const res = await fetch(`${ORIGIN}/api/v1/tiktok-shop/shops/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string`, {
method: 'GET',
headers: {
'X-API-Key': process.env.WH_API_KEY,
},
});
const data = await res.json();import os, requests
res = requests.get(
f"{ORIGIN}/api/v1/tiktok-shop/shops/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string",
headers={"X-API-Key": os.environ["WH_API_KEY"]},
)
data = res.json(){
"data": [
{
"id": "7495514739648989419",
"shop_id": "7495514739648989419",
"shop_name": "medicube US Store",
"handle": "medicubeusstore",
"shop_image": "https://media.winninghunter.com/tiktok-shop/shops/7495514739648989419.png",
"seller_type": "BRAND",
"product_count": 128,
"video_count": 2298,
"creator_count": 1235,
"revenue_30_days": 19625456.71,
"sold_count_30_days": 703153,
"winninghunter_shop_url": "https://app.winninghunter.com/tiktok-shop/shop/7495514739648989419?period=30",
"tiktok_shop_url": "https://app.winninghunter.com/tiktok-shop/shop/7495514739648989419?period=30"
}
],
"meta": {
"total": 15494,
"page": 1,
"limit": 20,
"period": "30d",
"next_cursor": "eyJ2IjoxOTYyNTQ1Ni43MDk5OTk5OTMsImlkIjoiNjk5YWZlZjk4ZGUxMjI2NjUxYmFmODhjIn0"
},
"credits_remaining": null,
"credits_unlimited": true
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "No API credits remaining. Buy an add-on pack or wait until next monthly reset.",
"credits": {
"used": 20000,
"limit": 20000,
"remaining": 0,
"addon_remaining": 0,
"total_remaining": 0
},
"purchase": {
"url": "https://…/checkout-api-credits?credits=…"
}
}/api/v1/tiktok-shop/creators/exploreList / search TikTok creators. Also accepts POST JSON.
X-API-Key on every request.Query parameters
countrystringperiodstringlimitintegerpageintegersortstringorderstringnamestring
curl -sS \
-H "X-API-Key: $WH_API_KEY" \
"{origin}/api/v1/tiktok-shop/creators/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string"const res = await fetch(`${ORIGIN}/api/v1/tiktok-shop/creators/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string`, {
method: 'GET',
headers: {
'X-API-Key': process.env.WH_API_KEY,
},
});
const data = await res.json();import os, requests
res = requests.get(
f"{ORIGIN}/api/v1/tiktok-shop/creators/explore?country=US&period=30&limit=20&page=1&sort=revenue&order=desc&name=string",
headers={"X-API-Key": os.environ["WH_API_KEY"]},
)
data = res.json(){
"data": [
{
"creator_id": "6737412251941389318",
"creator_name": "Hannah Bentley",
"nickname": "Hannah Bentley",
"unique_id": "hannahbentley",
"video_count": 172,
"revenue_30_days": 890752.76,
"revenue_7_days": 198025.52
}
],
"meta": {
"total": 50000,
"page": 1,
"limit": 20,
"period": "30d",
"next_cursor": "eyJ2Ijo4OTA3NTIuNzYxODQ5NjI2MiwiaWQiOiI2OTlhZmVmODhkZTEyMjY2NTFiYWYzZmQifQ"
},
"credits_remaining": null,
"credits_unlimited": true
}{
"success": false,
"error": "Unauthorized"
}{
"success": false,
"error": "No API credits remaining. Buy an add-on pack or wait until next monthly reset.",
"credits": {
"used": 20000,
"limit": 20000,
"remaining": 0,
"addon_remaining": 0,
"total_remaining": 0
},
"purchase": {
"url": "https://…/checkout-api-credits?credits=…"
}
}Also: categories/explore, videos/explore, and matching */count routes. Explore rows are upstream passthrough plus the WinningHunter URL injections listed above — many more keys appear on live rows than the samples. Handler soft-errors often look like { "error": "code", "message": "…" } (no success). Count routes do not always include credits_remaining.
credits_remaining in explore 200 bodies is the TikTok Shop daily search quota (same family as GET /api/v1/tiktok-shop/credits). Unlimited accounts return credits_remaining: null and credits_unlimited: true (the DB sentinel -1 is never returned). It is not the programmatic monthly pool from GET /api/v1/credits. Every call still costs 1 programmatic credit via the proxy.
Shared explore params
| Parameter | Default | Notes |
|---|---|---|
page |
1 |
Integer page |
limit |
20 |
Page size |
after |
— | Keyset cursor |
sort / order |
entity default / desc |
Align with dashboard UI |
country |
US |
|
period |
~30 days | 7d / 30d / 90d or numeric days |
category_ids, category_l1_id, … |
— | When hierarchy applies |
Entity filters (canonical names)
Products — name, period, category_ids, min_revenue / max_revenue, growth rates, min_item_sold / max_item_sold, price / commission / score / review / creator / launch filters. Alias: min_sold → min_item_sold.
Shops — name, period, revenue / growth, rating, seller type, product / creator / video counts, channel strategy %. Aliases: min_gmv_30d → min_revenue, etc.
Creators — name, period, revenue / growth, followers / views, verified, product / video counts.
Videos — name, period, revenue / engagement / ROAS / ad spend / publish / flags (is_ad, is_affiliate, …).
Categories — level, name, period, revenue / shop / video ratios. Default sort: revenue_origin.
Other useful GETs
| Path | Notes |
|---|---|
GET .../products |
page, limit, sort, date_from / date_to, … |
GET .../search |
q required |
GET .../trending |
limit, timeframe, category |
GET .../suggestions |
type + q required |
GET .../credits |
{ "success": true, "credits_remaining": null, "credits_unlimited": true } on Standard (or a positive credits_remaining on Basic) — TikTok search credits, not programmatic |
GET .../shops/details |
id required |
Detail POST bodies (shop-detail, product-detail, …): capture from the dashboard Network tab, replay on /api/v1/tiktok-shop/... with your key. Aggregate /total and /history routes are upstream passthrough — do not assume flat invented field names like avg_price or conversion_rate.
MCP
Explore tools (search_tiktok_products, search_tiktok_shops, search_tiktok_creators, …) use the same filter semantics. See MCP tools reference.