{"openapi":"3.1.0","info":{"title":"Pullwire API","version":"v1","description":"Web data tools for AI agents: one API key, one credit balance. Send your key in the x-api-key header or as \"Authorization: Bearer <key>\"."},"servers":[{"url":"https://pullwire.dev"}],"tags":[{"name":"tools","description":"The tool catalog"},{"name":"runs","description":"Run a tool and fetch its results"},{"name":"account","description":"Your org and credit balance"},{"name":"datasets","description":"Stored results of large runs, downloadable for 30 days"}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"},"BearerAuth":{"type":"http","scheme":"bearer","description":"The same API key as a Bearer token: \"Authorization: Bearer af_live_…\"."}},"schemas":{"Error":{"type":"object","description":"Every error has the same shape: a stable machine-readable code and a human message.","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"UNAUTHORIZED (401), INVALID_INPUT (400), NOT_FOUND (404), INSUFFICIENT_CREDITS (402), RATE_LIMITED (429), SERVICE_UNAVAILABLE (503), TOOL_UNAVAILABLE (503, latest checks of this tool failed, nothing reserved), UPSTREAM_ERROR (502), INTERNAL_ERROR (500)."},"message":{"type":"string"},"runId":{"type":"string","format":"uuid","description":"Present when the error happened after the run was created (e.g. a run that crashed after producing results). Partial results were charged and can be fetched via GET /runs/{runId}/results."},"retryAfterSeconds":{"type":"integer","description":"Only on 429 RATE_LIMITED: seconds until this key may call again. Same value as the Retry-After header."}},"required":["code","message"]}},"required":["error"]},"Run":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"orgId":{"type":"string","format":"uuid"},"toolId":{"type":"string"},"input":{"description":"The validated input the run was started with."},"status":{"type":"string","enum":["queued","running","awaiting_fulfilment","processing","succeeded","failed"],"description":"awaiting_fulfilment and processing are only used by seller listings that are delivered later."},"source":{"type":"string","enum":["dashboard","api","mcp"]},"resultsCount":{"type":"integer"},"creditsUsed":{"type":"integer"},"costUsd":{"type":["number","null"]},"durationMs":{"type":["integer","null"]},"error":{"type":["string","null"],"description":"Why the run failed or stopped early, e.g. 'Stopped at the 25 s deadline.' or 'The run stopped early (BLOCKED).'. Null on a run that completed. A 'succeeded' run with a non-null error is partial: its results were charged and saved."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","orgId","toolId","status","source","resultsCount","creditsUsed","createdAt","updatedAt"]},"Me":{"type":"object","properties":{"orgId":{"type":"string","format":"uuid"},"balance":{"type":"integer","description":"Credits left."}},"required":["orgId","balance"]},"Tool":{"type":"object","properties":{"id":{"type":"string","description":"Use this id in POST /api/v1/tools/{toolId}/runs."},"title":{"type":"string"},"description":{"type":"string"},"credits":{"type":"integer","description":"Credits charged per successful result."},"event":{"type":"string","description":"What one charged result is (e.g. \"transcript\")."},"inputSchema":{"type":"object","additionalProperties":true,"description":"JSON Schema of the input this tool accepts."},"soldBy":{"type":"string","description":"Only on third-party listings: the seller of record and its country. Pullwire is the marketplace; the seller is responsible for the data."}},"required":["id","title","description","credits","event","inputSchema"]},"ToolList":{"type":"object","properties":{"tools":{"type":"array","items":{"$ref":"#/components/schemas/Tool"}}},"required":["tools"]},"RunWithResults":{"type":"object","properties":{"run":{"$ref":"#/components/schemas/Run"},"results":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["run","results"]},"QueuedRun":{"type":"object","properties":{"run":{"$ref":"#/components/schemas/Run"}},"required":["run"]},"RunResults":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["results"]},"Dataset":{"type":"object","description":"Results of a large run (50+ results), stored as CSV, Excel and JSON files for 30 days. Download links come from GET /datasets/{id}.","properties":{"id":{"type":"string","format":"uuid"},"runId":{"type":"string","format":"uuid"},"toolId":{"type":"string"},"status":{"type":"string","enum":["pending","ready","failed"]},"items":{"type":"integer","description":"Number of results in the dataset."},"bytes":{"type":"integer","description":"Total size of all stored files."},"formats":{"type":"array","items":{"type":"string","enum":["csv","xlsx","json"]}},"createdAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time","description":"The files are deleted after this time."}},"required":["id","runId","toolId","status","items","bytes","formats","createdAt","expiresAt"]},"DatasetList":{"type":"object","properties":{"datasets":{"type":"array","items":{"$ref":"#/components/schemas/Dataset"}}},"required":["datasets"]},"DatasetDownload":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"Signed link, valid for 15 minutes. No API key needed."},"expiresAt":{"type":"string","format":"date-time"},"filename":{"type":"string"}},"required":["url","expiresAt","filename"]},"DatasetWithDownloads":{"type":"object","properties":{"dataset":{"$ref":"#/components/schemas/Dataset"},"downloads":{"type":"object","description":"One signed link per stored format (csv, xlsx, json).","additionalProperties":{"$ref":"#/components/schemas/DatasetDownload"}}},"required":["dataset","downloads"]},"ScrapeInput":{"type":"object","properties":{"url":{"title":"URL","description":"The page to scrape.","type":"string","minLength":1,"maxLength":2048},"urls":{"title":"URLs","description":"Several pages in one run (up to 20); one result per page.","examples":[["https://example.com/"]],"minItems":1,"maxItems":20,"type":"array","items":{"type":"string","minLength":1,"maxLength":2048}},"format":{"default":"markdown","title":"Output format","description":"markdown: clean, LLM-ready text of the page. html: the page HTML. json: the fields from `extract`.","type":"string","enum":["markdown","html","json"]},"onlyMainContent":{"default":true,"title":"Main content only","description":"Markdown: drop navigation, cookie banners, sidebars and footers.","type":"boolean"},"extract":{"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.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z_][\\w-]{0,63}$"},"additionalProperties":{"anyOf":[{"type":"string","minLength":1,"maxLength":500},{"type":"object","properties":{"selector":{"type":"string","minLength":1,"maxLength":500},"attribute":{"type":"string","minLength":1,"maxLength":100},"all":{"type":"boolean"}},"required":["selector"]}]}},"renderJs":{"default":false,"title":"Render JavaScript","description":"Load the page in a headless browser first (for sites that build their content with JS).","type":"boolean"},"waitFor":{"title":"Wait for","description":"With renderJs: a CSS selector to wait for, or a delay in milliseconds (e.g. 2000, max 15000).","type":"string","minLength":1,"maxLength":300},"proxy":{"default":"auto","title":"Proxy","description":"auto: direct first, residential proxy only if the site blocks us. none: never a proxy. residential: always.","type":"string","enum":["auto","none","residential"]},"country":{"title":"Country","description":"Exit country for the residential proxy (two-letter code).","type":"string","pattern":"^[A-Za-z]{2}$"},"timeoutMs":{"default":20000,"title":"Timeout (ms)","description":"Per page, for loading (and rendering).","type":"integer","minimum":2000,"maximum":60000},"screenshot":{"default":false,"title":"Screenshot","description":"With renderJs: a PNG of the viewport, returned as a signed download URL (valid 7 days).","type":"boolean"}},"title":"ScrapeInput","x-tool-id":"scrape"},"YoutubeTranscriptsInput":{"type":"object","properties":{"videos":{"minItems":1,"maxItems":10000,"type":"array","items":{"type":"string","minLength":1},"title":"Videos","description":"YouTube video URLs (watch, youtu.be, shorts, embed, live) or 11-character video IDs.","examples":[["https://www.youtube.com/watch?v=jNQXAC9IVRw"]]},"languages":{"default":[],"title":"Preferred languages","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.","maxItems":5,"type":"array","items":{"type":"string","pattern":"^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,4})?$"}},"preferManual":{"default":true,"title":"Prefer human-made captions","description":"Use uploaded captions over auto-generated ones when both exist for a language.","type":"boolean"},"includeSegments":{"default":true,"title":"Include timed segments","description":"Adds the transcript split into segments with start and end time in seconds.","type":"boolean"},"includeMetadata":{"default":true,"title":"Include video metadata","description":"Adds title and channel. Views, duration, publish date and the language list are added when YouTube provides them.","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many transcripts. Empty: all videos.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["videos"],"title":"YoutubeTranscriptsInput","x-tool-id":"youtube-transcripts"},"FacebookAdsLibraryInput":{"type":"object","properties":{"searches":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"query":{"title":"Keyword","description":"Search term, e.g. a brand or product name. Leave empty when searching by Page ID.","type":"string","minLength":1,"maxLength":200},"pageId":{"title":"Page ID","description":"Numeric Facebook Page ID: returns all ads from that one advertiser instead of a keyword search.","type":"string","pattern":"^\\d+$"},"country":{"default":"US","title":"Country","description":"ISO 3166-1 alpha-2 country code (e.g. US, DE, GB) or ALL for worldwide.","examples":["US"],"type":"string","pattern":"^(ALL|[A-Z]{2})$"},"activeStatus":{"default":"active","title":"Active status","description":"Only currently running ads, only stopped ads, or all.","type":"string","enum":["active","inactive","all"]}}},"title":"Searches","description":"One entry per keyword or advertiser. Each returns the first page of matching ads (see totalMatchingAds/hasMoreResults).","examples":[[{"query":"nike","country":"US","activeStatus":"active"}]]},"maxResults":{"title":"Max results","description":"Stop after this many ads in total. Empty: all ads from all searches.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["searches"],"title":"FacebookAdsLibraryInput","x-tool-id":"facebook-ads-library"},"LinkedinJobsInput":{"type":"object","properties":{"searches":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"keywords":{"title":"Keywords","description":"Job title, skill or company, e.g. \"software engineer\".","type":"string","minLength":1,"maxLength":200},"location":{"title":"Location","description":"City, region or country, e.g. \"Berlin, Germany\" or \"United States\".","type":"string","minLength":1,"maxLength":200},"datePosted":{"default":"any","title":"Date posted","description":"Only jobs posted within this window.","type":"string","enum":["any","past24h","pastWeek","pastMonth"]},"workType":{"default":"any","title":"Work type","type":"string","enum":["any","onsite","remote","hybrid"]},"experienceLevel":{"default":"any","title":"Experience level","type":"string","enum":["any","internship","entry","associate","mid-senior","director","executive"]},"jobType":{"default":"any","title":"Job type","type":"string","enum":["any","full-time","part-time","contract","temporary","internship","volunteer"]},"distanceMiles":{"title":"Distance (miles)","description":"Search radius around the location, in miles.","type":"integer","minimum":1,"maximum":100},"maxResultsPerSearch":{"default":100,"title":"Max results for this search","description":"LinkedIn’s guest pages stop returning results past ~1000 regardless of this value.","type":"integer","minimum":1,"maximum":1000}}},"title":"Searches","description":"One entry per keyword/location combination.","examples":[[{"keywords":"software engineer","location":"Germany"}]]},"includeDescription":{"default":true,"title":"Include full description","description":"Fetch each job’s detail page for the full description, seniority, employment type, industries and applicant count. One extra request per job.","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many jobs in total across all searches. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["searches"],"title":"LinkedinJobsInput","x-tool-id":"linkedin-jobs"},"IndeedJobsInput":{"type":"object","properties":{"searches":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"keywords":{"title":"Keywords","description":"Free search words: job title, skill or company, e.g. \"warehouse associate\".","type":"string","minLength":1,"maxLength":200},"jobTitle":{"title":"Job title must contain","description":"Only jobs whose title contains these words, e.g. \"account executive\" or \"head of sales\" (Indeed’s title filter).","type":"string","minLength":1,"maxLength":120},"company":{"title":"Company","description":"Only jobs from this employer, e.g. \"Salesforce\". Matched on whole words of the employer name, ignoring case and punctuation.","type":"string","minLength":1,"maxLength":120},"location":{"title":"Location","description":"City, state or ZIP, e.g. \"Austin, TX\" or \"90210\".","type":"string","minLength":1,"maxLength":200},"radiusMiles":{"title":"Radius (miles)","description":"Search radius around the location, in miles.","type":"integer","minimum":0,"maximum":100},"datePosted":{"default":"any","title":"Date posted","description":"Only jobs posted within this many days. \"any\": no limit.","type":"string","enum":["1","3","7","14","any"]},"sort":{"default":"relevance","title":"Sort","description":"Indeed’s default relevance ranking, or newest first.","type":"string","enum":["relevance","date"]},"maxResultsPerSearch":{"default":100,"title":"Max results for this search","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.","type":"integer","minimum":1,"maximum":100}}},"title":"Searches","description":"One entry per search: keywords, job title, company, location and filters.","examples":[[{"jobTitle":"account executive","location":"Austin, TX","datePosted":"7"}]]},"includeDescription":{"default":true,"title":"Include full description","description":"Add the full job description text. Fetched in batches of 10 jobs per extra request, same price per job.","type":"boolean"},"includeCompanyDetails":{"default":true,"title":"Include company website and size","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).","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many jobs in total across all searches. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["searches"],"title":"IndeedJobsInput","x-tool-id":"indeed-jobs"},"AmazonProductsInput":{"type":"object","properties":{"searches":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"keywords":{"type":"string","minLength":1,"maxLength":200,"title":"Keywords","description":"Search term, e.g. \"wireless mouse\"."},"maxResultsPerSearch":{"default":48,"title":"Max results for this search","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.","type":"integer","minimum":1,"maximum":60}},"required":["keywords"]},"title":"Searches","description":"One entry per keyword search.","examples":[[{"keywords":"wireless mouse"}]]},"maxResults":{"title":"Max results","description":"Stop after this many products in total across all searches. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["searches"],"title":"AmazonProductsInput","x-tool-id":"amazon-products"},"AmazonReviewsInput":{"type":"object","properties":{"products":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"product":{"type":"string","minLength":1,"maxLength":500,"title":"Product","description":"Amazon ASIN (e.g. \"B0CX23V2ZK\") or a full amazon.com product URL."},"maxReviews":{"default":10,"title":"Max reviews for this product","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\").","type":"integer","minimum":3,"maximum":20}},"required":["product"]},"title":"Products","description":"One entry per product (ASIN or amazon.com product URL).","examples":[[{"product":"B0CX23V2ZK"}]]},"maxResults":{"title":"Max results","description":"Stop after this many reviews in total across all products. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["products"],"title":"AmazonReviewsInput","x-tool-id":"amazon-reviews"},"RedditInput":{"type":"object","properties":{"requests":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["subreddit","search","post"],"title":"Kind","description":"subreddit: list a subreddit’s posts. search: reddit-wide or subreddit-scoped post search. post: one post plus its comments."},"subreddit":{"title":"Subreddit","description":"Name without r/, e.g. \"programming\". Required for kind=subreddit; restricts kind=search to this subreddit when set.","type":"string","minLength":1,"maxLength":100},"query":{"title":"Search query","description":"Required for kind=search.","type":"string","minLength":1,"maxLength":512},"postUrl":{"title":"Post URL or id","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.","type":"string","minLength":1,"maxLength":500},"sort":{"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.","type":"string","enum":["hot","new","top","rising","controversial","relevance","comments"]},"time":{"default":"all","title":"Time window","description":"Used only with sort=top/controversial (subreddit) and for every search.","type":"string","enum":["hour","day","week","month","year","all"]},"limit":{"default":25,"title":"Max posts for this request","description":"kind=subreddit/search only. Reddit returns at most 100 per page; more are fetched by following its pagination cursor up to this count.","type":"integer","minimum":1,"maximum":100},"commentSort":{"default":"top","title":"Comment sort","type":"string","enum":["confidence","top","new","controversial","old","qa"]},"maxComments":{"default":20,"title":"Max comments","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.","type":"integer","minimum":0,"maximum":200}},"required":["kind"]},"title":"Requests","description":"One entry per subreddit listing, search or single post.","examples":[[{"kind":"subreddit","subreddit":"programming","sort":"hot","limit":10}]]},"includeComments":{"default":false,"title":"Include comments for subreddit/search posts","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.","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many posts+comments in total across all requests. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["requests"],"title":"RedditInput","x-tool-id":"reddit"},"ZillowInput":{"type":"object","properties":{"locations":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":300,"title":"Location","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":{"default":100,"title":"Max results for this location","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.","type":"integer","minimum":1,"maximum":820}},"required":["location"]},"title":"Locations","description":"One entry per city/location to search.","examples":[[{"location":"Seattle, WA"}]]},"maxResults":{"title":"Max results","description":"Stop after this many listings in total across all locations. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["locations"],"title":"ZillowInput","x-tool-id":"zillow"},"MapsLeadsInput":{"type":"object","properties":{"searches":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":200,"title":"Business type or keyword","description":"What to look for, as you would type it into Google Maps, e.g. \"dentist\", \"plumber\", \"vegan restaurant\"."},"location":{"title":"Location","description":"City, district, region or country, e.g. \"Berlin, Germany\" or \"Austin, TX\". Empty: the query is used as-is.","type":"string","minLength":1,"maxLength":200},"radiusKm":{"title":"Radius (km)","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.","type":"number","minimum":0.1,"maximum":100},"maxResultsPerSearch":{"default":100,"title":"Max results for this search","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.","type":"integer","minimum":1,"maximum":400}},"required":["query"]},"title":"Searches","description":"One entry per business type + location combination.","examples":[[{"query":"dentist","location":"Berlin, Germany"}]]},"enrichContacts":{"default":true,"title":"Find emails and social profiles","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.","type":"boolean"},"maxContactPages":{"default":3,"title":"Website pages per business","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).","type":"integer","minimum":1,"maximum":3},"language":{"default":"en","title":"Language","description":"Language of categories, opening hours and descriptions, e.g. \"en\", \"de\", \"fr\".","type":"string","pattern":"^[a-z]{2,3}(-[A-Za-z]{2,4})?$"},"countryCode":{"title":"Country bias","description":"Two-letter country code that biases ambiguous place names, e.g. \"us\" or \"de\". Empty: none.","type":"string","pattern":"^[A-Za-z]{2}$"},"dedupe":{"default":true,"title":"Skip duplicates across searches","description":"Return each business only once even when several searches find it.","type":"boolean"},"onePerCompany":{"default":true,"title":"One row per company","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.","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many businesses in total across all searches. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["searches"],"title":"MapsLeadsInput","x-tool-id":"maps-leads"},"SerpInput":{"type":"object","properties":{"queries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"title":"Search queries","description":"One search per entry, exactly as you would type it into the search box. Operators like site: work.","examples":[["best running shoes"]]},"engine":{"default":"bing","title":"Search engine","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.","type":"string","enum":["bing","duckduckgo"]},"country":{"title":"Country","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\").","type":"string","pattern":"^[a-z]{2}$"},"language":{"title":"Language","description":"Interface and result language, e.g. \"en\", \"de\", \"fr\". For DuckDuckGo it picks between a country’s regions (e.g. Canada + fr).","type":"string","pattern":"^[a-zA-Z]{2,3}(-[a-zA-Z]{2,4})?$"},"maxPagesPerQuery":{"default":1,"title":"Pages per query","description":"How many result pages to fetch for each query (about 10 organic results per page).","type":"integer","minimum":1,"maximum":10},"includeRelatedSearches":{"default":true,"title":"Related searches","description":"Include related searches. Free on Bing (same page); one extra request per query on DuckDuckGo.","type":"boolean"},"maxResults":{"title":"Max result pages","description":"Stop after this many result pages in total across all queries. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["queries"],"title":"SerpInput","x-tool-id":"serp"},"ThreadsInput":{"type":"object","properties":{"searchQueries":{"default":[],"title":"Search keywords","description":"Keywords or #hashtags to search on Threads. Each search returns the top ~20 matching threads (what Threads shows without an account).","examples":[["coffee"]],"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":200}},"usernames":{"default":[],"title":"Profiles","description":"Usernames or profile URLs. Returns the profile details and its latest public threads (Threads shows ~5 without an account).","maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":300}},"postUrls":{"default":[],"title":"Post URLs","description":"Links to single Threads posts. Returns the post and, if enabled, its replies.","maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":500}},"includeReplies":{"default":true,"title":"Include replies","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).","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many posts in total. Empty: no extra cap.","type":"integer","minimum":1,"maximum":9007199254740991}},"title":"ThreadsInput","x-tool-id":"threads"},"WebsiteContactsInput":{"type":"object","properties":{"websites":{"minItems":1,"maxItems":5000,"type":"array","items":{"type":"string","minLength":1,"maxLength":2048},"title":"Websites","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.","examples":[["kaercher.com","myrescueplumbing.com"]]},"maxPagesPerWebsite":{"default":3,"title":"Pages per website","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.","type":"integer","minimum":1,"maximum":5},"maxResults":{"title":"Max results","description":"Stop after this many websites. Empty: all of them.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["websites"],"title":"WebsiteContactsInput","x-tool-id":"website-contacts"},"LinkedinCompanyInput":{"type":"object","properties":{"companies":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":2048},"title":"Companies","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.","examples":[["https://www.linkedin.com/company/canva","hubspot.com"]]},"includePosts":{"default":true,"title":"Include recent posts","description":"Add the latest posts shown on the public page (up to about 10): text, date, likes and link.","type":"boolean"},"maxResults":{"title":"Max results","description":"Stop after this many companies. Empty: all of them.","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["companies"],"title":"LinkedinCompanyInput","x-tool-id":"linkedin-company"}}},"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"paths":{"/api/v1/tools":{"get":{"operationId":"listTools","tags":["tools"],"summary":"List the tool catalog","security":[],"responses":{"200":{"description":"Tool catalog","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolList"}}}}}}},"/api/v1/me":{"get":{"operationId":"getMe","tags":["account"],"summary":"Org id and credit balance for the authenticated key","responses":{"200":{"description":"Org info","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tools/{toolId}/runs":{"post":{"operationId":"createRun","tags":["runs"],"summary":"Run a tool (waits up to 25 s by default, or ?async=1 for a queued run)","parameters":[{"name":"toolId","in":"path","required":true,"schema":{"type":"string"}},{"name":"async","in":"query","required":false,"description":"Set to '1' to get the run back right away (202) and poll GET /runs/{id}.","schema":{"type":"string","enum":["1"]}}],"requestBody":{"required":true,"description":"The input for the tool in the path. Each tool has its own shape, listed as <ToolName>Input; GET /api/v1/tools returns the same schemas at runtime.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/ScrapeInput"},{"$ref":"#/components/schemas/YoutubeTranscriptsInput"},{"$ref":"#/components/schemas/FacebookAdsLibraryInput"},{"$ref":"#/components/schemas/LinkedinJobsInput"},{"$ref":"#/components/schemas/IndeedJobsInput"},{"$ref":"#/components/schemas/AmazonProductsInput"},{"$ref":"#/components/schemas/AmazonReviewsInput"},{"$ref":"#/components/schemas/RedditInput"},{"$ref":"#/components/schemas/ZillowInput"},{"$ref":"#/components/schemas/MapsLeadsInput"},{"$ref":"#/components/schemas/SerpInput"},{"$ref":"#/components/schemas/ThreadsInput"},{"$ref":"#/components/schemas/WebsiteContactsInput"},{"$ref":"#/components/schemas/LinkedinCompanyInput"}]}}}},"responses":{"200":{"description":"Run finished; results included","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunWithResults"}}}},"202":{"description":"Run queued","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueuedRun"}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Not enough credits","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Unknown tool","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Request body over the 64 KB limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Run crashed (runId set when partial results were saved)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/runs/{id}":{"get":{"operationId":"getRun","tags":["runs"],"summary":"Run status","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Run"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Run not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/runs/{id}/results":{"get":{"operationId":"getRunResults","tags":["runs"],"summary":"Run results, JSON, CSV or Excel (xlsx)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","enum":["json","csv","xlsx"]}}],"responses":{"200":{"description":"Results (JSON by default, CSV with ?format=csv, Excel with ?format=xlsx)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResults"}},"text/csv":{"schema":{"type":"string"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","contentEncoding":"binary"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Run not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/datasets":{"get":{"operationId":"listDatasets","tags":["datasets"],"summary":"Stored datasets of your org, newest first","parameters":[{"name":"runId","in":"query","required":false,"description":"Only the dataset of this run.","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Datasets","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetList"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Datasets are not enabled on this deploy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/datasets/{id}":{"get":{"operationId":"getDataset","tags":["datasets"],"summary":"One dataset with signed download links (valid 15 minutes)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Dataset and download links","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetWithDownloads"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Dataset not found or expired","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Datasets are not enabled on this deploy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}