# Capterra Email Scraper (`leads-scraper/capterra-email-scraper`) Actor

Capterra Email Scraper SD - Capterra Email Scraper is a lead generation tool that extracts leads with public contact emails, account names and profile URLs from Capterra results by keyword, location and email domain - Capterra email extractor.

- **URL**: https://apify.com/leads-scraper/capterra-email-scraper.md
- **Developed by:** [Leads Scraper](https://apify.com/leads-scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Capterra Email Scraper

The Capterra Email Scraper extracts publicly indexed software vendor emails from Capterra listings using Google search.
Capterra is one of the largest software discovery directories, covering SMB tools and non-SaaS categories as well as classic B2B software.
This Actor reads what Google has indexed from it and pulls out the contact addresses those pages expose.

One thing to understand before you run it: Capterra indexes category and comparison pages more than vendor profiles, so many rows carry a vendor email without a resolvable handle.
That means you will often get a usable address alongside `username: null` and an empty `profileUrl`.
It is a property of how Capterra is indexed, not a defect in the Capterra Email Scraper.

The Actor does not log in, does not use a Capterra API and never opens capterra.com.
Every record comes from publicly available Google search results: titles, snippets and site labels.
There is no browser, no JavaScript rendering, no authentication and no cookies.

In a measured live run, the Capterra Email Scraper returned 10 result blocks, 4 identity matches, 4 profile URLs and 4 unique emails.
Ten blocks matched, but only four resolved to a named vendor with a handle, and those same four carried the emails.
Treat that as the realistic shape of a Capterra run rather than as a guaranteed volume.

#### What the Capterra Email Scraper is really for

Capterra's category pages are enormous listicles: "best inventory management software", "top field service tools", and so on.
Those pages rank extremely well, which is why they dominate the index and why the Capterra Email Scraper meets them constantly.
They are still useful, because a vendor email printed on a category page is a vendor email you can act on.

Where Capterra shines is breadth of software category, including verticals that G2 covers thinly.
Where it disappoints is handle resolution, because a listicle title does not identify one product.
Plan your workflow around the `email` and `description` fields rather than around `profileUrl`.

### Key features of the Capterra Email Scraper

Everything below is behaviour the Capterra Email Scraper actually implements, shared with every Actor in this family.

| Feature | What it does |
|---|---|
| Google `site:` targeting | Restricts every query to `capterra.com`, so results stay on vendor, category and comparison pages |
| Query expansion | Base, quoted and `intitle:` variants plus one variant per query modifier |
| Vendor-intent modifiers | Defaults of `email`, `contact`, `sales`, `partnerships` and `support` |
| Domain filtering | Keeps only emails ending in the domains you list |
| Global deduplication | One row per unique email across every query and every page |
| Email normalisation | Understands `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` sign |
| Junk filter | Rejects `email@`, `yourname@`, `test@`, `xxx@` and single-character locals |
| Boundary-correct matching | `@gmail.com` does not match inside `@gmail.company` or `@gmail.com.br` |
| Soft-wrap repair | Drops a hit that is only the tail of another email in the same block |
| Structural block parsing | Locates the `<h3>` title and the smallest surrounding block instead of relying on CSS class names |
| Whole-page fallback parser | A Google markup change degrades to emails without account details, not to zero results |
| Concurrency | `asyncio` worker pool with a shared stop signal once `maxEmails` is reached |
| Retries and block detection | Three attempts per page with exponential backoff; CAPTCHA and consent pages are retried, not counted as empty |
| Re-queue pass | Blocked or failed queries are retried once at the end of the run |
| Resumable state | Key-value store state keyed by an input hash, saved on `PERSIST_STATE`, `MIGRATING` and `ABORTING` |
| Immediate dataset writes | Each lead is pushed as soon as it is found |
| Run summary | Logs pages fetched, blocked pages, retries and emails per page |

### How the Capterra Email Scraper works

The Capterra Email Scraper reads your input, builds Google queries, fetches result pages and parses each block structurally.
Emails are extracted from block text with a domain-filtered regex, normalised, junk-filtered and deduplicated globally.
Each surviving lead is pushed to the Apify dataset immediately, so a partial run is still usable.

A query looks like `site:capterra.com field service software "@gmail.com" "sales"`.
Pages are fetched through the Apify GOOGLE_SERP proxy over async HTTP with a fresh proxy session per request.
Because parsing is structural rather than class-name based, a Google layout change degrades the run rather than breaking it.

#### Query expansion in the Capterra Email Scraper

Google caps a single query at roughly 300 results, and Capterra has far more indexed pages than that.
Query expansion multiplies each keyword by each email domain and by several phrasings, with base queries running first.
Given that Capterra indexes category and comparison pages more than vendor profiles, expansion is how you reach the vendor pages that do exist.

#### Getting the Capterra Email Scraper past the category pages

Adding `intitle:` style precision helps, and the Actor already runs an `intitle:` variant automatically.
Naming a specific product type rather than a market segment also helps: `veterinary practice software` beats `saas`.
Even so, expect a healthy share of rows sourced from listicles, with no handle attached.

#### Location and country targeting in the Capterra Email Scraper

`location` is appended to every query as a quoted phrase, and it is a weak lever on Capterra.
Software listings are global, so a city filter usually removes more than it focuses.
`countryCode` steers the search proxy and is the more useful of the two on this platform.

### Input reference for the Capterra Email Scraper

The Capterra Email Scraper takes nine inputs and only `keywords` is required.

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["software vendor", "saas"]` | Search terms describing the products or vendors you want |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com", "@yahoo.com"]` | Only emails on these domains are kept; `@` optional |
| `maxEmails` | integer 1-10000 | `20` | Stop after this many unique emails |
| `countryCode` | string | `""` | Two-letter country code for the search proxy (US, GB, DE) |
| `expandQueries` | boolean | `true` | Search each keyword x domain pair in several phrasings |
| `queryModifiers` | array | `["email", "contact", "sales", "partnerships", "support"]` | Extra words combined with each keyword when expansion is on |
| `maxPagesPerQuery` | integer 1-50 | `30` | Page cap per query |
| `maxConcurrency` | integer 1-20 | `5` | Parallel queries |

#### Example input

```json
{
  "keywords": ["field service software", "veterinary practice software", "church management software"],
  "location": "",
  "customDomains": ["@gmail.com", "@outlook.com", "@yahoo.com"],
  "maxEmails": 150,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "sales", "partnerships", "support"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Tuning the Capterra Email Scraper

Vertical software categories are where Capterra beats its competitors.
`dental practice management`, `trucking dispatch software` and `salon booking software` all have dedicated Capterra pages.
Six to ten narrow vertical keywords will out-produce two broad ones.

Widen `customDomains` instead of narrowing them, because addresses are not abundant here.
Raise `maxEmails` at the same time so the run does not stop on the first few easy hits.
Leave `expandQueries` on; without it the Capterra Email Scraper will barely leave the first page of results.

### Output reference for the Capterra Email Scraper

Every dataset item produced by the Capterra Email Scraper carries all fourteen fields below, handle or no handle.

| Field | Meaning |
|---|---|
| `network` | Platform name |
| `keyword` | The keyword that produced the lead |
| `query` | The exact Google query used |
| `title` | Raw result title |
| `accountName` | Account label Google prints |
| `fullName` | Display name parsed from a profile-style title; empty for category and comparison pages |
| `username` | URL-safe handle when the platform exposes one; otherwise `null` |
| `profileUrl` | Canonical account URL when a handle is known; otherwise empty |
| `url` | Direct platform link when exposed, else the profile URL |
| `description` | Listing snippet, cleaned of labels and counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email |
| `foundAt` | ISO 8601 UTC timestamp |

#### Example output

The second row below is the common Capterra case: a real vendor email with no resolvable handle.

```json
[
  {
    "network": "Capterra",
    "keyword": "field service software",
    "query": "site:capterra.com field service software \"@gmail.com\"",
    "title": "Routemark Pricing, Alternatives & More 2025 | Capterra",
    "accountName": "Routemark",
    "fullName": "Routemark",
    "username": "routemark",
    "profileUrl": "https://www.capterra.com/p/routemark/",
    "url": "https://www.capterra.com/p/routemark/",
    "description": "Scheduling and dispatch for field service teams. Sales: routemark.sales@gmail.com",
    "email": "routemark.sales@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2025-11-04T14:02:48Z"
  },
  {
    "network": "Capterra",
    "keyword": "veterinary practice software",
    "query": "site:capterra.com veterinary practice software contact \"@outlook.com\"",
    "title": "Best Veterinary Software 2025 - Reviews & Comparison | Capterra",
    "accountName": "Best Veterinary Software",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "",
    "description": "Compare veterinary practice management tools by price and features. Vendor enquiries: vetsuite.sales@outlook.com",
    "email": "vetsuite.sales@outlook.com",
    "emailDomain": "@outlook.com",
    "possiblyTruncated": true,
    "foundAt": "2025-11-04T14:04:15Z"
  }
]
```

The Apify dataset view shows email, account, name, username, profile, keyword, snippet and the truncation flag.
Export as CSV, JSON or XLSX, or read the dataset through the Apify API.
Filter on rows where `profileUrl` is non-empty when you specifically need a linkable vendor page.

### Use cases for the Capterra Email Scraper

The Capterra Email Scraper is strongest for vertical software categories and weakest for handle-level precision.

| Use case | Suggested keywords | Suggested modifiers |
|---|---|---|
| Partner and channel recruitment | `pos software`, `inventory management software` | `partnerships`, `channel`, `integrations` |
| Vertical market mapping | `dental practice management`, `trucking dispatch software` | `email`, `contact` |
| ABM list building for vendor-focused tools | `salon booking software`, `gym management software` | `sales`, `email` |
| Competitive research across categories | `field service software`, `crm software` | `email`, `contact` |
| Reseller and implementation partner sourcing | `erp software`, `accounting software` | `partnerships`, `sales` |
| Analyst and press outreach | `saas`, `software vendor` | `press`, `media`, `pr` |
| Procurement shortlisting | `church management software`, `hr software` | `contact`, `sales` |

#### Vertical mapping with the Capterra Email Scraper

Pick ten niche verticals rather than one broad market and run them in a single job.
Capterra's category pages are dense with vendor names, so the `description` field alone is a useful competitive map.
Keep the rows with `username: null` for research even though you cannot link them to a profile.

#### Building a contactable subset from the Capterra Email Scraper

After a run, filter the dataset for rows where `email` is present and `possiblyTruncated` is `false`.
That gives you the immediately usable slice without discarding the research value of the rest.
Cross-reference against a [G2 Email Scraper](https://apify.com/neuro-scraper/g2-email-scraper) run to resolve vendor handles Capterra could not.

### Practical recipes for the Capterra Email Scraper

A healthcare vertical sweep might use `dental practice management`, `veterinary practice software` and `medical billing software` with `countryCode` set to `US`.
A field-operations sweep might use `field service software`, `fleet management software` and `trucking dispatch software`.
Leave `expandQueries` on in both cases, because a single query cannot reach past Google's result cap.

For breadth, drop `location`, keep `maxPagesPerQuery` at 30 and raise `maxEmails` well above the default of 20.
For a quick probe, name one vertical and set `maxEmails` to 20 so the run finishes fast.
Both modes run identical code; only query volume differs.

### How many results the Capterra Email Scraper returns

A measured live run of the Capterra Email Scraper produced 10 blocks, 4 identity matches, 4 profile URLs and 4 unique emails.
Every block that resolved to a vendor also produced an email, which is an unusually clean conversion.
The limiting factor is resolution, not extraction: six of ten blocks were category or comparison pages.

That is the direct consequence of the coverage note: Capterra indexes category and comparison pages more than vendor profiles, so many rows carry a vendor email without a resolvable handle.
Free Apify plans stop at 100 emails per run and paid plans are uncapped.
No specific volume is guaranteed by the Capterra Email Scraper or by any Actor in this family.

### Limitations of the Capterra Email Scraper

- Capterra indexes category and comparison pages more than vendor profiles, so many rows carry a vendor email without a resolvable handle. Expect `username: null` and an empty `profileUrl` on a large share of rows.
- The Capterra Email Scraper only finds vendors whose email is publicly visible in Google's index. Anything behind a form or a login is invisible to it.
- Google caps a single query at roughly 300 results. Query expansion exists to work around that cap, and disabling it reduces yield sharply.
- `possiblyTruncated: true` means Google's snippet ellipsis touched the email, so the address may be incomplete. Verify those rows before sending.
- `username` and `profileUrl` are populated only when Google exposes a handle. When it prints only a listicle title, the row keeps `accountName` and leaves the handle blank; that is a Google limitation, not a bug.
- The Capterra Email Scraper requires the Apify GOOGLE_SERP proxy and cannot run without Apify proxy credentials.
- Free Apify plans are capped at 100 emails per run; paid plans have no cap.
- Results vary with keywords, domains and location, and no volume is guaranteed.

The Capterra Email Scraper is not affiliated with, endorsed by or officially supported by Capterra.
It reads public search results only and does not access private or gated data.

### Responsible use, GDPR and CAN-SPAM

A publicly indexed address is not automatically a lawful one to email.
For EU and UK recipients, GDPR expects a lawful basis, a clear sender identity, a genuine business reason and an easy way to object.
For US recipients, CAN-SPAM expects accurate headers, a valid postal address and a working unsubscribe path.

Keep the `query`, `profileUrl` and `foundAt` provenance that every row carries, even when the handle is null.
Honour opt-outs immediately and suppress them in later runs of the Capterra Email Scraper.
This is general information about common obligations rather than legal advice, so check the rules that apply to you.

### FAQ about the Capterra Email Scraper

#### How many results should I expect?

A measured live run returned 10 blocks, 4 identity matches, 4 profile URLs and 4 unique emails. Capterra indexes category and comparison pages more than vendor profiles, so many rows carry a vendor email without a resolvable handle, and no volume is guaranteed.

#### Why does the Capterra Email Scraper leave `username` null on so many rows?

Because the result was a category or comparison listicle rather than a vendor profile. The Capterra Email Scraper then stores `username: null` and an empty `profileUrl` while keeping the email and snippet.

#### Are those handle-less rows useless?

No. The email and the `description` are still real, and category pages are a good competitive map. You simply cannot link the row to a single Capterra profile.

#### Does the Capterra Email Scraper log into Capterra?

No. It never logs in, never uses a Capterra API and never opens capterra.com. All data comes from publicly indexed Google results.

#### How do I make the Capterra Email Scraper find vendor profiles instead of category pages?

Use narrow vertical keywords such as `dental practice management` rather than broad ones such as `saas`, and keep query expansion on so the `intitle:` variant runs.

#### What does `possiblyTruncated` mean?

Google's snippet ellipsis touched the email, so the address may be cut short. Verify those rows before sending.

#### Should I use Capterra or G2?

Capterra covers more SMB and vertical categories; the [G2 Email Scraper](https://apify.com/neuro-scraper/g2-email-scraper) resolves product handles more reliably. Running both and merging is a reasonable strategy.

#### Does it need the Apify proxy?

Yes. The Capterra Email Scraper runs on the Apify GOOGLE_SERP proxy and cannot operate without Apify proxy credentials.

#### Can I run it on the free plan?

Yes, capped at 100 emails per run. Paid plans remove the cap.

#### Are the emails verified?

No. The Capterra Email Scraper extracts and normalises what Google shows. Run your own verification before any campaign.

#### What happens if a Capterra Email Scraper run is interrupted?

State is saved in the key-value store keyed by a hash of the input, and leads are written to the dataset as they are found, so a partial run still has value.

#### Which Actors pair well with this one?

The [Clutch Email Scraper](https://apify.com/leads-scraper/clutch-email-scraper) for implementation partners and the [Crunchbase Email Scraper](https://apify.com/leads-scraper/crunchbase-email-scraper) for company-level contacts at the same vendors.

### Related Actors

Thirty-six sibling Actors cover the rest of the Business and Professional Directories category that the Capterra Email Scraper belongs to.
They share the same input schema, output schema and behaviour, so anything you learn here transfers directly.
For consumer brands try the [Trustpilot Email Scraper](https://apify.com/leads-scraper/trustpilot-email-scraper), for global suppliers the [Europages Email Scraper](https://apify.com/leads-scraper/europages-email-scraper), and for home-services trades the [Angi Email Scraper](https://apify.com/leads-scraper/angi-email-scraper).

| Actor | What it collects |
|---|---|
| [Capterra Email and Phone Number Scraper](https://apify.com/leads-scraper/capterra-email-and-phone-number-scraper) | Emails and phone numbers from Capterra |
| [Capterra Phone Number Scraper](https://apify.com/leads-scraper/capterra-phone-number-scraper) | Public phone numbers from Capterra |
| [Angi Email Scraper](https://apify.com/leads-scraper/angi-email-scraper) | Public contact emails from Angi |
| [Bark Email Scraper](https://apify.com/leads-scraper/bark-email-scraper) | Public contact emails from Bark |
| [Better Business Bureau Email Scraper](https://apify.com/leads-scraper/better-business-bureau-email-scraper) | Public contact emails from Better Business Bureau |
| [Bizapedia Email Scraper](https://apify.com/neuro-scraper/bizapedia-email-scraper) | Public contact emails from Bizapedia |
| [Brownbook Email Scraper](https://apify.com/neuro-scraper/brownbook-email-scraper) | Public contact emails from Brownbook |
| [Callupcontact Email Scraper](https://apify.com/neuro-scraper/callupcontact-email-scraper) | Public contact emails from CallUpContact |
| [Clutch Email Scraper](https://apify.com/leads-scraper/clutch-email-scraper) | Public contact emails from Clutch |
| [Crunchbase Email Scraper](https://apify.com/leads-scraper/crunchbase-email-scraper) | Public contact emails from Crunchbase |
| [Cybo Email Scraper](https://apify.com/neuro-scraper/cybo-email-scraper) | Public contact emails from Cybo |
| [Cylex Email Scraper](https://apify.com/neuro-scraper/cylex-email-scraper) | Public contact emails from Cylex |
| [EC21 Email Scraper](https://apify.com/neuro-scraper/ec21-email-scraper) | Public contact emails from EC21 |
| [Europages Email Scraper](https://apify.com/leads-scraper/europages-email-scraper) | Public contact emails from Europages |
| [ExportHub Email Scraper](https://apify.com/neuro-scraper/exporthub-email-scraper) | Public contact emails from ExportHub |
| [FindUsLocal Email Scraper](https://apify.com/neuro-scraper/finduslocal-email-scraper) | Public contact emails from FindUsLocal |
| [Foursquare Email Scraper](https://apify.com/neuro-scraper/foursquare-email-scraper) | Public contact emails from Foursquare |
| [Fyple Email Scraper](https://apify.com/neuro-scraper/fyple-email-scraper) | Public contact emails from Fyple |
| [G2 Email Scraper](https://apify.com/neuro-scraper/g2-email-scraper) | Public contact emails from G2 |
| [Hotfrog Email Scraper](https://apify.com/leads-scraper/hotfrog-email-scraper) | Public contact emails from Hotfrog |
| [Houzz Email Scraper](https://apify.com/leads-scraper/houzz-email-scraper) | Public contact emails from Houzz |
| [Infobel Email Scraper](https://apify.com/neuro-scraper/infobel-email-scraper) | Public contact emails from Infobel |
| [Kompass Email Scraper](https://apify.com/leads-scraper/kompass-email-scraper) | Public contact emails from Kompass |
| [Lacartes Email Scraper](https://apify.com/neuro-scraper/lacartes-email-scraper) | Public contact emails from Lacartes |
| [Manta Email Scraper](https://apify.com/leads-scraper/manta-email-scraper) | Public contact emails from Manta |
| [MapQuest Email Scraper](https://apify.com/neuro-scraper/mapquest-email-scraper) | Public contact emails from MapQuest |
| [N49 Email Scraper](https://apify.com/neuro-scraper/n49-email-scraper) | Public contact emails from N49 |
| [Porch Email Scraper](https://apify.com/neuro-scraper/porch-email-scraper) | Public contact emails from Porch |
| [Scoot Email Scraper](https://apify.com/neuro-scraper/scoot-email-scraper) | Public contact emails from Scoot |
| [Thomasnet Email Scraper](https://apify.com/leads-scraper/thomasnet-email-scraper) | Public contact emails from Thomasnet |
| [Thumbtack Email Scraper](https://apify.com/leads-scraper/thumbtack-email-scraper) | Public contact emails from Thumbtack |
| [Touch Local Email Scraper](https://apify.com/leads-scraper/touch-local-email-scraper) | Public contact emails from Touch Local |
| [TradeIndia Email Scraper](https://apify.com/leads-scraper/tradeindia-email-scraper) | Public contact emails from TradeIndia |
| [Trustpilot Email Scraper](https://apify.com/leads-scraper/trustpilot-email-scraper) | Public contact emails from Trustpilot |
| [Tupalo Email Scraper](https://apify.com/leads-scraper/tupalo-email-scraper) | Public contact emails from Tupalo |
| [Yalwa Email Scraper](https://apify.com/leads-scraper/yalwa-email-scraper) | Public contact emails from Yalwa |
| [Yellow Pages Email Scraper](https://apify.com/leads-scraper/yellow-pages-email-scraper) | Public contact emails from Yellow Pages |
| [Angi Email and Phone Number Scraper](https://apify.com/neuro-scraper/angi-email-and-phone-number-scraper) | Emails and phone numbers from Angi |
| [Bark Email and Phone Number Scraper](https://apify.com/neuro-scraper/bark-email-and-phone-number-scraper) | Emails and phone numbers from Bark |
| [Better Business Bureau Email and Phone Number Scraper](https://apify.com/leads-scraper/better-business-bureau-email-and-phone-number-scraper) | Emails and phone numbers from Better Business Bureau |
| [Bizapedia Email and Phone Number Scraper](https://apify.com/neuro-scraper/bizapedia-email-and-phone-number-scraper) | Emails and phone numbers from Bizapedia |
| [Brownbook Email and Phone Number Scraper](https://apify.com/neuro-scraper/brownbook-email-and-phone-number-scraper) | Emails and phone numbers from Brownbook |

### Leave a review

If the Capterra Email Scraper saved you time, please leave a star rating and a short review on
the Actor page.

Reviews are how other buyers judge whether a tool works, and they tell us which features to
build next.

If something did not work, email <neurodata.apify@gmail.com>
instead - bugs get fixed faster than they get complained about.

### Support

Questions, bug reports or a custom build request for the Capterra Email Scraper: contact neurodata.apify@gmail.com.

# Actor input Schema

## `keywords` (type: `array`):

Search terms describing the Capterra accounts you want (niche, job title, industry).

## `location` (type: `string`):

Optional location phrase added to every query (e.g. "New York").

## `customDomains` (type: `array`):

Only emails ending with one of these domains are collected. With or without the leading @. Each domain is searched separately, so more domains means more results but a longer run - remove some for a faster, narrower search, or add your own (e.g. @company.com).

## `maxEmails` (type: `integer`):

Stop once this many unique emails have been collected.

## `countryCode` (type: `string`):

Two-letter country code for the search proxy (e.g. US, GB, DE). Empty for any.

## `expandQueries` (type: `boolean`):

Search each keyword x domain pair with several phrasings. Recommended - Google caps a single query at ~300 results.

## `queryModifiers` (type: `array`):

Extra words combined with each keyword when Expand queries is on. Tuned for Capterra.

## `maxPagesPerQuery` (type: `integer`):

Google rarely returns more than ~30 pages for one query.

## `maxConcurrency` (type: `integer`):

How many queries run in parallel.

## Actor input object example

```json
{
  "keywords": [
    "software vendor",
    "saas"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "sales",
    "partnerships",
    "support"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

Records produced by Capterra Email Scraper, stored in the run's default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "software vendor",
        "saas"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "sales",
        "partnerships",
        "support"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leads-scraper/capterra-email-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": [
        "software vendor",
        "saas",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "sales",
        "partnerships",
        "support",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("leads-scraper/capterra-email-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "software vendor",
    "saas"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "sales",
    "partnerships",
    "support"
  ]
}' |
apify call leads-scraper/capterra-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,leads-scraper/capterra-email-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/1iQT36T961ryihpQ3/builds/Tnn6wy9ajpsVyWAbu/openapi.json
