Local business leads with email and phone, plus hiring and ad signals. For you or your AI agent.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Pullwire API key (starts with af_live_). Get one at https://pullwire.dev/login
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Search amazon.com by keyword and get product listings: title, price, list price, rating, review count, image, badges (Amazon’s Choice / Best Seller) and URL. No login, no browser. Costs 1 credit per result; failed items are free.
One entry per keyword search.
Stop after this many products in total across all searches. Empty: no extra cap.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http pullwire https://pullwire.dev/api/mcp \ --header 'x-api-key: YOUR_X_API_KEY'
Headers
x-api-key (required): Pullwire API key (starts with af_live_). Get one at https://pullwire.dev/loginSearch amazon.com by keyword and get product listings: title, price, list price, rating, review count, image, badges (Amazon’s Choice / Best Seller) and URL. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| searches* | array | One entry per keyword search. |
| maxResults | integer | Stop after this many products in total across all searches. Empty: no extra cap. |
{
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"type": "object",
"required": [
"keywords"
],
"properties": {
"keywords": {
"type": "string",
"title": "Keywords",
"maxLength": 200,
"minLength": 1,
"description": "Search term, e.g. \"wireless mouse\"."
},
"maxResultsPerSearch": {
"type": "integer",
"title": "Max results for this search",
"default": 48,
"maximum": 60,
"minimum": 1,
"description": "Amazon’s first results page holds roughly 16-58 products depending on the query; values above that are capped at whatever the page actually returned."
}
}
},
"title": "Searches",
"examples": [
[
{
"keywords": "wireless mouse"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per keyword search."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many products in total across all searches. Empty: no extra cap."
}
}
}Get the reviews embedded on an amazon.com product page by ASIN or URL: rating, title, date, verified purchase, helpful votes and full text. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| products* | array | One entry per product (ASIN or amazon.com product URL). |
| maxResults | integer | Stop after this many reviews in total across all products. Empty: no extra cap. |
{
"type": "object",
"required": [
"products"
],
"properties": {
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"product"
],
"properties": {
"product": {
"type": "string",
"title": "Product",
"maxLength": 500,
"minLength": 1,
"description": "Amazon ASIN (e.g. \"B0CX23V2ZK\") or a full amazon.com product URL."
},
"maxReviews": {
"type": "integer",
"title": "Max reviews for this product",
"default": 10,
"maximum": 20,
"minimum": 3,
"description": "The embedded widget holds roughly 8-13 reviews depending on the product; values above that are capped at whatever the page actually returned. Minimum 3: fetching the page costs the same regardless of how many reviews you keep, so a 1-review request would not cover that cost at this price (see RE.md \"Cost per result\")."
}
}
},
"title": "Products",
"examples": [
[
{
"product": "B0CX23V2ZK"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per product (ASIN or amazon.com product URL)."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many reviews in total across all products. Empty: no extra cap."
}
}
}Search the Facebook Ad Library by keyword or advertiser Page ID: ad text, images, videos, CTA, run dates and platforms. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| searches* | array | One entry per keyword or advertiser. Each returns the first page of matching ads (see totalMatchingAds/hasMoreResults). |
| maxResults | integer | Stop after this many ads in total. Empty: all ads from all searches. |
{
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"query": {
"type": "string",
"title": "Keyword",
"maxLength": 200,
"minLength": 1,
"description": "Search term, e.g. a brand or product name. Leave empty when searching by Page ID."
},
"pageId": {
"type": "string",
"title": "Page ID",
"pattern": "^\\d+$",
"description": "Numeric Facebook Page ID: returns all ads from that one advertiser instead of a keyword search."
},
"country": {
"type": "string",
"title": "Country",
"default": "US",
"pattern": "^(ALL|[A-Z]{2})$",
"examples": [
"US"
],
"description": "ISO 3166-1 alpha-2 country code (e.g. US, DE, GB) or ALL for worldwide."
},
"activeStatus": {
"enum": [
"active",
"inactive",
"all"
],
"type": "string",
"title": "Active status",
"default": "active",
"description": "Only currently running ads, only stopped ads, or all."
}
}
},
"title": "Searches",
"examples": [
[
{
"query": "nike",
"country": "US",
"activeStatus": "active"
}
]
],
"maxItems": 1000,
"minItems": 1,
"description": "One entry per keyword or advertiser. Each returns the first page of matching ads (see totalMatchingAds/hasMoreResults)."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many ads in total. Empty: all ads from all searches."
}
}
}Search Indeed job postings by keyword, job title, company, location and posted date: title, company, rating, salary, job type, benefits, the full description and the employer’s website and size. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| searches* | array | One entry per search: keywords, job title, company, location and filters. |
| maxResults | integer | Stop after this many jobs in total across all searches. Empty: no extra cap. |
| includeDescription | boolean | Add the full job description text. Fetched in batches of 10 jobs per extra request, same price per job. |
| includeCompanyDetails | boolean | Add the employer’s website, domain, industry, employee range, revenue range and headquarters from its Indeed company page (one extra request per distinct company, same price per job). |
{
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sort": {
"enum": [
"relevance",
"date"
],
"type": "string",
"title": "Sort",
"default": "relevance",
"description": "Indeed’s default relevance ranking, or newest first."
},
"company": {
"type": "string",
"title": "Company",
"maxLength": 120,
"minLength": 1,
"description": "Only jobs from this employer, e.g. \"Salesforce\". Matched on whole words of the employer name, ignoring case and punctuation."
},
"jobTitle": {
"type": "string",
"title": "Job title must contain",
"maxLength": 120,
"minLength": 1,
"description": "Only jobs whose title contains these words, e.g. \"account executive\" or \"head of sales\" (Indeed’s title filter)."
},
"keywords": {
"type": "string",
"title": "Keywords",
"maxLength": 200,
"minLength": 1,
"description": "Free search words: job title, skill or company, e.g. \"warehouse associate\"."
},
"location": {
"type": "string",
"title": "Location",
"maxLength": 200,
"minLength": 1,
"description": "City, state or ZIP, e.g. \"Austin, TX\" or \"90210\"."
},
"datePosted": {
"enum": [
"1",
"3",
"7",
"14",
"any"
],
"type": "string",
"title": "Date posted",
"default": "any",
"description": "Only jobs posted within this many days. \"any\": no limit."
},
"radiusMiles": {
"type": "integer",
"title": "Radius (miles)",
"maximum": 100,
"minimum": 0,
"description": "Search radius around the location, in miles."
},
"maxResultsPerSearch": {
"type": "integer",
"title": "Max results for this search",
"default": 100,
"maximum": 100,
"minimum": 1,
"description": "Indeed’s guest search pages stop paginating past roughly 100 results (start=0..90), so values above 100 are not reachable. When Indeed asks for a sign-in for later pages, the search returns its first page (about 45 jobs) and marks the jobs with searchHasMore."
}
}
},
"title": "Searches",
"examples": [
[
{
"jobTitle": "account executive",
"location": "Austin, TX",
"datePosted": "7"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per search: keywords, job title, company, location and filters."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many jobs in total across all searches. Empty: no extra cap."
},
"includeDescription": {
"type": "boolean",
"title": "Include full description",
"default": true,
"description": "Add the full job description text. Fetched in batches of 10 jobs per extra request, same price per job."
},
"includeCompanyDetails": {
"type": "boolean",
"title": "Include company website and size",
"default": true,
"description": "Add the employer’s website, domain, industry, employee range, revenue range and headquarters from its Indeed company page (one extra request per distinct company, same price per job)."
}
}
}Get public LinkedIn company data from a company URL or website domain: industry, size, employees on LinkedIn, headquarters and address, all locations, website, type, founding year, specialties, followers, similar companies and recent posts. No login. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| companies* | array | LinkedIn company or showcase page URLs (linkedin.com/company/<name>) or company websites/domains (e.g. "hubspot.com"), one per line. A domain is matched to its LinkedIn page through the link on its homepage. One result per company; duplicates are skipped. |
| maxResults | integer | Stop after this many companies. Empty: all of them. |
| includePosts | boolean | Add the latest posts shown on the public page (up to about 10): text, date, likes and link. |
{
"type": "object",
"required": [
"companies"
],
"properties": {
"companies": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"title": "Companies",
"examples": [
[
"https://www.linkedin.com/company/canva",
"hubspot.com"
]
],
"maxItems": 1000,
"minItems": 1,
"description": "LinkedIn company or showcase page URLs (linkedin.com/company/<name>) or company websites/domains (e.g. \"hubspot.com\"), one per line. A domain is matched to its LinkedIn page through the link on its homepage. One result per company; duplicates are skipped."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many companies. Empty: all of them."
},
"includePosts": {
"type": "boolean",
"title": "Include recent posts",
"default": true,
"description": "Add the latest posts shown on the public page (up to about 10): text, date, likes and link."
}
}
}Search LinkedIn job postings by keyword, location, date posted, work type, experience level and job type: title, company, location, full description, seniority, employment type and applicant count. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| searches* | array | One entry per keyword/location combination. |
| maxResults | integer | Stop after this many jobs in total across all searches. Empty: no extra cap. |
| includeDescription | boolean | Fetch each job’s detail page for the full description, seniority, employment type, industries and applicant count. One extra request per job. |
{
"type": "object",
"required": [
"searches"
],
"properties": {
"searches": {
"type": "array",
"items": {
"type": "object",
"properties": {
"jobType": {
"enum": [
"any",
"full-time",
"part-time",
"contract",
"temporary",
"internship",
"volunteer"
],
"type": "string",
"title": "Job type",
"default": "any"
},
"keywords": {
"type": "string",
"title": "Keywords",
"maxLength": 200,
"minLength": 1,
"description": "Job title, skill or company, e.g. \"software engineer\"."
},
"location": {
"type": "string",
"title": "Location",
"maxLength": 200,
"minLength": 1,
"description": "City, region or country, e.g. \"Berlin, Germany\" or \"United States\"."
},
"workType": {
"enum": [
"any",
"onsite",
"remote",
"hybrid"
],
"type": "string",
"title": "Work type",
"default": "any"
},
"datePosted": {
"enum": [
"any",
"past24h",
"pastWeek",
"pastMonth"
],
"type": "string",
"title": "Date posted",
"default": "any",
"description": "Only jobs posted within this window."
},
"distanceMiles": {
"type": "integer",
"title": "Distance (miles)",
"maximum": 100,
"minimum": 1,
"description": "Search radius around the location, in miles."
},
"experienceLevel": {
"enum": [
"any",
"internship",
"entry",
"associate",
"mid-senior",
"director",
"executive"
],
"type": "string",
"title": "Experience level",
"default": "any"
},
"maxResultsPerSearch": {
"type": "integer",
"title": "Max results for this search",
"default": 100,
"maximum": 1000,
"minimum": 1,
"description": "LinkedIn’s guest pages stop returning results past ~1000 regardless of this value."
}
}
},
"title": "Searches",
"examples": [
[
{
"keywords": "software engineer",
"location": "Germany"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per keyword/location combination."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many jobs in total across all searches. Empty: no extra cap."
},
"includeDescription": {
"type": "boolean",
"title": "Include full description",
"default": true,
"description": "Fetch each job’s detail page for the full description, seniority, employment type, industries and applicant count. One extra request per job."
}
}
}Find businesses on Google Maps by type and location (optionally within a radius): name, address, phone, website, rating, reviews, categories and opening hours, plus emails (with the page they were found on), phone numbers and social profiles from each business website. One row per company. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| dedupe | boolean | Return each business only once even when several searches find it. |
| language | string | Language of categories, opening hours and descriptions, e.g. "en", "de", "fr". |
| searches* | array | One entry per business type + location combination. |
| maxResults | integer | Stop after this many businesses in total across all searches. Empty: no extra cap. |
| countryCode | string | Two-letter country code that biases ambiguous place names, e.g. "us" or "de". Empty: none. |
| onePerCompany | boolean | Skip a business whose website domain or phone number was already returned (branches of one company, double listings). Shared hosts like Facebook pages or booking platforms never count as the same company. |
| enrichContacts |
Read subreddit listings, run searches or fetch one post with its comments: title, author, text/body, link, created date and permalink. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| requests* | array | One entry per subreddit listing, search or single post. |
| maxResults | integer | Stop after this many posts+comments in total across all requests. Empty: no extra cap. |
| includeComments | boolean | Fetch each found post’s top comments too (one extra request per post, capped by that request’s "Max comments"). kind=post always includes comments regardless of this flag. |
{
"type": "object",
"required": [
"requests"
],
"properties": {
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"enum": [
"subreddit",
"search",
"post"
],
"type": "string",
"title": "Kind",
"description": "subreddit: list a subreddit’s posts. search: reddit-wide or subreddit-scoped post search. post: one post plus its comments."
},
"sort": {
"enum": [
"hot",
"new",
"top",
"rising",
"controversial",
"relevance",
"comments"
],
"type": "string",
"title": "Sort",
"description": "kind=subreddit: hot/new/top/rising/controversial (default hot). kind=search: relevance/hot/top/new/comments (default relevance). Ignored for kind=post."
},
"time": {
"enum": [
"hour",
"day",
"week",
"month",
"year",
"all"
],
"type": "string",
"title": "Time window",
"default": "all",
"description": "Used only with sort=top/controversial (subreddit) and for every search."
},
"limit": {
"type": "integer",
"title": "Max posts for this request",
"default": 25,
"maximum": 100,
"minimum": 1,
"description": "kind=subreddit/search only. Reddit returns at most 100 per page; more are fetched by following its pagination cursor up to this count."
},
"query": {
"type": "string",
"title": "Search query",
"maxLength": 512,
"minLength": 1,
"description": "Required for kind=search."
},
"postUrl": {
"type": "string",
"title": "Post URL or id",
"maxLength": 500,
"minLength": 1,
"description": "Required for kind=post: a reddit.com post URL (e.g. https://www.reddit.com/r/programming/comments/abc123/title/), a redd.it shortlink, a fullname (t3_abc123) or a bare post id."
},
"subreddit": {
"type": "string",
"title": "Subreddit",
"maxLength": 100,
"minLength": 1,
"description": "Name without r/, e.g. \"programming\". Required for kind=subreddit; restricts kind=search to this subreddit when set."
},
"commentSort": {
"enum": [
"confidence",
"top",
"new",
"controversial",
"old",
"qa"
],
"type": "string",
"title": "Comment sort",
"default": "top"
},
"maxComments": {
"type": "integer",
"title": "Max comments",
"default": 20,
"maximum": 200,
"minimum": 0,
"description": "kind=post: comments to return (all reply levels in thread order, as one page of reddit’s comment feed returns them; collapsed \"load more\" threads are not followed). kind=subreddit/search: used only when the run-level \"Include comments\" flag is on."
}
}
},
"title": "Requests",
"examples": [
[
{
"kind": "subreddit",
"sort": "hot",
"limit": 10,
"subreddit": "programming"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per subreddit listing, search or single post."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many posts+comments in total across all requests. Empty: no extra cap."
},
"includeComments": {
"type": "boolean",
"title": "Include comments for subreddit/search posts",
"default": false,
"description": "Fetch each found post’s top comments too (one extra request per post, capped by that request’s \"Max comments\"). kind=post always includes comments regardless of this flag."
}
}
}Turn any public web page into clean, LLM-ready Markdown, raw HTML or JSON fields picked with CSS selectors. Optional JavaScript rendering, screenshots and an automatic residential-proxy fallback when a site blocks. Costs from 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| url | string | The page to scrape. |
| urls | array | Several pages in one run (up to 20); one result per page. |
| proxy | string | auto: direct first, residential proxy only if the site blocks us. none: never a proxy. residential: always. |
| format | string | markdown: clean, LLM-ready text of the page. html: the page HTML. json: the fields from `extract`. |
| country | string | Exit country for the residential proxy (two-letter code). |
| extract | object | For format json: field name -> CSS selector, or {selector, attribute, all}. attribute reads e.g. href/src/content ("html" = inner HTML); all returns every match. |
| waitFor | string | With renderJs: a CSS selector to wait for, or a delay in milliseconds (e.g. 2000, max 15000). |
| renderJs |
Search results from Bing and DuckDuckGo as structured JSON: organic results with position, title, URL and snippet, Bing ads and related searches, result count, pagination, country and language. No browser, no Google. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| engine | string | Bing returns organic results, ads, related searches and the result count. DuckDuckGo returns organic results; its related searches come from DuckDuckGo’s own query suggestions and it shows no ads on this route. |
| country | string | Two-letter country code for the result market, e.g. "us", "gb", "de". Empty: the engine picks the market (Bing by location, DuckDuckGo "All regions"). |
| queries* | array | One search per entry, exactly as you would type it into the search box. Operators like site: work. |
| language | string | Interface and result language, e.g. "en", "de", "fr". For DuckDuckGo it picks between a country’s regions (e.g. Canada + fr). |
| maxResults | integer | Stop after this many result pages in total across all queries. Empty: no extra cap. |
| maxPagesPerQuery | integer | How many result pages to fetch for each query (about 10 organic results per page). |
Scrape public Threads posts by keyword search, profile or post URL: text, author, likes, replies, reposts, images, videos, links, mentions, profile details and the first page of replies. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| postUrls | array | Links to single Threads posts. Returns the post and, if enabled, its replies. |
| usernames | array | Usernames or profile URLs. Returns the profile details and its latest public threads (Threads shows ~5 without an account). |
| maxResults | integer | Stop after this many posts in total. Empty: no extra cap. |
| searchQueries | array | Keywords or #hashtags to search on Threads. Each search returns the top ~20 matching threads (what Threads shows without an account). |
| includeReplies | boolean | For post URLs: also return the author’s follow-up posts and the first page of replies (~10, what Threads shows without an account). |
{
"type": "object",
"properties": {
"postUrls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"title": "Post URLs",
"default": [],
"maxItems": 100,
"description": "Links to single Threads posts. Returns the post and, if enabled, its replies."
},
"usernames": {
"type": "array",
"items": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"title": "Profiles",
"default": [],
"maxItems": 100,
"description": "Usernames or profile URLs. Returns the profile details and its latest public threads (Threads shows ~5 without an account)."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many posts in total. Empty: no extra cap."
},
"searchQueries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"title": "Search keywords",
"default": [],
"examples": [
[
"coffee"
]
],
"maxItems": 100,
"description": "Keywords or #hashtags to search on Threads. Each search returns the top ~20 matching threads (what Threads shows without an account)."
},
"includeReplies": {
"type": "boolean",
"title": "Include replies",
"default": true,
"description": "For post URLs: also return the author’s follow-up posts and the first page of replies (~10, what Threads shows without an account)."
}
}
}Get email addresses, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles from a list of company websites: homepage plus contact and imprint pages. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| websites* | array | Company domains or website URLs, one per line, e.g. "kaercher.com" or "www.example-bakery.de/kontakt". One result per website; duplicates are skipped. |
| maxResults | integer | Stop after this many websites. Empty: all of them. |
| maxPagesPerWebsite | integer | Homepage plus up to this many minus one contact, imprint or about pages. Extra pages are only visited while an email or a phone number is still missing. |
{
"type": "object",
"required": [
"websites"
],
"properties": {
"websites": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"title": "Websites",
"examples": [
[
"kaercher.com",
"myrescueplumbing.com"
]
],
"maxItems": 5000,
"minItems": 1,
"description": "Company domains or website URLs, one per line, e.g. \"kaercher.com\" or \"www.example-bakery.de/kontakt\". One result per website; duplicates are skipped."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many websites. Empty: all of them."
},
"maxPagesPerWebsite": {
"type": "integer",
"title": "Pages per website",
"default": 3,
"maximum": 5,
"minimum": 1,
"description": "Homepage plus up to this many minus one contact, imprint or about pages. Extra pages are only visited while an email or a phone number is still missing."
}
}
}Transcripts of YouTube videos with timestamps, chapters, language choice and video metadata. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| videos* | array | YouTube video URLs (watch, youtu.be, shorts, embed, live) or 11-character video IDs. |
| languages | array | Language codes in order of preference, e.g. de, en, pt-BR. Empty: the original transcript. If none is available, the default transcript is returned with languageMatched = false. |
| maxResults | integer | Stop after this many transcripts. Empty: all videos. |
| preferManual | boolean | Use uploaded captions over auto-generated ones when both exist for a language. |
| includeMetadata | boolean | Adds title and channel. Views, duration, publish date and the language list are added when YouTube provides them. |
| includeSegments | boolean | Adds the transcript split into segments with start and end time in seconds. |
{
"type": "object",
"required": [
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"title": "Videos",
"examples": [
[
"https://www.youtube.com/watch?v=jNQXAC9IVRw"
]
],
"maxItems": 10000,
"minItems": 1,
"description": "YouTube video URLs (watch, youtu.be, shorts, embed, live) or 11-character video IDs."
},
"languages": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,4})?$"
},
"title": "Preferred languages",
"default": [],
"maxItems": 5,
"description": "Language codes in order of preference, e.g. de, en, pt-BR. Empty: the original transcript. If none is available, the default transcript is returned with languageMatched = false."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many transcripts. Empty: all videos."
},
"preferManual": {
"type": "boolean",
"title": "Prefer human-made captions",
"default": true,
"description": "Use uploaded captions over auto-generated ones when both exist for a language."
},
"includeMetadata": {
"type": "boolean",
"title": "Include video metadata",
"default": true,
"description": "Adds title and channel. Views, duration, publish date and the language list are added when YouTube provides them."
},
"includeSegments": {
"type": "boolean",
"title": "Include timed segments",
"default": true,
"description": "Adds the transcript split into segments with start and end time in seconds."
}
}
}Search Zillow for-sale listings by city/location: price, beds, baths, square footage, Zestimate, home type and status. No login, no browser. Costs 1 credit per result; failed items are free.
| Argument | Type | Description |
|---|---|---|
| locations* | array | One entry per city/location to search. |
| maxResults | integer | Stop after this many listings in total across all locations. Empty: no extra cap. |
{
"type": "object",
"required": [
"locations"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "object",
"required": [
"location"
],
"properties": {
"location": {
"type": "string",
"title": "Location",
"maxLength": 300,
"minLength": 1,
"description": "City + state, e.g. \"Seattle, WA\", the zillow.com URL slug \"seattle-wa\", or a zillow.com location URL like https://www.zillow.com/seattle-wa/."
},
"maxResultsPerLocation": {
"type": "integer",
"title": "Max results for this location",
"default": 100,
"maximum": 820,
"minimum": 1,
"description": "Stops paginating once this many listings are collected for this location. Zillow itself shows at most 20 pages (about 820 listings) per search, so 820 is the maximum."
}
}
},
"title": "Locations",
"examples": [
[
{
"location": "Seattle, WA"
}
]
],
"maxItems": 20,
"minItems": 1,
"description": "One entry per city/location to search."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many listings in total across all locations. Empty: no extra cap."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.
| boolean |
| Visit each business website (homepage plus contact, imprint or privacy pages when needed) to collect email addresses, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles. |
| maxContactPages | integer | Homepage plus up to this many minus one contact, imprint or privacy pages, only while no address of the business itself has been found (an agency or platform address alone does not count). |
{
"type": "object",
"required": [
"searches"
],
"properties": {
"dedupe": {
"type": "boolean",
"title": "Skip duplicates across searches",
"default": true,
"description": "Return each business only once even when several searches find it."
},
"language": {
"type": "string",
"title": "Language",
"default": "en",
"pattern": "^[a-z]{2,3}(-[A-Za-z]{2,4})?$",
"description": "Language of categories, opening hours and descriptions, e.g. \"en\", \"de\", \"fr\"."
},
"searches": {
"type": "array",
"items": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"title": "Business type or keyword",
"maxLength": 200,
"minLength": 1,
"description": "What to look for, as you would type it into Google Maps, e.g. \"dentist\", \"plumber\", \"vegan restaurant\"."
},
"location": {
"type": "string",
"title": "Location",
"maxLength": 200,
"minLength": 1,
"description": "City, district, region or country, e.g. \"Berlin, Germany\" or \"Austin, TX\". Empty: the query is used as-is."
},
"radiusKm": {
"type": "number",
"title": "Radius (km)",
"maximum": 100,
"minimum": 0.1,
"description": "Only businesses within this distance of the location's center, e.g. 3 for \"within 3 km of Berlin-Kreuzberg\", sorted nearest first among the ~120-200 places Google Maps returns for that area. Needs a location. Empty: the area Google Maps picks for the location."
},
"maxResultsPerSearch": {
"type": "integer",
"title": "Max results for this search",
"default": 100,
"maximum": 400,
"minimum": 1,
"description": "Stop this search after this many businesses. Google Maps itself returns roughly 120-200 places per search; for more, split the area into districts or nearby towns."
}
}
},
"title": "Searches",
"examples": [
[
{
"query": "dentist",
"location": "Berlin, Germany"
}
]
],
"maxItems": 50,
"minItems": 1,
"description": "One entry per business type + location combination."
},
"maxResults": {
"type": "integer",
"title": "Max results",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many businesses in total across all searches. Empty: no extra cap."
},
"countryCode": {
"type": "string",
"title": "Country bias",
"pattern": "^[A-Za-z]{2}$",
"description": "Two-letter country code that biases ambiguous place names, e.g. \"us\" or \"de\". Empty: none."
},
"onePerCompany": {
"type": "boolean",
"title": "One row per company",
"default": true,
"description": "Skip a business whose website domain or phone number was already returned (branches of one company, double listings). Shared hosts like Facebook pages or booking platforms never count as the same company."
},
"enrichContacts": {
"type": "boolean",
"title": "Find emails and social profiles",
"default": true,
"description": "Visit each business website (homepage plus contact, imprint or privacy pages when needed) to collect email addresses, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles."
},
"maxContactPages": {
"type": "integer",
"title": "Website pages per business",
"default": 3,
"maximum": 3,
"minimum": 1,
"description": "Homepage plus up to this many minus one contact, imprint or privacy pages, only while no address of the business itself has been found (an agency or platform address alone does not count)."
}
}
}| boolean |
| Load the page in a headless browser first (for sites that build their content with JS). |
| timeoutMs | integer | Per page, for loading (and rendering). |
| screenshot | boolean | With renderJs: a PNG of the viewport, returned as a signed download URL (valid 7 days). |
| onlyMainContent | boolean | Markdown: drop navigation, cookie banners, sidebars and footers. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"title": "URL",
"maxLength": 2048,
"minLength": 1,
"description": "The page to scrape."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048,
"minLength": 1
},
"title": "URLs",
"examples": [
[
"https://example.com/"
]
],
"maxItems": 20,
"minItems": 1,
"description": "Several pages in one run (up to 20); one result per page."
},
"proxy": {
"enum": [
"auto",
"none",
"residential"
],
"type": "string",
"title": "Proxy",
"default": "auto",
"description": "auto: direct first, residential proxy only if the site blocks us. none: never a proxy. residential: always."
},
"format": {
"enum": [
"markdown",
"html",
"json"
],
"type": "string",
"title": "Output format",
"default": "markdown",
"description": "markdown: clean, LLM-ready text of the page. html: the page HTML. json: the fields from `extract`."
},
"country": {
"type": "string",
"title": "Country",
"pattern": "^[A-Za-z]{2}$",
"description": "Exit country for the residential proxy (two-letter code)."
},
"extract": {
"type": "object",
"title": "Extraction rules",
"description": "For format json: field name -> CSS selector, or {selector, attribute, all}. attribute reads e.g. href/src/content (\"html\" = inner HTML); all returns every match.",
"propertyNames": {
"type": "string",
"pattern": "^[A-Za-z_][\\w-]{0,63}$"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 500,
"minLength": 1
},
{
"type": "object",
"required": [
"selector"
],
"properties": {
"all": {
"type": "boolean"
},
"selector": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"attribute": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
}
]
}
},
"waitFor": {
"type": "string",
"title": "Wait for",
"maxLength": 300,
"minLength": 1,
"description": "With renderJs: a CSS selector to wait for, or a delay in milliseconds (e.g. 2000, max 15000)."
},
"renderJs": {
"type": "boolean",
"title": "Render JavaScript",
"default": false,
"description": "Load the page in a headless browser first (for sites that build their content with JS)."
},
"timeoutMs": {
"type": "integer",
"title": "Timeout (ms)",
"default": 20000,
"maximum": 60000,
"minimum": 2000,
"description": "Per page, for loading (and rendering)."
},
"screenshot": {
"type": "boolean",
"title": "Screenshot",
"default": false,
"description": "With renderJs: a PNG of the viewport, returned as a signed download URL (valid 7 days)."
},
"onlyMainContent": {
"type": "boolean",
"title": "Main content only",
"default": true,
"description": "Markdown: drop navigation, cookie banners, sidebars and footers."
}
}
}| includeRelatedSearches |
| boolean |
| Include related searches. Free on Bing (same page); one extra request per query on DuckDuckGo. |
{
"type": "object",
"required": [
"queries"
],
"properties": {
"engine": {
"enum": [
"bing",
"duckduckgo"
],
"type": "string",
"title": "Search engine",
"default": "bing",
"description": "Bing returns organic results, ads, related searches and the result count. DuckDuckGo returns organic results; its related searches come from DuckDuckGo’s own query suggestions and it shows no ads on this route."
},
"country": {
"type": "string",
"title": "Country",
"pattern": "^[a-z]{2}$",
"description": "Two-letter country code for the result market, e.g. \"us\", \"gb\", \"de\". Empty: the engine picks the market (Bing by location, DuckDuckGo \"All regions\")."
},
"queries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"title": "Search queries",
"examples": [
[
"best running shoes"
]
],
"maxItems": 100,
"minItems": 1,
"description": "One search per entry, exactly as you would type it into the search box. Operators like site: work."
},
"language": {
"type": "string",
"title": "Language",
"pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z]{2,4})?$",
"description": "Interface and result language, e.g. \"en\", \"de\", \"fr\". For DuckDuckGo it picks between a country’s regions (e.g. Canada + fr)."
},
"maxResults": {
"type": "integer",
"title": "Max result pages",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Stop after this many result pages in total across all queries. Empty: no extra cap."
},
"maxPagesPerQuery": {
"type": "integer",
"title": "Pages per query",
"default": 1,
"maximum": 10,
"minimum": 1,
"description": "How many result pages to fetch for each query (about 10 organic results per page)."
},
"includeRelatedSearches": {
"type": "boolean",
"title": "Related searches",
"default": true,
"description": "Include related searches. Free on Bing (same page); one extra request per query on DuckDuckGo."
}
}
}