How to scrape Google Maps listings into Google Sheets
Turn a Maps search (“dentists in Austin”, “warehouses in Rotterdam”) into a sheet of names, ratings and profile URLs. Useful for local lead lists, competitor maps and store-location research — as long as you stay on publicly listed businesses and follow Google’s terms.
1 Pick a query a human would type into Maps
The Actor takes query (required), maxItems (required), and optional gl / hl for country and language. Write the query the way you would in the Maps search box, including the city. “coffee” is too broad; “coffee shops in Portland OR” is a job.
{
"query": "independent bookstores in Portland OR",
"maxItems": 40,
"gl": "us",
"hl": "en"
} 2 Run Google Maps Scraper on Apify
Listed From $5.00 / 1k plus $0.09 start (as of Oct 2026). Forty rows is a cheap sanity check. Open the Dataset when it finishes and make sure you have a name, a Maps URL and a rating before you raise maxItems.
Phone numbers and websites appear when Google shows them on the public listing. They will not appear for every row — that is the source, not a scraper bug.
3 Import into Sheets
CSV download for a one-off territory. For a weekly refresh, attach lukaskrivka/google-sheets in replace mode so the tab is a current snapshot of the market rather than a growing duplicate pile. Deduplicate later by the Maps URL column if you append instead.
4 Clean the sheet for outreach (optional)
Add a status column you maintain by hand — the Sheets Actor will not overwrite extra columns if you use a workflow that only writes known fields, but replace mode will wipe the tab. Prefer append + a UNIQUE() view, or upsert on the place URL, if people are logging notes in the same sheet.
Things that usually go wrong
Public listings only
This is not a way to bypass Google’s terms or scrape logged-in data. You are responsible for lawful use, including personal-data rules if you store phone numbers or emails.
Query quality beats maxItems
Raising maxItems on a vague query just gives you more noise. Split cities or categories into separate runs and separate tabs.
Before you run this in production
Can I feed a list of place URLs instead of a search query?
This Actor is search-oriented (query + country). If you already have place URLs, check the live input schema on Apify — if a URL list field is not there, you need a different Maps Actor.
Will I get emails?
Only if the public listing shows one. For publicly listed social emails, EasyAPI has separate lead Actors (Instagram, LinkedIn, etc.) — do not expect Maps to fill that column.
In the same toolkit
- Lead $2.99 / 1k
Facebook Followers Scraper
Export the public followers of a Facebook profile or page with names, profile URLs and basic profile details.
- Lead $2.99 / 1k
Instagram Email Scraper
Collect publicly listed email addresses from Instagram profiles to build creator and B2B outreach lists.
- Lead $2.99 / 1k
Linkedin Email Scraper
Collect publicly listed email addresses from LinkedIn profiles and build B2B prospect lists without copy-paste.
More how-to guides
Run Google Maps Scraper
Start with a 50-row test on Apify’s free credits, then schedule it once the sheet looks right.