# Crexi Email Scraper (`leads-scraper/crexi-email-scraper`) Actor

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

- **URL**: https://apify.com/leads-scraper/crexi-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

### Crexi Email Scraper for investment sales and CRE broker contacts

The Crexi Email Scraper collects publicly indexed contact emails from the commercial brokers, investment sales advisors and auction teams who appear on Crexi.
You supply keywords, an optional location and the email domains you care about; the Actor returns a deduplicated dataset of leads.
Everything comes from Google's public index of crexi.com pages.

Crexi is the digital-first end of the commercial marketplace world, with a heavy weighting toward investment sales, auctions and owner-side dispositions.
That changes who you find compared with a classic listing portal: more capital-markets advisors, more auction reps, more brokers whose profile copy talks about cap rates and closed volume.
Use the Crexi Email Scraper when your buyer is the deal-side of commercial real estate rather than the leasing desk.

In a measured live run, roughly 10 parsed result blocks produced 7 identified broker records, 7 resolvable profile URLs and 9 unique emails.
More emails than identities is normal here: a single Crexi result block often exposes an advisor address alongside a team or deal inbox.
That puts the Crexi Email Scraper firmly in the strong tier of this Real Estate and Property category.

#### What the Crexi Email Scraper actually does

The Crexi Email Scraper builds Google queries using the `site:` operator against `crexi.com`, fetches result pages through the Apify GOOGLE_SERP proxy with `aiohttp`, and parses each result block structurally.
It finds the `<h3>` title, walks up to the smallest surrounding block, and runs a domain-filtered regular expression over that block's text.
Because it never relies on Google's CSS class names, a markup change degrades the run rather than killing it.

It does not log into Crexi, does not use any Crexi API and never opens crexi.com in a browser.
There is no JavaScript rendering, no authentication and no cookies in the pipeline.
Brokers on Crexi publish contact details on purpose, because an auction with no inbound bidder interest is a failed auction.

### Key features of the Crexi Email Scraper

Everything listed here ships with the Crexi Email Scraper today; none of it is a roadmap item.

| Feature | Why it matters for CRE broker contacts |
|---|---|
| Query expansion | Each keyword x domain pair runs as a base query, a quoted query, an `intitle:` query and one variant per modifier, with base queries first. |
| Global deduplication | An address surfaced by ten different queries is written 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 | Drops placeholders such as `email@`, `yourname@`, `test@`, `xxx@` and single-character local parts. |
| Boundary-correct matching | `@gmail.com` does not match inside `@gmail.company` or `@gmail.com.br`. |
| Soft-wrap repair | Discards a hit that is only the tail of another email in the same 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 instead of 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 Google layout change degrades to emails without account details, not to zero results. |
| Run summary | Pages fetched, blocked pages, retries and emails per page are logged. |

### How the Crexi Email Scraper works

First the input is read and hashed into a resumable state key.
Then the query set is built by multiplying keywords by email domains and, when `expandQueries` is on, by query modifiers.
A representative query looks like `site:crexi.com "investment sales broker" "@gmail.com" "Atlanta"`.

The Crexi Email Scraper then 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.
Because pushes are immediate, you can watch the Crexi Email Scraper build your list live in the Apify console.

A Crexi Email Scraper run stops as soon as `maxEmails` unique addresses have been reached, and that stop signal is shared across every worker.
Free Apify plans are capped at 100 emails per run; paid plans are uncapped.

### Crexi Email Scraper input fields

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["commercial broker", "commercial real estate"]` | 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 Crexi Email Scraper runs on defaults out of the box.
In practice `keywords`, `location` and `customDomains` together decide almost everything about result quality.

#### Location targeting in the Crexi Email Scraper

`location` is the most valuable input in this Actor, because commercial deal flow is intensely geographic.
An investment sales advisor covering Nashville has nothing to sell a vendor focused on Seattle, so a national sweep wastes most of its rows.
Running the Crexi Email Scraper once per target market gives you far cleaner segmentation than one undifferentiated run.

Metro phrases are the default choice: `"Atlanta"`, `"South Florida"`, `"Denver"`, `"Salt Lake City"`.
Crexi's user base skews toward secondary and tertiary markets, so metros that a national brokerage would ignore are often unusually productive here.

County phrases suit industrial, self-storage and land-adjacent product: `"Gwinnett County"`, `"Hillsborough County"`, `"Bexar County"`.
County names dominate assessor, entitlement and zoning language, which is where owner-side and development brokers write.

State phrases fit lenders, 1031 exchange intermediaries and appraisal firms that operate on statewide licences: `"Texas"`, `"Florida"`, `"Arizona"`.
Pair a state-level `location` with `countryCode: "US"` so the search proxy resolves to the right index.
Deal-type phrases such as `"net lease"` or `"self storage"` can be put in `keywords` while `location` stays geographic; mixing the two into one field dilutes both.

#### Example input JSON

```json
{
  "keywords": ["investment sales broker", "net lease advisor", "multifamily broker"],
  "location": "Atlanta",
  "customDomains": ["@gmail.com", "@yahoo.com", "@outlook.com"],
  "maxEmails": 200,
  "countryCode": "US",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "listing agent", "inquiries", "broker"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

### Crexi Email Scraper output fields

Every dataset item written by the Crexi 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 Crexi 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 |

Crexi exposes broker handles under a `/brokers/` path, which is why profile URL resolution is strong here.
Keep `query` and `foundAt` in every export; they are your provenance record if a recipient asks where their address came from.

#### Example output JSON

```json
[
  {
    "network": "Crexi",
    "keyword": "investment sales broker",
    "query": "site:crexi.com \"investment sales broker\" \"@gmail.com\" \"Atlanta\"",
    "title": "Derek Olusanya - Investment Sales Broker - Atlanta, GA | Crexi",
    "accountName": "Derek Olusanya",
    "fullName": "Derek Olusanya",
    "username": "derek-olusanya",
    "profileUrl": "https://www.crexi.com/brokers/derek-olusanya",
    "url": "https://www.crexi.com/brokers/derek-olusanya",
    "description": "Multifamily and net lease investment sales across metro Atlanta. Deal inquiries: derek.olusanya.cre@gmail.com",
    "email": "derek.olusanya.cre@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-03-12T14:02:38Z"
  },
  {
    "network": "Crexi",
    "keyword": "multifamily broker",
    "query": "site:crexi.com \"multifamily broker\" contact \"@yahoo.com\" \"Atlanta\"",
    "title": "Whitfield Capital Advisors - Multifamily Broker | Crexi",
    "accountName": "Whitfield Capital Advisors",
    "fullName": "Tara Whitfield",
    "username": "tara-whitfield",
    "profileUrl": "https://www.crexi.com/brokers/tara-whitfield",
    "url": "https://www.crexi.com/brokers/tara-whitfield",
    "description": "Value-add multifamily dispositions, 20 to 200 units. Offers to tara.whitfield.capital@yahoo.com",
    "email": "tara.whitfield.capital@yahoo.com",
    "emailDomain": "@yahoo.com",
    "possiblyTruncated": false,
    "foundAt": "2026-03-12T14:03:11Z"
  }
]
```

### Use cases for the Crexi Email Scraper

| Audience | How they use the Crexi Email Scraper |
|---|---|
| CRE technology vendors | Reach deal management, underwriting and offering-memorandum software buyers market by market. |
| Lenders and debt brokers | Target the advisors running dispositions that will need acquisition or bridge debt. |
| Title, escrow and closing firms | Build a county-level list of the brokers who route commercial closings. |
| Appraisal and valuation firms | Find brokers who commission valuations for a specific asset class. |
| Tenant-rep and brokerage recruiters | Source licensed advisors by specialty and market for hiring pipelines. |
| Construction and facilities suppliers | Reach the teams who specify capex and tenant improvement work post-close. |
| Property marketing agencies | Pitch OM design, drone, photography and video to active auction and listing teams. |
| 1031 exchange and QI services | Prospect the advisors whose sellers will need a qualified intermediary. |

The Crexi Email Scraper is a top-of-funnel sourcing step, not a complete go-to-market motion.
It gives you a defensible starting list; segmentation, verification and messaging remain your work.

### Crexi Email Scraper examples

A PropTech vendor selling underwriting software runs the Crexi Email Scraper with `keywords` set to `["investment sales broker", "capital markets advisor"]` and `location` `"South Florida"`.
With `maxEmails` at 150 and expansion on, the Actor cycles through base, quoted, `intitle:` and modifier variants until the cap is hit.
Because each row records the `keyword` that produced it, the vendor can write two distinct opening lines without extra enrichment.

A regional lender wants coverage across three secondary markets.
They run the Crexi Email Scraper three times with `location` set to `"Chattanooga"`, `"Huntsville"` and `"Greenville"`, keeping keywords constant.
Comparing dataset sizes tells them where broker density and email visibility justify a dedicated originator.

A title company merges commercial sources for one state.
They run the Crexi Email Scraper alongside the [LoopNet Email Scraper](https://apify.com/leads-scraper/loopnet-email-scraper) and the **Showcase Email Scraper**, then deduplicate on `email`.
Adding `@outlook.com` and `@hotmail.com` to `customDomains` raises yield noticeably, because independent advisors use consumer mailboxes far more than national firms do.

### Responsible use of scraped broker contacts

Everything the Crexi 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.
The notes below are 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, carry a valid physical postal address, and honour opt-outs promptly.
Under the GDPR and UK GDPR, a named individual's business address is still personal data, so you need a lawful basis, a real 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 beyond the GDPR baseline.

Operational habits matter as much as the statute when you work with Crexi Email Scraper output.
Hold `possiblyTruncated` rows out of your first send, verify before a large campaign, maintain a suppression list across every future run, and keep `query` and `foundAt` as provenance.
Specific, relevant messages to a broker about their own market rarely generate complaints.

### Limitations of the Crexi Email Scraper

The Crexi Email Scraper only finds accounts whose email is publicly visible in Google's index.
An advisor who keeps their address behind a contact form or inside an image will never appear, no matter how many pages you fetch.

Google caps a single query at roughly 300 results, which is exactly why query expansion exists.
Leaving `expandQueries` on turns one 300-result ceiling into dozens of them.

`username` and `profileUrl` are only populated when Crexi exposes a handle in the Google result.
Resolution is strong here, but where Google prints only a display name those rows carry `accountName` and `fullName` 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 Crexi 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.

### Crexi Email Scraper FAQ

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

In a measured live run, about 10 parsed result blocks produced 7 identified records, 7 profile URLs and 9 unique emails.
That is a strong ratio for this category, but yield still moves with your keywords, domains and location.

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

No. It never logs in, never calls a Crexi API and never opens crexi.com in a browser.
Every field is derived from publicly indexed Google search results.

#### Is this an official Crexi tool?

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

#### Why does the Crexi Email Scraper return more emails than identified people?

A single result block can expose an individual advisor address plus a team or deal inbox.
Both are captured, deduplicated globally, and written as separate rows.

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

Start with the defaults `@gmail.com` and `@yahoo.com`, then add `@outlook.com` and `@hotmail.com`.
Independent and boutique advisors use consumer mailboxes far more often than institutional firms.

#### Can the Crexi Email Scraper target one asset class?

Yes, but put the asset class in `keywords` and keep `location` geographic.
`["self storage broker", "net lease advisor"]` with `location: "Phoenix"` works much better than cramming both into one field.

#### What does `possiblyTruncated` mean?

Google's snippet cut the text with an ellipsis close enough to the address that it may be incomplete.
Treat those rows as leads to verify rather than send-ready contacts.

#### Why are some rows missing `username` and `profileUrl`?

Google sometimes prints only a display name for a page, with no handle to build a canonical `/brokers/` URL from.
Those rows still carry a usable email plus `accountName` and `fullName`.

#### How do I get more results out of the Crexi Email Scraper?

Add keywords, add domains, raise `maxEmails`, keep expansion on, and split one broad run into several location-specific runs.
Merging with the [CommercialSearch Email Scraper](https://apify.com/neuro-scraper/commercialsearch-email-scraper) on `email` is the single most effective tactic.

#### Does a Crexi Email Scraper run resume if it is 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 Crexi Email Scraper uses the Apify GOOGLE_SERP proxy.

#### How long does a Crexi Email Scraper run take?

It depends on `maxEmails`, `maxPagesPerQuery` and `maxConcurrency`.
Higher concurrency is faster but raises the chance of blocked pages, which the Actor detects and retries.

### Related Actors

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

## `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",
    "commercial real estate"
  ],
  "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 Crexi 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",
        "commercial real estate"
    ],
    "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("leads-scraper/crexi-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",
        "commercial real estate",
    ],
    "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("leads-scraper/crexi-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",
    "commercial real estate"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "listing agent",
    "inquiries",
    "broker"
  ]
}' |
apify call leads-scraper/crexi-email-scraper --silent --output-dataset

```

## MCP server setup

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