# CommercialCafe Email Scraper (`neuro-scraper/commercialcafe-email-scraper`) Actor

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

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

### CommercialCafe Email Scraper for office and commercial listing contacts

The CommercialCafe Email Scraper collects publicly indexed contact emails that appear on commercialcafe.com pages in Google's index.
You give it keywords, an optional location and a list of email domains; it returns a deduplicated dataset of leads.
It is a supplementary source in this category, and this page tells you that up front rather than at the bottom.

**Yield note, stated plainly: CommercialCafe indexes market-report and listing pages rather than broker profiles, so expect low volume and few resolvable handles.**
In a measured live run the CommercialCafe Email Scraper parsed 3 result blocks, identified 0 named broker records and returned 1 unique email.
That is the honest baseline. Do not plan a campaign around this Actor alone.

Where the CommercialCafe Email Scraper earns its place is as a merge-in source.
CommercialCafe sits inside the Yardi listing network, so its indexed pages lean toward office, coworking and market-report content that other commercial marketplaces do not carry.
Run it alongside a strong sibling such as the [LoopNet Email Scraper](https://apify.com/leads-scraper/loopnet-email-scraper), deduplicate on `email`, and treat whatever it adds as incremental coverage.

#### What the CommercialCafe Email Scraper actually does

The CommercialCafe Email Scraper builds Google queries with the `site:` operator against `commercialcafe.com`, fetches result pages through the Apify GOOGLE_SERP proxy using `aiohttp`, and parses each block structurally.
It locates the `<h3>` title, walks up to the smallest surrounding block, and runs a domain-filtered regular expression over that block's text.
Parsing is structural rather than CSS-class based, so a Google markup change degrades the run instead of breaking it.

It does not log into CommercialCafe, does not use any CommercialCafe API and never opens the site in a browser.
There is no JavaScript rendering, no authentication and no cookies anywhere in the pipeline.
Every field comes from titles, snippets and site labels that Google already publishes.

Commercial brokers and leasing teams publish contact addresses deliberately, because vacancy costs money and inbound enquiries are the point.
The CommercialCafe Email Scraper only reads what those professionals already chose to make public.

### Key features of the CommercialCafe Email Scraper

The engineering below is identical across this Actor family; what differs is how much CommercialCafe's indexed footprint gives it to work with.

| Feature | What it does |
|---|---|
| Query expansion | Each keyword x domain pair runs as a base query, a quoted query, an `intitle:` query and one variant per modifier, base queries first. |
| Global deduplication | An address found by many queries is written to the dataset once. |
| Email normalisation | Handles `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` sign. |
| Junk filter | Rejects placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character local parts. |
| Boundary-correct matching | `@gmail.com` will 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 result block. |
| Concurrency control | An `asyncio` worker pool with a shared stop signal on `maxEmails`. |
| Retries and block detection | Three attempts per page with exponential backoff, a fresh proxy session per request, and CAPTCHA or consent pages retried rather than counted as empty. |
| Failed-query requeue | 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`. |
| Whole-page fallback parser | A layout change degrades to emails without account details rather than to nothing. |
| Run summary | Pages fetched, blocked pages, retries and emails per page are logged. |

### How the CommercialCafe Email Scraper works

A CommercialCafe Email Scraper run starts by reading the input and hashing it into a resumable state key.
The query set is then built by multiplying keywords by email domains and, when `expandQueries` is on, by query modifiers.
A representative query looks like `site:commercialcafe.com "office space" "@gmail.com" "Austin"`.

The CommercialCafe Email Scraper fetches result pages concurrently through the Apify GOOGLE_SERP proxy and parses them block by block.
Emails are extracted, normalised, filtered by domain and deduplicated globally before each lead is pushed to the dataset immediately.
Because CommercialCafe returns few blocks, a CommercialCafe Email Scraper run usually finishes well before it reaches `maxEmails`.

That early finish is expected behaviour, not a failure.
The stop signal on `maxEmails` is shared across all workers; free Apify plans are capped at 100 emails per run and paid plans are uncapped.

### CommercialCafe Email Scraper input fields

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["commercial broker", "office space"]` | Search terms describing the accounts you want |
| `location` | string | `""` | Optional location phrase added to every query |
| `customDomains` | array | `["@gmail.com","@yahoo.com"]` | Only emails on these domains are kept; the `@` is optional |
| `maxEmails` | integer 1-10000 | `20` | Stop after this many unique emails |
| `countryCode` | string | `""` | Two-letter country for the search proxy (US, GB, DE...) |
| `expandQueries` | boolean | `true` | Search each keyword x domain pair in several phrasings |
| `queryModifiers` | array | `["email","contact","listing agent","inquiries","broker"]` | 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 |

Only `keywords` is required, so the CommercialCafe Email Scraper runs on defaults out of the box.
Given the small indexed footprint, keep `expandQueries` on and widen `customDomains` before you do anything else.

#### Location targeting in the CommercialCafe Email Scraper

`location` is the most valuable input here, but its role is different than on a high-yield platform.
On CommercialCafe it works less as a filter and more as a way to reach different corners of a thin index.
Running the CommercialCafe Email Scraper across several metros and merging is usually better than one national sweep.

Metro phrases are the right starting point, because CommercialCafe's market-report pages are organised by metro office market: `"Austin"`, `"Chicago"`, `"Charlotte"`, `"Denver"`.
Those report pages are exactly the content this platform indexes best, so metro phrasing matches the grain of the source.

County phrases are worth trying for industrial and flex product: `"Travis County"`, `"DuPage County"`, `"Mecklenburg County"`.
Expect thinner returns than metro phrasing gives you, because county language is rarer in office market copy.

State phrases suit anyone with a statewide remit, such as a regional lender or a facilities contractor: `"Texas"`, `"Illinois"`, `"North Carolina"`.
Pair a state-level `location` with `countryCode: "US"` so the search proxy resolves to the right index.
Submarket phrases such as `"downtown Austin"` or `"the Loop"` sometimes surface a leasing contact that a metro query buries, and cost nothing to try.

#### Example input JSON

```json
{
  "keywords": ["office space", "coworking space", "commercial broker"],
  "location": "Austin",
  "customDomains": ["@gmail.com", "@yahoo.com", "@outlook.com", "@hotmail.com"],
  "maxEmails": 100,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "listing agent", "inquiries", "broker"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

### CommercialCafe Email Scraper output fields

Every dataset item written by the CommercialCafe Email Scraper carries all fourteen fields below, even when several of them are empty.

| 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 CommercialCafe 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` | Bio or snippet text, cleaned of labels and counters |
| `email` | Lower-cased email address |
| `emailDomain` | The matched domain, for example `@gmail.com` |
| `possiblyTruncated` | `true` when Google's snippet ellipsis touched the email |
| `foundAt` | ISO 8601 UTC timestamp |

Because CommercialCafe indexes market-report and listing pages rather than broker profiles, most rows will have `username: null` and an empty `profileUrl`.
The example below shows that honestly rather than dressing it up.

#### Example output JSON

```json
[
  {
    "network": "CommercialCafe",
    "keyword": "office space",
    "query": "site:commercialcafe.com \"office space\" contact \"@gmail.com\" \"Austin\"",
    "title": "Austin Office Market Report - Q1 | CommercialCafe",
    "accountName": "CommercialCafe Austin Office Market",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "https://www.commercialcafe.com/office-market-report/austin",
    "description": "Austin office availability and asking rents. Leasing enquiries: austin.office.leasing@gmail.com",
    "email": "austin.office.leasing@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-03-13T10:41:05Z"
  },
  {
    "network": "CommercialCafe",
    "keyword": "commercial broker",
    "query": "site:commercialcafe.com \"commercial broker\" \"@yahoo.com\" \"Austin\"",
    "title": "Commercial Broker - Congress Ave Office Listing | CommercialCafe",
    "accountName": "Congress Ave Office Listing",
    "fullName": "",
    "username": null,
    "profileUrl": "",
    "url": "https://www.commercialcafe.com/commercial-real-estate/us/tx/austin/",
    "description": "Sublease available, downtown Austin. Broker contact: congress.leasing.team@yahoo.com",
    "email": "congress.leasing.team@yahoo.com",
    "emailDomain": "@yahoo.com",
    "possiblyTruncated": true,
    "foundAt": "2026-03-13T10:41:44Z"
  }
]
```

### Use cases for the CommercialCafe Email Scraper

Read this table with the yield note in mind: these are realistic supplementary uses, not primary channels.

| Audience | How they use the CommercialCafe Email Scraper |
|---|---|
| Office market researchers | Pick up leasing and report contacts attached to metro office market pages. |
| Coworking and flex operators | Find leasing contacts on office and coworking listing pages in a target metro. |
| Facilities and building services suppliers | Reach the leasing side of buildings advertising availability. |
| CRE technology vendors | Add a small number of incremental contacts to a list built from stronger sources. |
| Lenders and debt brokers | Use as a coverage top-up when a metro is thin on the larger marketplaces. |
| Title and appraisal firms | Cross-check a market list for contacts the bigger portals missed. |
| Property marketing agencies | Identify listings whose marketing pages are thin and pitch accordingly. |
| Data teams building a market map | Merge on `email` with other Actors to widen coverage of a metro. |

The CommercialCafe Email Scraper is a top-up, not a pipeline.
If you need a primary commercial source, start with the **Showcase Email Scraper** or the [Crexi Email Scraper](https://apify.com/leads-scraper/crexi-email-scraper) instead.

### CommercialCafe Email Scraper examples

A coworking operator expanding into Austin runs the CommercialCafe Email Scraper with `keywords` set to `["coworking space", "office space"]` and `location` `"Austin"`.
They set `maxEmails` to 100 knowing the run will very likely finish well short of it.
Whatever it returns goes into the same sheet as their LoopNet and Showcase results, deduplicated on `email`.

A facilities services firm covering Illinois widens `customDomains` to `["@gmail.com","@yahoo.com","@outlook.com","@hotmail.com"]`.
Widening domains is the highest-return adjustment on a thin source, because every additional consumer mailbox domain is a genuinely new chance at a match.
They then run the CommercialCafe Email Scraper across `"Chicago"`, `"Naperville"` and `"Rockford"` separately.

A data team building a national office-market contact map schedules the CommercialCafe Email Scraper monthly.
Individual runs are small, but the dataset accumulates and the index does change over time.
They deduplicate on `email` between runs and keep `foundAt` to track when each contact first appeared.

### Responsible use of scraped commercial contacts

Everything the CommercialCafe Email Scraper returns was already published on a public web page and indexed by Google.
That does not make every downstream use lawful, and knowing which rules apply to you is your responsibility.
What follows is practical guidance, not legal advice.

Under CAN-SPAM in the United States, commercial email must avoid deceptive headers and subject lines, identify itself as an advertisement where required, include a valid physical postal address, and honour opt-out requests promptly.
Under the GDPR and UK GDPR, a named individual's business address is still personal data, so you need a lawful basis, a genuine legitimate-interest assessment where you rely on one, transparency about the source, and a working route to object or erase.
ePrivacy rules and several EU member states add consent requirements for electronic marketing that go beyond the GDPR baseline.

Operational habits matter as much as the statute when you work with CommercialCafe Email Scraper output.
Given how often CommercialCafe rows are team or listing inboxes rather than named individuals, be especially careful that your message is relevant to whoever actually reads it.
Hold `possiblyTruncated` rows out of a first send, keep a suppression list across runs, and retain `query` and `foundAt` as provenance.

### Limitations of the CommercialCafe Email Scraper

**CommercialCafe indexes market-report and listing pages rather than broker profiles, so expect low volume and few resolvable handles.**
In a measured live run the CommercialCafe Email Scraper parsed 3 blocks, identified 0 named brokers and returned 1 unique email.
That is the leading limitation and it will not be engineered away, because the constraint is what Google has indexed.

The CommercialCafe Email Scraper only finds accounts whose email is publicly visible in Google's index.
A leasing contact behind a form or inside an image will never appear, however many pages you fetch.

Google caps a single query at roughly 300 results, which is why query expansion exists.
On a thin source the cap is rarely the binding constraint, but leaving `expandQueries` on still maximises the number of distinct pages the Actor sees.

`username` and `profileUrl` are only populated when CommercialCafe exposes a handle in the Google result.
Here that is uncommon, so most rows carry `accountName` with an empty `username` and `profileUrl`. That is a Google limitation, not a bug.

`possiblyTruncated: true` means Google's snippet ellipsis touched the address and it may be incomplete.
The CommercialCafe Email Scraper requires the Apify GOOGLE_SERP proxy and cannot run without Apify proxy credentials.
Free Apify plans stop at 100 emails per run, and results vary with keywords, domains and location, so no volume is guaranteed.

### CommercialCafe Email Scraper FAQ

#### How many results should I expect from the CommercialCafe Email Scraper?

Very few. CommercialCafe indexes market-report and listing pages rather than broker profiles, so expect low volume and few resolvable handles.
A measured live run parsed 3 blocks, identified 0 named brokers and returned 1 unique email.

#### Then why would I run the CommercialCafe Email Scraper at all?

As a merge-in source. It reaches Yardi-network office and market-report pages that other commercial marketplaces do not carry.
A handful of incremental contacts per metro is a fair expectation.

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

No. It never logs in, never calls an API and never opens the site in a browser.
Every field comes from publicly indexed Google search results.

#### Is this an official CommercialCafe or Yardi tool?

No. It is an independent Apify Actor and is not affiliated with, supported by or endorsed by CommercialCafe or Yardi.

#### Why is `username` null on almost every row?

Because CommercialCafe's indexed pages are reports and listings, not broker profiles with handles.
Google prints no handle for those pages, so there is nothing to build a canonical profile URL from.

#### Which email domains should I use with the CommercialCafe Email Scraper?

Widen beyond the defaults immediately: add `@outlook.com` and `@hotmail.com` to `@gmail.com` and `@yahoo.com`.
On a thin source, domain breadth is the single highest-return setting.

#### Can I improve yield with better keywords?

Somewhat. Favour terms that match report and listing language, such as `"office space"`, `"sublease"` or `"coworking space"`, over profile-style terms.
Broker-profile phrasing performs poorly here for the reason stated in the yield note.

#### What does `possiblyTruncated` mean?

Google's snippet cut the text with an ellipsis close enough to the address that it may be incomplete.
Verify those rows before sending.

#### Does a CommercialCafe Email Scraper run resume if interrupted?

Yes. State lives in the key-value store keyed by an input hash, with saves on `PERSIST_STATE`, `MIGRATING` and `ABORTING`.

#### Do I need my own proxy?

No, but Apify proxy credentials are required, because the CommercialCafe Email Scraper uses the Apify GOOGLE_SERP proxy.

#### Why does my CommercialCafe Email Scraper run finish so quickly?

It ran out of indexed pages before it ran out of email budget.
That is the expected behaviour for this platform, not an error.

#### What should I pair it with?

Run the CommercialCafe Email Scraper alongside the [CommercialSearch Email Scraper](https://apify.com/neuro-scraper/commercialsearch-email-scraper) and a high-yield source, then deduplicate on `email`.

### Related Actors

| Actor | What it collects |
|---|---|
| [CommercialCafe Email and Phone Number Scraper](https://apify.com/neuro-scraper/commercialcafe-email-and-phone-number-scraper) | Emails and phone numbers from CommercialCafe |
| [CommercialCafe Phone Number Scraper](https://apify.com/neuro-scraper/commercialcafe-phone-number-scraper) | Public phone numbers from CommercialCafe |
| [Apartment List Email Scraper](https://apify.com/leads-scraper/apartment-list-email-scraper) | Public contact emails from Apartment List |
| [ApartmentFinder Email Scraper](https://apify.com/leads-scraper/apartmentfinder-email-scraper) | Public contact emails from ApartmentFinder |
| [Apartments.com Email Scraper](https://apify.com/leads-scraper/apartments-com-email-scraper) | Public contact emails from Apartments.com |
| [Century 21 Agent Email Scraper](https://apify.com/neuro-scraper/century-21-agent-email-scraper) | Public contact emails from Century 21 |
| [Coldwell Banker Agent Email Scraper](https://apify.com/neuro-scraper/coldwell-banker-agent-email-scraper) | Public contact emails from Coldwell Banker |
| [CommercialSearch Email Scraper](https://apify.com/neuro-scraper/commercialsearch-email-scraper) | Public contact emails from CommercialSearch |
| [Compass Agent Email Scraper](https://apify.com/neuro-scraper/compass-agent-email-scraper) | Public contact emails from Compass |
| [Crexi Email Scraper](https://apify.com/leads-scraper/crexi-email-scraper) | Public contact emails from Crexi |
| [Domain Agents Email Scraper](https://apify.com/leads-scraper/domain-agents-email-scraper) | Public contact emails from Domain |
| [Homes & Land Email Scraper](https://apify.com/neuro-scraper/homes-and-land-email-scraper) | Public contact emails from Homes & Land |
| [Homes.com Email Scraper](https://apify.com/leads-scraper/homes-com-email-scraper) | Public contact emails from Homes.com |
| [HotPads Email Scraper](https://apify.com/leads-scraper/hotpads-email-scraper) | Public contact emails from HotPads |
| [Keller Williams Agent Email Scraper](https://apify.com/neuro-scraper/keller-williams-agent-email-scraper) | Public contact emails from Keller Williams |
| [Land And Farm Email Scraper](https://apify.com/leads-scraper/land-and-farm-email-scraper) | Public contact emails from Land And Farm |
| [Land.com Email Scraper](https://apify.com/leads-scraper/land-com-email-scraper) | Public contact emails from Land.com |
| [LandWatch Email Scraper](https://apify.com/leads-scraper/landwatch-email-scraper) | Public contact emails from LandWatch |
| [LoopNet Email Scraper](https://apify.com/leads-scraper/loopnet-email-scraper) | Public contact emails from LoopNet |
| [OnTheMarket Email Scraper](https://apify.com/leads-scraper/onthemarket-email-scraper) | Public contact emails from OnTheMarket |
| [RealEstate.com.au Agents Email Scraper](https://apify.com/neuro-scraper/realestate-com-au-agents-email-scraper) | Public contact emails from realestate.com.au |
| [Realtor.ca Email Scraper](https://apify.com/leads-scraper/realtor-ca-email-scraper) | Public contact emails from Realtor.ca |
| [Realtor.com Rentals Email Scraper](https://apify.com/leads-scraper/realtor-com-rentals-email-scraper) | Public contact emails from Realtor.com |
| [Redfin Rentals Email Scraper](https://apify.com/leads-scraper/redfin-rentals-email-scraper) | Public contact emails from Redfin |
| [RE/MAX Agent Email Scraper](https://apify.com/leads-scraper/remax-agent-email-scraper) | Public contact emails from RE/MAX |
| [Rent.com Email Scraper](https://apify.com/leads-scraper/rent-com-email-scraper) | Public contact emails from Rent.com |
| [RentCafe Email Scraper](https://apify.com/leads-scraper/rentcafe-email-scraper) | Public contact emails from RentCafe |
| [Zillow Rentals Email Scraper](https://apify.com/leads-scraper/zillow-rentals-email-scraper) | Public contact emails from Zillow |
| [Zumper Email Scraper](https://apify.com/leads-scraper/zumper-email-scraper) | Public contact emails from Zumper |
| [Apartment List Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartment-list-email-and-phone-number-scraper) | Emails and phone numbers from Apartment List |
| [ApartmentFinder Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartmentfinder-email-and-phone-number-scraper) | Emails and phone numbers from ApartmentFinder |
| [Apartments.com Email and Phone Number Scraper](https://apify.com/neuro-scraper/apartments-com-email-and-phone-number-scraper) | Emails and phone numbers from Apartments.com |
| [Century 21 Email and Phone Number Scraper](https://apify.com/neuro-scraper/century-21-agent-email-and-phone-number-scraper) | Emails and phone numbers from Century 21 |
| [Coldwell Banker Email and Phone Number Scraper](https://apify.com/neuro-scraper/coldwell-banker-agent-email-and-phone-number-scraper) | Emails and phone numbers from Coldwell Banker |
| [CommercialSearch Email and Phone Number Scraper](https://apify.com/neuro-scraper/commercialsearch-email-and-phone-number-scraper) | Emails and phone numbers from CommercialSearch |
| [Compass Email and Phone Number Scraper](https://apify.com/neuro-scraper/compass-agent-email-and-phone-number-scraper) | Emails and phone numbers from Compass |
| [Crexi Email and Phone Number Scraper](https://apify.com/leads-scraper/crexi-email-and-phone-number-scraper) | Emails and phone numbers from Crexi |
| [Domain Email and Phone Number Scraper](https://apify.com/leads-scraper/domain-agents-email-and-phone-number-scraper) | Emails and phone numbers from Domain |
| [Homes & Land Email and Phone Number Scraper](https://apify.com/neuro-scraper/homes-and-land-email-and-phone-number-scraper) | Emails and phone numbers from Homes & Land |
| [Homes.com Email and Phone Number Scraper](https://apify.com/leads-scraper/homes-com-email-and-phone-number-scraper) | Emails and phone numbers from Homes.com |
| [Keller Williams Email and Phone Number Scraper](https://apify.com/neuro-scraper/keller-williams-agent-email-and-phone-number-scraper) | Emails and phone numbers from Keller Williams |
| [Land And Farm Email and Phone Number Scraper](https://apify.com/neuro-scraper/land-and-farm-email-and-phone-number-scraper) | Emails and phone numbers from Land And Farm |

### Leave a review

If the CommercialCafe 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 about the CommercialCafe Email Scraper, bug reports or a request for a custom build: contact neurodata.apify@gmail.com.

# Actor input Schema

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

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

## `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": [
    "commercial broker",
    "office space"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "maxEmails": 20,
  "countryCode": "",
  "expandQueries": true,
  "queryModifiers": [
    "email",
    "contact",
    "listing agent",
    "inquiries",
    "broker"
  ],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

# Actor output Schema

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

Records produced by CommercialCafe 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": [
        "commercial broker",
        "office space"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "listing agent",
        "inquiries",
        "broker"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/commercialcafe-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": [
        "commercial broker",
        "office space",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "listing agent",
        "inquiries",
        "broker",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/commercialcafe-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": [
    "commercial broker",
    "office space"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "listing agent",
    "inquiries",
    "broker"
  ]
}' |
apify call neuro-scraper/commercialcafe-email-scraper --silent --output-dataset

```

## MCP server setup

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