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

Extract detailed place information from Google Maps: name, address, coordinates, rating, review count, categories, phone, website, description, and timezone. Find places by URL, Place ID, or built-in search. Export as CSV, JSON, or Excel.

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

## Pricing

$2.00 / 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.

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 Place Details Scraper -- Extract Business Data, Coordinates & Contact Info

Scrape detailed place information from Google Maps at scale -- an alternative to the Google Places API with no API key, no billing setup, and no per-request quotas. Extract name, address, GPS coordinates, rating, review count, phone, website, opening hours, price level, timezone, categories, and place attributes for any Google Maps listing. Find places by URL, Place ID, or built-in search, and export your data as JSON, CSV, Excel, XML, or HTML. Use the data for lead generation, competitive analysis, location intelligence, or CRM enrichment.

- [Why use this Google Maps place details scraper?](#why-use-this-google-maps-place-details-scraper)
- [What data can you extract from Google Maps places?](#what-data-can-you-extract-from-google-maps-places)
- [How to scrape Google Maps place details](#how-to-scrape-google-maps-place-details)
- [Input parameters](#input-parameters)
- [Output example](#output-example)
- [How much does it cost to scrape Google Maps place details?](#how-much-does-it-cost-to-scrape-google-maps-place-details)
- [Use cases for Google Maps place data](#use-cases-for-google-maps-place-data)
- [Integrations and API access](#integrations-and-api-access)
- [Frequently asked questions](#frequently-asked-questions)

### Why use this Google Maps place details scraper?

- 📍 **GPS coordinates for every place** -- every result includes latitude and longitude, ready for geo-mapping, distance calculations, or spatial analysis. No need to geocode addresses separately.
- 🕐 **Timezone data in IANA format** -- each place includes its IANA timezone (e.g. `America/New_York`, `Europe/Berlin`), so you can localize opening hours, schedule calls across time zones, or enrich CRM records with timezone context.
- 🔍 **Built-in place search** -- find places by search query and location (e.g. "dentist" in "Austin, TX") without needing URLs first. All combinations of queries and locations are searched automatically, with search rank metadata included in the output.
- 🔗 **Bulk multi-format input** -- scrape details for dozens or hundreds of places in a single run. Provide Google Maps URLs, share links (`maps.app.goo.gl/...`), Place IDs, or Feature IDs -- mix and match input types freely.
- ⚡ **No API key, no billing setup** -- the Google Places API requires a GCP project, API key, and billing account. This scraper needs none of that. Just add your inputs and click Start.
- 💰 **Predictable flat-rate pricing** -- the Google Places API charges $17-35 per 1,000 requests depending on which fields you need (Basic, Contact, or Atmosphere). This scraper returns all fields at one flat rate with no hidden per-field surcharges.
- 🏷️ **Rich place attributes** -- extract structured "About" data including accessibility features, amenities, dining options, and service attributes (e.g. "Wheelchair accessible entrance," "Free Wi-Fi," "Outdoor seating").
- 🕑 **Opening hours with machine-readable periods** -- get both human-readable day/hours and structured open/close time periods for programmatic analysis.
- 🌐 **Language and country localization** -- set the language code (e.g. `de`, `es`, `ja`) and country code to get localized place names, descriptions, and categories.
- 🛡️ **Automatic deduplication** -- businesses found through multiple search queries or inputs are included only once in the output, so you never pay for or process duplicate records.
- 💾 **Export as JSON, CSV, Excel, XML, or HTML** -- download your Google Maps place data in whichever format your workflow requires. All five formats are available out of the box on the Apify platform.

### What data can you extract from Google Maps places?

Google Maps Place Details Scraper extracts a comprehensive set of fields for every place. Here is the complete list of fields in each output item:

**Place identity and location:**

- **name** -- name of the Google Maps place (e.g. "Joe's Pizza Broadway")
- **address** -- full address of the place (e.g. "1435 Broadway, New York, NY 10018")
- **featureId** -- Google Maps internal feature ID (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`)
- **placeId** -- Google Place ID (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`)
- **lat** -- geographic latitude (e.g. `40.754679`)
- **lon** -- geographic longitude (e.g. `-73.987029`)
- **timezone** -- IANA timezone of the place (e.g. `America/New_York`)

**Ratings and reviews:**

- **rating** -- overall average rating (e.g. `4.4`)
- **reviewCount** -- total number of reviews (e.g. `22117`)

**Classification and pricing:**

- **categories** -- place categories (e.g. `["Pizza restaurant", "Italian restaurant"]`)
- **priceLevel** -- price level indicator (e.g. `$$`)

**Contact information:**

- **phone** -- phone number (e.g. `+1 646-559-4878`)
- **website** -- website URL

**Description and hours:**

- **description** -- short editorial description from Google Maps (e.g. "No-frills, counter-serve pizzeria serving classic NYC slices.")
- **openingHours** -- weekly opening hours with day names, human-readable hour strings, and machine-readable open/close time periods

**Place attributes:**

- **about** -- structured attribute flags grouped by category (e.g. Accessibility, Amenities, Dining options). Each attribute includes a name and whether it is enabled or disabled for the place.

**Search context (when found via search):**

- **_search.query** -- the search query that returned this place
- **_search.location** -- the location that was searched
- **_search.rank** -- position in search results for that query and location (1-indexed)

### How to scrape Google Maps place details

Getting started with Google Maps place scraping takes less than two minutes. Follow these five steps to extract your first batch of place data:

**Step 1: Create a free Apify account**

Sign up at [apify.com](https://apify.com) if you do not have an account yet. Every new account includes $5 in free credits -- enough to scrape thousands of Google Maps places at no cost.

**Step 2: Open the Google Maps Place Details Scraper**

Navigate to the [Google Maps Place Details Scraper](https://apify.com/beatanalytics/google-maps-place-details-scraper) actor page on the Apify Store and click "Try for free" to open the actor in your Apify Console.

**Step 3: Add your places or search queries**

You have three ways to specify which places to scrape:

- **Place URLs** -- paste Google Maps URLs like `https://www.google.com/maps/place/Joe's+Pizza+Broadway/...` or share links like `https://maps.app.goo.gl/...`
- **Place IDs** -- enter Google Place IDs (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`) or Feature IDs (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`)
- **Search** -- enter search queries (e.g. "pizza", "hotels") and locations (e.g. "New York, NY"). The scraper searches all combinations of queries and locations and finds matching places automatically.

You can combine all three methods in a single run.

**Step 4: Configure optional settings**

Optionally, adjust these settings:

- Set the **language** for localized place names and descriptions (e.g. `de` for German, `es` for Spanish)
- Set the **country** to control which Google region is used for results
- Set **max places per search** to control how many places are returned per search combination

**Step 5: Click Start and download your data**

Click the "Start" button to begin scraping. Once the run completes, download your Google Maps place data in any format: **JSON, CSV, Excel, XML, or HTML**. You can also access the data programmatically via the Apify API, or set up automatic exports to Google Sheets, Dropbox, Amazon S3, and other destinations.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `placeUrls` | Array of URLs | No* | -- | Google Maps place URLs or share links to scrape details for. Supports full URLs (`google.com/maps/place/...`) and share links (`maps.app.goo.gl/...`). |
| `placeIds` | Array of strings | No* | -- | Google Place IDs (`ChIJ...`) or Feature IDs (`0x...:0x...`). Can be used instead of or in addition to Place URLs. |
| `searchQueries` | Array of strings | No* | -- | Search terms to find places (e.g. `"pizza"`, `"hotels"`, `"dentist"`). Used together with `searchLocations` -- all combinations are searched. |
| `searchLocations` | Array of strings | No | -- | Locations to search in (e.g. `"New York, NY"`, `"London, UK"`). Used together with `searchQueries` -- all combinations are searched. |
| `maxPlacesPerSearch` | Integer | No | `20` | Maximum number of places to find per search query + location combination. Each page returns up to 20 results. |
| `language` | String | No | `en` | Language code for place details (e.g. `en`, `de`, `es`). Affects place name, description, and categories. |
| `country` | String | No | `us` | Country code (e.g. `us`, `de`, `gb`). Affects which Google region is used for results. |

*At least one of `placeUrls`, `placeIds`, or `searchQueries` (with `searchLocations`) must be provided.

**Search example:** Setting `searchQueries` to `["pizza", "sushi"]` and `searchLocations` to `["New York, NY", "Chicago, IL"]` runs four searches. With `maxPlacesPerSearch` at 20, this finds up to 80 places and returns full details for each one.

### Output example

Each item in the dataset represents a single place. Results are stored in an Apify dataset and can be exported as **JSON, CSV, Excel, XML, or HTML** directly from the Apify Console, or accessed programmatically via the Apify API.

```json
{
  "name": "Joe's Pizza Broadway",
  "address": "1435 Broadway, New York, NY 10018",
  "featureId": "0x89c259ab3c1ef289:0x3b67a41175949f55",
  "placeId": "ChIJifIePKtZwokRVZ-UdRGkZzs",
  "lat": 40.754679,
  "lon": -73.987029,
  "rating": 4.4,
  "reviewCount": 22117,
  "categories": ["Pizza restaurant", "Italian restaurant"],
  "phone": "+1 646-559-4878",
  "website": "https://www.joespizzanyc.com",
  "description": "No-frills, counter-serve pizzeria serving classic NYC slices.",
  "timezone": "America/New_York",
  "priceLevel": "$$",
  "openingHours": [
    {
      "day": "Wednesday",
      "hours": ["9 AM–2 AM"],
      "periods": [{"open": "09:00", "close": "02:00"}]
    },
    {
      "day": "Thursday",
      "hours": ["9 AM–2 AM"],
      "periods": [{"open": "09:00", "close": "02:00"}]
    }
  ],
  "about": [
    {
      "name": "Accessibility",
      "options": [
        {"name": "Wheelchair accessible entrance", "enabled": true},
        {"name": "Wheelchair accessible seating", "enabled": true}
      ]
    },
    {
      "name": "Dining options",
      "options": [
        {"name": "Lunch", "enabled": true},
        {"name": "Dinner", "enabled": true},
        {"name": "Dessert", "enabled": true}
      ]
    }
  ],
  "_search": {
    "query": "pizza",
    "location": "New York, NY",
    "rank": 1
  }
}
````

The `_search` field is only present when the place was found via search. When a place is looked up directly by URL or Place ID, this field is `null`.

### How much does it cost to scrape Google Maps place details?

Google Maps Place Details Scraper uses simple, transparent per-result pricing -- you only pay for the places you get.

**$2.00 per 1,000 places** -- each place returned counts as one result. If you scrape 200 places, you pay for 200 results. No hidden compute fees, no per-field surcharges, no per-run charges.

**Compared to the Google Places API:** The official Google Places API charges $17 per 1,000 requests for Basic fields (name, address, rating), $20 for Contact fields (phone, website), and $25-35 for Atmosphere fields (reviews, opening hours). Getting all fields requires multiple API calls per place, quickly adding up. This scraper returns every field in a single flat-rate result.

**Free trial:** Every new Apify account comes with **$5 in free platform credits** -- no credit card required. That is enough to scrape 2,500 Google Maps places at no cost, so you can fully evaluate the scraper and data quality before committing.

**Enterprise plans:** If you need to scrape Google Maps place data at very high volume -- tens of thousands of places on a regular basis -- reach out to <sales@beatanalytics.org> for custom Enterprise pricing with dedicated support and volume discounts.

### Use cases for Google Maps place data

Google Maps place data powers a wide range of business, research, and operational workflows. Here are the most common use cases:

**Lead generation and sales prospecting**

Search for businesses by category and location to build targeted prospect lists. Extract phone numbers, website URLs, and addresses for outreach. Use ratings, review counts, and categories to qualify leads and prioritize high-value prospects. The built-in search with rank metadata lets you focus on the most prominent businesses in each market.

**Competitive analysis and benchmarking**

Scrape details for your competitors and compare ratings, review counts, price levels, categories, and attributes side by side. Track how competitor ratings and review volumes change over time by scheduling regular scraping runs. Identify which amenities or services (outdoor seating, delivery, Wi-Fi) competitors offer and you do not.

**Location intelligence and site selection**

Use GPS coordinates, timezone data, and place density to evaluate potential locations for new stores, offices, or franchises. Map all businesses in a category across a city or region. Analyze the competitive landscape by neighborhood. Combine with the Google Maps Reviews Scraper to add sentiment data to your location analysis.

**CRM and data enrichment**

Enrich existing customer or prospect records with up-to-date Google Maps data. Add phone numbers, website URLs, opening hours, timezone, coordinates, and categories to your CRM. Use Place IDs or URLs from your database as input and get structured, normalized data back.

**Store locator and directory building**

Build comprehensive business directories or store locators from Google Maps data. Search for all businesses in specific categories and locations to populate your directory. The structured output (coordinates, hours, phone, categories) maps directly to common directory schemas.

**Market research and trend analysis**

Map the competitive landscape for an industry across multiple cities. Analyze business density, category distribution, price levels, and average ratings by market. Use the search rank metadata to understand which businesses dominate local search results. Schedule regular runs to track market changes over time.

**Academic and urban research**

Study patterns in business distribution, ratings, and categories across cities and regions. Use GPS coordinates and timezone data for spatial analysis. Research urban development, gentrification, or economic activity using business density and category mix as proxies.

**Geo-mapping and visualization**

Every result includes latitude and longitude, ready for direct import into mapping tools like Google Earth, Mapbox, Leaflet, QGIS, or Tableau. Build heat maps of business density, plot competitor locations, or create customer-facing store maps.

### Integrations and API access

Google Maps Place Details Scraper integrates with the Apify platform ecosystem, giving you programmatic access to your scraped data and the ability to connect it to thousands of external tools.

#### Python

Use the [Apify Python SDK](https://docs.apify.com/sdk/python/) to run the scraper and retrieve results programmatically:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run_input = {
    "searchQueries": ["dentist"],
    "searchLocations": ["Austin, TX"],
    "maxPlacesPerSearch": 40,
    "language": "en",
}

run = client.actor("beatanalytics/google-maps-place-details-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} - {item['rating']}* - {item['address']}")
```

#### JavaScript / Node.js

Use the [Apify JavaScript SDK](https://docs.apify.com/sdk/js/) to integrate Google Maps place scraping into your Node.js applications:

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: "YOUR_API_TOKEN" });

const run = await client.actor("beatanalytics/google-maps-place-details-scraper").call({
    placeUrls: [
        { url: "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8" },
    ],
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.log(`${item.name} - ${item.rating}* - ${item.phone} - ${item.timezone}`);
});
```

#### No-code integrations

Connect Google Maps Place Details Scraper to thousands of apps without writing code:

- **Make (formerly Integromat)** -- trigger workflows when new Google Maps data is scraped, or schedule regular runs as part of larger automations
- **Zapier** -- connect Google Maps place data to Google Sheets, Slack, email, CRM tools, and 5,000+ other apps
- **Webhooks** -- receive HTTP notifications when a scraping run completes, then process the data in your own backend
- **Google Sheets** -- export results directly to a Google Sheets spreadsheet for collaborative analysis
- **Amazon S3 / Dropbox** -- automatically save scraped data to cloud storage after each run

#### Scheduled runs

Set up Google Maps Place Details Scraper to run on a schedule (hourly, daily, weekly, or custom cron) to keep your data fresh. This is particularly useful for monitoring competitor listings, tracking new business openings, keeping CRM data current, and refreshing store locator databases.

#### API endpoints

Every scraper run on Apify exposes RESTful API endpoints for accessing results, checking run status, and managing datasets. See the [Apify API documentation](https://docs.apify.com/api/v2) for the complete reference.

### Frequently asked questions

#### How to get Google Maps place details without the API?

Google Maps Place Details Scraper is the easiest way to extract place information from Google Maps without the Google Places API. Open the actor on Apify, add your place URLs, Place IDs, or search queries, and click Start. The scraper handles all data extraction automatically and returns structured results in JSON, CSV, or any other supported format. No API key, no GCP project, no billing setup. See [How to scrape Google Maps place details](#how-to-scrape-google-maps-place-details) for a step-by-step guide.

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

Web scraping of publicly available data is generally legal in the United States, as affirmed by the 2022 US Ninth Circuit ruling in *hiQ Labs v. LinkedIn*, which established that scraping publicly accessible data does not violate the Computer Fraud and Abuse Act. Google Maps place information is publicly visible without requiring a login or account.

That said, you should always review Google's Terms of Service and consult with legal counsel if you have concerns about your specific use case. The legality of web scraping can vary by jurisdiction and intended use. Apify provides the scraping infrastructure, but users are responsible for ensuring their use of scraped data complies with applicable laws and terms of service.

#### How is this different from the Google Places API?

The Google Places API is Google's official developer API for place data. While it provides structured access to place information, it has several practical limitations that this scraper addresses:

- **Authentication and billing:** The Places API requires a GCP project, API key, and billing account with a credit card on file. This scraper requires none of that.
- **Per-field pricing tiers:** The Places API charges different rates for Basic ($17/1K), Contact ($20/1K), and Atmosphere ($25-35/1K) fields. Getting all fields requires multiple API calls per place. This scraper returns every field at one flat rate.
- **Rate limits and quotas:** The Places API enforces per-second rate limits and daily quotas. This scraper has no such limits.
- **Search limitations:** The Places API Nearby Search and Text Search have their own pricing and pagination complexity. This scraper includes built-in search with simple pagination at no extra cost.

#### How many places can I scrape?

There is no hard limit on the number of places you can scrape in a single run. You can add as many Google Maps URLs, Place IDs, or Feature IDs as you need, and the scraper processes them concurrently. When using search, set `maxPlacesPerSearch` to control how many places are found per search combination. Typical runs scraping hundreds of places complete in minutes.

#### Can I search for places and get their details in one run?

Yes. Enter search queries (e.g. "coffee shop", "gym") and locations (e.g. "San Francisco, CA", "London, UK") in the input. The scraper searches all combinations of queries and locations, finds matching places, and fetches full details for each one -- all in a single run. Each result includes `_search` metadata with the query, location, and rank position, so you know exactly how each place was found. Use `maxPlacesPerSearch` to control how many places are returned per search combination.

#### What is the difference between Place IDs and Feature IDs?

Google Maps uses two types of identifiers for places:

- **Place ID** -- a stable identifier that starts with `ChIJ` (e.g. `ChIJifIePKtZwokRVZ-UdRGkZzs`). This is the identifier used in the Google Places API and is the most commonly referenced ID format.
- **Feature ID** -- an internal Google Maps identifier in the format `0x...:0x...` (e.g. `0x89c259ab3c1ef289:0x3b67a41175949f55`). This can be found in Google Maps URLs.

The scraper accepts both formats. If you provide a Place ID, a Google Maps URL, or a share link, it is automatically resolved to the correct place.

#### What export formats are supported?

The scraper outputs data to an Apify dataset. From the Apify Console, you can export the results as **JSON, CSV, Excel (XLSX), XML, or HTML** with a single click. The data is also accessible via the Apify API for programmatic access in any format. All fields flatten cleanly to tabular formats like CSV and Excel.

#### How often is the data updated?

The scraper fetches live data from Google Maps every time it runs. There is no caching or stale data -- each run makes fresh requests and returns the most current place information available at that moment. To keep your data fresh, schedule the scraper to run on a recurring basis (hourly, daily, weekly) using Apify's built-in scheduling feature.

#### Can I get place details in different languages?

Yes. Set the `language` parameter to any language code (e.g. `de` for German, `es` for Spanish, `ja` for Japanese). This affects the place name, description, and categories returned by the scraper. You can also set the `country` parameter to control which Google region is used for results.

#### What is the difference between the Place Details Scraper and the Reviews Scraper?

These are two complementary Apify actors:

- **Google Maps Place Details Scraper** (this actor) extracts place information: name, address, coordinates, rating, review count, phone, website, opening hours, categories, price level, timezone, and attributes. It also supports search, so you can discover places by query and location.
- **[Google Maps Reviews Scraper](https://apify.com/beatanalytics/google-maps-reviews-scraper)** extracts individual reviews for specific places: full review text, exact ISO 8601 timestamps, star ratings, reviewer info, photos, and business owner responses. It supports date-range filtering with efficient newest-first pagination.

Use both together for a complete picture: scrape place details with this actor to identify places of interest, then pass those place URLs to the Reviews Scraper to extract all their reviews for sentiment analysis or reputation monitoring.

#### How much does it cost to scrape Google Maps places?

Google Maps Place Details Scraper costs **$2.00 per 1,000 places** scraped. Every new Apify account includes $5 in free credits -- enough to scrape 2,500 places at no cost. Contact <sales@beatanalytics.org> for Enterprise pricing on large-scale operations. See [How much does it cost to scrape Google Maps place details?](#how-much-does-it-cost-to-scrape-google-maps-place-details) for more details.

# Actor input Schema

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

Google Maps place URLs or share links to scrape details for. Supports full URLs (google.com/maps/place/...) and share links (maps.app.goo.gl/...).

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

Google Place IDs (ChIJ...) or Feature IDs (0x...:0x...) to scrape details for. Can be used instead of or in addition to Place URLs.

## `searchQueries` (type: `array`):

Search terms to find places on Google Maps (e.g. "pizza", "hotels", "dentist"). Used together with Search locations — all combinations of queries and locations are searched.

## `searchLocations` (type: `array`):

Locations to search in (e.g. "New York, NY", "London, UK"). Used together with Search queries — all combinations of queries and locations are searched.

## `maxPlacesPerSearch` (type: `integer`):

Maximum number of places to find per search query + location combination. Each page returns up to 20 results.

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

Language code for place details (e.g. 'en', 'de', 'es'). Affects place name, description, and categories.

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

Country code (e.g. 'us', 'de', 'gb'). Affects which Google region is used for results.

## Actor input object example

```json
{
  "placeUrls": [
    {
      "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
    }
  ],
  "maxPlacesPerSearch": 20,
  "language": "en",
  "country": "us"
}
```

# Actor output Schema

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

All scraped place details with coordinates, ratings, categories, and contact info.

## `csv` (type: `string`):

Place details exported as a CSV file.

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

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

# Run the Actor and wait for it to finish
run = client.actor("beatanalytics/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("💾 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 '{
  "placeUrls": [
    {
      "url": "https://maps.app.goo.gl/KZLn9FA3aokoiVaP8"
    }
  ]
}' |
apify call beatanalytics/google-maps-place-details-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Maps Place Details Scraper",
        "description": "Extract detailed place information from Google Maps: name, address, coordinates, rating, review count, categories, phone, website, description, and timezone. Find places by URL, Place ID, or built-in search. Export as CSV, JSON, or Excel.",
        "version": "1.0",
        "x-build-id": "RkPjByOO1xqs2orUu"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/beatanalytics~google-maps-place-details-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-beatanalytics-google-maps-place-details-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/beatanalytics~google-maps-place-details-scraper/runs": {
            "post": {
                "operationId": "runs-sync-beatanalytics-google-maps-place-details-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/beatanalytics~google-maps-place-details-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-beatanalytics-google-maps-place-details-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",
                "properties": {
                    "placeUrls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Google Maps place URLs or share links to scrape details for. Supports full URLs (google.com/maps/place/...) and share links (maps.app.goo.gl/...).",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "placeIds": {
                        "title": "Place IDs",
                        "type": "array",
                        "description": "Google Place IDs (ChIJ...) or Feature IDs (0x...:0x...) to scrape details for. Can be used instead of or in addition to Place URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Search terms to find places on Google Maps (e.g. \"pizza\", \"hotels\", \"dentist\"). Used together with Search locations — all combinations of queries and locations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchLocations": {
                        "title": "Search locations",
                        "type": "array",
                        "description": "Locations to search in (e.g. \"New York, NY\", \"London, UK\"). Used together with Search queries — all combinations of queries and locations are searched.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPlacesPerSearch": {
                        "title": "Max places per search",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of places to find per search query + location combination. Each page returns up to 20 results.",
                        "default": 20
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Language code for place details (e.g. 'en', 'de', 'es'). Affects place name, description, and categories.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Country code (e.g. 'us', 'de', 'gb'). Affects which Google region is used for results.",
                        "default": "us"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
