# Google Maps Similar Places Scraper (`searchapi/google-maps-similar-places`) Actor

Find a public source place, derive its category, and collect same-category places near its requested location from Google Maps.

- **URL**: https://apify.com/searchapi/google-maps-similar-places.md
- **Developed by:** [Search API](https://apify.com/searchapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Find a public source place by name and location, then collect the public Google Maps “People also search for” places shown on its detail page. Each row keeps the source place, rendered relation section, related place identity, contact details, ratings, review counts, image URLs, and scrape provenance.

Google Maps does not render that section for every place or locale. When it is absent, the Actor uses an explicit `<category> near <location>` fallback and labels those rows `same-category-near-source-location`; it never relabels arbitrary fallback results as Google recommendations.

### Input

| Field | Default | Description |
| --- | --- | --- |
| `query` | Joe Coffee Company Brooklyn Heights | Source business or place entered in the Google Maps search box. |
| `location` | Brooklyn, NY | City, neighborhood, address, or region used for source and nearby searches. |
| `category` | — | Optional category override when Maps does not expose one or a specific comparison category is wanted. |
| `countryCode` | `US` | Google country code. |
| `language` | `en` | Maps interface language. |
| `timezone` | `America/New_York` | Browser time zone aligned to the search location. |
| `maxItems` | `10` | Hard similar-place record cap. |
| `scrollRounds` | `5` | Maximum result-feed scrolls. |
| `maxConcurrency` | `2` | Simultaneous candidate detail pages. |
| `navigationTimeoutSecs` | `60` | Per-page timeout. |
| `requestDelayMs` | `700` | Polite interaction delay. |
| `useApifyProxy` | `false` | Use authorized Apify Proxy resources. |
| `proxyGroups`, `proxyCountryCode`, `proxyUrls` | — | Optional proxy controls; credentials are never logged or stored. |

The Actor opens Google Maps, fills the visible search box with the source query and location, selects the first public source place, scrolls its detail panel so the related section can load, and enriches the bounded related places from their public detail panels. If the related section is unavailable, it derives the source category, searches `<category> near <location>`, removes the source place and duplicates, and records the fallback mode explicitly.

```json
{
  "query": "Joe Coffee Company Brooklyn Heights",
  "location": "Brooklyn, NY",
  "countryCode": "US",
  "language": "en",
  "timezone": "America/New_York",
  "maxItems": 5
}
```

### Output

Records contain 20 or more populated fields in the live sample: related place identity and rank, category, address, coordinates, rating, review count, price, status, description, phone, website, plus code, image URLs, exact source-place metadata, relation mode, source page, locale, extraction method, and scrape timestamp. Optional values are omitted rather than fabricated. Raw page text, response bodies, cookies, proxy details, and internal transport objects are never stored.

```json
{
  "id": "ChIJexample",
  "placeId": "ChIJexample",
  "name": "Example Coffee",
  "url": "https://www.google.com/maps/place/Example+Coffee/...",
  "category": "Coffee shop",
  "address": "Brooklyn, NY",
  "latitude": 40.7,
  "longitude": -73.9,
  "rating": 4.7,
  "reviewCount": 320,
  "rank": 1,
  "sourcePlaceName": "Joe Coffee Company: Brooklyn Heights",
  "sourcePlaceUrl": "https://www.google.com/maps/place/Joe+Coffee+Company/...",
  "sourceCategory": "Coffee shop",
  "searchQuery": "Coffee shop near Brooklyn, NY",
  "searchUrl": "https://www.google.com/maps/search/...",
  "requestedLocation": "Brooklyn, NY",
  "countryCode": "US",
  "language": "en",
  "searchMode": "people-also-search-for",
  "relatedSection": "People also search for",
  "relation": "people-also-search-for",
  "source": "Google Maps",
  "extractionMethod": "google-maps-rendered-dom",
  "scrapedAt": "2026-08-30T00:00:00.000Z"
}
```

Explicit no-results searches complete with an empty dataset and a `no-results` summary. Selector drift, blocked access, or an unavailable source category fails closed without fabricated records. Run `apify run`, then `npm test` and `npm run validate` for local verification.

# Changelog

This Actor's version history is a separate document: https://apify.com/searchapi/google-maps-similar-places/changelog.md

# Actor input Schema

## `query` (type: `string`):

Business or place name to enter into Google Maps search.

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

City, neighborhood, address, or region used to locate the source and nearby similar places.

## `category` (type: `string`):

Optional category used for the nearby similarity search when Maps does not expose one or a specific category is preferred.

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

Two-letter Google country code.

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

Google Maps interface language.

## `timezone` (type: `string`):

IANA time zone consistent with the requested location.

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

Hard emitted-record limit.

## `scrollRounds` (type: `integer`):

Maximum result-feed scrolls used to load candidates.

## `maxConcurrency` (type: `integer`):

Maximum simultaneous public place-detail pages.

## `navigationTimeoutSecs` (type: `integer`):

Per-page timeout in seconds.

## `requestDelayMs` (type: `integer`):

Delay between Maps interactions in milliseconds.

## `useApifyProxy` (type: `boolean`):

Route browser traffic through authorized Apify Proxy resources.

## `proxyGroups` (type: `array`):

Optional authorized Apify Proxy groups.

## `proxyCountryCode` (type: `string`):

Optional two-letter proxy country code.

## `proxyUrls` (type: `array`):

Optional proxy URLs; credentials are never logged or stored.

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

Backward-compatible proxy editor input; do not combine with modern proxy fields.

## `proxySessionId` (type: `string`):

Optional stable proxy-session ID.

## Actor input object example

```json
{
  "query": "Joe Coffee Company Brooklyn Heights",
  "location": "Brooklyn, NY",
  "countryCode": "US",
  "language": "en",
  "timezone": "America/New_York",
  "maxItems": 10,
  "scrollRounds": 5,
  "maxConcurrency": 2,
  "navigationTimeoutSecs": 60,
  "requestDelayMs": 700,
  "useApifyProxy": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `summary` (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("searchapi/google-maps-similar-places").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("searchapi/google-maps-similar-places").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 searchapi/google-maps-similar-places --silent --output-dataset

```

## MCP server setup

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

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/D4XgnktNaWGC0iyzx/builds/HDKcx3WqBJIteRRns/openapi.json
