Docs
Ctrl+K Search Alt+[Alt+] Guides
Get API key

Integrations

MCP tools reference

Plain-English map of every WinningHunter MCP tool.

https://app.winninghunter.com/mcp
  • Most tools are read-only; track_brand, track_store, and save_ad write; get_ad_transcript can generate persisted transcripts
  • Successful tools/call uses 1 API credit. A call that returns an error payload (invalid_argument, not_found, auth_required, …) is refunded and reports credit_charged: false

Quick list

search_tiktok_products
search_tiktok_shops
search_tiktok_creators
search_tiktok_videos
browse_tiktok_categories
list_tiktok_category_top
autocomplete_tiktok
count_tiktok_entities
get_tiktok_product
get_tiktok_shop
get_tiktok_creator
get_tiktok_video
get_tiktok_trending_products
search_tiktok_ads
get_tiktok_ad
search_pinterest_ads
get_pinterest_ad
search_google_ads
get_google_advertiser
get_store_details
get_store_top_ads
search_facebook_ads
find_winning_products
creative_inspiration_pack
brief_competitor
scan_ad
get_ad_transcript
save_ad
list_saved_ad_boards
daily_radar
track_brand
analyze_tracked_brand
list_tracked_brands
track_store
list_shopify_store_filter_options
search_shopify_stores
search_shops
find_similar_shops
find_similar_stores_by_image
search_exploding_topics
get_exploding_topic_detail
autocomplete_exploding_topics
check_credits

43 tools total. count_tiktok_entities mirrors explore count endpoints (no row payload).

Response size

search_facebook_ads / find_winning_products echo applied filters under mcp_filters (small). Full catalogs (allowed_niches, allowed_technologies, filter_reference, …) are opt-in: pass include_filter_reference=true. Without that flag, discover codes via an invalid filter value (returns allowed_values / allowed_niches without running the search).

search_tiktok_ads, search_pinterest_ads, and search_google_ads keep responses under the MCP client tool-result limit (~25k tokens) in three ways:

  • Per-day chart series (*_history, *_timeseriesadspend_history, rank_history, like_count_history, …) are dropped. The names appear in omitted_series_fields.
  • Fields that carry a byte-identical duplicate value are folded to one canonical name. The response lists field_aliases, e.g. {"poster": "image", "text": "description"} — read the canonical field instead.
  • If the rows still exceed the budget, the lowest-ranked ads are dropped and the response sets truncated: true with a truncated_reason. Lower limit or narrow the filters to get complete pages.

Ad search filters are validated

The three ad-platform search tools reject unknown values instead of silently ignoring them. An invalid sort_by, niches, format, or ad_score returns error: invalid_argument with the allowed list (allowed_sort_by, allowed_niches, …) and does not consume a credit. Every successful response echoes applied_filters so you can confirm what actually reached the query.

Niche taxonomies are per-platform

Meta niche codes are not shared with the other platforms.

  • TikTok has its own 15 keys: beauty, bags, car, romanticgifts, clothing, watches, jewelry, womenclothing, menclothing, toys, child, home, pet, gadgets, outdoor. Raw TikTok label_######## industry codes also work. Passing Meta codes returns invalid_argument with the valid keys.
  • Pinterest and Google have no niche/category filter. Use keyword, domain, or promoter_name/advertiser_name.

Metric coverage by ad platform

Not every metric exists on every platform. Sorting or filtering on an absent metric gives you noise, so pick a field the platform actually populates:

Platform Reliable metrics Absent / sparse
TikTok likeCount, commentCount, shareCount, total_adspend (all ads) total_views — EU view data exists on ~1% of ads
Pinterest comment_count, repin_count / save_count (~77% of ads) total_adspend and total_views are always null — Pinterest publishes no spend or impression data
Google first_shown_at, last_shown_at, days_running (all ads) ad_reach_lower / ad_reach_upper / total_adspend on ~31% of creatives, and only ~10% of US-targeted ones — sort_by=reachspend and reach_min therefore skew EU

Two date fields are easy to confuse on Pinterest: created_at is when WinningHunter indexed the ad (nearly always today), while started is the ad's launch date. date_from / date_to filter started.

Saved ads and boards

save_ad is board-backed for every platform: facebook, facebook_post, pinterest, google and tiktok. Omit board_id to land on the default "All Saved Ads" board, or call list_saved_ad_boards first and pass a specific board_id. Saving the same ad to the same board twice is a no-op and comes back as already_saved: true.

TikTok used to be the exception — saves went to a separate per-user list and board_id was ignored. That is no longer the case. TikTok saves now go to boards like everything else and are additionally mirrored into the legacy per-user list, which is what keeps the filled heart and the "saved only" toggle on the /tiktok-ads grid working. TikTok ads saved before this change stay visible under "All Saved Ads" but are not attached to a board until they are saved again.

Store technology codes

technologies on the TikTok and Pinterest ad tools takes two-letter codes, not product names: SH Shopify, WC WooCommerce, WP WordPress, PP PayPal, KL Klaviyo, GO Google Analytics, CO Cookiebot, TP Trustpilot, SL ShopLazza, SI ShopLine, MG Magento.

How to think about the tools

1) Find things

Use these first:

  • search_tiktok_products
  • search_tiktok_shops
  • search_tiktok_creators
  • search_tiktok_videos
  • search_facebook_ads
  • find_winning_products
  • creative_inspiration_pack
  • brief_competitor
  • scan_ad
  • search_shopify_stores
  • search_shops
  • find_similar_shops
  • find_similar_stores_by_image
  • search_exploding_topics

2) Open details

Use an ID from search results:

  • get_tiktok_product
  • get_tiktok_shop
  • get_tiktok_creator
  • get_tiktok_video
  • get_exploding_topic_detail

3) Helpers

  • browse_tiktok_categories (category tree and views)
  • list_tiktok_category_top (top items in one category)
  • autocomplete_tiktok (typeahead suggestions)
  • autocomplete_exploding_topics (topic suggestions)
  • get_tiktok_trending_products (TikTok Shop trending)
  • daily_radar (tracked-brand growth summary; set include_creative_signals=true for per-brand creative tabs — slower)
  • track_brand (add a Meta page to Brand Tracker)
  • analyze_tracked_brand (single-brand deep dive)
  • track_store (add a Shopify store/domain to Store Tracker)
  • list_shopify_store_filter_options (valid Store Explorer filter values, including dynamic themes/apps/taxonomy)
  • save_ad (save a creative to Saved Ads)
  • list_saved_ad_boards (board ids and folders for save_ad; covers every platform, TikTok included)
  • get_ad_transcript (fetch or generate an ad transcript)
  • check_credits (programmatic API pool — same shape as REST GET /api/v1/credits: used / limit / remaining / addon_remaining / total_remaining)

Most common arguments

Most search tools use these:

  • keyword
  • country
  • page
  • size
  • sort_by
  • sort_order

For Meta ad tools, page is 1-based in MCP (1 = first page), even though the dashboard backend uses 0-based indexing internally. Deep pagination requires the opaque scroll cursor from the previous response (mcp_pagination.scroll_next) — incrementing page alone does not advance the result set (especially with sort_by=lastseen).

sort_order is asc or desc (default desc) on every tool that accepts it.

Most detail tools use:

  • id
  • slice (which part you want)

Allowed sort_by per tool

Pass any string from the table below. Common aliases are normalized automatically (case-insensitive). Anything else falls back to the default sort and the response includes a mcp_sorting block describing what was applied.

Meta ad library

Tool Default Allowed sort_by
search_facebook_ads relevance relevance, datefound, mostrecent (ad start / started), lastseen, adspend, longestrunning, reach, adsetamount, consistency, monthlyvisits, pageactiveads, toprank (sort by ad_rank ascending: rank #1 before #5; use for “top ad from [brand]”; MCP forces sort_order asc)
find_winning_products relevance same as search_facebook_ads

Aliases: created / created_at / date / recent / newest / latestdatefound; most_recent / mostrecent / ad_started / ad_creationmostrecent; last_ad_startedlastseen; first_ad_started / oldest / earliestdatefound (ascending); active_adspageactiveads; monthly_visitsmonthlyvisits. For within-brand ad_rank (“top ad from [brand]”), use toprank or aliases rank, ranking, ad_rank, top_ad, best_ranked, best_ad, adrank, topad, …; spaced phrases like top rank / top ad normalize to toprank. sort_order is ignored for toprank (always ascending rank).

searchkeyword (field scope for keyword on Meta tools): All (default), landingurl, pagename, adtext, productname. This is not a niche/category field; aliases like landing_url, page_name, ad_text, product are normalized too. If an agent mistakenly sends a niche/category term as searchkeyword with no keyword / niche (for example searchkeyword: "Fashion"), the MCP tool recovers it as the matching niche (CG) instead of failing schema validation.

For Meta vertical/category searches, use niche or niches instead of keyword-only filtering. Treat user wording like “category”, “niche”, “vertical”, “market”, or “product category” as a request for this Meta niche filter. The MCP input schema exposes the dashboard niche codes as an enum, so a fashion query should be sent as niche=CG (Fashion & Clothing). Useful fashion-ad refinements are WC = Women's Clothing, MC = Men's Clothing, FW = Footwear / Shoes, BG = Bags, JY = Jewellery, WT = Watches, and SG = Sunglasses. The runtime also accepts dashboard names like Fashion & Clothing; invalid values return allowed_niches instead of being passed through.

rank_growth_filter is also validated against the dashboard options: comma-separated rising, stable, declining.

Other Meta dashboard filters are exposed as MCP args and validated before calling /api/fb-ads: countries / exclude_countries, technology / technologies, language / languages / exclude_languages, apps / exclude_apps, theme / themes, scaling, media_type, page_type, ad_score, low_impressions, range filters (min_* / max_* for duplicates, active ads, FB page likes, ad spend, reach, monthly visits, products on store, price, copy length, video length, days running), active-ads % growth (min_active_ads_growth / max_active_ads_growth + active_ads_growth_period — human percent, periods 1w | 1m | 3m only; dashboard 14d/2m and EU reach % growth are omitted from MCP), and date ranges (ad_created_*, last_seen_*, product_created_*, page_created_*). Theme names must be exact dashboard Themes values; apps accept dashboard app ids or app names. Date ranges require both *_from and *_to in YYYY-MM-DD.

scan_ad (ad detail / angles)

Use when the user is viewing one ad and wants hook, angle, landing page, days running, or a scaling read.

Argument What to pass
ad_url_or_id Preferred: context.ad.id (numeric Meta id, e.g. 1466400984668551). Also: context.public_share_url (https://app.winninghunter.com/ad/{id}?platform=meta), context.ad.ad_id (brand.com_{id}), raw numeric id, or Meta Ad Library URL with id= query param.

Do not pass context.ad.landing_url, brand domains, or product pages — those are storefront URLs, not ad ids. Use web_fetch separately only if you need on-page product copy from the landing URL.

Returns: hook, angle, landing_page, days_running, verdict (likely_scaling | early_or_testing | insufficient_data), plus full ad row.

TikTok Shop

All TikTok Shop search tools default to sort_by=revenue. Allowed values match the dashboard's sortable columns.

Tool Allowed sort_by
search_tiktok_products revenue, name, revenue_30_days, sold_count, avg_unit_price, commission_rate, creator_count, first_seen, creator_conversion_ratio, revenue_growth_rate, sales_growth_rate, product_score, product_rating, product_review_cnt
search_tiktok_shops revenue, shop_name, revenue_30_days, sold_count, product_count, shop_rating, revenue_growth_rate, sales_growth_rate, video_count, avg_unit_price
search_tiktok_creators revenue, name, revenue_30_days, followers, followers_lifetime, followers_growth_rate, video_count, revenue_growth_rate, views_growth_rate, product_count
search_tiktok_videos revenue, name, revenue_30_days, views_30_days, likes_30_days, gpm, ad_spend, ad2_cost, ad2_roas, estimated_roas, publish_date, revenue_growth_rate, views_growth_rate, likes_growth_rate, shares_growth_rate, video_duration, comments, saves

Pagination: TikTok explore tools use keyset cursors: omit after on the first call; pass meta.next_cursor (also echoed as mcp_pagination.after_next) as after on the next call with the same filters/sort. When after is set, the backend ignores page. Prefer after for deep downloads; page remains fine for shallow offset paging. Stop when next_cursor / after_next is null. (HTTP explore uses the same after cursor on /api/v1/tiktok-shop/{entity}/explore.)

For list_tiktok_category_top, get_tiktok_product (creators / videos slices), get_tiktok_shop (products / videos / creators slices), get_tiktok_creator (shops / products / videos slices), and get_tiktok_video (similar slice), the sort_field arg uses the matching entity's allow-list above.

Aliases auto-normalized across TikTok Shop tools: units_sold / units / sales / soldsold_count; gmvrevenue; gmv_30d / revenue_30drevenue_30_days; growth / revenue_growth / gmv_growth_raterevenue_growth_rate; sales_growthsales_growth_rate; price / avg_priceavg_unit_price; ratingshop_rating; reviewsproduct_review_cnt; followers_countfollowers; viewsviews_30_days; likeslikes_30_days; roasestimated_roas; durationvideo_duration; date / publishedpublish_date.

Shopify Explore Shops

track_store(store_url) adds a store/domain to Store Tracker. It uses the same validation, plan limit, store resolution, and bestseller scrape queue as the dashboard.

Tool Default Allowed sort_by
search_shopify_stores, search_shops monthly_visits monthly_visits, 30d_rev_estimated_max, 1d_rev_estimated_max, revenue_1y, aov, visits_growth_pct_m1, visits_growth_pct_m3
find_similar_stores_by_image monthly_visits same as search_shopify_stores

Aliases: revenue / monthly_revenue / revenue_30d / 30d_revenue30d_rev_estimated_max; annual_revenue / yearly_revenuerevenue_1y; daily_revenue / revenue_1d1d_rev_estimated_max; traffic / visits / visitors / monthly_trafficmonthly_visits; avg_order_value / average_order_value / order_valueaov; traffic_growth_1mvisits_growth_pct_m1; traffic_growth_3mvisits_growth_pct_m3; revenue_change / revenue_momentum / store_revenue_change_30dvisits_growth_pct_m1 (same mapping as the live Explore Shops table when legacy revenue-delta sort was retired).

search_shopify_stores / search_shops filters (all optional unless noted). Names mirror MCP argument names:

Use list_shopify_store_filter_options before filtering by dynamic values (shopify_themes, store_apps, product_taxonomy_l1/l2/l3). Its section argument accepts all, static, themes, apps, product_taxonomy_l1, product_taxonomy_l2, product_taxonomy_l3; pass query to search dynamic option lists.

Intent playbook: “Stores in a niche” → category or niche = one of the Explore Shops verticals. For fashion/clothing/apparel, use Clothing. Avoid keyword-only niche queries. “Top / biggest by revenue” → sort_by=revenue_1y, sort_order=desc. “New in last N months” → store_created_from / store_created_to inclusive YYYY-MM-DD (both required).

Parity with POST https://app.winninghunter.com/api/shops/explore: MCP uses the same server-side POST keys (search, category, sortingKey, sortingDirection, page, pageSize, includeWlads, …). Argument mapping: keywordsearch, sort_bysortingKey, sizepageSize. Default include_wlads=falseincludeWlads=0 (matches the dashboard table request that skips wlads previews).

Argument(s) Meaning
keyword Full-text search (name, domain, category, descriptions, products/bestsellers).
country Merchant/store registered country, not visitor traffic. Allowed: US, GB, CA, AU, DE, FR, NL, IN, BR, IT, ES, SE, CN, JP, HK, CH, BE, AE, AT, NZ, SG, IE, DK, NO, PT, PL, MX, KR, IL, ZA, SA, MY, TH, PH, ID, NG, PK, MA, CO, AR, FI, CZ, RO, GR, HU.
currency Store currency. Allowed: USD, EUR, GBP, CAD, SEK, DKK, TRY, NOK, CHF, AUD, NZD, HKD, MXN, BRL, INR.
category, niche Same Explore Shops vertical (niche is an alias if you omit category). Only these values match the vertical filter: Clothing, Arts & Crafts, Accessories, Beauty, Health, Toys & Games, Electronics, Pet Supplies, Other (server matches case-insensitively). Prefer over keyword alone for “stores in [vertical]”.
product_taxonomy_l1, product_taxonomy_l2, product_taxonomy_l3 Optional finer product taxonomy refinements. These are not the main vertical filter; use category / niche for verticals. Discover valid values with list_shopify_store_filter_options.
visitor_country_main, visitor_country_among, visitor_country_exclude Visitor/traffic mix from SimilarWeb-style top countries: comma/semicolon ISO2 lists; main = tied top share; among = has meaningful share; exclude = must not appear (same code in multiple lists → exclude wins). Invalid country-code strings return invalid_argument.
min_revenue, max_revenue, min_annual_revenue, max_annual_revenue Estimated revenue band (monthly USD or annual converted to monthly bounds server-side).
aov_min, aov_max Average product price / AOV range (non-negative).
monthly_visits_min, monthly_visits_max Monthly visits band (integers ≥ 0). Dashboard presets: 0-5000, 5000-10000, 10000-50000, 10000-150000, 10000-100000000, 50000-100000, 0-150000, 100000-1000000, 1000000-100000000, 3000000-100000000.
product_count_min, product_count_max Published product count band (integers ≥ 0). Dashboard presets: 1-10, 10-50, 50-200, 200-1000, 1000-100000.
language Exact match on store language. Allowed: en, fr, de, es, it, pt, nl, sv, da, no, pl, ja, ko, zh, ar, tr, ru, he, th.
store_apps Substring match against installed Shopify app names (≤128 chars). Discover valid names with list_shopify_store_filter_options(section=apps).
revenue_change_pct_min, revenue_change_pct_max 30d revenue momentum filter (store_revenue_change_30d); both bounds must be ≥ 0 (dash-range encoding limitation).
trustpilot_rating_min, trustpilot_rating_max Trustpilot stars (0–5). Dashboard presets: 1-2, 2.5-3.5, 4-5.
trustpilot_reviews_min, trustpilot_reviews_max Trustpilot review count band (integers ≥ 0). Dashboard presets: 1-1000, 1000-10000, 10000-100000, 100000-100000000.
traffic_growth_rules_json JSON array of rules AND‑ed together: { "months": 1 | 3, "direction": "growth" | "loss", "percentage": number, "maxPercentage": number | null } (matches Explore Shops Traffic Growth UI).
store_created_from, store_created_to Inclusive calendar window YYYY-MM-DD (both required). Filters indexed first_product_date (first catalog signal). Does not filter Shopify metadata.created_at (shop provision / replatform). Successful responses include mcp_sorting with the applied sort and allow-list.
include_wlads Default false: includeWlads=0 in POST (same as dashboard Explore table — no per-store explore_wlads_ads Meta preview hydration). Set true for previews (includeWlads=1).
shopify_themes Comma/semicolon-separated theme names, or JSON string array (each 1–128 chars). Discover current theme names with list_shopify_store_filter_options(section=themes). Invalid/empty theme payloads return invalid_argument.
page, size, sort_by, sort_order Pagination and sort. page must be ≥ 1; size must be 1–50; sort_order must be asc or desc.

find_similar_stores_by_image takes image_url (required) plus the same filters as above except keyword (similarity replaces text search).

Note: TikTok MCP tools also use a country argument — there it is marketplace/country context, not the same field as Shopify merchant country.

Brand tracker

track_brand(page_id?, url?) adds a Facebook / Meta page to Brand Tracker. Provide either a page_id or a Facebook Ad Library URL containing view_all_page_id; it uses the same plan limit and global tracking queue as the dashboard.

Tool Default Allowed sort
list_tracked_brands date_added date_added, name, new_ads, growth

Aliases: recent / added / newest / latest / datedate_added; alphabetical / alpha / a-zname; new / newadsnew_ads; trending / momentumgrowth.

Exploding Topics

Tool Default Allowed sorting Allowed timeframe
search_exploding_topics (dashboard preselects exponent) default, growth, gradient, exponent, absolute_volume, date_added default (all time), 3, 6, 12, 24 (months)

Aliases for sorting: volumeabsolute_volume; exponentialexponent; recent / newest / latestdate_added; trendinggrowth. category accepts dashboard slugs (e.g. fashion, beauty, skincare, fitness, technology, ai, …) or default for all categories.

mcp_sorting response block

Every search/list tool that accepts sort_by (or sort/sorting) attaches an mcp_sorting object to the response payload:

{
  "mcp_sorting": {
    "requested_sort_by": "revenue_30d",
    "applied_sort_by": "revenue_30_days",
    "applied_sort_order": "desc",
    "allowed_sort_by": ["revenue", "name", "revenue_30_days", "..."],
    "normalized_from": "revenue_30d"
  }
}

If you pass an unknown sort key, mcp_sorting.warning says it fell back to the default — the tool does not error out.

Slice values for detail tools

Use one of these slice values:

  • get_tiktok_product: detail, history, metrics, creators, videos
  • get_tiktok_shop: detail, history, metrics, products, videos, creators, strategy
  • get_tiktok_creator: detail, history, metrics, shops, products, videos
  • get_tiktok_video: detail, history, metrics, products, similar

Two easy mistakes

  1. Trending confusion

    • get_tiktok_trending_products is TikTok Shop product momentum
    • Exploding Topics is separate (search_exploding_topics + get_exploding_topic_detail)
  2. Write actions

    • MCP supports track_brand, track_store, save_ad, and Meta ad transcript generation via get_ad_transcript
    • Favorites, presets, TikTok transcripts, and other writes must use REST API

Copy block for AI instructions

Paste this into agent instructions:

Use WinningHunter MCP at https://app.winninghunter.com/mcp.
Auth can be either OAuth bearer token (connector flow) or X-API-Key (header-capable clients).
Most MCP tools are read-only. `track_brand`, `track_store`, and `save_ad` write. `get_ad_transcript` can generate persisted transcripts.
Successful tools/call costs 1 API credit.
If user asks for other writes (favorites/presets/TikTok transcripts), use REST /api/v1/tiktok-shop/* instead.
When unsure about exact schema, call tools/list first.

Need the full technical detail?

For full filter semantics and endpoint behavior: