Skip to content
ScrapeField

Local lead lists from Google Maps

Nearly every local business is on Google Maps, with its phone, website, rating and hours. Search a city street by street, keep the businesses you can sell to, and drop the ones that closed, into a sheet, a CRM or an n8n workflow.

What you get

  • A city’s businesses of one kind, with phone, website, rating and how many reviews.
  • The ones with no website, the easiest to sell a website to.
  • Closed businesses out before anyone calls them.
  • A market mapped by category and price level, street by street.

Worked examples

Each with the calls it makes and what a run costs, multiplied out from the published price of every call.

01

Build a lead list for a city

Search a category neighbourhood by neighbourhood and every result already carries its phone, website, rating and opening hours — no second call per business. Duplicates across neighbourhoods collapse on the place_id.

GET google-maps/places× 515 cr
per run, up to 100 businesses15 cr

≈ $0.009 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const areas = ['Alfama', 'Baixa', 'Chiado', 'Estrela', 'Belém'];
const leads = new Map();

for (const area of areas) {
  const query = 'coffee shops in ' + area + ', Lisbon';
  const { data } = await sf('google-maps/places', { query, limit: 20 });
  for (const p of data) {
    leads.set(p.place_id, {
      name: p.name,
      phone: p.international_phone_number,
      website: p.website,
      rating: p.rating,
      reviews: p.user_ratings_total,
    });
  }
}

console.table([...leads.values()]);
02

Map a market before you enter it

Lay a grid over a city and search around each point, so no part of it is missed by a 20-result ceiling. Group what comes back by category and you have ratings, review counts and price levels, street by street.

GET google-maps/places× 2575 cr
one city centre, a 5 × 5 grid75 cr

≈ $0.045 at the 250k pack

const API = 'https://api.scrapefield.com/v1';
const sf = (path, q) =>
  fetch(API + '/' + path + '?' + new URLSearchParams(q), {
    headers: { Authorization: 'Bearer ' + process.env.SCRAPEFIELD_KEY },
  }).then((r) => r.json());

const seen = new Map();

for (let i = 0; i < 5; i++) {
  for (let j = 0; j < 5; j++) {
    const lat = 38.70 + i * 0.009;
    const lng = -9.17 + j * 0.0115;
    const q = { query: 'restaurant', lat, lng, radius_m: 700 };
    const { data } = await sf('google-maps/places', q);
    for (const p of data) seen.set(p.place_id, p);
  }
}

const places = [...seen.values()];
const byCategory = Object.groupBy(places, (p) => p.category);

Step by step

Guides that build one of these from the first call to the finished sheet, workflow or alert.

The endpoints

Every call above, with its price. A failed call costs nothing.

What it does not do

Google Maps shows no email addresses, so neither does this. A business’s own website often has one.

Your first call, in a minute

Get a key