# Google Maps Category Scraper (`rainminer/google-maps-category-scraper`) Actor

Scrape ranked businesses from Google Maps category pills (Restaurants, Hotels, Museums, and more) for any map viewport. Export rank, Place IDs, ratings, addresses, and images—ideal for local SEO, category visibility audits, and competitor monitoring. No login required.

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

## Pricing

from $1.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?

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

When someone opens **Google Maps** on the web or in the app, the **category pills** at the top—Restaurants, Hotels, Things to do, Museums, Transit, Pharmacies, ATMs, and more—load a **ranked shortlist** of businesses for the current map area. Whether your location appears in that list (and where it ranks) is a core signal for **local visibility** and **category SEO**.

This Apify Actor reproduces those pill results on [Apify](https://apify.com/rainminer/google-maps-category-scraper?fpr=uuazcu): pick **categories** from the input dropdown (or paste a **category search URL** from Maps), set the map center, and get structured rows with **rank**, ratings, addresses, and Google Place IDs—ideal for monitoring performance across neighborhoods, cities, or competitors.

![Google Maps category pills on the map](https://upload.wikimedia.org/wikipedia/commons/thumb/8/8a/Google_Maps_icon_%282020%29.svg/240px-Google_Maps_icon_%282020%29.svg.png)

***

### Key features

- **Category pill parity** — Uses the same category slug as the Maps UI (`Restaurants`, `Hotels`, …).
- **Geo-targeted** — Center the search on any `@latitude,longitude,zoom` viewport.
- **Ranked output** — Each row includes `rank` (1 = top of the list).
- **Track your locations** — Optional `trackPlaceIds` flags your Place IDs and logs their rank when they appear.
- **Batch-friendly** — Multiple category URLs or `searches` entries in one run.
- **Dataset-ready** — Export to JSON, CSV, Excel, or wire runs via API and schedules on Apify.

***

### Use cases

1. **Category rank audits** — see who owns the Restaurants or Hotels pill for a neighborhood
2. **Client GBP reporting** — prove whether a location appears in the shortlist users tap first
3. **Competitor benchmarking** — export top 20–120 rivals with Place IDs and ratings
4. **Multi-location brands** — compare category visibility around each store coordinate
5. **Agency pitch decks** — ranked tables + thumbnails from the dataset overview
6. **Scheduled monitoring** — weekly runs when rankings drift after Google updates
7. **Hospitality research** — Hotels vs Restaurants density for a tourist zone
8. **Franchise expansion** — scout categories where incumbents are weak in the top 10
9. **Citation & review follow-up** — send `placeId` rows to [Google Maps Place Reviews Scraper](https://apify.com/rainminer/google-maps-place-reviews-scraper?fpr=uuazcu)
10. **Geo-grid complement** — pair with [Google Maps Local SEO Grid Scraper](https://apify.com/rainminer/google-maps-local-seo-grid-scraper?fpr=uuazcu) for keyword grids vs category pills

***

### Who is it for?

- **Local SEO and GEO teams** checking category visibility by area
- **Multi-location brands** comparing Restaurants vs Hotels rankings near each store
- **Agencies** reporting whether clients appear in Maps category shortlists
- **Analysts** building time-series monitors (schedule weekly runs per map center)

***

### Input

Provide **`categories` + map center**, and/or **`startUrls`**.

#### Categories dropdown

Pick one or more pills (Restaurants, Hotels, Museums, …) and set the map center—the same `@latitude,longitude,zoom` you see in Maps:

```json
{
  "categories": ["Restaurants", "Hotels"],
  "latitude": 42.6574441,
  "longitude": 23.3498259,
  "zoom": 15,
  "maxItems": 20,
  "trackPlaceIds": ["ChIJAXxQnDyEqkARCbXRTgezCg0"]
}
```

#### Category search URLs (`startUrls`)

Optional: after you click a pill in Google Maps, copy the browser URL instead of using the dropdown:

```text
https://www.google.com/maps/search/Restaurants/@42.6574441,23.3498259,15z
https://www.google.com/maps/search/Hotels/@42.6574441,23.3498259,15z
```

| Field | Description |
| --- | --- |
| `categories` | Multiselect of Maps category pills |
| `latitude` / `longitude` / `zoom` | Map viewport center (required with `categories`) |
| `startUrls` | Maps `/maps/search/<category>/@lat,lng,zoom` URLs |
| `maxItems` | Max listings per search (default **20**, up to **120**) |
| `trackPlaceIds` | Optional `ChIJ…` IDs to mark `isTracked` and log rank |
| `language` | UI language (default `en`) |
| `proxyConfiguration` | Proxies if needed (default: no Apify Proxy) |

***

### Output

One dataset row per business in the category list:

```json
{
  "rank": 1,
  "category": "Restaurants",
  "searchLatitude": 42.6574441,
  "searchLongitude": 23.3498259,
  "searchZoom": 15,
  "categorySearchUrl": "https://www.google.com/maps/search/Restaurants/@42.6574441,23.3498259,15z",
  "title": "Milano Resto Club",
  "placeId": "ChIJAXxQnDyEqkARCbXRTgezCg0",
  "featureId": "0x40aa843c9c507c01:0xd0ab3074ed1b509",
  "categories": ["Restaurant"],
  "neighborhood": "Studentski Kompleks",
  "address": "Milano Resto Club, 8, Комплекс, ulitsa \"Doctor Yordan Yosifov\" Студентски, 1700 Sofia, Bulgaria",
  "rating": 4.3,
  "reviewsCount": 1715,
  "latitude": 42.6538143,
  "longitude": 23.3443222,
  "website": "milanorestoclub.com",
  "imageUrl": "https://lh6.googleusercontent.com/...",
  "url": "https://www.google.com/maps/search/?api=1&query=Milano%20Resto%20Club&query_place_id=ChIJAXxQnDyEqkARCbXRTgezCg0",
  "isTracked": false,
  "scrapedAt": "2026-09-29T12:00:00.000Z"
}
```

| Field | Description |
| --- | --- |
| `rank` | Position in the category list for that map area |
| `category` | Pill label (e.g. `Restaurants`) |
| `categorySearchUrl` | Maps URL for this category + viewport |
| `isTracked` | `true` when `placeId` is in `trackPlaceIds` |
| `url` | Google Maps link for the place |

***

### Typical workflows

1. **Grid monitoring** — Run separate searches for each neighborhood center (change `@lat,lng` or `searches`).
2. **Category comparison** — Same coordinates, different pills (`Restaurants` vs `Hotels`).
3. **Client reporting** — Put client Place IDs in `trackPlaceIds` and schedule weekly runs.
4. **Pair with review scraping** — Feed `placeId` values into [Google Maps Place Reviews Scraper](https://apify.com/rainminer/google-maps-place-reviews-scraper) for reputation depth.

***

### Limitations

- Results reflect **Google’s public category list** for the given viewport; rankings change with location, zoom, language, and personalization.
- Very high `maxItems` values request more rows in one call but may still be capped by Google.
- `reviewsCount` may be empty when Google returns a compact listing payload.
- This Actor does **not** log into Google accounts; only public listings are returned.

***

### How much does it cost?

Pricing is **pay-per-event**: a small **Actor start** fee plus one charge per **result row** in the dataset (each ranked business). See current tier prices on the [Apify Store page](https://apify.com/rainminer/google-maps-category-scraper?fpr=uuazcu). Platform usage is included at listed result rates for typical runs.

***

### Image Credit

Image credit: [Google Maps](https://www.google.com/maps/)

# Actor input Schema

## `startUrls` (type: `array`):

Optional. Copy from Google Maps after clicking a category pill: /maps/search/<category>/@latitude,longitude,zoom

## `categories` (type: `array`):

Google Maps category pills to scrape for the map center below. Select one or more.

## `latitude` (type: `number`):

Latitude from the Maps URL (@lat,lng,zoom). Required when using categories.

## `longitude` (type: `number`):

Longitude from the Maps URL. Required when using categories.

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

Zoom level from the Maps URL (the number before z, e.g. 15z).

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

Maximum ranked places to return per category/area (up to 120).

## `trackPlaceIds` (type: `array`):

Optional Google Place IDs (ChIJ…) to flag in results and log their category rank when they appear in the listing.

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

Maps UI language code (e.g. en, de, bg).

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

Use proxies if Google blocks datacenter IPs in your region.

## Actor input object example

```json
{
  "startUrls": [],
  "categories": [
    "Restaurants"
  ],
  "latitude": 42.6574441,
  "longitude": 23.3498259,
  "zoom": 15,
  "maxItems": 5,
  "trackPlaceIds": [],
  "language": "en",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [],
    "categories": [
        "Restaurants"
    ],
    "latitude": 42.6574441,
    "longitude": 23.3498259,
    "zoom": 15,
    "trackPlaceIds": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("rainminer/google-maps-category-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 = {
    "startUrls": [],
    "categories": ["Restaurants"],
    "latitude": 42.6574441,
    "longitude": 23.3498259,
    "zoom": 15,
    "trackPlaceIds": [],
}

# Run the Actor and wait for it to finish
run = client.actor("rainminer/google-maps-category-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 '{
  "startUrls": [],
  "categories": [
    "Restaurants"
  ],
  "latitude": 42.6574441,
  "longitude": 23.3498259,
  "zoom": 15,
  "trackPlaceIds": []
}' |
apify call rainminer/google-maps-category-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rainminer/google-maps-category-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/wnDUMZATA7QVEXMqj/builds/SGNUCdEnZ0S8il3Me/openapi.json
