<br />

**European Economic Area (EEA) developers**

> [!NOTE]
> If your billing address is in the European Economic Area, effective on 8 July 2025, the [Google Maps Platform EEA Terms of Service](https://cloud.google.com/terms/maps-platform/eea) will apply to your use of the Services. Functionality varies by region. [Learn more](https://developers.google.com/maps/comms/eea/faq.md.txt).

Place reviews lets you add user reviews and ratings to your web pages. This page
explains the differences between place reviews as used in the `Place` class
(new) and `PlacesService` (legacy), and provides some code snippets for
comparison.

- `PlacesService` (legacy) returns an array of [`PlaceReview`](https://developers.google.com/maps/documentation/javascript/reference/places-service.md.txt#PlaceReview) instances as part of the `PlaceResult` object for any `getDetails()` request if the `reviews` field is specified in the request.
- `Place` (new) returns an array of [`Review`](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#Review) instances as part of a `fetchFields()` request if the `reviews` field is specified in the request.

The following table lists some of the main differences in the use of place
reviews between the `Place` class and `PlacesService`:

| [`PlacesService`](https://developers.google.com/maps/documentation/javascript/reference/places-service.md.txt) (Legacy) | [`Place`](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt) (New) |
|---|---|
| [`PlaceReview`](https://developers.google.com/maps/documentation/javascript/reference/places-service.md.txt#PlaceReview) interface | [`Review`](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#Review) class |
| Methods require the use of a callback to handle the results object and `google.maps.places.PlacesServiceStatus` response. | Uses Promises, and works asynchronously. |
| Methods require a `PlacesServiceStatus` check. | No required status check, can use standard error handling. [Learn more](https://developers.google.com/maps/documentation/javascript/reference/errors.md.txt). |
| `PlacesService` must be instantiated using a map or a div element. | `Place` can be instantiated wherever needed, without a reference to a map or page element. |
| `PlaceReview` returns attribution data for the review using the `author_name`, `author_url`, and `profile_photo_url` fields. | `Review` returns attribution data for the review using an [`AuthorAttribution`](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#AuthorAttribution) instance. |

## Code comparison

This section compares code for text search methods to illustrate the differences
between Place reviews in the legacy `PlacesService` and the newer `Place` class.

### Places service (legacy)

The following snippet calls `getDetails()` to request place details including
reviews, and displays the first review result in an infowindow.

```javascript
const request = {
  placeId: "ChIJpyiwa4Zw44kRBQSGWKv4wgA", // Faneuil Hall Marketplace, Boston, MA
  fields: ["name", "formatted_address", "geometry", "reviews"],
};
const service = new google.maps.places.PlacesService(map);

service.getDetails(request, (place, status) => {
  if (
    status === google.maps.places.PlacesServiceStatus.OK &&
    place &&
    place.geometry &&
    place.geometry.location
  ) {
    // If there are any reviews display the first one.
    if (place.reviews && place.reviews.length > 0) {
      // Get info for the first review.
      let reviewRating = place.reviews[0].rating;
      let reviewText = place.reviews[0].text;
      let authorName = place.reviews[0].author_name;
      let authorUri = place.reviews[0].author_url;

      // Format the review using HTML.
      contentString =`
            <div id="title"><b>${place.name}</b></div>
            <div id="address">${place.formatted_address}</div>
            <a href="${authorUri}" target="_blank">Author: ${authorName}</a>
            <div id="rating">Rating: ${reviewRating} stars</div>
            <div id="rating"><p>Review: ${reviewText}</p></div>`;
    } else {
      contentString = `No reviews were found for ${place.name}`;
    }

    const infowindow = new google.maps.InfoWindow({
      content: contentString,
      ariaLabel: place.displayName,
    });

    // Add a marker.
    const marker = new google.maps.Marker({
      map,
      position: place.geometry.location,
    });

    // Show the info window.
    infowindow.open({
      anchor: marker,
      map,
    });
  }
});
```

- [`getDetails()` reference](https://developers.google.com/maps/documentation/javascript/reference/places-service.md.txt#PlacesService.getDetails)
- [`PlaceReview` interface reference](https://developers.google.com/maps/documentation/javascript/reference/places-service.md.txt#PlaceReview)

### Place class (new)

The following snippet calls [`fetchFields()`](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#Place.fetchFields)
method to request place details including reviews, and displays the first review
result in an infowindow.

```javascript
// Use a place ID to create a new Place instance.
const place = new google.maps.places.Place({
  id: "ChIJpyiwa4Zw44kRBQSGWKv4wgA", // Faneuil Hall Marketplace, Boston, MA
});

// Call fetchFields, passing 'reviews' and other needed fields.
await place.fetchFields({
  fields: ["displayName", "formattedAddress", "location", "reviews"],
});

// If there are any reviews display the first one.
if (place.reviews && place.reviews.length > 0) {
  // Get info for the first review.
  let reviewRating = place.reviews[0].rating;
  let reviewText = place.reviews[0].text;
  let authorName = place.reviews[0].authorAttribution.displayName;
  let authorUri = place.reviews[0].authorAttribution.uri;

  // Format the review using HTML.
  contentString =`
          <div id="title"><b>${place.displayName}</b></div>
          <div id="address">${place.formattedAddress}</div>
          <a href="${authorUri}" target="_blank">Author: ${authorName}</a>
          <div id="rating">Rating: ${reviewRating} stars</div>
          <div id="rating"><p>Review: ${reviewText}</p></div>`;
} else {
  contentString = `No reviews were found for ${place.displayName}`;
}

// Create an infowindow to display the review.
infoWindow = new google.maps.InfoWindow({
  content: contentString,
  ariaLabel: place.displayName,
});

// Add a marker.
const marker = new google.maps.marker.AdvancedMarkerElement({
  map,
  position: place.location,
  title: place.displayName,
});

// Show the info window.
infoWindow.open({
  anchor: marker,
  map,
});
```

- [See the example](https://developers.google.com/maps/documentation/javascript/examples/place-reviews.md.txt)
- [See the documentation](https://developers.google.com/maps/documentation/javascript/place-reviews.md.txt)
- [`fetchFields()` reference](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#Place.fetchFields)
- [`Review` class reference](https://developers.google.com/maps/documentation/javascript/reference/place.md.txt#Review)