Google Maps Scraper - Places, Leads, Emails & Contacts
Pricing
from $15.39 / 1,000 results
Google Maps Scraper - Places, Leads, Emails & Contacts
Scrape Google Maps places and local business leads with no API key. Get name, category, phone, website, emails, social links, address, rating, hours, coordinates, plus code, price level, place ID and CID. Filter by rating, category, website, phone, open now. Export JSON, CSV or Excel.
Pricing
from $15.39 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Google Maps Scraper - Places, Leads, Emails & Contacts
Google Maps scraper and Google Places data extractor for lead generation, with no API key required. Turn any Google Maps search into clean local business leads: names, categories, addresses, phone numbers, websites, public emails, social profiles, ratings, opening hours, coordinates, plus codes and Google place IDs. A more complete, HTTP based alternative to the official Google Maps and Places API for bulk business listings data.
Here is one real result from a live run, with the fields the actor returns:
{"businessName": "The Gage","category": "American restaurant","categories": ["American restaurant", "Bar", "New American restaurant", "Pub"],"description": "Upscale restaurant with an European-American fare","rating": 4.6,"reviewsCount": null,"priceLevel": null,"phone": "(312) 372-4243","phoneInternational": "+13123724243","website": "https://thegagechicago.com/","domain": "thegagechicago.com","emails": ["info@thegagechicago.com"],"facebook": "https://www.facebook.com/thegagechicago/","instagram": "https://www.instagram.com/thegagechicago","websiteTitle": "The Gage","fullAddress": "The Gage, 24 S Michigan Ave, Chicago, IL 60603","street": "24 S Michigan Ave","neighborhood": "Chicago Loop","city": "Chicago","state": "Illinois","postalCode": "60603","countryCode": "US","latitude": 41.8813268,"longitude": -87.6246925,"plusCode": "86HJV9JG+G4","placeId": "ChIJ5a8ra6QsDogRENtJLAp40AE","featureId": "0x880e2ca46b2bafe5:0x1d0780a2c49db10","cid": "130736374281788176","kgmid": "/g/1hc4ljvmz","googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ5a8ra6QsDogRENtJLAp40AE","searchPageUrl": "https://www.google.com/maps/search/restaurants%20Chicago%2C%20IL","rank": 3,"timezone": "America/Chicago","claimed": true,"ownerName": "The Gage","businessStatus": "OPERATIONAL","permanentlyClosed": false,"temporarilyClosed": false,"openNow": true,"openingHours": [{ "day": "Friday", "hours": "11 AM to 12 AM" }],"serviceOptions": { "dineIn": null, "takeout": null, "delivery": null, "reservable": true, "onlineOrdering": null },"reserveTableUrl": "https://www.google.com/maps/reserve/v/dine/c/rvLajbvTHOU","reservationLinks": ["https://thegagechicago.com/reservations", "https://www.opentable.com/restaurant/profile/10315?ref=1068"],"orderLinks": [],"imageUrls": ["https://lh3.googleusercontent.com/gps-cs-s/AHRPTWnPpqh_2CDHBIStFEti...=w408-h272-k-no"],"imagesCount": 5,"searchQuery": "restaurants Chicago, IL","observedAt": "2026-09-04T17:00:46.440Z"}
The most complete HTTP Google Maps scraper for lead generation. It returns the business fields Google Maps exposes (name, category, editorial description, phone, website, address, coordinates, plus code, price level, place IDs, hours, service options, order and reservation links, claimed status, open-now), and it can visit each business website to pull public emails and social profiles (Facebook, Instagram, X, LinkedIn, YouTube, TikTok, Pinterest, Discord) that the base place feed never contains. It gives you more than a dozen input filters so you collect exactly the businesses you want and pay only for the ones that pass.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- How we compare
- FAQ and troubleshooting
What it does
Give the actor one or more business types (dentist, coffee shop, law firm) and a location, or paste Google Maps search URLs. It collects the matching places from Google Maps and writes one clean record per business to the dataset. Each record carries the business name, primary category and full category list, editorial description, rating, price level, phone in local and E.164 format, website and domain, a parsed address (street, neighborhood, city, state, postal code, country), coordinates, plus code, Google identifiers (placeId, featureId/fid, cid, kgmid), timezone, claimed status, owner name, business status (operational, temporarily closed, permanently closed), open-now, opening hours, service options (dine-in, takeout, delivery), order and reservation links, and photo URLs.
Turn on the contacts add-on and the actor fetches each business website and extracts public emails plus social profile links (Facebook, Instagram, X/Twitter, LinkedIn, YouTube, TikTok, Pinterest, Discord). Two optional AI add-ons write a short business profile and score each business as an outreach lead.
More than a dozen input filters narrow the run before you are billed: minimum rating, category words, only places with a website, phone or email, open now, skip closed, plus multi query search and place deduplication.
Quickstart
Open the actor, paste this into the input, and press Run. It returns up to 10 coffee shops in Austin rated 4.0 or higher, with public emails and social links scraped from each website.
{"searchQueries": ["coffee shop"],"location": "Austin, TX","maxPlaces": 10,"minRating": 4,"onlyWithWebsite": true,"scrapeContacts": true,"language": "en","region": "us"}
Run several searches in one job by adding more terms to searchQueries, or paste Google Maps search URLs into searchUrls. Google returns roughly 100 to 120 results per search.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
searchQueries | string[] | no | ["coffee shop"] | One or more business types or names. Each runs across the whole location. |
searchQuery | string | no | (empty) | Single business type or name. Alias for one entry in searchQueries. |
location | string | no | Austin, TX | City, area or region. Appended to each query. Takes precedence over city/state/country. |
city / state / county / postalCode / country | string | no | (empty) | Build the location when location is empty. |
searchUrls | string[] | no | (empty) | Google Maps search or place URLs to run directly. |
maxPlaces | integer | no | 20 | Maximum places across all queries. |
language | enum | no | en | Interface language (Google hl): en, es, pt, fr, de, it, nl. |
region | enum | no | us | Country context (Google gl) and proxy country: us, gb, ca, au, mx, br, ar, co, cl, es, fr, de. |
minRating | integer | no | (none) | Keep only places rated at least this many stars (1 to 5). |
categoryFilterWords | string[] | no | (empty) | Keep only places whose category matches one of these words. |
onlyWithWebsite | boolean | no | false | Keep only places that have a website. |
onlyWithPhone | boolean | no | false | Keep only places that have a phone. |
onlyWithEmail | boolean | no | false | Keep only places where a public email was found. Requires scrapeContacts. |
openNowOnly | boolean | no | false | Keep only places open at scrape time. |
skipClosedPlaces | boolean | no | false | Drop permanently or temporarily closed places. |
deduplicatePlaces | boolean | no | true | Remove duplicate places by place ID across all queries. |
scrapeImages | boolean | no | true | Include business photo URLs. No extra charge. |
maxImages | integer | no | 10 | Maximum image URLs per place. |
scrapeContacts | boolean | no | false | Paid add-on. Fetch each website for public emails and social links. Paid plans only. |
maxContactEnrich | integer | no | (all) | Cap how many websites the contacts add-on visits. |
withAiProfileSummary | boolean | no | false | Paid AI add-on. Adds a short business profile. Paid plans only. |
withAiLeadScore | boolean | no | false | Paid AI add-on. Scores each business 0 to 100 as a lead. Paid plans only. |
Output reference
One dataset item per business. Types: string, integer, number, boolean, string[], object[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
businessName | string | Business name. |
category / categories | string / string[] | Primary category and full category list. |
description | string | Editorial one-line business description when Google provides one, else null. |
rating | number | Google rating out of 5, or null. |
reviewsCount | integer | Total reviews when Google includes it in the list feed, else null. |
reviewsLink | string | Link to the reviews page when present, else null. |
priceLevel / priceRange | integer / string | Price level 1 to 4 ($ to $$$$) and price string when Google exposes it, else null. |
phone / phoneInternational | string | Phone in local and E.164 format. |
website / domain | string | Business website and domain. |
emails | string[] | Public emails from the website (contacts add-on). |
facebook, instagram, twitter, linkedin, youtube, tiktok, pinterest, discord | string | Social profile URLs from the website (contacts add-on). |
websiteTitle | string | Title of the business website (contacts add-on). |
fullAddress, street, neighborhood, city, state, postalCode, countryCode | string | Parsed address parts. |
latitude / longitude | number | Coordinates. |
plusCode | string | Google Plus Code (Open Location Code) derived from the coordinates. |
placeId, featureId, fid, cid, kgmid | string | Google place identifiers. |
googleMapsUrl / placeUrl | string | Direct Google Maps place URL. |
searchPageUrl | string | Google Maps search page URL for the query. |
rank | integer | Position of the place in the result set. |
timezone | string | IANA timezone. |
claimed / ownerName | boolean / string | Whether the listing is claimed, and the owner profile name. |
businessStatus | string | OPERATIONAL, CLOSED_TEMPORARILY or CLOSED_PERMANENTLY. |
permanentlyClosed / temporarilyClosed | boolean | Closure flags. |
openNow / openNowText | boolean / string | Open state at scrape time. |
openingHours | object[] | Opening hours, each with day and hours. |
additionalInfo | object[] | Amenities and attributes grouped by category, when Google exposes them. |
serviceOptions | object | Flags for dine-in, takeout, delivery, curbside/in-store pickup, reservable and online ordering, when Google exposes them. |
reserveTableUrl | string | Reservation or booking URL when present. |
reservationLinks | string[] | Reservation provider URLs (OpenTable, Google Reserve, etc.) when present. |
orderLinks | string[] | Online ordering and delivery provider URLs when present. |
imageUrls / imagesCount | string[] / integer | Photo URLs and their count. |
searchQuery | string | The resolved query that produced this record. |
aiProfileSummary, aiLeadScore, aiLeadScoreRationale | string / integer | AI add-on fields, present only when enabled. |
observedAt | string | ISO timestamp of collection. |
error | string | Null on success. On a failed page a record with a populated error field is written and not charged. |
Example output record
See the real record at the top of this page. Fields Google does not expose for a given business are returned as null, never invented. reviewsCount, reviewsLink, priceLevel, description, additionalInfo, serviceOptions, reserveTableUrl and orderLinks appear when Google includes them in the list feed and are null or empty otherwise. plusCode is derived from the coordinates, so it is present for every place that has a location.
Run via API and CLI
Start a run and read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~google-maps-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["plumber"],"location":"Miami, FL","maxPlaces":50}'
Start a run asynchronously with the contacts add-on:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~google-maps-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["law firm"],"location":"Austin, TX","scrapeContacts":true,"maxPlaces":100}'
Apify CLI:
apify call scrapers_lat/google-maps-scraper \--input '{"searchUrls":["https://www.google.com/maps/search/coffee+shop+in+Seattle+WA"],"maxPlaces":25}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object.
Billing and limits
- Pay per result. You are charged per business returned (
resultevent). See the pricing tab for the current per-result price. - Website contacts. When
scrapeContactsis on and a business website yields emails or social links, that place is billed one extradetailsevent. No contact data found means nodetailscharge. - AI add-ons (
ai_profile_summary,ai_lead_score) are billed as separate events only when they produce output. Off by default. - No charge on failure. If a page cannot be retrieved, the actor writes a record with a populated
errorfield and does not charge. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run. Once reached, the actor stops emitting and charging further results and add-ons. - Free Apify plans are capped at 10 records per run and cannot use the paid contact or AI add-ons. Upgrade for higher
maxPlaces.
How we compare
Objective comparison against the leading Google Maps actors on the Apify Store. Where a competitor is stronger on an axis, that is stated plainly.
| Capability | This actor | compass/crawler-google-places (flagship) | compass/google-maps-extractor | lukaskrivka/google-maps-with-contact-details | compass/google-maps-reviews-scraper |
|---|---|---|---|---|---|
| Core place fields (name, category, phone, website, address, coordinates) | Yes | Yes | Yes | Yes | Place context only |
| Google IDs: placeId, cid, fid, kgmid | All four | All four | placeId | placeId, cid | placeId |
| Input filters (rating, category, has website/phone/email, open now, skip closed) | 14+ filters incl. contact-presence filters | Many, plus polygon geolocation and zoom | Many, plus polygon geolocation | Many, plus polygon geolocation | Reviews filters only |
| Emails and socials from the business website | Yes, 8 networks incl. Pinterest and Discord, in the same run | Paid add-on | Paid add-on | Yes, its core feature | No |
| Open now, business status, closed flags | Yes | Yes | Yes | Yes | Closed flags |
| Editorial description, price level, service options | Yes, when Google exposes them | Yes | Yes | Partial | No |
| Plus code (Open Location Code) | Yes, for every place (from coordinates) | Sometimes | Sometimes | Sometimes | No |
| Order and reservation links | Yes | Yes | Yes | Partial | No |
| Reviews count and distribution | When Google exposes it in the list feed, else null | Yes, from the place detail page | Yes, with detail scraping | Yes | Yes |
| Full reviews array (text, author, rating, date, owner reply) | No | Yes | No | No | Yes, deepest |
| Popular times and Q and A | No | Yes | Yes, with detail scraping | Yes | No |
| Multi query search in one run | Yes | Yes | Yes | Yes | Per place |
| Speed (list run) | Roughly 4 to 5 seconds for 15 places, plus website time when contacts are on | High volume, detail scraping slows it | Fast | Adds a website crawl per place | Optimized for review volume |
| Adoption | New listing | Millions of runs, the market leader | Large | Large | Large |
| Price | Per result, not the cheapest | From about 1.50 USD per 1,000 places on the top tier | About 2.10 to 5 USD per 1,000 | From about 2.10 USD per 1,000 | About 0.30 USD per 1,000 reviews |
Where competitors win, honestly: the flagship has millions of runs, the widest adoption and a lower headline price on its top tier, and it returns the full reviews array, popular times and Q and A from the place detail page. The dedicated reviews scraper is the deepest source for review text and is cheaper per review. All of the compass actors support polygon and zoom geolocation, which this actor does not.
Where this actor wins: it unifies place data and website contact enrichment (emails plus eight social networks, including Pinterest and Discord) in a single run, adds contact-presence input filters (only with email, phone or website) that the others do not combine, returns the complete Google ID set (placeId, cid, fid, kgmid) that many cheaper clones drop, runs fast by default because it only visits websites when you ask for contacts, and never charges for a place that fails or gets filtered out. For deep review mining, pair it with a dedicated reviews scraper.
FAQ and troubleshooting
Why is reviewsCount null for some places?
Google serves this scraper's list feed in two variants. When Google includes the review count in the response it is returned, otherwise it is null. It is never invented. For guaranteed review counts and full review text, use a dedicated Google Maps reviews scraper.
How do I get contact emails and socials?
Turn on scrapeContacts (paid plans). For each place with a website, the actor fetches the site and extracts public emails and social profile links into emails, facebook, instagram and the other social fields.
How do I get only businesses with an email?
Set scrapeContacts and onlyWithEmail both true. The actor keeps only places where a public email was found.
A run returned fewer results than maxPlaces. Why?
Google returns roughly 100 to 120 organic results per search, and your filters remove non matching places before billing. Add more terms to searchQueries or pass multiple searchUrls to widen coverage.
Do I need a Google Maps or Places API key? No. This actor needs no Google API key, no billing account and no per request quota. It returns Google Maps business listings data directly, so it works as a drop-in alternative to the official Google Maps and Places API for bulk lead generation and business listings extraction.
What is plusCode?
It is the Google Plus Code (Open Location Code) for the place, computed from its coordinates. Because it is derived from latitude and longitude, it is present for every place that has coordinates.
Why are phone or website null?
The listing did not publish that field. Missing source values are returned as null, never invented.
Which regions and languages are supported?
Twelve regions (US, UK, Canada, Australia, Mexico, Brazil, Argentina, Colombia, Chile, Spain, France, Germany) and seven interface languages. Set region and language.
Is this an official Google tool? No. This actor is independent and has no affiliation with Google. It reads only data that is publicly visible on Google Maps. Use it in accordance with the Google terms of service.
Related scrapers
- Indeed Job Listings & Salary Scraper: job postings with company and salary.
- Crunchbase Company Scraper: company profiles, funding and people.
- USPTO Trademark Search Scraper: US trademark registrations and applications.
- SEC EDGAR 10-K, 10-Q & 8-K Filings Scraper: SEC filings by ticker or CIK.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Google. Accesses only publicly available Google Maps data. Use in accordance with the Google terms of service.
