# Hotfrog Email Scraper (`leads-scraper/hotfrog-email-scraper`) Actor

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

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

### Hotfrog Email Scraper

Read this before you run anything. Hotfrog blocks most of its listing pages from search engines, so the Hotfrog Email Scraper often returns nothing at all - our own measured Google run came back with zero result blocks.

That is not a defect in the Actor. It is a property of how Hotfrog exposes its directory to search engines, and no Google-based tool can read pages that Google is not allowed to index.

If you need local business emails today, use the [Brownbook Email Scraper](https://apify.com/neuro-scraper/brownbook-email-scraper), the [Cylex Email Scraper](https://apify.com/neuro-scraper/cylex-email-scraper) or the [Fyple Email Scraper](https://apify.com/neuro-scraper/fyple-email-scraper) instead. They cover the same local-directory ground far better.

#### Why the Hotfrog Email Scraper still exists

Indexing policies change. Directories loosen and tighten their crawl rules over time, and a domain that returns nothing this quarter can open up next quarter.

The Hotfrog Email Scraper is kept published and maintained so that if Hotfrog's index reopens, you already have a configured Actor pointed at it. Running it costs very little precisely because there is so little to fetch.

It is also useful as a control. If you are benchmarking directory coverage across a market, a zero from the Hotfrog Email Scraper is a real data point about that directory's visibility.

#### What the Hotfrog Email Scraper does

The Hotfrog Email Scraper builds Google queries with the `site:` operator against `hotfrog.com`. It parses each returned result block structurally, locating the `<h3>` title and the smallest surrounding block.

A domain-filtered regex extracts emails from that block text. Matches are normalised, deduplicated globally and written to your Apify dataset immediately.

The Hotfrog Email Scraper never logs into Hotfrog, never uses a Hotfrog API and never opens the Hotfrog website. There is no browser, no JavaScript rendering, no authentication and no cookies - which is also why it cannot route around Hotfrog's crawl restrictions.

#### Features of the Hotfrog Email Scraper

Every capability below is implemented in the Hotfrog Email Scraper and applies to any results Google does return.

| Feature | What it means in practice |
|---|---|
| Google `site:` search over `hotfrog.com` | Targets whatever Hotfrog pages Google has indexed |
| Query expansion | Base, quoted and `intitle:` variants plus one query per modifier; base queries run first |
| Domain filtering | Only emails ending in your `customDomains` values are kept |
| Global deduplication | Each email is emitted once per run across every query and page |
| Email normalisation | Handles `name [at] domain [dot] com`, `name (at) domain`, `name @ domain.com`, `domain .com`, zero-width characters and the full-width `＠` |
| 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 | Works from the `<h3>` title, not Google's CSS class names |
| Whole-page fallback parser | A markup change degrades to "emails without account details", not "no emails" |
| Concurrency control | `asyncio` worker pool with a shared stop signal on `maxEmails` |
| Retries and block detection | Up to 3 attempts per page, exponential backoff, fresh proxy session per request, CAPTCHA and consent pages detected and retried |
| 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` |
| Run summary logging | Pages fetched, blocked pages, retries and emails per page |

Note the distinction the run log makes. A blocked page is retried; an empty index simply produces no blocks, which is what the Hotfrog Email Scraper typically encounters.

#### How the Hotfrog Email Scraper works

A run of the Hotfrog Email Scraper follows six steps, whether or not it finds anything.

1. Read your input: keywords, location, email domains and limits.
2. Build queries such as `site:hotfrog.com electrician "@gmail.com" "Manchester"`.
3. Fetch Google result pages through the Apify GOOGLE_SERP proxy using async `aiohttp`.
4. Parse each result block structurally to isolate title, business label and snippet.
5. Extract and normalise emails with a domain-filtered regex.
6. Deduplicate globally and push each lead to the dataset immediately.

Steps 4 through 6 only do work when step 3 returns indexed listing pages. On Hotfrog they usually have nothing to chew on, which is why the Hotfrog Email Scraper so often finishes with an empty dataset.

#### Input fields for the Hotfrog Email Scraper

These are the exact inputs the Hotfrog Email Scraper accepts, with its shipped defaults.

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["small business", "services"]` | Search terms describing the businesses 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 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 for the Hotfrog Email Scraper

```json
{
  "keywords": ["electrician", "removals", "commercial cleaning"],
  "location": "Manchester",
  "customDomains": ["@gmail.com", "@yahoo.co.uk", "@hotmail.co.uk"],
  "maxEmails": 100,
  "countryCode": "GB",
  "expandQueries": true,
  "queryModifiers": ["email", "contact", "enquiries"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Location and country settings in the Hotfrog Email Scraper

Hotfrog operates in the US, UK, Australia and parts of Europe, so in principle `location` and `countryCode` should be your main levers. In practice the index restriction limits what either can do.

If you want to test whether coverage has reopened, try a large market first. `"Manchester"`, `"Birmingham"`, `"Sydney"`, `"Melbourne"`, `"Phoenix"` and `"Auckland"` are reasonable probes.

Set `countryCode` to match: `GB`, `AU`, `US` or `NZ`. A matching vantage point gives the Hotfrog Email Scraper its best chance of seeing whatever regional pages are indexed.

If several probes return nothing, stop the Hotfrog Email Scraper and switch Actors rather than burning compute on more permutations.

There is no keyword, domain list or location that makes the Hotfrog Email Scraper read pages Google was never allowed to index.

#### Output fields from the Hotfrog Email Scraper

When the Hotfrog Email Scraper does find a row, that row 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 post captions |
| `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` | Bio snippet, cleaned of labels and engagement 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 from the Hotfrog Email Scraper

This is the shape of a row on the rare occasions the Hotfrog Email Scraper finds one. Most runs return an empty dataset.

```json
[
  {
    "network": "Hotfrog",
    "keyword": "electrician",
    "query": "site:hotfrog.com electrician \"@gmail.com\" \"Manchester\"",
    "title": "Northgate Electrical Services - Hotfrog",
    "accountName": "Northgate Electrical Services",
    "fullName": "Northgate Electrical Services",
    "username": null,
    "profileUrl": "",
    "url": "",
    "description": "Domestic and commercial electrical contractor covering Greater Manchester. Enquiries northgate.elec@gmail.com",
    "email": "northgate.elec@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T13:41:02.775Z"
  }
]
```

#### Use cases for the Hotfrog Email Scraper

Be realistic. These are the situations where running the Hotfrog Email Scraper is a sensible use of time.

| Use case | Who runs it | Typical setup |
|---|---|---|
| Index-availability probe | Data engineer | One keyword, one city, `maxEmails: 20` |
| Directory coverage benchmark | Market researcher | Same keyword run across several sibling directory Actors |
| Long-tail sweep after a policy change | Growth team | Re-run quarterly to see whether coverage reopened |
| Completeness check on an existing list | RevOps team | Confirm nothing unique sits on Hotfrog |
| Multi-source local lead build | Local marketing agency | Run Brownbook and Cylex first; add this as a tail |
| Cheap regression test | Developer | Verify Actor configuration and proxy setup end to end |

For a real local lead-generation programme, the Brownbook, Cylex and Fyple Actors do the work this one cannot.

#### Realistic expectations from the Hotfrog Email Scraper

Our measured Google run of the Hotfrog Email Scraper returned zero result blocks, zero identified businesses and zero emails. Comparable runs on Brownbook returned 9 blocks and 9 unique emails; N49 and Fyple both returned 10 and 10.

So the honest answer to "how many results should I expect" is: quite possibly none. Budget your time accordingly.

Widening `customDomains`, adding keywords or changing `location` will not overcome an index restriction. Those levers help on directories Google is allowed to crawl.

#### Responsible use, GDPR and CAN-SPAM

If the Hotfrog Email Scraper does return rows, they contain only addresses published on a public listing. Sending obligations still sit with you, and this is guidance rather than legal advice.

CAN-SPAM requires accurate headers, an honest subject line, a physical postal address and a working opt-out honoured promptly. GDPR and UK GDPR require a lawful basis, a privacy notice and a route to erasure - directly relevant given Hotfrog's UK and European footprint.

A sole trader's `firstname@gmail.com` is personal data even when published for business reasons. Suppress opt-outs, record provenance, and do not resell the raw dataset.

#### Limitations of the Hotfrog Email Scraper

The first bullet is the one that matters most when evaluating the Hotfrog Email Scraper.

- Hotfrog blocks most of its listing pages from search engines, so this Actor often returns nothing. This is the dominant limitation and the reason to prefer the Brownbook, Cylex and Fyple Actors for local-directory coverage.
- Only finds businesses whose email is publicly visible in Google's index.
- Google caps a single query at roughly 300 results, which is why query expansion exists.
- `possiblyTruncated: true` means Google's snippet ellipsis touched the address - verify before sending.
- `username` and `profileUrl` are populated only when Google's result exposes a handle. Rows without one still carry `accountName`, `fullName` and the email. This is a Google limitation, not a bug.
- Requires the Apify GOOGLE_SERP proxy; the Hotfrog Email Scraper cannot run without Apify proxy credentials.
- Free Apify plans are capped at 100 emails per run; paid plans are uncapped.
- Results vary with keywords, domains and location, and no volume is guaranteed.

#### Hotfrog Email Scraper FAQ

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

Very likely zero. Hotfrog blocks most of its listing pages from search engines, and our measured run returned nothing. Treat any row you do get as a bonus.

#### Is the Actor broken?

No. The Hotfrog Email Scraper reads publicly indexed Google results, and Hotfrog restricts what Google may index. An empty dataset is the correct outcome, not a failure.

#### What should I run instead?

The [Brownbook Email Scraper](https://apify.com/neuro-scraper/brownbook-email-scraper), [Cylex Email Scraper](https://apify.com/neuro-scraper/cylex-email-scraper) and [Fyple Email Scraper](https://apify.com/neuro-scraper/fyple-email-scraper) cover the same local-directory ground and returned 9 to 10 blocks each in our measured runs.

#### Would a browser-based scraper do better?

Possibly, but that is not what this Actor is. The Hotfrog Email Scraper deliberately uses only publicly indexed search results - no browser, no login, no API.

#### Can changing keywords fix the yield?

No. Keyword changes cannot make Google index pages it is not permitted to crawl.

#### Does `countryCode` help?

It aligns the search vantage point with Hotfrog's regional sites, which is worth trying once. It will not overcome the index restriction.

#### Why keep it published?

Because indexing policies change. If Hotfrog reopens its listings, the Hotfrog Email Scraper is already configured and ready.

#### Do I still need Apify proxy credentials?

Yes. The Hotfrog Email Scraper runs on the Apify GOOGLE_SERP proxy and cannot operate without it, even when the run returns nothing.

#### Will an empty run still cost compute?

It costs very little, since there are few pages to fetch. That is why using it as a periodic probe is inexpensive.

#### Does the free plan matter here?

Rarely. The free plan's 100-email run cap is almost never the binding constraint on the Hotfrog Email Scraper.

#### What do the output rows look like if I do get some?

Exactly the fourteen fields listed above, with `username` typically `null` and `profileUrl` empty.

### Related Actors

| Actor | What it collects |
|---|---|
| [Hotfrog Email and Phone Number Scraper](https://apify.com/neuro-scraper/hotfrog-email-and-phone-number-scraper) | Emails and phone numbers from Hotfrog |
| [Hotfrog Phone Number Scraper](https://apify.com/neuro-scraper/hotfrog-phone-number-scraper) | Public phone numbers from Hotfrog |
| [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 |
| [Houzz Email Scraper](https://apify.com/leads-scraper/houzz-email-scraper) | Public contact emails from Houzz |
| [Infobel Email Scraper](https://apify.com/neuro-scraper/infobel-email-scraper) | Public contact emails from Infobel |
| [Kompass Email Scraper](https://apify.com/leads-scraper/kompass-email-scraper) | Public contact emails from Kompass |
| [Lacartes Email Scraper](https://apify.com/neuro-scraper/lacartes-email-scraper) | Public contact emails from Lacartes |
| [Manta Email Scraper](https://apify.com/leads-scraper/manta-email-scraper) | Public contact emails from Manta |
| [MapQuest Email Scraper](https://apify.com/neuro-scraper/mapquest-email-scraper) | Public contact emails from MapQuest |
| [N49 Email Scraper](https://apify.com/neuro-scraper/n49-email-scraper) | Public contact emails from N49 |
| [Porch Email Scraper](https://apify.com/neuro-scraper/porch-email-scraper) | Public contact emails from Porch |
| [Scoot Email Scraper](https://apify.com/neuro-scraper/scoot-email-scraper) | Public contact emails from Scoot |
| [Thomasnet Email Scraper](https://apify.com/leads-scraper/thomasnet-email-scraper) | Public contact emails from Thomasnet |
| [Thumbtack Email Scraper](https://apify.com/leads-scraper/thumbtack-email-scraper) | Public contact emails from Thumbtack |
| [Touch Local Email Scraper](https://apify.com/leads-scraper/touch-local-email-scraper) | Public contact emails from Touch Local |
| [TradeIndia Email Scraper](https://apify.com/leads-scraper/tradeindia-email-scraper) | Public contact emails from TradeIndia |
| [Trustpilot Email Scraper](https://apify.com/leads-scraper/trustpilot-email-scraper) | Public contact emails from Trustpilot |
| [Tupalo Email Scraper](https://apify.com/leads-scraper/tupalo-email-scraper) | Public contact emails from Tupalo |
| [Yalwa Email Scraper](https://apify.com/leads-scraper/yalwa-email-scraper) | Public contact emails from Yalwa |
| [Yellow Pages Email Scraper](https://apify.com/leads-scraper/yellow-pages-email-scraper) | Public contact emails from Yellow Pages |
| [Angi Email and Phone Number Scraper](https://apify.com/neuro-scraper/angi-email-and-phone-number-scraper) | Emails and phone numbers from Angi |
| [Bark Email and Phone Number Scraper](https://apify.com/neuro-scraper/bark-email-and-phone-number-scraper) | Emails and phone numbers from Bark |
| [Better Business Bureau Email and Phone Number Scraper](https://apify.com/leads-scraper/better-business-bureau-email-and-phone-number-scraper) | Emails and phone numbers from Better Business Bureau |
| [Bizapedia Email and Phone Number Scraper](https://apify.com/neuro-scraper/bizapedia-email-and-phone-number-scraper) | Emails and phone numbers from Bizapedia |
| [Brownbook Email and Phone Number Scraper](https://apify.com/neuro-scraper/brownbook-email-and-phone-number-scraper) | Emails and phone numbers from Brownbook |

### Leave a review

If the Hotfrog 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.

# Actor input Schema

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

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

## `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": [
    "small business",
    "services"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.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 Hotfrog 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": [
        "small business",
        "services"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com"
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "enquiries",
        "owner",
        "get a quote"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("leads-scraper/hotfrog-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": [
        "small business",
        "services",
    ],
    "location": "",
    "customDomains": [
        "@gmail.com",
        "@yahoo.com",
    ],
    "countryCode": "",
    "queryModifiers": [
        "email",
        "contact",
        "enquiries",
        "owner",
        "get a quote",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("leads-scraper/hotfrog-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": [
    "small business",
    "services"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "enquiries",
    "owner",
    "get a quote"
  ]
}' |
apify call leads-scraper/hotfrog-email-scraper --silent --output-dataset

```

## MCP server setup

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