{"openapi":"3.0.3","info":{"title":"Wuthering AI API","version":"1.0.0","description":"Live market, competitor, advertising, app-store and web data, one GET per question. Authenticate with `?token=<token>` on the URL or `Authorization: Bearer <token>`; tokens come from the dashboard. Responses are complete JSON — nothing is trimmed or paginated away."},"servers":[{"url":"https://wutheringai.com"}],"paths":{"/v1/keyword_ideas":{"get":{"operationId":"keyword_ideas","summary":"Keyword ideas from seed terms","description":"Expand a handful of seed terms into the wider set of things people actually search.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"offset","in":"query","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_ideas_post","summary":"Keyword ideas from seed terms (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":200,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_suggestions":{"get":{"operationId":"keyword_suggestions","summary":"Long-tail phrasings of one keyword","description":"Find the longer, more specific phrases built around a single term.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keyword","in":"query","required":true,"description":"The single seed keyword to expand.","schema":{"type":"string","minLength":1,"description":"The single seed keyword to expand."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"offset","in":"query","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_suggestions_post","summary":"Long-tail phrasings of one keyword (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","minLength":1,"description":"The single seed keyword to expand."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}},"required":["keyword"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_related":{"get":{"operationId":"keyword_related","summary":"Keywords searchers also look for","description":"Walk outward from one keyword through what else the same people search.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keyword","in":"query","required":true,"description":"The keyword to traverse outward from.","schema":{"type":"string","minLength":1,"description":"The keyword to traverse outward from."}},{"name":"depth","in":"query","required":false,"description":"How far to traverse (0 to 4, default 1). Each level multiplies results sharply.","schema":{"type":"integer","minimum":0,"maximum":4,"default":1,"description":"How far to traverse (0 to 4, default 1). Each level multiplies results sharply."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_related_post","summary":"Keywords searchers also look for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","minLength":1,"description":"The keyword to traverse outward from."},"depth":{"type":"integer","minimum":0,"maximum":4,"default":1,"description":"How far to traverse (0 to 4, default 1). Each level multiplies results sharply."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["keyword"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_overview":{"get":{"operationId":"keyword_overview","summary":"Full metrics for known keywords","description":"Get every available metric, including trend, for keywords you already have.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_overview_post","summary":"Full metrics for known keywords (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":700,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_volume":{"get":{"operationId":"keyword_volume","summary":"Search volume and cost for a keyword list","description":"Price up to 1,000 keywords in a single billed call.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_volume_post","summary":"Search volume and cost for a keyword list (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":1000,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_from_seeds":{"get":{"operationId":"keyword_from_seeds","summary":"Bulk ideas from up to 20 seeds","description":"Turn a small seed set into a very large idea list in one call.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_from_seeds_post","summary":"Bulk ideas from up to 20 seeds (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":20,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_intent":{"get":{"operationId":"keyword_intent","summary":"What a searcher is trying to do","description":"Classify keywords as informational, commercial, navigational, or transactional.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_intent_post","summary":"What a searcher is trying to do (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":1000,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_difficulty":{"get":{"operationId":"keyword_difficulty","summary":"How hard keywords are to rank for","description":"Score up to 1,000 keywords 0-100 on ranking difficulty.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_difficulty_post","summary":"How hard keywords are to rank for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":1000,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_history":{"get":{"operationId":"keyword_history","summary":"Search volume month by month","description":"Get multi-year monthly search history for a keyword list.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_history_post","summary":"Search volume month by month (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":700,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_top_searches":{"get":{"operationId":"keyword_top_searches","summary":"Highest-volume keywords in a market","description":"List the most-searched terms for a location, with optional filtering.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"offset","in":"query","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_top_searches_post","summary":"Highest-volume keywords in a market (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/keyword_forecast":{"get":{"operationId":"keyword_forecast","summary":"Forecast clicks and spend for keywords","description":"Estimate the clicks, cost, and CPC a keyword set would produce at a given bid.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"bid","in":"query","required":true,"description":"Maximum cost-per-click bid in whole currency units, for example 5 for $5.00.","schema":{"type":"number","exclusiveMinimum":true,"minimum":0,"description":"Maximum cost-per-click bid in whole currency units, for example 5 for $5.00."}},{"name":"match","in":"query","required":false,"description":"Keyword match type. 'exact' gives the most conservative estimate.","schema":{"type":"string","enum":["exact","broad","phrase"],"default":"exact","description":"Keyword match type. 'exact' gives the most conservative estimate."}},{"name":"date_interval","in":"query","required":false,"description":"Forecast window. Defaults to 'next_month'.","schema":{"type":"string","enum":["next_week","next_month","next_quarter"],"default":"next_month","description":"Forecast window. Defaults to 'next_month'."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"keyword_forecast_post","summary":"Forecast clicks and spend for keywords (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["keyword"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":1000,"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."},"bid":{"type":"number","exclusiveMinimum":true,"minimum":0,"description":"Maximum cost-per-click bid in whole currency units, for example 5 for $5.00."},"match":{"type":"string","enum":["exact","broad","phrase"],"default":"exact","description":"Keyword match type. 'exact' gives the most conservative estimate."},"date_interval":{"type":"string","enum":["next_week","next_month","next_quarter"],"default":"next_month","description":"Forecast window. Defaults to 'next_month'."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keywords","bid"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_rankings":{"get":{"operationId":"domain_rankings","summary":"Keywords a domain ranks for","description":"List every keyword a site ranks for, with position and traffic value.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"offset","in":"query","required":false,"description":"Rows to skip before returning results. Use with limit to page through a large set.","schema":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_rankings_post","summary":"Keywords a domain ranks for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"offset":{"type":"integer","minimum":0,"default":0,"description":"Rows to skip before returning results. Use with limit to page through a large set."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_relevance":{"get":{"operationId":"domain_relevance","summary":"Keywords a site is relevant for","description":"Get the keywords Google associates with a domain, ranked or not.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","required":true,"description":"Domain or page URL to analyse, for example 'example.com'.","schema":{"type":"string","minLength":3,"description":"Domain or page URL to analyse, for example 'example.com'."}},{"name":"target_type","in":"query","required":false,"description":"Treat the target as a whole site or a single page. Defaults to 'site'.","schema":{"type":"string","enum":["site","page"],"default":"site","description":"Treat the target as a whole site or a single page. Defaults to 'site'."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_relevance_post","summary":"Keywords a site is relevant for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain or page URL to analyse, for example 'example.com'."},"target_type":{"type":"string","enum":["site","page"],"default":"site","description":"Treat the target as a whole site or a single page. Defaults to 'site'."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_competitors":{"get":{"operationId":"domain_competitors","summary":"Domains competing for the same keywords","description":"Discover which sites compete with a domain across its whole keyword set.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_competitors_post","summary":"Domains competing for the same keywords (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_serp_rivals":{"get":{"operationId":"domain_serp_rivals","summary":"Who ranks for a specific keyword set","description":"Find the domains that own a particular list of keywords.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keywords","in":"query","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.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_serp_rivals_post","summary":"Who ranks for a specific keyword set (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keywords":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":200,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}},"required":["keywords"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_overview":{"get":{"operationId":"domain_overview","summary":"A domain's search performance at a glance","description":"Get headline organic and paid search metrics for one domain.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_overview_post","summary":"A domain's search performance at a glance (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_history":{"get":{"operationId":"domain_history","summary":"A domain's search performance over time","description":"Track how a domain's organic visibility has moved across months.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_history_post","summary":"A domain's search performance over time (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_keyword_overlap":{"get":{"operationId":"domain_keyword_overlap","summary":"Keywords two domains both rank for","description":"Compare two domains keyword by keyword, with both positions side by side.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target1","in":"query","required":true,"description":"First domain, usually yours, for example 'example.com'.","schema":{"type":"string","minLength":3,"description":"First domain, usually yours, for example 'example.com'."}},{"name":"target2","in":"query","required":true,"description":"Second domain to compare against.","schema":{"type":"string","minLength":3,"description":"Second domain to compare against."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_keyword_overlap_post","summary":"Keywords two domains both rank for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target1":{"type":"string","minLength":3,"description":"First domain, usually yours, for example 'example.com'."},"target2":{"type":"string","minLength":3,"description":"Second domain to compare against."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["target1","target2"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_page_overlap":{"get":{"operationId":"domain_page_overlap","summary":"Keywords two pages both rank for","description":"Compare two specific URLs rather than two whole domains.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"page1","in":"query","required":true,"description":"First page URL, including protocol.","schema":{"type":"string","format":"uri","description":"First page URL, including protocol."}},{"name":"page2","in":"query","required":true,"description":"Second page URL to compare against.","schema":{"type":"string","format":"uri","description":"Second page URL to compare against."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_page_overlap_post","summary":"Keywords two pages both rank for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page1":{"type":"string","format":"uri","description":"First page URL, including protocol."},"page2":{"type":"string","format":"uri","description":"Second page URL to compare against."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["page1","page2"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_top_pages":{"get":{"operationId":"domain_top_pages","summary":"A domain's best-performing pages","description":"Find which pages on a site actually earn its search traffic.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_top_pages_post","summary":"A domain's best-performing pages (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_subdomains":{"get":{"operationId":"domain_subdomains","summary":"Search performance by subdomain","description":"Break a domain's organic performance down across its subdomains.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_subdomains_post","summary":"Search performance by subdomain (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_categories":{"get":{"operationId":"domain_categories","summary":"What categories a domain ranks in","description":"See which product categories a site has search presence in.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"target","in":"query","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.","schema":{"type":"string","minLength":3,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_categories_post","summary":"What categories a domain ranks in (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string","minLength":3,"description":"Domain to analyse, without protocol or path, for example 'example.com'. Works on your own site as readily as a competitor's."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_traffic":{"get":{"operationId":"domain_traffic","summary":"Traffic estimates for many domains","description":"Estimate organic traffic for up to 1,000 domains in one call.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"targets","in":"query","required":true,"description":"Domains to estimate, up to 1,000. One billed call regardless of count.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_traffic_post","summary":"Traffic estimates for many domains (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"string","minLength":3},"minItems":1,"maxItems":1000,"description":"Domains to estimate, up to 1,000. One billed call regardless of count."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["targets"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/domain_traffic_history":{"get":{"operationId":"domain_traffic_history","summary":"Traffic estimates over time","description":"Track estimated organic traffic for several domains across months.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"targets","in":"query","required":true,"description":"Domains to track, up to 1,000.","schema":{"type":"string"},"example":"first,second,third"},{"name":"date_from","in":"query","required":true,"description":"Start date as YYYY-MM-DD.","schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date as YYYY-MM-DD."}},{"name":"date_to","in":"query","required":false,"description":"End date as YYYY-MM-DD. Defaults to the most recent data available.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"description":"End date as YYYY-MM-DD. Defaults to the most recent data available."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"domain_traffic_history_post","summary":"Traffic estimates over time (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["domain"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"targets":{"type":"array","items":{"type":"string","minLength":3},"minItems":1,"maxItems":1000,"description":"Domains to track, up to 1,000."},"date_from":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date as YYYY-MM-DD."},"date_to":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End date as YYYY-MM-DD. Defaults to the most recent data available."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["targets","date_from"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_linkedin_posts":{"get":{"operationId":"social_linkedin_posts","summary":"One published post, in full","description":"Read the full text and engagement of a single published post.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_linkedin_posts_post","summary":"One published post, in full (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_reddit_posts":{"get":{"operationId":"social_reddit_posts","summary":"Reddit posts on a topic","description":"Read Reddit threads where people describe problems in their own words.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_reddit_posts_post","summary":"Reddit posts on a topic (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_reddit_comments":{"get":{"operationId":"social_reddit_comments","summary":"Reddit comment threads","description":"Read the discussion underneath a Reddit post.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_reddit_comments_post","summary":"Reddit comment threads (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_instagram_profile":{"get":{"operationId":"social_instagram_profile","summary":"An Instagram profile","description":"Get a profile's follower count, bio, and account details.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_instagram_profile_post","summary":"An Instagram profile (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_instagram_posts":{"get":{"operationId":"social_instagram_posts","summary":"Instagram posts","description":"Read a profile's posts with captions and engagement.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_instagram_posts_post","summary":"Instagram posts (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_instagram_reels":{"get":{"operationId":"social_instagram_reels","summary":"Instagram reels","description":"Read reels with view counts and captions.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_instagram_reels_post","summary":"Instagram reels (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_youtube_search":{"get":{"operationId":"social_youtube_search","summary":"Search YouTube","description":"Find videos ranking for a search term, with view counts and channels.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keyword","in":"query","required":true,"description":"Search term to look up on YouTube.","schema":{"type":"string","minLength":1,"description":"Search term to look up on YouTube."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_youtube_search_post","summary":"Search YouTube (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","minLength":1,"description":"Search term to look up on YouTube."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["keyword"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_youtube_subtitles":{"get":{"operationId":"social_youtube_subtitles","summary":"A video's full transcript","description":"Read the complete timestamped transcript of a YouTube video.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"video_id","in":"query","required":true,"description":"YouTube video id, the part after v= in a watch URL. Not the full URL.","schema":{"type":"string","minLength":1,"description":"YouTube video id, the part after v= in a watch URL. Not the full URL."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","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.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_youtube_subtitles_post","summary":"A video's full transcript (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"video_id":{"type":"string","minLength":1,"description":"YouTube video id, the part after v= in a watch URL. Not the full URL."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","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."}},"required":["video_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/social_youtube_comments":{"get":{"operationId":"social_youtube_comments","summary":"Comments on a video","description":"Read viewer comments on a YouTube video.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"video_id","in":"query","required":true,"description":"YouTube video id, the part after v= in a watch URL.","schema":{"type":"string","minLength":1,"description":"YouTube video id, the part after v= in a watch URL."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":700,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"social_youtube_comments_post","summary":"Comments on a video (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["social"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"video_id":{"type":"string","minLength":1,"description":"YouTube video id, the part after v= in a watch URL."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":700,"default":100,"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."}},"required":["video_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_search":{"get":{"operationId":"app_search","summary":"Search an app store","description":"Find the apps that rank for a keyword in either app store.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"platform","in":"query","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","schema":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."}},{"name":"keyword","in":"query","required":true,"description":"Search term to look up in the store.","schema":{"type":"string","minLength":1,"description":"Search term to look up in the store."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"depth","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"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."}},{"name":"task_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_search_post","summary":"Search an app store (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."},"keyword":{"type":"string","minLength":1,"description":"Search term to look up in the store."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"depth":{"type":"integer","minimum":1,"maximum":200,"default":50,"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."},"task_id":{"type":"string","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."}},"required":["platform","keyword"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_details":{"get":{"operationId":"app_details","summary":"Full listing for one app","description":"Get the complete store listing for a specific app.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"platform","in":"query","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","schema":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."}},{"name":"app_id","in":"query","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.","schema":{"type":"string","minLength":1,"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","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"task_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_details_post","summary":"Full listing for one app (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."},"app_id":{"type":"string","minLength":1,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"task_id":{"type":"string","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."}},"required":["platform","app_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_reviews":{"get":{"operationId":"app_reviews","summary":"User reviews for an app","description":"Read what users actually say about an app, filtered by rating.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"platform","in":"query","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","schema":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."}},{"name":"app_id","in":"query","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.","schema":{"type":"string","minLength":1,"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","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"sort_by","in":"query","required":false,"description":"Review ordering. 'most_recent' surfaces current problems; 'most_helpful' surfaces the ones other users voted up.","schema":{"type":"string","enum":["most_recent","most_helpful"],"default":"most_recent","description":"Review ordering. 'most_recent' surfaces current problems; 'most_helpful' surfaces the ones other users voted up."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"task_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_reviews_post","summary":"User reviews for an app (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."},"app_id":{"type":"string","minLength":1,"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."},"depth":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"sort_by":{"type":"string","enum":["most_recent","most_helpful"],"default":"most_recent","description":"Review ordering. 'most_recent' surfaces current problems; 'most_helpful' surfaces the ones other users voted up."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"task_id":{"type":"string","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."}},"required":["platform","app_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_top_charts":{"get":{"operationId":"app_top_charts","summary":"Store charts by category","description":"List the top apps in a store category or collection.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"platform","in":"query","required":true,"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play.","schema":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."}},{"name":"app_collection","in":"query","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.","schema":{"type":"string","minLength":1,"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","in":"query","required":false,"description":"Store category to scope the chart to. Omit for overall.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Store category to scope the chart to. Omit for overall."}},{"name":"depth","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"task_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_top_charts_post","summary":"Store charts by category (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","enum":["ios","android"],"description":"Which store to query: 'ios' for the Apple App Store, 'android' for Google Play."},"app_collection":{"type":"string","minLength":1,"description":"Chart to read. iOS: top_free_ios, top_paid_ios, top_grossing_ios, new_ios. Android: topselling_free, topselling_paid, topgrossing, movers_shakers."},"app_category":{"type":"string","description":"Store category to scope the chart to. Omit for overall."},"depth":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"task_id":{"type":"string","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."}},"required":["platform","app_collection"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_keywords":{"get":{"operationId":"app_keywords","summary":"Keywords an app ranks for","description":"Find the App Store search terms an app ranks for, with volume.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"app_id","in":"query","required":true,"description":"Numeric Apple app id. Google Play package names are not accepted.","schema":{"type":"string","minLength":1,"description":"Numeric Apple app id. Google Play package names are not accepted."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_keywords_post","summary":"Keywords an app ranks for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"type":"string","minLength":1,"description":"Numeric Apple app id. Google Play package names are not accepted."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["app_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_competitors":{"get":{"operationId":"app_competitors","summary":"Apps competing for the same keywords","description":"Find the apps that rank for the same App Store terms as yours.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"app_id","in":"query","required":true,"description":"Numeric Apple app id to find competitors for.","schema":{"type":"string","minLength":1,"description":"Numeric Apple app id to find competitors for."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_competitors_post","summary":"Apps competing for the same keywords (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"app_id":{"type":"string","minLength":1,"description":"Numeric Apple app id to find competitors for."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":50,"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."}},"required":["app_id"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_keyword_overlap":{"get":{"operationId":"app_keyword_overlap","summary":"Keywords two apps both rank for","description":"Compare two apps head to head on App Store keywords.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"app_ids","in":"query","required":true,"description":"Numeric Apple app ids to intersect, usually two.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_keyword_overlap_post","summary":"Keywords two apps both rank for (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"app_ids":{"type":"array","items":{"type":"string","minLength":1},"minItems":2,"maxItems":10,"description":"Numeric Apple app ids to intersect, usually two."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":100,"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."}},"required":["app_ids"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/app_metrics":{"get":{"operationId":"app_metrics","summary":"Bulk metrics for several apps","description":"Get comparable App Store metrics for a set of apps in one call.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"app_ids","in":"query","required":true,"description":"Numeric Apple app ids. One flat charge regardless of count.","schema":{"type":"string"},"example":"first,second,third"},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"app_metrics_post","summary":"Bulk metrics for several apps (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["app"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"app_ids":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":1000,"description":"Numeric Apple app ids. One flat charge regardless of count."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},"required":["app_ids"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_profile":{"get":{"operationId":"company_profile","summary":"Company profile and headcount","description":"Look up a company's size, industry, location, and description.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","format":"uri","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."}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","minLength":1}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_profile_post","summary":"Company profile and headcount (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."},"company":{"type":"string","minLength":1,"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."},"domain":{"type":"string","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_funding":{"get":{"operationId":"company_funding","summary":"Funding rounds and investors","description":"Get a company's funding history, investors, and acquisitions.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","format":"uri","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."}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","minLength":1}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_funding_post","summary":"Funding rounds and investors (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."},"company":{"type":"string","minLength":1,"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."},"domain":{"type":"string","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_firmographics":{"get":{"operationId":"company_firmographics","summary":"Revenue band, tech stack, and org shape","description":"Get revenue estimates, technologies in use, and organisational structure.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","format":"uri","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."}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","minLength":1}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_firmographics_post","summary":"Revenue band, tech stack, and org shape (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."},"company":{"type":"string","minLength":1,"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."},"domain":{"type":"string","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_jobs":{"get":{"operationId":"company_jobs","summary":"One job posting, in full","description":"Read a single job listing, including its salary band where one is posted.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_jobs_post","summary":"One job posting, in full (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_person":{"get":{"operationId":"company_person","summary":"One person's professional profile","description":"Look up an individual's role, history, and background.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_person_post","summary":"One person's professional profile (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/company_people_search":{"get":{"operationId":"company_people_search","summary":"Find a person by name","description":"Search for people by first and last name within a profile directory.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","default":"https://www.linkedin.com/search/results/people/","description":"Directory search URL to search within. The default covers the general directory; a company page URL narrows it to that company's people."}},{"name":"first_name","in":"query","required":true,"description":"The person's first name.","schema":{"type":"string","minLength":1,"description":"The person's first name."}},{"name":"last_name","in":"query","required":true,"description":"The person's last name.","schema":{"type":"string","minLength":1,"description":"The person's last name."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"company_people_search_post","summary":"Find a person by name (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["company"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","default":"https://www.linkedin.com/search/results/people/","description":"Directory search URL to search within. The default covers the general directory; a company page URL narrows it to that company's people."},"first_name":{"type":"string","minLength":1,"description":"The person's first name."},"last_name":{"type":"string","minLength":1,"description":"The person's last name."}},"required":["first_name","last_name"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/ads_advertisers":{"get":{"operationId":"ads_advertisers","summary":"Who advertises on a term or domain","description":"Find the companies running ads for a brand or domain, and how many.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"keyword","in":"query","required":false,"description":"Brand or company name to find advertisers for. Use this or target.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Brand or company name to find advertisers for. Use this or target."}},{"name":"target","in":"query","required":false,"description":"Registrable domain to find advertisers for, for example 'acme.com'.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Registrable domain to find advertisers for, for example 'acme.com'."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":120,"default":40,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"ads_advertisers_post","summary":"Who advertises on a term or domain (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","description":"Brand or company name to find advertisers for. Use this or target."},"target":{"type":"string","description":"Registrable domain to find advertisers for, for example 'acme.com'."},"location_code":{"type":"integer","default":2840,"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."},"limit":{"type":"integer","minimum":1,"maximum":120,"default":40,"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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/ads_creatives":{"get":{"operationId":"ads_creatives","summary":"The ads a company is running","description":"List an advertiser's creatives with first-seen and last-seen dates.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"advertiser_id","in":"query","required":false,"description":"Advertiser id from wuthering_ads_advertisers, in the form AR followed by digits.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Advertiser id from wuthering_ads_advertisers, in the form AR followed by digits."}},{"name":"target","in":"query","required":false,"description":"Advertiser's registrable domain, for example 'acme.com', if you have no advertiser id.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Advertiser's registrable domain, for example 'acme.com', if you have no advertiser id."}},{"name":"platform","in":"query","required":false,"description":"Restrict to one surface. Defaults to all surfaces.","schema":{"type":"string","enum":["all","google_play","google_maps","google_search","google_shopping","youtube"],"default":"all","description":"Restrict to one surface. Defaults to all surfaces."}},{"name":"ad_format","in":"query","required":false,"description":"Restrict to one creative format. Defaults to all formats.","schema":{"type":"string","enum":["all","text","image","video"],"default":"all","description":"Restrict to one creative format. Defaults to all formats."}},{"name":"location_code","in":"query","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.","schema":{"type":"integer","default":2840,"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."}},{"name":"language_code","in":"query","required":false,"description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'.","schema":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."}},{"name":"limit","in":"query","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.","schema":{"type":"integer","minimum":1,"maximum":120,"default":40,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"ads_creatives_post","summary":"The ads a company is running (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"advertiser_id":{"type":"string","description":"Advertiser id from wuthering_ads_advertisers, in the form AR followed by digits."},"target":{"type":"string","description":"Advertiser's registrable domain, for example 'acme.com', if you have no advertiser id."},"platform":{"type":"string","enum":["all","google_play","google_maps","google_search","google_shopping","youtube"],"default":"all","description":"Restrict to one surface. Defaults to all surfaces."},"ad_format":{"type":"string","enum":["all","text","image","video"],"default":"all","description":"Restrict to one creative format. Defaults to all formats."},"location_code":{"type":"integer","default":2840,"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."},"language_code":{"type":"string","minLength":2,"maxLength":5,"default":"en","description":"ISO language code for results, for example 'en' or 'de'. Defaults to 'en'."},"limit":{"type":"integer","minimum":1,"maximum":120,"default":40,"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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/ads_meta_library":{"get":{"operationId":"ads_meta_library","summary":"A competitor's Meta ads, as a picture","description":"See the ads an advertiser, domain or phrase is running on Facebook and Instagram, returned as one full-page image.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"page_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"type":"string","enum":["exact","any"],"default":"exact","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."}},{"name":"country","in":"query","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.","schema":{"type":"string","minLength":2,"maxLength":3,"default":"US","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."}},{"name":"active_status","in":"query","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.","schema":{"type":"string","enum":["active","inactive","all"],"default":"active","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."}},{"name":"ad_type","in":"query","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.","schema":{"type":"string","enum":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all","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."}},{"name":"media_type","in":"query","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.","schema":{"type":"string","enum":["all","image","video","meme","image_and_meme","none"],"default":"all","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."}},{"name":"platforms","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"array","items":{"type":"string","enum":["facebook","instagram","audience_network","messenger","whatsapp","oculus","threads"]}}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"array","items":{"type":"string","minLength":2,"maxLength":5}}],"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","in":"query","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.","schema":{"type":"boolean","default":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."}},{"name":"started_after","in":"query","required":false,"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."}},{"name":"started_before","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"ads_meta_library_post","summary":"A competitor's Meta ads, as a picture (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page_id":{"type":"string","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."},"target":{"type":"string","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."},"keyword":{"type":"string","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."},"match":{"type":"string","enum":["exact","any"],"default":"exact","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."},"country":{"type":"string","minLength":2,"maxLength":3,"default":"US","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."},"active_status":{"type":"string","enum":["active","inactive","all"],"default":"active","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."},"ad_type":{"type":"string","enum":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all","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."},"media_type":{"type":"string","enum":["all","image","video","meme","image_and_meme","none"],"default":"all","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."},"platforms":{"type":"array","items":{"type":"string","enum":["facebook","instagram","audience_network","messenger","whatsapp","oculus","threads"]},"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."},"languages":{"type":"array","items":{"type":"string","minLength":2,"maxLength":5},"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."},"targeted_country":{"type":"boolean","default":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."},"started_after":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."},"started_before":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/ads_meta_advertisers":{"get":{"operationId":"ads_meta_advertisers","summary":"Who advertises on Meta, and their page ids","description":"Turn a domain, brand or phrase into the Meta advertisers behind it, with page ids and their current ads as rows.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"page_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"type":"string","enum":["exact","any"],"default":"exact","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."}},{"name":"country","in":"query","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.","schema":{"type":"string","minLength":2,"maxLength":3,"default":"US","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."}},{"name":"active_status","in":"query","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.","schema":{"type":"string","enum":["active","inactive","all"],"default":"active","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."}},{"name":"ad_type","in":"query","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.","schema":{"type":"string","enum":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all","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."}},{"name":"media_type","in":"query","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.","schema":{"type":"string","enum":["all","image","video","meme","image_and_meme","none"],"default":"all","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."}},{"name":"platforms","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"array","items":{"type":"string","enum":["facebook","instagram","audience_network","messenger","whatsapp","oculus","threads"]}}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"array","items":{"type":"string","minLength":2,"maxLength":5}}],"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","in":"query","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.","schema":{"type":"boolean","default":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."}},{"name":"started_after","in":"query","required":false,"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."}},{"name":"started_before","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"ads_meta_advertisers_post","summary":"Who advertises on Meta, and their page ids (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"page_id":{"type":"string","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."},"target":{"type":"string","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."},"keyword":{"type":"string","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."},"match":{"type":"string","enum":["exact","any"],"default":"exact","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."},"country":{"type":"string","minLength":2,"maxLength":3,"default":"US","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."},"active_status":{"type":"string","enum":["active","inactive","all"],"default":"active","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."},"ad_type":{"type":"string","enum":["all","political_and_issue_ads","housing_ads","employment_ads","financial_products_and_services_ads"],"default":"all","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."},"media_type":{"type":"string","enum":["all","image","video","meme","image_and_meme","none"],"default":"all","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."},"platforms":{"type":"array","items":{"type":"string","enum":["facebook","instagram","audience_network","messenger","whatsapp","oculus","threads"]},"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."},"languages":{"type":"array","items":{"type":"string","minLength":2,"maxLength":5},"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."},"targeted_country":{"type":"boolean","default":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."},"started_after":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only ads that began running on or after this date, as YYYY-MM-DD. Meta's library starts in 2019."},"started_before":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/ads_linkedin_advertisers":{"get":{"operationId":"ads_linkedin_advertisers","summary":"Who advertises on LinkedIn, and what they say","description":"Turn a company, advertiser name, payer or phrase into the LinkedIn advertisers behind it, with their ads as rows.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"company_id","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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","in":"query","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.","schema":{"type":"string","pattern":"^([A-Za-z]{2}|[Aa][Ll][Ll])$","default":"US","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."}},{"name":"started_after","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"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","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}],"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","in":"query","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.","schema":{"type":"string","enum":["newest","oldest"],"default":"newest","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."}},{"name":"page_token","in":"query","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.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"ads_linkedin_advertisers_post","summary":"Who advertises on LinkedIn, and what they say (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["ads"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_id":{"type":"string","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."},"advertiser":{"type":"string","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."},"keyword":{"type":"string","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."},"payer":{"type":"string","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."},"country":{"type":"string","pattern":"^([A-Za-z]{2}|[Aa][Ll][Ll])$","default":"US","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."},"started_after":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","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."},"started_before":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","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."},"sort":{"type":"string","enum":["newest","oldest"],"default":"newest","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."},"page_token":{"type":"string","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."}},"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/web_search":{"get":{"operationId":"web_search","summary":"Search the web","description":"Run a search engine query and get the result list back.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"query","in":"query","required":true,"description":"The search query. Supports operators: site:example.com restricts to one domain, and quoting a phrase requires an exact match.","schema":{"type":"string","minLength":1,"description":"The search query. Supports operators: site:example.com restricts to one domain, and quoting a phrase requires an exact match."}},{"name":"engine","in":"query","required":false,"description":"Which search engine to query. Defaults to google.","schema":{"type":"string","enum":["google","bing","yandex"],"default":"google","description":"Which search engine to query. Defaults to google."}},{"name":"geo_location","in":"query","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.","schema":{"type":"string","minLength":2,"maxLength":2,"default":"us","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."}},{"name":"cursor","in":"query","required":false,"description":"Pagination cursor from a previous response's next page.","schema":{"anyOf":[{"not":{}},{"type":"string"}],"description":"Pagination cursor from a previous response's next page."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"web_search_post","summary":"Search the web (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"The search query. Supports operators: site:example.com restricts to one domain, and quoting a phrase requires an exact match."},"engine":{"type":"string","enum":["google","bing","yandex"],"default":"google","description":"Which search engine to query. Defaults to google."},"geo_location":{"type":"string","minLength":2,"maxLength":2,"default":"us","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."},"cursor":{"type":"string","description":"Pagination cursor from a previous response's next page."}},"required":["query"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/web_fetch":{"get":{"operationId":"web_fetch","summary":"Read any web page","description":"Fetch a page as clean markdown or raw HTML, including sites that block bots.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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","in":"query","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.","schema":{"type":"string","enum":["markdown","html"],"default":"markdown","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"web_fetch_post","summary":"Read any web page (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."},"format":{"type":"string","enum":["markdown","html"],"default":"markdown","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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/web_screenshot":{"get":{"operationId":"web_screenshot","summary":"Screenshot any web page","description":"Render a page in a real browser and get back an image of it.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"url","in":"query","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.","schema":{"type":"string","format":"uri","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","in":"query","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.","schema":{"type":"string","enum":["desktop","mobile","tablet"],"default":"desktop","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."}},{"name":"full_page","in":"query","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.","schema":{"type":"boolean","default":true,"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."}},{"name":"hide_cookie_banner","in":"query","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.","schema":{"type":"boolean","default":true,"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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"web_screenshot_post","summary":"Screenshot any web page (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri","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."},"device":{"type":"string","enum":["desktop","mobile","tablet"],"default":"desktop","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."},"full_page":{"type":"boolean","default":true,"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."},"hide_cookie_banner":{"type":"boolean","default":true,"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."}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}},"/v1/web_ocr":{"get":{"operationId":"web_ocr","summary":"Read the text in an image","description":"Extract every character of text from an image and get it back as text.\n\nCosts 20¢ per successful call. Failed calls are not charged.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"parameters":[{"name":"image","in":"query","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.","schema":{"type":"string","format":"uri","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."}}],"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}},"post":{"operationId":"web_ocr_post","summary":"Read the text in an image (JSON body)","description":"The same call with parameters as a JSON object, for values that do not fit a query string.","tags":["web"],"security":[{"bearerToken":[]},{"queryToken":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","format":"uri","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."}},"required":["image"],"additionalProperties":false}}}},"responses":{"200":{"$ref":"#/components/responses/ToolResult"},"400":{"$ref":"#/components/responses/InvalidParams"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredit"},"415":{"$ref":"#/components/responses/UnsupportedMediaType"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/UpstreamError"}}}}},"components":{"securitySchemes":{"bearerToken":{"type":"http","scheme":"bearer","description":"An API token issued on the dashboard."},"queryToken":{"type":"apiKey","in":"query","name":"token","description":"The same API token, as a query parameter — one pasted URL is a working call."}},"responses":{"ToolResult":{"description":"The tool's result.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"description":"The full result payload."},"meta":{"type":"object","properties":{"tool":{"type":"string"},"cost_cents":{"type":"integer"},"balance_cents":{"type":"integer"},"request_id":{"type":"string"},"elapsed_ms":{"type":"integer"}}}},"required":["data","meta"]}}}},"InvalidParams":{"description":"A parameter failed validation.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"UnsupportedMediaType":{"description":"The body was not sent as `application/json`, so it was not read.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"Unauthorized":{"description":"The bearer token is missing or invalid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"InsufficientCredit":{"description":"The account balance cannot cover this call.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"RateLimited":{"description":"Too many calls in this window; see Retry-After.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}},"UpstreamError":{"description":"The data source failed or timed out.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"docs_url":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}}}}}}