# Google Maps Scraper · No Login · $0.07/1k (`alfalfa/google-maps-scraper`) Actor

Google Maps scraper and API: places from any search and location with address, phone, website, rating, review count, opening hours and photos. Add details, reviews and emails or social profiles from websites. Rating, category and website filters. No login, no API key. $0.07 per 1,000 places.

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

## Pricing

from $0.05 / 1,000 places

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: places, reviews and emails from any search, no login

Type what you are looking for and where, and get **one row per Google Maps place**: name, category, full address split into street, city, postal code and state, coordinates, phone, website, rating, review count, star breakdown, opening hours for the whole week, photos and attributes. Add **reviews** and **emails and social profiles from the business websites** when you need them. Export to Excel, CSV or JSON, or read it through the API.

**$0.07 per 1,000 places.** Place details $0.20 per 1,000, reviews $0.035 per 1,000, website contacts $0.90 per 1,000 places where something was found. No start fee, platform usage and proxies included.

### What you get

| Field | Example |
|---|---|
| `title`, `categoryName`, `categories`, `description` | `La Grande Boucherie`, `French restaurant`, `["French restaurant", "Restaurant"]` |
| `address`, `street`, `neighborhood`, `city`, `postalCode`, `state`, `countryCode`, `plusCode` | `145 W 53rd St, New York, NY 10019`, `145 W 53rd St`, `Manhattan`, `New York`, `10019`, `New York`, `US` |
| `location`, `timezone` | `{"lat": 40.7626, "lng": -73.9808}`, `America/New_York` |
| `phone`, `phoneUnformatted`, `website` | `(212) 510-7714`, `+12125107714`, `https://www.boucherieus.com/` |
| `totalScore`, `reviewsCount`, `reviewsDistribution`, `reviewsTags` | `4.6`, `11131`, `{"oneStar": 354, …, "fiveStar": 8896}`, `[{"title": "specialty coffee", "count": 77}]` (star breakdown and topics with details) |
| `openingHours`, `openingHoursStatus`, `wasOpenAtScrapeTime` | `[{"day": "Monday", "hours": "8 AM to 12 AM"}, …]`, `Open · Closes 12 AM`, `true` |
| `price`, `popularTimesHistogram`, `menu`, `peopleAlsoSearch` | `$50–100`, busyness per hour for each weekday, menu link, related places (with details, where Google shows them) |
| `additionalInfo` | `{"Service options": [{"Outdoor seating": true}], "Accessibility": [...]}` |
| `imageUrl`, `imagesCount`, `imageUrls`, `imageCategories` | main photo, `13723`, photo links, `["All", "Menu", "Food & drink"]` |
| `reserveTableUrl`, `tableReservationLinks`, `ownerName`, `claimThisBusiness` | OpenTable link, owner profile, `false` = verified owner |
| hotels: `hotelStars`, `hotelPrice`, `checkInDate`, `hotelAds`, `hotelAmenities` | `5-star hotel`, `$1,099`, `2026-10-04`, prices by booking site |
| `placeId`, `fid`, `cid`, `kgmid`, `url` | IDs that match Google's own links |
| `reviews` (option) | text, translation, stars, date, reviewer, Local Guide, owner reply, photos, Food/Service/Atmosphere ratings |
| `emails`, `phones`, `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks`, `pinterests` (option) | found on the place's own website |
| `searchString`, `rank`, `searchPageUrl`, `scrapedAt` | which search found the place and at what position |

Field names match the most used Google Maps scraper on Apify, so existing spreadsheets, Make scenarios and code keep working.

### How to search

- **Search terms + location**: `restaurant` in `New York, USA`, `dentist` in `Prague`, several terms and several locations (separated by a semicolon) in one run. Each term is searched in each location.
- **More than 120 places**: Google shows at most about 120 to 200 places for one search. When a location holds more, the Actor searches it part by part and removes duplicates, so `Max places per search` can go into the thousands.
- **Google Maps URLs**: place pages, share links (`maps.app.goo.gl`), `?cid=` links and search pages like `google.com/maps/search/pizza/@40.75,-73.98,14z` (searched in that map area).
- **Place IDs**: `ChIJ...` IDs or CIDs.

Free filters, applied before anything is charged: **minimum rating**, **with or without a website** (web designers love this one), **category words**, **name must contain the search term**, **skip closed places**.

### Use cases

- **Lead generation**: every plumber, gym or dental clinic in a region with phone, website and email, straight into a CRM.
- **Local SEO and competitor research**: ratings, review counts, star breakdown and review topics of every competitor in town.
- **Review monitoring**: the newest reviews of your locations every week, with owner replies and aspect ratings.
- **Market and location analysis**: coordinates, categories, popular times and price ranges for site selection.
- **Travel and hospitality**: hotels with stars, prices by booking site and amenities.

### Examples

Restaurants in Manhattan rated 4.5 and higher, with place details and 20 newest reviews each:

```json
{ "searchStringsArray": ["restaurant"], "locationQuery": "Manhattan, New York", "maxCrawledPlacesPerSearch": 200, "placeMinimumStars": "fourAndHalf", "scrapePlaceDetailPage": true, "maxReviews": 20 }
```

Plumbers without a website in three cities, for a web agency:

```json
{ "searchStringsArray": ["plumber"], "locationQuery": "Austin, TX; Dallas, TX; Houston, TX", "website": "withoutWebsite", "maxCrawledPlacesPerSearch": 500 }
```

Emails and social profiles of every coffee shop in Berlin:

```json
{ "searchStringsArray": ["coffee shop"], "locationQuery": "Berlin, Germany", "maxCrawledPlacesPerSearch": 2000, "scrapeContacts": true }
```

All reviews of one place from the last 3 months:

```json
{ "startUrls": [{ "url": "https://www.google.com/maps/place/?q=place_id:ChIJ58OtM8pZwokRbd6DT6gcVys" }], "maxReviews": 5000, "reviewsStartDate": "3 months" }
```

Output row (shortened):

```json
{
  "title": "La Grande Boucherie",
  "categoryName": "French restaurant",
  "address": "145 W 53rd St, New York, NY 10019",
  "city": "New York",
  "postalCode": "10019",
  "state": "New York",
  "countryCode": "US",
  "location": { "lat": 40.7626274, "lng": -73.9808411 },
  "phone": "(212) 510-7714",
  "phoneUnformatted": "+12125107714",
  "website": "https://www.boucherieus.com/",
  "totalScore": 4.6,
  "reviewsCount": 11131,
  "reviewsDistribution": { "oneStar": 354, "twoStar": 269, "threeStar": 470, "fourStar": 1142, "fiveStar": 8896 },
  "openingHours": [{ "day": "Monday", "hours": "8 AM to 12 AM" }, { "day": "Tuesday", "hours": "8 AM to 12 AM" }],
  "placeId": "ChIJ58OtM8pZwokRbd6DT6gcVys",
  "url": "https://www.google.com/maps/search/?api=1&query=La+Grande+Boucherie&query_place_id=ChIJ58OtM8pZwokRbd6DT6gcVys",
  "emails": ["lagrande@boucherie.nyc", "pr@thegroup.nyc"],
  "instagrams": ["https://www.instagram.com/boucherie_us"],
  "reviews": [{ "name": "Krystel M.", "stars": 5, "text": "Excelente", "textTranslated": "Excellent", "publishedAtDate": "2026-09-14T02:08:10.672Z", "reviewDetailedRating": { "Food": 5, "Service": 5, "Atmosphere": 5 } }]
}
```

One row per review instead of per place: download the dataset with `?unwind=reviews` in the API URL.

### Use it from code, n8n, Make, Zapier or an AI agent

- **API**: `POST https://api.apify.com/v2/acts/alfalfa~google-maps-scraper/run-sync-get-dataset-items?token=…` with the JSON input above returns the rows directly (runs up to 5 minutes). Longer jobs: start the run, poll, read the dataset. Any Apify client library works.
- **n8n, Make, Zapier**: add the Apify node, pick `alfalfa/google-maps-scraper`, paste the same JSON input and read the run's dataset in the next step. See the [Apify integrations docs](https://docs.apify.com/platform/integrations).
- **AI agents and MCP (Claude, Cursor, VS Code, ChatGPT)**: connect the Apify MCP server with this Actor as a tool, `https://mcp.apify.com/?tools=alfalfa/google-maps-scraper`, and the agent can find places by describing what it wants. See [Apify MCP docs](https://docs.apify.com/platform/integrations/mcp).

### Pricing

| Event | Free plan | Starter | Scale | Business | Platinum / Diamond |
|---|---|---|---|---|---|
| Place | $0.07 / 1,000 | $0.065 | $0.05 | $0.045 | $0.04 |
| Place details (option; always for URLs and place IDs) | $0.20 / 1,000 | $0.18 | $0.16 | $0.14 | $0.12 |
| Review | $0.035 / 1,000 | $0.033 | $0.03 | $0.028 | $0.025 |
| Website contacts, only where an email or profile was found | $0.90 / 1,000 | $0.80 | $0.70 | $0.45 | $0.40 / $0.35 |
| Filters, photos, start fee, platform usage, proxies | included | | | | |

A run's **Maximum total charge** is honoured: the Actor reserves the cost of each place with its details, reviews and contacts before collecting it, so the bill never exceeds the budget.

### Limits and honesty

- Google decides what it shows. Price range, popular times, menu, image categories and related places are filled when Google includes them for the place; for some places and at some times it leaves them out, and those fields stay empty.
- Search results are Google's. A very specific term in a small town may return places from nearby towns, as on Google Maps itself; use the filters or `searchMatching` to narrow it down.
- Areas larger than a city are searched in parts. Very large areas with a low `Max places per search` return the places Google ranks first, not an even spread.
- Reviews: up to 5,000 per place in one run. Google shows all reviews of a place, but a place with 50,000 reviews takes a while.
- Contacts come from the business's own website (the home page and up to two contact pages). Sites that block visitors or hide emails in images return nothing, and nothing is charged.
- Questions and answers are no longer shown by Google Maps and are not included.

### FAQ

**Is there a Google Maps API for this?** Google's Places API returns at most 60 results per search, is billed per request and returns no emails or social profiles. This Actor reads the public Google Maps pages without an account or API key.

**How many places can I get?** As many as Google Maps shows for the area. A city usually has thousands of restaurants; set `Max places per search` accordingly.

**Can I get reviews as separate rows?** Yes, add `&unwind=reviews` to the dataset export URL, or use the reviews field in Make and n8n.

**Which languages work?** Any language Google Maps supports; pick it in the Language field. Reviews come in their original language with a translation into the chosen one.

**Is this legal?** The Actor reads data Google shows publicly to everyone. Personal data of reviewers can be turned off. Follow the privacy rules of your country when you use emails for outreach.

### Related Actors by the same author

| Actor | What it does | Price |
|---|---|---|
| [Amazon Product Scraper](https://apify.com/alfalfa/amazon-product-scraper) | products from searches, Best Sellers lists and ASINs in 22 Amazon stores with price, rating, BSR and details | $0.28 per 1,000 products |
| [Google Ads Transparency Scraper](https://apify.com/alfalfa/google-ads-transparency-scraper) | every ad of an advertiser or website domain with format, dates, regions, previews, YouTube ids | $0.50 per 1,000 ads |
| [YouTube Scraper](https://apify.com/alfalfa/youtube-scraper) | videos of a search, channel, playlist or URL list with views, likes, date, tags, plus transcripts and comments | $0.50 per 1,000 rows |
| [LinkedIn Jobs Scraper](https://apify.com/alfalfa/linkedin-jobs-scraper) | public LinkedIn job postings by keyword, location, date, company or URL | $0.50 per 1,000 jobs |
| [Facebook Ads Library Scraper](https://apify.com/alfalfa/facebook-ads-library-scraper) | ads from the Meta Ad Library by keyword, advertiser page or URL | $0.50 per 1,000 ads |
| [Facebook Pages Scraper](https://apify.com/alfalfa/facebook-pages-scraper) | page details with email, phone, address, followers, rating, About text | from $3.50 per 1,000 pages |
| [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper) | posts of any public page or profile with reactions, comment counts, media | $2 per 1,000 posts |
| [Facebook Comments Scraper](https://apify.com/alfalfa/facebook-comments-scraper) | comments and replies of any public post | $0.50 per 1,000 comments |
| [Facebook Events Scraper](https://apify.com/alfalfa/facebook-events-scraper) | events by search, page or URL with dates, venue, tickets and organizer email | $5 per 1,000 events |

Not affiliated with, endorsed by or connected to Google LLC or Apify.

# Actor input Schema

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

What to look for on Google Maps, one per line: <code>restaurant</code>, <code>dentist</code>, <code>coffee shop</code>. Each term is searched in every location below. A term that already names a place (<code>pizza in Brooklyn</code>) works without a location.

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

City, district, region or country as you would type it into Google Maps: <code>New York, USA</code>, <code>Prague</code>, <code>Texas</code>. Separate several locations with a semicolon. Larger areas are searched part by part, so you are not limited to the 120 places Google shows on one map.

## `maxCrawledPlacesPerSearch` (type: `integer`):

Maximum places for each search term in each location (and for each search URL). Duplicates are removed across the whole run and charged once.

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

Language of the place names, categories, opening hours and review translations.

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

Place pages (<code>google.com/maps/place/...</code>), share links (<code>maps.app.goo.gl/...</code>), <code>?cid=</code> and <code>maps?q=\<place name></code> links, and search pages (<code>google.com/maps/search/pizza/@40.75,-73.98,14z</code>, searched in that map area). A link to a text file with one URL per line works too.

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

Google place IDs (<code>ChIJ...</code>), one per line. CIDs (the number in <code>?cid=</code> links) work too.

## `scrapePlaceDetailPage` (type: `boolean`):

Adds the description from the owner, star breakdown, review topics, photo count and, where Google shows them, price range, popular times, menu, image categories and related places. One extra request per place. $0.20 per 1,000 places with details. Places from URLs and place IDs always come with details. Off = the search result fields: name, address, phone, website, rating, review count, weekly hours, attributes.

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

Reviews to collect for each place, saved in the <code>reviews</code> field of the place. 0 = none. $0.035 per 1,000 reviews. Up to 5,000 per place; a place with very long reviews stops earlier, at the size one dataset record can hold (about 6 MB).

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

Order in which reviews are collected. With a start date below, reviews are always collected newest first.

## `reviewsStartDate` (type: `string`):

Only reviews published after this date: <code>2026-01-31</code> or a period like <code>3 months</code>, <code>2 weeks</code>, <code>1 year</code>.

## `reviewsFilterString` (type: `string`):

Keep only reviews whose text (or translation) contains this word or phrase. Not case sensitive.

## `scrapeReviewsPersonalData` (type: `boolean`):

Reviewer name, profile link, photo, review count and Local Guide flag. Turn off if you do not need personal data.

## `maxImages` (type: `integer`):

Photo URLs to include in <code>imageUrls</code> (from the place details, usually up to 20). 0 = only the main photo. No surcharge.

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

Visits the website of each place and adds emails, phone numbers and Facebook, Instagram, LinkedIn, X, YouTube, TikTok and Pinterest profiles. $0.90 per 1,000 places where an email or profile was found; nothing for the rest.

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

Keep places whose Google category contains one of these words: <code>pizza</code> keeps Pizza restaurant and Pizza delivery. Empty = all. Filters are free.

## `searchMatching` (type: `string`):

Keep only places whose name contains, or equals, the search term. Useful for brands (<code>Starbucks</code>).

## `placeMinimumStars` (type: `string`):

Keep only places rated at least this many stars. Places without a rating are left out.

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

Keep places with a website, without one (good for selling web design), or all.

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

Leave out places marked as temporarily or permanently closed.

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

Two-letter country the searches are made from (<code>us</code>, <code>de</code>). Affects how Google reads ambiguous locations and formats phone numbers. Default <code>us</code>.

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

Places processed in parallel (default 10).

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

Residential proxies are included in the price. Leave the default unless you want your own proxy servers.

## Actor input object example

```json
{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "New York, USA",
  "maxCrawledPlacesPerSearch": 50,
  "language": "en",
  "scrapePlaceDetailPage": false,
  "maxReviews": 0,
  "reviewsSort": "newest",
  "scrapeReviewsPersonalData": true,
  "maxImages": 0,
  "scrapeContacts": false,
  "searchMatching": "all",
  "placeMinimumStars": "",
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All scraped places as JSON. Append ?format=csv for CSV, or ?unwind=reviews for one row per review.

# 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": "New York, USA",
    "maxCrawledPlacesPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfalfa/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 = {
    "searchStringsArray": ["restaurant"],
    "locationQuery": "New York, USA",
    "maxCrawledPlacesPerSearch": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alfalfa/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 '{
  "searchStringsArray": [
    "restaurant"
  ],
  "locationQuery": "New York, USA",
  "maxCrawledPlacesPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alfalfa/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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