How to Get Google Maps Data Without the Places API

The Google Maps Places API charges $17 per 1,000 results for the basic details tier, requires a Google Cloud billing account, and bills by the request with no free threshold beyond the initial credit. The NanoScrape Google Maps Scraper on Apify costs $1 per 1,000 places, needs no API key or Google account, and returns 30+ structured fields per place including phone, website, rating, opening hours, and GPS coordinates. You call it via a simple REST endpoint or from Python in a few lines. This guide walks through the cost difference, how to run your first search, and how to call it programmatically as a drop-in replacement.

Apify dataset table showing scraped Google Maps place results with columns for business name, address, phone, website, rating, and coordinates
Dataset output from one run: each row is a place with structured fields ready to consume via the API or export to CSV.
Difficulty: Beginner to intermediate
Time: 10 minutes
Cost: $1.00 per 1,000 places; $5/month free tier covers 5,000 places
Tools: Apify, NanoScrape Google Maps Scraper
Open the Google Maps Scraper on Apify See the cost breakdown

In this tutorial

  1. Google Maps API vs scraper
  2. What you get
  3. Prerequisites
  4. Step 1: Get an Apify account
  5. Step 2: Open the scraper
  6. Step 3: Set your search input
  7. Step 4: Run and review the results
  8. Call it via the Apify REST API
  9. Python: fetch place data in 10 lines
  10. Output fields reference
  11. What it costs
  12. FAQ

Google Maps API vs the NanoScrape scraper

The Google Maps Places API gives you programmatic access to place data, but the pricing adds up fast. The Text Search endpoint costs $17 per 1,000 requests for a basic set of fields, and the full Nearby Search or Place Details endpoint runs $32 per 1,000. On top of that you need a Google Cloud project, a billing account, and an API key that you rotate and secure yourself.

The NanoScrape Google Maps Scraper scrapes the same public place data directly and returns it in a structured JSON dataset. No API key, no Google Cloud account, no per-field SKU pricing.

The Google Maps API is the right choice when you need real-time lookups inside a user-facing app, or when you need certified routing data. The scraper is the right choice for batch data collection, research, lead generation, and any workflow where you query Google Maps once and store the results.

What you get per place

Every place in the dataset includes the following fields at the base price of $1 per 1,000:

Optional add-ons (billed separately or via your own LLM key): email extraction from the business website, AI-powered named contacts, open job listings, popular times histogram, and cold-outreach icebreakers.

Prerequisites

STEP 1

Get a free Apify account

  1. Open the actor page and click Try for free.
  2. Sign up with Google or email. Takes under a minute.
  3. You land on the actor input form inside Apify Console. The $5 monthly credit is added automatically.
Already have an account? Click the actor link and you land directly on the input form.
STEP 2

Open the scraper actor

After signing in, you see the actor page. The Information tab shows pricing, all supported input fields, and example inputs. The Input tab is where you run your first search.

Apify Console showing the NanoScrape Google Maps Scraper information tab with description and pricing overview
The actor's Information tab shows pricing and the full list of supported fields.
STEP 3

Set your search input

Click Input in the left sidebar. The most common setup is a list of search strings. Put the business type and location inside the same string:

{
  "searchStrings": [
    "plumbers in Chicago",
    "accountants in London",
    "yoga studios in Sydney"
  ],
  "maxResultsPerQuery": 20
}

To match what the Google Maps Places API returns for a specific location, use the queries field with explicit location and country:

{
  "queries": [
    {
      "query": "dentists",
      "location": "Berlin",
      "country": "DE",
      "company_id": "my-campaign-berlin"
    }
  ],
  "maxResultsPerQuery": 100
}
Apify Console Google Maps Scraper input form with search strings field filled in showing coffee shops in Berlin query
The Input tab with a simple search string. Add as many queries as you need; each runs as a separate search.
STEP 4

Run and review the results

  1. Click Start at the bottom of the Input tab.
  2. The run opens and shows the Log tab. Watch each batch arrive in real time.
  3. When the run shows Status: SUCCEEDED, click Dataset in the left sidebar.
  4. Use the Export button to download as JSON, CSV, or Excel.
Apify actor run log showing Google Maps Scraper run with SUCCEEDED status and item count in the header bar
Run log with SUCCEEDED status. The item count at the top shows how many places were extracted.
Runs with under 100 places typically finish in under 30 seconds. Larger batches of 1,000+ places usually take 2 to 5 minutes.

Call it via the Apify REST API

The scraper exposes a synchronous REST endpoint that works like any other data API: POST your query, get back a JSON array of places. This is the simplest way to use it as a direct replacement for the Google Maps Places API inside your own code or pipeline.

curl -s -X POST \
  "https://api.apify.com/v2/acts/santamaria-automations~google-maps-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchStrings": ["dentists in Chicago"],
    "maxResultsPerQuery": 50
  }'

The endpoint blocks until the run completes and returns the dataset as a JSON array. Swap YOUR_APIFY_TOKEN with your token from Console › Settings › Integrations.

For long batches (thousands of places), use the async pattern instead: start the run and poll for completion.

# 1. Start the run
RUN_ID=$(curl -s -X POST \
  "https://api.apify.com/v2/acts/santamaria-automations~google-maps-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchStrings":["hotels in Paris"],"maxResultsPerQuery":500}' \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['data']['id'])")

# 2. Poll until finished
until [ "$(curl -s \"https://api.apify.com/v2/actor-runs/$RUN_ID?token=YOUR_APIFY_TOKEN\" | python3 -c \"import json,sys; print(json.load(sys.stdin)['data']['status'])\")" = "SUCCEEDED" ]; do sleep 10; done

# 3. Fetch results
curl -s "https://api.apify.com/v2/actor-runs/$RUN_ID/dataset/items?token=YOUR_APIFY_TOKEN"

Python: fetch place data in 10 lines

Install the Apify client and run a search from Python. The call() method starts the run and blocks until it finishes:

pip install apify-client
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("santamaria-automations/google-maps-scraper").call(
    run_input={
        "searchStrings": ["coffee shops in Berlin"],
        "maxResultsPerQuery": 20,
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item.get("phone"), item.get("rating"))

Each item is a dictionary with all 30+ place fields. Pipe it into a database, a pandas DataFrame, or your own downstream service.

The Apify Python client handles authentication and polling automatically. For concurrent batch runs, use asyncio with the async client (apify-client[async]) to fire multiple searches in parallel.

Output fields reference

All fields below are included in every place row at the base price of $1 per 1,000 places:

What it costs

Billing is per place extracted, not per run.

The Apify free tier gives $5 of credit every month. At $1.00 per 1,000 places that covers 5,000 places per month at no cost. No subscription or credit card required to start.

Pricing effective since 2026-07-19. Apify has signaled a forthcoming pricing adjustment; check the actor page for the latest rates before budgeting a large run.

FAQ

Is this a true replacement for the Google Maps API?

For batch data collection, yes. The scraper returns the same public place data (name, address, phone, website, rating, hours, GPS) at a fraction of the cost. It is not suitable for real-time in-app lookups that require sub-100ms latency, routing calculations, or map tile rendering. For those use cases the official Google Maps APIs are the correct tool.

Do I need a Google Cloud account or API key?

No. The scraper does not use the Google Maps API. It scrapes Google Maps directly. You only need an Apify account, which is free to create.

How many results can I get per search?

Google Maps shows up to 120 places per search query. Set maxResultsPerQuery to 120 to get the maximum per query. Run multiple queries with different search strings to collect larger datasets. There is no hard cap on total places per account.

Can I call it from my own backend like a REST API?

Yes. Use the synchronous endpoint POST /v2/acts/santamaria-automations~google-maps-scraper/run-sync-get-dataset-items. It blocks until the run finishes and returns the dataset as a JSON array. For large batches, start an async run and poll the status endpoint until it shows SUCCEEDED, then fetch the dataset.

Does it work in all countries and languages?

Yes. The scraper works anywhere Google Maps has data. Pass an ISO 639-1 language code in the language field (for example de, fr, ja, zh) to get localized business names and categories.

Can I run it on a recurring schedule?

Yes. In Apify Console, open the actor and click Schedules to set up a cron-based trigger. You can also call the start endpoint from your own scheduler (cron, GitHub Actions, Airflow, etc.) using the Apify API.

Related resources

Open the Google Maps Scraper on Apify Browse all actors