# Porch Email Scraper (`neuro-scraper/porch-email-scraper`) Actor

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

- **URL**: https://apify.com/neuro-scraper/porch-email-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:**
- **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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Porch Email Scraper

The Porch Email Scraper extracts publicly indexed home-services professional contacts from Porch using Google search.
Porch connects US homeowners with contractors, remodellers, movers, inspectors and the trades that support a home purchase.
This Actor turns keywords, an optional location and a list of email domains into a clean dataset of pro leads.

Each row carries the business name, the Porch handle, the pro profile URL and a listing snippet alongside the address.
Identity resolution on this platform is excellent, so the output is easy to spot-check by hand.
The email harvest is high too, which makes Porch one of the better home-services sources in this category.

The Porch Email Scraper does not log in, does not use a Porch API and never opens porch.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 Porch Email Scraper returned 10 result blocks, 10 identity matches, 10 profile URLs and 8 unique emails.
Every block resolved to a named pro with a working profile URL, and eight of ten carried a usable address.
That matches Angi and Clutch, and sits just behind Bark, CallUpContact and Crunchbase.

#### Who the Porch Email Scraper is for

Porch professionals are contractors, remodellers, handymen, movers, home inspectors and warranty providers.
Their suppliers are the natural audience: building materials distributors, tool brands, insurance brokers and trade-credit providers.
Moving and relocation services make Porch distinctive, so logistics and storage suppliers get real value here too.

The default modifiers are `email`, `contact`, `enquiries`, `owner` and `get a quote`.
Those mirror the language a home-services pro uses when inviting a homeowner to make contact.
Change them and you change which slice of the marketplace you reach.

### Key features of the Porch Email Scraper

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

| Feature | What it does |
|---|---|
| Google `site:` targeting | Restricts every query to `porch.com`, so results stay on pro listings |
| Query expansion | Base, quoted and `intitle:` variants plus one variant per query modifier |
| Trade-intent modifiers | Defaults of `email`, `contact`, `enquiries`, `owner` and `get a quote` |
| 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 Porch Email Scraper works

The Porch 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:porch.com moving company "@gmail.com" "Seattle"`.
Pages are fetched through the Apify GOOGLE\_SERP proxy over async HTTP with a fresh proxy session per request.
Structural parsing means a Google layout change degrades the run rather than breaking it.

#### Query expansion in the Porch Email Scraper

Google caps a single query at roughly 300 results, and Porch lists pros across hundreds of categories and every US metro.
Query expansion multiplies each keyword by each email domain and by several phrasings, with base queries running first.
On a high-yield source like this, expansion translates almost directly into extra rows.

#### Location is the strongest lever in the Porch Email Scraper

`location` matters more on Porch than on any of the non-local Actors in this category.
Pros are matched to homeowners by service area, so every listing is written with a city or metro in it.
Run the same keyword set once per metro and merge the datasets afterwards rather than attempting one national sweep.

#### Choosing trade keywords for the Porch Email Scraper

Porch's own service categories are the highest-yield keywords because they match the platform taxonomy.
`moving company`, `home inspector`, `remodeling contractor`, `plumber`, `electrician` and `handyman` all map to real categories.
Six to ten trade keywords per metro is a sensible working range.

### Input reference for the Porch Email Scraper

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

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["contractor", "home services"]` | Search terms describing the pros 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", "enquiries", "owner", "get a quote"]` | 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": ["moving company", "home inspector", "remodeling contractor", "handyman"],
  "location": "Seattle",
  "customDomains": ["@gmail.com", "@yahoo.com", "@outlook.com", "@aol.com"],
  "maxEmails": 400,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "enquiries", "owner", "get a quote"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Tuning the Porch Email Scraper

Trade plus metro is the winning combination.
`home inspector` with `location` set to `Seattle` will out-produce `home services` with no location by a wide margin.
Three to eight trade keywords per metro keeps runs manageable.

Independent trades overwhelmingly use free-mail addresses.
Keep `@gmail.com`, `@yahoo.com`, `@outlook.com` and `@aol.com` in `customDomains` for US runs.
Every extra domain multiplies the query count, so raise `maxEmails` alongside it.

### Output reference for the Porch Email Scraper

Every dataset item produced by the Porch Email Scraper carries all fourteen fields below.

| 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 non-profile results |
| `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

```json
[
  {
    "network": "Porch",
    "keyword": "moving company",
    "query": "site:porch.com moving company \"@gmail.com\" \"Seattle\"",
    "title": "Cascade Relocation Services - Seattle, WA | Porch",
    "accountName": "Cascade Relocation Services",
    "fullName": "Cascade Relocation Services",
    "username": "cascade-relocation-services",
    "profileUrl": "https://porch.com/pro/cascade-relocation-services",
    "url": "https://porch.com/pro/cascade-relocation-services",
    "description": "Local and long distance moves, packing and short-term storage. Get a quote: cascaderelocation@gmail.com",
    "email": "cascaderelocation@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2025-11-04T19:01:27Z"
  },
  {
    "network": "Porch",
    "keyword": "home inspector",
    "query": "site:porch.com home inspector owner \"@yahoo.com\" \"Seattle\"",
    "title": "Puget Sound Home Inspections - Seattle, WA | Porch",
    "accountName": "Puget Sound Home Inspections",
    "fullName": "Puget Sound Home Inspections",
    "username": "puget-sound-home-inspections",
    "profileUrl": "https://porch.com/pro/puget-sound-home-inspections",
    "url": "https://porch.com/pro/puget-sound-home-inspections",
    "description": "Pre-purchase and sewer scope inspections across King County. Owner enquiries: pugetsoundinspect@yahoo.com",
    "email": "pugetsoundinspect@yahoo.com",
    "emailDomain": "@yahoo.com",
    "possiblyTruncated": true,
    "foundAt": "2025-11-04T19:02:58Z"
  }
]
```

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.
Because handles resolve reliably here, the profile column is genuinely useful for manual verification.

### Use cases for the Porch Email Scraper

The Porch Email Scraper is built for suppliers and service providers selling into the US home-services trades.

| Use case | Suggested keywords | Suggested location |
|---|---|---|
| Selling building materials to contractors | `remodeling contractor`, `roofer` | one metro per run |
| Moving and storage supplier outreach | `moving company`, `junk removal` | metro area |
| Contractor insurance, bonding and workers comp | `general contractor`, `electrician` | state capital or metro |
| Lead-generation and CRM software sales | `handyman`, `plumber` | metro area |
| Home warranty and inspection partnerships | `home inspector`, `hvac contractor` | metro area |
| Franchise and territory recruitment | `pressure washing`, `gutter installation` | target territory |
| Market research on local service supply | `contractor`, `home services` | leave empty |

#### Selling into the trades with the Porch Email Scraper

Suppliers get the most out of this Actor because Porch pros are their end customers.
Use Porch's own category names, one metro at a time, and keep the free-mail domains wide.
The `description` field states the trade and service area, which is enough to segment a list quickly.

#### Reaching movers and relocation services with the Porch Email Scraper

Porch's coverage of moving companies is what distinguishes it from the other home-services Actors.
Use `moving company`, `junk removal` and `storage` as keywords with a metro `location`.
Packaging suppliers, fleet finance providers and relocation software vendors all sell into that exact list.

### Practical recipes for the Porch Email Scraper

A Pacific Northwest sweep might use `moving company`, `home inspector` and `remodeling contractor` with `location` set to `Seattle` and `countryCode` to `US`.
A national campaign might repeat the same keyword set for `Denver`, `Austin`, `Charlotte` and `Orlando` as separate runs.
Keep `expandQueries` on throughout, because one query cannot reach past Google's result cap.

For breadth, drop `location`, keep `maxPagesPerQuery` at 30 and raise `maxEmails`.
For precision, name one metro, use three or four trade keywords and set `maxEmails` to a couple of hundred.
Both modes run identical code; only query volume differs.

### How many results the Porch Email Scraper returns

A measured live run of the Porch Email Scraper produced 10 blocks, 10 identity matches, 10 profile URLs and 8 unique emails.
Identity resolution was perfect and email yield was high, which puts Porch in the strong tier of this category.
Only Bark, CallUpContact and Crunchbase measured higher, and Angi and Clutch matched it.

Your own numbers will vary with trade, metro, domain list and how much of Porch Google currently indexes.
Free Apify plans stop at 100 emails per run and paid plans are uncapped.
No specific volume is guaranteed by the Porch Email Scraper or by any Actor in this family.

### Limitations of the Porch Email Scraper

- The Porch Email Scraper only finds pros whose email is publicly visible in Google's index. Porch routes many enquiries through its own lead system, so some pros publish no address.
- 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. City and category landing pages can leave those blank while keeping `accountName` and `fullName`; that is a Google limitation, not a bug.
- The Porch 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 Porch Email Scraper is not affiliated with, endorsed by or officially supported by Porch.
It reads public search results only and does not access private or gated data.

### Responsible use, GDPR and CAN-SPAM

Most Porch pros are small businesses or sole traders, so a free-mail address is often personal data in practice as well as in law.
For US recipients, CAN-SPAM expects accurate headers, a valid postal address and a working unsubscribe path.
For EU and UK recipients, GDPR expects a lawful basis, a clear sender identity, a genuine business reason and an easy way to object.

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

### FAQ about the Porch Email Scraper

**How many results should I expect?**
A measured live run returned 10 blocks, 10 identity matches, 10 profile URLs and 8 unique emails, which is a strong result. Your numbers depend on trade, metro, domains and index coverage, and no volume is guaranteed.

**Does the Porch Email Scraper log into Porch?**
No. It never logs in, never uses a Porch API and never opens porch.com. All data comes from publicly indexed Google results.

**How important is the location field in the Porch Email Scraper?**
Very. Pros are matched by service area, so one run per metro will beat a single national run every time.

**Which keywords work best in the Porch Email Scraper?**
Porch's own category names, such as `moving company`, `home inspector`, `remodeling contractor` and `handyman`.

**Why does the Porch Email Scraper find no email for some pros?**
Porch is built to route homeowner enquiries through its own lead system, so plenty of pros never publish an address. The Porch Email Scraper can only surface the ones that do.

**Why are some `username` and `profileUrl` values empty?**
The Porch Email Scraper fills those only when Google exposes a handle. City and category landing pages sometimes show a title without one, so the row keeps `accountName` and leaves the handle blank.

**What does `possiblyTruncated` mean?**
Google's snippet ellipsis touched the email, so the address may be cut short. Verify those rows before sending.

**How do I raise the Porch Email Scraper email count?**
Widen `customDomains` to four or more free-mail providers, raise `maxEmails`, keep `expandQueries` on and run more metros.

**Is Porch better than Angi or Thumbtack?**
Porch and the [Angi Email Scraper](https://apify.com/leads-scraper/angi-email-scraper) measured the same yield; the [Thumbtack Email Scraper](https://apify.com/leads-scraper/thumbtack-email-scraper) resolves identities just as well but returned fewer emails. Running all three and merging is reasonable.

**Does it need the Apify proxy?**
Yes. The Porch 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 Porch Email Scraper extracts and normalises what Google shows. Run your own verification before any campaign.

### Related Actors

Thirty-six sibling Actors cover the rest of the Business and Professional Directories category that the Porch Email Scraper belongs to.
They share the same input schema, output schema and behaviour, so anything you learn here transfers directly.
For design-led remodelling try the [Houzz Email Scraper](https://apify.com/leads-scraper/houzz-email-scraper), for UK trades the [Bark Email Scraper](https://apify.com/leads-scraper/bark-email-scraper), and for a general local fallback the [Yellow Pages Email Scraper](https://apify.com/leads-scraper/yellow-pages-email-scraper).

| Actor | What it collects |
|---|---|
| [Porch Email and Phone Number Scraper](https://apify.com/neuro-scraper/porch-email-and-phone-number-scraper) | Emails and phone numbers from Porch |
| [Porch Phone Number Scraper](https://apify.com/neuro-scraper/porch-phone-number-scraper) | Public phone numbers from Porch |
| [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 |
| [Capterra Email Scraper](https://apify.com/leads-scraper/capterra-email-scraper) | Public contact emails from Capterra |
| [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 |
| [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 |

### Support

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

# Actor input Schema

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

Search terms describing the Porch 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 Porch.

## `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": [
    "contractor",
    "home services"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com",
    "@outlook.com",
    "@hotmail.com",
    "@icloud.com",
    "@aol.com",
    "@protonmail.com",
    "@live.com",
    "@gmx.com",
    "@mail.com",
    "@yandex.com",
    "@zoho.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "enquiries",
    "owner",
    "get a quote"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by Porch 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": [
        "contractor",
        "home services"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
        "@outlook.com",
        "@hotmail.com",
        "@icloud.com",
        "@aol.com",
        "@protonmail.com",
        "@live.com",
        "@gmx.com",
        "@mail.com",
        "@yandex.com",
        "@zoho.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "enquiries",
        "owner",
        "get a quote"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/porch-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": [
        "contractor",
        "home services",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
        "@outlook.com",
        "@hotmail.com",
        "@icloud.com",
        "@aol.com",
        "@protonmail.com",
        "@live.com",
        "@gmx.com",
        "@mail.com",
        "@yandex.com",
        "@zoho.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "enquiries",
        "owner",
        "get a quote",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/porch-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": [
    "contractor",
    "home services"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com",
    "@outlook.com",
    "@hotmail.com",
    "@icloud.com",
    "@aol.com",
    "@protonmail.com",
    "@live.com",
    "@gmx.com",
    "@mail.com",
    "@yandex.com",
    "@zoho.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "enquiries",
    "owner",
    "get a quote"
  ]
}' |
apify call neuro-scraper/porch-email-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/porch-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/h4yBfsTLHt68gyTL5/builds/1AuYRUhhj3UJC6isP/openapi.json
