# Google Maps Leads Scraper: Emails, Phones & Socials (`northloop-labs/google-maps-leads-scraper`) Actor

Find local business leads on Google Maps by keyword and location: name, category, address, phone, website, rating, reviews, plus emails and social profiles from their websites and a lead score that flags no website, broken or slow sites, unclaimed profiles and few reviews.

- **URL**: https://apify.com/northloop-labs/google-maps-leads-scraper.md
- **Developed by:** [Northloop Labs](https://apify.com/northloop-labs) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 lead saveds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Google Maps Leads Scraper: Emails, Phones & Socials

**Find local business leads on Google Maps and get their contact details in one run.** Type a business type and a location, such as `dentist` in `Austin, TX`, and get every business with its **name, category, address, phone, website, rating, review count, opening hours, coordinates and Google Maps link**. The Actor then visits each business website to find **email addresses, extra phone numbers and social profiles** (Facebook, Instagram, LinkedIn, X, TikTok, YouTube, Pinterest).

Each lead also gets a **lead opportunity score (0–100)** with clear flags such as `no-website`, `website-down`, `no-https`, `slow-website`, `unclaimed-google-profile`, `few-reviews`, `low-rating` and `no-social-links`. That way agencies and freelancers can call the businesses that need them most first.

It's built for **web design, SEO, local marketing and reputation agencies, freelancers and sales teams** who sell to local businesses. You don't need a Google account, an API key or any proxy setup.

### What you can use it for

- **Web design leads:** use the `without-website` filter to list businesses with no website, or sort by `website-down`, `no-https` and `not-mobile-friendly`.
- **Local SEO and Google Business Profile services:** find businesses with an **unclaimed profile**, few reviews or a low rating.
- **Social media management:** find businesses with no Facebook or Instagram linked on their site.
- **Cold email and calling lists:** get the business email, phone and website for every dentist, plumber, gym or restaurant in a city, ready for your CRM or outreach tool.
- **Market research:** count and map the competitors in a category, with ratings, reviews, price level and opening hours.
- **New business alerts:** turn on **Only new places since the last run** and schedule it weekly to get only the businesses that appeared since the last check.

### What data you get

One row per business:

| Field | Description |
|---|---|
| `name`, `category`, `categories` | Business name and its Google Maps categories |
| `address`, `street`, `city`, `postalCode`, `neighborhood`, `countryCode` | Address (service-area businesses may have no street address) |
| `phone`, `phoneInternational` | Phone number shown on Google Maps |
| `website` | Website from the Maps profile (tracking parameters removed) |
| `email`, `emails` | Best email (same domain as the website first) and all emails found on the website |
| `extraPhones` | Other phone numbers linked on the website |
| `facebook`, `instagram`, `linkedin`, `x`, `tiktok`, `youtube`, `pinterest` | Social profiles linked from the website |
| `rating`, `reviewCount`, `priceLevel` | Google rating, number of reviews, price level |
| `isClaimed` | `false` when the Google Business Profile shows "Claim this business" |
| `businessStatus` | `operational` (closed places are skipped by default) |
| `openingHours`, `timezone` | Opening hours per weekday |
| `latitude`, `longitude`, `placeId`, `cid`, `googleMapsUrl` | Location and IDs, plus a link that opens the place on Google Maps |
| `websiteStatus`, `websiteHttpStatus`, `websiteHttps`, `websiteResponseMs`, `websiteLoadMs`, `websiteMobileFriendly`, `websitePlatform`, `websiteHasAnalytics`, `websiteHasFacebookPixel`, `websiteCopyrightYear`, `websiteTitle` | A quick website check: up or down, HTTPS, speed, mobile viewport, platform (WordPress, Wix, Squarespace, Shopify and more), analytics and Facebook pixel, latest © year |
| `leadScore`, `leadPriority`, `leadFlags` | Opportunity score 0–100, `high` (50+), `medium` (25–49) or `low`, and the reasons |
| `searchTerm`, `location`, `rank`, `scrapedAt`, `firstSeenAt` | Which search found it and when |

The dataset has ready-made views: **Leads**, **Contacts only**, **Website audit** and **Google Maps details**.

### How to scrape Google Maps leads

1. Enter one or more **Search terms**, e.g. `dentist`, `roofing contractor`, `italian restaurant`.
2. Enter one or more **Locations**: a city, region, postcode or country, e.g. `Austin, TX`, `Manchester, UK`, `10115 Berlin`, `Ireland`.
3. Set **Max leads per search** (default 20, or 0 for as many as possible).
4. Optional: filter by website, set a **Minimum lead opportunity score**, or turn on **Only new places since the last run**.
5. Click **Start**, then export the results as CSV, Excel or JSON, or send them to your CRM.

Each search term is run in each location, so 2 terms × 3 cities is 6 searches.

#### Input example

```json
{
  "searchTerms": ["plumber", "electrician"],
  "locations": ["Austin, TX", "Denver, CO"],
  "maxResultsPerSearch": 200,
  "scrapeContacts": true,
  "websiteFilter": "any",
  "minLeadScore": 0
}
```

#### Output example

```json
{
  "searchTerm": "dentist",
  "location": "Bucharest, Romania",
  "rank": 1,
  "name": "DentalMed",
  "category": "Dentist",
  "address": "Calea 13 Septembrie 102, Bl. 48 A Parter, 050727 București, Romania",
  "city": "Bucharest",
  "countryCode": "RO",
  "phone": "+40 372 330 300",
  "website": "https://www.dental-med.ro/",
  "email": "contact@dental-med.ro",
  "emails": ["contact@dental-med.ro", "feedback@dental-med.ro"],
  "extraPhones": ["+40214028735", "+40318030170"],
  "facebook": "https://www.facebook.com/Dentalmed-Luxury-Dental-Clinic-206776372796108",
  "instagram": "https://www.instagram.com/dentalmedluxury",
  "tiktok": "https://www.tiktok.com/@dentalmedluxury",
  "youtube": "https://www.youtube.com/user/DentalMedClinic",
  "rating": 4.9,
  "reviewCount": 2901,
  "isClaimed": true,
  "businessStatus": "operational",
  "latitude": 44.425066,
  "longitude": 26.0754297,
  "placeId": "ChIJSUgYv3r_sUARt8wg7L7EOlU",
  "googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=DentalMed&query_place_id=ChIJSUgYv3r_sUARt8wg7L7EOlU",
  "openingHours": { "Monday": "9 AM–8:30 PM", "Saturday": "9 AM–2 PM", "Sunday": "Closed" },
  "websiteStatus": "ok",
  "websiteHttps": true,
  "websiteResponseMs": 410,
  "websiteMobileFriendly": true,
  "websitePlatform": "WordPress",
  "websiteHasAnalytics": true,
  "leadScore": 0,
  "leadPriority": "low",
  "leadFlags": [],
  "scrapedAt": "2026-10-20T10:02:11.512Z"
}
```

### How the lead opportunity score works

Points are added for each problem an agency could fix, up to 100:

| Flag | Points | Meaning |
|---|---|---|
| `no-website` | 40 | No website on the Google Maps profile |
| `website-down` | 35 | The website doesn't load (DNS error, timeout, 404 or 5xx) |
| `unclaimed-google-profile` | 20 | Google shows "Claim this business" |
| `no-https` | 15 | The website has no HTTPS |
| `slow-website` | 10 | The homepage takes over 3 seconds to respond |
| `not-mobile-friendly` | 10 | No mobile viewport tag |
| `few-reviews` | 10 | Fewer than 20 reviews (you can change this) |
| `low-rating` | 10 | Rating under 4.0 (you can change this) |
| `no-social-links` | 10 | No social profile linked on the website |
| `no-facebook-or-instagram` | 5 | Has socials, but neither Facebook nor Instagram |
| `no-email-on-website` | 5 | No email address on the website |
| `no-analytics` | 5 | No Google Analytics, Tag Manager or similar |
| `outdated-website` | 5 | Latest © year is 2 or more years old |
| `no-rating`, `no-phone-on-maps` | 5 each | Missing on the Maps profile |

`leadPriority` is `high` at 50 or more and `medium` at 25–49. Sites behind bot protection (HTTP 401, 403 or 429) are marked `blocked` and are not flagged as down.

### Only new places since the last run

Turn on **Only new places since the last run** and add a schedule, for example weekly. The Actor remembers the place IDs each search has already returned in a named key-value store on your account (`google-maps-leads-seen` by default). Later runs save, and charge for, only places they haven't seen before, which in practice means newly opened or newly listed businesses. The first run sets the baseline and saves everything. Use a different **Memory store name** for each client or campaign.

### How much does it cost?

This Actor uses **pay-per-event** pricing, so you only pay for leads you get. Platform usage and the residential proxies are included.

- **$0.005 per run** (Actor start)
- **$0.0015 per lead saved** ($1.50 per 1,000), including the Google Maps details, the website check and the lead score
- **$0.0015 per lead with contacts found** ($1.50 per 1,000), only when the website gave at least one email or social profile

**Example:** 1,000 dentists, about half of them with an email or social profile found, cost about $2.25. With every lead having contacts, it's at most **$3.00 per 1,000 leads**. Duplicates, closed places, filtered-out places, already-seen places and websites with nothing found are **free**. Turn off **Find emails and social profiles** for Maps data only at $1.50 per 1,000. You can cap your spend with the maximum cost per run setting in Apify, and the Actor then stops before it would go over.

### Tips

- **More than ~250 results:** a single Google Maps list stops at around 250 places. For bigger numbers the Actor scans the area as a grid of map tiles, so `restaurant` in `London, UK` can return thousands. Turn off **Grid search** if you only want the main list.
- **Be specific with places:** add the country for small or ambiguous towns (`Paris, Texas` vs `Paris, France`). Whole countries work too, but a list of cities gives more even coverage.
- **Local languages:** search in the local language (`Zahnarzt` in Berlin, `peluquería` in Madrid) and set **Language** (`de`, `es`, `fr`, ...) for local category names.
- **Speed:** about 1 lead per second with contact enrichment at the default 512 MB. Turn off contact enrichment for Maps data only, which is several times faster.

### Use with AI agents, MCP, Make, Zapier, n8n and the API

#### AI agents and the Apify MCP server

Your AI agent can run this Actor as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). In Claude, Cursor, VS Code or any other MCP client, add this server URL to load only this Actor:

```text
https://mcp.apify.com?tools=northloop-labs/google-maps-leads-scraper
```

You sign in to Apify on first connection. Agents that use the default server can also find the Actor with `search-actors` and run it with `call-actor`. Pass `maxTotalChargeUsd` in `callOptions` to cap what one run may cost. The Actor uses pay-per-event pricing, so it also works with Apify's agentic payments.

Example prompt: *"Find 100 roofing contractors in Denver with no website or an unclaimed Google profile, and give me their phone numbers."*

#### Make, Zapier and n8n

Apify has official integrations for [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) and [n8n](https://docs.apify.com/platform/integrations/n8n). Use "Run Actor", pick `northloop-labs/google-maps-leads-scraper`, paste your input as JSON, and send the leads on to Google Sheets, HubSpot, Pipedrive, Airtable or your email tool. Inside Apify you can also connect Google Sheets or Slack, or add a [webhook](https://docs.apify.com/platform/integrations/webhooks) that fires when a run finishes.

#### API

Run it and get the results in one call (this endpoint waits up to 5 minutes, which suits up to about 200 leads per run):

```bash
curl -X POST "https://api.apify.com/v2/acts/northloop-labs~google-maps-leads-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["dentist"], "locations": ["Austin, TX"], "maxResultsPerSearch": 50}'
```

Or with the Python client (`pip install apify-client`). The JavaScript client works the same way:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("northloop-labs/google-maps-leads-scraper").call(run_input={"searchTerms": ["dentist"], "locations": ["Austin, TX"], "maxResultsPerSearch": 50})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["phone"], item["email"], item["leadScore"], item["leadFlags"])
```

### Data & privacy

- The Actor collects **business information that businesses publish themselves**: their Google Maps listing and the contact details on their own website. Some emails can still name a person (e.g. `jane@clinic.com`). If you contact leads, follow the rules where you and they are, such as GDPR and ePrivacy in the EU and UK and CAN-SPAM in the US. That means having a lawful basis, identifying yourself, offering an opt-out and honouring it.
- Results are written **only to your own Apify account**: the run's dataset and, if you use "only new places", a list of place IDs in a named key-value store. The Actor sends the data nowhere else and keeps no copy.

### Is it legal to scrape Google Maps?

The Actor reads public Google Maps results and public business websites without logging in, and doesn't bypass any login or paywall. Google's Terms of Service restrict automated access, and data protection laws apply to how you use contact data, so check that your use fits your own legal and compliance requirements. This isn't legal advice.

### FAQ

#### How many leads can I get per search?

Up to about 250 from the normal Google Maps list, and more with grid search. In our tests, `restaurant` in `London, UK` returned 500 of 500 requested and `dentist` in `Sibiu, Romania` with no limit returned 317. Very small towns simply have fewer businesses.

#### How many leads have an email?

It depends on the industry and country. In our tests, 30–95% of businesses with a website had an email (dentists in Bucharest 95%, dentists in Berlin 83%, plumbers in Austin 58%, cafés in Paris 48%, car dealers in Ireland 24%). Social profiles were found for about 40–90%. Many trades businesses use only a phone number and a contact form.

#### Why is a website marked `blocked`?

Some sites, often behind Cloudflare, block automated visitors. The Actor retries once through a residential IP. If that still fails, the site is marked `blocked` with no `website-down` flag, because the site may work fine in a browser.

#### Can I get businesses without a website only?

Yes. Set **Website filter** to "Only businesses without a website". Businesses that are skipped are free.

#### Does it scrape reviews?

No. It returns the rating and review count, which is what lead scoring needs. Use a dedicated reviews scraper if you need review texts.

#### Which export formats can I use?

JSON, JSONL, CSV, Excel, XML, HTML or RSS from the run page, or through the API, Make, Zapier, n8n or Google Sheets.

### How this Actor was made

This Actor was made with AI. An AI agent wrote and tested the code, this README and the store listing, and a human owns and maintains the Actor. It reads the same JSON responses the Google Maps website loads for its results list, through residential IPs, and visits each business's own website with a normal HTTP client. Locations are looked up with OpenStreetMap Nominatim.

### More Actors from Northloop Labs

- [Luma, Eventbrite & Meetup Events Scraper](https://apify.com/northloop-labs/tech-events-finder): tech, AI and startup events from Luma, Eventbrite and Meetup.
- [Greenhouse, Lever, Ashby & Workable Jobs Scraper](https://apify.com/northloop-labs/company-jobs-finder): open jobs from company career pages.
- [Google Ads Transparency Center Scraper](https://apify.com/northloop-labs/google-ads-transparency-library): a company's ads from the Google Ads Transparency Center.
- [Meta Ads Library Scraper: Facebook & Instagram Ads](https://apify.com/northloop-labs/meta-ads-library-scraper): Facebook and Instagram ads from Meta's Ad Library.
- [X Ads Transparency Scraper: X (Twitter) Ads Repository](https://apify.com/northloop-labs/x-ads-transparency-scraper): X (Twitter) ads from the Ads Repository, guest access, no login.
- [Podcast Transcriber for RSS & Apple Podcasts](https://apify.com/northloop-labs/podcast-transcriber): podcast transcripts with timestamps and SRT subtitles.
- [EU TED & UK Find a Tender Scraper](https://apify.com/northloop-labs/public-tenders-monitor): UK and EU public tenders with daily alerts.
- [Google Trends Scraper: Keywords, Regions & Related Queries](https://apify.com/northloop-labs/google-trends-scraper): bulk Google Trends with comparisons and rising-query alerts.
- [YouTube Transcript Scraper: Captions, Subtitles & Text](https://apify.com/northloop-labs/youtube-transcript-scraper): YouTube transcripts with captions or Whisper, timestamps and SRT.
- [Home Depot Scraper: Products, Prices, Stock & Reviews](https://apify.com/northloop-labs/home-depot-scraper): Home Depot products, prices, store stock and reviews.

### Feedback

Missing a field, a filter or a country that doesn't work well? Open an issue in the **Issues** tab and we will look at it.

# Actor input Schema

## `searchTerms` (type: `array`):

Business types or keywords, the way you would type them in Google Maps, e.g. "dentist", "plumber", "italian restaurant", "marketing agency". Each term is searched in each location.

## `locations` (type: `array`):

Cities, regions, postcodes or countries, e.g. "Austin, TX", "Manchester, UK", "10115 Berlin", "Romania". Add the country for small or ambiguous places. Leave empty to search the terms as typed (e.g. "dentist near Times Square").

## `maxResultsPerSearch` (type: `integer`):

Leads to save for each search term + location pair. Up to ~250 come from the normal Maps results list; above that the Actor scans the area as a grid of map tiles to find more. 0 = as many as possible.

## `scrapeContacts` (type: `boolean`):

Visit each business website (homepage plus contact, about and imprint pages) to find emails, extra phone numbers and Facebook, Instagram, LinkedIn, X, TikTok, YouTube and Pinterest profiles, and to check the website (HTTPS, speed, mobile, platform, analytics). Charged only when at least one email or social profile is found.

## `maxPagesPerWebsite` (type: `integer`):

Homepage plus up to this many minus one contact-like pages. 3 finds most emails; raise it for larger sites.

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

Skipped businesses are not charged.

## `minLeadScore` (type: `integer`):

Save only leads whose opportunity score (0-100, higher = more problems an agency can fix) is at least this. Skipped leads are not charged. Example: 35 keeps businesses with no website, a broken website or an unclaimed profile plus a few weaker signals.

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

Leave out places Google marks as permanently or temporarily closed.

## `onlyNewPlaces` (type: `boolean`):

Remember which places each search has already returned (in a named key-value store on your account) and save only new ones. Great for a weekly schedule that finds newly opened businesses. The first run saves everything and sets the baseline.

## `stateStoreName` (type: `string`):

Named key-value store that keeps the list of places already seen. Use a different name per client or campaign.

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

Language for categories and opening hours, e.g. en, de, fr, es, ro.

## `deepSearch` (type: `boolean`):

When one results list is not enough, split the location into map tiles to find more places. Turn off to get only the main results list (faster).

## `lowReviewThreshold` (type: `integer`):

Businesses with fewer reviews than this get the few-reviews flag.

## `lowRatingThreshold` (type: `string`):

Businesses rated below this get the low-rating flag.

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

2-letter country code used for Google Maps when Locations is empty or cannot be found, e.g. US, GB, DE.

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

How many business websites to check at the same time.

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

Proxy for Google Maps requests. The default (Apify residential) is included in the price.

## `websiteProxyFallback` (type: `boolean`):

Websites are visited directly. If a site refuses the connection, its homepage is retried once through the proxy.

## Actor input object example

```json
{
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Bucharest, Romania"
  ],
  "maxResultsPerSearch": 20,
  "scrapeContacts": true,
  "maxPagesPerWebsite": 3,
  "websiteFilter": "any",
  "minLeadScore": 0,
  "skipClosedPlaces": true,
  "onlyNewPlaces": false,
  "stateStoreName": "google-maps-leads-seen",
  "language": "en",
  "deepSearch": true,
  "lowReviewThreshold": 20,
  "lowRatingThreshold": "4.0",
  "countryCode": "US",
  "maxConcurrency": 24,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "websiteProxyFallback": true
}
```

# Actor output Schema

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

Business, phone, email, website, rating, lead score and flags.

## `contacts` (type: `string`):

Emails, phones and social profiles.

## `websiteAudit` (type: `string`):

HTTPS, speed, mobile, platform, analytics and the opportunity flags.

## `all` (type: `string`):

Every field for every lead.

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

Counts per search, request statistics and errors.

# 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 = {
    "searchTerms": [
        "dentist"
    ],
    "locations": [
        "Bucharest, Romania"
    ],
    "maxResultsPerSearch": 20,
    "countryCode": "US",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("northloop-labs/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 = {
    "searchTerms": ["dentist"],
    "locations": ["Bucharest, Romania"],
    "maxResultsPerSearch": 20,
    "countryCode": "US",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("northloop-labs/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 '{
  "searchTerms": [
    "dentist"
  ],
  "locations": [
    "Bucharest, Romania"
  ],
  "maxResultsPerSearch": 20,
  "countryCode": "US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call northloop-labs/google-maps-leads-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,northloop-labs/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/RsvjWU8d9Otb7XM9P/builds/wDoF7z7utvIDf2Icr/openapi.json
