# Google Maps Business Categories Scraper (`googleapi/google-maps-business-categories-scraper`) Actor

Run bounded public Google Maps page metadata extraction and heuristic signals for Google Maps Business Categories Scraper.

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

## Pricing

from $3.99 / 1,000 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

Find businesses on Google Maps and collect the category labels shown on their public listings. Optionally open selected business profiles to collect additional details such as contact information, hours, price, photos, and About-panel attributes.

The Actor uses only category labels Google displays; it does not infer categories from the search phrase. Each dataset row represents one unique business.

### Quick start

```json
{
  "queries": ["coffee shops in Seattle"],
  "locationQuery": "Seattle, WA",
  "maxItems": 10,
  "page": 1,
  "maxPages": 2,
  "categoryTerms": ["Coffee Shop"],
  "includeDetails": true
}
```

### Input

#### Searches

| Input | Description |
| --- | --- |
| **queries** | Search phrases (default: coffee shops). **searchStringsArray** and **searchKeywords** are aliases; **searchQuery** accepts one phrase. |
| **startUrls** | Public Google Maps search or place URLs. When provided, these replace generated searches. **urls** is an alias. |
| **locationQuery** | Optional location added to generated searches; ignored when start URLs are supplied. |

#### Results and details

| Input | Description |
| --- | --- |
| **maxItems** | Maximum unique business records across all sources (default 25). **maxCrawledPlacesPerSearch** is a legacy alias. |
| **page / maxPages** | Starting result batch and maximum batches to inspect per search (defaults: 1 and 3). Maps uses an infinite-scroll feed rather than numbered result pages. |
| **deduplicate** | Remove repeated businesses across result batches and input sources (default true). |
| **categoryTerms** | Keep records whose visible Maps category contains one of these phrases. The search phrase itself is never used as a category. |
| **includeDetails** | Open selected public place profiles for contact information, hours, price, and business attributes (default false). |
| **maxDetailItems** | Maximum number of search-result businesses to open (default 5). |
| **includeMedia** | Include public photo URLs visible on result cards (default true). |

#### Page settings

| Input | Description |
| --- | --- |
| **renderJavaScript** | Render dynamic Google Maps pages in a standard browser (default true). **useBrowser** is a compatibility alias; if both are set, they must agree. |
| **proxyConfiguration** | Optional Apify proxy settings for rendered browsing. |
| **locale** | Language preference such as en or en-US. **language** is a compatibility alias. |

### Dataset

Each row includes the business name, its visible Maps category labels, and canonical Maps URL. When available, the dataset also includes:

- **Place identity:** place ID, CID, feature ID, and Knowledge Graph ID.
- **Location and contact:** address, venue, Plus Code, coordinates, phone, and website.
- **Business details:** description, current status, weekly hours, price, service options, and accessibility attributes.
- **Ratings:** displayed star rating, review count, rating distribution, and aggregate review topics.
- **Links and photos:** menu, ordering, reservation and booking links, plus public business photos.

Review fields are business-level aggregates. Individual reviewer identities, review text, and reviewer media are not collected. Only details visible on the public result or matching profile are included.

```json
{
  "placeId": "ChIJexamplePlaceId",
  "businessName": "Harbor Coffee",
  "title": "Harbor Coffee",
  "categoryName": "Coffee shop",
  "categories": ["Coffee shop", "Cafe"],
  "canonicalUrl": "https://www.google.com/maps/place/Harbor+Coffee/",
  "address": "10 Example Street, Seattle, WA 98101, United States",
  "phone": "+1 206-555-0100",
  "website": "https://harbor-coffee.example/",
  "totalScore": 4.7,
  "reviewsCount": 314,
  "currentStatus": "Open · Closes 6 pm",
  "isOpen": true
}
```

The example is illustrative. Details vary between businesses. Download the dataset from the Apify run page in JSON, CSV, Excel, or another supported format. Run totals and access outcomes appear in the run output.

### Limits and troubleshooting

Google Maps may show different listings and details by area, query, language, and time. Profile information is available only when **includeDetails** is enabled. If a run returns no businesses or fewer than expected, check the run log and summary for empty results, page failures, or access boundaries.

The Actor uses public Maps pages and does not bypass CAPTCHAs or other access controls. A proxy does not guarantee additional results.

### Privacy

The Actor sends search phrases, location settings, or supplied public Maps URLs to Google Maps. Avoid submitting sensitive information. This independent Actor is not affiliated with Google.

# Actor input Schema

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

Public Google Maps search phrases. Defaults to coffee shops when no query or URL is supplied.

## `searchStringsArray` (type: `array`):

Compatibility alias for queries.

## `searchKeywords` (type: `array`):

Compatibility alias for queries.

## `searchQuery` (type: `string`):

Compatibility alias for one query.

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

Public Google Maps search or place URLs. When supplied, these replace generated search URLs.

## `urls` (type: `array`):

Compatibility alias for startUrls; accepts public Google Maps search or place URLs.

## `locationQuery` (type: `string`):

Optional location appended to each generated search query.

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

Global maximum number of unique business records across all sources.

## `maxCrawledPlacesPerSearch` (type: `integer`):

Compatibility alias for maxItems.

## `page` (type: `integer`):

One-based rendered Maps result batch to start collecting from. Earlier batches are scrolled past but not emitted.

## `maxPages` (type: `integer`):

Maximum rendered result batches per source, starting at page. This is bounded infinite-scroll pagination, not a Google page number.

## `deduplicate` (type: `boolean`):

Remove repeated businesses across result batches and input sources using the public place ID.

## `categoryTerms` (type: `array`):

Keep records whose visible Google Maps category label contains one of these phrases. Search text is never treated as a category.

## `includeDetails` (type: `boolean`):

Open a bounded number of same-site Google Maps place pages to collect public contact, hours, price, and grouped business attributes. Disabled by default.

## `maxDetailItems` (type: `integer`):

Maximum number of search-result businesses to open when includeDetails is enabled. Direct place URLs are parsed as the requested target page.

## `includeMedia` (type: `boolean`):

Include filtered public Maps photo URLs visible on result cards.

## `renderJavaScript` (type: `boolean`):

Use regular headless Chrome rendering for dynamic Google Maps result feeds. Disable only when the public HTTP response contains the requested page data.

## `useBrowser` (type: `boolean`):

Compatibility alias for renderJavaScript. If both are supplied they must agree.

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

Bounded pause between result batches and detail-page navigations.

## `maxRequestRetries` (type: `integer`):

Maximum retries for direct HTTP requests when browser rendering is disabled.

## `requestTimeoutSecs` (type: `integer`):

Maximum duration for each public page navigation or HTTP request.

## `requestTimeoutMs` (type: `integer`):

Compatibility alias for requestTimeoutSecs. If both are supplied they must agree.

## `maxResponseBytes` (type: `integer`):

Maximum HTML body size considered in direct HTTP mode.

## `browserWaitMs` (type: `integer`):

Bounded wait after navigation and public page interactions before extraction.

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

Optional Apify Proxy configuration used by the rendered browser. It is not supported in direct HTTP mode.

## `userAgent` (type: `string`):

Optional ordinary browser/HTTP user agent. No stealth settings or fingerprint evasion are applied.

## `locale` (type: `string`):

Short locale such as en or en-US, passed as an ordinary Accept-Language preference.

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

Compatibility alias for locale. If both are supplied they must agree.

## Actor input object example

```json
{
  "queries": [
    "coffee shops"
  ],
  "maxItems": 25,
  "page": 1,
  "maxPages": 3,
  "deduplicate": true,
  "includeDetails": false,
  "maxDetailItems": 5,
  "includeMedia": true,
  "renderJavaScript": true,
  "requestDelayMs": 750,
  "maxRequestRetries": 1,
  "requestTimeoutSecs": 60,
  "maxResponseBytes": 5000000,
  "browserWaitMs": 1500
}
```

# Actor output Schema

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

No description

## `runSummary` (type: `string`):

No description

## `runHealth` (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("googleapi/google-maps-business-categories-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("googleapi/google-maps-business-categories-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 googleapi/google-maps-business-categories-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,googleapi/google-maps-business-categories-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/OUMCpl5lR2KwpgIgy/builds/7d6Hc15EsA8hP2cLE/openapi.json
