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

Google Maps Scraper — Extract business data from Google Maps, including names, categories, ratings, reviews, addresses, phone numbers, websites, opening hours, and locations. Useful for lead generation, local SEO, market research, and competitor analysis.

- **URL**: https://apify.com/socialdataapi/google-maps-scraper.md
- **Developed by:** [Social Data API](https://apify.com/socialdataapi) (community)
- **Stats:** 2 total users, 1 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Scraper — Name, Address, Phone, Website, Rating and Hours

Google Maps Scraper is a Google Maps business scraper that pulls local businesses by keyword and city, or from Maps links. Each place has its name, full address, phone number, website, star rating, categories, coordinates and opening hours, plus a review count on some rows. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a lead generation pipeline. **No Google account or cookies needed.** Start with one city, then scale to every market you sell in.

![Google Maps Scraper: scrape data as JSON](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-google-maps-hero.webp)

***

### What data can I extract with Google Maps Scraper?

Using this Google Maps Business API, you will be able to extract the following Google Maps place data:

| 📛 Business name | 🏠 Full address | 📞 Phone number | 🌐 Website |
|---|---|---|---|
| ⭐ Average star rating | 💬 Review count (when Google includes it) | 🏷️ Categories | 🆔 Google place ID |
| 📍 Latitude | 🧭 Longitude | 🕒 Opening hours per day | 🛣️ Street address |
| 🏙️ City | 🗺️ State or region | 📮 Postal code | 🌍 Country code |
| 📝 Notes (usually empty) | ✅ Row status | | |

***

### How to use Google Maps Scraper

Sales teams, agencies and researchers use it to collect Google Maps listings by keyword and location, one clean table of local businesses per run.

**Copy to your AI assistant:**

```text
Google Maps Scraper (Apify Actor ID: socialdataapi/google-maps-scraper, https://apify.com/socialdataapi/google-maps-scraper) is an Apify Actor that returns businesses and places from Google Maps as structured JSON: name, full address, phone number, website, average star rating, review count, categories, coordinates and opening hours. Use it whenever someone needs local businesses without cookies, a login, or a browser - Google Maps lead generation lists, competitor maps for a city, or counts of one business type per area. Inputs: keywords (string[], required, what to search for, e.g. ["coffee shops"]; every keyword is searched in every location; the first keyword is also used for a map link with no search text), locations (string[], city, region or neighborhood names), urls (string[], Google Maps search links; the search text and map position are read from the link), maxResults (integer 1-10000, default 20, total unique places for the whole run), proxyConfiguration (object, optional Apify Proxy settings or custom proxy URLs used from the first request; default starts direct and switches to Apify Proxy on its own when Google blocks). At least one location or one URL is needed. Every row has the same 18 keys: name, street_address, city, state, zip, country_code, full_address, website, avg_rating, total_reviews, tags, notes, place_id, phone, lat, long, hours (list of {day, hours, open24Hour, close24Hour}) and success (always true). Rows are deduplicated by place_id, and each saved row is one row_result charge (pay per event). total_reviews is filled and hours covers the whole week on only part of the rows (on the others total_reviews is null and hours holds only today); notes is usually null. A merged copy of all rows is saved in the run's Key-Value Store under the key maps.json.
```

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

Point your AI assistant at the hosted Apify MCP server with this Actor preloaded as a tool, and it can run it on its own with the server's call-actor tool. No glue code, no scraping logic in your prompts.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-maps-scraper"
```

#### Step by step

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open [Google Maps Scraper in the Apify Store](https://apify.com/socialdataapi/google-maps-scraper).
3. Enter your Google Maps keywords plus city or region names, or paste Google Maps search links.
4. Click **Start**.
5. Download or stream your results in JSON, CSV or Excel, so going from Google Maps to CSV is one click.

#### How to scale Google Maps Scraper to bulk

Put all your cities in the locations list and all your business types in the keywords list: the run searches every location and keyword pair, then your map links, and merges places found twice into one row. The place cap covers the whole run, up to 10,000 places, and each saved place is one row_result event. For more, schedule runs with different city lists in Apify Schedules or start runs in a loop from the Apify API. That is all a bulk Google Maps scraper job needs.

***

### ✨ Features

Google Maps Scraper fetches clean, structured places from Google Maps ⚡. It's ideal for building call lists, checking a client's local competitors, sizing a business category across cities and mapping where a type of business clusters.

It extracts, per place:

- **Business name and categories** – the name and Google's category list
- **Phone number and website** – the contact details on the listing, with a clean website link, so it doubles as a Google Maps phone number scraper
- **Average star rating and review count** – the rating on every row, the review count on part of the rows
- **Full address** – street, city, state, postal code and country code, plus one joined address line
- **Coordinates** – latitude and longitude of the place
- **Opening hours** – one entry per day with the hours text and opening and closing hour numbers

⚡ Each city is searched from end to end, and places outside the searched area are dropped before they are saved.

***

### Use cases 💡

- **Sales rep** — pull dentists' phone numbers across ten cities into one call list.
- **Local SEO agency** — find competitors missing opening hours or a website, pitch the client.
- **Market researcher** — compare place counts and star ratings for one category, city by city.
- **Franchise analyst** — map business coordinates and categories to spot gaps for a new site.
- **AI engineer** — feed names, addresses and ratings into a RAG index of local businesses.

Building an AI agent? [Connect this actor over MCP](#mcp-integration-for-ai-agents) and let it call the actor on its own.

***

### Why choose this actor?

- **Hundreds of places per run.** A recorded run returned 600 unique places for 3 cities × 3 keywords in 15.2 seconds, each with coordinates, categories and opening hours.
- **The numbers behind each place.** A recorded coffee shop in Buda, Texas came back with a 4.8 star rating, 405 reviews, 3 categories and opening hours for all 7 days.
- **18 fields, one row shape.** Every place carries the same 18 fields, and duplicates across cities, keywords and links are merged by Google's place ID.

***

### ⬇️ Input

![Google Maps Scraper input fields](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-google-maps-input.webp)

Give it one or more keywords plus city names, Google Maps search links, or both. The keywords list is required, and the run also needs at least one location or one link.

| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
| `locations` | No\* | array of strings | City, region or neighborhood names. Each is searched with every keyword. No default. | `["Austin, Texas", "Denver, Colorado"]` |
| `keywords` | Yes | array of strings | What to look for. Every keyword is searched in every location; the first keyword is also used for a map link with no search text. | `["coffee shops", "dentists"]` |
| `urls` | No\* | array of strings | Google Maps search links. They run after all location and keyword searches, while the place cap is not reached yet. No default. | `["https://www.google.com/maps/search/coworking/@30.2672,-97.7431,13z"]` |
| `maxResults` | No | integer | Total unique places for the whole run, across all locations, keywords and links. Default 20, allowed 1 to 10,000. | `200` |
| `proxyConfiguration` | No | object | Optional Apify Proxy settings or your own proxy URLs, used from the first request. Without it the run starts direct and switches to Apify Proxy on a block. | `{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}` |

\* At least one location or one link is needed.

#### Free plan limits

Users on the Apify free plan can fetch up to 20 places per run (all locations, keywords and links together) and 200 places per month. When the limit is reached, the run finishes successfully with a status message explaining the limit. Upgrade to any paid Apify plan to remove these limits.

Accepted Google Maps link formats:

- `https://www.google.com/maps/search/coffee+shops/@30.2672,-97.7431,13z` (search text and map center)
- `https://www.google.com/maps?q=dentists+austin` (search text only; the area is looked up)
- `https://www.google.com/maps/@39.74,-104.99,12z` (map center only; the first keyword is searched)

#### Example input

```json
{
  "locations": ["Austin, Texas", "Denver, Colorado"],
  "keywords": ["coffee shops", "dentists"],
  "urls": ["https://www.google.com/maps/search/coworking/@30.2672,-97.7431,13z"],
  "maxResults": 200,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

***

### ⬆️ Output

![Google Maps Scraper output: example JSON fields](https://api.apify.com/v2/key-value-stores/WYkyEfqs10huyXYxr/records/c-google-maps-output.webp)

Every place is one typed, normalized JSON item with the same 18 keys on every run, exported as JSON (default), CSV or Excel. The review count and the full week of opening hours are present on only part of the rows (on the others the review count is empty and the hours cover only today); the run also saves a merged copy of all rows as maps.json in its Key-Value Store.

#### Example output

```json
[
  {
    "street_address": "200 Main St",
    "city": "Buda",
    "zip": "78610",
    "state": "Texas",
    "country_code": "US",
    "full_address": "200 Main St Buda Texas 78610 US",
    "website": "http://www.meridianbuda.com/",
    "avg_rating": 4.8,
    "total_reviews": 405,
    "name": "Meridian",
    "tags": ["Coffee shop", "Cocktail bar", "Live music venue"],
    "notes": null,
    "place_id": "ChIJB3_V_NBTW4YRYwo_O6SlGdE",
    "phone": "(512) 312-4599",
    "lat": 30.081949,
    "long": -97.843013,
    "hours": [
      { "day": "Wednesday", "hours": "7 AM-10 PM", "open24Hour": 7, "close24Hour": 22 },
      { "day": "Thursday", "hours": "7 AM-10 PM", "open24Hour": 7, "close24Hour": 22 },
      { "day": "Friday", "hours": "7 AM-12 AM", "open24Hour": 7, "close24Hour": null },
      { "day": "Saturday", "hours": "8 AM-12 AM", "open24Hour": 8, "close24Hour": null },
      { "day": "Sunday", "hours": "8 AM-6 PM", "open24Hour": 8, "close24Hour": 18 },
      { "day": "Monday", "hours": "7 AM-10 PM", "open24Hour": 7, "close24Hour": 22 },
      { "day": "Tuesday", "hours": "7 AM-10 PM", "open24Hour": 7, "close24Hour": 22 }
    ],
    "success": true
  },
  {
    "street_address": "2307 1/2 Manor Rd",
    "city": "Austin",
    "zip": "78722",
    "state": "Texas",
    "country_code": "US",
    "full_address": "2307 1/2 Manor Rd Austin Texas 78722 US",
    "website": "http://ufo-coffee.com/",
    "avg_rating": 4.9,
    "total_reviews": null,
    "name": "UFO Coffee & Tea",
    "tags": ["Coffee shop"],
    "notes": null,
    "place_id": "ChIJ0S8AJAC1RIYRLIa71SkPRXc",
    "phone": "(512) 850-5150",
    "lat": 30.2844193,
    "long": -97.7173475,
    "hours": [
      { "day": "Wednesday", "hours": "7 AM-4 PM", "open24Hour": 7, "close24Hour": 16 }
    ],
    "success": true
  }
]
```

***

### How does it work?

To scrape Google Maps without a Google account, the actor reads the same public business listings any visitor sees on Google Maps, using plain HTTP requests and no browser. Each city name is turned into a map area that is searched from end to end. Requests start on a direct connection; when Google blocks one, the actor retries and switches to Apify Proxy on its own, stepping up to a stronger proxy if needed. Before the first search it checks that results land in the area you asked for. It returns only publicly visible data, what any visitor sees without logging in. Every row keeps the same 18 keys; if Google moves a value in its response, that value comes back empty instead of breaking the row shape.

***

### How do you integrate Google Maps Scraper into your stack?

It works with what you already use: the Apify REST API from any language, MCP for AI agents, and no-code tools. As a Google Maps Places API alternative, it needs no Google Cloud project and no Google API key.

#### MCP integration for AI agents

Add the hosted Apify MCP server to your agent with one command:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-maps-scraper"
```

This registers the Apify MCP server with this actor already added as a tool, so your agent can call it directly with call-actor. Compatible clients include Claude Code, Cursor and Windsurf.

#### No-code tools (n8n, Make, LangChain)

- **n8n**: add the Apify node, choose "Run an Actor", pick this actor and paste your input JSON. Pass the returned places to the next node, such as Google Sheets or your CRM.
- **Make**: use the Apify app's "Run an Actor" module with this actor, then its "Get Dataset Items" module to map each place into your scenario.
- **LangChain**: install `langchain-apify` and wrap this actor with `ApifyActorsTool`, so your agent can run a search and read the places as tool output.

***

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

Collecting publicly visible business listings from Google Maps is generally lawful, as long as you respect how the data may be stored and used. This actor returns only publicly available data, what any user sees without logging in: business names, addresses, phone numbers, websites, star ratings and opening hours. It collects no review texts and no reviewer profiles. Under GDPR, scraping public data is generally permissible, but storing and using it must comply with local data-protection law, because a sole trader's name or phone number can still count as personal data. Consult legal counsel if your use case involves bulk storage of personal data.

***

### Frequently asked questions

#### What fields does Google Maps Scraper return?

The top five are the business name, full address, phone number, website and average star rating. Every row also carries the review count, categories, place ID, coordinates and opening hours; see [the data fields section](#what-data-can-i-extract-with-google-maps-scraper).

#### Does Google Maps Scraper require a Google Maps account or login?

No. Only public place data is extracted, the same results a logged-out visitor sees. No credentials or Google API key are needed.

#### How fast does Google Maps Scraper run?

Recorded local runs took 4.8 seconds for 20 places, 5.4 seconds for 200 places, and 15.2 seconds for 600 places across 3 cities × 3 keywords. The data is live, fetched from Google during the run and never cached.

#### What happens if a place is private or doesn't exist?

Google Maps places are public, so there is no private case; what can fail is the area. If a city name can't be found, or a map link has no usable area, the log shows a warning, that search is skipped and the run goes on, and the end-of-run summary counts skipped entries. A search with no matching places adds no rows, so check for an empty dataset in your code rather than an error.

#### Can I scrape multiple Google Maps places at once?

Yes. Add several cities and keywords, and every pair is searched in one run before any map links. The run stops at your place cap, up to 10,000 places, and merges duplicates.

#### Does Google Maps Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes — Google Maps Scraper is available as an MCP tool through the hosted Apify MCP server. Register the server in Claude Code, Cursor or Windsurf with `claude mcp add --transport http apify "https://mcp.apify.com?tools=socialdataapi/google-maps-scraper"`, and the agent can call the actor right away. Any agent that can call an HTTP endpoint can use the Apify REST API directly.

#### Does Google Maps Scraper return data in a format LLMs can use directly?

Yes. Every place is typed, normalized JSON with the same field names on every row. There is no HTML parsing and no selectors, so you can pass rows straight to an LLM, index them into a vector store or feed them to an agent tool without a transformation step.

#### What happens when Google Maps changes its layout or updates its anti-bot system?

Blocks are handled on the actor's side by switching to a stronger Apify Proxy tier. If Google changes its response format, the row shape stays the same 18 keys and the affected value comes back empty until the actor is updated, so your code does not need to change.

#### Can I use Google Maps Scraper without managing proxies or browser infrastructure?

Yes. The actor uses plain HTTP requests, so there is no browser to run, and it retries and switches to Apify Proxy on its own when Google blocks. You send one request and get structured JSON back. No proxy accounts, no headless browser setup, no maintenance.

#### Which Google Maps place fields work best for AI training data and RAG indexing?

For RAG, use the text-rich fields: business name, full address, categories and website. For training data, use the numeric fields: average star rating, review count and coordinates. Ratings and coordinates are numbers, the review count is an integer, and categories and opening hours are lists, so flatten the hours if your pipeline needs plain text.

***

### Your feedback

Found a bug or missing a field? Let us know through the Issues tab on this Actor's page in the Apify Store. Reports about empty fields help keep the Google Maps data extractor in line with Google's latest response format.

# Actor input Schema

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

One place name per line, e.g. New York, Texas, Downtown Chicago. Each location is searched with every keyword. You need at least one location or one Google Maps link.

## `keywords` (type: `array`):

What to look for, e.g. coffee shops, dentists, coworking. At least one keyword is required. Every keyword is searched in every location; the first keyword is also used for a map link that has no search text.

## `urls` (type: `array`):

Google Maps links, one per line, e.g. https://www.google.com/maps/search/coffee+shops/@30.27,-97.74,13z. The Actor reads the search text and the map position from the link; if the position is missing it looks up the search text, and a link without search text uses your first keyword.

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

Total unique places (duplicates merged) across all locations, keywords and links together, 1–10,000. Free plan: up to 20 places per run (all locations, keywords and links together) and 200 per month; paid plans have no limit.

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

Optional. When you turn on Apify Proxy (or add your own proxy URLs), your settings are used from the first request. If Google still blocks requests, the Actor switches to a stronger Apify Proxy on its own.

## Actor input object example

```json
{
  "locations": [
    "New York"
  ],
  "keywords": [
    "coffee shops"
  ],
  "urls": [],
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the Actor's default dataset.

## `mapsJson` (type: `string`):

A single JSON file with every place collected this run, written once at the end to the Key-Value Store.

# 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 = {
    "locations": [
        "New York"
    ],
    "keywords": [
        "coffee shops"
    ],
    "urls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialdataapi/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 = {
    "locations": ["New York"],
    "keywords": ["coffee shops"],
    "urls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

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

```

## MCP server setup

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