Google Reviews API
Google Maps reviews API
Fetch Google reviews from public Maps listings as structured JSON
This page is for developers searching for a Google Reviews API, Google Maps reviews API, Google Places reviews endpoint, or Google Business Profile reviews API alternative. Start here when you need paginated review text, ratings, author metadata, images, owner responses, filtering, sorting, and localization without maintaining a Google Maps review scraper.
Google Reviews API documentation for developers who need Google Maps place reviews in structured JSON. Scrappa's GET /api/maps/reviews endpoint fetches review text, star ratings, reviewer profile fields, timestamps, photos, language, review form attributes, review links, likes, and owner responses from public Google Maps business listings.
Google Maps reviews API for business review data
Use this endpoint when you already have a Google Maps business_id and need reviews for reputation monitoring, local SEO research, review analytics, customer sentiment analysis, lead enrichment, or competitive benchmarking. It is built for Google Maps reviews scraping workflows where the output needs to be normalized JSON instead of browser HTML.
Google Places API reviews endpoint documentation
Use this page as Scrappa's Google Places API reviews endpoint documentation when the official Google Places or Google Business Profile APIs do not return the public Maps review fields your workflow needs. The request path is GET /api/maps/reviews, the required identifier is business_id, and the response is ready for review monitoring, local business enrichment, and reputation analytics pipelines.
What the reviews endpoint returns
Each review item can include review_id, review_text, rating, timestamp, review_updated_timestamp, review_link, review_likes, reviewer identifiers, author profile links, author review counts, Local Guide level, review language, images, owner response text, and owner response timestamps. timestamp is the original review creation time when Google exposes it; review_updated_timestamp is the edited/display timestamp used by Google Maps UI when available. The endpoint keeps every valid review returned by Google Maps and removes duplicate review IDs across fetched pages. First-party reviews have review_source: "Google", a numeric Google contributor author_id, and is_google_review: true. Syndicated reviews remain available with their actual provider, such as Jameda, GoLocal, or Trustpilot, and is_google_review: false; an unknown provider is reported as External. The review_count and reviews_per_rating fields from Google Maps Business Details describe Google's listing totals, but they do not guarantee that every review is available through the paginated public feed.
Filtering, sorting, localization, and pagination
Use search to filter reviews by keyword, sort to request most relevant, newest, highest-rated, or lowest-rated reviews, and page or pages to paginate through larger review sets. For deeper collection, prefer a multi-page pages request because Scrappa follows continuation tokens inside one request and starts bounded recovery when a full page unexpectedly omits its token. Google can still stop returning a continuation token before the displayed review count is reached, so nextPage: null does not prove that every displayed review was retrievable. Use termination_reason, feed_exhausted, continuation_retries, and continuation_recovered to diagnose how collection stopped. Use hl and gl when your review monitoring workflow needs localized review text, region-specific behavior, or country-specific Google Maps results.
How to get the business ID before fetching reviews
Start with Google Maps Simple Search when you know a business name, category, or address. Use Google Maps Business Details when you need the business profile, rating summary, review count, hours, photos, and place identifiers before calling the reviews endpoint. For one known review, use Single Review.
Run this endpoint
Endpoint
https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac
https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac
x-api-key
business_id
= 0x60188b88b7d8f7ab:0x2133080e9923eaac
{
"items": [
{
"review_id": "ChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_text": [
"Great place with excellent service!"
],
"rating": 5,
"timestamp": 1704067200000,
"review_updated_timestamp": 1704153600000,
"review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_source": "Google",
"is_google_review": true,
"review_likes": 12,
...
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
Runnable path
1 required parameter needed before sending a request.
7 optional filters available.
string
Required
The assigned business id by Google (e.g. 0x60188b88b7d8f7ab:0x2133080e9923eaac).
0x60188b88b7d8f7ab:0x2133080e9923eaac
string
Optional
Filter reviews by keyword.
example
integer
Optional
Sorting order: 1 for Most Relevant, 2 for Newest, 3 for Highest Rating, 4 for Lowest Rating.
relevance
string
Optional
Pagination token.
1
integer
Optional
Number of pages to fetch in a single request (1-50). Each successfully fetched page counts as one API credit. Multi-page requests are preferred for deeper pagination. The response includes termination and continuation-recovery diagnostics.
10
integer
Optional
Maximum number of reviews to return per page.
10
string
Optional
Language code for results. Default: en
en
string
Optional
Country/region code for geo-filtering. Default: us
us
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/maps/reviews?business_id=0x60188b88b7d8f7ab%3A0x2133080e9923eaac")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
items
nextPage
termination_reason
feed_exhausted
continuation_retries
continuation_recovered
Common items fields
review_id
review_text
rating
timestamp
{
"items": [
{
"review_id": "ChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_text": [
"Great place with excellent service!"
],
"rating": 5,
"timestamp": 1704067200000,
"review_updated_timestamp": 1704153600000,
"review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_source": "Google",
"is_google_review": true,
"review_likes": 12,
"author_id": "123456789012345678901",
"author_link": "https://www.google.com/maps/contrib/123456789012345678901?hl=en",
"author_name": "John Doe",
"author_profile_photo": "https://lh3.googleusercontent.com/a-/example_photo.jpg",
"author_review_count": 45,
"author_reviews_link": "https://www.google.com/maps/contrib/123456789012345678901/reviews",
"author_photo_count": 12,
"author_local_guide_level": 3,
"owner_response_timestamp": null,
"owner_response_text": null,
"owner_response_language": null,
"review_language": [
"en"
],
"review_form": [],
"images": []
}
],
"nextPage": null,
"termination_reason": "token_missing",
"feed_exhausted": null,
"continuation_retries": 0,
"continuation_recovered": false
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Validation Error
The business ID, pagination, sorting, or locale parameters failed validation.
{
"message": "The request validation failed",
"errors": {
"business_id": [
"The business ID must be either a google_id or a place_id."
]
}
}
Reviews Temporarily Unavailable
No review pages could be fetched after proxy or upstream attempts.
{
"items": [],
"nextPage": null,
"error": "Page 1 failed after 3 attempts: could not obtain valid proxy"
}
Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Related Endpoints
Search by business name, category, address, or local query to find business IDs for review collection.
Fetch the business profile, rating summary, review count, hours, photos, and identifiers before review extraction.
Retrieve one Google Maps review by review ID when a workflow needs review-level enrichment.
Collect place photos alongside reviews for richer local business monitoring datasets.
Google Maps API FAQ
Answers for developers comparing Google Reviews APIs, Google Places review access, and Google Maps review scraping workflows.
Is there a Google Reviews API for developers?
Scrappa provides a Google Reviews API endpoint for public Google Maps listings. Send a business_id to GET /api/maps/reviews and the endpoint returns normalized review JSON with ratings, review text, authors, timestamps, images, owner responses, and pagination.
What does the Google Maps reviews endpoint return?
The endpoint returns first-party Google reviews and syndicated reviews exposed by Google Maps, with review_id, review_text, rating, timestamps, reviewer fields, images, owner responses, and pagination. Use review_source for the actual provider. is_google_review: true together with a numeric Google contributor author_id is the stable signal for a genuine Google review.
How do I call the Google Reviews API endpoint?
Send GET /api/maps/reviews with business_id and your x-api-key header. Optional parameters include search, sort, page, pages, limit, hl, and gl for filtering, ordering, pagination, and localization.
Is this official Google Places API reviews documentation?
No. This is Scrappa's Google Places and Google Maps reviews endpoint documentation. It helps developers retrieve public place reviews as structured JSON through Scrappa's API.
Which place identifier does the Google Reviews API use?
Use the Google business_id in 0x...:0x... format. You can get that identifier from Scrappa Google Maps Simple Search or Business Details responses before calling the reviews endpoint.
Can I filter or sort Google Maps reviews?
Yes. Use search to filter reviews by keyword and sort to request most relevant, newest, highest-rating, or lowest-rating review order. Use page or pages when you need more than one page of reviews.
Can I retrieve every review shown in the Google Maps review count?
Not always. Google Maps can stop exposing continuation tokens before the displayed review count is reached. Use a multi-page pages request for the most robust collection path and inspect the pagination diagnostic fields to see why the response stopped.