Place Reviews
Fetch up to 150 Google Maps reviews for any place by Place ID — sorted by newest, relevance, or rating, with full text, author profiles, photos, and owner responses.
/v1/maps/reviewsFetch user reviews for a place by its Google Place ID — up to 150 reviews per call, far beyond the 5 that Google's own API exposes. Choose a sort order and how many reviews to pull. Use the id returned by Maps Search, or any Place ID you already have.
This endpoint scrapes live and is asynchronous upstream — a request submits a job and polls for the result within the request window. If the upstream queue is busy and the reviews aren't ready in time, you'll get a 503 asking you to retry in a few seconds. Larger depth values take longer, so depth is capped at 150 per call.
Usage
const res = await fetch('https://api.yepapi.com/v1/maps/reviews', {
method: 'POST',
headers: {
'x-api-key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
place_id: 'ChIJBR3G8LJqkFQRWD2Wzn0qG3c',
sort_by: 'newest',
depth: 50,
}),
});
const { data } = await res.json();
console.log(data.reviews);curl -X POST https://api.yepapi.com/v1/maps/reviews \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"place_id": "ChIJBR3G8LJqkFQRWD2Wzn0qG3c", "sort_by": "newest", "depth": 50}'Request Body
| Parameter | Type | Required | Description | Default |
|---|---|---|---|---|
place_id | string | Yes | Google Place ID (e.g. ChIJBR3G8LJqkFQRWD2Wzn0qG3c). Get one from Maps Search. | — |
sort_by | string | No | Review ordering: relevant, newest, highest_rating, or lowest_rating. | "relevant" |
depth | number | No | How many reviews to fetch. Clamped to 10–150 and rounded to the nearest 10. | 50 |
language | string | No | Two-letter language code (e.g. en, es, fr). | "en" |
location_code | number | No | DataForSEO location code (e.g. 2840 = United States). | 2840 |
Response
{
"ok": true,
"data": {
"placeId": "ChIJBR3G8LJqkFQRWD2Wzn0qG3c",
"cid": "8582500234709843288",
"name": "Storyville Coffee Pike Place",
"rating": 4.6,
"totalReviews": 3122,
"sortBy": "newest",
"depth": 50,
"reviewCount": 50,
"reviews": [
{
"rating": 5,
"text": "Service is excellent, coffee is quite good. The vibe of the place is great and the view over the market is unbeatable.",
"author": "Scott Dawson",
"authorProfileUrl": "https://www.google.com/maps/contrib/108943976041939788925/reviews",
"authorImageUrl": "https://lh3.googleusercontent.com/a/ACg8ocKRqA6C5W5DeTU7M5792pD",
"localGuide": true,
"authorReviewCount": 14,
"timestamp": "2026-07-23 15:55:22 +00:00",
"timeAgo": "a day ago",
"reviewUrl": "https://www.google.com/maps/reviews/data=...",
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25Ca09HOUZXRU5PYXpac2VYTkRhSGRq",
"ownerAnswer": "Thanks for the review, Scott!",
"ownerAnswerTimestamp": "2026-07-23 20:55:57 +00:00"
}
]
}
}Response Fields
| Field | Type | Description |
|---|---|---|
data.placeId | string | The Google Place ID that was looked up. |
data.cid | string? | Google customer ID for the place (string to preserve precision). |
data.name | string? | Display name of the place. |
data.rating | number? | Average star rating (0.0–5.0). |
data.totalReviews | number? | Total reviews the place has on Google (usually far larger than reviewCount). |
data.sortBy | string | The sort order applied. |
data.depth | number | The normalized depth used for this call. |
data.reviewCount | number | Number of reviews actually returned in reviews. |
data.reviews[].rating | number? | Star rating this reviewer gave (1–5). |
data.reviews[].text | string? | Review body text. |
data.reviews[].originalText | string? | Original-language text before translation, when applicable. |
data.reviews[].language | string? | Original language of the review. |
data.reviews[].author | string? | Display name of the reviewer. |
data.reviews[].authorProfileUrl | string? | Link to the reviewer's Google profile. |
data.reviews[].authorImageUrl | string? | Reviewer's avatar URL. |
data.reviews[].localGuide | boolean | Whether the reviewer is a Google Local Guide. |
data.reviews[].authorReviewCount | number? | The reviewer's own total number of reviews. |
data.reviews[].timestamp | string? | Timestamp of the review. |
data.reviews[].timeAgo | string? | Human-friendly relative time (e.g. "a day ago"). |
data.reviews[].reviewUrl | string? | Direct link to the review on Google Maps. |
data.reviews[].reviewId | string? | Stable review identifier. |
data.reviews[].photosCount | number? | Number of photos attached to the review. |
data.reviews[].images | array? | Review photo data, when present. |
data.reviews[].ownerAnswer | string? | The business owner's reply, when present. |
data.reviews[].ownerAnswerTimestamp | string? | Timestamp of the owner's reply. |
Pricing
Billed by depth: about $0.01 per 50 reviews (up to ~$0.03 for 150). No monthly minimums — you only pay for the reviews you pull.
Reviews are sourced live from Google Maps. Because the upstream is job-based, deep pulls take longer; if a job isn't ready within the request window you'll receive a retryable 503. For pulling every review across thousands, request the newest slice per call or reach out about a bulk async flow.