On 7 October 2026 we pulled the 100 newest Google reviews of 8 US places, one API call per place: 800 of 800 reviews came back, each with its star rating, an ISO timestamp, the author and a unique review id. A run of 100 reviews fetched live took 13.3 to 17.5 seconds, and the whole test cost $0.40 at list price. Below: the code, what the rows contain, and how often you actually need to pull.
Three ways to scrape Google reviews
Most guides on how to scrape Google reviews offer the same three routes. They differ in how many reviews you get, who maintains the scraper, and whether you can read reviews of places you do not own.
| Route | Reviews per place | Any place? | You maintain |
|---|---|---|---|
| Google Places API (Place Details) | 5 at most, sorted by relevance | Yes | An API key and billing account |
| Google Business Profile API | All of them | No, only locations you manage | OAuth and a verified profile |
| Browser script (Selenium, Playwright) | As many as you can scroll | Yes | Chrome, selectors, consent screens, IPs |
| Reviews collector (API or MCP) | Up to 100 per run, paginated for you | Yes | One HTTP call |
The official Places API is the right call when five reviews are enough, for example to show a snippet on a store locator: Google's reference says a maximum of 5 reviews can be returned per place. The Business Profile API is the right call for your own locations, since it lists every review and lets you reply. Everything else, such as competitor monitoring, market research or sentiment across a category, needs a scraper. The rest of this post uses the Google reviews scraper API, which runs the paginated Maps reviews feed on a residential exit and returns rows.
What we measured on 7 October 2026
We picked eight well-known US places across six categories, asked for the 100 newest reviews of each in English with sort_by: newest, and addressed every place by name and city only, with no ids prepared in advance.
| Place | Reviews | Avg stars | With text | Owner replies | Days covered |
|---|---|---|---|---|---|
| Katz's Delicatessen, New York | 100 | 4.37 | 62 | 0 | 6.5 |
| Griffith Observatory, Los Angeles | 100 | 4.74 | 43 | 0 | 6.9 |
| Apple Fifth Avenue, New York | 100 | 3.74 | 65 | 0 | 33.4 |
| Art Institute of Chicago | 100 | 4.80 | 46 | 0 | 37.4 |
| Pike Place Chowder, Seattle | 100 | 4.53 | 70 | 90 | 54.1 |
| Shake Shack Madison Square Park, New York | 100 | 4.29 | 61 | 16 | 127.1 |
| Franklin Barbecue, Austin | 100 | 4.66 | 76 | 0 | 135.3 |
| Hotel Emma, San Antonio | 100 | 4.65 | 66 | 0 | 283.0 |
All 800 rows carried a rating, an ISO 8601 date, the author name and profile link, a direct link to the review and Google's review id, and the 800 ids were all distinct, so there were no duplicates to clean. "Days covered" is the gap between the oldest and newest of the 100 reviews: it is the single most useful number for planning a monitoring job, and we come back to it below.
Scrape Google reviews with Python
The Python version needs no browser, no selectors and no proxy setup. Send a name and a city (or a data_id if you already have one), and poll if the run goes to the background, which is what a 100-review run does.
import os, time, requests
BASE = "https://api.quanticdata.io/v1/scraper/collectors"
H = {"Authorization": "Bearer " + os.environ["QD_API_KEY"]}
def google_reviews(query, location, n=100):
r = requests.post(BASE + "/place_reviews/run", headers=H, json={
"query": query, "location": location, "country": "us",
"lang": "en", "sort_by": "newest", "max_results": n})
run = r.json()["payload"]
while run.get("status") not in ("done", "failed"):
time.sleep(5)
run = requests.get(BASE + "/runs/" + run["run_id"], headers=H).json()["payload"]
return run["results"]
rows = google_reviews("Franklin Barbecue", "Austin, TX")
for rev in rows[:5]:
print(rev["rating"], rev["iso_date"][:10], (rev["text"] or "")[:80])
For a list of places, run the Google Maps scraper API once for a keyword and a city, keep the data_id of every result, and pass those ids instead of names: the lookup step disappears and the id never changes when a business renames itself. If you prefer raw search verticals to collectors, the SERP API exposes the same reviews feed as search_type: reviews, one page per call with a next_page_token.
What a Google review row contains
Two findings from the 800 rows change how you design the table that receives them.
- 39% of reviews have no text. 489 of 800 reviews carry a written comment; the other 311 are star-only. Text share ranged from 43% at Griffith Observatory to 76% at Franklin Barbecue. If you run sentiment analysis, filter on
text_length > 0first and report the star-only share separately, or a busy attraction will look strangely quiet. - Owner replies are a per-business habit. 106 of 800 reviews had an owner reply, and 90 of those were at Pike Place Chowder, where the owner answered 90 of the last 100. Six of the eight places did not reply at all in the window. The
has_owner_responseflag plusowner_response_dategives you response rate and response time per competitor with no extra work.
The star mix is skewed, as on every review site: 602 five-star, 95 four-star, 35 three-star, 15 two-star and 53 one-star. One-star reviews cluster, though: 29 of the 53 came from one place, Apple Fifth Avenue, whose 100 newest reviews averaged 3.74 against 4.80 at the Art Institute of Chicago. If you want the complaints rather than the average, use sort_by: lowest_rating and pull them directly. We did that kind of analysis on 730 reviews in what one-star dentist reviews say.
How often to scrape: review velocity
The 100 newest reviews covered 6.5 days at Katz's Delicatessen and 283 days at Hotel Emma. That is roughly 15 new reviews a day against one every three days, and it decides your schedule:
- Busy places (100 reviews in under two weeks: Katz's, Griffith Observatory): pull the 20 newest every day. You will see every review and pay for about 20 rows a day.
- Medium places (one to four months: Apple Fifth Avenue, Art Institute, Pike Place Chowder, Shake Shack, Franklin Barbecue): a weekly pull of the 50 newest is enough.
- Slow places (most hotels, clinics, B2B services): monthly, 20 newest.
Deduplicate on review_id, keep the first time you saw each id, and you have a clean time series. Because you only pay for delivered reviews, asking for 50 when only 12 are new still bills the rows that come back, so size max_results to the velocity rather than to the maximum.
What it costs to scrape Google reviews
The collector bills $0.0005 per delivered review and nothing for a run that delivers none. Our 800 reviews cost $0.40 at list price. Some reference points:
| Job | Reviews | Cost |
|---|---|---|
| This test: 8 places x 100 newest | 800 | $0.40 |
| 1,000 reviews | 1,000 | $0.50 |
| Free monthly allowance ($2) | 4,000 | $0 |
| 50 competitors x 100 newest, weekly (4 weeks) | 20,000 | $10 |
Every account gets $2 of free API usage per month, which covers 4,000 reviews: enough to backfill 40 places with their 100 newest reviews before you spend anything. A browser script is free in licence terms, but its real cost is the hours spent on consent screens, renamed CSS classes and IP limits every time Google changes the Maps page.
Scrape Google reviews from an AI agent
The same collector is a tool in our MCP server, so Claude, Cursor or any MCP client can do the whole job from a sentence such as "get the 50 newest reviews of the three busiest barbecue places in Austin and tell me what the one-star ones complain about". The agent calls run_collector with slug: google_maps_places, then place_reviews for each data_id, and reads the rows directly: no code and no CSV round trip.
Is scraping Google reviews legal?
Reviews are public, but two rules still apply. Google's terms of service restrict automated access, so read them for your use case; and author names and profile links are personal data under the GDPR and similar laws, so collect them only if you need them and prefer aggregates (counts, averages, topics) in anything you publish. Never use scraped reviews to post, rate or report on Google. Our longer answer for Maps data, with the case law, is in is scraping Google Maps legal.
The settings to use
Collector place_reviews, addressed by data_id from google_maps_places (or by name and city), country set to the market you track, sort_by: newest for monitoring or lowest_rating for complaint research, max_results sized to the place's velocity. Price: $0.0005 per delivered review, with $2 of free API usage per month. If you would rather receive a finished review dataset for a category and a region, the seven-day review monitoring pilot starts with a free sample.