Quarra
Guide · Google Maps

Google Maps reviews API alternative: hundreds of reviews per place, not five

Google's Places API returns at most five reviews per place, and the Business Profile API needs an approved access. Here is what each route gives, and how to read the newest reviews of your places and watch for new ones, owner replies included.

Checked against Google's Places API, Business Profile API and pricing pages, and measured on November 4, 2026.

Open Google Maps Reviews Scraper on ApifyError records are not charged, a place without reviews, or that Google does not have, is charged only its lookup, and you can cap the cost of a run.

The short answer

Google's Places API returns up to five reviews per place: Places API (New) sorts them by relevance, and Place Details (Legacy) lets you pick relevance or newest. The Business Profile API lists reviews 50 per page, but only after Google approves an access application tied to a Business Profile that you or your client manage. To read the newest reviews of any place, with rating, text, date and owner reply, our Google Maps Reviews Scraper takes a Google Maps link, a place ID, or a name and city, with no Google account or API key. Two places over their 200 newest reviews, 400 reviews, took a 170-second run. A place read alone stops after a few hundred reviews: 390 in our test.

What Google's APIs give you

From Google's Place Details (New) and Place Details (Legacy) pages, the Business Profile reviews.list reference and its prerequisites, the pricing list and the Legacy products page, read on November 4, 2026:

OptionReviews you getCatch
Places API (New), Place Details“Up to five user-submitted Review objects”, “sorted by relevance”. The page lists no parameter to sort or page them.Asking for reviews bills the Place Details Enterprise + Atmosphere SKU: 1,000 calls a month free, then $25.00 per 1,000 calls up to 100,000 a month ($20.00 from 100,001 to 500,000).
Places API (Legacy), Place Details“A JSON array of up to five reviews”. reviews_sort takes most_relevant (default) or newest.Google lists the Places API as Legacy since March 1, 2025: existing projects keep it, there is no turn-down date, and Google promises at least 12 months' notice. Reviews are billed on top of the base SKU: Place Details at $17.00 plus Atmosphere Data at $5.00 per 1,000 calls (5,000 and 1,000 calls a month free).
Business Profile API, reviews.listPages of up to 50 reviews of a verified location, the most recently updated first by default; orderBy also takes rating and rating desc.Access starts with an application: a Business Profile that you manage, verified and active for 60+ days, and a website listed on it. It can be your own or a client's. The pages we read say nothing about reading the reviews of places you do not manage.
Our Google Maps Reviews ScraperThe newest reviews of any place, or the most relevant, highest or lowest rated: a few hundred per place in a run, with owner replies and review photos.Paid per review delivered, on a paid Apify plan. Google's terms and privacy law apply to how you use the data.

Read the reviews of your places

This script reads the 200 newest reviews of a hotel and a bookshop, prints for each how many reviews Google shows against how many it got, the average rating of those reviews and how many have an owner reply, and writes the reviews of 3 stars or less that still have no reply to a CSV. It also saves the IDs of the reviews it read, which the follow-up script below uses:

import csv
import json
import statistics
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/google-maps-reviews-scraper").call(run_input={
    "places": ["The Savoy, London", "Shakespeare and Company, Paris"],
    "maxReviewsPerPlace": 200,
    "sort": "newest",
})
rows = client.dataset(run.default_dataset_id).iterate_items()
reviews = [r for r in rows if r["type"] == "review" and r["status"] == "ok"]

for place in sorted({r["placeName"] for r in reviews}):
    rs = [r for r in reviews if r["placeName"] == place]
    answered = [r for r in rs if r["ownerResponse"]]
    print(place, "| Google shows", rs[0]["placeReviewsCount"], "| delivered", len(rs),
          "| from", min(r["publishedAt"] for r in rs)[:10],
          "| average", round(statistics.mean(r["rating"] for r in rs), 2),
          "| with a reply", len(answered))

# the reviews of 3 stars or less that still have no reply, oldest first
with open("to-answer.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.writer(f)
    w.writerow(["placeName", "publishedAt", "rating", "reviewUrl"])
    for r in sorted(reviews, key=lambda r: r["publishedAt"]):
        if r["rating"] <= 3 and not r["ownerResponse"]:
            w.writerow([r["placeName"], r["publishedAt"][:10], r["rating"], r["reviewUrl"]])

# the IDs of the reviews read, for the follow-up script below
with open("seen-reviews.json", "w") as f:
    json.dump(sorted(r["reviewId"] for r in reviews), f)

Tested with apify-client 3.4 on November 4, 2026: 400 reviews in a 170-second run, 22 reviews in the CSV.

Among the 200 newest reviews readThe hotelThe bookshop
Reviews Google shows in total11,14426,061
Oldest of the 200May 28, 2026September 30, 2026
Average rating of the 2004.724.62
Without text, stars only8298
Reviews of 3 stars or less1420
With an owner reply1940
3 stars or less, no reply220
Delivered as an English translation760

Google's own rating is 4.7 for the hotel and 4.6 for the bookshop; the averages above are those of the 200 newest reviews only. A place is given as a Google Maps link, a place ID (the ChIJ... IDs the Places API returns work as they are), a CID, or a name and city as here. A name is checked against the place Google finds: a different place gets a free error record, never someone else's reviews.

Reviews written in another language come with Google's translation in text, flagged translated: true, and the original in originalText with its originalLanguage. The default language is English; set "language": "fr" for French. With apify-client 2.x, write run["defaultDatasetId"] instead of run.default_dataset_id.

Only the new reviews, every week

The Actor has no watch mode and no date filter: it reads a place's reviews in the order you ask for. To follow the new ones, read the newest few on a schedule and keep the review IDs you have seen. This script stores them in a file, prints the reviews it has not seen, and says so when every review it read is new, since more may be waiting beyond the limit:

import json
import os
from apify_client import ApifyClient

SEEN_FILE = "seen-reviews.json"
seen = set(json.load(open(SEEN_FILE))) if os.path.exists(SEEN_FILE) else set()

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("quarra/google-maps-reviews-scraper").call(run_input={
    "places": ["The Savoy, London", "Shakespeare and Company, Paris"],
    "maxReviewsPerPlace": 30,
    "sort": "newest",
})
reviews = [r for r in client.dataset(run.default_dataset_id).iterate_items()
           if r["type"] == "review" and r["status"] == "ok"]

for place in sorted({r["placeName"] for r in reviews}):
    read = [r for r in reviews if r["placeName"] == place]
    fresh = [r for r in read if r["reviewId"] not in seen]
    print(place, "|", len(fresh), "new of", len(read), "read")
    for r in fresh:
        print("  ", r["publishedAt"][:10], r["rating"], "stars", r["reviewUrl"])
    if fresh and len(fresh) == len(read):
        print("   every review read is new: raise maxReviewsPerPlace")

with open(SEEN_FILE, "w") as f:
    json.dump(sorted(seen | {r["reviewId"] for r in reviews}), f)

On November 4, 2026, with the file written by the first script, which holds its 400 IDs, run about a minute and a half later: 60 reviews read, 30 per place, in 49 seconds, and none new. The IDs were the same from one run to the next. Run it from cron or any scheduler; the first run, with no file, prints everything it reads as new.

How far one place goes

Set maxReviewsPerPlace to 0 to ask for every review. On November 4, 2026, the hotel, which Google shows with 11,144 reviews, read alone in a run on the Bronze (Starter) tier, with maxItems at 500 as a cost cap: 390 reviews, back to February 6, 2026, in 294 seconds, then a stop with a message saying the run had reached its limit for reading further. All 390 reviews were distinct, and the 200 newest were the same 200 as in the first script. The reviews delivered before the stop are kept and charged. The older reviews of a large place are out of reach in that run.

Limits

  • No reviewer name, profile link, photo, ID or review count: only what the review says about the place. The review text is delivered as its author wrote it, so it can contain names the author typed. In owner replies, a name recognition model removes the names of people, and a name inside a sentence becomes [name]. It is good, not perfect, and the Actor's README lists its weak spots.
  • A place read alone in a run stops after a few hundred reviews, with a message saying so: 390 in our test on the Bronze (Starter) tier. The Actor's README announces about 280 to 400 reviews, 280 on Silver (Scale) and above. No order goes beyond 4,490 reviews of a place.
  • The highest and lowest orders list at most 76 reviews per star, 380 per place (measured on the Eiffel Tower on October 22, 2026). Use newest or most relevant to go further.
  • Owner reply dates are approximate: Google shows them in relative form, such as “5 months ago”. Use ownerResponseAt to tell recent replies from old ones, not to time a reply to the day.
  • A review that is only stars has text: null, and likesCount was null on all 400 reviews of the first script.
  • Live runs need a paid Apify plan: on the Free plan, the prefilled example returns a stored sample, and any other input looks nothing up.

What it costs

Pricing tierPer 1,000 reviews
Bronze (Starter)$0.43
Silver (Scale) and above$0.38

Plus $0.0025 per place looked up, once per run and on every plan, and $0.004 per run start at the default memory. There are no live reviews on the Free plan. The 400 reviews of the first script cost $0.181 on the Bronze (Starter) tier and $0.161 on Silver (Scale) and above, the 60-review check $0.035 and $0.032, and the 390 reviews of one place alone $0.174 on the Bronze (Starter) tier. A place is charged its lookup even when it has no reviews or when Google has no such place. Error records, a name that matches a different place and a review already delivered in the run are not charged.

Questions

How many reviews does the Google Places API return?

Up to five per place. Places API (New) returns them sorted by relevance, with no way to sort or page them on the pages we read. Place Details (Legacy) also returns up to five, and its reviews_sort parameter switches between most_relevant and newest.

Can the Business Profile API read the reviews of any place?

Its reviews.list method returns reviews, 50 per page, for a verified location, after Google approves your access. The prerequisites ask for a Business Profile that you manage, verified and active for 60+ days, and a website listed on it. The pages we read do not describe reading the reviews of other places.

How do I get only the newest Google reviews of a place?

Set "sort": "newest" and a small maxReviewsPerPlace, then keep the review IDs you have not seen, as in the second script. Legacy Place Details can also sort by newest, but returns five reviews.

Do I need a Google account or API key?

No. The Actor needs no Google account, cookies or API key, only an Apify account on a paid plan.

Run it on the Apify Store

Reviews cost $0.43 per 1,000 on the Bronze (Starter) tier ($0.38 on Silver (Scale) and above), plus $0.0025 per place looked up and $0.004 per run at the default memory. Live runs need a paid Apify plan. Error records are not charged, a place without reviews, or that Google does not have, is charged only its lookup, and you can set a maximum cost per run.