# Google Maps Extractor ✅ $1.5/1k places (`x_guru/google-maps-extractor`) Actor

From $1.50 / 1,000 saved places. Fast Google Maps Extractor for Google Places data, local business listings, addresses, phones, websites, ratings, review counts, opening hours, coordinates, Place IDs, CIDs, and public website contacts from keywords, URLs, Place IDs, or map areas.

- **URL**: https://apify.com/x\_guru/google-maps-extractor.md
- **Developed by:** [Hundevmode Labs](https://apify.com/x_guru) (community)
- **Categories:** Lead generation, Automation, Travel
- **Stats:** 14 total users, 3 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## Google Maps Extractor: Scrape Google Places, Business Details and Contacts

Google Maps Extractor collects structured Google Maps place data from search terms, locations, Google Maps URLs, Google Place IDs, and selected map areas. Use it to scrape Google Places data, local business listings, addresses, websites, phone numbers, ratings, review counts, opening hours, popular times, coordinates, Place IDs, CIDs, and public website contacts.

It is built for fast Google Maps data extraction, local business lead lists, local SEO research, competitor mapping, store locator datasets, and CRM enrichment from existing Google Maps URLs or Place IDs.

![Real Google Maps search results for bike repair shops in Portland](https://api.apify.com/v2/key-value-stores/RgWfy9bTkPpSqNzrV/records/google-maps-extractor-real-google-maps.png?signature=1c5HpULMOkoXKSytZxW0G)

### AI agent skill

Use the dedicated [Google Maps Extractor Apify agent skill](https://github.com/hundevmode/apify-google-maps-extractor-agent-skill) when you want AI agents to build Google Maps extraction inputs, run this actor through Apify, control spend with `maxTotalChargeUsd`, and return structured place, business detail, and contact rows for CRM, Sheets, n8n, BI, or enrichment workflows.

Install with skills.sh-compatible agents:

```bash
npx skills add hundevmode/apify-google-maps-extractor-agent-skill \
  --skill google-maps-extractor-apify
```

ClawHub skill slug: `google-maps-extractor-apify`.

### At a glance

| Need | Use this actor for |
| --- | --- |
| Google Maps place extraction | Names, categories, ratings, addresses, phones, websites, coordinates, Place IDs, CIDs |
| Local leads | Business websites, phone numbers, public emails, and social profile links |
| Local SEO | Competitor lists by category, city, rating, review count, website availability, and opening status |
| Store locator data | Addresses, coordinates, Google Maps URLs, plus codes, and opening hours |
| CRM enrichment | Enrich existing Google Maps URLs or Place IDs with place details and contacts |
| Google Places API alternatives | Export Google Maps business data to JSON, CSV, Excel, or API workflows |

### Pricing

The actor uses the same place, filter, details, and contacts pricing as our main Google Maps Scraper.

| Event | Free | Paid plans |
| --- | --- | --- |
| Scraped place | $3.00 / 1,000 saved places | $1.50 / 1,000 saved places |
| Add-on: filter applied | $0.80 / 1,000 saved places | $0.35 / 1,000 saved places |
| Add-on: additional place details scraped | $1.50 / 1,000 enriched places | $0.75 / 1,000 enriched places |
| Add-on: company contacts enrichment | $1.50 / 1,000 enriched places | $0.45 / 1,000 enriched places |
| Actor start | $0.00005 per start event | $0.00001 per start event |

Set a maximum run cost before starting a run. The actor respects the Apify spending limit and exits gracefully when no paid results can be saved.

### Quick start

Search by keyword and location:

```json
{
  "searchStringsArray": ["bike repair shop"],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 100,
  "language": "en"
}
```

Filter by categories, rating, and website availability:

```json
{
  "searchStringsArray": ["restaurant"],
  "locationQuery": "Austin, Texas, USA",
  "maxCrawledPlacesPerSearch": 50,
  "categoryFilterWords": ["Italian restaurant", "pizza"],
  "placeMinimumStars": "four",
  "website": "withWebsite",
  "language": "en"
}
```

Scrape from a Google Maps URL:

```json
{
  "startUrls": [
    {
      "url": "https://www.google.com/maps/search/restaurants+near+New+York,+NY"
    }
  ],
  "maxCrawledPlacesPerSearch": 100,
  "language": "en"
}
```

Enrich exact Place IDs with details and website contacts:

```json
{
  "placeIds": ["ChIJN1t_tDeuEmsRUsoyG83frY4"],
  "maxCrawledPlacesPerSearch": 1,
  "scrapePlaceDetailPage": true,
  "scrapeContacts": true
}
```

### Input options

#### Core search

| Field | What it does |
| --- | --- |
| `searchStringsArray` | One or more Google Maps search terms, such as `restaurant`, `dentist`, `hotel`, or `bike repair shop`. |
| `locationQuery` | Free-text location, such as `Portland, Oregon, USA` or `Berlin, Germany`. |
| `maxCrawledPlacesPerSearch` | Target number of places per search term or Google Maps URL. |
| `language` | Google Maps language code used for localized result text. |

#### Google Maps URLs and Place IDs

| Field | What it accepts |
| --- | --- |
| `startUrls` | Google Maps search URLs, direct place URLs, `cid` URLs, and Google Maps app/share URLs. |
| `placeIds` | Google Place IDs, values prefixed with `place_id:`, and URLs containing `query_place_id`. |

#### Result filters

| Field | What it does |
| --- | --- |
| `categoryFilterWords` | Free-text category keywords matched against `categoryName` and `categories`. |
| `placeCategories` | Predefined Google Business Profile categories from the built-in category list. |
| `searchMatching` | Keep all places, only names that include the search term, or exact name matches. |
| `placeMinimumStars` | Minimum Google rating. |
| `website` | Keep all places, only places with websites, or only places without websites. |
| `skipClosedPlaces` | Remove places Google marks as temporarily or permanently closed. |

#### Add-on: Place details

Enable `scrapePlaceDetailPage` to collect richer details when Google exposes them:

- opening hours
- additional opening hour groups
- popular times
- menu and services links
- table reservation URLs
- order-online URLs
- related web links
- inside places
- plus code
- review count and rating distribution
- hotel and fuel fields when available

Related fields:

- `scrapePlaceDetailPage`
- `scrapeTableReservationProvider`
- `scrapeOrderOnline`
- `includeWebResults`
- `scrapeDirectories`

#### Add-on: Company contacts enrichment

Enable `scrapeContacts` to visit public business websites after places are collected and extract available:

- emails
- additional phone numbers
- Facebook URLs
- Instagram URLs
- LinkedIn URLs
- X/Twitter URLs
- YouTube URLs
- TikTok URLs

Use `website: "withWebsite"` when running large contact-enrichment jobs to avoid spending time on places without websites.

#### Search area

Use these fields when you need structured geographic control:

- `countryCode`
- `city`
- `state`
- `county`
- `postalCode`
- `customGeolocation`
- `strictLocationBounds`

Free-text `locationQuery` has priority when provided.

#### All visible places

Use `allPlacesNoSearchAction` when you want visible-map coverage for a concrete local area instead of a category search:

```json
{
  "locationQuery": "SoHo, New York, USA",
  "allPlacesNoSearchAction": "all_visible",
  "allPlacesZoom": 16,
  "maxCrawledPlacesPerSearch": 500
}
```

This mode requires a concrete area. Country-only and very broad locations should be split into smaller runs.

### Output

Each dataset item is one Google Maps place.

| Group | Example fields |
| --- | --- |
| Basic place data | `title`, `subTitle`, `description`, `categoryName`, `categories`, `price`, `rank`, `isAdvertisement` |
| Address and location | `address`, `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode`, `location`, `plusCode`, `locatedIn`, `floor` |
| Contact data | `website`, `phone`, `phoneUnformatted`, `emails`, `additionalPhones` |
| Social links | `facebooks`, `instagrams`, `linkedIns`, `twitters`, `youtubes`, `tiktoks` |
| Status and ownership | `permanentlyClosed`, `temporarilyClosed`, `claimThisBusiness` |
| Ratings | `totalScore`, `reviewsCount`, `reviewsDistribution`, `reviewsTags` |
| Place details | `openingHours`, `additionalOpeningHours`, `popularTimesLiveText`, `popularTimesLivePercent`, `popularTimesHistogram`, `menu`, `servicesLink`, `reserveTableUrl`, `googleFoodUrl`, `peopleAlsoSearch`, `placesTags` |
| Hotels and fuel | `hotelStars`, `hotelDescription`, `checkInDate`, `checkOutDate`, `hotelAds`, `gasPrices` |
| Google identifiers | `placeId`, `cid`, `fid`, `kgmid`, `url`, `searchPageUrl`, `searchPageLoadedUrl`, `searchString`, `language` |
| Add-on data | `additionalInfo`, including nested data such as `companyContacts`, `webResults`, and `insidePlaces` when enabled |

Example output item:

```json
{
  "title": "Example Bike Repair",
  "categoryName": "Bicycle repair shop",
  "address": "123 Main St, Portland, OR 97205",
  "city": "Portland",
  "countryCode": "US",
  "website": "https://example.com/",
  "phone": "+1 503-555-0100",
  "totalScore": 4.8,
  "reviewsCount": 142,
  "placeId": "ChIJ...",
  "cid": "1234567890",
  "url": "https://www.google.com/maps/place/...",
  "location": {
    "lat": 45.5152,
    "lng": -122.6784
  }
}
```

You can export the dataset from Apify as JSON, CSV, Excel, XML, HTML table, or access it through the Apify Dataset API.

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/x_guru~google-maps-extractor/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchStringsArray": ["plumber"],
    "locationQuery": "Phoenix, Arizona, USA",
    "maxCrawledPlacesPerSearch": 100,
    "language": "en",
    "scrapeContacts": true
  }'
```

### Best practices

- Use one clear business category per search term.
- Use a concrete city, neighborhood, postal code, or custom area.
- Start with a small limit, check quality, then scale.
- Enable only the add-ons you need.
- Use `maxTotalChargeUsd` in Apify run options for budget control.
- Use the website filter before website contact enrichment on large jobs.
- Use `categoryFilterWords` for fast category matching and `placeCategories` when you want a predefined Google Business Profile category.
- Use direct `startUrls` or `placeIds` when you already know the exact businesses you want to enrich.

### FAQ

#### Is this different from the main Google Maps Scraper?

Yes. This actor is focused on fast place extraction, business details, and website contacts with a simpler input.

#### Can it extract emails?

Yes, when `scrapeContacts` is enabled and the business has a public website with reachable contact information.

#### Can it scrape exact businesses?

Yes. Use direct Google Maps place URLs in `startUrls` or Google Place IDs in `placeIds`.

### Related keywords

Google Maps extractor, Google Maps data extractor, Google Maps scraper, Google Places scraper, Google Places data, Google Maps business data, local business extractor, Google Maps leads, business contacts extractor, Google Maps emails, local SEO data, competitor research, store locator data, Apify Google Maps actor, scrape Google Maps places.

# Actor input Schema

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

Type what you would normally search for in Google Maps, for example restaurant, dentist, bike repair shop, hotel, or pet shelter. Use one clear term per row for better speed and coverage.

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

Location context for all search terms, for example New York, USA or Berlin, Germany. For a specific business, keep the business name in Search term(s) and the city/country here.

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

Target number of places for each search term or Google Maps URL. Example: 10 search terms and 250 here means up to 2,500 places total. If fewer places exist in the area, the actor returns all places it can find.

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

Results details will show in this language when Google Maps provides localized text.

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

Optional paid category filter matched against categoryName and categories. Add synonyms you want to keep, for example pizza, italian restaurant, or divorce attorney.

## `placeCategories` (type: `array`):

Optional paid category filter from known Google Business Profile categories. Choose one or more categories; for broader synonym matching, also use Category keywords above.

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

Paid name matching filter. Leave the default to scrape all places returned by Google Maps.

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

Paid rating filter. Only save places with this rating or higher.

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

Paid website availability filter.

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

Paid status filter. Skip places that appear temporarily or permanently closed.

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

Adds detail fields that Google Maps exposes for a place, such as opening hours, plus code, located-in, menu/services links, refined phone/address/category data, and review count. This runs after base collection and uses a fast details payload first.

## `scrapeTableReservationProvider` (type: `boolean`):

Save reservation provider URLs, such as OpenTable, Resy, SevenRooms, Tock, or Google Reserve, when Google exposes them for the place.

## `scrapeOrderOnline` (type: `boolean`):

Save food ordering URLs or Google food/order links when Google exposes them for restaurants and similar businesses.

## `includeWebResults` (type: `boolean`):

Save external links found in the Google Maps detail payload, such as menu, booking, event, post, and other business-related result links. Google-owned utility links are filtered out.

## `scrapeDirectories` (type: `boolean`):

Save places located inside a larger venue, mall, airport, station, or building when Google exposes this relationship.

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

Visit each business website after places are collected and extract public emails, additional phone numbers, and social profile links from the homepage plus a small set of contact/about/team/impressum pages.

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

Optional country used for structured search area and Google Maps region bias. Free-text Location has priority when it is filled.

## `city` (type: `string`):

Optional city used to build the search area when the main Location field is empty.

## `state` (type: `string`):

Optional state, province, or region used to build the search area when the main Location field is empty.

## `county` (type: `string`):

Optional county or district used to build the search area when the main Location field is empty.

## `postalCode` (type: `string`):

Optional postal or ZIP code used to build the search area when the main Location field is empty.

## `customGeolocation` (type: `object`):

Optional GeoJSON-like custom area. Use longitude, latitude coordinate order. Supports polygon-like coordinate lists and circle-style point/radius inputs when provided by the Apify form.

## `strictLocationBounds` (type: `boolean`):

Filter out places whose coordinates are outside the geocoded or custom search area. Keep this on for bounded area runs.

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

Paste Google Maps search URLs or place URLs copied from google.com/maps or the Google Maps app share dialog. URL sources run before normal search terms. Search URLs can return multiple places; direct place URLs return one place when Google exposes the place payload. In API JSON, pass items as objects, for example \[{"url":"https://www.google.com/maps/..."}].

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

Paste Google Place IDs, one per row, for example ChIJN1t\_tDeuEmsRUsoyG83frY4. The actor also accepts values prefixed with place\_id: and can extract query\_place\_id from Google Maps URLs pasted here.

## `allPlacesNoSearchAction` (type: `string`):

Use only when you do not provide Search terms, Google Maps URLs, or Place IDs. Requires a concrete Search area above: Location, city/state/postal fields, or a custom area. Country-only is too broad for this mode.

## `allPlacesZoom` (type: `integer`):

Optional zoom override for All visible places mode. Leave 0 for automatic zoom based on area size. Higher zoom can expose more local pins but can take longer. Typical useful values are 14 to 17.

## Actor input object example

```json
{
  "searchStringsArray": [
    "bike repair shop"
  ],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 50,
  "language": "en",
  "searchMatching": "all",
  "placeMinimumStars": "",
  "website": "allPlaces",
  "skipClosedPlaces": false,
  "scrapePlaceDetailPage": false,
  "scrapeTableReservationProvider": false,
  "scrapeOrderOnline": false,
  "includeWebResults": false,
  "scrapeDirectories": false,
  "scrapeContacts": false,
  "strictLocationBounds": true,
  "allPlacesNoSearchAction": "",
  "allPlacesZoom": 0
}
```

# Actor output Schema

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

Google Maps place records saved to the default dataset.

## `summary` (type: `string`):

Run-level diagnostics, including saved count, exhaustion reason, selected add-ons, and PPE budget details.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchStringsArray": [
        "bike repair shop"
    ],
    "locationQuery": "Portland, Oregon, USA",
    "maxCrawledPlacesPerSearch": 50,
    "language": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("x_guru/google-maps-extractor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchStringsArray": ["bike repair shop"],
    "locationQuery": "Portland, Oregon, USA",
    "maxCrawledPlacesPerSearch": 50,
    "language": "en",
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchStringsArray": [
    "bike repair shop"
  ],
  "locationQuery": "Portland, Oregon, USA",
  "maxCrawledPlacesPerSearch": 50,
  "language": "en"
}' |
apify call x_guru/google-maps-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,x_guru/google-maps-extractor"
        }
    }
}

```

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/2A4RTA5PjN7McqJXx/builds/iXPnfJa5TYMXAOaH3/openapi.json
