# Google Maps Email Extractor Alternative — Business Leads (`actor-forge/business-leads-with-emails`) Actor

Local business leads with emails by city and category: name, address, phone, website, company emails with source page, socials and website signals (CMS, pixels, booking), from Overture Maps open data and each business's own site. No Google scraping; not affiliated with Google. $2.50 per 1,000 leads.

- **URL**: https://apify.com/actor-forge/business-leads-with-emails.md
- **Developed by:** [ActorForge](https://apify.com/actor-forge) (community)
- **Categories:** Lead generation, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 area queries

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Google Maps Email Extractor Alternative — Business Leads

Local business leads with emails: city + category → name, address, phone, website, company emails (from open Overture Maps data and each business's own website, with source page), socials and website signals (CMS, pixels, booking widget). No Google scraping. $2.50 per 1,000 enriched leads.

**A Google Maps email extractor alternative that never scrapes Google.** Type a city and a business type ("dentists in Austin TX", "restaurants in Berlin") and get one lead row per business: **name, category, address, phone, website and company emails**, plus company socials, the contact page, a contact-form flag and **website signals** for agency prospecting (HTTPS, CMS or site builder, shop platform, analytics and ad pixels, booking widget, mobile viewport, copyright year). Places come from the open **Overture Maps Foundation places dataset** (80M+ businesses worldwide, refreshed monthly). Then each business's **own website** is read once (home page plus up to 2 contact / imprint pages, robots.txt obeyed, honest user agent, no proxies) to add the emails and phones it publishes. Every email carries its source (Overture or the exact website page it was found on). Only company mailboxes are kept: personal-looking addresses are dropped and counted. **$1 per 1,000 places + $1.50 per 1,000 websites read** (chains sharing a website are charged once; blocked or failed sites are free): about **$2.50 per 1,000 fully enriched leads**, a third of the leading Google Maps email scrapers.

**What it is not:** this is not Google data. There are **no Google reviews, star ratings, review counts, opening hours or photos**. Places are as fresh as the latest monthly Overture release, coverage varies by country, and some websites block automated readers (those rows still come back, free of the website charge).

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| name | category | email | emailFoundOn | phone | website | websiteStatus | cms | copyrightYear | adPixels | licence |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Hill Country Pediatric Dentistry & Orthodontics | pediatric_dentistry | smile@hillcountrypdo.com | Overture | +15122637455 | http://www.hillcountrypdo.com/ | ok | WordPress |  |  | CDLA-Permissive-2.0 |
| Enamel Dentistry The Domain | dental_clinic | hello@enameldentistry.com | https://enameldentistry.com/ | +15125885287 | https://www.enameldentistry.com | ok | WordPress | 2026 | Meta Pixel, Google Ads | CDLA-Permissive-2.0 |
| Serenity Dental | dental_clinic | info@serenitydentalaustin.com | Overture | +15123875799 | https://serenitydentalaustin.com/ | blocked |  |  |  | CDLA-Permissive-2.0 |
| Bapu Restaurant | restaurant | reservierung@bapu-restaurant.de | https://bapu-restaurant.de/ | +493320324770 | http://bapu-restaurant.de/ | ok | WordPress | 2026 |  | CDLA-Permissive-2.0 |
| Restaurant Choi | korean_restaurant | info@choiberlin.de | https://choiberlin.de/ | +4917661941932 | http://choiberlin.de/ | ok |  | 2025 | Google Ads | CDLA-Permissive-2.0 |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `area-query` | $0.003 | once per run, when the area query returns at least one place | Any city, bbox or radius = $0.003; a query with no matching places is free |
| `place-result` | $0.001 | per lead row delivered (place data, merged contacts, sources and attribution included) | 200 dentists in Austin = $0.20 + $0.003 area query |
| `website-contacts` | $0.0015 | once per unique website per run that was read and gave at least one contact (email, phone, company social or contact page). Chain locations sharing a website are charged once; blocked, robots-disallowed, unreachable and social-only sites are free | 200 dentists with about 120 readable sites = $0.003 + $0.20 + $0.18 = $0.383 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at 1 GB = $0.00005 |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `location` | string | no | — | A city, optionally with region or country: "Austin, TX", "Berlin", "London, Ontario", "Paris France". You can also type "dentists in Austin TX" (the part before "in" becomes the category when Categories is empty), coordinates "30.2672,-97.7431,3km", or a bbox "west,south,east,north". 32,000+ cities with 15,000+ people are built in; smaller towns are looked up in Overture's own divisions data and need a region or country. Ignored when bbox or lat/lon are set. |
| `categories` | array | no | `[]` | Plain words (dentist, plumber, restaurant, coffee, hotel, lawyer...) or Overture category ids (dental_clinic, italian_restaurant...). A parent category includes its children, so restaurant also returns italian_restaurant. Empty = every place in the area. Run with listCategories to see all 2,100+ ids. |
| `maxPlaces` | integer | no | `200` | Stop after this many places (default 200). Highest-confidence places come first (nearest first for a radius search). The cap is applied before any website is read, so places beyond it are never fetched or charged. Each unique website takes about 1-5 seconds; 200 places usually finish in 1-3 minutes. |
| `enrichWebsites` | boolean | no | `true` | Read each business's own website (home page plus up to 2 contact / imprint / about pages) for company emails, phones, socials, a contact page and website signals. Off = Overture data only (no website-contacts charge). |
| `maxPagesPerSite` | integer | no | `3` | Pages read per website, including the home page (1-3). The price is per website, not per page. |
| `websiteFilter` | string | no | `"any"` | any = every place; with = only places with a website of their own; without = only places with no website or only a social / directory link (for those, see also the No Website Leads actor). |
| `onlyWithEmail` | boolean | no | `false` | Deliver only places that have a company email after the website was read. Places without one are dropped and never charged, and a website that gave no email is not charged either. |
| `includeWebsiteSignals` | boolean | no | `true` | From the home page already read (no extra requests): HTTPS, CMS or site builder (WordPress, Wix, Squarespace...), shop platform, analytics and ad pixels, a booking or ordering widget, a mobile viewport, the copyright year and response time. |
| `keyword` | string | no | `""` | Optional. Only places whose name (or brand name) contains this text, case-insensitive, e.g. "Starbucks" or "dental". |
| `minConfidence` | number | no | `0.5` | Overture's 0-1 confidence that the place exists as described. 0.5 drops most stale or duplicate records; 0.9 keeps only well-corroborated places; 0 returns everything. |
| `bbox` | array | no | — | Optional \[west, south, east, north] in degrees (longitude, latitude, longitude, latitude), e.g. \[-9.20, 38.69, -9.10, 38.76]. Up to 1.5 x 1.5 degrees (about one metro area). Takes priority over location. |
| `lat` | number | no | — | Optional centre latitude for a radius search (with lon and radiusKm). Takes priority over location. |
| `lon` | number | no | — | Optional centre longitude for a radius search. |
| `radiusKm` | number | no | — | Radius for lat/lon (default 5 km). With a city name it searches this radius around the city centre instead of the whole city. Results get distanceKm and come nearest first. |
| `countryCode` | string | no | `""` | Optional two-letter ISO code (US, DE, GB...). Picks the right city when a name exists in several countries and keeps only places whose address is in that country. |
| `requirePhone` | boolean | no | `false` | Skip places without a phone number. |
| `includePhones` | boolean | no | `true` | Phone numbers: the place's published numbers plus numbers found on its website, in E.164 (+15125550100). Fax numbers are left out. |
| `includeEmails` | boolean | no | `true` | Company emails from Overture and the business's own website. Allowlist. Kept: role and department mailboxes in English, German, French, Spanish, Italian, Dutch, Portuguese and the Nordic languages (info@, kontakt@, office@, praxis@, termine@, reservierung@, sales@...), mailboxes made of the business name or domain (galleria@ for "... Galleria", acme@acme.com), and free-mail addresses that contain the business name. Everything else on the business's domain is dropped and counted in droppedPersonalEmails: surnames and first names (mueller@, anna@), jsmith@, john.smith@, initials and Impressum owner addresses. |
| `matchAlternateCategories` | boolean | no | `false` | Also return places whose secondary (alternate) categories match, not only their main category. Wider but less precise. |
| `includeFields` | array | no | `[]` | Optional. Keep only these fields in each row (id is always kept). Any of: name, category, email, emails, phone, phones, website, websites, hasWebsite, websiteStatus, contactPageUrl, contactFormDetected, socials, emailSources, websitePhones, websiteSignals, websiteContactsCharged, websiteError, fullAddress, address, lat, lon, distanceKm, brand, confidence, categoryHierarchy, googleMapsUrl, sources, licence, licenceUrls, attribution, overtureRelease, droppedPersonalEmails. Keep attribution if you republish the data. |
| `listCategories` | boolean | no | `false` | Instead of places, output Overture's category list (id, parent, hierarchy, worldwide place count). Filter it with Categories or Name contains, e.g. "dent". Free. |
| `release` | string | no | `""` | Optional, advanced: pin an Overture release such as 2026-09-23.1. Empty = the newest release (Overture publishes monthly). |

### Limits & honest notes

- Open data plus the businesses' own websites, not Google: no reviews, ratings, review counts, opening hours, photos, popular times or price levels. The Google Maps link in each row is a plain search URL built from the name and address; nothing is fetched from Google.
- Websites are read politely: robots.txt is obeyed (a robots.txt error counts as "disallow"), one request per site at a time, up to 3 pages per site, about 20 seconds per site, and the actor stops at the first 403, 429 or CAPTCHA. It never uses proxies or a browser, so sites behind strict bot protection (often 20-35% of a city's sites) come back as websiteStatus blocked with the Overture contacts only, and are not charged.
- websiteStatus tells you what happened for each row: ok (read, contacts found), no-contacts (read, nothing found, free), blocked, robots-disallowed, unreachable, skipped-budget (all free), no-website, social-only (the only "website" is a Facebook, Instagram, linktree, WhatsApp or directory page; never fetched) or not-requested.
- Email coverage depends on the city and trade. Measured on 2026-10-22 (50 places each): Austin dentists 68% with a company email from Overture alone, 74% after reading the websites; Berlin restaurants 0% from Overture alone (the top-confidence rows carry no email), 52% after. Every row had a phone. Emails shown only as images or behind JavaScript forms are not found.
- Company contacts only, by allowlist. Kept: role and department mailboxes from a multilingual dictionary (info@, kontakt@, office@, praxis@, termine@, bookings@), mailboxes made of the business name or domain, and free-mail addresses containing the business name. Every other address on the business's domain is dropped and counted in droppedPersonalEmails: surnames (mueller@), first names, jsmith@, first.last, initials and Impressum owner addresses. A chain's location mailboxes are kept only on the row whose name matches. Social links are company profiles only (never linkedin.com/in/). You remain responsible for how you use the data under GDPR, CAN-SPAM and similar laws.
- Chains: Overture often links a chain's locations to a store-locator page on one corporate domain. That domain is read once per run and charged once; every location gets the same corporate contacts.
- Website signals come from the home page HTML only (no JavaScript is run): a CMS that hides its fingerprints, or a copyright year printed by a script, is reported as null. technologies lists at most 20 detections from a curated set of site builders, shops, analytics, ad pixels and booking widgets.
- One area per run, up to 1.5 x 1.5 degrees (about one metro area). Up to 5,000 places per run; 200 places usually take 1-3 minutes. The spend limit is respected: place rows are reserved first, websites are read only while the budget lasts (the rest come back skipped-budget, free).
- Website-derived fields (emails, phones, socials, contact page, signals) are facts each business publishes about itself on its own website. ## Data licence and attribution

Places come from the [Overture Maps Foundation](https://overturemaps.org) places theme. Each row's `sources` lists the contributing datasets with their record ids, `licence` and `licenceUrls` give the licences, and `attribution` holds the required credit lines. If you republish the data, keep the `attribution` field (or show the lines below).

- © Overture Maps Foundation, overturemaps.org
- Meta, Microsoft, PinMeTo, Krick, RenderSEO, DAC, BrightQuery: "Data from <source>. Available under CDLA Permissive 2.0." ([CDLA-Permissive-2.0](https://cdla.dev/permissive-2-0/))
- Foursquare: "Copyright 2024 Foursquare Labs, Inc. All rights reserved. Available under Apache 2.0. Foursquare data was transformed to the Overture schema. Changed: 2026-03-18." ([Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0))
- AllThePlaces: "Data from AllThePlaces. Available under CC0 1.0."

None of these licences is share-alike, so the rows may be used commercially, stored, merged with your own data and redistributed, provided the attribution and licence texts travel with them.

City boundaries used to turn a city name into a search area come from the Overture divisions theme: © OpenStreetMap contributors, Overture Maps Foundation, available under the [Open Database License (ODbL) 1.0](https://opendatacommons.org/licenses/odbl/1-0/). They are used only for the search area and are not part of the output rows. The built-in city list is a derivative database offered under the ODbL; it is rebuilt from the public Overture release by a documented query.

**Changes made by this actor:** rows are selected by area, category, name and confidence; fields are flattened and renamed; phone numbers are normalised to E.164; possibly personal emails are removed; company contacts and website signals read from each business's own website are added.

**Foursquare OS Places NOTICE** (preserved in full, as Apache-2.0 requires; also included in the run's OUTPUT record whenever Foursquare rows are delivered):

> © 2026 Foursquare Labs, Inc. All rights reserved.
>
> The Foursquare OS Places dataset (the "Data") is licensed under the Apache License, Version 2.0 (the "License"). You may not use, modify, or distribute the Data except in compliance with the License.
>
> As set forth more fully in the License, if you use, modify, or distribute the Data, you must: provide recipients with a copy of the License; if applicable, include prominent notices to the extent you've changed the Data; preserve attribution to Foursquare, including preserving the full content of this NOTICE.txt file.
>
> To ensure appropriate attribution to Foursquare, we recommend the following: if using/distributing the Data in flat file form as-is or after making changes/modifications: include this NOTICE.txt file, which may be modified to include an additional notice of your changes/modifications, if any; if using/distributing the Data in API form as-is or after making changes/modifications: include a copy of the content from this NOTICE.txt file prominently in your developer documentation for such API, which may be modified to include an additional notice of your changes/modifications, if any.
>
> You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, the Data distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

This actor is not affiliated with, endorsed by or sponsored by Google, the Overture Maps Foundation or any data contributor. "Google Maps" is a trademark of Google LLC and is used only to describe what this actor is an alternative to.

### Related ActorForge actors

- [Business Places Data — Google Maps Alternative, 80M+ POIs](https://apify.com/actor-forge/business-places-data) — the same places without website reading, $1 per 1,000
- [No Website Leads — Local Businesses Without a Website](https://apify.com/actor-forge/no-website-leads) — businesses with no website of their own, for web-design and marketing agencies
- [Contact Details Scraper](https://apify.com/actor-forge/contact-details-scraper) — company contacts for your own list of domains

### Changelog

- **2026-10-22** — Initial release: Overture Maps places merged with company contacts read from each business's own website (home + up to 2 contact/imprint pages, robots.txt obeyed, honest UA, per-host concurrency 1, stop on 403/429/CAPTCHA, SSRF guard); company-mailbox filter with source page per email; E.164 phones; company socials; website signals (HTTPS, CMS, shop, analytics, ad pixels, booking widget, viewport, copyright year); website-contacts charged once per unique website, failed sites free.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

## `location` (type: `string`):

A city, optionally with region or country: "Austin, TX", "Berlin", "London, Ontario", "Paris France". You can also type "dentists in Austin TX" (the part before "in" becomes the category when Categories is empty), coordinates "30.2672,-97.7431,3km", or a bbox "west,south,east,north". 32,000+ cities with 15,000+ people are built in; smaller towns are looked up in Overture's own divisions data and need a region or country. Ignored when bbox or lat/lon are set.

## `categories` (type: `array`):

Plain words (dentist, plumber, restaurant, coffee, hotel, lawyer...) or Overture category ids (dental_clinic, italian_restaurant...). A parent category includes its children, so restaurant also returns italian_restaurant. Empty = every place in the area. Run with listCategories to see all 2,100+ ids.

## `maxPlaces` (type: `integer`):

Stop after this many places (default 200). Highest-confidence places come first (nearest first for a radius search). The cap is applied before any website is read, so places beyond it are never fetched or charged. Each unique website takes about 1-5 seconds; 200 places usually finish in 1-3 minutes.

## `enrichWebsites` (type: `boolean`):

Read each business's own website (home page plus up to 2 contact / imprint / about pages) for company emails, phones, socials, a contact page and website signals. Off = Overture data only (no website-contacts charge).

## `maxPagesPerSite` (type: `integer`):

Pages read per website, including the home page (1-3). The price is per website, not per page.

## `websiteFilter` (type: `string`):

any = every place; with = only places with a website of their own; without = only places with no website or only a social / directory link (for those, see also the No Website Leads actor).

## `onlyWithEmail` (type: `boolean`):

Deliver only places that have a company email after the website was read. Places without one are dropped and never charged, and a website that gave no email is not charged either.

## `includeWebsiteSignals` (type: `boolean`):

From the home page already read (no extra requests): HTTPS, CMS or site builder (WordPress, Wix, Squarespace...), shop platform, analytics and ad pixels, a booking or ordering widget, a mobile viewport, the copyright year and response time.

## `keyword` (type: `string`):

Optional. Only places whose name (or brand name) contains this text, case-insensitive, e.g. "Starbucks" or "dental".

## `minConfidence` (type: `number`):

Overture's 0-1 confidence that the place exists as described. 0.5 drops most stale or duplicate records; 0.9 keeps only well-corroborated places; 0 returns everything.

## `bbox` (type: `array`):

Optional \[west, south, east, north] in degrees (longitude, latitude, longitude, latitude), e.g. \[-9.20, 38.69, -9.10, 38.76]. Up to 1.5 x 1.5 degrees (about one metro area). Takes priority over location.

## `lat` (type: `number`):

Optional centre latitude for a radius search (with lon and radiusKm). Takes priority over location.

## `lon` (type: `number`):

Optional centre longitude for a radius search.

## `radiusKm` (type: `number`):

Radius for lat/lon (default 5 km). With a city name it searches this radius around the city centre instead of the whole city. Results get distanceKm and come nearest first.

## `countryCode` (type: `string`):

Optional two-letter ISO code (US, DE, GB...). Picks the right city when a name exists in several countries and keeps only places whose address is in that country.

## `requirePhone` (type: `boolean`):

Skip places without a phone number.

## `includePhones` (type: `boolean`):

Phone numbers: the place's published numbers plus numbers found on its website, in E.164 (+15125550100). Fax numbers are left out.

## `includeEmails` (type: `boolean`):

Company emails from Overture and the business's own website. Allowlist. Kept: role and department mailboxes in English, German, French, Spanish, Italian, Dutch, Portuguese and the Nordic languages (info@, kontakt@, office@, praxis@, termine@, reservierung@, sales@...), mailboxes made of the business name or domain (galleria@ for "... Galleria", acme@acme.com), and free-mail addresses that contain the business name. Everything else on the business's domain is dropped and counted in droppedPersonalEmails: surnames and first names (mueller@, anna@), jsmith@, john.smith@, initials and Impressum owner addresses.

## `matchAlternateCategories` (type: `boolean`):

Also return places whose secondary (alternate) categories match, not only their main category. Wider but less precise.

## `includeFields` (type: `array`):

Optional. Keep only these fields in each row (id is always kept). Any of: name, category, email, emails, phone, phones, website, websites, hasWebsite, websiteStatus, contactPageUrl, contactFormDetected, socials, emailSources, websitePhones, websiteSignals, websiteContactsCharged, websiteError, fullAddress, address, lat, lon, distanceKm, brand, confidence, categoryHierarchy, googleMapsUrl, sources, licence, licenceUrls, attribution, overtureRelease, droppedPersonalEmails. Keep attribution if you republish the data.

## `listCategories` (type: `boolean`):

Instead of places, output Overture's category list (id, parent, hierarchy, worldwide place count). Filter it with Categories or Name contains, e.g. "dent". Free.

## `release` (type: `string`):

Optional, advanced: pin an Overture release such as 2026-09-23.1. Empty = the newest release (Overture publishes monthly).

## Actor input object example

```json
{
  "location": "Austin, TX",
  "categories": [
    "dentist"
  ],
  "maxPlaces": 10,
  "enrichWebsites": true,
  "maxPagesPerSite": 3,
  "websiteFilter": "any",
  "onlyWithEmail": false,
  "includeWebsiteSignals": true,
  "keyword": "",
  "minConfidence": 0.5,
  "countryCode": "",
  "requirePhone": false,
  "includePhones": true,
  "includeEmails": true,
  "matchAlternateCategories": false,
  "includeFields": [],
  "listCategories": false,
  "release": ""
}
```

# Actor output Schema

## `leads` (type: `string`):

One row per business (charged): contacts merged from Overture Maps and the business's own website.

## `signals` (type: `string`):

The same rows with the website signals flattened: HTTPS, CMS, shop, analytics, ad pixels, booking widget, viewport, copyright year.

## `summary` (type: `string`):

OUTPUT record: area, categories, websites read by status, email coverage before and after reading websites, billing, licences and notices.

# 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 = {
    "location": "Austin, TX",
    "categories": [
        "dentist"
    ],
    "maxPlaces": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("actor-forge/business-leads-with-emails").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 = {
    "location": "Austin, TX",
    "categories": ["dentist"],
    "maxPlaces": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("actor-forge/business-leads-with-emails").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 '{
  "location": "Austin, TX",
  "categories": [
    "dentist"
  ],
  "maxPlaces": 10
}' |
apify call actor-forge/business-leads-with-emails --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,actor-forge/business-leads-with-emails"
        }
    }
}
```

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/2p1r6tSOmFTsGHEPp/builds/44T5F3STP9ZHzuCVN/openapi.json
