Google Maps Scraper at a glance
Google Maps Scraper is a ready-to-run Apify actor from abotapi for collecting lead generation data. Its documented output includes place id, name, category, address and phone, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $3.70 per 1,000 results on the Apify Free plan and from $2.70 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Lead Generation, Social Media, Real Estate
- Pricing
- $3.70 per 1,000 results (Free plan), from $2.70 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 27 options
- Run success
- 96.0% of completed public runs in the last 30 days
Extract business data from Google Maps at scale. Get names, addresses, phone numbers, websites, ratings, reviews, opening hours, popular times, photos, and 40+ data points per listing.
What Google Maps Scraper can do
- Two ways to find places. Free text search terms, or direct Google Maps place-page and search-result links, no manual URL building.
- Full business profiles. Contact details, location, category, price level, opening hours, popular times, photos and "people also search for" in one record.
- Reviews on demand. Turn on review extraction per run, with sort order, or skip it entirely for faster runs.
- Area coverage. Draw a custom polygon and the actor builds a grid of searches across it, so you are not limited to Google's per-search result cap.
- Built for schedules. Incremental mode returns only new and changed businesses on recurring runs, and a resumed run never re-scrapes a place it already collected.
Choose what to collect
These inputs let you configure Google Maps Scraper. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
searchStringsArrayarray | List of search queries (e.g., 'restaurants', 'coffee shops') |
startUrlsarray | Direct Google Maps URLs to scrape |
locationstring | Location text (e.g., 'New York, NY', 'Tokyo, Japan') |
latnumber | Latitude for coordinate-based search |
lngnumber | Longitude for coordinate-based search |
countrystring | Country for geolocation filtering |
statestring | State or region for geolocation filtering |
Show 20 more inputs
| Input | What it controls |
|---|---|
citystring | City for geolocation filtering |
postalCodestring | Postal/ZIP code for geolocation filtering |
customGeolocationobject | GeoJSON geometry (Polygon, MultiPolygon, or Point with radius) |
zoominteger | Map zoom level (1=world, 21=building). Higher = more precise, fewer results |
maxResultsPerSearchinteger | Maximum number of results to extract per search query |
maxReviewsinteger | Maximum reviews to extract per business. Set to 0 to disable review extraction (faster) |
maxImagesinteger | Maximum number of image URLs to extract per business |
reviewsSortstring | How to sort reviews when extracting |
oneReviewPerRowboolean | Output each review as a separate Dataset row (useful for CSV export) |
skipClosedPlacesboolean | Skip temporarily or permanently closed businesses |
languagestring | Language code for search results (e.g., 'en', 'es', 'ja') |
maxConcurrencyinteger | Number of parallel browser contexts (higher = faster but more memory) |
resumeFromRunIdstring | Run ID of a previous run to continue. Loads its already-scraped Place IDs and skips them, so this run only appends new businesses. See also Incremental mode below for recurring monitoring instead of a one-off resume. |
resumeRunIdstring | Deprecated, use "Resume From Run ID" above instead. Kept working so existing saved tasks that pass this field name are unaffected. If both are set, "Resume From Run ID" wins. |
incrementalModeboolean | Remember this search's results across scheduled runs and classify every business as NEW / UPDATED / UNCHANGED / REAPPEARED / EXPIRED, instead of re-scraping from scratch. State is kept by the Actor itself, keyed on "State key" below (or a hash of your search settings). Default off, no existing user is affected until they opt in. |
stateKeystring | Optional. Manually name the Incremental-mode baseline so you can control exactly which runs share state (e.g. two different scheduled tasks on the same search). Leave empty to derive it automatically from your search settings, two differently-configured searches then never share a baseline. |
emitUnchangedboolean | When Incremental mode is on, also output businesses whose data has not changed since the last run (changeType="UNCHANGED"). Off by default so a recurring run only bills and returns what's new. Turning this on bills and returns an extra row for every unchanged business, every run. |
mcpConnectorsarray | Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on items written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
placeIdPlace ID (text)titleName (text)categoryNameCategory (text)addressAddress (text)phonePhone (text)websiteWebsite (link)totalScoreRating (number)reviewsCountReviews (number)urlGoogle Maps URL (link)changeTypeChange (text)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"placeId": "ChIJ49sQuK-AhYARM6U646SA12Y",
"title": "Example Coffee Roasters",
"url": "https://www.google.com/maps/place/Example-Coffee-Roasters/ChIJ49sQuK-AhYARM6U646SA12Y",
"categoryName": "Coffee shop",
"address": "100 Example St, San Francisco, CA 94102, USA",
"street": "100 Example St",
"city": "San Francisco",
"state": "CA",
"postalCode": "94102",
"countryCode": "US",
"location": {
"lat": 37.7763,
"lng": -122.4158
},
"plusCode": "QHFJ+8R Hayes Valley, San Francisco, CA",
"phone": "+1 555 010 0100",
"website": "https://www.example.com",
"totalScore": 4.5,
"reviewsCount": 1842,
"priceLevel": "$$",
"openingHours": [
{
"day": "Monday",
"hours": "7 am to 6 pm"
},
{
"day": "Tuesday",
"hours": "7 am to 6 pm"
}
],
"imageUrls": [
"https://lh3.googleusercontent.com/example=w800-h600"
],
"menuUrl": "https://www.example.com/menu",
"temporarilyClosed": false,
"permanentlyClosed": false,
"searchString": "coffee shops",
"rank": 3,
"isAdvertisement": false,
"scrapedAt": "2025-12-06T10:30:00.000Z",
"reviews": [
{
"reviewId": "review_0123456789abcdef",
"reviewerName": "Sample Reviewer",
"rating": 5,
"text": "Great coffee and atmosphere.",
"publishedAtDate": "2025-11-22T09:00:00.000Z"
}
]
}Ways to use this data
- Lead generation: build prospect lists with names, phone numbers, websites and categories for a market or neighborhood.
- Local SEO and reputation tracking: monitor ratings, review counts and review text for your business and competitors over time.
- Market and site research: map competitor density, categories, price levels and ratings for real estate, retail or franchise planning.
- Data enrichment: attach verified addresses, coordinates and opening hours to an existing list of businesses.
- Delivery and menu research: collect menu links and order/delivery platform links for restaurants in an area.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Google Maps Scraper return?
The documented output for Google Maps Scraper includes place id, name, category, address, phone, website, rating and reviews. Availability of each field depends on the source page and the selected mode.
How much does Google Maps Scraper cost?
It costs $3.70 per 1,000 results on the Apify Free plan and from $2.70 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed businesses on a schedule?
Yes. Schedule the actor from the Schedules tab against the same search and turn on Incremental mode. Each run then returns only new, updated, reappeared and expired businesses, and unchanged ones are not billed unless you turn on Emit unchanged businesses.
Why do I only get 2 results for a search term?
maxResultsPerSearch defaults to 2. Raise it, up to 10,000, to collect more results per search term or grid point. For very large areas, a customGeolocation grid search covers more ground than a single search term ever can.
Why did my run finish with an empty or partial dataset instead of failing?
The actor only stops the whole run for a configuration problem: no searchStringsArray or startUrls provided, lat set without lng (or the reverse), coordinates out of range, or turning on Incremental mode with resumeFromRunId against a search that already has tracked state. If Google Maps blocks or fails to load an individual search or business page, that one page is skipped and logged, and the run still finishes and returns whatever it did collect, which can be an empty dataset if every page was blocked. Run it again, or lower maxConcurrency, if you see this often.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.
