# 📍 Google Maps Leads Scraper (`citrine_venus/google-maps-leads-scraper`) Actor

Scrape Google Maps into ready-to-use business leads: name, address, phone, website, rating, reviews, hours, categories and socials. Search by term and location or paste Maps URLs. Rich filters, no API key, results streamed live.

- **URL**: https://apify.com/citrine\_venus/google-maps-leads-scraper.md
- **Developed by:** [Data Minds](https://apify.com/citrine_venus) (community)
- **Categories:** Lead generation, SEO tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 📍 Google Maps Leads Scraper — B2B Lead Generation, Business Data & Contact Extraction

**Google Maps Leads Scraper** is a production-grade [Apify Actor](https://docs.apify.com/platform/actors) for **Google Maps scraping**, **local business lead generation** and **B2B contact extraction**. Give it a search term and a location — `plumber` in `Austin, Texas` — and it returns a clean, enriched **lead list**: business name, categories, full address, coordinates, rating, opening status, Google phone number, website, **email addresses**, extra **phone numbers** and every **social media profile** it can find — written to your Apify **Dataset** in real time.

> 💡 **Need a custom version, private integration, or a tailored lead-gen pipeline?** Email **<hello.dataminds@gmail.com>**.

Built for **sales teams**, **agencies**, **cold-email and cold-call outreach**, **local SEO**, **market research** and **CRM enrichment** — anyone who needs **verified local business data** without copying it out of Google Maps by hand.

***

### 📑 Table of contents

- [What is Google Maps Leads Scraper?](#-what-is-google-maps-leads-scraper)
- [Main features](#-main-features)
- [Who is this Actor for?](#-who-is-this-actor-for)
- [Search inputs it accepts](#-search-inputs-it-accepts)
- [Filtering configuration](#-filtering-configuration)
- [Output format (Dataset)](#-output-format-dataset)
- [Example output (JSON)](#-example-output-json)
- [Quick start](#-quick-start)
- [Input parameters reference](#%EF%B8%8F-input-parameters-reference)
- [Integrations & automation](#-integrations--automation)
- [Frequently asked questions (FAQ)](#-frequently-asked-questions-faq)
- [Troubleshooting](#%EF%B8%8F-troubleshooting)
- [Help, support & custom builds](#-help-support--custom-builds)
- [Is scraping Google Maps legal?](#%EF%B8%8F-is-scraping-google-maps-legal)
- [SEO keywords targeted](#-seo-keywords-targeted)

***

### 📍 What is Google Maps Leads Scraper?

Google Maps is the largest public directory of local businesses on earth — and the hardest to copy out by hand. Listings are paginated, the contact details you actually need (email, socials) live on the business website rather than the listing, and doing it manually costs hours per hundred prospects.

This Actor turns any Google Maps search into a **ready-to-use lead list**:

- **Searches like a human would** — your term plus a location, one search at a time, page after page.
- **Collects the full business profile** — name, categories, description, rating, address parts, coordinates, timezone, today's hours, photo, place ID, CID and the direct Maps link.
- **Opens the business website** and pulls out **emails**, **phone numbers** and **LinkedIn / Instagram / Facebook / X / YouTube / TikTok / Pinterest / Discord** profiles — including contact and about pages.
- **Verifies emails on request** — disposable, free-mail and role-inbox detection plus a mail-server deliverability probe. No third-party API key.
- **Streams every finished lead to your Dataset** — export to **JSON**, **CSV**, **Excel**, **XML**, or pull them through the [Apify API](https://docs.apify.com/api/v2).

If you have ever needed *"every dentist in Denver with an email address, as clean rows"* — this is the Actor.

***

### ✨ Main features

- 🗺️ **Bulk search input** — one term or hundreds, each searched separately and deduplicated by place.
- 📍 **Precise targeting** — free-text location, or city / state / county / postal code, plus a country and language selector.
- 🔗 **Google Maps URLs supported** — paste any place link to collect specific businesses: full `/maps/place/…` links, id-only links (`?cid=…`, `?place_id=…`) and short `maps.app.goo.gl` links all work, in bulk.
- 📧 **Email extraction** — homepage plus contact/about pages, with junk-domain and image-file filtering.
- ☎️ **Two phone sources** — the number Google publishes *and* every number found on the website (`tel:` links kept separate from loose text matches).
- 🔗 **Social profile discovery** — 8 networks, cleaned and deduplicated.
- ✅ **Built-in email verification** — free / role / disposable flags, MX lookup and an SMTP deliverability probe, no external key needed.
- 🎯 **Smart filters** — category keywords, name-match strictness, minimum rating, has/hasn't a website, skip closed places, skip big chains.
- ⭐ **Rich business profile** — description, category list, accessibility and amenity attributes, today's hours and open/closed status.
- 🧭 **Coordinates & timezone** for mapping and routing.
- 🚦 **Blocking handled for you** — the run adapts on its own when a site pushes back, with no configuration required.
- 📦 **Live dataset writes** and **seven prebuilt table views** — Overview, Contacts, Socials, Location, Business Profile, Verification, Source & IDs.
- 📊 **Run summary** stored in the key-value store, with per-search totals.

***

### 👥 Who is this Actor for?

- 🧲 **Sales & SDR teams** — build territory lists with real emails and phone numbers.
- 🏢 **Agencies** — find local businesses that have *no* website (perfect web-design prospects) or a weak one.
- 📈 **Local SEO consultants** — audit competitors by category, rating and coverage.
- 📬 **Cold email & outreach platforms** — feed clean, verified addresses straight into a sequence.
- 🔬 **Market researchers** — measure business density, ratings and category mix per area.
- 🗃️ **CRM & data teams** — enrich existing records with phone, website, socials and coordinates.
- 🧑‍💻 **Developers** — a dependable **Google Maps data API** with no scraping stack to maintain.

***

### 🔎 Search inputs it accepts

| What you provide | What happens |
|---|---|
| `restaurant` + `New York, USA` | Every matching business in that area |
| `dentist`, `orthodontist`, `oral surgeon` | Three separate searches, merged and deduplicated |
| `plumber` + city `Miami`, state `Florida` | Same as above, using precise area fields |
| `marketing agency` with **minimum rating 4.5** | Only the highly-rated ones |
| `bakery` with **only places WITHOUT a website** | Pure web-design prospect list |
| `https://www.google.com/maps/place/…` | That specific business |
| `https://www.google.com/maps?cid=…` or a `maps.app.goo.gl` short link | Same — id-only and shared links are resolved for you |

💡 **Tip:** start with `maxCrawledPlacesPerSearch: 10` to sample the data, then raise it once the shape looks right.

***

### 🎯 Filtering configuration

All filters are optional — leave them empty to take everything Google returns.

- **Category** — `categoryFilterWords` keeps a business only when a word matches its Google categories or description.
- **Name matching** — `searchMatching`: everything, name-contains-term, or exact name only.
- **Rating** — `placeMinimumStars` from 2.0 to 4.5; unrated places are dropped when a minimum is set.
- **Website** — `website`: all places, only with a website, or only without one.
- **Open status** — `skipClosedPlaces` removes permanently and temporarily closed businesses.
- **Chains** — `skipBigChains` skips global chains whose sites never carry a usable inbox.

Filters combine with AND; values inside one filter are OR.

***

### 📤 Output format (Dataset)

Every lead is one row with **44 fields**, and the Output tab ships with **seven prebuilt views** so each part of the record has its own tidy section:

| View | What it shows |
|---|---|
| ✨ **Lead Overview** | Business, category, address, phone, website, emails, rating, Maps link |
| 📧 **Contacts** | Emails, website phones, other numbers, Google phone, dialable format |
| 🔗 **Social Profiles** | LinkedIn, Instagram, Facebook, X, YouTube, TikTok, Pinterest, Discord |
| 📍 **Location & Map** | Street, city, state, postal code, country, neighborhood, coordinates, timezone |
| 🏪 **Business Profile** | Description, categories, rating, today's hours, open status, attributes, photo |
| ✅ **Email Verification** | Every address with its quality verdict |
| 🧭 **Source & IDs** | Rank, search term, place ID, CID, knowledge ID, Maps link |

#### Field groups in every row

| Group | Fields |
|---|---|
| **Identity** | `title`, `description`, `categoryName`, `categories`, `placeId`, `cid`, `googleKgId`, `url`, `imageUrl` |
| **Location** | `address`, `neighborhood`, `street`, `city`, `postalCode`, `state`, `countryCode`, `location` (lat/lng), `timeZone` |
| **Status & rating** | `totalScore`, `todayHours`, `openStatusText`, `permanentlyClosed`, `temporarilyClosed`, `additionalInfo`, `price`, `reviewsCount`, `claimThisBusiness` |
| **Contact** | `website`, `phone`, `phoneUnformatted`, `emails`, `phones`, `phonesUncertain` |
| **Social** | `linkedIns`, `twitters`, `instagrams`, `facebooks`, `youtubes`, `tiktoks`, `pinterests`, `discords` |
| **Verification & source** | `emailsVerification`, `rank`, `searchString` |

Every row carries all 44 keys in the same order, so CSV and Excel exports line up perfectly. `price`, `reviewsCount` and `claimThisBusiness` are kept for schema stability but are not published on the results feed, so they arrive as `null`.

A **run summary** — totals, per-search counts, email and phone coverage — is stored in the key-value store as `run-summary`.

***

### 🧪 Example output (JSON)

```json
{
  "rank": 1,
  "searchString": "restaurant",
  "title": "Marea",
  "description": "High-end Italian seafood & housemade pastas in a chic Central Park South setting.",
  "price": null,
  "categoryName": "Restaurant",
  "categories": ["Restaurant", "Fine dining restaurant", "Italian restaurant", "Seafood restaurant"],
  "address": "Marea, 240 Central Park S, New York, NY 10019",
  "neighborhood": "Manhattan",
  "street": "240 Central Park S",
  "city": "New York",
  "postalCode": "10019",
  "state": "New York",
  "countryCode": "US",
  "website": "https://www.marearestaurant.com/new-york",
  "phone": "(212) 582-5100",
  "phoneUnformatted": "+12125825100",
  "claimThisBusiness": null,
  "location": { "lat": 40.7674251, "lng": -73.9811137 },
  "totalScore": 4.5,
  "permanentlyClosed": false,
  "temporarilyClosed": false,
  "placeId": "ChIJvWSDS_ZYwokRiG9D395loxo",
  "cid": "0x89c258f64b8364bd:0x1aa365dedf436f88",
  "googleKgId": "/m/0g9tbbd",
  "url": "https://www.google.com/maps?cid=1919489874092846984",
  "imageUrl": "https://lh5.googleusercontent.com/…/photo.jpg",
  "timeZone": "America/New_York",
  "todayHours": "12–10 PM",
  "openStatusText": "Open · Closes 10 PM",
  "additionalInfo": {
    "Accessibility": [{ "Wheelchair accessible entrance": true }],
    "Attributes": [{ "LGBTQ+ friendly": true }]
  },
  "reviewsCount": null,
  "emails": ["info@marea-nyc.com", "kbolyai@altamareagroup.com"],
  "phones": ["+12125825100", "+13106208463"],
  "phonesUncertain": ["(212) 582-5100", "+1 (310) 620-8463"],
  "linkedIns": ["https://www.linkedin.com/showcase/marea-restaurant/"],
  "twitters": [],
  "instagrams": ["https://www.instagram.com/mareanyc/"],
  "facebooks": ["https://www.facebook.com/MareaNYC/"],
  "youtubes": [],
  "tiktoks": [],
  "pinterests": [],
  "discords": [],
  "emailsVerification": []
}
```

***

### 🚀 Quick start

#### Run in Apify Console

1. Log in at [console.apify.com](https://console.apify.com) → **Actors**.
2. Open **Google Maps Leads Scraper**.
3. Type a **search term** (for example `coffee shop`) and a **location** (`Austin, Texas`).
4. Set **Places per search term** to `10` for a first test.
5. *(Optional)* open **Quality filters** or **Contact enrichment**.
6. Click **Start** and watch each lead appear live in the log.
7. Open the **Output** tab, switch between the seven views, and export to JSON / CSV / Excel.

#### Run via API

```bash
curl -X POST "https://api.apify.com/v2/acts/YOUR_ACTOR_ID/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchStringsArray": ["coffee shop"],
    "locationQuery": "Austin, Texas",
    "maxCrawledPlacesPerSearch": 25,
    "scrapeWebsiteContacts": true
  }'
```

Fetch the results once the run finishes:

```bash
curl "https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items?token=YOUR_APIFY_TOKEN&format=csv"
```

#### Python client

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("YOUR_ACTOR_ID").call(run_input={
    "searchStringsArray": ["dentist", "orthodontist"],
    "locationQuery": "Denver, Colorado",
    "maxCrawledPlacesPerSearch": 50,
    "placeMinimumStars": "four",
    "website": "withWebsite",
    "verifyEmails": True,
})

for lead in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(lead["title"], lead.get("emails"), lead.get("phone"))
```

***

### 🛠️ Input parameters reference

#### 🚀 Start here — what & where

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchStringsArray` | array | — | **Required.** Search terms, one per line |
| `locationQuery` | string | — | Free-text area, e.g. `Austin, Texas` |
| `maxCrawledPlacesPerSearch` | integer | `20` | Businesses collected per search term |
| `startUrls` | array | `[]` | Google Maps place URLs — full, `?cid=…`, `?place_id=…` or short links (bulk supported) |

#### 🗣️ Language & region

| Parameter | Type | Default | Description |
|---|---|---|---|
| `language` | string | `en` | Results language (16 options) |
| `countryCode` | string | `us` | Country view used for the search (18 options) |

#### 📡 Pinpoint the area

| Parameter | Type | Description |
|---|---|---|
| `city` / `state` / `county` / `postalCode` | string | Precise area, combined into one search area |

#### 🎯 Quality filters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `categoryFilterWords` | array | `[]` | Keep only businesses matching these category words |
| `searchMatching` | string | `all` | `all`, `only_includes`, `only_exact` |
| `placeMinimumStars` | string | — | `two` … `fourAndHalf` |
| `website` | string | `allPlaces` | `allPlaces`, `withWebsite`, `withoutWebsite` |
| `skipClosedPlaces` | boolean | `false` | Drop closed businesses |

#### 📧 Contact enrichment

| Parameter | Type | Default | Description |
|---|---|---|---|
| `scrapeWebsiteContacts` | boolean | `true` | Visit the website for emails, phones and socials |
| `contactMaxSubpages` | integer | `3` | Extra contact/about pages per website |
| `skipBigChains` | boolean | `true` | Skip global chain websites |
| `verifyEmails` | boolean | `false` | Quality-check every email found |

#### 🌍 Network · ⚡ Speed

| Parameter | Type | Default | Description |
|---|---|---|---|
| `proxyConfiguration` | object | direct | Optional proxy configuration for the run. |
| `browserFallback` | boolean | `true` | Give stubborn requests one extra, more thorough attempt. |
| `maxConcurrency` | integer | `5` | Business websites opened in parallel (1–20) |
| `requestDelaySeconds` | number | `0.8` | Pause between requests |
| `maxRetries` | integer | `3` | Attempts per request before it is skipped. |

***

### 🔌 Integrations & automation

- ⏰ **Schedules** — refresh a territory list daily or weekly.
- 🔔 **Webhooks** — trigger your own service when a run finishes.
- 🔄 **Make, Zapier & n8n** — push new leads into HubSpot, Pipedrive, Airtable, Sheets or Slack.
- 🗄️ **Direct API access** — dataset items as JSON, JSONL, CSV, XLSX, XML or RSS.
- 🤖 **AI pipelines** — feed business descriptions and categories into scoring or segmentation models.

***

### ❓ Frequently asked questions (FAQ)

#### What is the best way to scrape Google Maps leads?

Give this Actor a search term and a location and press Start. It handles pagination, business details, website contact discovery and email verification for you, and writes clean rows to a dataset you can export or query through the API.

#### Can I get email addresses from Google Maps?

Google Maps itself does not publish emails — they live on the business website. This Actor follows the website link on each listing, opens the contact and about pages, and extracts the addresses it finds there.

#### How many businesses can I collect in one run?

Set `maxCrawledPlacesPerSearch` per term and add as many terms as you like. Results are deduplicated by place ID across the whole run.

#### Can I search several cities at once?

Yes — add one term per line and run separate area values, or include the city inside each term (`plumber Miami`, `plumber Tampa`).

#### How do I find businesses without a website?

Set `website` to `withoutWebsite`. Those listings still give you the name, address, Google phone number and rating — ideal prospects for web-design and marketing services.

#### Does it verify the email addresses?

Turn on `verifyEmails`. Each address is checked for disposable and free-mail domains, role inboxes, a valid mail server, and deliverability. Networks that block outbound mail ports return `unknown` rather than a false verdict.

#### Do I need a proxy?

No. Leave the proxy input empty and the run handles blocking on its own. Set one only when you want a specific country or route.

#### Can I use this for cold email?

The data is public business contact information, but **you** are responsible for compliance with GDPR, CAN-SPAM, CASL and local marketing law. Keep an opt-out, target businesses rather than individuals, and honour suppression lists.

#### Can I feed the results straight into my CRM?

Yes — use webhooks or the API, or connect Make / Zapier / n8n to push new rows into HubSpot, Pipedrive, Salesforce or a spreadsheet.

#### What if I need a field that isn't here?

Email **<hello.dataminds@gmail.com>** — custom fields and private builds are available.

***

### 🛠️ Troubleshooting

| Symptom | Fix |
|---|---|
| **No leads saved** | Widen the search term or location, and clear `placeMinimumStars` / `categoryFilterWords`. Very narrow terms return nothing. |
| **Few emails found** | Many small businesses publish no email. Raise `contactMaxSubpages`, and set `website: withWebsite` so every lead has a site to crawl. |
| **Fewer results than requested** | The area may simply hold fewer matching businesses. Broaden the location or add related search terms. |
| **`phone` empty** | Not every listing publishes a number. Check `phones` — numbers found on the website — as a fallback. |
| **Emails look generic** | `info@` and `contact@` are what most sites publish. Use the Email & Phone Number Scraper's *skip generic inboxes* option if you need named mailboxes. |
| **Run feels slow** | Lower `contactMaxSubpages`, raise `maxConcurrency`, or turn off `verifyEmails`. |
| **Verification says `unknown`** | Outbound mail ports are commonly blocked in cloud environments; the address is still valid-looking, it simply could not be probed. |

***

### 💬 Help, support & custom builds

- 🐛 **Found a bug or need a new field?** Open an issue on the Actor's **Issues** tab.
- 📧 **Custom scrapers, private integrations, bulk pipelines:** **<hello.dataminds@gmail.com>**
- ⭐ **Enjoying it?** Leave a review — it genuinely helps.

***

### ⚖️ Is scraping Google Maps legal?

This Actor collects **publicly available** business listings — the same information any visitor can see without logging in. Scraping public data is generally lawful in the EU and the US, but you remain responsible for how you use it:

- Do not collect data behind authentication or paywalls.
- Respect the target site's terms of service and reasonable request rates.
- Handle any personal data (an owner's name or direct email, for example) in line with **GDPR**, **CCPA** and local law.
- Follow **CAN-SPAM**, **CASL** and equivalent rules before sending marketing email.

See Apify's guide on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) for background. This is not legal advice.

***

### 🔍 SEO keywords targeted

google maps scraper · google maps leads scraper · google maps business scraper · local business lead generation · b2b lead scraper · google maps email extractor · business contact scraper · google places scraper · local SEO data · lead list builder · cold email leads · google maps data export · business phone number scraper · social media profile finder · maps listing scraper · small business database · sales prospecting tool · CRM enrichment data · google business profile scraper · local lead generation API · restaurant leads · contractor leads · dentist leads · agency prospecting data · google maps API alternative

# Actor input Schema

## `searchStringsArray` (type: `array`):

🗺️ What to look for — for example `restaurant`, `dentist`, `plumber near me`, `marketing agency`. Every term is searched separately.

## `locationQuery` (type: `string`):

📌 Free-text place to search in — `Austin, Texas`, `Berlin, Germany`, `Manhattan, NYC`. Leave empty to search worldwide (or use the precise fields below).

## `maxCrawledPlacesPerSearch` (type: `integer`):

🎁 How many businesses to collect for each search term. Start with 10–20 for a quick sample, raise it for a full harvest.

## `startUrls` (type: `array`):

📎 Paste direct Google Maps place links to collect specific businesses. Bulk input supported — one URL per line, or upload a file.

## `language` (type: `string`):

🌐 Language for names, categories and descriptions.

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

🧭 Which country's Google Maps view to search from.

## `city` (type: `string`):

🏙️ City name — for example `Miami`.

## `state` (type: `string`):

🗺️ State, province or region — for example `Florida`.

## `county` (type: `string`):

📐 County or district, when you need to narrow it further.

## `postalCode` (type: `string`):

📮 ZIP / postal code — the tightest area filter.

## `categoryFilterWords` (type: `array`):

🏷️ Keep a business only when one of these words appears in its Google categories or description — for example `bakery`, `law firm`, `gym`.

## `searchMatching` (type: `string`):

🔍 How strictly the business name must match your search term.

## `placeMinimumStars` (type: `string`):

⭐ Drop businesses rated below this. Unrated places are dropped too when a minimum is set.

## `website` (type: `string`):

🌐 Businesses with a website give you emails and socials. Businesses without one are perfect web-design prospects.

## `skipClosedPlaces` (type: `boolean`):

🚪 Leave out anything marked permanently or temporarily closed.

## `scrapeWebsiteContacts` (type: `boolean`):

📬 Visit each business website and pull out email addresses, phone numbers, LinkedIn, Instagram, Facebook, X, YouTube, TikTok, Pinterest and Discord links.

## `contactMaxSubpages` (type: `integer`):

🔍 How many extra contact/about pages to open per website. More pages find more emails and take a little longer.

## `skipBigChains` (type: `boolean`):

🏬 Global chains rarely publish a useful contact email. Keep this on to spend the time on real local prospects.

## `verifyEmails` (type: `boolean`):

🧪 Check every email found — disposable domain, free-mail, role address, mail-server lookup and a deliverability probe. No third-party key needed.

## `proxyConfiguration` (type: `object`):

🚦 By default the run starts on a direct connection and automatically switches to a datacenter and then a residential route only if Google pushes back. Pick your own route here to override that.

## `browserFallback` (type: `boolean`):

🧭 As a last resort, retry stubborn requests inside a real browser session.

## `maxConcurrency` (type: `integer`):

🏎️ How many business websites to open at the same time.

## `requestDelaySeconds` (type: `number`):

🕰️ A small pause keeps the run polite and stable.

## `maxRetries` (type: `integer`):

🛡️ Attempts before the run switches to the next network route.

## Actor input object example

```json
{
  "searchStringsArray": [
    "coffee shop"
  ],
  "locationQuery": "Austin, Texas",
  "maxCrawledPlacesPerSearch": 20,
  "startUrls": [],
  "language": "en",
  "countryCode": "us",
  "city": "",
  "state": "",
  "county": "",
  "postalCode": "",
  "categoryFilterWords": [],
  "searchMatching": "all",
  "placeMinimumStars": "",
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "scrapeWebsiteContacts": true,
  "contactMaxSubpages": 3,
  "skipBigChains": true,
  "verifyEmails": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "browserFallback": true,
  "maxConcurrency": 5,
  "requestDelaySeconds": 0.8,
  "maxRetries": 3
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

No description

# 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 = {
    "searchStringsArray": [
        "coffee shop"
    ],
    "locationQuery": "Austin, Texas",
    "maxCrawledPlacesPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("citrine_venus/google-maps-leads-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 = {
    "searchStringsArray": ["coffee shop"],
    "locationQuery": "Austin, Texas",
    "maxCrawledPlacesPerSearch": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("citrine_venus/google-maps-leads-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 '{
  "searchStringsArray": [
    "coffee shop"
  ],
  "locationQuery": "Austin, Texas",
  "maxCrawledPlacesPerSearch": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call citrine_venus/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,citrine_venus/google-maps-leads-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/uugDDOV3ODIIJMQDA/builds/flch3EBFcfoafcbiD/openapi.json
