# Google Maps Place Details Scraper (`seemuapps/google-maps-place-details-scraper`) Actor

Turn any Google Maps URL, short link or Place ID into a full business record — address, phone, website, email, hours, rating, photos, menu, attributes and reviews.

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

## Pricing

from $4.00 / 1,000 place results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Maps Place Details Scraper

Bulk-resolve Google Maps URLs, `maps.app.goo.gl` short links, `?cid=` links, or Place IDs (`ChIJ…`) into complete, structured business records — address, coordinates, phone, website, email, opening hours, rating and review count, price level, categories, photos, menu, amenities, and optional reviews. Ideal for enriching CRM lists, spreadsheets, or datasets that already contain Google Maps links or IDs.

### What you get

- **Identifiers**: `placeId`, `googlePlaceId` (ChIJ…), `kgId`, canonical `googleMapsUrl`, and the original `inputUrl`
- **Location**: `address` plus `street` / `city` / `postalCode` / `state` / `countryCode` / `neighborhood`, `latitude` / `longitude`, `plusCode`, `timezone`
- **Contact**: `phone`, `phoneUnformatted`, `website`, `menuUrl`, `email` (optionally extracted from the website), `socialLinks`, `bookingLinks`
- **Business**: `name`, `subtitle`, `description`, `categories`, `primaryType`, `rating`, `reviewCount`, `priceLevel`, `businessStatus`, `hotelStars`
- **Hours**: `openNow`, `openStatusText`, weekly `openingHours`
- **Rich content**: `about` attributes, `menu` sections/items/prices, up to 20 `photos`, optional `reviews[]`
- Export to JSON, CSV, Excel, or Google Sheets

### Use cases

- **CRM / spreadsheet enrichment** — you have Maps links or Place IDs; get phone, website, hours, rating in one run
- **Data pipelines** — resolve Place IDs from the Places API or other sources into full records without per-field API costs
- **Monitoring** — re-scrape a fixed list of locations on a schedule to track rating, review count, hours, and closures
- **Directory & travel apps** — populate listing pages with photos, hours, menus, and attributes
- **Link resolution** — expand short `maps.app.goo.gl` links into place IDs and canonical URLs

### How to use

1. Paste your **Place URLs or IDs**, one per line (any mix of full URLs, short links, `?cid=` links, `ChIJ…` or `0x…:0x…` IDs). Hundreds at once is fine.
2. Optionally set **Max reviews per place** and enable **Extract emails from websites**.
3. Run — one row per input place appears in the **Dataset** tab.

### Output format

```json
{
  "placeId": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
  "googlePlaceId": "ChIJCar0f49ZwokR6ozLV-dHNTE",
  "googleMapsUrl": "https://maps.google.com/?cid=3545819340560108778",
  "name": "Katz's Delicatessen",
  "address": "205 E Houston St, New York, NY 10002",
  "street": "205 E Houston St",
  "city": "New York",
  "postalCode": "10002",
  "state": "New York",
  "countryCode": "US",
  "latitude": 40.722233,
  "longitude": -73.987429,
  "rating": 4.5,
  "reviewCount": 54692,
  "categories": ["Deli", "American restaurant", "Jewish restaurant"],
  "website": "https://katzsdelicatessen.com/",
  "phone": "(212) 254-2246",
  "phoneUnformatted": "+12122542246",
  "priceLevel": "$30–40",
  "businessStatus": "OPERATIONAL",
  "openNow": true,
  "openStatusText": "Open · Closes 11 PM",
  "openingHours": { "periods": [{ "day": "Monday", "hours": "8 AM–11 PM" }], "weekdayText": ["Monday: 8 AM–11 PM"], "openNow": true, "nextOpening": "Closes 11 PM" },
  "about": [{ "group": "Service options", "attributes": [{ "label": "Delivery", "present": true }] }],
  "menu": [{ "category": "Soup & Salad", "items": [{ "name": "Matzo Ball Soup", "description": "", "price": "$9.45" }] }],
  "photos": ["https://lh3.googleusercontent.com/gps-cs-s/…=w1920-h1080-k-no"],
  "reviews": [],
  "reviewsFetched": 0,
  "inputUrl": "https://maps.google.com/?cid=3545819340560108778",
  "scrapedAt": "2026-08-16T06:45:00.000Z"
}
```

### Pricing

Pay per place record saved to the dataset, plus a small per-review fee if you enable reviews. Inputs that don't resolve are not charged.

### FAQ

**Which link formats work?** Full `google.com/maps/place/...` URLs, `maps.app.goo.gl/...` short links, `maps.google.com/?cid=...` links, Google Place IDs starting with `ChIJ`, hex IDs like `0x89c2598f7ff4aa09:0x313547e757cb8cea`, and bare CID numbers.

**Do I need a Google API key?** No.

**How fast is it?** Roughly 1–2 seconds per place with parallel workers; a 500-URL list finishes in about 10 minutes.

# Actor input Schema

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

One place per line. Accepts full Google Maps place URLs, maps.app.goo.gl short links, ?cid= links, Google Place IDs (ChIJ…), or hex IDs (0x…:0x…). Bulk-paste hundreds at once.

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

How many reviews to attach to each place record (newest first). 0 = skip reviews (fastest).

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

When a place lists a website but Google Maps has no email, visit the website and extract a contact email address.

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

Language code for results, e.g. en, de, fr, es, pt-BR.

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

Two-letter country code used for localization, e.g. us, gb, de, au.

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

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

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea",
    "ChIJ4yNdwPBYwokRqc1lCC4n89w"
  ],
  "maxReviewsPerPlace": 0,
  "extractEmails": false,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

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

# 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 = {
    "placeUrls": [
        "https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea",
        "ChIJ4yNdwPBYwokRqc1lCC4n89w"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("seemuapps/google-maps-place-details-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 = {
    "placeUrls": [
        "https://www.google.com/maps/place/Katz's+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea",
        "ChIJ4yNdwPBYwokRqc1lCC4n89w",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("seemuapps/google-maps-place-details-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 '{
  "placeUrls": [
    "https://www.google.com/maps/place/Katz'\''s+Delicatessen/@40.7223,-73.9874,17z/data=!4m6!3m5!1s0x89c2598f7ff4aa09:0x313547e757cb8cea",
    "ChIJ4yNdwPBYwokRqc1lCC4n89w"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call seemuapps/google-maps-place-details-scraper --silent --output-dataset

```

## MCP server setup

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