# Tupalo Email Scraper (`leads-scraper/tupalo-email-scraper`) Actor

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

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

### Tupalo Email Scraper

The Tupalo Email Scraper searches publicly indexed Tupalo pages for venue and business contact emails across `tupalo.net` and `tupalo.com`. Read the caveat first: Tupalo has a small indexed footprint, so expect very low volume.

Our measured Google run of the Tupalo Email Scraper parsed a single result block. That is thin, and there is no point dressing it up.

Treat the Tupalo Email Scraper as a European coverage check rather than a lead engine. For volume on the same kind of local and hospitality keywords, run 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).

#### What the Tupalo Email Scraper does

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

A domain-filtered regex then extracts any email present in the block text. Matches are normalised, deduplicated globally and pushed to your Apify dataset immediately.

The Tupalo Email Scraper never logs into Tupalo, never uses a Tupalo API and never opens the Tupalo website. There is no browser, no JavaScript rendering, no authentication and no cookies.

#### Where the Tupalo Email Scraper still fits

Tupalo grew out of the European city-guide tradition, with strong roots in Vienna and the German-speaking markets. Its listings skew towards cafes, restaurants, bars and neighbourhood retail.

That focus makes the Tupalo Email Scraper occasionally useful to hospitality suppliers and city-guide researchers working Central Europe. A single venue contact from a district nobody else indexes can still be worth having.

Local SEO consultants use it for citation audits. If a client appears on Tupalo with outdated details, that is a finding worth acting on.

#### Features of the Tupalo Email Scraper

Everything below is implemented in the Tupalo Email Scraper and applies to whatever Google returns.

| Feature | What it means in practice |
|---|---|
| Google `site:` search over `tupalo.net` and `tupalo.com` | Covers both Tupalo domains in one run |
| 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 |

#### How the Tupalo Email Scraper works

A run of the Tupalo Email Scraper follows six steps, however little it finds.

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

Step 3 is the bottleneck. With a small indexed footprint, the Tupalo Email Scraper rarely has much to parse.

#### Input fields for the Tupalo Email Scraper

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

| Field | Type | Default | Meaning |
|---|---|---|---|
| `keywords` | array (required) | `["local business", "restaurant"]` | Search terms describing the venues 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 Tupalo Email Scraper

```json
{
  "keywords": ["cafe", "restaurant", "weinbar"],
  "location": "Wien",
  "customDomains": ["@gmail.com", "@gmx.at", "@aon.at", "@web.de"],
  "maxEmails": 50,
  "countryCode": "AT",
  "expandQueries": true,
  "queryModifiers": ["email", "kontakt", "contact"],
  "maxPagesPerQuery": 30,
  "maxConcurrency": 5
}
```

#### Location: the highest-leverage input in the Tupalo Email Scraper

On a thin index, geography decides whether you see anything. Give the Tupalo Email Scraper a specific European city, and use the local spelling.

Vienna and the DACH region are the best probes: `"Wien"`, `"Graz"`, `"Salzburg"`, `"Muenchen"`, `"Zuerich"` and `"Berlin"`. District names such as `"Neubau"` or `"Leopoldstadt"` narrow further.

Set `countryCode` to match - `AT`, `DE` or `CH` - so the Tupalo Email Scraper searches from a regional vantage point.

Google caps a single query at roughly 300 results, but Tupalo's index limit binds long before that. If several city probes come back empty, switch Actors.

Adjust `customDomains` to the market. `@gmx.at`, `@aon.at`, `@gmx.de` and `@web.de` matter far more here than the American defaults.

#### Output fields from the Tupalo Email Scraper

When the Tupalo Email Scraper writes 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 Tupalo Email Scraper

This is the shape of a row when the Tupalo Email Scraper finds one. Most runs return one row or none.

```json
[
  {
    "network": "Tupalo",
    "keyword": "cafe",
    "query": "site:tupalo.net cafe \"@gmail.com\" \"Wien\"",
    "title": "Cafe Sonnenhof - Wien Neubau - Tupalo",
    "accountName": "Cafe Sonnenhof",
    "fullName": "Cafe Sonnenhof",
    "username": null,
    "profileUrl": "",
    "url": "",
    "description": "Wiener Kaffeehaus mit Fruehstueck und Mittagsmenue. Reservierungen: cafesonnenhof.wien@gmail.com",
    "email": "cafesonnenhof.wien@gmail.com",
    "emailDomain": "@gmail.com",
    "possiblyTruncated": false,
    "foundAt": "2026-08-31T21:09:47.226Z"
  }
]
```

#### Use cases for the Tupalo Email Scraper

These are the jobs the Tupalo Email Scraper can genuinely do at its current index size.

| Use case | Who runs it | Typical setup |
|---|---|---|
| Central European citation audit | Local SEO consultant | Client venue name plus `location: "Wien"` |
| Directory coverage matrix | Market researcher | Same keyword across several sibling Actors |
| Hospitality supplier spot-check | Drinks or food distributor | `["weinbar", "restaurant"]`, `location: "Graz"` |
| District-level venue mapping | City-guide researcher | One keyword across several Vienna districts |
| Long-tail completeness sweep | Marketing agency | Run last, after the high-yield directories |
| Configuration smoke test | Developer | Verify proxy and input wiring end to end |

For volume, the Brownbook, Cylex, Fyple and Infobel Actors are the right tools.

#### What to expect from a Tupalo Email Scraper run

Our measured Google run of the Tupalo Email Scraper parsed 1 result block. Tupalo has a small indexed footprint, so expect very low volume.

For contrast, the same code returned 9 blocks and 9 unique emails on Brownbook, and 10 and 10 on N49 and Fyple. The Actor is identical; the source is not.

One run answers "did we check Tupalo?". It will not answer "where do I get a thousand European venue contacts?".

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

Anything the Tupalo Email Scraper returns was published on a public listing. Sending obligations stay with you, and this section is guidance rather than legal advice.

GDPR is the governing framework for Tupalo's European footprint: you need a lawful basis, a clear privacy notice at or before first contact, and a route to erasure. Austria and Germany apply strict national rules to unsolicited commercial email, so take advice before a cold send.

CAN-SPAM applies to any US recipients - accurate headers, an honest subject line, a physical postal address and a prompt opt-out.

A venue owner's `firstname@gmail.com` is personal data even when published commercially. Suppress opt-outs, record provenance, and do not resell the raw dataset.

#### Limitations of the Tupalo Email Scraper

- Tupalo has a small indexed footprint, so expect very low volume. Our measured run of the Tupalo Email Scraper parsed 1 result block.
- Only finds venues whose email is publicly visible in Google's index.
- Google caps a single query at roughly 300 results, which is why query expansion exists - though the index limit binds first here.
- `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. Expect many rows with `username: null` and an empty `profileUrl`. This is a Google limitation, not a bug.
- Listings can be dated, so verify contact details before a high-value outreach sequence.
- Requires the Apify GOOGLE_SERP proxy; the Tupalo 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.

#### Tupalo Email Scraper FAQ

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

Very few. Our measured run parsed 1 result block. Tupalo has a small indexed footprint, so expect very low volume.

#### Is an empty dataset a bug?

No. It is a realistic outcome for the Tupalo Email Scraper given how little of Tupalo is indexed.

#### What should I run instead for volume?

The [Brownbook Email Scraper](https://apify.com/neuro-scraper/brownbook-email-scraper), Cylex Actor, Fyple Actor and Infobel Actor all cover European local business far better than the Tupalo Email Scraper can.

#### Which domains does it search?

`tupalo.net` and `tupalo.com`, both in the same run.

#### Should I search in German?

Yes, for DACH coverage. German keywords and a `"kontakt"` modifier reach listings that English terms miss.

#### Does the Tupalo Email Scraper use a Tupalo API?

No. It never logs in, never calls an API and never opens the Tupalo website. Everything comes from publicly indexed Google results.

#### Why is `username` usually `null`?

Google rarely exposes an attributable handle for these pages. Those rows still carry `accountName` and any email found.

#### Which webmail domains should I add?

`@gmx.at`, `@aon.at`, `@gmx.de`, `@web.de` and `@t-online.de` are far more productive in this region than the US defaults.

#### What does `possiblyTruncated` mean?

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

#### Do I need Apify proxy credentials?

Yes. The Tupalo Email Scraper runs on the Apify GOOGLE_SERP proxy and cannot operate without it.

#### Does the free plan matter here?

Rarely. The 100-email run cap is almost never the binding constraint on the Tupalo Email Scraper.

#### Can a run resume after a migration?

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

### Related Actors

| Actor | What it collects |
|---|---|
| [Angi Email Scraper](https://apify.com/leads-scraper/angi-email-scraper) | Public contact emails from Angi |
| [Bark Email Scraper](https://apify.com/leads-scraper/bark-email-scraper) | Public contact emails from Bark |
| [Better Business Bureau Email Scraper](https://apify.com/leads-scraper/better-business-bureau-email-scraper) | Public contact emails from Better Business Bureau |
| [Bizapedia Email Scraper](https://apify.com/neuro-scraper/bizapedia-email-scraper) | Public contact emails from Bizapedia |
| [Brownbook Email Scraper](https://apify.com/neuro-scraper/brownbook-email-scraper) | Public contact emails from Brownbook |
| [Callupcontact Email Scraper](https://apify.com/neuro-scraper/callupcontact-email-scraper) | Public contact emails from CallUpContact |
| [Capterra Email Scraper](https://apify.com/leads-scraper/capterra-email-scraper) | Public contact emails from Capterra |
| [Clutch Email Scraper](https://apify.com/leads-scraper/clutch-email-scraper) | Public contact emails from Clutch |
| [Crunchbase Email Scraper](https://apify.com/leads-scraper/crunchbase-email-scraper) | Public contact emails from Crunchbase |
| [Cybo Email Scraper](https://apify.com/neuro-scraper/cybo-email-scraper) | Public contact emails from Cybo |
| [Cylex Email Scraper](https://apify.com/neuro-scraper/cylex-email-scraper) | Public contact emails from Cylex |
| [EC21 Email Scraper](https://apify.com/neuro-scraper/ec21-email-scraper) | Public contact emails from EC21 |
| [Europages Email Scraper](https://apify.com/leads-scraper/europages-email-scraper) | Public contact emails from Europages |
| [ExportHub Email Scraper](https://apify.com/neuro-scraper/exporthub-email-scraper) | Public contact emails from ExportHub |
| [FindUsLocal Email Scraper](https://apify.com/neuro-scraper/finduslocal-email-scraper) | Public contact emails from FindUsLocal |
| [Foursquare Email Scraper](https://apify.com/neuro-scraper/foursquare-email-scraper) | Public contact emails from Foursquare |
| [Fyple Email Scraper](https://apify.com/neuro-scraper/fyple-email-scraper) | Public contact emails from Fyple |
| [G2 Email Scraper](https://apify.com/neuro-scraper/g2-email-scraper) | Public contact emails from G2 |
| [Hotfrog Email Scraper](https://apify.com/leads-scraper/hotfrog-email-scraper) | Public contact emails from Hotfrog |
| [Houzz Email Scraper](https://apify.com/leads-scraper/houzz-email-scraper) | Public contact emails from Houzz |
| [Infobel Email Scraper](https://apify.com/neuro-scraper/infobel-email-scraper) | Public contact emails from Infobel |
| [Kompass Email Scraper](https://apify.com/leads-scraper/kompass-email-scraper) | Public contact emails from Kompass |
| [Lacartes Email Scraper](https://apify.com/neuro-scraper/lacartes-email-scraper) | Public contact emails from Lacartes |
| [Manta Email Scraper](https://apify.com/leads-scraper/manta-email-scraper) | Public contact emails from Manta |
| [MapQuest Email Scraper](https://apify.com/neuro-scraper/mapquest-email-scraper) | Public contact emails from MapQuest |
| [N49 Email Scraper](https://apify.com/neuro-scraper/n49-email-scraper) | Public contact emails from N49 |
| [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 |
| [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 |
| [CallUpContact Email and Phone Number Scraper](https://apify.com/neuro-scraper/callupcontact-email-and-phone-number-scraper) | Emails and phone numbers from CallUpContact |
| [Capterra Email and Phone Number Scraper](https://apify.com/leads-scraper/capterra-email-and-phone-number-scraper) | Emails and phone numbers from Capterra |

### Leave a review

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

## `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": [
    "local business",
    "restaurant"
  ],
  "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 Tupalo 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": [
        "local business",
        "restaurant"
    ],
    "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/tupalo-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": [
        "local business",
        "restaurant",
    ],
    "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/tupalo-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": [
    "local business",
    "restaurant"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com"
  ],
  "countryCode": "",
  "queryModifiers": [
    "email",
    "contact",
    "enquiries",
    "owner",
    "get a quote"
  ]
}' |
apify call leads-scraper/tupalo-email-scraper --silent --output-dataset

```

## MCP server setup

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