Updated Oct 2026
How to Embed Google Reviews on Your Website: 3 Ways, With Code
There are three official ways to embed Google reviews on your website. The Maps Embed API iframe is free and unlimited, but it shows a map and place card, not a list of reviews. The Places API (New) returns up to 5 reviews per place, sorted by relevance, billed at $25 per 1,000 calls after 1,000 free calls a month. The Business Profile API returns every review with full text, but only for businesses you own or manage and only after Google approves your access. Pick by how many reviews you need and whose business it is.
Which method should you use?
| 1. Maps Embed API (iframe) | 2. Places API (New) | 3. Business Profile API | |
|---|---|---|---|
| Reviews shown | A map and place card; visitors click through to read reviews | Up to 5, sorted by relevance | All, full text |
| Whose business | Any place | Any place | Only ones you own or manage |
| Cost | Free, unlimited | $25 per 1,000 after 1,000 free/month | No per-call fee from Google |
| Setup | API key, 5 minutes | API key + billing, server code | Access approval + OAuth |
| Can you store reviews? | n/a | No (beyond allowed exceptions) | They’re your own profile’s reviews |
| Best for | Contact pages | A small “what customers say” block | Review walls, multi-location sites |
Before you start: find your place ID
Methods 1 and 2 need your business’s place ID, a string that often starts with ChIJ. Find it with Google’s Place ID Finder or a Places API Text Search. Place IDs are the one piece of Places data Google lets you store indefinitely.
Method 1 — Free iframe with the Maps Embed API
- In Google Cloud console, enable Maps Embed API and create an API key.
- Restrict the key to your website’s HTTP referrers.
- Paste the iframe:
<iframe
width="600" height="400" style="border:0" loading="lazy" allowfullscreen
referrerpolicy="no-referrer-when-downgrade"
src="https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY&q=place_id:ChIJ_YOUR_PLACE_ID">
</iframe>Google lists the Embed SKU as free with unlimited usage (pricing). The trade-off: visitors see your place on a map and click through to read reviews on Google. You don’t control the layout and there’s no review text on your page.
Method 2 — Show up to 5 reviews with the Places API (New)
Step 1 — Enable Places API (New) and billing
Enable Places API (New), attach a billing account and create a server-side API key restricted by IP. Requesting the reviews field bills the Place Details Enterprise + Atmosphere SKU: $25 per 1,000 events up to 100,000 a month, with 1,000 free events a month.
Step 2 — Request only the fields you need
The field mask is mandatory: omit it and the call errors.
curl "https://places.googleapis.com/v1/places/ChIJ_YOUR_PLACE_ID" \
-H "X-Goog-Api-Key: YOUR_SERVER_KEY" \
-H "X-Goog-FieldMask: displayName,rating,userRatingCount,googleMapsUri,reviews"Each review in the Place resource has text, originalText, rating, authorAttribution (name, profile link, photo), publishTime, relativePublishTimeDescription, googleMapsUri and visitDate.
Step 3 — Fetch on the server, render on the page
// Node 18+ (Express-style handler)
app.get("/reviews", async (req, res) => {
const r = await fetch(`https://places.googleapis.com/v1/places/${process.env.PLACE_ID}`, {
headers: {
"X-Goog-Api-Key": process.env.PLACES_KEY,
"X-Goog-FieldMask": "rating,userRatingCount,googleMapsUri,reviews",
},
});
const place = await r.json();
res.render("reviews", { place }); // don't write reviews to your database
});# Python 3 (Flask)
import os, requests
from flask import Flask, render_template
app = Flask(__name__)
@app.get("/reviews")
def reviews():
r = requests.get(
f"https://places.googleapis.com/v1/places/{os.environ['PLACE_ID']}",
headers={"X-Goog-Api-Key": os.environ["PLACES_KEY"],
"X-Goog-FieldMask": "rating,userRatingCount,googleMapsUri,reviews"})
r.raise_for_status()
return render_template("reviews.html", place=r.json())<!-- reviews.html (Jinja) -->
<section>
<p>{{ place.rating }} ★ from {{ place.userRatingCount }} reviews on Google Maps</p>
<p><small>Showing up to 5 reviews, ordered by Google by relevance.</small></p>
{% for rv in place.reviews %}
<article>
<img src="{{ rv.authorAttribution.photoUri }}" alt="{{ rv.authorAttribution.displayName }}" width="32" height="32">
<a href="{{ rv.authorAttribution.uri }}">{{ rv.authorAttribution.displayName }}</a>
<span>{{ rv.rating }} ★ · {{ rv.relativePublishTimeDescription }}</span>
<p>{{ rv.text.text }}</p>
</article>
{% endfor %}
<a href="{{ place.googleMapsUri }}">See all reviews on Google Maps</a>
</section>Step 4 — Follow Google’s display rules
Google’s Places policies require you to:
- Credit the author: avatar, name and profile link when space allows; the avatar at minimum.
- Show Google Maps attribution, ideally the Google Maps logo, or the text “Google Maps” when space is tight.
- Include a notice that explains how reviews are ordered and filtered.
- Let users open the source review on Google Maps through
googleMapsUri. - For places in France and French territories, show the visit month and year from
visitDate.
Step 5 — Watch the bill
You can’t store Places reviews beyond the allowed exceptions, so if every page view fetches reviews, every page view is a billable event. At 30,000 monthly views, that’s (30,000 − 1,000) × $25 / 1,000 = $725 a month for 5 reviews. Load the block only where it matters, or use method 3 for your own business.
The Places API is also covered in our Google Maps reviews API guide.
Method 3 — Show all your reviews with the Business Profile API
If the business is yours (or a client’s you manage), the Business Profile API returns every review with full text (review data). You need Business Profile API access and an OAuth token with the business.manage scope.
curl -H "Authorization: Bearer ACCESS_TOKEN" \
"https://mybusiness.googleapis.com/v4/accounts/ACCOUNT_ID/locations/LOCATION_ID/reviews?pageSize=50"The response includes averageRating, totalReviewCount and up to 50 reviews per page with reviewer, starRating (ONE to FIVE), comment and createTime. Page with nextPageToken, render server-side and refresh when the Notifications API reports a NEW_REVIEW. Keep the same attribution habits: reviewer name, star rating and a link to your Google profile.
Common mistakes
| Mistake | What happens | Fix |
|---|---|---|
| No field mask on Place Details | Error response | Send X-Goog-FieldMask |
| Same unrestricted key in browser and server | Key abuse and surprise bills | Referrer-restricted key for the iframe, IP-restricted key for the server |
| Storing Places reviews in your database | Breaks Google’s caching policy | Fetch at render time, or use the Business Profile API for your own data |
| Removing author names or Google attribution | Policy violation | Follow the display rules above |
| Adding Review schema to win stars in Google | No stars: self-serving reviews aren’t eligible for review rich results | Embed for people, not for snippets |
| Using a scraper to get past 5 reviews | Breaks when Google changes markup; terms risk | See why scrapers break |
FAQ
Can I embed Google reviews on my website for free?
The Maps Embed API iframe is free and unlimited, but it doesn’t list review text. Review text via the Places API is free for the first 1,000 calls a month, then $25 per 1,000.
Why does the Places API only return 5 reviews?
Google documents a maximum of 5 reviews per place, sorted by relevance. To show more you need the Business Profile API, which only covers businesses you manage.
Will embedded reviews give me stars in Google search?
No. Google doesn’t show review rich results for reviews a business publishes about itself on its own site.
Can I save Google reviews to my database?
Not from the Places API: Google’s policies forbid caching or storing Places content beyond the listed exceptions, such as place IDs. For your own business, read them from the Business Profile API.
Does this work on WordPress, Webflow or Shopify?
Yes. The iframe pastes into any HTML block. Methods 2 and 3 need a small server function that calls the API and renders the reviews.
Render your reviews from Prisma
Prisma isn’t a widget: it’s an API. If you connect your Google locations (and Trustpilot, App Store or Google Play), GET /v1/reviews returns every review of those locations in one JSON format: author, rating, text, date, your reply and a link to the original. Fetch it on your server, cache the result and render your own HTML. Your API key never reaches the browser.
// Node 18+ (Express-style handler). Keep PRISMA_API_KEY on the server.
app.get("/reviews", async (req, res) => {
const r = await fetch(
"https://api.prismareviews.com/v1/reviews?location_id=loc_123&platform=google&limit=20",
{ headers: { Authorization: `Bearer ${process.env.PRISMA_API_KEY}` } }
);
const { data } = await r.json(); // [{ id, platform, rating, text, author, created_at, reply, url }]
res.render("reviews", { reviews: data.filter((rv) => rv.text) }); // skip rating-only reviews
});# Python 3 (Flask). Keep PRISMA_API_KEY on the server.
import os, requests
from flask import Flask, render_template
app = Flask(__name__)
@app.get("/reviews")
def reviews():
r = requests.get(
"https://api.prismareviews.com/v1/reviews",
params={"location_id": "loc_123", "platform": "google", "limit": 20},
headers={"Authorization": f"Bearer {os.environ['PRISMA_API_KEY']}"},
)
r.raise_for_status()
items = [rv for rv in r.json()["data"] if rv["text"]] # skip rating-only reviews
return render_template("reviews.html", reviews=items)Each item has a url to the original review, so you can keep a “Read on Google” link next to every card. To refresh the block when a new review arrives instead of on a timer, subscribe to the review.created webhook.
All your Google reviews on your site, not just 5
Prisma connects Google with its own Cloud project, so you don't file an access form or pay per page view: you connect your locations through OAuth and read every review with one key. Mix in Trustpilot, App Store and Google Play reviews with the same call. See the Google reviews API and Google Maps reviews API pages, or start with the Prisma quickstart.
Your first 2 locations are free, then plans from €49 a month (pricing).
All your Google reviews on your site, not just 5. First 2 locations free.