[Product reviews](https://support.google.com/merchants/answer/6059553) are an important part of Shopping experience
for customers. These ratings and reviews help customers with product research
and purchase decisions. Positive product reviews can drive more qualified
customers to a seller's product pages. Sources include sellers, review
aggregators, review sites, and Google users.

This page explains how you can manage product reviews using Merchant API.

## Prerequisites

Google needs you to provide specific information. You must have the following:

- An active product review feed in the Google Merchant Center.
- Your account must be enrolled into the Product ratings program. You can either check the eligibility programmatically using [Programs sub-API](https://developers.google.com/merchant/api/guides/programs/overview) or check through Merchant Center. If you are not eligible, learn more about [enrolling into the product ratings program](https://support.google.com/merchants/answer/6059553).
- To review products using Merchant API, submit an allowlist request in the [Shopping API Support Form](https://support.google.com/merchants/contact/shopping_api_support_form) under "What is the issue/question?"

> [!NOTE]
> **Note:** Product review feed is not the same as products feed.

## Create a data source

Use the `datasource.create` method to create a product review feed. If an
existing merchant or product review feed is available, use
[`accounts.dataSources.list`](https://developers.google.com/merchant/api/reference/rest/datasources_v1/accounts.dataSources/list)
to fetch the `accounts.dataSources.name`. Store the data source name you create
or retrieve in your local database for each review. The form of the request is
as follows:

    POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources

### Example

The example shows a typical request and response:

**Request**

    POST https://merchantapi.googleapis.com/datasources/v1/accounts/{ACCOUNT_ID}/dataSources

    {
      "displayName": "My API Data Source",
      "primaryProductDataSource": {}
    }

**Response**

    {
      "name": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
      "dataSourceId": "{DATASOURCE_ID}",
      "displayName": "My API Data Source",
      "primaryProductDataSource": {},
      "input": "API"
    }

For more information, see
[Create a product review data source](https://developers.google.com/merchant/api/guides/data-sources/manage-various-data-sources#product-review-data-source).

> [!NOTE]
> **Note:** The data source is immediately available after creation, so you don't need to wait for any processing.

## Create a product review

You can use the `accounts.productreviews.insert` method to create or update a
product review. The `accounts.productreviews.insert` method takes a
`productreview` resource and a data source name as input. It returns the new or
updated `productreview`, if successful. To create a product review, you must
have a
[`datasource.name`](https://developers.google.com/merchant/api/reference/rest/datasources_v1/accounts.dataSources#DataSource.FIELDS.name).

> [!IMPORTANT]
> **Important:** This request overwrites the entire product review resource, so the request needs to include all the details to avoid losing information.

The form of the request:

    POST https://merchantapi.googleapis.com/reviews/v1/{parent=accounts/{ACCOUNT_ID}/}productReviews:insert

The following sample request illustrates how you can create a product review.

    POST https://merchantapi.googleapis.com/reviews/v1/accounts/{ACCOUNT_ID}/productReviews:insert?dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}

      productReviewId = 'my_product_review'
      productReviewAttributes {
        aggregatorName = 'aggregator_name'
        subclientName = 'subclient_name'
        publisherName = 'publisher_name'
        publisherFavicon = 'https://www.google.com/favicon.ico'
        reviewerId = 'reviewer_id'
        reviewerIsAnonymous = false
        reviewerUsername = 'reviewer_username'
        reviewLanguage = 'en'
        reviewCountry = 'US'
        reviewTime = '2024-04-01T00:00:00Z'
        title = 'Incredible product'
        content = 'This is an incredible product.'
        pros = ['pro1', 'pro2']
        cons = ['con1', 'con2']
        reviewLink = {
          type = 'SINGLETON'
          link = 'https://www.google.com'
        }
        reviewerImageLinks = ['https://www.google.com/reviewer.png']
        minRating = 1
        maxRating = 10
        rating = 8.5
        productNames = ['product_name']
        productLinks = ['https://www.google.com/product']
        asins = ['asin1', 'asin2']
        gtins = ['gtin1', 'gtin2']
        mpns = ['mpn1', 'mpn2']
        skus = ['sku1', 'sku2']
        brands = ['brand1', 'brand2']
        isSpam = false
        collectionMethod = 'POST_FULFILLMENT'
        transactionId = 'transaction_id'
      }

After product review creation, it can take a few minutes for the review to
propagate.

Here's a sample you can use to insert multiple product reviews asynchronously:

### Java

    import com.google.api.core.ApiFuture;
    import com.google.api.core.ApiFutureCallback;
    import com.google.api.core.ApiFutures;
    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.common.util.concurrent.MoreExecutors;
    import com.google.protobuf.Timestamp;
    import com.google.shopping.merchant.reviews.v1.InsertProductReviewRequest;
    import com.google.shopping.merchant.reviews.v1.ProductReview;
    import com.google.shopping.merchant.reviews.v1.ProductReviewAttributes;
    import com.google.shopping.merchant.reviews.v1.ProductReviewAttributes.ReviewLink;
    import com.google.shopping.merchant.reviews.v1.ProductReviewAttributes.ReviewLink.Type;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceClient;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceSettings;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import java.util.stream.Collectors;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to insert multiple product reviews asynchronously. */
    public class InsertProductReviewsAsyncSample {

      private static String generateRandomString() {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuilder sb = new StringBuilder(8);
        for (int i = 0; i < 8; i++) {
          sb.append(characters.charAt(random.nextInt(characters.length())));
        }
        return sb.toString();
      }

      // Returns a product review with a random ID.
      private static ProductReview createProductReview(String accountId) {
        // MAKE SURE YOU PASS AN ACTUAL PRODUCT REVIEW ID HERE.
        String productReviewId = generateRandomString();

        ProductReviewAttributes attributes =
            ProductReviewAttributes.newBuilder()
                .setTitle("Would not recommend!")
                .setContent("Not fantastic.")
                .setMinRating(1)
                .setMaxRating(5)
                .setRating(2)
                .setReviewTime(Timestamp.newBuilder().setSeconds(123456789).build())
                .addProductLinks("exampleproducturl.com")
                .setReviewLink(
                    ReviewLink.newBuilder()
                        .setLink("examplereviewurl.com")
                        // The review page contains only this single review.
                        .setType(Type.SINGLETON)
                        .build())
                .addGtins("9780007350896")
                .addGtins("9780007350897")
                .build();

        return ProductReview.newBuilder()
            .setProductReviewId(productReviewId)
            .setProductReviewAttributes(attributes)
            .build();
      }

      public static void asyncInsertProductReviews(String accountId, String dataSourceId)
          throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        ProductReviewsServiceSettings productReviewsServiceSettings =
            ProductReviewsServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        try (ProductReviewsServiceClient productReviewsServiceClient =
            ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

          // Arbitrarily creates five product reviews with random IDs.
          List<InsertProductReviewRequest> requests = new ArrayList<>();
          for (int i = 0; i < 5; i++) {
            InsertProductReviewRequest request =
                InsertProductReviewRequest.newBuilder()
                    .setParent(String.format("accounts/%s", accountId))
                    .setProductReview(createProductReview(accountId))
                    // Must be a product reviews data source. In other words, a data source whose "type"
                    // is ProductReviewDataSource.
                    .setDataSource(String.format("accounts/%s/dataSources/%s", accountId, dataSourceId))
                    .build();
            requests.add(request);
          }

          // Inserts the product reviews.
          List<ApiFuture<ProductReview>> futures =
              requests.stream()
                  .map(
                      request ->
                          productReviewsServiceClient.insertProductReviewCallable().futureCall(request))
                  .collect(Collectors.toList());

          // Creates callback to handle the responses when all are ready.
          ApiFuture<List<ProductReview>> responses = ApiFutures.allAsList(futures);
          ApiFutures.addCallback(
              responses,
              new ApiFutureCallback<List<ProductReview>>() {
                @Override
                public void onSuccess(List<ProductReview> results) {
                  System.out.println("Inserted product reviews below:");
                  System.out.println(results);
                }

                @Override
                public void onFailure(Throwable throwable) {
                  System.out.println(throwable);
                }
              },
              MoreExecutors.directExecutor());
        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        asyncInsertProductReviews(config.getAccountId().toString(), "YOUR_DATA_SOURCE_ID");
      }
    }

## Retrieve a product review

To view a product review, use `accounts.productreviews.get`. This is read-only.
It requires your `accountId` and the ID of the product review as part of the
name field. The `GET` method returns the corresponding product review resource.

    GET https://merchantapi.googleapis.com/reviews/v1/{name=accounts/{ACCOUNT_ID}/productReviews/*}

Here's a sample you can use to retrieve a product review:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.reviews.v1.GetProductReviewRequest;
    import com.google.shopping.merchant.reviews.v1.ProductReview;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceClient;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceSettings;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to get a product review. */
    public class GetProductReviewSample {

      public static void getProductReview(String accountId, String productReviewId) throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        ProductReviewsServiceSettings productReviewsServiceSettings =
            ProductReviewsServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        try (ProductReviewsServiceClient productReviewsServiceClient =
            ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

          GetProductReviewRequest request =
              GetProductReviewRequest.newBuilder()
                  .setName(String.format("accounts/%s/productReviews/%s", accountId, productReviewId))
                  .build();

          System.out.println("Sending get product review request:");
          ProductReview response = productReviewsServiceClient.getProductReview(request);
          System.out.println("Product review retrieved successfully:");
          System.out.println(response.getName());
        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        String productReviewId = "YOUR_PRODUCT_REVIEW_ID";
        getProductReview(config.getAccountId().toString(), productReviewId);
      }
    }

## List product reviews

You can use the `productreviews.list` method to view all created product
reviews.

    GET https://merchantapi.googleapis.com/reviews/v1/{parent=accounts/{ACCOUNT_ID}}/productReviews

Here's a sample you can use to list all the reviews for a product:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.reviews.v1.ListProductReviewsRequest;
    import com.google.shopping.merchant.reviews.v1.ProductReview;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceClient;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceClient.ListProductReviewsPagedResponse;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceSettings;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to list all the product reviews in a given account. */
    public class ListProductReviewsSample {

      public static void listProductReviews(String accountId) throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        ProductReviewsServiceSettings productReviewsServiceSettings =
            ProductReviewsServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        try (ProductReviewsServiceClient productReviewsServiceClient =
            ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

          ListProductReviewsRequest request =
              ListProductReviewsRequest.newBuilder()
                  .setParent(String.format("accounts/%s", accountId))
                  .build();

          System.out.println("Sending list product reviews request:");
          ListProductReviewsPagedResponse response =
              productReviewsServiceClient.listProductReviews(request);

          int count = 0;

          // Iterates over all rows in all pages and prints all product reviews.
          for (ProductReview element : response.iterateAll()) {
            System.out.println(element);
            count++;
          }
          System.out.print("The following count of elements were returned: ");
          System.out.println(count);
        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        listProductReviews(config.getAccountId().toString());
      }
    }

## Delete product reviews

To delete a product review, use `accounts.productreviews.delete`. Similar to the
`GET` method, this method requires the name field of the product review returned
during creation.

    DELETE https://merchantapi.googleapis.com/reviews/v1/{name=accounts/{ACCOUNT_ID}/productReviews/*}

Here's a sample you can use to delete a product review:

### Java

    import com.google.api.gax.core.FixedCredentialsProvider;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.shopping.merchant.reviews.v1.DeleteProductReviewRequest;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceClient;
    import com.google.shopping.merchant.reviews.v1.ProductReviewsServiceSettings;
    import shopping.merchant.samples.utils.Authenticator;
    import shopping.merchant.samples.utils.Config;

    /** This class demonstrates how to delete a product review. */
    public class DeleteProductReviewSample {

      public static void deleteProductReview(String accountId, String productReviewId)
          throws Exception {
        GoogleCredentials credential = new Authenticator().authenticate();

        ProductReviewsServiceSettings productReviewsServiceSettings =
            ProductReviewsServiceSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credential))
                .build();

        try (ProductReviewsServiceClient productReviewsServiceClient =
            ProductReviewsServiceClient.create(productReviewsServiceSettings)) {

          DeleteProductReviewRequest request =
              DeleteProductReviewRequest.newBuilder()
                  .setName(String.format("accounts/%s/productReviews/%s", accountId, productReviewId))
                  .build();

          System.out.println("Sending delete product review request:");
          productReviewsServiceClient.deleteProductReview(request);
          System.out.println("Product review deleted successfully");
        } catch (Exception e) {
          System.out.println(e);
        }
      }

      public static void main(String[] args) throws Exception {
        Config config = Config.load();
        String productReviewId = "YOUR_PRODUCT_REVIEW_ID";
        deleteProductReview(config.getAccountId().toString(), productReviewId);
      }
    }

## Product review status

The product review resource contains the status similar to other APIs,
which is an integral part of the resource and follows the same issue \&
destination structure.