# Google Maps Scraper & Places API – Business Leads Extractor (`rowfeed/google-maps-scraper`) Actor

Google Maps scraper and Google Places API alternative: every business for a search with address, phone, website, rating, reviews, opening hours and categories. Up to 700 places per search. $2 per 1,000 places. Licensed data, no blocked runs.

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

## Pricing

from $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/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

## Google Maps Scraper & Places API – Business Leads Extractor

Get every business Google Maps shows for a search, as clean rows: name, category, full address, phone, website, rating, number of reviews, opening hours, coordinates and the Google Maps link.
Search any city, region or country, or around exact coordinates, up to 700 places per search, and filter by rating, reviews, website and phone before you pay.
Built for lead generation, local SEO agencies, sales teams, market research and AI agents that need local business data. A cheaper Google Places API alternative, with no API key or quota to manage.
The data comes through a licensed data provider (DataForSEO), not by scraping Google from a browser, so runs do not fail on captchas or blocks.

### What you get

- **Every business in a Google Maps search**, in Google's order, up to 700 per search.
- **Contact data the business lists publicly:** phone and website (plus the website domain).
- **Address in parts:** street, city, postal code, region, country code, latitude and longitude.
- **Reputation:** rating, number of reviews and reviews per star.
- **Opening hours** per weekday, categories, whether the owner has claimed the listing, number of photos, main photo, online booking link.
- **Ids:** Google place id, CID and a Google Maps link.
- **Filters before charging:** minimum rating, minimum reviews, only with (or without) a website, only with (or without) a phone. "Only without a website" finds businesses that may need one.
- **No double charging:** a business found by several searches is returned and charged once.

Business data only: no e-mails, no review texts, no reviewer names or other people.

### Example output

A real row from "dentist" in Austin, Texas:

```json
{
  "type": "place",
  "query": "dentist",
  "position": 1,
  "title": "Swish Dental Downtown",
  "category": "Dentist",
  "address": "201 W 5th St Ste 175, Austin, TX 78701",
  "city": "Austin",
  "postal_code": "78701",
  "region": "Texas",
  "country_code": "US",
  "phone": "+1512-713-1099",
  "website": "https://www.swishsmiles.com/location/downtown",
  "domain": "swishsmiles.com",
  "rating": 4.5,
  "reviews": 992,
  "opening_hours": {"monday": "09:00-18:00", "tuesday": "08:00-17:30", "saturday": "closed", "sunday": "closed"},
  "is_claimed": true,
  "latitude": 30.2674035,
  "longitude": -97.7451433,
  "place_id": "ChIJdWgENLS1RIYReos4IrRuTmQ",
  "google_maps_url": "https://www.google.com/maps?cid=7227836171923524474",
  "checked_at": "2026-10-22T05:41:03+00:00"
}
```

In a real search for 200 dentists in Austin, 198 had a phone number and 189 a website.

### Input

| Field | What it does |
|---|---|
| `searches` | What you would type into Google Maps: `dentist`, `plumber`, `coffee shop in austin tx`. Up to 500. |
| `location` | City, region or country in Google format: `Austin,Texas,United States`, `Berlin,Berlin,Germany`, `France`. |
| `center`, `zoom` | Or search around exact coordinates, e.g. `30.2672,-97.7431` with zoom 14. |
| `maxPlaces` | Places per search, 1 to 700. Default 20. |
| `minRating`, `minReviews` | Skip businesses below these. Skipped places are not charged. |
| `website`, `phone` | `any`, `with` or `without`. |
| `language` | Language of the results, e.g. `English`, `German`. |

Tip: for a whole big city, run one search per district or postal code (`dentist in 78701`, `dentist in 78702` ...). Businesses that show up twice are charged once.

### Pricing

Pay per event, no subscription:

- **$2 per 1,000 places** ($0.002 per business returned).
- $0.001 per search per started 100 places asked for (Max places 1-100 = $0.001, 700 = $0.007).
- $0.001 per run start.

Examples: 100 dentists in one city cost about $0.20. 1,000 businesses from 10 searches cost about $2.01.

You can cap the cost of a run with the maximum charge setting; the Actor only starts the searches the budget covers. Failed searches are never charged.
Live searches need a paid Apify plan (any plan); the pre-filled example works on the free plan.

### Good to know

- Google Maps itself shows at most a few hundred places for one search; a narrow search or a small town has fewer than you ask for.
- Phone numbers and websites are the ones the business lists on Google Maps.
- Results usually arrive in under a minute.
- Use it from the API, on a schedule, in n8n/Make/Zapier, or from AI agents through MCP (`rowfeed-seo-mcp`).

### Related tools

- [Local Rank Tracker](https://apify.com/rowfeed/google-maps-rank-tracker) – where a business ranks on Google Maps across a geo-grid.
- [Website Traffic & Domain Authority Checker](https://apify.com/rowfeed/website-traffic-checker) – traffic and authority of the websites you found.
- [Google Search Results API](https://apify.com/rowfeed/google-serp-api) – Google results for any query.

Not affiliated with Google.

# Actor input Schema

## `searches` (type: `array`):

What you would type into Google Maps, e.g. "dentist", "plumber" or "coffee shop in austin tx". Each search returns up to Max places. Up to 500. A business found by several searches is returned (and charged) once.

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

City, region or country to search in, in Google format: "Austin,Texas,United States", "Berlin,Berlin,Germany", "France". Ignored when a center is given.

## `center` (type: `string`):

Search around exact coordinates instead of a location, e.g. "30.2672,-97.7431" (right-click a spot in Google Maps to copy it). Use with Zoom.

## `zoom` (type: `integer`):

Google Maps zoom around the center: 12 = a city, 14 = a district, 16 = a few streets.

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

Up to 700. Google Maps often has fewer for a narrow search or small town.

## `minRating` (type: `number`):

Skip businesses rated below this (0 = no filter). Skipped places are not charged.

## `minReviews` (type: `integer`):

Skip businesses with fewer reviews (0 = no filter).

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

"Only without a website" finds businesses that may need one.

## `phone` (type: `string`):

Filter on the business phone listed on Google Maps.

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

Language of the results (English name), e.g. English, German, Spanish.

## Actor input object example

```json
{
  "searches": [
    "dentist",
    "plumber",
    "coffee shop"
  ],
  "location": "London,England,United Kingdom",
  "center": "30.2672,-97.7431",
  "zoom": 14,
  "maxPlaces": 20,
  "minRating": 0,
  "minReviews": 0,
  "website": "any",
  "phone": "any",
  "language": "English"
}
```

# Actor output Schema

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

No description

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("rowfeed/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("rowfeed/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 '{}' |
apify call rowfeed/google-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rowfeed/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/hQBjgQeOkuwQaT5Dr/builds/0aadas7AsjQKQ66W1/openapi.json
