Who it's for

Google Reviews API: how to get all your reviews as JSON

Pull Google reviews by API: Business Profile API (access request, OAuth), Places API (5 reviews max), or the Revys JSON API. With curl, JavaScript, PHP.

Updated

You want a business's Google reviews as data, not as a prebuilt widget: for a custom design, an app, an internal dashboard, or a client site. The real question is which API to use and what it actually takes to get access.

Is there an official Google Reviews API?

Yes, two of them, and they're very different. The Google Business Profile API (formerly the Google My Business API) returns every review on a profile, but only to the profile's owners and managers. The Places API, part of Google Maps Platform, works for any business with a plain API key, but returns 5 reviews at most.

Business Profile APIPlaces API (New)Revys API
Reviews returnedAll, 50 per page5 max, sorted by relevanceAll reviews on your connected profiles
Who can use itProfile owners and managersAnyoneYou, for profiles you've connected
AccessAccess request to Google, then OAuthGoogle Cloud API keyRevys API key
CostNo charge1,000 free requests a month, then $25 per 1,000Included in Pro
Storing reviewsAllowedNot allowed outside Google's servicesRevys stores them
Replying to reviewsYes (updateReply)NoNo (read-only)

The Business Profile API: complete, but slow to get into

It returns every review, including the owner's reply, and lets you post replies. The price is four steps before your first successful call.

  1. Meet the prerequisites

    Google requires that you manage a Business Profile that has been verified and active for more than 60 days, and that the business has a website. It can be your own profile or a client's profile you manage.

  2. Request access

    Create a Google Cloud project, note its project number, and submit the Business Profile API contact form, choosing "Application for Basic API Access". Send it from an email that's an owner or manager on the profile. Until you're approved, your quota is 0 requests per minute; approval sets it to 300.

  3. Set up OAuth

    Every call runs on behalf of a user who granted the https://www.googleapis.com/auth/business.manage scope. You have to store their refresh token, refresh access tokens, and handle revoked access.

  4. Walk accounts, locations, then reviews

    List the accounts, then each account's locations, then each location's reviews: GET https://mybusiness.googleapis.com/v4/accounts/{account}/locations/{location}/reviews, 50 reviews per page max, sorted by updateTime desc by default (or by rating).

Then comes the ongoing work: syncing on a schedule, picking up edited and deleted reviews, staying under 300 requests per minute, and storing everything in your own database. Doable, but it's a small product to maintain.

The Places API: easy, but only 5 reviews

The Places API (New) needs just an API key: GET https://places.googleapis.com/v1/places/{place_id} with the header X-Goog-FieldMask: reviews. The field mask is mandatory. Google's reference is explicit: a maximum of 5 reviews, "sorted by relevance". No pagination, no sort by date.

Two more catches:

  • Cost. Asking for the reviews field triggers the "Place Details Enterprise + Atmosphere" SKU: 1,000 free requests a month, then $25 per 1,000 (up to 100,000).
  • Storage. The Google Maps Platform terms (section 3.2.3(a), "No Scraping") bar you from extracting, storing, or rehosting this content outside Google's services. You can't build your own review database from the Places API.

That's why so many free widgets show the same 5 reviews forever.

How does the Revys reviews API work?

Revys handles the Google side (API access, OAuth, syncing roughly every hour, storage) and serves your reviews through a read-only JSON API.

Endpoint: GET https://revys.io/api/v1/reviews

Auth: an Authorization: Bearer rv_<prefix>_<secret> header. Create keys on the dashboard's “API & developers” page; the secret is shown once. Keep it on your server.

Parameters (exactly one):

ParameterWhat it does
?widget=<publicId>Uses the profiles and filters (minimum rating, number of reviews) saved on a widget
?source=<sourceId>Targets one profile directly, no filters

?widget= is the easy path: set your filters in the widget editor and the API applies them.

curl example

curl -H "Authorization: Bearer $REVYS_API_KEY" \
  "https://revys.io/api/v1/reviews?widget=YOUR_WIDGET_ID"

Response shape

{
  "data": {
    "reviews": [
      {
        "id": "rev_123",
        "authorName": "Jordan Miller",
        "authorImage": null,
        "rating": 5,
        "text": "Fast, friendly, and they fixed it the same day.",
        "language": "en",
        "reviewedAt": "2026-05-01T10:00:00.000Z",
        "ownerReply": null
      }
    ],
    "aggregate": {
      "count": 128,
      "average": 4.8,
      "distribution": { "1": 1, "2": 2, "3": 5, "4": 30, "5": 90 }
    },
    "schemaOrg": {
      "@context": "https://schema.org",
      "@type": "Organization",
      "name": "Your Business"
    }
  }
}

(Sample review, not a real one.) Reviews come newest first; any you've hidden in Revys are left out. aggregate covers every review on the profile(s), never trimmed by the widget's minimum rating, so average matches your real Google rating. schemaOrg is a bare Organization object with no aggregateRating or review, in line with Google's self-serving reviews rule (more in review schema and Google stars).

JavaScript example (Node.js 18+, server side)

const res = await fetch("https://revys.io/api/v1/reviews?widget=YOUR_WIDGET_ID", {
  headers: { Authorization: `Bearer ${process.env.REVYS_API_KEY}` },
  signal: AbortSignal.timeout(3000),
});
if (!res.ok) throw new Error(`Revys returned ${res.status}`);
const { data } = await res.json();

for (const r of data.reviews) {
  console.log(`${r.rating}/5 — ${r.authorName}: ${r.text ?? "(rating only)"}`);
}

In Next.js, make this call in a Server Component so the reviews land in the HTML; see the full walkthrough in Google reviews in Next.js.

PHP example

<?php
$ch = curl_init('https://revys.io/api/v1/reviews?widget=YOUR_WIDGET_ID');
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_TIMEOUT => 3,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('REVYS_API_KEY')],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$data = $status === 200 ? json_decode($body, true)['data'] : null;
foreach ($data['reviews'] ?? [] as $r) {
  echo '<blockquote><p>' . htmlspecialchars($r['text'] ?? '') . '</p>'
     . '<cite>' . htmlspecialchars($r['authorName']) . ', ' . (int) $r['rating'] . '/5</cite></blockquote>';
}
if ($data) {
  echo '<script type="application/ld+json">' . json_encode($data['schemaOrg']) . '</script>';
}

Cache the response (an hour is plenty) instead of calling the API on every page view.

What are the Revys API limits?

These are the limits enforced in production, with no hidden caps.

LimitValue
PlanPro (Free gets 403 plan_required)
Monthly quota10,000 calls per paid location per month, reset on the 1st (UTC); only 200 responses count
Rate limit120 requests per 60 seconds per key (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset headers)
CachingCache-Control: public, max-age=300 (5 minutes)
Over quotaThe last 200 response for the same target is served again (status 200, X-Revys-Quota: exceeded, not counted); otherwise 429 quota_exceeded

Other errors return JSON { "error": "<code>" }: 401 unauthorized (missing or bad key), 400 missing_target (no widget or source), 404 widget_not_found or source_not_found, 429 rate_limited, 500 internal_error.

Pro is $7.90 a month for your first location, with volume pricing after that (pricing). Every account starts with a 14-day Pro trial, API included.

Need HTML instead of JSON?

If all you want is to show reviews on a site, you may not need the API at all. The server include at https://revys.io/api/embed/<publicId>/html returns the widget already rendered: reviews, scoped CSS, and JSON-LD, with no JavaScript. It's public, needs no key, and supports ETag and 304.

<?php echo @file_get_contents('https://revys.io/api/embed/YOUR_ID/html'); ?>

The dashboard gives you hardened versions (1-hour cache, 2-second timeout) for PHP, Next.js, Astro, Node.js, Python, Ruby and Cloudflare Workers; see PHP and plain HTML sites. On WordPress, the Revys plugin does it with no code.

You wantUse
A fully custom design, an app, a dashboardJSON API
Reviews on a PHP, Next.js, or Node siteServer include
Reviews on WordPressPlugin
A comparison of every methodHow to embed Google reviews on a website

What the Revys API doesn't do

  • Other people's profiles: it only returns reviews for profiles connected to your account, meaning ones you own or manage.
  • Replies: it's read-only. Reply from the dashboard, where AI replies post through Google's API.
  • Other platforms: Google only today; Facebook and Trustpilot are planned.
  • Webhooks: there's no push notification to your app yet. Poll the API; with a 5-minute cache and hourly syncs, that's plenty for display.

Managing reviews for several clients? See Revys for agencies, with 10,000 API calls a month for each location.

FAQ

Is the Google My Business API free?

Yes. Google says the API is available to registered users at no charge. The catch is access: until Google approves your request, your project's quota is 0 requests per minute. Once approved, it's 300 per minute.

Why does the Google Places API only return 5 reviews?

That's a hard limit of the API: the reviews field returns at most 5 reviews, sorted by relevance, with no pagination. To get every review on a profile you need the Business Profile API, which only works for the profile's owners and managers.

Is there a free way to scrape Google reviews?

There are scrapers, but scraping Google breaks its terms, and the Google Maps Platform terms also forbid extracting or storing Places content outside Google's services. If you need all reviews for a business, get added as a Manager on its profile and use the official API.

How many calls does the Revys API allow?

10,000 calls a month per paid location on the Pro plan (3 locations means 30,000 calls), with a burst limit of 120 requests per minute per key. Only 200 responses count. The Free plan has no API access.

Can I call the Revys API from the browser?

Don't: your API key would be visible in the page source. Call it from your server and render the reviews into the HTML. That's also what makes them visible to AI crawlers, which don't run JavaScript.

Can I reply to reviews through the API?

With Google's Business Profile API, yes: the updateReply method posts the owner's response. The Revys API is read-only; replies go through the Revys dashboard and its AI replies, which post through Google's API.

Sources

  1. Google Business Profile APIs: Prerequisites (updated 2026-08-28)
  2. Google Business Profile APIs: Usage fees (updated 2026-08-28)
  3. Google Business Profile APIs: accounts.locations.reviews.list (updated 2026-04-07)
  4. Google Places API (New): Place resource, reviews field
  5. Google Maps Platform pricing, Places SKUs (updated 2026-10-16)
  6. Google Maps Platform Terms of Service, 3.2.3(a) No Scraping (modified 2026-08-26)

Related