# Google Maps Scraper Germany, UK & US - Local Business Leads (`kamerozkan/google-maps-scraper`) Actor

Scrape local businesses from Google Maps in Germany, the UK, the US and 27 more countries by keyword and city: name, category, rating, exact review count, address, phone, website, open now status, coordinates, place ID and Maps link. Low cost lead lists for sales, local SEO and market research.

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

## Pricing

from $1.20 / 1,000 place scrapeds

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?

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 Germany, UK & US - Local Business Leads

Google Maps scraper for Germany, the UK, the US and 27 more countries. Scrape local businesses from Google Maps results by keyword and city: name, category, star rating, exact review count, full address, phone, website, open now status, coordinates, Google place ID, CID and a Google Maps link. Bulk queries in 30 countries, export to JSON, CSV or Excel.

### What does Google Maps Scraper do?

Type what you would search on Google Maps, for example `dentist in Austin TX` or `Zahnarzt Berlin Mitte`, pick a country, and the actor returns the places Google lists for that search, one row per business, in Google's ranking order. It reads further result pages (20 places each) when you ask for more places per query. Sponsored listings are skipped.

It needs no login, no Google account, no browser and no proxy setup on your side: the results come from Google's local search results, fetched through Apify's Google SERP proxy, which is included in the price.

### Who is it for?

- **Sales and lead generation teams**: build call and email lists of local businesses by trade and city, with phone and website.
- **Agencies selling web design, SEO or marketing**: find businesses with few reviews, low ratings or no website in a target area.
- **Local SEO specialists**: see who ranks for a local keyword, at which position, with which rating and review count.
- **Market researchers and franchise planners**: count competitors per area and map them with coordinates.

### What data can you get?

| Field | Example |
|---|---|
| `query`, `country` | dentist in Austin TX, US |
| `position` | 1 (rank in Google's local results for that query) |
| `name` | North Austin Dentistry |
| `category`, `categories` | Dentist |
| `rating`, `reviewsCount` | 4.9, 736 (exact count, not rounded) |
| `address` | 6850 Austin Center Blvd #310, Austin, TX 78731 |
| `phone` | (512) 489-9933 |
| `website` | https://northaustindentist.com/ (tracking parameters removed) |
| `openingStatus` | Open · Closes 3 PM (at the time of the run) |
| `latitude`, `longitude` | 30.351764, -97.752693 |
| `placeId` | ChIJUfYH2QLLRIYR9a_qLP46DcY (works with the Google Places API) |
| `cid`, `googleMapsUrl` | 14271127657556652021, https://www.google.com/maps?cid=14271127657556652021 |
| `kgmid` | /g/1td33flx (Google Knowledge Graph ID) |

Fields stay empty (null) when Google does not show that detail. Service-area businesses such as plumbers or cleaners often hide their street address, so `address` is empty for them while phone, website and coordinates are still filled.

Not included: email addresses, review texts, photos and the full weekly opening hours. Combine the `website` column with a contact details scraper if you need emails.

### How much does it cost?

You pay only for results: **$1.50 per 1,000 places** ($0.0015 per place) on the Free plan, with Store discounts on paid Apify plans: Bronze $1.35, Silver $1.275, Gold and above $1.20 per 1,000 places. The Google SERP proxy is included; there is nothing else to buy.

Worked example: 25 searches (for example one trade in 25 cities) with 40 places each = 1,000 places = 1,000 x $0.0015 = **$1.50** on the Free plan.

Set "Max places per query", "Max places in total" or a maximum cost per run to cap spending.

### How to use it

1. Click **Try for free**.
2. Enter one or more **Search queries**: a business type plus a place, such as `roofing contractor Phoenix AZ`.
3. Choose the **Country** and, if you want, a **Language** for categories and opening status.
4. Set **Max places per query** (one results page holds 20 places).
5. Click **Start**, then download the results as JSON, CSV or Excel, or read them through the API.

Tip: Google lists a limited number of places per search. For full coverage of a large city, split it into neighbourhoods or ZIP codes (`dentist 78704`, `dentist 78731`) and deduplicate on `placeId`.

### Input example

```json
{
  "queries": ["dentist in Austin TX", "orthodontist in Austin TX"],
  "countryCode": "us",
  "maxPlacesPerQuery": 40
}
```

### Output example

Rows from a QA run on 2026-10-10:

```json
{
  "query": "dentist in Austin TX",
  "country": "US",
  "position": 1,
  "name": "North Austin Dentistry",
  "category": "Dentist",
  "categories": ["Dentist"],
  "rating": 4.9,
  "reviewsCount": 736,
  "address": "6850 Austin Center Blvd #310, Austin, TX 78731",
  "phone": "(512) 489-9933",
  "website": "https://northaustindentist.com/",
  "openingStatus": "Open · Closes 3 PM",
  "latitude": 30.351764,
  "longitude": -97.752693,
  "placeId": "ChIJUfYH2QLLRIYR9a_qLP46DcY",
  "cid": "14271127657556652021",
  "kgmid": "/g/1td33flx",
  "googleMapsUrl": "https://www.google.com/maps?cid=14271127657556652021"
}
```

A service-area business from a UK search (`plumber in Manchester`, `countryCode: "gb"`):

```json
{
  "name": "Daniel Plumbing and handyman",
  "category": "Plumber",
  "rating": 4.9,
  "reviewsCount": 397,
  "address": null,
  "phone": "07852 397292",
  "website": "https://www.local-plumbers-manchester.co.uk/",
  "latitude": 53.535328,
  "longitude": -2.228531
}
```

### Supported countries

United States, United Kingdom, Canada, Australia, India, Ireland, New Zealand, South Africa, Germany, Austria, Switzerland, France, Belgium, Netherlands, Italy, Spain, Portugal, Poland, Sweden, Denmark, Norway, Finland, Czechia, Turkey, Brazil, Mexico, Argentina, Japan, Singapore and the United Arab Emirates.

### Integrations and API

Run it from your code with the Apify API or the `apify-client` package, schedule it in Apify, or connect it to Make, n8n, Zapier, Google Sheets, HubSpot or a webhook.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kamerozkan/google-maps-scraper").call(run_input={
    "queries": ["dentist in Austin TX"],
    "countryCode": "us",
    "maxPlacesPerQuery": 40,
})
for place in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(place["position"], place["name"], place["phone"], place["website"])
```

### FAQ

**How many places do I get per search?** As many as Google lists for it, 20 per results page. The actor reads further pages until it reaches your limit or Google shows no new places. Split big cities into neighbourhoods or ZIP codes for more.

**How fast is it?** Google's local result pages are slow to answer, so the actor requests several pages in parallel. 40 places for one search take about one minute.

**Are review counts exact?** Yes. Google's page shows "1.5K", but the actor reads the exact number (for example 1548).

**Can I get emails?** Not from Google. Run the `website` column through a contact details scraper to collect published business emails.

**Why are some fields empty?** Some businesses publish no phone, website or street address on Google. The actor never guesses a value.

**Is it legal to collect this data?** It collects business listings that Google shows publicly. You are responsible for how you use the data, including direct marketing rules such as GDPR or CAN-SPAM.

**Something is not working?** Open an issue on the Issues tab with your run link and we will fix it fast.

# Actor input Schema

## `queries` (type: `array`):

What you would type into Google Maps: a business type plus a place, one query per line. Examples: dentist in Austin TX, plumber Denver, Zahnarzt Berlin Mitte.

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

Google country to search in. Use the country of the places you want.

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

Language for categories and opening status, such as en, de or fr. Leave empty to use the country's main language.

## `maxPlacesPerQuery` (type: `integer`):

Stop each query after this many places. One results page holds 20 places; the actor pages further when you ask for more (up to about 200 per query, as many as Google lists).

## `maxItems` (type: `integer`):

Stop the whole run after this many places. You are charged per place, so this also caps the cost of the run.

## Actor input object example

```json
{
  "queries": [
    "dentist in Austin TX"
  ],
  "countryCode": "us",
  "maxPlacesPerQuery": 20,
  "maxItems": 1000
}
```

# Actor output Schema

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

One row per result in the default dataset.

# 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 = {
    "queries": [
        "dentist in Austin TX"
    ],
    "countryCode": "us",
    "maxPlacesPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("kamerozkan/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 = {
    "queries": ["dentist in Austin TX"],
    "countryCode": "us",
    "maxPlacesPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("kamerozkan/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 '{
  "queries": [
    "dentist in Austin TX"
  ],
  "countryCode": "us",
  "maxPlacesPerQuery": 20
}' |
apify call kamerozkan/google-maps-scraper --silent --output-dataset

```

## MCP server setup

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