# Google Maps Scraper: Places, Emails, Phone Numbers & B2B Leads (`fit_melon/google-maps-scraper-cheap`) Actor

Google Maps scraper & Google Places extractor for B2B leads: emails, phone numbers, contact details, websites, Instagram/Facebook, rating, reviews count, opening hours. Any city, ZIP code, county, region or whole country, radius or GeoJSON. No 120-result cap. $0.50 per 1,000 places, all included.

- **URL**: https://apify.com/fit_melon/google-maps-scraper-cheap.md
- **Developed by:** [D N](https://apify.com/fit_melon) (community)
- **Categories:** Lead generation, Travel, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$0.50 / 1,000 place scrapeds

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

### What is this Google Maps Scraper?

**Google Maps Scraper** that turns any Google Maps search into a ready-to-use lead list. For every place you get the name, categories, full address (street, city, ZIP/postal code, county, region, country), GPS coordinates, **phone numbers, website, emails, social profiles**, rating, reviews count and opening hours. **$0.50 per 1,000 places, all included**: emails, social profiles, place details, proxies and platform usage. No add-ons, no start fee.

Google Maps shows at most about 120 results per search. This Google Maps extractor takes the real boundary of your area from OpenStreetMap and covers it with an adaptive grid, so you can scrape a whole city, ZIP code, county, region or country, up to 50,000 places per search term and location. It uses plain HTTP requests, with no browser and no Google API key: a 20-place search finishes in about 12 seconds, and 1,000 places with emails take about 80 seconds (measured, October 2026).

Use it for B2B lead generation and cold outreach, local SEO, market research or data enrichment. Run it from Apify Console, through the API, on a schedule, or from Make, n8n and Zapier. Apify's free plan ($5 of monthly credit) covers up to 10,000 places a month.

> 🇫🇷 **Extracteur Google Maps** : entreprises par ville, code postal, département ou région, avec e-mails, téléphones, sites web, notes et horaires. 0,50 $ les 1 000 lieux, tout compris.
> 🇩🇪 **Google Maps Scraper**: Firmen, Adressen, Telefonnummern und E-Mails nach Stadt, PLZ oder Region. 0,50 $ pro 1.000 Einträge, alles inklusive.
> 🇪🇸 **Extractor de Google Maps**: empresas por ciudad, código postal o región, con emails, teléfonos y redes sociales. 0,50 $ por 1.000 lugares.

- **50+ fields per place.** In our benchmark of 1,000 restaurants in Lyon (median of 3 runs): phone on 95% of places, website on 84%, rating and reviews count on 99%, full weekly opening hours on 96%. Also secondary hours (kitchen, takeout, delivery), main photo and photo count, attributes, booking links, business status, plus code, place ID and Google Maps link.
- **Emails and social profiles** from each business website (the home page, then contact or legal pages when needed): Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest. Generic emails of website builders and booking platforms are filtered out, so you get the business's own contacts.
- **Any area, beyond the 120-result limit.** A city, ZIP/postal code, county, region or whole country, several locations in one run, a custom GeoJSON polygon, or a radius around GPS coordinates. Duplicates are removed by place ID.
- **Free filters.** Minimum rating, only places with or only places without a website, category words, skip closed places.
- **Direct input.** Paste Google Maps place URLs, search URLs or place IDs to refresh places you already know.
- **Safe on big jobs.** Runs resume automatically after a platform restart, with no double charge, and stop cleanly before the run's time limit. Error items are free, and the run stops cleanly at your maximum cost per run.
- **Familiar output.** Common field names (`title`, `categoryName`, `totalScore`, `reviewsCount`, `placeId`, `emails`…), exported as JSON, CSV or Excel.

⭐ If this actor saves you time, please **bookmark it and leave a review**: it helps other users find it.

### How to scrape Google Maps with emails (step by step)

1. Enter one or more **search terms** (`restaurant`, `plumber`, `dentist`, `real estate agency`…).
2. Enter a **location** in plain text: a city (`Lyon`), a ZIP/postal code (`75011`, `10001`), a county or region (`Haute-Savoie`, `Bavaria`, `Texas`) or a whole country (`Belgium`). Add more locations in **More locations**, draw a **custom area** (GeoJSON), or use GPS coordinates + radius.
3. Set **max places per search term**, keep **Emails & social profiles** on, and click **Start**.
4. Download the results as CSV, Excel or JSON, or send them to Google Sheets, your CRM, Make, n8n or Zapier.

You can also paste **Google Maps place URLs, search URLs or place IDs** to get specific places.

### What data can you extract from Google Maps?

| Data | Fields | Filled in our benchmark\* |
|---|---|---|
| Name, categories, Google Maps link, place ID | `title`, `categoryName`, `categories`, `url`, `placeId`, `cid`, `kgmid` | 100% |
| Full address | `address`, `street`, `neighborhood`, `city`, `postalCode`, `county`, `state`, `country`, `countryCode`, `plusCode` | 99.9% |
| GPS coordinates | `location.lat`, `location.lng` | 100% |
| Phone numbers | `phone` (local), `phoneUnformatted` (international) | 95% |
| Website | `website` | 84% |
| Emails | `emails` (up to 10, own-domain first) | 42% to 61% of websites |
| Social profiles | `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks`, `pinterests` | Instagram 46%, Facebook 41% |
| Rating & reviews | `totalScore`, `reviewsCount`, `reviewsUrl` | 99% |
| Opening hours | `openingHours` (7 days), `additionalOpeningHours` (kitchen, delivery…) | 96% |
| Photo & attributes | `imageUrl`, `imagesCount`, `additionalInfo` (accessibility, payments, services…) | photo 99.7% |
| Booking & status | `bookingLinks`, `reserveTableUrl`, `businessStatus`, `permanentlyClosed`, `temporarilyClosed` | — |

\* Median of 3 runs on 1,000 restaurants in Lyon, France (October 2026). The email rate is the share of websites where at least one email of the business was found, after removing generic platform emails; it depends on the trade: 42% for restaurants in Lyon, 61% for dentists in Manchester and plumbers in Austin.

### Why this Google Maps Scraper?

| | This actor |
|---|---|
| Price for 1,000 places **with emails and social profiles** | **$0.50**, all included (no start fee, no add-ons) |
| Emails + social profiles from the business website | ✅ Included |
| More than 120 results per search | ✅ Adaptive grid over the real area boundary |
| Search by ZIP/postal code, county, region or whole country | ✅ OpenStreetMap boundaries, several locations per run, GeoJSON polygons, radius |
| Speed | ~80 s for 1,000 places with emails, ~12 s for 20 places (measured) |
| Lead filters (rating, with/without website, category, closed) | ✅ Included |
| Reliability | Automatic resume without double charge, clean stop before the time limit |

### Google Maps scraper input

| Field | Type | Description |
|---|---|---|
| `searchStringsArray` | array | Search terms, e.g. `["restaurant", "bakery"]` |
| `locationQuery` | string | City, ZIP/postal code, county, region or country, e.g. `"Lyon"`, `"75011"`, `"Haute-Savoie"`, `"Belgium"` |
| `locations` | array | More locations, e.g. `["Grenoble", "Annecy"]`. Each term runs in each location |
| `customGeolocation` | object | GeoJSON `Polygon` / `MultiPolygon`, or `Point` with `radiusKm` |
| `maxPlaces` | integer | **Required.** Max places per search term and location (default 100) |
| `scrapeContacts` | boolean | Emails + social profiles from each place's website (default on, included in the price) |
| `language` | string | Results language: `en`, `fr`, `de`, `es`… (default `en`) |
| `countryCode` | string | Optional country bias (`fr`, `us`…). Auto-detected from the location |
| `lat`, `lng`, `radiusKm` | number | Search around coordinates instead of a text location |
| `startUrls` | array | Google Maps place or search URLs |
| `placeIds` | array | Google place IDs (`ChIJ…`) |
| `minRating` | number | Only places rated at least this value (e.g. `4.5`) |
| `website` | string | `allPlaces`, `withWebsite`, or `withoutWebsite` (find businesses that need a website) |
| `categoryFilterWords` | array | Keep only places whose category contains one of these words, e.g. `["pizza"]` |
| `skipClosedPlaces` | boolean | Skip temporarily / permanently closed places |
| `completeDetails` | boolean | Complete missing reviews count / weekly hours from the place page (default on, included in the price) |

#### Example inputs

All restaurants of a county, with emails:

```json
{
    "searchStringsArray": ["restaurant"],
    "locationQuery": "Haute-Savoie, France",
    "maxPlaces": 5000,
    "language": "fr"
}
```

Plumbers in three cities in one run:

```json
{
    "searchStringsArray": ["plumber"],
    "locationQuery": "Lyon",
    "locations": ["Grenoble", "Annecy"],
    "maxPlaces": 200
}
```

Cafés within 2 km of a point:

```json
{
    "searchStringsArray": ["café"],
    "customGeolocation": { "type": "Point", "coordinates": [2.3522, 48.8566], "radiusKm": 2 },
    "maxPlaces": 100
}
```

Businesses without a website, rated 4.5+ (prospects for a web agency):

```json
{
    "searchStringsArray": ["restaurant"],
    "locationQuery": "Bordeaux, France",
    "website": "withoutWebsite",
    "minRating": 4.5,
    "maxPlaces": 300
}
```

### Google Maps data output example

Each place is one dataset item with `"status": "found"`. If an input cannot be processed (invalid place ID, unknown location…), you get an item with `"status": "error"` and an `error` message. The run keeps going and you are not charged for it. Three table views are available in the Output tab: **Overview**, **Contacts** and **Location**.

```json
{
    "status": "found",
    "title": "Example Dental Studio",
    "categoryName": "Dentist",
    "categories": ["Dentist", "Cosmetic dentist"],
    "address": "1 Example Street, Manchester M1 1AA, United Kingdom",
    "street": "1 Example Street",
    "city": "Manchester",
    "postalCode": "M1 1AA",
    "state": "England",
    "county": "Greater Manchester",
    "country": "United Kingdom",
    "countryCode": "GB",
    "neighborhood": "Northern Quarter",
    "location": { "lat": 53.4794, "lng": -2.2453 },
    "plusCode": "9C5VFQH3+Q4",
    "phone": "0161 000 0000",
    "phoneUnformatted": "+44 161 000 0000",
    "website": "https://www.example-dental.co.uk/",
    "emails": ["hello@example-dental.co.uk"],
    "facebooks": ["https://www.facebook.com/exampledental"],
    "instagrams": ["https://www.instagram.com/exampledental"],
    "linkedIns": [],
    "totalScore": 4.9,
    "reviewsCount": 312,
    "openingHours": [
        { "day": "Monday", "hours": "8:30 AM–5:30 PM" },
        { "day": "Tuesday", "hours": "8:30 AM–5:30 PM" }
    ],
    "businessStatus": "OPERATIONAL",
    "imageUrl": "https://lh3.googleusercontent.com/…=w800-h600-k-no",
    "imagesCount": 87,
    "additionalInfo": {
        "Accessibility": [{ "Wheelchair accessible entrance": true }],
        "Payments": [{ "Credit cards": true }]
    },
    "bookingLinks": [{ "name": "example-booking.com", "url": "https://www.example-booking.com/example-dental" }],
    "placeId": "ChIJ…",
    "url": "https://www.google.com/maps/search/?api=1&query=…&query_place_id=ChIJ…",
    "reviewsUrl": "https://search.google.com/local/reviews?placeid=ChIJ…",
    "searchString": "dentist",
    "searchLocation": "Manchester",
    "rank": 1,
    "scrapedAt": "2026-10-21T07:00:00.000Z"
}
```

*(Illustrative example: values are anonymized and some fields are omitted.)*

### How much does it cost to scrape Google Maps?

**$0.50 per 1,000 places** ($0.0005 per place returned), **everything included**: emails, social profiles, phone numbers, place details, proxies and Apify platform usage. No start fee, no add-ons.

| Places | Price |
|---|---|
| 100 | $0.05 |
| 1,000 | $0.50 |
| 10,000 | $5 |
| 100,000 | $50 |

Error and "not found" items are free. Set a maximum cost per run in Apify and the actor stops cleanly when it is reached. Apify's free plan ($5 of monthly credit) covers up to 10,000 places a month.

### Use it via API, Make, n8n or AI agents

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("fit_melon/google-maps-scraper-cheap").call(run_input={
    "searchStringsArray": ["dentist"],
    "locationQuery": "Manchester, UK",
    "maxPlaces": 200,
})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(place["title"], place.get("phone"), place.get("emails"))
```

- **Make / n8n / Zapier**: use the Apify app or node, action "Run an Actor" with `fit_melon/google-maps-scraper-cheap`, then "Get dataset items" and map the fields to Google Sheets or your CRM.
- **Schedules & webhooks**: run it every week on your area and get notified when new leads arrive.
- **AI agents**: available through the Apify MCP server.

### Google Maps Scraper FAQ

#### How much does it cost to scrape Google Maps?

$0.50 per 1,000 places ($0.0005 per place), all included: emails, social profiles, phone numbers, place details, proxies and platform usage. 1,000 places cost $0.50, 10,000 cost $5 and 100,000 cost $50. There is no start fee and there are no add-ons. Error and "not found" items are free. Apify's free plan ($5 of monthly credit) covers up to 10,000 places a month.

#### Does this Google Maps scraper extract emails?

Yes, at no extra cost. For each place with a website, it opens the home page. If there is no email there, it opens up to two contact or legal pages (Contact, Impressum, Mentions légales…). It returns the emails published on those pages, plus Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles. Emails are never guessed, and the generic emails of website builders, booking and delivery platforms are filtered out. In our benchmarks, real business emails were found on 42% (restaurants in Lyon) to 61% (dentists in Manchester, plumbers in Austin) of websites. Turn `scrapeContacts` off if you only need the Google Maps data.

#### How do I get more than 120 results from Google Maps?

Google Maps lists about 120 places per search. Enter a location (for example `Lyon` or `Texas`) and set `maxPlaces` above 120. The scraper takes the area's real boundary and covers it with a grid. It splits only the dense cells into 4 smaller ones and searches them again, skips cells outside the boundary, and removes duplicates by place ID. You can ask for up to 50,000 places per search term and per location. The run stops when that number is reached or when the whole area has been covered.

#### How do I scrape all businesses in a city, county, region or country?

Type the area in **Location**: a city (`Paris`), a county (`Haute-Savoie`), a region or state (`Bavaria`, `Texas`) or a country (`Belgium`). To cover several areas, add them under **More locations**: each search term runs in each location. For a custom zone, paste a GeoJSON Polygon or MultiPolygon in `customGeolocation`, or a point with `radiusKm`. When OpenStreetMap has no boundary for a location, a radius around it is used instead. Big jobs: the default run timeout is 1 hour; for tens of thousands of places, raise it in the run options or split the job by location (the run also stops cleanly before its time limit and can be resurrected to continue, with no double charge).

#### Can I search Google Maps by ZIP code or postal code?

Yes. Type the code with its country in **Location**, for example `75011, France` or `90210, USA`. The postal-code boundary from OpenStreetMap is used when it exists, otherwise a radius around the code. Add more codes under **More locations** to cover several ZIP codes in one run.

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

Set `website` to `withoutWebsite` (and optionally `minRating`). Only places with no website on their Google Maps listing are returned: ideal prospects for web agencies and local marketing services.

#### How fast is this Google Maps scraper?

Measured in October 2026 (median of 3 runs at the default 2 GB memory): 1,000 restaurants in Lyon with emails in about 80 seconds, 300 restaurants across a whole county (Haute-Savoie) in about 26 seconds, and a 20-place search in about 12 seconds. Results are streamed into the dataset while the run is going. Speed mostly depends on how many business websites have to be visited for emails.

#### Is it legal to scrape Google Maps? What about GDPR?

The scraper collects public business listing data and the contact details businesses publish on their own websites. It does not collect reviewer names, review texts or reviewer photos. Rules differ by country. If your list contains personal data (for example a sole trader's name or a named person's email address), GDPR and similar laws require a lawful basis such as legitimate interest. You must also tell people where you got their data, let them opt out, and follow local direct-marketing rules. You are responsible for how you use the data and for following Google's terms. This is not legal advice.

#### Can I export Google Maps data to Excel, CSV or Google Sheets?

Yes. You can download each run's results as CSV, Excel, JSON, XML or HTML from the run page or through the API. The Overview table shows the photo, name, category, address, city, postal code, phone, website, emails, Instagram, Facebook, rating, reviews count, business status and Google Maps link. To fill a Google Sheet automatically, connect the actor to Make, n8n or Zapier, or import the CSV file.

#### Do I need a Google Maps API key or proxies?

No. The scraper sends plain HTTP requests to Google Maps. It uses no browser and no Google Places API, so you need no API key and no Google Cloud billing. Apify Proxy is used by default, with a residential fallback if Google blocks a request. Its cost is included in the $0.50 per 1,000 places.

#### Does it scrape Google reviews and photos?

It returns the rating, the reviews count, a direct link to the reviews (`reviewsUrl`), the main photo (`imageUrl`) and the number of photos (`imagesCount`). It does not download review texts, reviewer data or the full photo gallery.

#### Can I switch from another Google Maps scraper without changing my workflow?

Usually, yes. The output uses the field names most Google Maps scrapers use (`title`, `categoryName`, `address`, `phone`, `website`, `totalScore`, `reviewsCount`, `placeId`, `url`, `emails`, `instagrams`, `facebooks`…). On input, `maxCrawledPlacesPerSearch` is accepted in place of `maxPlaces`, `placeMinimumStars` in place of `minRating`, and `city`, `county`, `state`, `country` and `postalCode` are combined into one location. In Make, n8n or Zapier you usually only need to change the actor ID.

### Use cases

- **Lead generation & cold outreach**: lists of local businesses (B2B leads) with emails, phone numbers, websites and social profiles, by city, ZIP code, county, region or country.
- **Local SEO & competitor analysis**: ratings, reviews count and categories by area.
- **Market research**: count and map businesses of a given type in a city or region.
- **Web agencies**: `"website": "withoutWebsite"` lists local businesses that still have no website.
- **Data enrichment**: refresh opening hours and business status from place IDs.

### Limitations & fair use

- Data comes from public Google Maps listings, and availability varies by place (not every business has a website or phone number).
- Area boundaries come from OpenStreetMap (© OpenStreetMap contributors, ODbL). If a location has no boundary, a radius around it is used.
- `priceLevel` is only filled when Google shows it in the listing.
- Emails are collected only from the business's own public website (home page and contact or legal pages).
- Personal data is excluded: no review authors, no reviewer photos.
- You are responsible for using the data in line with applicable laws (GDPR, etc.) and Google's terms.

### Changelog

See the **Changelog** tab. Latest: **1.8**: about 40% faster on large runs, cleaner emails (generic platform emails filtered), half the Google requests on small searches, clean stop before the run time limit.

Coming next, at the same price: more photos, menu links, even faster small runs.

### More actors by this developer

See all actors: [apify.com/fit_melon](https://apify.com/fit_melon)

# Changelog

This Actor's version history is a separate document: https://apify.com/fit_melon/google-maps-scraper-cheap/changelog.md

# Actor input Schema

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

What to search on Google Maps, e.g. "restaurant", "plumber", "dentist". One search per term. Combine with a location below, or put the place in the term itself ("bakery in Lyon").

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

Where to search, in plain text: "Lyon", "75011", "Haute-Savoie", "Bavaria", "Belgium". The exact administrative boundary is used (OpenStreetMap) and covered with an adaptive grid, so you get places from the whole area — far beyond Google's ~120 results per search.

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

Search several cities, postcodes or regions in one run. Each search term is run in each location; maxPlaces applies per term and location.

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

Maximum number of places returned for each search term in each location. You pay only for places actually returned ($0.0005 each).

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

Visit each place's website (home + contact page) to extract emails and Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest profiles. Included in the price — no add-on fee.

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

Language of the results (categories, opening hours), e.g. en, fr, de, es, it, nl, pt.

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

Two-letter country code to bias results (e.g. fr, us, de). Leave empty for automatic.

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

Search center latitude. Use with longitude and radius instead of a text location.

## `lng` (type: `number`):

Search center longitude.

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

Search radius around the center (coordinates or text location). Default: 5 km for coordinates, automatic for text locations.

## `customGeolocation` (type: `object`):

Draw your own area: a GeoJSON Polygon or MultiPolygon (\[lng, lat] coordinates), or a Point with "radiusKm". Example: {"type":"Point","coordinates":\[2.3522,48.8566],"radiusKm":3}. Takes priority over the text location.

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

Google Maps place URLs (…/maps/place/…) or search URLs (…/maps/search/…). Place URLs return that single place.

## `placeIds` (type: `array`):

Google place IDs ("ChIJ…"), one per line.

## `minRating` (type: `number`):

Only return places rated at least this value (e.g. 4.0). Unrated places are excluded when set. 0 = no filter.

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

Keep all places, only places with a website, or only places WITHOUT a website (great to find businesses that need one).

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

Keep only places whose Google category contains one of these words (e.g. "pizza", "dentist"). Leave empty for no filter.

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

Do not return places that are temporarily or permanently closed.

## `completeDetails` (type: `boolean`):

When a search result lacks the reviews count or the full week of opening hours, open the place page to complete it. Included in the price.

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

Parallel requests. The default is safe and fast.

## `residentialFallback` (type: `boolean`):

If Google blocks datacenter IPs, retry the request through residential proxies.

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

Apify Proxy (datacenter) is used by default.

## Actor input object example

```json
{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "Annecy, France",
  "maxPlaces": 20,
  "scrapeContacts": true,
  "language": "en",
  "minRating": 0,
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "completeDetails": true,
  "maxConcurrency": 20,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `places` (type: `string`):

All scraped places (one item per place), Overview table.

## `runStats` (type: `string`):

Run statistics: requests, timings, website crawl outcomes.

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

Emails, phones, websites and social profiles of each place.

# 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": [
        "restaurant"
    ],
    "locationQuery": "Annecy, France",
    "maxPlaces": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fit_melon/google-maps-scraper-cheap").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": ["restaurant"],
    "locationQuery": "Annecy, France",
    "maxPlaces": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fit_melon/google-maps-scraper-cheap").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": [
    "restaurant"
  ],
  "locationQuery": "Annecy, France",
  "maxPlaces": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fit_melon/google-maps-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fit_melon/google-maps-scraper-cheap"
        }
    }
}
```

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/89V2YbRYDudu6KLUx/builds/AA5gkg0DgTAcq6qCa/openapi.json
