# Google Maps Shared List Scraper (`maximedupre/google-maps-shared-list-scraper`) Actor

Export places from public Google Maps shared lists. Get names, notes, addresses, coordinates, phones, websites, ratings, reviews, hours, photos, source-list context, and scrape timestamps.

- **URL**: https://apify.com/maximedupre/google-maps-shared-list-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $11.70 / 1,000 scraped 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 shared list scraper

Google Maps Shared List Scraper exports saved places from public [Google Maps](https://www.google.com/maps) shared lists. Paste one or more shared list links, and the Actor returns one dataset row per place with names, notes, addresses, coordinates, phone numbers, websites, ratings, review counts, recent reviews, weekly hours, photos, source-list context, Google Maps URLs, and scrape timestamps.

Use this Google Maps shared list scraper when a curated Maps list is useful, but clicking every saved place by hand is not. It is built for travel planning, venue research, local lead lists, neighborhood guides, restaurant shortlists, field sales prep, CRM enrichment, and repeatable exports from lists shared by teammates, clients, creators, or your own Google account.

For a small first run, keep the prefilled Tokyo shared list and set **Total places** to `10` or `25`. Once the row shape matches your workflow, add more list URLs, raise the limits, schedule repeat runs, or call the Actor through the Apify API.

### ✅ What this Actor does

- Accepts public Google Maps shared list URLs and short `maps.app.goo.gl` shared-list links.
- Saves one dataset row per place found in the list.
- Keeps the original shared list URL, list ID, list name, source order, saved-by name, and saved timestamp when Google exposes them.
- Enriches places with contact details, ratings, review counts, recent individual reviews, weekly opening hours, photos, category data, and Google Maps identifiers when available.
- Optionally visits each discovered business website to add public contact emails.
- Supports Apify dataset exports, API access, schedules, webhooks, and integrations.
- Skips unsupported or empty list links without creating fake output rows.
- Charges only for exported place rows.

This Actor focuses on public Google Maps shared lists. It does not scrape private lists that require login, edit list memberships, create Google reviews, or enrich places from external business databases.

### 📦 What data you get

Each dataset item represents one saved place from one shared list. Fields can include:

- `name`, `note`, `address`, `shortAddress`, `city`, `state`, `postalCode`, and `countryCode`
- `latitude`, `longitude`, `plusCode`, and `timezone`
- `category` and `categories`
- `rating`, `reviewCount`, and `reviews`
- `phone`, `formattedPhone`, `website`, `websiteDomain`, and optional `emails`
- `currentStatus`, `isOpen`, and `businessHours`
- `description`, `heroPhotoUrl`, and `photos`
- `googleMapsUrl`, `placeId`, `placeIdChIJ`, `googleMapsFeatureId`, and `cid`
- `listId`, `sourceListName`, `sourceListUrl`, `sourceIndex`, `savedByName`, and `savedAt`
- `scrapedAt`

Google Maps does not show every field for every place. For example, some saved places may have no website, phone number, reviews, photos, or full weekly hours. The Actor returns the fields that are publicly available for each place.

### 🎯 Common use cases

- Export a restaurant, cafe, hotel, or venue shortlist from Google Maps.
- Turn a client or team shared list into a spreadsheet.
- Build local prospecting lists with addresses, websites, phones, and coordinates.
- Compare saved locations by rating, review count, category, or open hours.
- Preserve source-list order and notes for travel planning or editorial guides.
- Add public website emails to a Google Maps lead list when businesses publish them.
- Schedule repeat exports and send place rows to a CRM, sheet, database, or webhook.

### ▶️ How to run it

1. Open the Actor in Apify Console.
2. Paste one or more public Google Maps shared list URLs into **Shared list URLs**.
3. Set **Places per list** and, if needed, **Total places** to keep the run bounded.
4. Turn on **Website emails** only if you want the Actor to visit each place website for public contact emails.
5. Start the run and open the dataset.

You can export the dataset as JSON, CSV, Excel, XML, RSS, or HTML. You can also consume results through the Apify API, schedule recurring runs, or connect the Actor to webhooks and integrations.

### ⚙️ Input

```json
{
	"listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"],
	"maxPlacesPerList": 25,
	"maxResults": 25,
	"includeWebsiteEmails": false,
	"maxEmailsPerPlace": 3
}
````

#### Shared list URLs

Add public Google Maps shared list links, one per line. Both short `maps.app.goo.gl` links and full `google.com/maps` shared-list URLs are supported when they point to a public list.

#### Limits

Use **Places per list** to cap how many places are exported from each list. Use **Total places** when you want one cap across all submitted lists.

#### Website emails

When **Website emails** is enabled, the Actor visits business websites discovered from Google Maps and adds public contact emails when found. This can make runs slower because it adds website crawling after place enrichment.

### 🧪 Output example

```json
{
	"name": "Tamai Nihonbashi Main Branch",
	"address": "2 Chome-9-9 Nihonbashi, Chuo City, Tokyo 103-0027, Japan",
	"latitude": 35.6812297,
	"longitude": 139.7746943,
	"category": "Anago restaurant",
	"rating": 4.5,
	"reviewCount": 199,
	"phone": "+81 3-3272-3227",
	"website": "http://anago-tamai.com/",
	"businessHours": [
		{
			"day": "Sunday",
			"hours": ["11:00 AM-3:30 PM", "5:00 PM-9:00 PM"]
		}
	],
	"photos": [
		"https://lh3.googleusercontent.com/gps-cs-s/example=w1200-h800"
	],
	"googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=35.6812297,139.7746943",
	"placeIdChIJ": "ChIJDyNll1eJGGARSoyno4Tk-QI",
	"listId": "example-list-id",
	"sourceListUrl": "https://maps.app.goo.gl/MMjvFNWpUTjiupHc9",
	"sourceIndex": 1,
	"scrapedAt": "2026-06-03T00:00:00.000Z"
}
```

The example is shortened for readability. The full output schema lists every field the Actor can emit.

### 💳 Pricing

This Actor uses pay-per-event pricing. You are charged per exported place row. Unsupported list links, empty lists, and skipped inputs do not create chargeable dataset rows.

Optional website email enrichment does not change the charged unit; it can only increase runtime because the Actor may need to visit the discovered business websites.

### ⚠️ Limits and caveats

- The list must be public or otherwise accessible without your Google login.
- Google Maps may not expose every field for every place.
- Recent review rows are returned when publicly available; the Actor does not promise custom review sorting.
- Photos are capped to keep output practical for exports.
- Website emails are found only when a place has a public website and that website publishes contact emails in crawlable pages.
- Private notes, private list access, Google account data, and logged-in Google Maps surfaces are outside this Actor's scope.

### ❓ FAQ

#### Can I scrape a private Google Maps list?

No. This Actor is built for public shared lists that can be opened without user-provided Google credentials.

#### Do I need a Google Maps API key?

No. You only need the public shared list URL. The Actor handles the scrape and writes the results to an Apify dataset.

#### Can it export emails from Google Maps?

Google Maps usually does not publish email addresses directly. If **Website emails** is enabled, the Actor visits the business website shown on Google Maps and returns public emails found there.

#### Why are some fields empty?

Field availability depends on what Google Maps and each business website show publicly. A place can be valid even when it has no phone number, website, reviews, photos, or full weekly hours.

### 📝 Changelog

- 0.0: Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~google-maps-shared-list-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Other actors

- [Business Address Scraper ↗](https://apify.com/maximedupre/business-address-scraper) - find public business addresses from company websites.
- [Website Emails Scraper ↗](https://apify.com/maximedupre/website-emails-scraper) - extract public contact emails from websites.
- [Website URL Crawler ↗](https://apify.com/maximedupre/website-url-crawler) - crawl rendered websites and export discovered links.
- [Map Your Show Exhibitor Scraper ↗](https://apify.com/maximedupre/map-your-show-exhibitor-scraper) - export exhibitor companies, booths, websites, and contact data.
- [TikTok Place Posts Scraper ↗](https://apify.com/maximedupre/tiktok-place-posts-scraper) - collect public TikTok posts from place feeds.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `listUrls` (type: `array`):

Paste public Google Maps shared list URLs, one per line. Short maps.app.goo.gl links and full google.com/maps shared-list links are supported when they open a public list.

## `maxPlacesPerList` (type: `integer`):

Limit how many saved places are exported from each submitted shared list. Use a small value for a preview run.

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

Optional cap across all submitted lists. Leave empty to use only the per-list limit.

## `includeWebsiteEmails` (type: `boolean`):

Visit each discovered business website and add public contact emails when found. Keep this off for the fastest Google Maps list export.

## `maxEmailsPerPlace` (type: `integer`):

Limit how many public emails are returned from each business website when website email enrichment is enabled.

## Actor input object example

```json
{
  "listUrls": [
    "https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"
  ],
  "maxPlacesPerList": 100,
  "includeWebsiteEmails": false,
  "maxEmailsPerPlace": 3
}
```

# Actor output Schema

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

Dataset of saved Google Maps places exported from the submitted shared lists.

# 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 = {
    "listUrls": [
        "https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/google-maps-shared-list-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 = { "listUrls": ["https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"] }

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/google-maps-shared-list-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "listUrls": [
    "https://maps.app.goo.gl/MMjvFNWpUTjiupHc9"
  ]
}' |
apify call maximedupre/google-maps-shared-list-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=maximedupre/google-maps-shared-list-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Shared List Scraper",
        "description": "Export places from public Google Maps shared lists. Get names, notes, addresses, coordinates, phones, websites, ratings, reviews, hours, photos, source-list context, and scrape timestamps.",
        "version": "0.0",
        "x-build-id": "XNOIYNUJPfRHQQ8zh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/maximedupre~google-maps-shared-list-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-maximedupre-google-maps-shared-list-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/maximedupre~google-maps-shared-list-scraper/runs": {
            "post": {
                "operationId": "runs-sync-maximedupre-google-maps-shared-list-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/maximedupre~google-maps-shared-list-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-maximedupre-google-maps-shared-list-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "listUrls"
                ],
                "properties": {
                    "listUrls": {
                        "title": "Shared list URLs",
                        "minItems": 1,
                        "type": "array",
                        "description": "Paste public Google Maps shared list URLs, one per line. Short maps.app.goo.gl links and full google.com/maps shared-list links are supported when they open a public list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPlacesPerList": {
                        "title": "Places per list",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Limit how many saved places are exported from each submitted shared list. Use a small value for a preview run.",
                        "default": 100
                    },
                    "maxResults": {
                        "title": "Total places",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Optional cap across all submitted lists. Leave empty to use only the per-list limit."
                    },
                    "includeWebsiteEmails": {
                        "title": "Website emails",
                        "type": "boolean",
                        "description": "Visit each discovered business website and add public contact emails when found. Keep this off for the fastest Google Maps list export.",
                        "default": false
                    },
                    "maxEmailsPerPlace": {
                        "title": "Emails per place",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Limit how many public emails are returned from each business website when website email enrichment is enabled.",
                        "default": 3
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
