# Google Maps Scraper (`yasmany.casanova/google-maps-scraper`) Actor

Find businesses on Google Maps around any point. Each place comes with name, category, address, phone, website, rating, review count, opening hours and a Google Maps link. Up to 100 places per search, no setup needed.

- **URL**: https://apify.com/yasmany.casanova/google-maps-scraper.md
- **Developed by:** [Yasmany Grijalba Casanova](https://apify.com/yasmany.casanova) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 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/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

Find **places on Google Maps** around any point and get every listing as data: **name, category, address, phone, website, rating, review count, opening hours** and a direct **Google Maps link**, plus the **average rating** across the places returned.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue?logo=apify)](https://apify.com)
[![Markets](https://img.shields.io/badge/Markets-18%20Countries-green)](https://www.google.com/maps)

***

> ℹ️ **Zero configuration**
> Provide what to look for and where, then run it: results are ready in seconds.

***

### Quick Start

```json
{
  "query": "pet shop",
  "coordinates": "-23.5617, -46.6916",
  "maxResults": 20
}
```

> **Tip**: To get the coordinates, right-click the spot on Google Maps and click the numbers at the top of the menu. They are copied as `-23.5617, -46.6916`, ready to paste. You can also paste a Google Maps link that contains the point.

#### More examples

<details>
<summary>Coffee shops within 800 m in New York</summary>

```json
{
  "query": "coffee",
  "coordinates": "40.7411, -73.9897",
  "radiusMeters": 800,
  "maxResults": 40,
  "country": "us"
}
```

</details>

<details>
<summary>Every dentist Google lists around a point in Madrid</summary>

```json
{
  "query": "dentista",
  "coordinates": "40.4168, -3.7038",
  "maxResults": 100,
  "country": "es"
}
```

</details>

***

### Supported Markets

| Country | `country` | Country | `country` |
|---------|-----------|---------|-----------|
| Brazil (default) | `br` | Germany | `de` |
| Portugal | `pt` | Austria | `at` |
| United States | `us` | France | `fr` |
| United Kingdom | `gb` | Spain | `es` |
| Canada | `ca` | Mexico | `mx` |
| Australia | `au` | Argentina | `ar` |
| India | `in` | Colombia | `co` |
| Ireland | `ie` | Chile | `cl` |
| Italy | `it` | Netherlands | `nl` |

The market sets the language of categories, addresses and opening hours. The places themselves come from wherever the search point is.

***

### Features

| Feature | Description |
|---------|-------------|
| **Any Point on Earth** | Search around coordinates or a Google Maps link |
| **Contact Data** | Phone and website for every place that publishes them |
| **Ratings & Reviews** | Star rating and review count, plus the average across the places returned |
| **Opening Hours** | Whether the place is open now and its hours for each weekday |
| **Google Maps Link** | A link that opens each place on Google Maps, plus its stable place id (CID) |
| **Up to 100 Places** | Page through the results, deduplicated and numbered in order |

***

### Use Cases

- **Lead Generation**: Build lists of businesses with phone and website for a region and a business type
- **Market Research**: Count and compare the businesses of a type around each of your stores
- **Competitor Mapping**: See who competes near a location and how customers rate them
- **Location Planning**: Check how crowded a neighbourhood is before opening a new point
- **Directory Building**: Collect consistent place data with hours, ratings and links

***

### Input Parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `query` | string | none | What to look for: a business type or a brand (**required**) |
| `coordinates` | string | none | `"latitude, longitude"` of the point to search around, or a Google Maps link (**required**) |
| `radiusMeters` | integer | none | Narrows the map around the point (100 to 50,000). Empty uses Google's default view |
| `maxResults` | integer | `20` | Places to return (1 to 100). 20 per page, one request per page |
| `country` | string | `br` | Market to search from (see the table above) |

***

### Output Example

Each place is a row, followed by a summary row with the totals:

```json
[
  {
    "record_type": "place",
    "query": "pet shop",
    "country": "br",
    "coordinates": "-23.5617, -46.6916",
    "page": 1,
    "position": 1,
    "name": "Pet Supplies Dog's Day",
    "category": "Pet Shop",
    "address": "Av. Pedroso de Morais, 1053 - Pinheiros, São Paulo - SP, 05420-001",
    "phone": "+55 11 98944-2439",
    "website": "http://www.dogsday.com.br/",
    "rating": 4.6,
    "reviews": 601,
    "price": null,
    "opening_status": "Aberto · Fecha 20:00",
    "opening_hours": {
      "quarta-feira": "08:00–20:00",
      "quinta-feira": "08:00–20:00",
      "sexta-feira": "08:00–20:00",
      "sábado": "08:00–20:00",
      "domingo": "08:00–14:00",
      "segunda-feira": "08:00–20:00",
      "terça-feira": "08:00–20:00"
    },
    "maps_url": "https://www.google.com/maps?cid=5696581449059806607",
    "cid": "5696581449059806607",
    "scraped_at": "2026-10-21T19:40:00.000Z"
  },
  {
    "record_type": "summary",
    "query": "pet shop",
    "country": "br",
    "coordinates": "-23.5617, -46.6916",
    "radius_meters": null,
    "pages_fetched": 1,
    "places_found": 20,
    "places_returned": 20,
    "average_rating": 4.7,
    "reference_url": "https://www.google.com/maps/search/pet%20shop/@-23.5617,-46.6916,15z",
    "scraped_at": "2026-10-21T19:40:00.000Z"
  }
]
```

***

### Data Fields

| Field | Type | Description |
|-------|------|-------------|
| `record_type` | string | `place` for a place, `summary` for the totals. The summary row carries no place columns, so averaging `rating` needs no filtering |
| `query` | string | The search query |
| `country` | string | Market the search ran in |
| `coordinates` | string | The search point, as `latitude, longitude` |
| `page` | number | Results page the place came from |
| `position` | number | Rank of the place in Google's list, numbered in order across pages |
| `name` | string | Place name |
| `category` | string | Main category Google shows for the place |
| `address` | string | Full address |
| `phone` | string | Phone number in international format, when published |
| `website` | string | The place's own website, when published |
| `rating` | number | Average star rating (1 to 5), when the place has reviews |
| `reviews` | number | Number of reviews |
| `price` | string | Price level Google shows (for example `$$`), when any |
| `opening_status` | string | Whether the place is open at the time of the run, as Google words it |
| `opening_hours` | object | Hours for each weekday, keyed by the weekday name in the market's language. Google lists them starting from the current day where the place is |
| `maps_url` | string | Link that opens the place on Google Maps |
| `cid` | string | Google's stable place id. Use it to match the same place across runs |
| `radius_meters` | number | Radius used for the search. Summary row |
| `pages_fetched` | number | Pages the run requested. Summary row |
| `places_found` | number | Places found across the pages fetched, after removing repeats. Summary row |
| `places_returned` | number | Place rows pushed (limited by `maxResults`). Summary row |
| `average_rating` | number | Average rating of the place rows returned that have one. Summary row |
| `reference_url` | string | Google Maps URL of the search. Summary row |
| `scraped_at` | string | ISO 8601 timestamp (UTC) |

***

### Integrations

Use the **API** tab on the Actor page to get ready-to-use code examples in **Python**, **JavaScript**, and **cURL**, generated with the correct parameters for immediate integration.

***

### Example Searches

| Market | `query` | `coordinates` |
|--------|---------|---------------|
| Brazil | `pet shop` | `-23.5617, -46.6916` |
| United States | `coffee` | `40.7411, -73.9897` |
| Spain | `dentista` | `40.4168, -3.7038` |

***

### FAQ

<details>
<summary><strong>Why are coordinates required?</strong></summary>

Google Maps lists the places it draws on the map, and the map needs a centre. A place name in the query alone, such as "pet shop in Pinheiros", is not geocoded and returns nothing. Right-click the spot on Google Maps to copy its coordinates.

</details>

<details>
<summary><strong>Why did I get fewer places than maxResults?</strong></summary>

Google Maps serves 20 places per page. Places that repeat across pages are kept once, and when a page brings nothing new the run stops rather than paying for empty pages. A narrow radius or a rare business type can also have fewer places than you asked for.

</details>

<details>
<summary><strong>How many requests does a run make?</strong></summary>

One per page: `maxResults` of 1 to 20 is one request, 21 to 40 is two, and so on, up to 5 pages. The summary row says how many pages were fetched.

</details>

<details>
<summary><strong>Does the radius filter places strictly?</strong></summary>

No. The radius zooms the map around the point, and Google ranks the places it shows by relevance, so a few well-rated places just outside can still appear. Filter by `address` if you need a strict boundary.

</details>

<details>
<summary><strong>Why are some fields empty?</strong></summary>

Phone, website, rating and hours are only included when the business publishes them on Google. A place with no reviews has no rating.

</details>

***

### Support

1. **Check the FAQ** above for common questions
2. **Test with the prefilled example** to confirm expected output
3. **Contact support** through [Apify](https://apify.com) for additional assistance

# Actor input Schema

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

What to look for, as you would type it into Google Maps: a business type ("pet shop", "dentist") or a brand ("Starbucks").

## `coordinates` (type: `string`):

Latitude and longitude of the point to search around, as Google Maps copies them on right-click: "-23.5617, -46.6916". A Google Maps link that contains the point also works. The search point decides which places Google lists, so the place name in the query is not enough on its own.

## `radiusMeters` (type: `integer`):

Narrows the map around the search point (100 to 50,000). Leave it empty to use Google's default view, about a neighbourhood. Google still ranks the places by relevance, so a few may fall outside the radius.

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

Places to return (1-100). Google Maps serves 20 per page and every page is one request, so 50 places fetch 3 pages. The run stops early when Google has no more places around the point.

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

Google market to search from. It sets the language of categories, addresses and opening hours.

## Actor input object example

```json
{
  "query": "pet shop",
  "coordinates": "-23.5617, -46.6916",
  "maxResults": 20,
  "country": "br"
}
```

# Actor output Schema

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

One row per place found around the search point, with name, category, address, phone, website, rating, reviews, opening hours and a Google Maps link. One summary row carries the totals, the pages fetched and the average rating, and holds no place columns, so averaging rating over the dataset needs no filtering.

# 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": "pet shop",
    "coordinates": "-23.5617, -46.6916",
    "country": "br"
};

// Run the Actor and wait for it to finish
const run = await client.actor("yasmany.casanova/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": "pet shop",
    "coordinates": "-23.5617, -46.6916",
    "country": "br",
}

# Run the Actor and wait for it to finish
run = client.actor("yasmany.casanova/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": "pet shop",
  "coordinates": "-23.5617, -46.6916",
  "country": "br"
}' |
apify call yasmany.casanova/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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