# Google Maps Scraper (Cheap) (`data_api/google-maps-scraper-cheap`) Actor

Google Maps Scraper pulls verified business listings from Google Maps and delivers structured, ready-to-use data. Give it a list of search queries and get back names, addresses, phone numbers, websites, ratings, GPS coordinates, opening hours, and more for every business it finds.

- **URL**: https://apify.com/data\_api/google-maps-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Automation, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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 Places Scraper

![Google Maps Places Scraper](cover.jpg)

Pulling business details off Google Maps by hand is slow work — you open a pin, copy the phone number, jot down the address, then do it again a few hundred times. This scraper skips all of that. Type the searches you would type into the Maps box, and you get back a clean table of places: business name, full address, phone, website, star rating, review count, and the exact GPS coordinates. Run one search or feed it a long list of categories and cities at once.

### What you get

Every place comes back as one tidy row, and fields that Google does not show stay as `null` so your columns line up when you load the data into a sheet or database. Each row carries:

- **Identity** — `businessName`, `categoryList`, `placeId`, `placeIdHex`, `mapsPath`, `mapsUrl`, `thumbnailUrl`
- **Location** — `fullAddress`, `cityName`, `stateCode`, `stateName`, `postalCode`, `countryCode`, `districtName`, `lat`, `lng`, `timeZone`
- **Contact** — `phoneNumber`, `phoneInternational`, `websiteUrl`
- **Reputation and hours** — `starRating`, `reviewsTotal`, `hoursToday`, `openStatus`
- **Extras** — `businessAttributes`, `accessibilityFeatures`, plus the `searchQuery` that found it and a `collectedAt` timestamp

### Quick start

1. Press **Try for free** and open the input form.
2. Add your phrases to **Search terms**, one per line, for example `coffee shops in Portland, OR`.
3. Set **Result language** and **Region bias** if you want results localized, then cap the run with **Results per search term** or **Total results cap**.
4. Pick a proxy type, hit **Start**, and export the rows as JSON, CSV, Excel, or XML once it finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Lead lists for sales** — build a list of businesses in a category and city, complete with phone and website
- **Local market research** — measure how many competitors sit in a neighborhood and how they are rated
- **Store and franchise planning** — map existing locations before choosing where to expand
- **Directory and dataset building** — seed your own listings site with names, addresses, and coordinates
- **Review benchmarking** — compare star ratings and review counts across a whole category
- **Field sales routing** — geocode prospects by `lat`/`lng` to plan efficient visit routes

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchTerms` | array of strings | Yes | Phrases to look up on Google Maps, one search each. Be specific, e.g. `pediatric dentist near 30301`. |
| `languageCode` | string | No | ISO language code for the wording of names and addresses. Default `en`. |
| `regionCode` | string | No | Two-letter region code that biases results toward a country. Default `us`. |
| `resultsPerQuery` | integer | No | Most places to gather per phrase; the actor pages until it hits this. Default `120`. |
| `totalResultsLimit` | integer | No | Overall cap on places kept across all phrases in one run. Default `1000000`. |
| `proxyConfiguration` | object | No | Proxies used for requests. Defaults to Datacenter; switch to Residential if Google blocks requests. |

#### Example input

```json
{
    "searchTerms": [
        "vegan restaurants in austin, TX",
        "yoga studios near 94110 San Francisco CA"
    ],
    "languageCode": "en",
    "regionCode": "us",
    "resultsPerQuery": 120,
    "totalResultsLimit": 1000000,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
}
```

### Output

Each place becomes one row with a fixed set of fields. Anything Google does not publish for a place comes back as `null`, so the dataset stays rectangular and easy to load.

#### Example output

```json
{
    "businessName": "Sunrise Vegan Kitchen",
    "fullAddress": "1204 South Lamar Boulevard, Austin, TX 78704",
    "cityName": "Austin",
    "stateCode": "TX",
    "stateName": "Texas",
    "postalCode": "78704",
    "countryCode": "US",
    "lat": 30.2541,
    "lng": -97.7642,
    "starRating": 4.6,
    "reviewsTotal": 832,
    "phoneNumber": "(512) 555-0148",
    "phoneInternational": "+15125550148",
    "websiteUrl": "https://sunrisevegankitchen.com",
    "categoryList": ["Vegan restaurant", "Cafe"],
    "placeId": "ChIJAbCdEf123456789",
    "placeIdHex": "0x8644b59abcdef012",
    "districtName": "Zilker",
    "timeZone": "America/Chicago",
    "mapsPath": "/g/abc123",
    "mapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJAbCdEf123456789",
    "thumbnailUrl": "https://lh5.googleusercontent.com/p/AF1QipExampleThumbnailReference",
    "hoursToday": "8 AM-9 PM",
    "openStatus": "Open",
    "businessAttributes": ["Women-owned"],
    "accessibilityFeatures": ["Wheelchair accessible entrance"],
    "searchQuery": "vegan restaurants in austin, TX",
    "collectedAt": "2026-06-29T12:00:00.000000+00:00"
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `businessName` | string | Name of the place as shown on Google Maps |
| `fullAddress` | string | Complete street address with street, city, state, and ZIP |
| `cityName` | string | City pulled from the address |
| `stateCode` | string | Two-letter state abbreviation, such as FL, NY, CA |
| `stateName` | string | Spelled-out state name, such as Florida, New York |
| `postalCode` | string | ZIP or postal code from the address |
| `countryCode` | string | Two-letter country code, such as US |
| `lat` | number | Latitude of the place |
| `lng` | number | Longitude of the place |
| `starRating` | number | Average Google Maps score from 1.0 to 5.0 |
| `reviewsTotal` | integer | Number of Google Maps reviews for the place |
| `phoneNumber` | string | Main phone in local format, e.g. (305) 555-1234 |
| `phoneInternational` | string | Same number in international format, e.g. +13055551234 |
| `websiteUrl` | string | Link to the place's website |
| `categoryList` | array | Category labels for the place, such as Roofing contractor |
| `placeId` | string | Google's unique place identifier in ChIJ format |
| `placeIdHex` | string | Internal hexadecimal place identifier |
| `districtName` | string | Neighborhood or district tied to the place |
| `timeZone` | string | IANA time zone, e.g. America/New\_York |
| `mapsPath` | string | Short Google Maps path, e.g. /g/abc123 |
| `mapsUrl` | string | Direct Google Maps link built from the place ID |
| `thumbnailUrl` | string | Link to the place's thumbnail photo |
| `hoursToday` | string | Opening hours for today, e.g. 8 AM-5 PM or Open 24 hours |
| `openStatus` | string | Live open or closed text, e.g. Open or Closed - Opens 8 AM |
| `businessAttributes` | array | Identity labels, such as Women-owned or LGBTQ+ friendly |
| `accessibilityFeatures` | array | Accessibility options, such as Wheelchair accessible entrance |
| `searchQuery` | string | The phrase that found this place |
| `collectedAt` | string | ISO 8601 timestamp of when the row was captured |

### Tips for best results

- **Be specific with each phrase.** A search like `plumbers in 77001 Houston TX` returns sharper results than `plumbers`.
- **Use `resultsPerQuery` to control depth.** Set it low while you test the output, then raise it for a full pull.
- **Keep `totalResultsLimit` as a guardrail.** When you queue dozens of phrases, it stops a run from growing larger than you expect.
- **Switch to Residential proxies if you get blocked.** Datacenter handles most runs; residential helps when you see repeated blocks or empty pages.
- **Set the right `regionCode`.** When a phrase could match places in more than one country, the region bias keeps results where you want them.

### How can I use Google Maps places data?

**How can I use the Google Maps Places Scraper to build a local lead list?**
Queue phrases like `hvac contractors in phoenix, AZ` and the scraper returns each business with its phone, website, address, and rating. Filter by `starRating` or `reviewsTotal` to find established prospects, then export to CSV and drop them straight into your CRM or outreach tool.

**How can I scrape Google Maps business data for several cities at once?**
Add one phrase per city to `searchTerms` and the actor runs them in parallel, tagging every row with the `searchQuery` that produced it. That makes it easy to slice the dataset by market afterward and compare coverage, ratings, and density across locations.

**How can I get GPS coordinates from Google Maps for mapping or routing?**
Every place comes back with `lat` and `lng` alongside the full address, so you can plot results on a map, cluster them by neighborhood, or build optimized field-sales routes without geocoding the addresses yourself.

**How can I research competitors and reviews in a category?**
Search a category in your area and read `starRating`, `reviewsTotal`, `categoryList`, and `openStatus` across the results to see who leads on reputation, which segments are crowded, and where there is room for a new entrant.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

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

One or more phrases to look up on Google Maps. Each phrase returns up to a few hundred places. Be specific for sharper results, for example 'coffee shops in Portland, OR', 'pediatric dentist near 30301', or 'auto repair in downtown Denver, CO'.

## `languageCode` (type: `string`):

ISO language code that controls the wording of place names and addresses in the output, for example 'en' for English, 'es' for Spanish, 'fr' for French, or 'ja' for Japanese.

## `regionCode` (type: `string`):

Two-letter region code that tilts results toward a given country, for example 'us', 'gb', 'ca', 'au', or 'jp'. Handy when a phrase could match places in more than one country.

## `resultsPerQuery` (type: `integer`):

Ceiling on how many places to gather for each phrase. The actor turns pages on its own until it hits this number. You may get fewer when Google simply has less to show.

## `totalResultsLimit` (type: `integer`):

Overall ceiling on places kept across every phrase in a single run. Treat it as a guardrail when feeding in long lists of search terms.

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

Pick the proxies used for requests. They spread traffic to sidestep IP blocks and rate limits. Datacenter proxies run fastest; residential proxies are tougher to flag.

## Actor input object example

```json
{
  "searchTerms": [
    "vegan restaurants in austin, TX",
    "yoga studios near 94110 San Francisco CA",
    "hvac contractors in 85001 phoenix AZ",
    "bookstores near downtown portland, OR",
    "barbershops in nashville, TN",
    "veterinary clinics in 60614 chicago IL",
    "law firms in san diego, CA",
    "bakeries near brooklyn, NY",
    "physical therapists in 02115 boston MA",
    "tattoo studios in new orleans, LA",
    "florists in 30309 atlanta GA",
    "moving companies in seattle, WA",
    "pizza places near Camden, London, UK",
    "ramen shops in Osaka Japan",
    "accountants in 75201 dallas TX"
  ],
  "languageCode": "en",
  "regionCode": "us",
  "resultsPerQuery": 120,
  "totalResultsLimit": 1000000,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        "vegan restaurants in austin, TX",
        "yoga studios near 94110 San Francisco CA"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/google-maps-scraper-cheap").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": [
        "vegan restaurants in austin, TX",
        "yoga studios near 94110 San Francisco CA",
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("data_api/google-maps-scraper-cheap").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": [
    "vegan restaurants in austin, TX",
    "yoga studios near 94110 San Francisco CA"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call data_api/google-maps-scraper-cheap --silent --output-dataset

```

## MCP server setup

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

```

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/1M1IIrBc4hlgh2QUL/builds/s5CbEh89AQs2vZEOi/openapi.json
