{"name":"Wuthering AI API","description":"One GET per question. Authenticate with `?token=<token>` on the URL or `Authorization: Bearer <token>`; get a token on the dashboard. Array parameters are comma-separated in a query string, or use POST with a JSON body. Responses are complete JSON.","openapi_url":"https://wutheringai.com/v1/openapi.json","docs_url":"https://wutheringai.com/llms.txt","dashboard_url":"https://wutheringai.com/dashboard","free":[{"tool":"skills","method":"GET","path":"/v1/free/skills","summary":"The methods behind the data: which tools to call, in what order, what evidence outranks what, and the thresholds that decide the answer. Text only. No token, no account.","price_cents":0,"requires_token":false}],"free_index_url":"https://wutheringai.com/v1/free","tool_count":57,"tools":[{"tool":"keyword_ideas","method":"GET","path":"/v1/keyword_ideas","summary":"Expand a handful of seed terms into the wider set of things people actually search.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 200 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"offset","type":"number","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","default":0}]},{"tool":"keyword_suggestions","method":"GET","path":"/v1/keyword_suggestions","summary":"Find the longer, more specific phrases built around a single term.","family":"keyword","price_cents":20,"params":[{"name":"keyword","type":"string","required":true,"description":"The single seed keyword to expand."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"offset","type":"number","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","default":0}]},{"tool":"keyword_related","method":"GET","path":"/v1/keyword_related","summary":"Walk outward from one keyword through what else the same people search.","family":"keyword","price_cents":20,"params":[{"name":"keyword","type":"string","required":true,"description":"The keyword to traverse outward from."},{"name":"depth","type":"number","required":false,"description":"How far to traverse (0 to 4, default 1). Each level multiplies results sharply.","default":1},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"keyword_autocomplete","method":"GET","path":"/v1/keyword_autocomplete","summary":"Read the live suggestions Google offers for a phrase, exactly as a searcher sees them.","family":"keyword","price_cents":20,"params":[{"name":"keyword","type":"string","required":true,"description":"The phrase to complete, written the way a searcher would have typed it so far. Completions are built from what follows it, so the shape you send decides which half of the market you see: 'espresso machine' returns buying modifiers, 'how to espresso machine' returns questions."},{"name":"cursor_position","type":"number","required":false,"description":"Where the caret sits inside the keyword, counted in characters. Defaults to the end, which completes the phrase forwards ('espresso machine' to 'espresso machine with grinder'). Set it to 0 to complete backwards instead and get the words searchers put BEFORE the phrase ('breville espresso machine', 'best espresso machine') — a different set of terms that no other tool here returns."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_overview","method":"GET","path":"/v1/keyword_overview","summary":"Get every available metric, including trend, for keywords you already have.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 700 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_volume","method":"GET","path":"/v1/keyword_volume","summary":"Price up to 1,000 keywords in a single billed call.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 1000 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_from_seeds","method":"GET","path":"/v1/keyword_from_seeds","summary":"Turn a small seed set into a very large idea list in one call.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 20 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_intent","method":"GET","path":"/v1/keyword_intent","summary":"Classify keywords as informational, commercial, navigational, or transactional.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 1000 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_difficulty","method":"GET","path":"/v1/keyword_difficulty","summary":"Score up to 1,000 keywords 0-100 on ranking difficulty.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 1000 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_history","method":"GET","path":"/v1/keyword_history","summary":"Get multi-year monthly search history for a keyword list.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 700 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"keyword_top_searches","method":"GET","path":"/v1/keyword_top_searches","summary":"List the most-searched terms for a location, with optional filtering.","family":"keyword","price_cents":20,"params":[{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"offset","type":"number","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","default":0}]},{"tool":"keyword_forecast","method":"GET","path":"/v1/keyword_forecast","summary":"Estimate the clicks, cost, and CPC a keyword set would produce at a given bid.","family":"keyword","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 1000 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"bid","type":"number","required":true,"description":"Maximum cost-per-click bid in whole currency units, for example 5 for $5.00."},{"name":"match","type":"string","required":false,"description":"Keyword match type. 'exact' gives the most conservative estimate.","values":["exact","broad","phrase"],"default":"exact"},{"name":"date_interval","type":"string","required":false,"description":"Forecast window. Defaults to 'next_month'.","values":["next_week","next_month","next_quarter"],"default":"next_month"},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"domain_rankings","method":"GET","path":"/v1/domain_rankings","summary":"List every keyword a site ranks for, with position and traffic value.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"offset","type":"number","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","default":0}]},{"tool":"domain_relevance","method":"GET","path":"/v1/domain_relevance","summary":"Get the keywords Google associates with a domain, ranked or not.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain or page URL to analyse, for example 'example.com'."},{"name":"target_type","type":"string","required":false,"description":"Treat the target as a whole site or a single page. Defaults to 'site'.","values":["site","page"],"default":"site"},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"domain_competitors","method":"GET","path":"/v1/domain_competitors","summary":"Discover which sites compete with a domain across its whole keyword set.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 50). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":50}]},{"tool":"domain_serp_rivals","method":"GET","path":"/v1/domain_serp_rivals","summary":"Find the domains that own a particular list of keywords.","family":"domain","price_cents":20,"params":[{"name":"keywords","type":"array","required":true,"description":"Keywords to look up, up to 200 in one call. This is one billed call regardless of how many you send, so batch aggressively rather than looping. A batch whose rows exceed what one response can carry comes back trimmed, stating how many rows it held and how many it returned; terms missing from a trimmed response were withheld, not measured as having no data."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 50). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":50}]},{"tool":"domain_overview","method":"GET","path":"/v1/domain_overview","summary":"Get headline organic and paid search metrics for one domain.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"domain_history","method":"GET","path":"/v1/domain_history","summary":"Track how a domain's organic visibility has moved across months.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"date_from","type":"string","required":false,"description":"Earliest month to report, as YYYY-MM-DD. Defaults to 24 months before date_to, which is also the furthest back one call reaches."},{"name":"date_to","type":"string","required":false,"description":"Latest month to report, as YYYY-MM-DD. Defaults to the most recent data available."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"domain_keyword_overlap","method":"GET","path":"/v1/domain_keyword_overlap","summary":"Compare two domains keyword by keyword, with both positions side by side.","family":"domain","price_cents":20,"params":[{"name":"target1","type":"string","required":true,"description":"First domain, usually yours, for example 'example.com'."},{"name":"target2","type":"string","required":true,"description":"Second domain to compare against."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"domain_page_overlap","method":"GET","path":"/v1/domain_page_overlap","summary":"Compare two specific URLs rather than two whole domains.","family":"domain","price_cents":20,"params":[{"name":"page1","type":"string","required":true,"description":"First page URL, including protocol."},{"name":"page2","type":"string","required":true,"description":"Second page URL to compare against."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"domain_top_pages","method":"GET","path":"/v1/domain_top_pages","summary":"Find which pages on a site actually earn its search traffic.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"domain_subdomains","method":"GET","path":"/v1/domain_subdomains","summary":"Break a domain's organic performance down across its subdomains.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"domain_categories","method":"GET","path":"/v1/domain_categories","summary":"See which product categories a site has search presence in.","family":"domain","price_cents":20,"params":[{"name":"target","type":"string","required":true,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"domain_traffic","method":"GET","path":"/v1/domain_traffic","summary":"Estimate organic traffic for up to 1,000 domains in one call.","family":"domain","price_cents":20,"params":[{"name":"targets","type":"array","required":true,"description":"Domains to estimate, up to 1,000. One billed call regardless of count."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"domain_traffic_history","method":"GET","path":"/v1/domain_traffic_history","summary":"Track estimated organic traffic for several domains across months.","family":"domain","price_cents":20,"params":[{"name":"targets","type":"array","required":true,"description":"Domains to track, up to 50. Every domain is billed, so send the competitive set you will actually read."},{"name":"date_from","type":"string","required":false,"description":"Earliest month to report, as YYYY-MM-DD. Defaults to 24 months before date_to, which is also the furthest back one call reaches."},{"name":"date_to","type":"string","required":false,"description":"Latest month to report, as YYYY-MM-DD. Defaults to the most recent data available."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"social_linkedin_posts","method":"GET","path":"/v1/social_linkedin_posts","summary":"Read the full text and engagement of a single published post.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the post itself, containing /posts/ or /pulse/. A company or profile page URL is not accepted. Find it with your OWN web search first: `site:linkedin.com/posts \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_reddit_posts","method":"GET","path":"/v1/social_reddit_posts","summary":"Read Reddit threads where people describe problems in their own words.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the Reddit post itself, of the form reddit.com/r/<sub>/comments/<id>/<slug>. A subreddit front page is not accepted — the collection is keyed by post and answers one with \"Reddit post was not found\". Find it with your OWN web search first: `site:reddit.com/r/ \"project management software\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_reddit_comments","method":"GET","path":"/v1/social_reddit_comments","summary":"Read the discussion underneath a Reddit post.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the Reddit post whose comments you want. Find it with your OWN web search first: `site:reddit.com/r/ \"project management software\" comments` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_instagram_profile","method":"GET","path":"/v1/social_instagram_profile","summary":"Get a profile's follower count, bio, and account details.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"Instagram profile URL. Find it with your OWN web search first: `site:instagram.com \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_instagram_posts","method":"GET","path":"/v1/social_instagram_posts","summary":"Read a profile's posts with captions and engagement.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the Instagram post itself, containing /p/. Find it with your OWN web search first: `site:instagram.com/p \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_instagram_reels","method":"GET","path":"/v1/social_instagram_reels","summary":"Read reels with view counts and captions.","family":"social","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the Instagram reel itself, containing /reel/. Find it with your OWN web search first: `site:instagram.com/reel \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"social_youtube_search","method":"GET","path":"/v1/social_youtube_search","summary":"Find videos ranking for a search term, with view counts and channels.","family":"social","price_cents":20,"params":[{"name":"keyword","type":"string","required":true,"description":"Search term to look up on YouTube."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"social_youtube_subtitles","method":"GET","path":"/v1/social_youtube_subtitles","summary":"Read the complete timestamped transcript of a YouTube video.","family":"social","price_cents":20,"params":[{"name":"video_id","type":"string","required":true,"description":"YouTube video id, the part after v= in a watch URL. Not the full URL."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"Which caption track to READ, for example 'en' or 'de'. Defaults to 'en'. This selects a track rather than translating one: a video captioned only in Korean is refused for 'en' and returns its transcript for 'ko'. Pass the language the video was captioned in, not the language you would prefer to read.","default":"en"}]},{"tool":"social_youtube_comments","method":"GET","path":"/v1/social_youtube_comments","summary":"Read viewer comments on a YouTube video.","family":"social","price_cents":20,"params":[{"name":"video_id","type":"string","required":true,"description":"YouTube video id, the part after v= in a watch URL."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 700, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"app_search","method":"GET","path":"/v1/app_search","summary":"Find the apps that rank for a keyword in either app store.","family":"app","price_cents":20,"params":[{"name":"platform","type":"string","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","values":["ios","android"]},{"name":"keyword","type":"string","required":true,"description":"Search term to look up in the store."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"depth","type":"number","required":false,"description":"Maximum rows to return (1 to 200, default 50). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":50},{"name":"task_id","type":"string","required":false,"description":"Only for resuming, and normally omitted. These store endpoints are queued rather than immediate: the tool submits the request and waits up to 90 seconds for it. That is enough for almost every call, but a large review or chart request can exceed it, in which case the tool fails with a message containing a task id. Passing that id here collects the finished result without submitting, or being billed for, the work a second time."}]},{"tool":"app_details","method":"GET","path":"/v1/app_details","summary":"Get the complete store listing for a specific app.","family":"app","price_cents":20,"params":[{"name":"platform","type":"string","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","values":["ios","android"]},{"name":"app_id","type":"string","required":true,"description":"App identifier, in the format the chosen platform uses: a numeric id for 'ios' (for example 284882215), a reverse-DNS package name for 'android' (for example com.example.app). An identifier in the wrong format is billed rather than rejected, so confirm it before calling: your own web search finds it fastest (site:apps.apple.com \"Acme\", where the id is the number after /id in the URL), and wuthering_app_search does the same for a billed call."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"task_id","type":"string","required":false,"description":"Only for resuming, and normally omitted. These store endpoints are queued rather than immediate: the tool submits the request and waits up to 90 seconds for it. That is enough for almost every call, but a large review or chart request can exceed it, in which case the tool fails with a message containing a task id. Passing that id here collects the finished result without submitting, or being billed for, the work a second time."}]},{"tool":"app_reviews","method":"GET","path":"/v1/app_reviews","summary":"Read what users actually say about an app, filtered by rating.","family":"app","price_cents":20,"params":[{"name":"platform","type":"string","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","values":["ios","android"]},{"name":"app_id","type":"string","required":true,"description":"App identifier, in the format the chosen platform uses: a numeric id for 'ios' (for example 284882215), a reverse-DNS package name for 'android' (for example com.example.app). An identifier in the wrong format is billed rather than rejected, so confirm it before calling: your own web search finds it fastest (site:apps.apple.com \"Acme\", where the id is the number after /id in the URL), and wuthering_app_search does the same for a billed call."},{"name":"depth","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"sort_by","type":"string","required":false,"description":"Review ordering. 'most_recent' surfaces current problems; 'most_helpful' surfaces the ones other users voted up.","values":["most_recent","most_helpful"],"default":"most_recent"},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"task_id","type":"string","required":false,"description":"Only for resuming, and normally omitted. These store endpoints are queued rather than immediate: the tool submits the request and waits up to 90 seconds for it. That is enough for almost every call, but a large review or chart request can exceed it, in which case the tool fails with a message containing a task id. Passing that id here collects the finished result without submitting, or being billed for, the work a second time."}]},{"tool":"app_top_charts","method":"GET","path":"/v1/app_top_charts","summary":"List the top apps in a store category or collection.","family":"app","price_cents":20,"params":[{"name":"platform","type":"string","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","values":["ios","android"]},{"name":"app_collection","type":"string","required":true,"description":"Chart to read. iOS: top_free_ios, top_paid_ios, top_grossing_ios, new_ios. Android: topselling_free, topselling_paid, topgrossing, movers_shakers."},{"name":"app_category","type":"string","required":false,"description":"Store category to scope the chart to. Omit for overall."},{"name":"depth","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"task_id","type":"string","required":false,"description":"Only for resuming, and normally omitted. These store endpoints are queued rather than immediate: the tool submits the request and waits up to 90 seconds for it. That is enough for almost every call, but a large review or chart request can exceed it, in which case the tool fails with a message containing a task id. Passing that id here collects the finished result without submitting, or being billed for, the work a second time."}]},{"tool":"app_keywords","method":"GET","path":"/v1/app_keywords","summary":"Find the App Store search terms an app ranks for, with volume.","family":"app","price_cents":20,"params":[{"name":"app_id","type":"string","required":true,"description":"Numeric Apple app id. Google Play package names are not accepted."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"app_competitors","method":"GET","path":"/v1/app_competitors","summary":"Find the apps that rank for the same App Store terms as yours.","family":"app","price_cents":20,"params":[{"name":"app_id","type":"string","required":true,"description":"Numeric Apple app id to find competitors for."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 50). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":50}]},{"tool":"app_keyword_overlap","method":"GET","path":"/v1/app_keyword_overlap","summary":"Compare two apps head to head on App Store keywords.","family":"app","price_cents":20,"params":[{"name":"app_ids","type":"array","required":true,"description":"Numeric Apple app ids to intersect, usually two."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 1000, default 100). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":100}]},{"tool":"app_metrics","method":"GET","path":"/v1/app_metrics","summary":"Get comparable App Store metrics for a set of apps in one call.","family":"app","price_cents":20,"params":[{"name":"app_ids","type":"array","required":true,"description":"Numeric Apple app ids. One flat charge regardless of count."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"}]},{"tool":"company_profile","method":"GET","path":"/v1/company_profile","summary":"Look up a company's size, industry, location, and description.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":false,"description":"LinkedIn company profile URL, if you have it. Exact, and skips the lookup step. Find it with your OWN web search first: `site:linkedin.com/company \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."},{"name":"company","type":"string","required":false,"description":"Company name, used when you have no URL. Resolved here with a billed search that takes the first plausible match, so prefer finding the URL yourself and passing it."},{"name":"domain","type":"string","required":false,"description":"The company's website domain, for example 'acme.com'. Strongly recommended alongside a name: it disambiguates common names and prevents matching the wrong company."}]},{"tool":"company_funding","method":"GET","path":"/v1/company_funding","summary":"Get a company's funding history, investors, and acquisitions.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":false,"description":"Crunchbase organization profile URL, if you have it. Exact, and skips the lookup step. Find it with your OWN web search first: `site:crunchbase.com/organization \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."},{"name":"company","type":"string","required":false,"description":"Company name, used when you have no URL. Resolved here with a billed search that takes the first plausible match, so prefer finding the URL yourself and passing it."},{"name":"domain","type":"string","required":false,"description":"The company's website domain, for example 'acme.com'. Strongly recommended alongside a name: it disambiguates common names and prevents matching the wrong company."}]},{"tool":"company_firmographics","method":"GET","path":"/v1/company_firmographics","summary":"Get revenue estimates, technologies in use, and organisational structure.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":false,"description":"ZoomInfo company profile URL, if you have it. Exact, and skips the lookup step. Find it with your OWN web search first: `site:zoominfo.com/c \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."},{"name":"company","type":"string","required":false,"description":"Company name, used when you have no URL. Resolved here with a billed search that takes the first plausible match, so prefer finding the URL yourself and passing it."},{"name":"domain","type":"string","required":false,"description":"The company's website domain, for example 'acme.com'. Strongly recommended alongside a name: it disambiguates common names and prevents matching the wrong company."}]},{"tool":"company_jobs","method":"GET","path":"/v1/company_jobs","summary":"Read a single job listing, including its salary band where one is posted.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"URL of the job listing itself, of the form linkedin.com/jobs/view/<id>. Find it with your OWN web search first: `site:linkedin.com/jobs/view \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"company_person","method":"GET","path":"/v1/company_person","summary":"Look up an individual's role, history, and background.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"The person's profile URL. Find it with your OWN web search first: `site:linkedin.com/in \"Jane Doe\" \"Acme\"` returns it directly. wuthering_web_search is the fallback if you have no search of your own, and is billed. Never construct a URL — a wrong one returns a dead page, not an error."}]},{"tool":"company_people_search","method":"GET","path":"/v1/company_people_search","summary":"Search for people by first and last name within a profile directory.","family":"company","price_cents":20,"params":[{"name":"url","type":"string","required":false,"description":"Directory search URL to search within. The default covers the general directory; a company page URL narrows it to that company's people.","default":"https://www.linkedin.com/search/results/people/"},{"name":"first_name","type":"string","required":true,"description":"The person's first name."},{"name":"last_name","type":"string","required":true,"description":"The person's last name."}]},{"tool":"ads_advertisers","method":"GET","path":"/v1/ads_advertisers","summary":"Find the companies running ads for a brand or domain, and how many.","family":"ads","price_cents":20,"params":[{"name":"keyword","type":"string","required":false,"description":"Brand or company name to find advertisers for. Use this or target."},{"name":"target","type":"string","required":false,"description":"Registrable domain to find advertisers for, for example 'acme.com'."},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 120, default 40). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":40}]},{"tool":"ads_creatives","method":"GET","path":"/v1/ads_creatives","summary":"List an advertiser's creatives with first-seen and last-seen dates.","family":"ads","price_cents":20,"params":[{"name":"advertiser_id","type":"string","required":false,"description":"Advertiser id from wuthering_ads_advertisers, in the form AR followed by digits."},{"name":"target","type":"string","required":false,"description":"Advertiser's registrable domain, for example 'acme.com', if you have no advertiser id."},{"name":"platform","type":"string","required":false,"description":"Restrict to one surface. Defaults to all surfaces.","values":["all","google_play","google_maps","google_search","google_shopping","youtube"],"default":"all"},{"name":"ad_format","type":"string","required":false,"description":"Restrict to one creative format. Defaults to all formats.","values":["all","text","image","video"],"default":"all"},{"name":"location_code","type":"number","required":false,"description":"Numeric location code to scope results to. Defaults to 2840 (United States). Search volume and competition vary sharply by country, so set this when the question is about a specific market.","default":2840},{"name":"language_code","type":"string","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","default":"en"},{"name":"limit","type":"number","required":false,"description":"Maximum rows to return (1 to 120, default 40). Ask for the fewest that answer the question: every row is billed and spends the caller's context.","default":40}]},{"tool":"ads_meta_library","method":"GET","path":"/v1/ads_meta_library","summary":"See the ads an advertiser, domain or phrase is running on Facebook and Instagram, returned as one full-page image.","family":"ads","price_cents":20,"params":[{"name":"page_id","type":"string","required":false,"description":"Meta page id of one advertiser — the precise aim, returning that advertiser's ads and nobody else's. Get it from wuthering_ads_meta_advertisers; a page id read off the advertiser's Facebook page instead is a different identifier and returns an empty result rather than an error. An ad-library URL can be pasted whole and the id is taken out of it."},{"name":"target","type":"string","required":false,"description":"Domain to find ads for, for example 'acme.com'. Matched against the domain shown on each ad's link card, so it returns everyone driving traffic there — the brand, its regional pages, its resellers and its affiliates — not only the brand itself. Protocol, path and a leading www are ignored."},{"name":"keyword","type":"string","required":false,"description":"Phrase to match against ad text, for example 'project management'. A category term returns the whole field competing on it. Alongside page_id it narrows to that one advertiser's ads mentioning the phrase, which is how you ask what a competitor says about a specific product."},{"name":"match","type":"string","required":false,"description":"How to match keyword. exact requires the words together, in order, and is the right default for a brand or product name. any matches the words in any order, which widens a category search but drags in unrelated ads. Ignored for target, which is always matched exactly.","values":["exact","any"],"default":"exact"},{"name":"country","type":"string","required":false,"description":"Two-letter country code for the market whose ads to show, for example 'US' or 'DE', or 'ALL' for every country. Defaults to US, matching the default every other tool here uses. Ad libraries differ sharply by market: the same advertiser runs different offers in each.","default":"US"},{"name":"active_status","type":"string","required":false,"description":"Whether to show ads currently running, ones that have stopped, or both. Defaults to active. Inactive ads are the more interesting half for a teardown — an ad that ran and stopped is a message the advertiser tested and abandoned.","values":["active","inactive","all"],"default":"active"},{"name":"ad_type","type":"string","required":false,"description":"Restrict to one regulated category. Defaults to all. The regulated categories are worth knowing about: Meta is required to publish spend ranges and impression counts for those, so an ad in one carries numbers an ordinary commercial ad does not.","values":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all"},{"name":"media_type","type":"string","required":false,"description":"Restrict to one creative format. Defaults to all. none means text-only ads. Narrowing to image makes the captured page far easier to read when a search returns many ads.","values":["all","image","video","meme","image_and_meme","none"],"default":"all"},{"name":"platforms","type":"array","required":false,"description":"Restrict to particular Meta surfaces. Omit for all of them, which is usually right — an advertiser rarely chooses surfaces deliberately, so filtering mostly just hides ads. Set it when the question is specifically about one placement."},{"name":"languages","type":"array","required":false,"description":"Restrict to ads whose text is in these languages, as ISO codes such as 'en' or 'no'. Omit for all languages. Worth setting for a country where several are common, otherwise the results fill with ads you cannot read."},{"name":"targeted_country","type":"boolean","required":false,"description":"When true, return only ads deliberately TARGETED at the country, rather than every ad merely reachable there. Defaults to false, the broader view. Set it when you need to know a competitor is investing in a market rather than spilling into it.","default":false},{"name":"started_after","type":"string","required":false,"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."},{"name":"started_before","type":"string","required":false,"description":"Only ads that began running on or before this date, as YYYY-MM-DD. This is how you page: one call reads about thirty ads, newest first, so setting this to the oldest launch date you were given returns the batch before it. Paired with started_after it reads one campaign window."}]},{"tool":"ads_meta_advertisers","method":"GET","path":"/v1/ads_meta_advertisers","summary":"Turn a domain, brand or phrase into the Meta advertisers behind it, with page ids and their current ads as rows.","family":"ads","price_cents":20,"params":[{"name":"page_id","type":"string","required":false,"description":"Meta page id of one advertiser — the precise aim, returning that advertiser's ads and nobody else's. Get it from wuthering_ads_meta_advertisers; a page id read off the advertiser's Facebook page instead is a different identifier and returns an empty result rather than an error. An ad-library URL can be pasted whole and the id is taken out of it."},{"name":"target","type":"string","required":false,"description":"Domain to find ads for, for example 'acme.com'. Matched against the domain shown on each ad's link card, so it returns everyone driving traffic there — the brand, its regional pages, its resellers and its affiliates — not only the brand itself. Protocol, path and a leading www are ignored."},{"name":"keyword","type":"string","required":false,"description":"Phrase to match against ad text, for example 'project management'. A category term returns the whole field competing on it. Alongside page_id it narrows to that one advertiser's ads mentioning the phrase, which is how you ask what a competitor says about a specific product."},{"name":"match","type":"string","required":false,"description":"How to match keyword. exact requires the words together, in order, and is the right default for a brand or product name. any matches the words in any order, which widens a category search but drags in unrelated ads. Ignored for target, which is always matched exactly.","values":["exact","any"],"default":"exact"},{"name":"country","type":"string","required":false,"description":"Two-letter country code for the market whose ads to show, for example 'US' or 'DE', or 'ALL' for every country. Defaults to US, matching the default every other tool here uses. Ad libraries differ sharply by market: the same advertiser runs different offers in each.","default":"US"},{"name":"active_status","type":"string","required":false,"description":"Whether to show ads currently running, ones that have stopped, or both. Defaults to active. Inactive ads are the more interesting half for a teardown — an ad that ran and stopped is a message the advertiser tested and abandoned.","values":["active","inactive","all"],"default":"active"},{"name":"ad_type","type":"string","required":false,"description":"Restrict to one regulated category. Defaults to all. The regulated categories are worth knowing about: Meta is required to publish spend ranges and impression counts for those, so an ad in one carries numbers an ordinary commercial ad does not.","values":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all"},{"name":"media_type","type":"string","required":false,"description":"Restrict to one creative format. Defaults to all. none means text-only ads. Narrowing to image makes the captured page far easier to read when a search returns many ads.","values":["all","image","video","meme","image_and_meme","none"],"default":"all"},{"name":"platforms","type":"array","required":false,"description":"Restrict to particular Meta surfaces. Omit for all of them, which is usually right — an advertiser rarely chooses surfaces deliberately, so filtering mostly just hides ads. Set it when the question is specifically about one placement."},{"name":"languages","type":"array","required":false,"description":"Restrict to ads whose text is in these languages, as ISO codes such as 'en' or 'no'. Omit for all languages. Worth setting for a country where several are common, otherwise the results fill with ads you cannot read."},{"name":"targeted_country","type":"boolean","required":false,"description":"When true, return only ads deliberately TARGETED at the country, rather than every ad merely reachable there. Defaults to false, the broader view. Set it when you need to know a competitor is investing in a market rather than spilling into it.","default":false},{"name":"started_after","type":"string","required":false,"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."},{"name":"started_before","type":"string","required":false,"description":"Only ads that began running on or before this date, as YYYY-MM-DD. This is how you page: one call reads about thirty ads, newest first, so setting this to the oldest launch date you were given returns the batch before it. Paired with started_after it reads one campaign window."}]},{"tool":"ads_linkedin_advertisers","method":"GET","path":"/v1/ads_linkedin_advertisers","summary":"Turn a company, advertiser name, payer or phrase into the LinkedIn advertisers behind it, with their ads as rows.","family":"ads","price_cents":20,"params":[{"name":"company_id","type":"string","required":false,"description":"LinkedIn company id of one advertiser — the precise aim, returning that company's ads and nobody else's. It is not on the search results page: take it from an ad's detail page, which links the advertiser as linkedin.com/company/<id>. A company URL or an ad-library URL can be pasted whole and the id is taken out of it. Note that a company's vanity URL (linkedin.com/company/acme-inc) is a slug, not an id, and is not accepted here."},{"name":"advertiser","type":"string","required":false,"description":"Company or advertiser name to search for, for example 'Asana'. Looser than company_id and useful for that: it catches regional pages, product pages and showcase pages a single company id would miss. Use company_id instead when you need exactly one advertiser."},{"name":"keyword","type":"string","required":false,"description":"Word or phrase to match against ad text, for example 'project management'. A category term returns the whole field competing on it, including companies you had not thought to name. Combines with the other aims to narrow within them."},{"name":"payer","type":"string","required":false,"description":"Name of the entity that PAID for the ads, which LinkedIn publishes separately from the advertiser — usually a media agency. Searching one returns every brand that agency buys for. Take the exact string from the 'Paid for by' line on an ad's detail page; it is matched as written."},{"name":"country","type":"string","required":false,"description":"Two-letter country code for the market whose ads to show, for example 'US' or 'DE', or 'ALL' for every country. Defaults to US, matching every other tool here. Worth changing for more than coverage: only ads shown in the EU and EEA publish run dates and impressions on their detail pages, so a European market is the one place those numbers exist at all.","default":"US"},{"name":"started_after","type":"string","required":false,"description":"Only ads created on or after this date, as YYYY-MM-DD. The library holds a rolling twelve months and nothing older, and a date outside that window is not an error — it returns an empty page that reads exactly like an advertiser with no ads, so anything out of range is clamped back into it rather than sent."},{"name":"started_before","type":"string","required":false,"description":"Only ads created on or before this date, as YYYY-MM-DD. With started_after this reads one campaign window. Same rolling twelve-month window and same clamping as started_after."},{"name":"sort","type":"string","required":false,"description":"Order the results by when each ad was created. newest is LinkedIn's own default. oldest is the more useful one for a teardown: the library holds twelve months, so the ads it returns first are the ones that have survived longest, and reading a competitor's oldest first shows what they settled on before what they are still trying. It is not run length — LinkedIn does not publish that here — but it is the closest ordering to it.","values":["newest","oldest"],"default":"newest"},{"name":"page_token","type":"string","required":false,"description":"Fetch the next batch instead of the first. Pass back the next_page_token from a previous call, with EVERY OTHER ARGUMENT IDENTICAL — the token is only meaningful against the search that produced it, and a token from a different search returns the wrong ads or fails outright. A response with no next_page_token is the last batch; there is nothing further to ask for."}]},{"tool":"web_search","method":"GET","path":"/v1/web_search","summary":"Run a search engine query and get the result list back.","family":"web","price_cents":20,"params":[{"name":"query","type":"string","required":true,"description":"The search query. Supports operators: site:example.com restricts to one domain, and quoting a phrase requires an exact match."},{"name":"engine","type":"string","required":false,"description":"Which search engine to query. Defaults to google.","values":["google","bing","yandex"],"default":"google"},{"name":"geo_location","type":"string","required":false,"description":"Two-letter country code for geo-targeted results, for example 'us' or 'de'. Defaults to us, matching the default every other tool here uses. Without one the results are targeted at whichever country the request happens to leave from, which is not a property of your question and not one you can see in the answer.","default":"us"},{"name":"cursor","type":"string","required":false,"description":"Pagination cursor from a previous response's next page."}]},{"tool":"web_fetch","method":"GET","path":"/v1/web_fetch","summary":"Fetch a page as clean markdown or raw HTML, including sites that block bots.","family":"web","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"The full URL to fetch, including protocol. If you do not have the exact URL, find it with your own web search first (for example: site:acme.com pricing), or with wuthering_web_search if you have none. A guessed URL returns someone's 404 page as though it were content."},{"name":"format","type":"string","required":false,"description":"markdown returns readable text and is the right default. html returns raw markup and costs substantially more context; use it only when you need the structure.","values":["markdown","html"],"default":"markdown"}]},{"tool":"web_screenshot","method":"GET","path":"/v1/web_screenshot","summary":"Render a page in a real browser and get back an image of it.","family":"web","price_cents":20,"params":[{"name":"url","type":"string","required":true,"description":"The full URL to render, including protocol. If you do not have the exact URL, find it with your OWN web search first (for example: site:acme.com pricing), or with wuthering_web_search if you have none. A guessed URL renders someone's 404 page as though it were the page you asked for, and an image makes that harder to notice than text does."},{"name":"device","type":"string","required":false,"description":"Which viewport to render at. Defaults to desktop (1920x1080). mobile renders at 390x844 and is the right choice when the question is about the mobile experience, which is often a different layout rather than the same one narrowed.","values":["desktop","mobile","tablet"],"default":"desktop"},{"name":"full_page","type":"boolean","required":false,"description":"Capture the entire scrollable page. Defaults to true. Set false for just what is visible before scrolling, which is what you want when the question is about the first impression rather than the whole document.","default":true},{"name":"hide_cookie_banner","type":"boolean","required":false,"description":"Dismiss the cookie-consent overlay before capturing. Defaults to true, because on most European and many US sites the banner covers the part of the page worth looking at.","default":true}]},{"tool":"web_ocr","method":"GET","path":"/v1/web_ocr","summary":"Extract every character of text from an image and get it back as text.","family":"web","price_cents":20,"params":[{"name":"image","type":"string","required":true,"description":"Direct link to the image to read — the image file itself, not a page that displays it. PNG, JPEG, WebP and GIF are supported. The URL is fetched server-side, so it has to be reachable without a login or a cookie; a host that blocks automated readers will refuse it. An image field returned by wuthering_web_screenshot can be passed here unchanged. To read a file you hold rather than one on the web, POST a data: URL carrying the bytes inline."}]}]}