# Instant Google Maps Scraper (`bhavani_siva/instant-google-maps-scraper`) Actor

Scrape businesses from Google Maps: name, phone, website, address, coordinates, category, rating, reviews and hours. Filter places with or without a website. $0.75 per 1,000 places; leads without a website $1.25 per 1,000.

- **URL**: https://apify.com/bhavani_siva/instant-google-maps-scraper.md
- **Developed by:** [Bhavani veera](https://apify.com/bhavani_siva) (community)
- **Categories:** Lead generation
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.75 / 1,000 google maps 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Instant Google Maps Scraper

Get businesses from Google Maps as clean, flat rows: name, phone, website, full address, coordinates, category, rating, review count and opening hours. Type a search term and a location, the same way you would search on Google Maps.

**$0.75 per 1,000 places.** Leads without a website (the "Only places without a website" filter): **$1.25 per 1,000**. You pay only for unique places delivered. Duplicates, closed places and places your filters remove are free.

### What you get

| Field | Example |
|---|---|
| `name` | Epoch Coffee |
| `category` / `categories` | Coffee shop |
| `phone` | +15124543762 (international format) |
| `phoneLocal` | (512) 454-3762 |
| `website` / `domain` | http://www.epochcoffee.com / epochcoffee.com |
| `address` | 221 W N Loop Blvd, Austin, TX 78751 |
| `street`, `neighborhood`, `city`, `state`, `postalCode`, `countryCode` | 221 W N Loop Blvd, North Loop, Austin, Texas, 78751, US |
| `latitude`, `longitude` | 30.3186, -97.7245 |
| `rating`, `reviewCount` | 4.5, 2532 |
| `description` | Cool, vibrant small-chain cafe… (when Google has one) |
| `openingHours` | `[{ "day": "Monday", "hours": "7 AM–9 PM" }, …]` |
| `status` | `open`, `temporarily_closed` or `permanently_closed` |
| `timezone` | America/Chicago |
| `placeId`, `cid`, `googleMapsUrl` | Google's IDs and a link to the place |
| `searchTerm`, `searchLocation` | The search that found it |
| `scrapedAt` | 2026-10-12T22:15:00.000Z |

This actor does not visit business websites and does not return emails.

### How to use it

1. Add one or more **search terms** (`dentist`, `pool builder`, `pizza`).
2. Add **locations** (`Austin, TX`, `90210`, `Manchester, UK`). Every term runs in every location.
3. Set **max places** and start. Rows appear in the Output tab while the run is going.

**Deep search** (on by default) gets past Google's limit. One Google Maps search shows at most about 120–200 places. When a location has more, the actor takes the location's area (a city, a state or a whole country), covers it with map cells and searches each one. Busy cells are split again, down to about 1 km, so dense downtowns are covered too. Places outside the location's country (and state, for a state or city search) are left out. You get every place Google has there, up to your max places.

You can also give your own **map areas**: a center and a radius, searched the same way.

```json
{
  "searchTerms": ["dentist"],
  "areas": [{ "name": "Dallas", "lat": 32.78, "lng": -96.8, "radiusKm": 20 }],
  "maxPlaces": 3000
}
```

#### Input

| Field | Default | What it does |
|---|---|---|
| `searchTerms` | (required) | What to search on Google Maps. |
| `locations` | | Where: a city, ZIP code, state or country. Leave empty to search the terms as typed (`pizza near Times Square`). |
| `maxPlaces` | 1000 | The run stops after this many unique places. If the area has fewer, you get all of them. |
| `deepSearch` | true | Cover the whole location with map cells to get past Google's ~200-per-search limit. Off: top results only. |
| `language` | en | Language of categories and opening hours. |
| `countryCode` | us | Google region for the search (`gb`, `ca`, `au`, `de`…). |
| `categoryFilter` | | Keep only places whose category contains one of these words. |
| `skipClosed` | true | Leave out permanently closed places. |
| `websiteFilter` | all | `all`, `withWebsite` (only places with a website) or `withoutWebsite` (only places without one, good leads for web design). |
| `onlyWithPhone` | false | Leave out places without a phone number. |
| `areas` | | Circles to search cell by cell: `{ "lat", "lng", "radiusKm", "name"?, "cellKm"? }`. |

### Pricing

Pay per event: **$0.75 per 1,000 places** (one `place` event per row in the dataset) plus Apify's small actor start fee. With **Only places without a website**, each row also has a `no-website-lead` event at $0.50 per 1,000 ($1.25 per 1,000 in total). Set a maximum cost per run in the run options; the actor stops cleanly when it is reached and keeps every place already delivered.

### Notes

- Data comes from Google Maps' public search results, without logging in.
- Closed-place detection reads Google's English labels. With another language, `status` may show `open` for a closed place.
- Phone numbers are the ones listed on Google Maps. Some businesses list none.
- Rows are unique per place within a run. The same place can appear again in a later run.

# Actor input Schema

## `searchTerms` (type: `array`):

What you would type into Google Maps, e.g. 'dentist', 'pool builder', 'pizza'.

## `locations` (type: `array`):

City, ZIP code, county or neighborhood. Every search term runs in every location ('dentist in Austin, TX'). Leave empty to search the terms exactly as typed.

## `maxPlaces` (type: `integer`):

The run stops after this many unique places. You pay only for places delivered. If the area has fewer, you get all of them.

## `deepSearch` (type: `boolean`):

One Google Maps search shows at most about 120-200 places. When a location has more, the actor splits its area (city, state or whole country) into map cells and searches each one, so you get every place Google has there, up to your max places. Turn off for just the top results of each search (faster).

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

Language of categories, descriptions and opening hours.

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

Two-letter country code of the area you search (us, gb, ca, au, de...). Used as Google's region.

## `categoryFilter` (type: `array`):

Keep a place only if one of its Google categories contains one of these words, e.g. 'pool' keeps 'Swimming pool contractor'. Filtered places are free.

## `skipClosed` (type: `boolean`):

Permanently closed places are not delivered (and not charged).

## `websiteFilter` (type: `string`):

Places without a website are good leads for web design and marketing. A Facebook or Instagram page listed as the website counts as a website. Only places without a website costs $0.50 more per 1,000 ($1.25 per 1,000 in total).

## `onlyWithPhone` (type: `boolean`):

Skip places that list no phone number.

## `areas` (type: `array`):

Search a circle cell by cell to get past the per-search limit. Each area: {"name": "Dallas", "lat": 32.78, "lng": -96.8, "radiusKm": 20}. Optional "cellKm" (default 5): smaller cells find more places in dense areas but take longer. Places outside the circle are skipped. Every search term runs in every area.

## Actor input object example

```json
{
  "searchTerms": [
    "coffee shop"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlaces": 50,
  "deepSearch": true,
  "language": "en",
  "countryCode": "us",
  "skipClosed": true,
  "websiteFilter": "all",
  "onlyWithPhone": false
}
```

# Actor output Schema

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

Main table: name, category, local phone, website, address, city, state, postal code, rating, review count, status and Google Maps link.

## `contacts` (type: `string`):

Lead view: name, phone (international and local format), website, domain, street, city, state, postal code and country code.

## `location` (type: `string`):

Map view: name, address, neighborhood, city, state, postal code, country code, latitude, longitude, time zone and Google Maps link.

## `allFields` (type: `string`):

Every field for every place, including categories, description, opening hours, place ID and CID, search term and scrape time.

# 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 = {
    "searchTerms": [
        "coffee shop"
    ],
    "locations": [
        "Austin, TX"
    ],
    "maxPlaces": 50
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = {
    "searchTerms": ["coffee shop"],
    "locations": ["Austin, TX"],
    "maxPlaces": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "coffee shop"
  ],
  "locations": [
    "Austin, TX"
  ],
  "maxPlaces": 50
}' |
apify call bhavani_siva/instant-google-maps-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZmQjWeHXrp6U5yfX7/builds/eXzpWfM5gaTRoWfGD/openapi.json
