Build local business lead lists with a Google Maps scraper API
A Google Maps scraper API turns a category and a city into a lead list: “dentists in lyon” returns the businesses Google Maps shows, with address, phone, website, rating, opening hours and a Google Place ID. Sales teams, agencies and local marketplaces all need that list fresh and structured. The Search API returns it as JSON, and the same SDK finds the contact emails on each website.
Local business data is locked in a map, one pin at a time
Everything a lead list needs is on Google Maps: the name, the address, the phone number, the website and how well the business is reviewed. It is also presented one pin and one side panel at a time, and copying a few hundred listings by hand is a week of work that goes stale as businesses open, move and close.
Scraping the map yourself means driving a browser through an infinite scroll, parsing panels whose markup keeps changing, and routing the session through proxies so it is not blocked. Directories sell the same data in bulk, but you get a static export, not a query you can rerun for a new city tomorrow.
type: maps returns each listing with title, address, coordinates, rating and ratingCount, types, price level, phone, website url, opening hours by day and the Google Place ID. Listings carry no email field, so the SDK emails method reads addresses from the business website in a second call.
How to pull local business data from Google Maps with an API
Search a category in a city, keep the fields a sales team uses, then enrich the listings that have a website. The maps guide documents every field.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
const page = await microlink.search('dentists in lyon', {
type: 'maps',
location: 'fr'
})
const leads = page.results.map(place => ({
name: place.title,
address: place.address,
phone: place.phone?.number,
website: place.url,
rating: place.rating,
reviews: place.ratingCount,
hours: place.opening?.hours,
placeId: place.place?.id
}))phone, url, opening and place are optional, since not every listing has them. place.id is the Google Place ID, the key for downstream calls to other mapping services.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
let page = await microlink.search('dentists in lyon', {
type: 'maps',
location: 'fr'
})
const byCid = new Map()
while (page && page.results.length > 0 && byCid.size < 60) {
for (const place of page.results) byCid.set(place.cid, place)
page = await page.next()
}Each next() call is one more request for the following page of listings. Keying on cid, which every listing carries, keeps each business once.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
const enriched = await Promise.all(
Array.from(byCid.values())
.filter(place => place.url && place.rating >= 4.5)
.map(async place => ({
name: place.title,
phone: place.phone?.number,
website: place.url,
emails: await microlink.emails(place.url)
}))
)emails() scans the site for mailto links and addresses in plain text and returns bare strings. It is one request per website, so filter down to the leads you will contact before enriching.
- type 'maps' adds opening hours, price level, types, description and Place ID to the places fields.
- type: 'places' The lighter type: name, address, coordinates, rating, ratingCount, category, phone and website.
- location Two-letter country code. Put the city in the query itself.
- page Jumps to a later page of listings; next() walks them one by one.
- emails Addresses found on a website, from mailto links and plain text, as bare strings.
Addresses written as name [at] domain, drawn as images or assembled by JavaScript are not detected by emails(). The entity and local lookup pattern shows when places is enough and when maps is worth it.
Why Google Maps listings beat a directory export for lead lists
A directory export is a snapshot. A query is a list you can rebuild for any category, any city, any day.
Generate category and city pairs and run them in parallel. Keyword research with autocomplete finds the category names people actually type.
Only need names, addresses and coordinates for a map? The places type returns fewer fields, as the places guide shows.
When not to: maps results include no email addresses, owner names or company registration data, and a public listing is not consent to be contacted. Check the outreach rules of each market you prospect. To read custom fields from each business website, extract them from the site itself.
FAQ
Can a Google Maps scraper API return business emails?
What is the difference between the places and maps search types?
How do I get more than one page of Google Maps business listings?
How much does a local business data API cost with Microlink?
Is this the official Google Maps Platform API?
Solve the next problem with the same API
Keyword research with Google Autocomplete
Price comparison from Google Shopping
Google rank tracking by country
Brand and media monitoring from Google News
LLM context from any URL
Custom fields alongside metadata
Ready to build your lead list?
Businesses from Google Maps with phone, website, hours and Place ID, plus the emails on each site. Start with one city today.