Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

Short answer: do not copy Google Maps listings, addresses, reviews, phone numbers or map tiles with browser automation into your own database. Google’s Maps Platform Terms dated July 14, 2025 state: “Customer will not export, extract, or otherwise scrape Google Maps Content for use outside the Services.” For a supported integration, use Places API (New), request only the fields your feature needs, and keep Google’s display, attribution, storage and policy requirements attached to the data.

The examples below show a working Places API (New) workflow, bounded pagination, field-mask selection, error handling and an open-data alternative. A screenshot is not a permission slip to build a directory or review archive.

What “scraping Google Maps” means in practice

People usually mean one of four jobs: finding businesses by category and city, exporting places to CSV, collecting reviews and phone numbers, or copying map results into a lead database. A script can automate a browser, read rendered HTML, intercept network calls or save map tiles. Technical access does not establish permission.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Google’s Maps Platform Terms (Google Cloud archive, July 14, 2025) prohibit exporting, extracting or scraping Google Maps Content for use outside the Services. The same rules restrict bulk downloads and copying business names, addresses and reviews. This article is not legal advice; terms, regional rules and API policies can change, so check the current Google terms for your deployment.

Uses that need a different design

  • A permanent external directory populated from Google listings.
  • A bulk CSV or database of names, addresses, phone numbers or reviews.
  • An archive of Google reviews or a machine-learning corpus made from Maps content.
  • A mirror of Google map tiles or a service that republishes Google results without the required map and attribution experience.

Do not assume that a low request rate, a residential proxy or a CAPTCHA-solving service makes one of these uses compliant. If you have separate written permission or another clearly applicable legal basis, get that reviewed independently and keep the permission with your data-governance records.

The supported route: Places API (New)

Places API (New) is Google’s documented programmatic path for place search and details. Its relevant methods are Text Search, Nearby Search, Place Details, Place Photo and Autocomplete. The API returns JSON place objects rather than a browser page to copy.

Plan the exact user-facing feature

  1. Write down the user action, such as “find coffee shops within a map view,” before choosing an endpoint.
  2. List the smallest set of fields needed for that screen: for example, place ID, display name, formatted address and location.
  3. Decide how the result will be shown. Results displayed as Places results must appear on a Google Map with the required Google logo and third-party attribution.
  4. Publish public Terms of Use and a Privacy Policy that incorporate Google’s applicable terms.

Enable access and protect credentials

  1. In Google Cloud, create or select a project, attach a billing account and enable Places API (New).
  2. Create an API key (or use OAuth where your application requires it). Restrict the key by API and by server IP, Android package, or iOS bundle as appropriate.
  3. Keep the key on your server for server-to-server calls. Never commit it to a repository or expose an unrestricted key in client-side JavaScript.

Text Search (New): a compliant first request

Text Search accepts a natural-language textQuery, such as a category plus locality. It requires an explicit field mask in the X-Goog-FieldMask header. The documented maximum is 60 results across all pages, and Google notes that identical requests are not guaranteed to return a consistent list.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

cURL

curl -X POST 'https://places.googleapis.com/v1/places:searchText' 
  -H 'Content-Type: application/json' 
  -H "X-Goog-Api-Key: $GOOGLE_MAPS_API_KEY" 
  -H 'X-Goog-FieldMask: places.id,places.displayName,places.formattedAddress,places.location,places.googleMapsUri,nextPageToken' 
  -d '{
    "textQuery": "vegan restaurants in Austin, Texas",
    "pageSize": 20
  }'

The response contains a places array and, when more results are available, a nextPageToken. Store the token only for the immediate continuation of that search; do not treat pagination as an unlimited export mechanism.

Python with requests

import os
import requests

url = "https://places.googleapis.com/v1/places:searchText"
headers = {
    "Content-Type": "application/json",
    "X-Goog-Api-Key": os.environ["GOOGLE_MAPS_API_KEY"],
    "X-Goog-FieldMask": (
        "places.id,places.displayName,places.formattedAddress,"
        "places.location,places.googleMapsUri,nextPageToken"
    ),
}
payload = {
    "textQuery": "vegan restaurants in Austin, Texas",
    "pageSize": 20,
}
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
for place in response.json().get("places", []):
    print(place.get("id"), place.get("displayName", {}).get("text"),
          place.get("formattedAddress"))

Node.js (built-in fetch)

const apiKey = process.env.GOOGLE_MAPS_API_KEY;
const response = await fetch('https://places.googleapis.com/v1/places:searchText', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Goog-Api-Key': apiKey,
    'X-Goog-FieldMask': 'places.id,places.displayName,places.formattedAddress,places.location,places.googleMapsUri,nextPageToken'
  },
  body: JSON.stringify({
    textQuery: 'vegan restaurants in Austin, Texas',
    pageSize: 20
  })
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const data = await response.json();
for (const place of data.places ?? []) {
  console.log(place.id, place.displayName?.text, place.formattedAddress);
}

Choose the right Places method

Text Search

Use it when a user types a phrase, category or locality. Keep the query specific (“bike repair in Portland, Oregon”) rather than attempting many broad queries to simulate a directory.

Nearby Search

Use it when you have a geographic area and a supported place type. Send a location restriction and request only the fields needed by the map or list. A radius and type-based search is more predictable than scraping whatever happens to be visible in a browser viewport.

Place Details

Use the place ID returned by search when a user opens a result and needs additional fields. Make the details call on demand instead of requesting every expensive field for every search result.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Place Photo

Use the documented photo flow for an image shown in your application. Do not download an uncontrolled photo collection for redistribution.

Autocomplete

Use it for search-box suggestions while the user types. Tie selections to a place ID, then fetch details only after the user chooses a suggestion.

Field masks, billing and quotas

A field mask is both a performance control and a billing control. Google states that field selection affects response size, latency and the SKU charged; a request is charged by the highest SKU represented by the fields you ask for. Requesting * can therefore increase cost and payload size unnecessarily.

  • Start with identifiers, display name, address and location.
  • Add phone, opening hours, ratings or other fields only when a visible feature requires them.
  • Keep separate masks for search cards and detail screens.
  • Set quotas and budget alerts in Google Cloud, then monitor status codes and usage by project.

Quotas and prices can change by region and product revision. Treat the Cloud Console configuration and current Places documentation as authoritative for your account.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Pagination without turning a search into an export

  1. Request a modest pageSize that matches the screen.
  2. Render the first response and let the user ask for more.
  3. Follow nextPageToken only while the user is continuing that search.
  4. Stop after the documented 60-result maximum across Text Search pages, or sooner when the user has enough results.
  5. Do not run hundreds of slightly altered queries to assemble a larger, permanent list.

Because identical requests may return different lists, never promise users a stable “complete” inventory. If your product requires deterministic records, define your own permitted data source and update policy instead of treating Google search results as a database snapshot.

Displaying, storing and deleting results

Display requirements

When your application displays Places results, show them on a Google Map with the required Google logo and third-party attribution. Keep attribution adjacent to the relevant result or map rather than hiding it in a generic credits page.

Storage boundaries

Design storage around the feature, not around an export. Keep short-lived request state needed to render a session, retain your own user-generated notes separately, and avoid building a second directory from Google fields. Review the current Maps terms for retention rules before persisting any place content.

Privacy and user requests

Document what your application sends to Google, why it sends it and how long your own logs remain. Provide the public Terms of Use and Privacy Policy required for your application, and make deletion or account-closure behavior explicit.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

OpenStreetMap and Nominatim as an open-data alternative

If your goal is geocoding or an open-data workflow rather than Google-specific place content, OpenStreetMap data queried through Nominatim may fit better. It has different coverage, licensing and operational constraints; it is not a drop-in replacement for Google ratings, reviews or every business attribute.

Axis Places API (New) OpenStreetMap/Nominatim
Data source Google place data and Google-hosted APIs OpenStreetMap open data through the Nominatim geocoder
Best fit Current, user-facing place search inside a Google Maps application Geocoding and open-data workflows that tolerate coverage differences
Controls API key or OAuth, field masks, quotas, paid SKUs and Google attribution Public-server acceptable-use policy; one-request-per-second ceiling for heavy use
Storage and redistribution Google terms restrict export, extraction, copying and bulk download Follow OSM licensing and Nominatim policy; self-host for regular volume
Operational risk Billing, quotas, policy compliance and result-limit changes Rate limiting, service availability and variable point-of-interest coverage

The OpenStreetMap Foundation’s current Nominatim Usage Policy sets an absolute maximum of one request per second for heavy use on the public service and recommends alternatives or self-hosting for regular workloads. Cache responsibly, identify your application and do not send concurrent bursts to the shared endpoint.

Common errors and fixes

400 invalid argument or missing field mask

Check that the JSON contains textQuery, the endpoint is the Places API (New) endpoint, and X-Goog-FieldMask is present and syntactically valid. Remove fields your project or method does not support.

401 or 403 authentication errors

Verify the key, API enablement, billing account and key restrictions. A key restricted to a different API, referrer type or IP range will fail even when the value is correct.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

429 quota exceeded

Read the response headers and Cloud Console metrics, then reduce concurrency, add exponential backoff for transient failures and request a quota adjustment if the workload is legitimate. Do not respond by rotating keys or creating projects to evade limits.

Unexpectedly high charges

Inspect the field mask for high-SKU fields, remove wildcard masks, set per-project budgets and separate search from detail calls. A large response does not automatically mean a better user experience.

Fewer results than expected

Text Search is relevance-ranked, bounded at 60 results across pages and not guaranteed to be stable between identical requests. Narrow the query, use Nearby Search for a defined area, or choose an open dataset when you need broad enumeration.

Results cannot be shown outside a map

Rework the interface so Places results appear on a Google Map with the required attribution, or use a data source whose license supports your standalone directory. Do not hide Google attribution to make a scraped-looking list.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance and reliability practices

  • Debounce Autocomplete input and cancel stale requests.
  • Use short timeouts, bounded retries and exponential backoff for transient 5xx responses.
  • Request detail data after a click, not for every card in the initial response.
  • Log request IDs, status codes, field masks and latency without logging unnecessary personal data.
  • Load-test against your own quota limits and budget alerts, not by hammering production endpoints.
  • Provide an empty-state and retry action when a place is unavailable, rather than silently substituting stale or copied data.

Or skip the browser setup

If you only need a visual capture of a page you are authorized to capture—not a structured Google Maps export—ScreenshotNeo makes one GET request and returns PNG, JPEG, WebP or PDF. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server lets Claude, Cursor and other MCP clients call take_screenshot, get_page_info and capture_pdf.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.google.com/maps -o shot.webp

Read the complete options and authorization details in the ScreenshotNeo documentation. A screenshot remains an image; it does not authorize extracting listings, reviews or map tiles, and Google’s terms still govern Google content.

The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots, and every feature is included on every plan. Create a free ScreenshotNeo account.

Frequently Asked Questions

Can I expose a Places API key in a mobile app?

Use platform restrictions and the minimum permissions required for the app, and keep server-side calls server-side. An unrestricted key can be copied and abused.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What should I do if my product needs a nationwide business inventory?

Choose a data provider whose license explicitly permits directory creation and bulk redistribution, or obtain written permission. Do not assemble the inventory by repeatedly querying Google.

Does taking a screenshot avoid Google Maps licensing rules?

No. A visual capture changes the format, not the rights or attribution obligations. Use screenshots only for an authorized presentation or diagnostic purpose.

The Bottom Line

For a Google-powered place feature, use Places API (New), explicit field masks, bounded pagination and the required map attribution. Do not turn browser automation or API responses into an external Google Maps database.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.