GET /business_reviews

Business Reviews

Retrieve user reviews for a specific business on Google Maps with sorting and pagination.

Google Maps Scraper API

Retrieve user reviews for a specific business. Supports multiple sort options and pagination for fetching large review sets. Each review includes the reviewer, rating, text, and both a relative time string and a Unix timestamp.

HTTP Request

1
GET /business_reviews

Parameters

ParameterTypeRequiredDefaultDescription
business_idstringYesBusiness identifier in hex format (0x...:0x...). Use the google_id value returned by Locate and Search
languagestringNo"en"Language code for the response
countrystringNo"us"Country code for regional context
limitintegerNo20Reviews per page. Capped at 20 — larger values still return 20
sort_bystringNo"qualityScore"Sort order: qualityScore, mostRecent, ratingHighToLow, or ratingLowToHigh
next_page_tokenstringNoPass the next_token value from a previous response to fetch the next page

Response

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{
  "status": true,
  "request_id": "ca2f51cd-1788-e031-e1cd-24e5921b",
  "data": [
    {
      "id": "Ci9DQUlRQUNvZENodHljRjlvT21KNFZWWmpXVGRLWWxndE4xZDBXbnBsT1RWTGEwRRAB",
      "text": "Its a must see in Philly! Local and international options, something for everyone.",
      "translated_text": null,
      "time": "13 hours ago",
      "timestamp": 1786400350,
      "url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZ...",
      "photos": [],
      "rating": 5,
      "language": "en",
      "language_translated_text": null,
      "source": "Google",
      "rating_breakdown": [],
      "question_breakdown": [],
      "user_id": "100951022068858819106",
      "user_name": "David Ray",
      "user_avatar": "https://lh3.googleusercontent.com/a/ACg8ocLt5fPVkzKg00JwQ69sYAafYzkm9bt...",
      "user_profile_url": "https://www.google.com/maps/contrib/100951022068858819106?hl=en",
      "user_reviews_count": 129,
      "user_images_count": 435,
      "user_reviews_url": "https://www.google.com/maps/contrib/100951022068858819106/reviews?hl=en",
      "user_local_guide_level": 7,
      "user_is_local_guide": true,
      "owner_response_text": null,
      "owner_response_translated_text": null,
      "owner_response_time": null,
      "owner_response_timestamp": null,
      "owner_response_language": null,
      "owner_response_language_translated_text": null
    }
  ],
  "next_token": "Ci8IARInCgoAP72GAWZ9tz__EhCVAsYlpkf4zoxMWZcAAAAA...",
  "request_params": {
    "business_id": "0x89c6c62958fb0109:0xcd8fd007dc1d6b01",
    "limit": "20",
    "sort_by": "mostRecent"
  }
}

Response Fields

FieldTypeDescription
statusbooleantrue when the request succeeded
request_idstringUnique identifier for this request
dataarrayList of reviews
data[].idstringUnique review identifier
data[].textstring/nullReview text. null when the reviewer left only a star rating
data[].translated_textstring/nullTranslated review text, when available
data[].timestringRelative time as Google displays it (e.g. "13 hours ago")
data[].timestampintegerUnix epoch seconds. Use this for real dates, sorting, and filtering
data[].urlstringDirect link to the review on Google Maps
data[].photosarrayPhotos attached to the review
data[].ratingintegerRating given (1-5)
data[].languagestring/nullDetected language of the review
data[].sourcestringReview source ("Google")
data[].rating_breakdownarrayPer-aspect sub-ratings, when the listing has them
data[].question_breakdownarrayStructured question answers, when present
data[].user_idstringReviewer’s Google account ID
data[].user_namestringReviewer name
data[].user_avatarstringReviewer profile image URL
data[].user_profile_urlstringLink to the reviewer’s Google Maps profile
data[].user_reviews_countintegerTotal reviews written by this user
data[].user_images_countintegerTotal images uploaded by this user
data[].user_reviews_urlstringLink to all reviews by this user
data[].user_local_guide_levelinteger/nullLocal Guide level, when the user is one
data[].user_is_local_guidebooleanWhether the reviewer is a Local Guide
data[].owner_response_textstring/nullBusiness owner’s reply, null when there is none
data[].owner_response_translated_textstring/nullTranslated owner reply
data[].owner_response_timestring/nullRelative time of the owner reply
data[].owner_response_timestampinteger/nullUnix epoch seconds of the owner reply
data[].owner_response_languagestring/nullLanguage of the owner reply
next_tokenstringToken for the next page. Pass it back as next_page_token. Empty when there are no more pages

Pagination

limit is capped at 20, so a full review history always requires pagination. Each response returns a next_token; pass it as the next_page_token parameter on the next request and repeat until next_token comes back empty.

Notes

  • A business ID that matches nothing returns status: true with an empty data array, not an error. Check for empty arrays rather than catching exceptions.
  • Many reviews are star-only, so text is frequently null. Across three businesses we tested, 30-48% of reviews had no text.
  • With sort_by=mostRecent, an occasional much older review appears mid-list. Those are edited reviews: Google orders them by edit date while timestamp keeps the original posting time.

Code Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import datetime
import requests

url = "https://google-maps-extractor2.p.rapidapi.com/business_reviews"

headers = {
    "X-RapidAPI-Key": "YOUR_API_KEY",
    "X-RapidAPI-Host": "google-maps-extractor2.p.rapidapi.com"
}

querystring = {
    "business_id": "0x89c6c62958fb0109:0xcd8fd007dc1d6b01",
    "language": "en",
    "country": "us",
    "limit": "20",
    "sort_by": "mostRecent"
}

response = requests.get(url, headers=headers, params=querystring)
data = response.json()

for review in data["data"]:
    date = datetime.datetime.fromtimestamp(
        review["timestamp"], tz=datetime.timezone.utc
    ).strftime("%Y-%m-%d")
    print(f"{review['user_name']} - {review['rating']}/5 on {date}")
    print(f"  {(review['text'] or '(no text)')[:100]}")

# Fetch the next page if there is one
if data.get("next_token"):
    querystring["next_page_token"] = data["next_token"]
    next_response = requests.get(url, headers=headers, params=querystring)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const url = "https://google-maps-extractor2.p.rapidapi.com/business_reviews";

const params = new URLSearchParams({
  business_id: "0x89c6c62958fb0109:0xcd8fd007dc1d6b01",
  language: "en",
  country: "us",
  limit: "20",
  sort_by: "mostRecent",
});

const response = await fetch(`${url}?${params}`, {
  method: "GET",
  headers: {
    "X-RapidAPI-Key": "YOUR_API_KEY",
    "X-RapidAPI-Host": "google-maps-extractor2.p.rapidapi.com",
  },
});

const data = await response.json();

data.data.forEach((review) => {
  const date = new Date(review.timestamp * 1000).toISOString().slice(0, 10);
  console.log(`${review.user_name} - ${review.rating}/5 on ${date}`);
  console.log(`  ${(review.text || "(no text)").substring(0, 100)}`);
});

// Pass data.next_token back as next_page_token for the following page
1
2
3
4
5
6
7
8
curl -G "https://google-maps-extractor2.p.rapidapi.com/business_reviews" \
  --data-urlencode "business_id=0x89c6c62958fb0109:0xcd8fd007dc1d6b01" \
  --data-urlencode "language=en" \
  --data-urlencode "country=us" \
  --data-urlencode "limit=20" \
  --data-urlencode "sort_by=mostRecent" \
  -H "X-RapidAPI-Key: YOUR_API_KEY" \
  -H "X-RapidAPI-Host: google-maps-extractor2.p.rapidapi.com"
Start building today

Get your API key and make your first request in under a minute.

Get Your API Key on RapidAPI