Skip to content

Python guide

Scrape Google Maps
with Python.
One script. 100 businesses a call.

A Google Maps scraper in one Python script: every business for a search and an area, with its address, phone, website, rating and review count, saved to CSV. One API key. No Google Cloud account, browser or proxies.

  • 4 creditsper search
  • 100businesses on the recorded search
  • 0Google Cloud accounts
import csv
import os
import requests

API_URL = "https://www.monocrawl.com/v1/google_search/maps"
HEADERS = {"x-api-key": os.environ["MONOCRAWL_API_KEY"]}

SEARCHES = [
    ("coffee roasters", "Brooklyn,New York,United States"),
    ("coffee roasters", "Queens,New York,United States"),
]


def search_maps(query, location, limit=100):
    params = {"query": query, "location": location, "limit": limit}
    body = requests.get(API_URL, params=params, headers=HEADERS, timeout=90).json()
    if not body.get("success"):
        raise RuntimeError(body["error"]["message"])
    return body["data"]["items"]


seen = set()
with open("places.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["name", "category", "address", "phone", "website", "rating", "reviews",
                     "latitude", "longitude", "place_id"])
    for query, location in SEARCHES:
        for place in search_maps(query, location):
            if place["place_id"] in seen:
                continue
            seen.add(place["place_id"])
            rating = place.get("rating") or {}
            writer.writerow([place["name"], place["category"], place["address"], place["phone"], place["url"],
                             rating.get("value"), rating.get("votes"), place["latitude"], place["longitude"],
                             place["place_id"]])

$ python places.py

GET /v1/google_search/maps query=coffee roasters · Brooklyn

✓ 100 businesses · 4 credits · one call

✓ 70 with a phone · 89 with a website link · 99 rated

↻ next search: another area or keyword, 4 credits each

✓ places.csv · repeats dropped by place_id

Replay of a real call, recorded 26 Sep 2026

Four steps

Copy, paste, run.
See what each step returns.

Terminal
export MONOCRAWL_API_KEY="mn_your_key_here"
pip install requests

What you get

MONOCRAWL_API_KEY=mn_••••••••Free plan · 1,000 credits a month · No card

What comes back

One search.
Real businesses.

A real Google Maps search for coffee roasters in Brooklyn: 100 businesses for 4 credits, all different. 70 came with a phone number, 89 with a website link and 99 with a rating. 8 of them are below.

  • name, categoryThe business and its Google Maps category
  • addressIts full street address
  • phoneIts phone number, when listed
  • url, domainIts website link, when listed
  • ratingStar rating (value) and review count (votes)
  • latitude, longitudeWhere it is on the map
  • place_id, cidGoogle’s ids, for reviews and details
  1. Brooklyn Roasting Company

    543 Metropolitan Ave, Brooklyn, NY 11211

    4.8 (189)www.brooklynroasting.com+1347-799-1173
  2. Passionfruit Coffee

    733 Madison St, Brooklyn, NY 11221

    4.9 (644)passionfruitcoffee.com+1347-221-0185
  3. Obscure Coffee Roasters

    259 Melrose St, Brooklyn, NY 11206

    4.9 (184)www.obscure.coffee
  4. Nostrand Coffee Roaster

    261 Nostrand Ave, Brooklyn, NY 11216

    4.4 (417)www.nostrandcafe.com+1718-975-8588
  5. Brooklyn Kettle

    385 Tompkins Ave, Brooklyn, NY 11216

    4.6 (140)brooklynkettle.com+1718-676-5154
  6. LUDWIG COFFEE

    43 Washington Ave, Brooklyn, NY 11205

    4.9 (19)ludwigcoffee.com+1866-583-9447
  7. ARVACI Coffee

    167 Rogers Ave, Brooklyn, NY 11216

    4.7 (386)+1518-709-4680
  8. Soul Cafe Coffee Roasters

    478 Halsey St, Brooklyn, NY 11233

    4.3 (47)www.soulcafecoffee.com+1917-558-4300
Show the JSON
{
  "success": true,
  "data": {
    "items": [
      {
        "rank": 8,
        "name": "Brooklyn Roasting Company",
        "category": "Coffee shop",
        "address": "543 Metropolitan Ave, Brooklyn, NY 11211",
        "phone": "+1347-799-1173",
        "url": "http://www.brooklynroasting.com/",
        "domain": "www.brooklynroasting.com",
        "rating": {
          "value": 4.8,
          "votes": 189
        },
        "place_id": "ChIJJfrC_sFZwokRLHD-4E2jvHM",
        "latitude": 40.714197,
        "longitude": -73.9507988
      },
      {
        "rank": 6,
        "name": "Passionfruit Coffee",
        "category": "Coffee shop",
        "address": "733 Madison St, Brooklyn, NY 11221",
        "phone": "+1347-221-0185",
        "url": "http://passionfruitcoffee.com/",
        "domain": "passionfruitcoffee.com",
        "rating": {
          "value": 4.9,
          "votes": 644
        },
        "place_id": "ChIJfSF73pFdwokRCYoD0KuPKUY",
        "latitude": 40.6875194,
        "longitude": -73.9273596
      },
      {
        "rank": 9,
        "name": "Obscure Coffee Roasters",
        "category": "Coffee shop",
        "address": "259 Melrose St, Brooklyn, NY 11206",
        "phone": null,
        "url": "https://www.obscure.coffee/",
        "domain": "www.obscure.coffee",
        "rating": {
          "value": 4.9,
          "votes": 184
        },
        "place_id": "ChIJFS48SUtdwokRI8khE9LOSd8",
        "latitude": 40.7020079,
        "longitude": -73.9299529
      },
      {
        "rank": 7,
        "name": "Nostrand Coffee Roaster",
        "category": "Coffee roastery",
        "address": "261 Nostrand Ave, Brooklyn, NY 11216",
        "phone": "+1718-975-8588",
        "url": "http://www.nostrandcafe.com/",
        "domain": "www.nostrandcafe.com",
        "rating": {
          "value": 4.4,
          "votes": 417
        },
        "place_id": "ChIJLwlwGZNbwokRx86bnl6HSYc",
        "latitude": 40.6897767,
        "longitude": -73.9512151
      },
      {
        "rank": 5,
        "name": "Brooklyn Kettle",
        "category": "Coffee shop",
        "address": "385 Tompkins Ave, Brooklyn, NY 11216",
        "phone": "+1718-676-5154",
        "url": "http://brooklynkettle.com/",
        "domain": "brooklynkettle.com",
        "rating": {
          "value": 4.6,
          "votes": 140
        },
        "place_id": "ChIJK_gbiY5bwokRdJ8R6hOHxhM",
        "latitude": 40.6843599,
        "longitude": -73.9439537
      },
      {
        "rank": 11,
        "name": "LUDWIG COFFEE",
        "category": "Coffee roastery",
        "address": "43 Washington Ave, Brooklyn, NY 11205",
        "phone": "+1866-583-9447",
        "url": "https://ludwigcoffee.com/",
        "domain": "ludwigcoffee.com",
        "rating": {
          "value": 4.9,
          "votes": 19
        },
        "place_id": "ChIJy2moLdNbwokRT3S3m0Qr7zQ",
        "latitude": 40.6973455,
        "longitude": -73.96733139999999
      },
      {
        "rank": 4,
        "name": "ARVACI Coffee",
        "category": "Coffee shop",
        "address": "167 Rogers Ave, Brooklyn, NY 11216",
        "phone": "+1518-709-4680",
        "url": null,
        "domain": null,
        "rating": {
          "value": 4.7,
          "votes": 386
        },
        "place_id": "ChIJQXXzJoNbwokRZirX7jSW1i0",
        "latitude": 40.6716473,
        "longitude": -73.9529333
      },
      {
        "rank": 3,
        "name": "Soul Cafe Coffee Roasters",
        "category": "Coffee shop",
        "address": "478 Halsey St, Brooklyn, NY 11233",
        "phone": "+1917-558-4300",
        "url": "https://www.soulcafecoffee.com/",
        "domain": "www.soulcafecoffee.com",
        "rating": {
          "value": 4.3,
          "votes": 47
        },
        "place_id": "ChIJTYNWFJRdwokRJkcNsZYfAOw",
        "latitude": 40.6833495,
        "longitude": -73.9349769
      }
    ]
  }
}

Cost

4 credits a search.
Nothing for failures.

Every search costs 4 credits and returns up to 100 businesses; the recorded one returned 100. Slide to see what a list costs.

40credits, 4 per search
$0a month: the free plan covers it, no card
25collections like this a month on the free plan

Estimated at 100 businesses a search, as on the recorded search. Smaller areas can return fewer. Failed calls are free.

Two more things

Reviews,
errors and rate limits.

A business’s reviews

Pass a place_id from the search to google_places/reviews for the reviews Google shows first on the listing, with each rating and text, 2 credits a place.

reviews.py
REVIEWS_URL = "https://www.monocrawl.com/v1/google_places/reviews"

body = requests.get(REVIEWS_URL, params={"id": "ChIJJfrC_sFZwokRLHD-4E2jvHM"}, headers=HEADERS, timeout=60).json()
for review in body["data"]["items"]:
    print(review["rating"], review["text"])

Errors and rate limits

A failed call returns success: false with an error type and message, and costs nothing. On HTTP 429, wait and try again.

Rate limits by plan
places.py
import time

def get_page(params, attempts=5):
    for attempt in range(attempts):
        response = requests.get(API_URL, params=params, headers=HEADERS, timeout=60)
        if response.status_code != 429:
            return response.json()
        time.sleep(2 ** attempt)
    raise RuntimeError("Still rate limited; try again later")

Other platforms

Same loop.
Swap the endpoint.

The same key searches local businesses on other sites. Each endpoint’s reference lists its fields.

Questions

Scraping Google Maps,
answered.

Do I need a Google Maps API key or a Google Cloud account?

No. You call Monocrawl with your API key and get the businesses back as JSON. There is no Google Cloud project or billing account to set up.

How many businesses does one search return?

Up to 100. The recorded search for coffee roasters in Brooklyn returned 100, all different. For more, search more areas or keywords and drop repeats by place_id, as the script does.

What does it cost?

4 credits a search. The free plan’s 1,000 credits a month cover 250 searches, up to 25,000 businesses. Failed calls are free.

Does it include phone numbers, websites and emails?

Phone numbers and website links, when the business lists them: 70 of the 100 recorded businesses had a phone and 89 a website link. Google Maps doesn’t list email addresses.

Can I get each business’s reviews?

Yes. Pass the place_id to google_places/reviews for the reviews Google shows first, 2 credits a place.

What about Google’s own Places API?

Google’s Places API bills per request through a Google Cloud billing account. Our Google Maps data API comparison sets out its prices next to the main providers.

Start free

Businesses from any Google Maps search.
4 credits a search.

1,000 free credits every month. No card required.

Get a free API key