# Google Maps Search Scraper (`straightforward_hydra/google-maps-search-scraper`) Actor

Scrape Google Maps business listings from plain search queries: name, category, rating, address, coordinates, website, phone, opening hours and Google Place ID. No API key, no quota.

- **URL**: https://apify.com/straightforward\_hydra/google-maps-search-scraper.md
- **Developed by:** [Dev D](https://apify.com/straightforward_hydra) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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/platform/actors/running/actors-in-store#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 Search Scraper

Business listings from Google Maps search — **no API key, no quota, no billing
account.** One row per business, straight from a plain search query.

### What you get

| Field | Example |
| --- | --- |
| `name` | LAP COFFEE |
| `category` / `categories` | Coffee shop / \["Coffee shop", "Cafe"] |
| `rating` | 4.7 |
| `address` | Rosenthaler Str. 62, 10119 Berlin, Germany |
| `street`, `postal_code`, `neighbourhood` | Rosenthaler Str. 62, 10119, Mitte |
| `latitude`, `longitude` | 52.5276603, 13.4035268 |
| `website`, `website_domain` | https://lap.coffee/, lap.coffee |
| `phone`, `phone_e164` | +49 30 88718283, +493088718283 |
| `hours_day`, `hours_today` | Wednesday, 7:30 AM–7 PM |
| `open_status` | Open · Closes 7 PM |
| `place_id` | ChIJZStJ7KFRqEcRzRngO3uVeHI |
| `cid`, `feature_id`, `knowledge_graph_id` | 8248507074047121869, 0x…:0x…, /g/11kqg6mzsg |
| `google_maps_url`, `reviews_url` | direct links |

`place_id` and `cid` are the canonical Google identifiers — use them to join
against the Places API, deduplicate against your CRM, or pull reviews.

### Two ways to aim it

**Name the place in the query** — simplest, works on its own:

```json
{ "searchQueries": ["coffee in Berlin", "dentists in Austin TX"] }
```

**Or search an exact area** with a plain term plus coordinates. The same query
returns completely different businesses depending on where you point it:

```json
{
  "searchQueries": ["sushi"],
  "latitude": "35.6762",
  "longitude": "139.6503",
  "searchAreaMeters": 20000
}
```

That makes grid searching easy — walk a list of coordinates over a city to get
far past the ~120 results a single search returns.

### Options

| Option | What it does |
| --- | --- |
| **Max results per query** | Businesses per query, collected 40 per request. |
| **Search area size** | How wide an area to cover around the coordinates, in metres. |
| **Language** | `en`, `de`, `fr`, `es` … changes category names and hours text. |
| **Country** | Two-letter code to search from, e.g. `us`, `de`, `gb`. |
| **Proxy** | Recommended. Google rate limits repeated searches from one IP. |

### Notes

- Google returns roughly 100–120 results per search before it runs out. For more
  coverage, split the area into a coordinate grid or use narrower queries.
- Review **counts** are not part of this payload — Google omits them from the
  search response. Ratings are included.
- Opening hours cover **today only**. Google's search response carries just the
  current day; a full weekly schedule is not available from this endpoint.
- Only publicly visible listing data is read; no login and no account are used.
- Runs stop cleanly before the platform timeout and keep everything collected so
  far, rather than failing.

### Pricing

Pay per result: one `place` event per business returned.

### Support

Found a field that stopped populating, or a query that returns nothing? Open an
issue on the Actor's page and include the input you used.

# Actor input Schema

## `searchQueries` (type: `array`):

What to search for. Name the place in the query, e.g. coffee in Berlin or dentists in Austin TX. You can also use a plain term like coffee and set the latitude and longitude below to choose the area.

## `maxResultsPerQuery` (type: `integer`):

How many businesses to collect for each query, 40 per request. Google returns roughly 100-120 results for most searches before it runs out.

## `latitude` (type: `string`):

Optional. Centre of the search area, e.g. 52.520008. Only needed when the query does not name a place. Leave both coordinates empty to let the query decide.

## `longitude` (type: `string`):

Optional. Centre of the search area, e.g. 13.404954. Use together with latitude.

## `searchAreaMeters` (type: `integer`):

Roughly how wide an area to cover around the coordinates, in metres. Larger values spread results over a wider region.

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

Two-letter language code for the results, e.g. en, de, fr, es. Affects category names and opening-hours text.

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

Optional two-letter country code to search from, e.g. us, de, gb. Influences which results Google considers local.

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

Recommended for larger runs. Google rate limits repeated searches from one IP; a proxy keeps long runs going.

## Actor input object example

```json
{
  "searchQueries": [
    "coffee in Berlin",
    "dentists in Austin TX"
  ],
  "maxResultsPerQuery": 60,
  "searchAreaMeters": 20000,
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `places` (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 = {
    "searchQueries": [
        "coffee in Berlin",
        "dentists in Austin TX"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("straightforward_hydra/google-maps-search-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 = { "searchQueries": [
        "coffee in Berlin",
        "dentists in Austin TX",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("straightforward_hydra/google-maps-search-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 '{
  "searchQueries": [
    "coffee in Berlin",
    "dentists in Austin TX"
  ]
}' |
apify call straightforward_hydra/google-maps-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,straightforward_hydra/google-maps-search-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/8MoIGhdLqaMbktIRJ/builds/Wsh2nCpFBcmBn7Va6/openapi.json
