# Google Maps Business Profiles Dataset (`xmiso_scrapers/google-maps-dataset`) Actor

100M+ Google maps business profiles updated monthly. No need to waste your money on google maps scrapers anymore. Starting from just $0.10/1000 rows, at least 10x cheaper than Bright Data and other providers. Choose and pay only for data columns you really need.

- **URL**: https://apify.com/xmiso_scrapers/google-maps-dataset.md
- **Developed by:** [Miso](https://apify.com/xmiso_scrapers) (community)
- **Stats:** 6 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.10 / 1,000 google place ids

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 Dataset

Export Google Maps business records from an existing dataset. Filter by country, business category, category keyword, city, and US state, then choose the columns you want to receive.

Every result includes a Google Place ID. Optional columns are charged only when they contain a value: **NULL, empty strings, and whitespace-only values are not charged.**

### What this Actor does

- Exports business locations with names, addresses, phone numbers, websites, coordinates, ratings, and categories.
- Lets you select output columns individually.
- Filters records before applying your starting row and result limit.
- Supports exports of up to 1,000,000 businesses per run, subject to available matching records and your run budget.
- Retrieves data in batches of up to 10,000 records.
- Identifies records by Google Place ID. Locations sharing a name, phone number, or website remain separate records when their Place IDs differ.
- Provides data comparable to Brightdata.com etc datasets at fraction of their price. Eg Bright Data Dataset is about 15x more expensive.

This Actor reads stored data; it does not perform a fresh Google Maps scrape for each run. Field availability and freshness depend on the source dataset. Email addresses and contact-person enrichment are not included.

### Quick start

1. Select one country.
2. Optionally select a category or enter a category keyword, city, or US state.
3. Choose your output columns. Select at least one column in addition to the mandatory Google Place ID.
4. Set the maximum number of results and, optionally, a starting row.
5. Review the Actor's current pricing and your maximum run budget, then start the run.

Results are saved to the run's dataset. The Results output links to the dataset items.

### Search and export inputs

| Input | Required / default | Description |
| --- | --- | --- |
| `country` | Required | One supported ISO country code, such as `US` or `GB`. Multiple countries and `ALL` are not supported. |
| `category` | Optional | Select an exact business category, such as `bakery`. The form initially suggests `bakery`; clear it to export without a category restriction. |
| `keyword` | Optional | Searches within business category names, such as `hvac` or `teeth whitening`. Overrides `category` when supplied. It does not search business names or addresses. |
| `city` | Optional | City name or prefix. For example, `San` matches city names beginning with `San`. |
| `state` | `All` | US state code, such as `CA`. Use `All` for no state restriction and for countries other than the US. |
| `max_results` | `100` | Maximum businesses to deliver after the starting position. Integer from 1 to 1,000,000. |
| `start_from_row` | `1` | One-based starting position within the filtered results. `10001` skips the first 10,000 matches. Skipped rows are not charged. |

Country, city, state, and the effective category filter are applied together. Category keyword matching is a substring search; spaces are normalized to underscores to match stored category names. If both `category` and `keyword` are empty or omitted, there is no category restriction.

#### Supported countries

United States (`US`), United Kingdom (`GB`), United Arab Emirates (`AE`), Argentina (`AR`), Austria (`AT`), Australia (`AU`), Belgium (`BE`), Brazil (`BR`), Canada (`CA`), Spain (`ES`), France (`FR`), Ireland (`IE`), India (`IN`), Italy (`IT`), Japan (`JP`), South Korea (`KR`), Mexico (`MX`), Netherlands (`NL`), Poland (`PL`), Saudi Arabia (`SA`), Sweden (`SE`), Thailand (`TH`), Turkey (`TR`), Denmark (`DK`), Norway (`NO`), Finland (`FI`), Portugal (`PT`), Germany (`DE`), Switzerland (`CH`), Bulgaria (`BG`), Czechia (`CZ`), Slovakia (`SK`), Hong Kong (`HK`), Indonesia (`ID`), and Israel (`IL`).

### Output columns

`google_place_id` is always included and charged for each delivered business. It has no selection checkbox.

Every optional field has a corresponding boolean input. Set it to `true` to include the field or `false` to exclude it.

| Input | Output field | Default | Contents |
| --- | --- | --- | --- |
| `include_name` | `name` | `true` | Business name |
| `include_street` | `street` | `true` | Street address |
| `include_city` | `city` | `true` | City |
| `include_state` | `state` | `false` | US state; NULL outside the US |
| `include_phone` | `phone` | `true` | Phone number |
| `include_url` | `url` | `true` | Business website URL |
| `include_google_maps_url` | `google_maps_url` | `false` | Google Maps link in `https://www.google.com/maps?cid=...` format |
| `include_lat` | `lat` | `false` | Latitude |
| `include_lon` | `lon` | `false` | Longitude |
| `include_review_score` | `review_score` | `false` | Review rating |
| `include_reviews_number` | `reviews_number` | `false` | Number of reviews |
| `include_google_business_categories` | `google_business_categories` | `false` | Category text from the source dataset |

Only selected optional fields are exported. Selected fields with missing values remain in the output, but are not charged. Numeric fields may be returned as numbers or numeric strings, depending on the source data. Category text is returned as stored, rather than converted into an array.

When sending JSON input, explicitly set unwanted default-enabled columns to `false`. Omitting `include_phone`, for example, leaves phone enabled by default.

### Example input

Export up to 10,000 US businesses, starting at the millionth matching record, with only their names and categories alongside their mandatory Place IDs:

```json
{
  "country": "US",
  "keyword": "",
  "state": "All",
  "max_results": 10000,
  "start_from_row": 1000000,
  "include_name": true,
  "include_street": false,
  "include_city": false,
  "include_state": false,
  "include_phone": false,
  "include_url": false,
  "include_google_maps_url": false,
  "include_lat": false,
  "include_lon": false,
  "include_review_score": false,
  "include_reviews_number": false,
  "include_google_business_categories": true
}
```

To restrict this example to bakeries, set `category` to `bakery`. To search across category names instead, set `keyword` to your search text.

### Example output

Illustrative records for the selection above:

```json
[
  {
    "google_place_id": "EXAMPLE_PLACE_ID_1",
    "name": "Example Bakery",
    "google_business_categories": "bakery"
  },
  {
    "google_place_id": "EXAMPLE_PLACE_ID_2",
    "name": "Example Business",
    "google_business_categories": null
  }
]
```

The first record incurs a Place ID event, a name event, and a categories event. The second incurs only the Place ID and name events because its categories value is NULL.

### Pricing: pay for populated columns

Each column has its own pricing event. For each delivered batch:

- Google Place ID is charged once per delivered business.
- Each selected optional column is charged once per populated value.
- NULL, empty strings (`""`), and strings containing only whitespace are not charged.
- Numeric zero (`0` or `0.0`) is a valid value and is charged.
- Unselected columns and skipped rows are not charged.

For example, a batch of 1,000 businesses with name and phone selected might contain 1,000 names and 600 phone numbers. That produces:

| Event | Count |
| --- | ---: |
| `column-google-place-id` | 1,000 |
| `column-name` | 1,000 |
| `column-phone` | 600 |
| **Total column events** | **2,600** |

At an illustrative rate of **$0.05 per 1,000 values for each column**, those column events cost **$0.13**. This is an example, not a guaranteed current price. See the Actor's Pricing section for actual event rates and any other applicable charges.

The Actor checks the remaining run budget using the populated values in each batch. If the budget cannot cover the next complete record with its selected populated fields, it stops before delivering that record. It does not skip that record to deliver cheaper records later in the sequence.

### Starting position and result order

Results are ordered by first discovery date, oldest first, then by Google Place ID. `start_from_row` applies **after your filters**.

For example, `start_from_row: 10001` with `max_results: 5000` requests matching positions 10,001 through 15,000, if enough results and budget are available.

Large starting positions may take longer because the database must skip preceding matches. If the starting position exceeds the available matches, the run returns no records.

To split an export across runs, keep the same filters and advance the starting position by the number of records actually delivered. This assumes the underlying dataset stays unchanged: source updates can shift positions between runs, so separate runs are not a frozen snapshot.

### Common questions

#### Why did I receive fewer records than requested?

`max_results` is an upper limit. There may be fewer matching records after your starting position, or the run may reach its budget limit.

#### Can I export only Google Place IDs?

No. Select at least one additional output column. Google Place ID is always included and charged.

#### Does selecting phone or website exclude businesses without that field?

No. Column selection controls the output, not record eligibility. Missing selected values remain in the output and are not charged.

#### Can I search for a business by name?

The `keyword` input searches category names only. Business-name search is not available.

#### Do businesses sharing a website get merged?

No. Records are identified by Google Place ID, so separate locations may share a website, phone number, or business name.

#### Can I get emails or contact-person details?

This Actor exports the listed Google Maps fields only. It does not provide email or contact-person enrichment.

# Changelog

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

# Actor input Schema

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

Select a business category. A keyword search overrides this selection.

## `keyword` (type: `string`):

Search for text within business category names, e.g. teeth whitening or hvac. Overrides the category dropdown.

## `country` (type: `string`):

Required. Select exactly one country.

## `state` (type: `string`):

US state filter. Select All when the selected country is not US.

## `city` (type: `string`):

Optional city prefix, e.g. New York or Wash.

## `include_name` (type: `boolean`):

Include name in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_street` (type: `boolean`):

Include street in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_city` (type: `boolean`):

Include city in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_state` (type: `boolean`):

Include state in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. Available for US businesses; NULL for other countries. See current Actor pricing.

## `include_phone` (type: `boolean`):

Include phone in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_url` (type: `boolean`):

Include url in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_google_maps_url` (type: `boolean`):

Include a Google Maps CID link. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `include_lat` (type: `boolean`):

Include lat in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. A numeric value of 0 is charged. See current Actor pricing.

## `include_lon` (type: `boolean`):

Include lon in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. A numeric value of 0 is charged. See current Actor pricing.

## `include_review_score` (type: `boolean`):

Include review_score in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. A numeric value of 0 is charged. See current Actor pricing.

## `include_reviews_number` (type: `boolean`):

Include reviews_number in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. A numeric value of 0 is charged. See current Actor pricing.

## `include_google_business_categories` (type: `boolean`):

Include google_business_categories in the export. Charged separately per non-empty value. NULL, empty, and whitespace-only values are not charged. See current Actor pricing.

## `max_results` (type: `integer`):

Maximum businesses to deliver after the starting row. Skipped rows are not charged.

## `start_from_row` (type: `integer`):

1 = start from the beginning; 10001 = skip the first 10000 matching businesses. Ordered by discovery date, oldest first, then Google Place ID. Skipped rows are not charged. Large starting positions may take longer.

## Actor input object example

```json
{
  "category": "bakery",
  "country": "US",
  "state": "All",
  "include_name": true,
  "include_street": true,
  "include_city": true,
  "include_state": false,
  "include_phone": true,
  "include_url": true,
  "include_google_maps_url": false,
  "include_lat": false,
  "include_lon": false,
  "include_review_score": false,
  "include_reviews_number": false,
  "include_google_business_categories": false,
  "max_results": 100,
  "start_from_row": 1
}
```

# Actor output Schema

## `results` (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 = {
    "category": "bakery",
    "keyword": "",
    "country": "US",
    "state": "All",
    "city": "",
    "include_name": true,
    "include_street": true,
    "include_city": true,
    "include_state": false,
    "include_phone": true,
    "include_url": true,
    "include_google_maps_url": false,
    "include_lat": false,
    "include_lon": false,
    "include_review_score": false,
    "include_reviews_number": false,
    "include_google_business_categories": false,
    "max_results": 100,
    "start_from_row": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("xmiso_scrapers/google-maps-dataset").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 = {
    "category": "bakery",
    "keyword": "",
    "country": "US",
    "state": "All",
    "city": "",
    "include_name": True,
    "include_street": True,
    "include_city": True,
    "include_state": False,
    "include_phone": True,
    "include_url": True,
    "include_google_maps_url": False,
    "include_lat": False,
    "include_lon": False,
    "include_review_score": False,
    "include_reviews_number": False,
    "include_google_business_categories": False,
    "max_results": 100,
    "start_from_row": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("xmiso_scrapers/google-maps-dataset").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 '{
  "category": "bakery",
  "keyword": "",
  "country": "US",
  "state": "All",
  "city": "",
  "include_name": true,
  "include_street": true,
  "include_city": true,
  "include_state": false,
  "include_phone": true,
  "include_url": true,
  "include_google_maps_url": false,
  "include_lat": false,
  "include_lon": false,
  "include_review_score": false,
  "include_reviews_number": false,
  "include_google_business_categories": false,
  "max_results": 100,
  "start_from_row": 1
}' |
apify call xmiso_scrapers/google-maps-dataset --silent --output-dataset

```

## MCP server setup

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

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/Nlb1Z0kjaUGgVp8JG/builds/zl77uabRSK4XFhkaX/openapi.json
