Skip to content
Search API · Use case

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.

The problem

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 it works

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.

1 · Search a category in a city
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.

2 · Go past the first page
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.

3 · Find the emails on each website
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.

Parameters used
  • 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 it works

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.

01 · Query, not export
New city, new list, same code.
Change “dentists in lyon” to “physiotherapists in porto” and the same pipeline produces a new list. Coverage follows what Google Maps shows for the query, which is also where local customers look.

Generate category and city pairs and run them in parallel. Keyword research with autocomplete finds the category names people actually type.

02 · Qualify before you call
Ratings, reviews and hours are already fields.
rating and ratingCount separate established businesses from new ones, opening.hours tells your team when someone will pick up, and price.level segments by market position. Qualifying is plain JavaScript over the JSON.

Only need names, addresses and coordinates for a map? The places type returns fewer fields, as the places guide shows.

03 · Contact data where it exists
Phone from the listing, email from the website.
Listings carry the phone number Google shows and the website URL. The website is where businesses publish their addresses, and the same client reads them with one call per site.

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?

Not from the listing: maps results include phone, website, address, hours and ratings, but no email field. Pass each website URL to microlink.emails() to collect the addresses published on the site, one request per website.

What is the difference between the places and maps search types?

places returns simpler listings: name, address, coordinates, rating, review count, category, phone and website. maps adds opening hours by day, price level, place types, a description, a thumbnail and the Google Place ID. Use maps for lead lists where hours and IDs matter.

How do I get more than one page of Google Maps business listings?

Call page.next() to fetch the following page with the same query and options, or pass page: 3 to jump straight to it. Each page is one request, so stop as soon as you have enough listings.
Each search page is one request and each emails() call one more. Search has no free tier: it is paid from the first request, and Pro plans start at €39/month for 46,000 requests with a 99.9% SLA.

Is this the official Google Maps Platform API?

No. Microlink Search is an independent product that queries public Google surfaces and returns structured results. It is not affiliated with or endorsed by Google, and Google is a trademark of Google LLC.
Related use cases

Solve the next problem with the same API

Keyword research with Google Autocomplete

Expand a seed into the queries people type, plus related searches and People Also Ask questions, per country.

Price comparison from Google Shopping

Get every merchant Google Shopping lists for a product, with a numeric price, the merchant name and the rating, per country.

Google rank tracking by country

Compute where a domain ranks for each keyword in each country from ordered results, and keep the history in your own database.

Brand and media monitoring from Google News

Query Google News by brand, country and time window and get headline, publisher and ISO 8601 date for every article.

LLM context from any URL

Compose Markdown, links, emails, metadata and tech stack from one URL into a context object for your agent.

Custom fields alongside metadata

Get prices, ratings, headings or any CSS selector, typed and returned next to the normalized 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.