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

Scrape Google Maps places by search query or URL: name, address, phone, website, email, hours, rating, reviews, menu, photos and more.

- **URL**: https://apify.com/seemuapps/google-maps-scraper.md
- **Developed by:** [Andrew](https://apify.com/seemuapps) (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 $4.00 / 1,000 place results

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/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 Scraper

Extract businesses and places from Google Maps by search query or place URL — name, full address, phone, website, email, opening hours, rating, review count, price level, categories, photos, menu, amenities, and full reviews. No Google API key, no browser: fast HTTP-based scraping that streams every place as its own dataset row.

### What you get

- **One dataset row per place** with `placeId`, `googlePlaceId` (ChIJ…), `googleMapsUrl`, `name`, `subtitle`, `address` split into `street` / `city` / `postalCode` / `state` / `countryCode` / `neighborhood`, `latitude` / `longitude`, `plusCode`, `timezone`
- **Contact & business info** — `phone`, `phoneUnformatted`, `website`, `menuUrl`, `email` (from Google or extracted from the business website), `socialLinks`, `bookingLinks`
- **Reputation** — `rating`, `reviewCount`, `priceLevel`, `businessStatus` (`OPERATIONAL` / `CLOSED_PERMANENTLY` / `CLOSED_TEMPORARILY`), `hotelStars` for lodging
- **Hours** — `openNow`, `openStatusText` ("Open · Closes 11 PM"), full weekly `openingHours`
- **Rich content** — `description`, `categories`, `about` (attributes like delivery, wheelchair access, payments), `menu` (sections + items + prices where Google has them), up to 20 `photos`
- **Reviews (optional)** — up to N newest reviews per place with reviewer name/profile/avatar, Local Guide flag, star rating, text, language, publish/edit timestamps, review photos, and owner replies
- **Direct place lookups** — paste Google Maps URLs, `maps.app.goo.gl` short links, `?cid=` links, or Place IDs alongside (or instead of) search queries
- Export to JSON, CSV, Excel, or Google Sheets straight from the Apify console

### Use cases

- **Lead generation** — build lists of local businesses with phone, website and email for outbound campaigns
- **Local SEO & competitor analysis** — track ratings, review counts, categories and hours across a city or niche
- **Market research** — count and map every dentist, gym, or coffee shop in a region; compare price levels and amenities
- **Review monitoring & sentiment** — pull recent reviews and owner replies for your locations or competitors
- **Data enrichment** — resolve a Place ID or Maps URL to a full structured business record
- **Directory & travel sites** — populate listings with addresses, hours, photos, menus and Google Maps links

### How to use

1. Enter one or more **Search queries** — e.g. `coffee shops in Amsterdam`, `dentists near Austin TX`. Put the city or area in the query.
2. Optionally add **Place URLs or IDs** to scrape specific places directly.
3. Set **Max places per query** (default 20; Google returns at most ~120 per query — use several more specific queries such as `plumbers in Brooklyn`, `plumbers in Queens` to cover a large city).
4. Set **Max reviews per place** if you want reviews attached to each place (0 = skip, fastest).
5. Toggle **Extract emails from websites** to visit each business website and pull a contact email when Google Maps doesn't list one.
6. Optionally set **Language** / **Country**, or **Latitude** / **Longitude** / **Zoom** to bias the search area.
7. Run — every place appears as its own row in the **Dataset** tab.

### Output format

```json
{
  "placeId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
  "googlePlaceId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
  "googleMapsUrl": "https://maps.google.com/?cid=3545819340560108778",
  "name": "Katz's Delicatessen",
  "subtitle": "Iconic Jewish deli for classic eats",
  "address": "205 E Houston St, New York, NY 10002",
  "street": "205 E Houston St",
  "city": "New York",
  "postalCode": "10002",
  "state": "New York",
  "countryCode": "US",
  "neighborhood": "Manhattan",
  "plusCode": "87G8P2C7+V2",
  "latitude": 40.722233,
  "longitude": -73.987429,
  "timezone": "America/New_York",
  "rating": 4.5,
  "reviewCount": 54692,
  "categories": ["Deli", "American restaurant", "Jewish restaurant", "Restaurant", "Sandwich shop"],
  "primaryType": "Deli",
  "website": "https://katzsdelicatessen.com/",
  "menuUrl": "https://localmenu.katzsdelicatessen.com/menu-and-local.html",
  "phone": "(212) 254-2246",
  "phoneUnformatted": "+12122542246",
  "email": null,
  "priceLevel": "$30–40",
  "description": "No-frills deli with theatrically cranky service serving mile-high sandwiches since 1888.",
  "businessStatus": "OPERATIONAL",
  "openNow": true,
  "openStatusText": "Open · Closes 11 PM",
  "openingHours": {
    "periods": [{ "day": "Sunday", "hours": "12 AM–11 PM" }, { "day": "Monday", "hours": "8 AM–11 PM" }],
    "weekdayText": ["Sunday: 12 AM–11 PM", "Monday: 8 AM–11 PM"],
    "openNow": true,
    "nextOpening": "Closes 11 PM"
  },
  "about": [{ "group": "Service options", "attributes": [{ "label": "Delivery", "present": true }, { "label": "Takeout", "present": true }] }],
  "menu": [{ "category": "Soup & Salad", "items": [{ "name": "Matzo Ball Soup", "description": "…", "price": "$9.45" }] }],
  "photos": ["https://lh3.googleusercontent.com/gps-cs-s/…=w1920-h1080-k-no"],
  "socialLinks": [],
  "reviews": [
    {
      "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2pGb2NVRldWV3RDYldoTlgweFVhR3hNY3pkWWFIYxAB",
      "reviewUrl": "https://www.google.com/maps/reviews/data=…",
      "reviewerName": "Kevin Zheng",
      "reviewerProfileUrl": "https://www.google.com/maps/contrib/101605690454614380171?hl=en",
      "reviewerReviewCount": 207,
      "reviewerIsLocalGuide": true,
      "rating": 3,
      "text": "Even though they had several lines going…",
      "dateText": "2 months ago",
      "publishedAt": "2026-06-08T14:04:50.959Z",
      "language": "en",
      "photos": [],
      "ownerReply": "",
      "ownerReplyDate": ""
    }
  ],
  "reviewsFetched": 12,
  "searchQuery": "delis in Lower East Side",
  "scrapedAt": "2026-08-16T05:57:55.221Z"
}
```

Set **Max reviews per place** to 0 and `reviews` is simply an empty array.

### Pricing

Pay per result: you are charged for each **place** saved to the dataset and, if enabled, for each **review** fetched. No charge for places that fail to load.

### FAQ

**How many places can one query return?** Google Maps caps a single search at roughly 120 results. For full coverage of a large city, split by neighborhood or zip code (`dentists in 78701`, `dentists in 78702`, …) — duplicates across queries are removed automatically.

**Do I need a Google Maps API key?** No. The actor reads the same data Google Maps shows in the browser.

**Can I scrape a single business?** Yes — paste its Google Maps URL, short link, or Place ID into **Place URLs or IDs** and leave search queries empty.

**Which language are results in?** Whatever you set in **Language** (`en` by default). Review text is returned in its original language with a `language` code.

**What does Extract emails do?** If Google Maps has no email for a place but lists a website, the actor fetches the website homepage and extracts the first valid contact email (mailto links first). It's best-effort — many sites don't publish an address on the homepage.

**Can I run it on a schedule?** Yes — use Apify Schedules and connect the dataset to Google Sheets, a webhook, or your CRM.

# Actor input Schema

## `searchQueries` (type: `array`):

What to search on Google Maps, one query per line — e.g. "coffee shops in Amsterdam", "dentists near Austin TX", "hotels near Central Park". Include the city/area in the query for best results.

## `placeUrls` (type: `array`):

Scrape specific places directly. Accepts full Google Maps place URLs, maps.app.goo.gl short links, ?cid= links, Google Place IDs (ChIJ…), or hex IDs (0x…:0x…). Can be combined with search queries.

## `maxPlacesPerQuery` (type: `integer`):

Maximum number of places to scrape for each search query. Google Maps returns at most ~120 results per query. Set 0 to take everything Google returns.

## `maxReviewsPerPlace` (type: `integer`):

How many reviews to fetch for each place (newest first). Reviews are attached to the place record under `reviews`. Set 0 to skip reviews (faster).

## `extractEmails` (type: `boolean`):

When a place lists a website but Google Maps has no email, visit the website and extract a contact email address (mailto: links first, then page text). Adds one request per place.

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

Language code for results (names, categories, review text labels), e.g. en, de, fr, es, pt-BR.

## `country` (type: `string`):

Two-letter country code that biases search results, e.g. us, gb, de, au.

## `latitude` (type: `number`):

Optional. Center the map search around this latitude. Leave empty to let Google infer the location from the query text.

## `longitude` (type: `number`):

Optional. Center the map search around this longitude. Use together with latitude.

## `zoom` (type: `integer`):

Map zoom used with latitude/longitude — 3 (continent) to 21 (street). Higher zoom = smaller search area. Only used when coordinates are set.

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

Optional. By default the actor connects directly and automatically falls back to Apify datacenter → residential proxies only if Google starts blocking. Set a specific proxy here to force it for all requests.

## Actor input object example

```json
{
  "searchQueries": [
    "coffee shops in Amsterdam"
  ],
  "placeUrls": [],
  "maxPlacesPerQuery": 20,
  "maxReviewsPerPlace": 0,
  "extractEmails": false,
  "language": "en",
  "country": "us",
  "zoom": 13,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

One place per record: placeId, googlePlaceId, name, address (+ street/city/postalCode/state/countryCode), latitude/longitude, plusCode, rating, reviewCount, categories, website, phone, email, priceLevel, businessStatus, openNow, openingHours, about, menu, photos, socialLinks, reviews\[].

# 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 = {
    "searchQueries": [
        "coffee shops in Amsterdam"
    ],
    "placeUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/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 = {
    "searchQueries": ["coffee shops in Amsterdam"],
    "placeUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/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 '{
  "searchQueries": [
    "coffee shops in Amsterdam"
  ],
  "placeUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call seemuapps/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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