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_link, review_likes, reviewer identifiers, author profile links, author review counts, Local Guide level, review language, images, owner response text, and owner response timestamps. The response also includes nextPage when more reviews are available.
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. 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": 1704067200,
"review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_likes": 12,
"author_id": "123456789012345678901",
"author_link": "https://www.google.com/maps/contrib/123456789012345678901?hl=en",
"author_name": "John Doe",
...
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
string
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 page counts as one API credit. When pages > 1, response includes pages_fetched, pages_requested, and error fields.
10
string
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
Common items fields
review_id
review_text
rating
timestamp
{
"items": [
{
"review_id": "ChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"review_text": [
"Great place with excellent service!"
],
"rating": 5,
"timestamp": 1704067200,
"review_link": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sChZDSUhNMG9nS0VJQ0FnSUM1bnYzQzJ3EAE",
"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
}
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 JSON with review_id, review_text, rating, timestamp, reviewer profile fields, review language, images, review form attributes, owner response fields, and nextPage pagination when more reviews are available.
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.