Google Maps Scraper - US Places and Reviews avatar

Google Maps Scraper - US Places and Reviews

Pricing

from $1.80 / 1,000 results

Go to Apify Store
Google Maps Scraper - US Places and Reviews

Google Maps Scraper - US Places and Reviews

Collect US Google Maps business names, phones, addresses, websites, ratings and optional reviews. Export places and reviews as separate rows, billed per delivered row plus a start fee.

Pricing

from $1.80 / 1,000 results

Rating

0.0

(0)

Developer

kane liu

kane liu

Maintained by Community

Actor stats

1

Bookmarked

18

Total users

3

Monthly active users

a day ago

Last modified

Security

Limited permissions

Share

Google Maps Scraper

Collect US business names, phones, addresses, websites, ratings and optional reviews from Google Maps as rows you can export.

  • Find local businesses by category, business name and location.
  • Get contact details, opening hours and coordinates for CRM enrichment.
  • Search a map area with an optional bounding box.
  • Collect reviews as separate rows, linked to their business.
  • Export results or read them through the Apify API and MCP server.
  • Pay $1.80 per 1,000 delivered rows on every Apify plan, plus a small start fee.

What does Google Maps Scraper do?

Google Maps Scraper collects public place information from maps.google.com for the United States. Use it to build prospect lists, fill missing business details in a CRM, or collect snapshots for review monitoring. Each run accepts one search query, not a list of queries.

  • Search: enter searchQuery, such as coffee in Chicago. A business name plus its city can narrow an enrichment search; check the returned identity before updating your CRM.
  • Area search: add gridBbox to search within a US rectangle. This is an option on the same search, not a separate input mode.
  • Review rows: set includeReviews to true. Reviews are off by default; each review is a separate row billed at the same price as a place row.

What data can you extract from Google Maps?

Place rows

FieldDescriptionExample
rowTypeIdentifies a business row.place
nameBusiness name.Example Coffee Shop
place_idHexadecimal place identifier; links places and reviews.0x1234:0x5678
google_place_idGoogle place ID, when available.ChIJ...
categoryMain business category.Coffee shop
addressAddress shown for the business.123 Example St, Chicago, IL
addressPartsStreet, unit, city, region, postal code and country.{"unit":"100"}
phonePublished phone number.+1 312-555-0100
phonesPhone details, including normalized number when available.[{"value":"+1 312-555-0100","type":"unknown","e164":"+13125550100"}]
websitePublished website or social-page URL.https://example.com
webSeparates an independent website from social links.{"website":"https://example.com","socials":[]}
geoLatitude and longitude.{"lat":41.88,"lng":-87.63}
opening_hoursPublished opening hours by day.["Monday: 8 AM–6 PM"]
ratingAverage place rating; null when absent.4.5
review_countTotal review count shown by Google.120
price_rangeSpend-per-person range and votes, when shown.null
photosPlace photo URLs, when available.[]
is_contactableWhether a phone or website URL is present.true
missing_fieldsMissing phone, website or opening hours.["opening_hours"]
leadAbsencesExplanations for unavailable contact fields.{"emails":"Google Maps does not publish business email addresses"}

emails stays empty and person.name stays null: this Actor does not find business-owner emails or names. Phone type is unknown, not a verified mobile or landline classification. locatedIn is always null and located_in is always empty. Additional fields include categories, Plus Codes, popular times and detailed photos when available.

Review rows

FieldDescriptionExample
rowTypeIdentifies a review row.review
place_idIdentifier of the reviewed business.0x1234:0x5678
review_idReview identifier.example-review-id
reviewer_namePublic reviewer display name, not an owner contact.Jane Doe
ratingThis review's star rating.5
textReview text; empty for a rating without text.Friendly service.
relative_dateDate wording shown by Google.3 days ago
place_ratingBusiness average, not the individual review score.4.5
place_review_countBusiness total review count.120
photosPhotos attached to this review.[]

Review rows also carry the place name and location. Food, service and atmosphere scores are included when supplied. Count review rows sharing a place_id; review_count_scraped on the place row is null. Reviews are not nested inside place rows.

How to scrape Google Maps

  1. Open Google Maps Scraper in Apify Console. A free Apify account is enough to try it.
  2. Enter a US search in searchQuery.
  3. Set maxResults to 5 for a first run and leave reviews off.
  4. Click Start and wait for the run to finish.
  5. Open the dataset and download JSON, CSV or Excel, or read the rows through the API.

An empty input starts the example search coffee in Chicago, limited to 3 rows, with reviews off. This is a real, billable run, not a free preview. Filling searchQuery selects the search automatically; there is no mode selector to configure. Without an explicit row limit, a supplied query uses the default of 70 rows.

Search by category or business name

Use a category and city, such as dentists in Denver. For enrichment, use a specific business name and city. A single result is the first match, not a guarantee that it is the business you intended.

Search an area

Supply gridBbox as min_lat,min_lng,max_lat,max_lng. Keep the city out of searchQuery, for example use coffee. The rectangle is divided into at most 100 cells; cell size grows if necessary. Only places inside the rectangle are returned, and all cells share the same row limit.

Include reviews

Turn on includeReviews and set maxReviewsPerPlace. Reviews are requested newest first. Place rows and review rows share maxResults, so adding reviews can reduce the number of businesses returned. A small limit can be used entirely by one business and its reviews.

What to fill in

FieldWhat to enterDefault
searchQueryOne business search, normally including a US location.No default; empty input uses the example
maxResultsCombined place and review row limit, from 1 to 10,000.70; form prefill 3
includeReviewsWhether to collect separate review rows.false
maxReviewsPerPlaceReview limit per place, from 0 to 5,000; 0 means up to 500 available reviews, still within the row limit.0
languageGoogle language code, such as en, es or zh-TW; does not change the market.en
countryKeep the supported market, US.US
gridBboxOptional US rectangle as four comma-separated coordinates.Empty
gridCellSizeKmRequested cell size, from 0.1 to 10 km. Used only with a rectangle.1.0

Search:

{
"searchQuery": "coffee in Chicago",
"maxResults": 5
}

Area search:

{
"searchQuery": "coffee",
"gridBbox": "41.87,-87.65,41.90,-87.61",
"gridCellSizeKm": 1,
"maxResults": 5
}

Search with reviews:

{
"searchQuery": "restaurants in Chicago",
"maxResults": 5,
"includeReviews": true,
"maxReviewsPerPlace": 2
}
  • maxItems and limit are accepted aliases for maxResults. Search aliases include query, search, keyword, searchTerm and q; bbox and boundingBox mean gridBbox.
  • Unknown field names do not fail input resolution: close misspellings can be corrected, and other unknown fields are ignored with a note.
  • Unusable optional filters or row counts can be ignored with a warning and fall back to defaults. An unsupported country does not enable another market; input resolution discards it and the Actor uses US.
  • For JSON-object input, the INPUT_REPORT record in the run's key-value store records fields filled, renamed, corrected or ignored. INPUT_ECHO shows the settings used after limits are applied.
  • Input-resolution errors use INVALID_INPUT: <field> — <how to fix>. Other validation errors can have different wording. Validation failures stop collection without charging for rows; the start fee can still apply.

Output example

Illustrative place row with placeholder business details; actual rows can include more fields:

{
"rowType": "place",
"id": "0x1234:0x5678",
"place_id": "0x1234:0x5678",
"name": "Example Coffee Shop",
"category": "Coffee shop",
"address": "123 Example St, Chicago, IL 60601",
"phone": "+1 312-555-0100",
"website": "https://example.com",
"latitude": 41.88,
"longitude": -87.63,
"rating": 4.5,
"review_count": 120,
"opening_hours": [],
"emails": [],
"person": {"name": null, "role": null},
"is_contactable": true,
"missing_fields": ["opening_hours"],
"needs_enrichment": true,
"review_count_scraped": null
}

Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. The RUN_SUMMARY record contains counts, timing and warnings. Use place_id to connect reviews to businesses in your own analysis.

Why use this Google Maps scraper?

  • Pay per delivered row. A place and a review each count as one row, not one attempted page.
  • Keep available results. When collection returns a partial result, the Actor delivers those rows and records warnings. Rows already in the dataset remain available if a run stops; manually stopping before delivery does not guarantee that unfinished results are saved.
  • See missing data. Absent ratings and coordinates remain null, not zero. Contact flags help identify rows needing enrichment.
  • No proxy setup. You do not need to set up proxies or provide Google login cookies.
  • Repeatable snapshots. Schedule the same search and compare exported rows yourself to track ratings, hours or reviews. The Actor does not calculate changes between runs.

How much does it cost to scrape Google Maps?

The Actor uses pay-per-event pricing. Each start event costs $0.005, with one event per GB of memory and a minimum of one event. At the default 1024 MB, the start charge is $0.005. Each delivered place or review row costs $0.0018. Platform usage is included in these prices.

Apify planPrice per rowPrice per 1,000 rows
Free$0.0018$1.80
Starter$0.0018$1.80
Scale$0.0018$1.80
Business$0.0018$1.80
  • maxResults applies to the single search input, including all grid cells and reviews. Default: 70 rows. Larger requests are collected in parts of 70.
  • Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor. These are limits set by the publisher; Free-plan rows still use the prices above.
  • Maximum cost per run (maxTotalChargeUsd in the API) caps the run's charges. If the remaining allowance cannot cover another row, collection and delivery stop.

Example: one search delivering 50 rows at 1024 MB costs 50 × $0.0018 + $0.005 = $0.095, including one start event. Fifty rows could be 50 places, or a mixture of places and reviews.

What happens when the run timeout is too short

If results are expected after the available waiting time, the run can pause automatically rather than fail immediately. Its status message says "Queued on the collection backend; this run will resume automatically when results are ready (about N s)." It temporarily appears as ABORTED.

When results are ready, the same run resumes automatically, writes to the same dataset and can finish as SUCCEEDED. Already delivered rows are skipped to avoid duplicate delivery and row charges. During remaining-row delivery you may see "Resumed: delivering N rows." No manual restart is needed for this automatic pause.

Keep the default timeout of 1800 seconds rather than shortening it. Automatic resumption is not a guarantee against every failure or timeout. The synchronous API endpoints run-sync and run-sync-get-dataset-items wait at most 300 seconds and can return no rows while the run is paused. For longer searches, start asynchronously and read the dataset after SUCCEEDED, or use a succeeded-event webhook.

Use with AI agents and the API

Apify MCP server (Claude, ChatGPT, Cursor, VS Code)

Add this remote server in an MCP client that supports it:

https://mcp.apify.com?tools=lentic_clockss/google-maps-scraper

Sign in with Apify when prompted through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; the agent can then read rows with get-dataset-items. If that tool is not exposed by your client, read the dataset through the API below.

For clients without remote MCP support, run npx @apify/actors-mcp-server --tools lentic_clockss/google-maps-scraper with APIFY_TOKEN set.

Example prompt: "Find five coffee shops in Chicago without reviews. Return their names, phones, websites and ratings."

Apify API

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("lentic_clockss/google-maps-scraper").call(
run_input={"searchQuery": "coffee in Chicago", "maxResults": 5}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('lentic_clockss/google-maps-scraper').call({
searchQuery: 'coffee in Chicago', maxResults: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

For asynchronous HTTP use, send the input as JSON to POST https://api.apify.com/v2/acts/lentic_clockss~google-maps-scraper/runs with Authorization: Bearer <YOUR_APIFY_TOKEN>. After completion, read GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json, using the run's defaultDatasetId.

Integrations

Use the Actor's Integrations tab to connect results to Google Sheets, Make, Zapier, n8n, Slack, Airtable or a webhook. Apify Schedules can repeat a saved search.

FAQ

Public visibility is not blanket permission to collect or reuse data. Review Google's terms and applicable data-protection rules for your use. Personal data needs a lawful basis; reviewer names are not business-owner contacts.

Why did my run end as ABORTED?

It may be an automatic pause while results are being collected. Check for the queued status message described above. A manual abort is different and does not promise automatic resumption.

How many results can I get?

maxResults accepts 1–10,000 combined rows, defaulting to 70. It is a ceiling, not a guaranteed count. Availability, the free-plan cap, your cost limit and collection time can reduce delivery.

Why are some fields empty?

Not every place publishes a phone, website, price range or full schedule. Emails and owner names are not collected. Read leadAbsences and missing_fields rather than treating every empty field as a failure.

Do reviews cost extra?

Each review costs the same as a place row and uses the same row limit. Reviews are off by default. Turning them on does not add a second allowance beyond maxResults.

Which countries and languages work?

The supported market is the United States. English is the default language; the form accepts Google language codes. Changing language does not select another country or guarantee translated review text.

Can I search several cities in one run?

The public input takes one searchQuery, not an array. Use separate runs for separate queries, or a US bounding box for one area search. Review the price of each run before scheduling a batch.

Does it detect new reviews or rating changes automatically?

No. Compare snapshots from separate runs in your own workflow. has_recent_reviews describes the reviews sampled during collection, not a complete review history or a comparison with an earlier run.

Limitations

  • US market only; no promise of complete business coverage, exact search ranking or a fixed delivery time.
  • Searches can contain sponsored or loosely matching results. Filter returned names and categories before using them.
  • The public input does not offer a place-ID list, a URL list, minimum-rating filters or date-window filters.
  • Review limits and available source data can leave fewer review rows than requested. Place and review rows share the same allowance.
  • Fields such as price ranges, popular times, photo dates and detailed review scores depend on what Google shows. Lists of attributes are bounded, not exhaustive.
  • A contactable flag means a phone or website exists; it is not verification of ownership, consent or deliverability.

More local services and lead generation scrapers from the same publisher:

Browse all of our scrapers at apify.com/lentic_clockss.

Support

Found a problem or need another field? Open an issue in the Issues tab of this Actor's page and include the run ID and the input you used.