Google Maps Scraper avatar

Google Maps Scraper

Pricing

from $0.70 / 1,000 places

Go to Apify Store
Google Maps Scraper

Google Maps Scraper

🏷️ From $0.70 / 1K | Search Google Maps for any kind of business around any town or city worldwide. One row per business: name, address, phone, website, rating, and the emails published on its own website. Emails are charged only when found. No API key.

Pricing

from $0.70 / 1,000 places

Rating

0.0

(0)

Developer

Wild Origins

Wild Origins

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Find every business of a given kind around any town or city in the world on Google Maps, and get one row per business with its phone, address, website, rating and the email addresses published on its own website. Switch on the optional add on and each business also comes with the owners and directors who list it on LinkedIn.

πŸ” What does Google Maps Scraper do?

Google Maps Scraper searches Google Maps for a trade in a place, such as plumbers in Austin, dentists in Manchester or accountants in Lyon, and returns a lead list you can call or email the same day. It reads each business's own website for the addresses it publishes, including addresses hidden behind Cloudflare's email protection, which a plain page read never sees.

Google Maps shows at most around 120 to 150 results for one map view. Google Maps Scraper gets past that by splitting the area into smaller map views wherever one view is full, and searching each one, so a whole city comes back rather than the first few pages.

The easiest way to try it: type a trade and a town, leave everything else as it is, and press Start.

πŸ†š What about the official route?

Google's own route is the Places API. It is a good API, and if you already run a Google Cloud billing account it is worth knowing about. Three things it does not do for a lead list:

  • A text search returns at most 60 places, across all pages, by Google's own documentation. A city's plumbers run to several hundred.
  • There is no email field among the place fields Google documents. Phone and website are there, on the Enterprise tier.
  • It needs an API key and a billing account, and every field group is billed separately.

Google Maps Scraper gives you every place the map will show for the area, the emails from each website, and optionally the decision makers, in one run with no key, no Google Cloud project and a clean table at the end.

πŸ“Š What data can I extract?

FieldWhat it is
🏒nameBusiness name as listed on Google Maps
🏷️category, categoriesPrimary Maps category, and every category on the listing
πŸ“address, street, neighbourhood, town, postcodeThe address, and its parts
πŸ“žphone, phoneE164Phone as Google Maps prints it, and in E.164 form ready for a dialler or CRM. E.164 is filled when Google gives the international number, and for UK, US and Canadian national numbers
🌐website, websiteDomainWebsite from the listing, and its host
βœ‰οΈemailThe first email published on the business website
πŸ™‹personalEmailThe first email that reads as one person's mailbox rather than info@
πŸ“¬emailsEvery published email, each with type (role or personal), source and the page it was found on
πŸ”’emailCountHow many emails were found
🧾websiteStatusWhat happened with the website: emails-found, no-emails-published, no-website, not-own-site, unreachable and so on
πŸ‘”decisionMakersWith the add on: name, title, LinkedIn URL, location, the evidence tying them to the business, and an email built from the business's own naming pattern
🧭decisionMakerStatusfound, none-found, no-website, search-blocked or not-requested
⭐rating, reviewCountGoogle rating and number of reviews
πŸ—ΊοΈlatitude, longitudeMap pin
🚐serviceAreaBusinessTrue when the business hides its address and serves an area, so the pin is approximate
🚫permanentlyClosed, temporarilyClosedClosure flags from Maps
πŸ†”placeId, cid, googleMapsUrlGoogle's identifiers and a link to the listing
πŸ”—sourcesWhich sources contributed to the row: googleMaps, website, linkedinSearch
πŸ”ŽsearchTerm, searchLocation, retrievedAtWhat found it, where, and when

πŸ’‘ Why scrape business leads from Google Maps?

Google Maps is the most complete directory of small businesses there is, because the businesses keep it up to date themselves: it is where their customers find them. What it lacks is the one thing outbound needs, an email address. Most small firms publish one on their own website, and that is where this Actor reads it.

Some of the ways it gets used:

  • Selling to a trade. A merchant, a software company or a recruiter pulling every plumber, electrician or roofer in a region, with a phone number and an email for each.
  • Local services. A web designer or an accountant looking for businesses in their own town that have no website or a poor one. websiteStatus says which.
  • Territory planning. Every dental practice in a city, with coordinates and ratings, loaded straight into a map or a CRM.
  • Decision makers for small firms. For businesses too small to appear in any company database, the owner's name and LinkedIn profile are often the only way to reach the person who decides.
  • Market sizing. How many estate agents there are in a postcode district, and how they are rated.

πŸš€ How do I use Google Maps Scraper?

  1. Open Google Maps Scraper on Apify and click Try for free.
  2. Type one or more search terms, the way you would into Google Maps: plumbers, dentists, accountants.
  3. Type a location: a town or city anywhere, written with its state or country when the name is shared, such as Austin, TX or Lyon, France. A UK postcode or postcode district such as LS6 works too. For several places at once, list them under More locations.
  4. Leave emails on. Tick Add LinkedIn decision makers if you want the owners and directors.
  5. Press Start, and download the results as a spreadsheet, CSV, JSON or Excel when the run finishes.

⬇️ Input

FieldWhat it does
searchTermsThe kinds of business to find, one per line
locationA town or city anywhere in the world, or a UK postcode or postcode district
locationsSeveral of those, one per line, up to 50, all searched in one run. A business found twice is returned once
radiusKmOptional. How far from the centre to search. Left empty, the area is sized to the place: a whole city for a city, about 2 km around a postcode
maxPlacesPerSearchThe most businesses per search term, default 200
scrapeEmailsRead each business website for emails, on by default
maxPagesPerSitePages read per website, including the homepage, default 4
includeDecisionMakersAdd LinkedIn owners, directors and founders, off by default
maxDecisionMakersPerBusinessThe most people per business, default 3
skipClosedLeave out permanently closed businesses, on by default
proxyConfigurationResidential proxy, set for you. Leave it as it is
{
"searchTerms": ["dentists"],
"location": "Manchester",
"maxPlacesPerSearch": 300,
"scrapeEmails": true,
"includeDecisionMakers": true
}

⬆️ Output

Table view

The Overview view shows each business with its category, town, postcode, phone, website, first email, rating and reviews. Contacts shows every email with its type and the page it came from. Decision makers shows the people.

JSON

An example row. The shape is exactly what a run returns; the business and the person are invented:

{
"name": "Example Plumbing & Heating",
"category": "Plumber",
"categories": ["Plumber", "Heating contractor"],
"address": "12 Example Road, Headingley, Leeds LS6 1AA",
"street": "12 Example Road",
"neighbourhood": "Headingley",
"town": "Leeds",
"postcode": "LS6 1AA",
"phone": "0113 000 0000",
"phoneE164": "+441130000000",
"website": "https://example-plumbing.co.uk/",
"websiteDomain": "example-plumbing.co.uk",
"email": "info@example-plumbing.co.uk",
"personalEmail": "sam@example-plumbing.co.uk",
"emails": [
{ "email": "info@example-plumbing.co.uk", "source": "website", "type": "role", "page": "https://example-plumbing.co.uk/" },
{ "email": "sam@example-plumbing.co.uk", "source": "website", "type": "personal", "page": "https://example-plumbing.co.uk/contact" }
],
"emailCount": 2,
"websiteStatus": "emails-found",
"decisionMakers": [
{
"name": "Sam Example",
"firstName": "Sam",
"lastName": "Example",
"title": "Director at Example Plumbing & Heating Ltd",
"roleCategory": "leadership",
"seniority": "director",
"roleEvidence": "title",
"linkedinUrl": "https://www.linkedin.com/in/sam-example",
"location": "Leeds, England, United Kingdom",
"evidence": "experience",
"email": "sam@example-plumbing.co.uk",
"emailPattern": "first",
"emailConfidence": 1
}
],
"decisionMakerStatus": "found",
"rating": 4.9,
"reviewCount": 57,
"latitude": 53.8196,
"longitude": -1.5769,
"serviceAreaBusiness": false,
"permanentlyClosed": false,
"temporarilyClosed": false,
"placeId": "ChIJ0000000000000000000000",
"cid": "4127435111269695969",
"googleMapsUrl": "https://www.google.com/maps/place/?q=place_id:ChIJ0000000000000000000000",
"sources": ["googleMaps", "website", "linkedinSearch"],
"searchTerm": "plumbers",
"searchLocation": "Leeds",
"retrievedAt": "2026-09-27T12:00:00.000Z"
}

πŸ—ΊοΈ How the whole area is covered

A single Google Maps view lists about 120 to 150 places, then starts padding the list with places from somewhere else entirely. Google Maps Scraper searches the whole area first, then splits any view that was still producing new businesses into four quarters and searches those, and so on down to views about 2 km across. A page that has drifted out of the area stops that view, and businesses whose pin falls outside the radius are left out. Every business is returned once, keyed on its Google place id, even when several views or search terms found it.

Service area businesses, the ones that hide their street address, carry an approximate pin. They are kept when Google listed them among the local results, and flagged with serviceAreaBusiness.

βœ‰οΈ Where the emails come from

Each business's own website: the homepage, then the contact and about pages, read for mailto links, visible addresses, the addresses sites declare in their structured data, and Cloudflare protected addresses, which a site shows as "[email protected]" until a script decodes them. The decoding is done here, so those addresses are found too.

Addresses that belong to someone else are left out: an ombudsman or regulator named on a legal page, a web agency's address in the footer when the site has its own, and placeholder text such as you@example.com. A Facebook page, a Linktree or a directory listing given as the website is not read, because its addresses belong to the platform. websiteStatus says which of these happened for every row.

πŸ‘” How the decision makers are found

With Add LinkedIn decision makers on, Google Maps Scraper asks a public search engine for LinkedIn profiles that name the business. No LinkedIn page is opened and no login is used. A person is returned only when their LinkedIn Experience field or headline names the business, their title reads as an owner, director, founder or other leader, and the listing shows they are in the UK: a UK location, the business's own town, or a UK company form such as Ltd. Small firms share names across countries, so a plumbing firm in Ohio called the same thing as one in Leeds is refused, and an employer ending in LLC, Inc or Pty always is. Staff whose listing shows no title are left out, and so is a name shared by several unrelated firms, because a wrong person is worse than no person.

Each person comes with an email built from the business's own naming pattern where the website shows one, with emailConfidence saying how sure that is. A built email is a guess, not an address the person published.

Small businesses are often not on LinkedIn at all, so expect a minority of businesses to come back with a decision maker. You are only charged for the people found.

⏱️ How long does a run take?

Businesses start arriving in the dataset within about a second of the map answering, because each one is written as soon as its website has been read rather than at the end. Measured on Apify with emails on and decision makers off:

SearchBusinessesWhole runFirst row
Plumbers in Leeds29726 seconds1.1 seconds
Harrogate and Skipton, 36 kinds of business1,9673 minutes 53 seconds1.2 seconds

A larger run grows roughly in line with the number of businesses it finds. Decision makers add a search per business with a website, which runs alongside the website read.

πŸ’° How much does it cost?

Google Maps Scraper is priced per result, with three events:

EventCharged when
PlaceOnce for every business delivered
Business emailsOnce for a business that comes back with at least one email
Decision makerOnce for every person delivered

A business with no email costs the place price only, and a business where no decision maker was found costs nothing for that part. The current prices for each event, and the lower rates on paid Apify plans, are on the Actor's Pricing tab.

πŸ”Œ Integrations

Schedule a run weekly to catch new businesses, send the rows to Google Sheets, HubSpot, Airtable, Slack, Make, Zapier or a webhook through Apify integrations, and use placeId to keep only the businesses you have not seen before. phoneE164 drops straight into a dialler. Each row's websiteDomain is the input for Company Email Finder when you want more addresses at a business,.

AI agents can call it through the Apify MCP server as spookyweb/google-maps-scraper. The input schema is the tool definition, and every row carries sources, websiteStatus and per person evidence, so an agent can see where each value came from.

πŸ”— Using Google Maps Scraper with the Apify API

Start a run and wait for it with the Apify API:

curl -X POST "https://api.apify.com/v2/acts/spookyweb~google-maps-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchTerms":["accountants"],"location":"Bristol","maxPlacesPerSearch":100}'

Or from Node.js with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('spookyweb/google-maps-scraper').call({
searchTerms: ['accountants'],
location: 'Bristol',
maxPlacesPerSearch: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((b) => b.email).length, 'businesses with an email');

❓ FAQ

Does Google Maps Scraper need a Google API key?

No. It reads the same results Google Maps shows in a browser, over plain HTTP. There is no key and no Google Cloud project to set up.

Why does a business have no email?

websiteStatus says why: the listing has no website, the website is a social page, the site was down, or it publishes no address on the pages read. Plenty of small firms only take enquiries through a contact form.

What is the difference between a role and a personal email?

A role address, such as info@ or bookings@, is read by whoever handles enquiries. A personal address is one person's mailbox, often the owner's on a small firm. Both are published by the business itself.

Which countries does it cover?

Any country Google Maps covers. Give a town or city, with its state or country when the name is shared: Austin, TX, Lyon, France, Birmingham, AL. The place is found through OpenStreetMap, the search is asked of that country's own Google index, and a business Google puts in a different country is left out. In the UK you can also search by full postcode or postcode district.

Can one run cover several towns?

Yes. Put them in locations, one per line. Every town is searched with every search term, and a business that turns up in two neighbouring towns, or under two terms, comes back once and is charged once.

Why did I get fewer businesses than I expected?

The area may genuinely hold that many, or the radius may be tight. Leave radiusKm empty to size the search to the place, or raise it. maxPlacesPerSearch also caps each search term.

Are the decision makers verified?

Each one is tied to the business by LinkedIn's own Experience field or headline, which is in evidence. That is strong evidence the person works there. It is not a guarantee they still do, because a LinkedIn profile is only as current as its owner keeps it.

What happens when I hit my spending cap?

The run stops cleanly. Businesses already delivered are complete. A business whose place was paid for but not its emails comes back without them, marked withheld-spending-cap, rather than with data you were not charged for.

Google Maps Scraper collects business information that businesses publish themselves, on Google Maps and on their own websites, for anyone to read. It does not log in anywhere. Email addresses of named people are personal data under UK GDPR, so if you use them for marketing you need a lawful basis, usually legitimate interests for business to business contact, and you must follow PECR, which allows unsolicited marketing email to corporate subscribers but not to sole traders and partnerships without consent. Check with your own legal adviser for your use. Apify's blog post on web scraping legality covers the general picture.

πŸ‘ Your feedback

Found a business that came back wrong, or an area that returned less than Google Maps shows? Open an issue on the Issues tab with the input you used, and it will be looked at. If you need a version for another country or a different source, ask there too.

πŸ”Ž You might also like