DEV Community

Donny Nguyen
Donny Nguyen

Posted on • Originally published at rapidapi.com

Scrape Google Maps Business Data Without the $200/Month API Bill

Google Maps is the world's most complete database of local businesses. If you need business data — names, addresses, phone numbers, hours, ratings, reviews — it's all there.

The problem is Google's Places API. At $17 per 1,000 requests for basic data and $32 per 1,000 for contact details, costs spiral fast when you're doing anything at scale. A list of 10,000 businesses can cost $170-$320 in API calls alone.

There's a better way.

API Link: Google Maps Scraper API on RapidAPI

What It Returns

Search for any business type in any location:

{
  "success": true,
  "query": "coffee shops Austin TX",
  "count": 20,
  "data": [
    {
      "placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4",
      "name": "Merit Coffee",
      "address": "1900 Simond Ave, Austin, TX 78723",
      "phone": "(512) 555-0123",
      "website": "https://meritcoffee.com",
      "rating": 4.6,
      "reviewCount": 847,
      "category": "Coffee shop",
      "hours": {
        "monday": "7:00 AM - 7:00 PM",
        "tuesday": "7:00 AM - 7:00 PM"
      },
      "coordinates": {
        "lat": 30.2849,
        "lng": -97.6893
      },
      "googleMapsUrl": "https://maps.google.com/?cid=..."
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Quick Start

const axios = require('axios');

async function searchGoogleMaps(query, options = {}) {
  const response = await axios.get(
    'https://google-maps-scraper-api-production.up.railway.app/search',
    {
      params: {
        q: query,
        limit: options.limit || 20,
        language: options.language || 'en'
      },
      headers: {
        'X-RapidAPI-Key': 'YOUR_RAPIDAPI_KEY',
        'X-RapidAPI-Host': 'google-maps-scraper.p.rapidapi.com'
      }
    }
  );
  return response.data;
}

const businesses = await searchGoogleMaps('dentists Dallas TX', { limit: 50 });
Enter fullscreen mode Exit fullscreen mode

Use Cases

1. Local Business Lead Generation

The most common use case — build a list of businesses in any niche, any city:

async function generateLocalLeads(businessType, cities) {
  const allLeads = await Promise.all(
    cities.map(city => searchGoogleMaps(`${businessType} ${city}`))
  );

  return allLeads
    .flatMap(r => r.data)
    .filter(b => b.website) // Only businesses with websites
    .map(b => ({
      name: b.name,
      phone: b.phone,
      website: b.website,
      rating: b.rating,
      reviews: b.reviewCount,
      address: b.address
    }));
}

// Generate leads for a web design agency targeting restaurants in DFW
const leads = await generateLocalLeads('restaurants', [
  'Dallas TX', 'Fort Worth TX', 'Plano TX', 'Irving TX', 'Frisco TX'
]);
Enter fullscreen mode Exit fullscreen mode

2. Competitor Mapping

Map all competitors in your service area:

async function mapCompetitors(yourNiche, serviceArea) {
  const results = await searchGoogleMaps(`${yourNiche} ${serviceArea}`, { limit: 100 });

  return results.data
    .sort((a, b) => b.reviewCount - a.reviewCount) // Sort by review volume
    .map(b => ({
      name: b.name,
      rating: b.rating,
      reviews: b.reviewCount,
      phone: b.phone,
      website: b.website
    }));
}
Enter fullscreen mode Exit fullscreen mode

3. Review Monitoring

Track competitor ratings over time:

// Store results in your DB, check daily for rating changes
async function trackCompetitorRatings(businessNames, location) {
  const results = await Promise.all(
    businessNames.map(name => searchGoogleMaps(`${name} ${location}`, { limit: 3 }))
  );

  return results.map((r, i) => ({
    business: businessNames[i],
    currentRating: r.data[0]?.rating,
    reviewCount: r.data[0]?.reviewCount,
    checkedAt: new Date().toISOString()
  }));
}
Enter fullscreen mode Exit fullscreen mode

4. Directory / Listing Site

Build a local business directory for a specific niche:

async function buildDirectory(categories, city) {
  const allData = await Promise.all(
    categories.map(cat => searchGoogleMaps(`${cat} ${city}`, { limit: 50 }))
  );

  return categories.reduce((dir, cat, i) => {
    dir[cat] = allData[i].data;
    return dir;
  }, {});
}

const dfwDirectory = await buildDirectory([
  'plumbers', 'electricians', 'HVAC', 'landscaping', 'roofing'
], 'Dallas TX');
Enter fullscreen mode Exit fullscreen mode

5. Enrich a Lead List

You have a list of business names — add phone, address, rating:

async function enrichWithGoogleMaps(businesses) {
  return Promise.all(
    businesses.map(async business => {
      const result = await searchGoogleMaps(`${business.name} ${business.city}`, { limit: 1 });
      const data = result.data[0];

      return {
        ...business,
        phone: data?.phone,
        rating: data?.rating,
        reviewCount: data?.reviewCount,
        website: data?.website || business.website
      };
    })
  );
}
Enter fullscreen mode Exit fullscreen mode

Parameters

Parameter Type Required Description
q string Yes Search query (business type + location)
limit number No Results to return (1-50, default: 20)
language string No Language code (default: en)

Pricing

Plan Requests/mo Price
BASIC 500 Free
PRO 10,000 $9.99/mo
ULTRA 50,000 $29.99/mo
MEGA 200,000 $79.99/mo

vs Google Places API

Google Places API Google Maps Scraper API
Basic data $17/1,000 $0.001/request on PRO
Contact details $32/1,000 Included
Setup OAuth, billing setup API key only
Rate limits Strict Flexible
Monthly min None but costs add up $0 on BASIC

For a 10,000-request workload: Google Places costs $170-$320. PRO plan here: $9.99.

Get Started

Subscribe to Google Maps Scraper API on RapidAPI →

Free plan available — 500 requests/month at no cost.


Built by Donny Dev — full data API suite: Apollo Lead Scraper · Email Extractor · Website Tech Detector · DuckDuckGo Search

Top comments (0)