# Google Maps Scraper (`atomus/google-maps-scraper`) Actor

Turn any Google Maps search into clean business leads: names, addresses, phones, websites, ratings, and hours. You only pay for the businesses returned. Add decision-maker contacts, verified work emails, and full Google reviews as paid add-ons. No proxies, no login.

- **URL**: https://apify.com/atomus/google-maps-scraper.md
- **Developed by:** [Atomus APIs](https://apify.com/atomus) (community)
- **Categories:** Lead generation, Automation, Social media
- **Stats:** 16 total users, 6 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 business scrapeds

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?

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 Scraper

<table width="100%" style="border:none;border-radius:10px;background:#120306">
<tr><td style="padding:34px;border:none">
<span style="color:#F59E0B;font-size:13px;font-weight:700;letter-spacing:2px">GOOGLE MAPS SCRAPER &nbsp;&bull;&nbsp; GOOGLE MAPS API</span><br><br>
<span style="color:#F5F5F6;font-size:40px;font-weight:800;letter-spacing:-1.2px">A lead list for any<br>city, in one search.</span><br><br>
<span style="color:#D6D3D1;font-size:16px">Any keyword and any place, into one structured record per business: name, address, phone, website, category, hours, rating and the full per-star review breakdown, with GPS and Google's place IDs. Then, optionally, <b style="color:#F5F5F6">the decision-maker at each one and their verified work email</b>. Every search filter is free.</span><br><br>
<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">PAY PER BUSINESS RETURNED</span>
<span style="background:#1C1917;color:#F59E0B;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">&nbsp;UP TO 700 BUSINESSES PER SEARCH&nbsp;</span>
</td></tr>
</table>

#### Copy to your AI assistant

Paste this into ChatGPT, Claude, Cursor, or any LLM to start using this Actor right away.

```
atomus/google-maps-scraper is an Apify Actor that turns a Google Maps keyword search into structured JSON, one row per business: name, address plus a structured address_info, phone, website, domain, rating, reviews_count, rating_distribution (count per star), category and additional_categories, price_level, latitude/longitude, place_id/cid/feature_id, opening hours, open/closed status, is_claimed, total_photos, main_image and rank. Use it whenever someone needs local business data without an API key or a browser - local lead generation, market research, competitor mapping, or reputation prospecting. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~google-maps-scraper/run-sync-get-dataset-items?token=APIFY_TOKEN" -H "Content-Type: application/json" -d '{"query":"dentist","location":"Austin,Texas,United States","maxResults":100,"requireWebsite":true}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/google-maps-scraper").call(run_input={"query":"coffee shops","location":"Paris,Ile-de-France,France","maxResults":50}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: query (string, required), location ("City,State,Country" with no space after the commas; a bare country works too; defaults to United States), locationCoordinate ("lat,lng,zoom" e.g. "40.7128,-74.0060,14z", overrides location), languageCode (en, es, pt, fr, de, it, nl, pl, ru, tr, ar, id, ja, ko, zh-CN, zh-TW, hi, th, vi, sv), maxResults (int 1-700, default 20), and the free filters minRating, requireWebsite, skipClosed, exactMatch, category. Paid add-ons: maxReviews with reviewsSort ("newest"|"highest_rating"|"lowest_rating"|"relevant"), the recentBadReviewMaxRating ("1".."4") plus recentBadReviewPeriod ("3m"|"6m"|"12m"|"24m"|"all", where "all" is free) reputation filter, and maxLeadsPerPlace with leadSeniority, leadDepartment and findLeadEmails which add a leads array to each business. Billing is per business returned, with a floor of one business per 100 results scanned; reviews, leads and emails are billed only when you enable them and only when found. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~google-maps-scraper/build/default
```

***

### Google Maps MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Atomus and it can build a local prospect list on its own: businesses from Maps, the people behind them, and their company data. No glue code, no scraping logic in your prompts.

```json
{
  "mcpServers": {
    "atomus": {
      "url": "https://mcp.apify.com/?tools=atomus/google-maps-scraper,atomus/leads-finder,atomus/linkedin-company-scraper,atomus/linkedin-company-employees,atomus/linkedin-profile-scraper",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Then ask, in plain language:

> "Find every dentist in Austin with a website and a rating under 4, get me the owner at each one with their email, and drop anyone at a practice with more than 50 staff."

That one sentence uses two Actors in a row. Pinning the `tools=` list is what keeps your assistant on these Actors instead of reaching for whatever scraper it finds first.

***

### How to scrape Google Maps

#### A keyword in a place

```json
{ "query": "coffee shops", "location": "San Francisco,California,United States", "maxResults": 50 }
```

`location` uses Google's own `City,State,Country` format, **with no space after the commas**. A bare country works too. Leave it empty and the search defaults to the United States.

#### Search around a point

```json
{ "query": "plumber", "locationCoordinate": "40.7128,-74.0060,14z", "maxResults": 100 }
```

`latitude,longitude,zoom` (`3z` to `21z`, higher is tighter, default `17z`). It overrides `location` and costs the same.

#### Build an outreach list

```json
{
  "query": "dentist",
  "location": "Austin,Texas,United States",
  "maxResults": 200,
  "requireWebsite": true,
  "skipClosed": true,
  "minRating": 3
}
```

`requireWebsite`, `skipClosed`, `minRating`, `exactMatch` and `category` are all **free**, and `requireWebsite` is worth setting before the leads add-on: a business with no website can never be enriched, so filtering first stops the search being spent on places you cannot use.

#### Find the businesses that recently took a bad review

```json
{
  "query": "hotel",
  "location": "Miami,Florida,United States",
  "maxResults": 200,
  "recentBadReviewMaxRating": "1",
  "recentBadReviewPeriod": "6m"
}
```

This returns only the businesses that received a review at or below that rating inside the window — the list a reputation agency prospects from. `"all"` (ever rated that low) is **free**, because Maps already returns each business's count of reviews per star and that count is complete. Dated windows cost money because only the reviews themselves carry a date, so those must be read.

#### Reach the owner, with a verified email

```json
{
  "query": "roofing contractor",
  "location": "Denver,Colorado,United States",
  "maxResults": 100,
  "requireWebsite": true,
  "maxLeadsPerPlace": 2,
  "leadSeniority": ["owner", "founder"],
  "findLeadEmails": true
}
```

Each business comes back with a `leads` array: full name, title, seniority, department, LinkedIn URL and company data, plus a verified `email` and `email_status` when `findLeadEmails` is on. You pay only for leads and emails actually found.

***

### Input

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `query` | string | ✅ Yes | (none) | What to search: `"coffee shops"`, `"dentist"`, `"plumber"`. |
| `location` | string | No | United States | Google's `City,State,Country` format, no space after commas. A country alone works. |
| `locationCoordinate` | string | No | (none) | `lat,lng,zoom` (`3z`–`21z`, default `17z`). Overrides `location`. Free. |
| `languageCode` | string | No | `en` | 20 languages, from `es` and `pt` to `ja`, `ko`, `zh-CN` and `zh-TW`. Free. |
| `maxResults` | integer | No | `20` | 1 to 700 businesses. Billed per business returned. |

**Free filters:** `minRating` (0–5, also drops unrated places), `requireWebsite`, `skipClosed`, `exactMatch` (the name must contain your search text), `category` (matches primary and secondary categories).

**Paid add-ons:** `maxReviews` with `reviewsSort` (`newest`, `highest_rating`, `lowest_rating`, `relevant`); `recentBadReviewMaxRating` (`1`–`4`) with `recentBadReviewPeriod` (`3m`, `6m`, `12m`, `24m`, `all` — `all` is free); `maxLeadsPerPlace` with `leadSeniority`, `leadDepartment` and `findLeadEmails`.

> **A category filter can exclude places you meant to keep.** Google's categories vary and businesses classify themselves, so `category` is a sharper knife than it looks.

***

### What data does the Google Maps Scraper return?

One row per business.

| Group | Fields |
|---|---|
| **Identity** | `name` · `original_title` (the untranslated name, when Google localised it) · `category` · `additional_categories[]` · `category_ids[]` (stable and language-independent) |
| **Contact** | `phone` · `website` · `domain` · `contact_url` (contact, menu or appointment link) · `book_online_url` |
| **Location** | `address` · `address_info{address,city,zip,region,country_code}` · `latitude` · `longitude` |
| **Reputation** | `rating` · `reviews_count` · `rating_distribution{1..5}` (the count at each star) · `hotel_rating` |
| **Operations** | `hours` (by day) · `status` (open now) · `is_claimed` · `price_level` · `total_photos` · `main_image` |
| **Google IDs** | `place_id` · `cid` · `feature_id` · `contributor_url` |
| **Result context** | `rank` · `rank_group` · `is_directory_item` · `local_justifications` (Google's "why this result") |
| **Leads (add-on)** | `leads[{full_name,title,seniority,department,linkedin_url,company_name,company_industry,company_employee_count,email,email_status}]` |

#### Example row

```json
{
  "name": "Blue Bottle Coffee",
  "address": "66 Mint St, San Francisco, CA 94103",
  "address_info": { "address": "66 Mint St", "city": "San Francisco", "zip": "94103", "region": "California", "country_code": "US" },
  "phone": "+14156535228",
  "website": "https://bluebottlecoffee.com/",
  "domain": "bluebottlecoffee.com",
  "rating": 4.5,
  "reviews_count": 1243,
  "rating_distribution": { "1": 20, "2": 15, "3": 60, "4": 300, "5": 848 },
  "category": "Coffee shop",
  "additional_categories": ["Cafe", "Espresso bar"],
  "price_level": "moderate",
  "latitude": 37.7825,
  "longitude": -122.4072,
  "place_id": "ChIJ...",
  "cid": "987654321",
  "hours": { "monday": [{ "open": { "hour": 7 } }] },
  "status": "open",
  "is_claimed": true,
  "total_photos": 342,
  "main_image": "https://lh3.googleusercontent.com/...",
  "rank": 1
}
```

With the leads add-on on, the same row also carries:

```json
{
  "name": "Neon Ambition",
  "domain": "neonambition.com",
  "leads": [
    {
      "full_name": "Jordan Slover",
      "title": "Founder",
      "seniority": "founder",
      "department": "c_suite",
      "linkedin_url": "https://www.linkedin.com/in/jordanslover",
      "company_industry": "advertising services",
      "company_employee_count": 16,
      "email": "jordan@neonambition.com",
      "email_status": "VALID"
    }
  ]
}
```

#### How the bad-review filter reads reviews

For a dated period the Actor reads **only the bad reviews, and all of them** — never a sample of the newest few. The free per-star count says how many reviews sit at or below your threshold, so a business with 8 reviews of 2 stars or fewer has all 8 read, and one whose only 2-star review is the 150th most recent is still found. Only businesses with more than 200 bad reviews are sampled. Periods are deliberately coarse because many Google reviews carry only a relative date ("a month ago"), which answers "the last 3 months" cleanly and "the last 47 days" not at all.

Two consequences, both also stated on the input page: businesses never rated that low are discarded first, for free, so only real candidates cost anything — and you are billed for the reviews **read**, not only for the businesses that end up matching, because reading is what identifies a match. A search of 100 businesses where 60 have ever taken a 1-star bills reviews for 60 and may return 9.

***

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

**$0.003 per business** ($3.00 per 1,000), or **$0.002** on Apify Gold and above.

| Businesses | Free–Silver | Gold+ |
|---|---|---|
| 100 | $0.30 | $0.20 |
| 1,000 | $3.00 | $2.00 |

**Add-ons, only when you turn them on:**

| Add-on | Free–Silver | Gold+ |
|---|---|---|
| Review | $0.0008 | $0.0005 |
| Business lead found | $0.006 | $0.006 |
| Lead email found | $0.006 | $0.006 |

**The floor: one business per 100 results scanned.** Running the search costs money whether or not your filters keep anything, so ask for 700 and keep 3, and you are billed 7 businesses ($0.021) rather than 3. An unfiltered search always bills exactly what you receive, and a search that returns nothing charges for one business. **Failed searches are free.**

**Reviews bill a minimum of about 3 per business** with the add-on on, even where the business has fewer, because the reviews lookup runs and bills regardless. **Leads and emails are charged only when found** — a business with no website, or a lead with no verifiable email, costs nothing.

**Free plan:** 10 businesses per calendar month, plus 1 business with reviews, 1 lead and 1 email so you can see every add-on's shape before paying. The counters reset on the 1st.

***

### What do people use the Google Maps Scraper for?

- **Local lead generation**: a city, a category and a website filter is an outreach list by lunchtime.
- **Reputation prospecting**: the bad-review filter finds the businesses with a problem worth selling into.
- **Owner outreach**: leads plus verified emails turn a map pin into a named person to contact.
- **Market and territory research**: how many of a category a city really has, where they cluster, and what they charge.
- **Competitor mapping**: every rival within a radius, with ratings and review volume.
- **Franchise and site selection**: density, ratings and price level around a coordinate.
- **Data enrichment**: match your own records to `place_id` and pull phone, hours and category.
- **AI agent context**: hand an agent a whole local market as structured rows.

***

### Google Maps Scraper vs the official Google Places API vs cookie tools

| | This Google Maps Scraper | Browser/cookie tools | Official Places API |
|---|---|---|---|
| **API key / billing account** | Not needed | Not needed | Google Cloud project + billing |
| **Setup** | Type a query and a place | Install and babysit an extension | Enable APIs, keys, quotas |
| **Results per search** | Up to 700 | Whatever you scroll to | Paginated, quota-capped |
| **Per-star review breakdown** | Yes, free on every row | Rarely | Not exposed |
| **Decision-maker contacts** | Optional add-on, per lead found | No | No |
| **Pricing** | Pay per business ($0.003, $0.002 Gold+) | Your time | Per-request, per-field pricing |

***

### FAQ

#### How do I scrape Google Maps without an API key?

Type a query and a location and run the Actor. There is no Google Cloud project, no API key and no quota to manage — you pay per business returned.

#### Can I use this from ChatGPT or Claude?

Yes, two ways. Paste the "Copy to your AI assistant" block above into any LLM and it will write the call for you. Or connect the **Google Maps MCP server** config above, and every Atomus Actor becomes a native tool your assistant can call on its own, including chaining several in one request.

#### What format does the location field need?

Google's own: `City,State,Country` with **no space after the commas** — `New York,New York,United States`, `Paris,Ile-de-France,France`. A country on its own also works. Leave it empty and it defaults to the United States.

#### How many businesses can one search return?

Up to 700. Google itself runs out of relevant local results for most searches well before that, so asking for more than a city has simply returns fewer — and you are not charged for what does not exist. For a bigger market, vary the location or narrow the query.

#### How much does it cost?

$0.003 per business ($0.002 on Gold and above). Reviews are $0.0008 each, leads and emails $0.006 each, and only when you enable them. Free Apify plans include 10 businesses per month plus one sample of each add-on.

#### Why was I billed 7 businesses when only 3 matched?

The search runs whether or not your filters keep anything, so there is a floor of one business per 100 results scanned. It only shows up when a filter throws almost everything away; an unfiltered search bills exactly what you receive.

#### Can I get the owner's email?

Yes. Set `maxLeadsPerPlace` above 0 to find decision-makers at each business, then `findLeadEmails` to look up and verify their work email. Both need the business to have a website, so pair them with `requireWebsite`. You pay only for what is found.

#### Can I get Google reviews too?

Yes. Set `maxReviews` per business, and `reviewsSort` to choose which ones you get: `newest` for recent complaints, `lowest_rating` for the worst regardless of date.

#### Is it legal to scrape Google Maps?

This Actor reads publicly visible business listings. You are responsible for using the output in line with applicable laws (GDPR/CCPA), Google's terms, and your own compliance requirements. It is an independent tool, not affiliated with Google.

#### Can I run this on a schedule?

Yes. Apify [Schedules](https://docs.apify.com/platform/schedules) run the Actor on a cron interval and [webhooks](https://docs.apify.com/platform/integrations/webhooks) push each finished run into your systems — which is how a bad-review search becomes a daily prospect feed.

***

### All Atomus scrapers

<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">2.4M+ RESULTS DELIVERED</span>

### Support

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Google LLC. Google Maps™ is a trademark of Google LLC. All trademarks are property of their respective owners.

Use the data extracted by this Actor in compliance with applicable data protection laws (GDPR, CCPA) and Google's terms of service. Do not use it for spam, harassment, or unlawful purposes.

# Actor input Schema

## `query` (type: `string`):

What to search for on Google Maps, e.g. "coffee shops", "dentist", "plumber".

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

Where to search, in Google's "City,State,Country" format, e.g. "New York,New York,United States" or "Paris,Ile-de-France,France". A country on its own also works ("United States", "Germany"). Use commas with NO spaces after them. Defaults to United States if left empty. Ignored when "Location by coordinates" is set. If a location isn't recognized you'll get a clear message and the run won't just fail.

## `locationCoordinate` (type: `string`):

Search around a point instead of a named place. Format: "latitude,longitude,zoom", e.g. "40.7128,-74.0060,14z" (zoom 3z to 21z, higher is tighter, default 17z). Overrides the Location field above. Free, same search cost.

## `languageCode` (type: `string`):

Language of the Google Maps search results. Free, same search cost. Defaults to English.

## `maxResults` (type: `integer`):

How many businesses to return (1 to 700). We return exactly this many when Google has them, and you are billed per business returned. Google itself runs out of relevant local results for most searches well before 700, so asking for more than a city really has simply returns fewer, and you are not charged for businesses that don't exist.

## `minRating` (type: `integer`):

Only return businesses with at least this star rating (0 to 5). Businesses with no rating at all are also excluded.

## `requireWebsite` (type: `boolean`):

Keep only businesses that have a website. Useful for building outreach lists, and required if you plan to use the contacts add-on below.

## `skipClosed` (type: `boolean`):

Exclude businesses marked closed or permanently closed.

## `exactMatch` (type: `boolean`):

Keep only businesses whose name contains your exact search text (case-insensitive).

## `category` (type: `string`):

Keep only businesses whose category matches this text, e.g. "coffee shop", "restaurant". Matches primary and secondary categories (case-insensitive). Keep in mind that Google's categories vary and businesses categorize themselves, so a category filter can exclude places you meant to keep.

## `maxReviews` (type: `integer`):

Number of Google reviews to fetch for each business (0 turns the add-on off). Each review comes with its text, star rating, author, date, photos, and the owner's reply.

## `reviewsSort` (type: `string`):

Which reviews you get when you ask for fewer than a business has. "Newest first" is the right choice for spotting recent complaints, "Lowest rating first" for finding the worst ones regardless of when they were written.

## `recentBadReviewMaxRating` (type: `string`):

Returns only the businesses that got a review of this many stars or fewer. Pick 1 star to find the ones that recently took a 1-star review.

We read only the bad reviews, and all of them, so none is missed: a business with 8 reviews of 2 stars or fewer gets all 8 read. A bad review that is the 150th most recent is still found.

You pay for the reviews read on every business that could match, not only on the ones that end up in your results, because reading them is what tells the two apart.

## `recentBadReviewPeriod` (type: `string`):

How recent the bad review has to be. Only used when the filter above is set. "Any time" is free and reads nothing; every other option reads the bad reviews of the businesses that could match.

## `maxLeadsPerPlace` (type: `integer`):

Number of decision-makers to look for at each business (0 turns the add-on off). Only works for businesses that have a website, so pairing this with the "Only businesses with a website" filter above avoids wasting the search on places we can never enrich.

## `leadSeniority` (type: `array`):

Only look for people at these levels. Leave empty to accept any. To reach the owner of a small local business, pick Owner and Founder.

## `leadDepartment` (type: `array`):

Only look for people in these departments. Leave empty to accept any.

## `findLeadEmails` (type: `boolean`):

Look up the work email of every contact found above, and verify it (each email comes back marked VALID or INVALID). Does nothing on its own: without "How many contacts per business" set above there is no person to find an email for, and nothing is charged.

## Actor input object example

```json
{
  "query": "coffee shops",
  "location": "New York,New York,United States",
  "languageCode": "en",
  "maxResults": 20,
  "requireWebsite": false,
  "skipClosed": false,
  "exactMatch": false,
  "maxReviews": 0,
  "reviewsSort": "newest",
  "recentBadReviewPeriod": "6m",
  "maxLeadsPerPlace": 0,
  "findLeadEmails": false
}
```

# Actor output Schema

## `businesses` (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 = {
    "query": "coffee shops",
    "location": "New York,New York,United States"
};

// Run the Actor and wait for it to finish
const run = await client.actor("atomus/google-maps-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 = {
    "query": "coffee shops",
    "location": "New York,New York,United States",
}

# Run the Actor and wait for it to finish
run = client.actor("atomus/google-maps-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 '{
  "query": "coffee shops",
  "location": "New York,New York,United States"
}' |
apify call atomus/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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