판매자 센터 계정에 제품을 추가한 후 현재 상태와 데이터 품질 문제를 비롯한 최종 처리된 상태를 가져올 수 있습니다. 이를 통해 제품 인벤토리를 모니터링하고, 문제를 진단하고, 제품이 Google에 표시될 수 있는지 확인할 수 있습니다.
이 가이드에서는 Products 및 Reports 하위 API를 사용하여 제품과 관련 문제를 나열하는 방법을 설명합니다.
기본 요건
판매자 센터 계정에 제품이 있어야 합니다. 제품을 추가하는 방법을 알아보려면 제품 추가 및 관리 가이드를 참고하세요.
특별 고려사항
- 처리 지연: 
productInput이 삽입되거나 업데이트되는 시점과 제품의 검색 메서드에서 반환된 최종 처리된product에 변경사항이 반영되는 시점 사이에는 일반적으로 몇 분의 지연이 있습니다. - 대상 유형이 없는 제품: 의도한 대상 유형이 없는 제품은 약 1주일 후에 자동으로 삭제됩니다. 
productStatus필드 내의destinationStatuses목록이 비어 있으면 제품에 의도한 대상이 없습니다. 의도치 않은 제품 삭제를 방지하려면 이 상태를 정기적으로 확인해야 합니다. 
처리된 모든 제품 나열
처리된 최종 제품의 목록을 모두 가져오려면 products.list 메서드를 사용합니다. 이 메서드는 모든 규칙과 데이터 소스 병합이 적용된 후 판매자 센터에 표시되는 제품을 나타내는 Product 리소스를 반환합니다.
응답이 페이지로 나뉩니다. pageSize 매개변수를 사용하여 각 페이지에 반환할 제품 수를 지정하고 응답의 pageToken를 사용하여 후속 페이지를 가져옵니다.
GET https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/products?pageSize=2
호출에 성공하면 Product 리소스의 페이지로 나눈 목록이 반환됩니다.
{
 "products": [
   {
     "name": "accounts/{ACCOUNT_ID}/products/en~US~SKU12345",
     "offerId": "SKU12345",
     "contentLanguage": "en",
     "feedLabel": "US",
     "dataSource": "accounts/{ACCOUNT_ID}/dataSources/12345",
     "productAttributes": {
       "title": "Classic Cotton T-Shirt",
       "price": {
         "amountMicros": "15990000",
         "currencyCode": "USD"
       }
     },
     "productStatus": {
       "destinationStatuses": [
         {
           "reportingContext": "SHOPPING_ADS",
           "approvedCountries": [
             "US"
           ]
         }
       ]
     }
   },
   {
     "name": "accounts/{ACCOUNT_ID}/products/en~US~SKU67890",
     "offerId": "SKU67890",
     "contentLanguage": "en",
     "feedLabel": "US",
     "dataSource": "accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}",
     "productAttributes": {
       "title": "Modern Linen Trousers",
       "price": {
         "amountMicros": "49990000",
         "currencyCode": "USD"
       },
       "gtins": [
         "123456789012"
       ]
     },
     "productStatus": {
       "destinationStatuses": [
         {
           "reportingContext": "SHOPPING_ADS",
           "disapprovedCountries": [
             "US"
           ]
         }
       ],
       "itemLevelIssues": [
         {
           "code": "invalid_gtin",
           "severity": "DISAPPROVED",
           "resolution": "merchant_action",
           "attribute": "gtins",
           "reportingContext": "SHOPPING_ADS",
           "description": "Invalid GTIN",
           "detail": "The value provided for the gtin attribute is not a valid GTIN.",
           "documentation": "https://support.google.com/merchants/answer/6324461",
           "applicableCountries": [
             "US"
           ]
         }
       ]
     }
   }
 ],
 "nextPageToken": "CiAKGjZhY2NvdW50cy8xMjM0NS9wcm9kdWN0cy9vbmxpbmV"
}
다음 코드 샘플은 모든 제품을 나열하는 방법을 보여줍니다.
자바
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1.ListProductsRequest;
import com.google.shopping.merchant.products.v1.Product;
import com.google.shopping.merchant.products.v1.ProductsServiceClient;
import com.google.shopping.merchant.products.v1.ProductsServiceClient.ListProductsPagedResponse;
import com.google.shopping.merchant.products.v1.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to list all the products for a given merchant center account */
public class ListProductsSample {
  private static String getParent(String accountId) {
    return String.format("accounts/%s", accountId);
  }
  public static void listProducts(Config config) throws Exception {
    // Obtains OAuth token based on the user's configuration.
    GoogleCredentials credential = new Authenticator().authenticate();
    // Creates service settings using the credentials retrieved above.
    ProductsServiceSettings productsServiceSettings =
        ProductsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();
    // Creates parent to identify the account from which to list all products.
    String parent = getParent(config.getAccountId().toString());
    // Calls the API and catches and prints any network failures/errors.
    try (ProductsServiceClient productsServiceClient =
        ProductsServiceClient.create(productsServiceSettings)) {
      // The parent has the format: accounts/{account}
      // Page size is set to the maximum value. If you are returned more
      // responses than your page size, this code will automatically
      // re-call the service with the `pageToken` until all responses
      // are returned.
      ListProductsRequest request =
          ListProductsRequest.newBuilder().setParent(parent).setPageSize(1000).build();
      System.out.println("Sending list products request:");
      ListProductsPagedResponse response = productsServiceClient.listProducts(request);
      int count = 0;
      // Iterates over all rows in all pages and prints the datasource in each row.
      // Automatically uses the `nextPageToken` if returned to fetch all pages of data.
      for (Product product : response.iterateAll()) {
        System.out.println(product); // The product includes the `productStatus` field
        // That shows approval and disapproval information.
        count++;
      }
      System.out.print("The following count of products were returned: ");
      System.out.println(count);
    } catch (Exception e) {
      System.out.println("An error has occured: ");
      System.out.println(e);
    }
  }
  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    listProducts(config);
  }
}
PHP
use Google\ApiCore\ApiException;
use Google\ApiCore\PagedListResponse;
use Google\Shopping\Merchant\Products\V1\ListProductsRequest;
use Google\Shopping\Merchant\Products\V1\Product;
use Google\Shopping\Merchant\Products\V1\Client\ProductsServiceClient;
/**
 * This class demonstrates how list all products in your Merchant Center account.
 */
class ListProducts
{
    /**
     * A helper function to create the parent string.
     *
     * @param array $accountId
     *      The account that owns the product.
     *
     * @return string The parent has the format: `accounts/{account_id}`
     */
    private static function getParent($accountId)
    {
        return sprintf("accounts/%s", $accountId);
    }
    /**
     * Lists all products in your Merchant Center account.
     *
     * @param array $config
     *      The configuration data used for authentication and getting the acccount
     *      ID.
     */
    public static function listProductsSample($config)
    {
        // Obtains OAuth token based on the user's configuration.
        $credentials = Authentication::useServiceAccountOrTokenFile();
        // Creates options config containing credentials for the client to use.
        $options = ['credentials' => $credentials];
        // Creates a client.
        $productsServiceClient = new ProductsServiceClient($options);
        // Creates parent to identify the account from which to list all products.
        $parent = self::getParent($config['accountId']);
        // Creates the request.
        // Page size is set to the maximum value. If you are returned more
        // responses than your page size, this code will automatically
        // re-call the service with the `pageToken` until all responses
        // are returned.
        $request = new ListProductsRequest(['parent' => $parent, 'page_size' => 1000]);
        // Calls the API and catches and prints any network failures/errors.
        try {
            echo "Sending list products request:\n";
            /**
             * Call the listProducts service and get back a response object
             * with all products.
             *
             * @var PagedListResponse $response
             */
            $response = $productsServiceClient->listProducts($request);
            /**
             * Loop through every product and print out its data.
             *
             * @var Product $product
             */
            foreach ($response as $product) {
                // The product includes the `productStatus` field that shows approval
                // and disapproval information.
                printf(
                    'Product data: %s%s',
                    $product->serializeToJsonString(), PHP_EOL
                );
            }
        } catch (ApiException $e) {
            printf('Call failed with message: %s%s', $e->getMessage(), PHP_EOL);
        }
    }
    /**
     * Helper to execute the sample.
     *
     * @return void
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        self::listProductsSample($config);
    }
}
// Run the script
$sample = new ListProducts();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping import merchant_products_v1
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_products():
  """Lists the `Product` resources for a given account."""
  # Gets OAuth Credentials.
  credentials = generate_user_credentials.main()
  # Creates a client.
  client = merchant_products_v1.ProductsServiceClient(
      credentials=credentials
  )
  # Creates the request. Set the page size to the maximum value.
  request = merchant_products_v1.ListProductsRequest(
      parent=_PARENT, page_size=1000
  )
  # Makes the request and catches and prints any error messages.
  try:
    response = client.list_products(request=request)
    for product in response:
      print(product)
    print("List request successful!")
  except RuntimeError as e:
    print("List request failed")
    print(e)
if __name__ == "__main__":
  list_products()
Apps_Script
/**
 * Lists all products for a given Merchant Center account.
 */
function productList() {
  // IMPORTANT:
  // Enable the Merchant API Products sub-API Advanced Service and call it
  // "MerchantApiProducts"
  // Replace this with your Merchant Center ID.
  const accountId = '<MERCHANT_CENTER_ID>';
  // Construct the parent name
  const parent = 'accounts/' + accountId;
  try {
    console.log('Sending list Products request');
    let pageToken;
    // Set the page size to 1000. This is the maximum allowed page size.
    let pageSize = 1000;
    console.log('Retrieved products below:');
    // Call the Products.list API method. Use the pageToken to iterate through
    // all pages of results.
    do {
      response = MerchantApiProducts.Accounts.Products.list(parent, {pageToken, pageSize});
      console.log(response);
      pageToken = response.nextPageToken;
    } while (pageToken); // Exits when there is no next page token.
  } catch (e) {
    console.log('ERROR!');
    console.log(e);
  }
}
cURL
curl -X GET \
"https://merchantapi.googleapis.com/products/v1/accounts/{ACCOUNT_ID}/products?pageSize=2" \
-H "Authorization: Bearer <API_TOKEN>"
제품 상태 및 문제 확인
Merchant API는 제품 및 계정의 문제를 확인할 수 있는 여러 방법을 제공합니다.
문제를 볼 올바른 방법 선택
다음은 문제를 신고하는 데 사용할 수 있는 다양한 방법을 비교한 것입니다.
- 세부 제품 상태: 
products.list를 사용하여 모든 대상에서 제품의 세부 제품 상태 정보를 가져옵니다. 자세한 내용은 다음 섹션productStatus를 사용하여 제품 상태 확인을 참고하세요. - 집계된 제품 상태: 
aggregateProductStatuses.list를 사용하여 상태별 제품 요약 및 가장 일반적인 문제 유형을 비롯한 제품 데이터 상태의 개요를 확인할 수 있습니다. 자세한 내용은 제품 통계 및 문제 보기를 참고하세요. - 상태를 기준으로 제품 필터링: 
reports.search에서productView을 쿼리하여 상태를 기준으로 제품을 필터링합니다. 자세한 내용은 제품 필터링 섹션을 참고하세요. - UI용 계정 및 제품 문제 렌더링: 
renderaccountissue및renderproductissue를 사용하여 특정 문제에 대한 자세하고 사람이 읽을 수 있는 설명과 문서 링크를 가져옵니다. 이 메서드를 사용하여 최종 사용자에게 제품 및 계정 문제를 표시하는 UI를 생성합니다. 자세한 내용은 비즈니스용 디스플레이 문제 및 해결 방법을 참고하세요. - 계정 문제 나열: 
accountissues.list를 사용하여 정책 위반과 같이 전체 판매자 센터 계정에 영향을 미치는 문제를 확인합니다. 
productStatus를 사용하여 제품 상태 확인
제품의 상태를 확인하려면 products.list 또는 products.get에서 반환된 Product 리소스 내의 productStatus 필드를 검사합니다. 이 필드에는 제품의 모든 대상에 대한 집계된 상태 정보가 포함됩니다. 또한 특정 제품에 연결된 인벤토리 (지역 및 오프라인)와 관련된 문제도 포함됩니다.
productStatus 필드에는 다음이 포함됩니다.
destinationStatuses: 각 도착 페이지 (예:SHOPPING_ADS)에 대한 제품의 승인 상태를 나타내는 배열입니다. 제품이 승인, 대기 중 또는 비승인된 국가를 나열합니다.itemLevelIssues: 제품에서 발견된 데이터 유효성 검사 또는 정책 문제를 포함하는 배열입니다. 각 문제에는 설명, 심각도, 영향을 받는 속성, 문제를 해결하는 데 도움이 되는 문서가 포함되어 있습니다.
다음은 GTIN이 유효하지 않아 미국의 쇼핑 광고에서 비승인된 제품의 productStatus 예입니다.
{
 "productStatus": {
   "destinationStatuses": [
     {
       "reportingContext": "SHOPPING_ADS",
       "disapprovedCountries": [
         "US"
       ]
     }
   ],
   "itemLevelIssues": [
     {
       "code": "invalid_gtin",
       "severity": "DISAPPROVED",
       "resolution": "merchant_action",
       "attribute": "gtins",
       "reportingContext": "SHOPPING_ADS",
       "description": "Invalid GTIN",
       "detail": "The value provided for the gtin attribute is not a valid GTIN.",
       "documentation": "https://support.google.com/merchants/answer/6324461",
       "applicableCountries": [
         "US"
       ]
     }
   ]
 }
}
제품 필터링
모든 제품을 나열하고 자체적으로 필터링하는 대신 Reports 하위 API의 reports.search 메서드를 사용하여 제품을 효율적으로 필터링할 수 있습니다.
예를 들어 비승인된 제품 목록만 가져오려면 ProductView 테이블에서 reports.search 쿼리를 빌드하여 aggregated_reporting_context_status이 NOT_ELIGIBLE_OR_DISAPPROVED인 제품을 선택하면 됩니다. availability 또는 language_code과 같은 다른 속성으로 필터링할 수도 있습니다. 필터링 기능을 만드는 방법에 관한 자세한 내용은 제품 필터링 가이드 섹션을 참고하세요.
POST https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search
{
 "query": "SELECT offer_id, id, title FROM product_view WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'"
}
다음 코드 샘플은 비승인 상품을 필터링하는 방법을 보여줍니다.
자바
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1.GetProductRequest;
import com.google.shopping.merchant.products.v1.Product;
import com.google.shopping.merchant.products.v1.ProductsServiceClient;
import com.google.shopping.merchant.products.v1.ProductsServiceSettings;
import com.google.shopping.merchant.reports.v1.ReportRow;
import com.google.shopping.merchant.reports.v1.ReportServiceClient;
import com.google.shopping.merchant.reports.v1.ReportServiceClient.SearchPagedResponse;
import com.google.shopping.merchant.reports.v1.ReportServiceSettings;
import com.google.shopping.merchant.reports.v1.SearchRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
 * This class demonstrates how to get the list of all the disapproved products for a given merchant
 * center account.
 */
public class FilterDisapprovedProductsSample {
  // Gets the product details for a given product using the GetProduct method.
  public static void getProduct(GoogleCredentials credential, Config config, String productName)
      throws Exception {
    // Creates service settings using the credentials retrieved above.
    ProductsServiceSettings productsServiceSettings =
        ProductsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();
    // Calls the API and catches and prints any network failures/errors.
    try (ProductsServiceClient productsServiceClient =
        ProductsServiceClient.create(productsServiceSettings)) {
      // The name has the format: accounts/{account}/products/{productId}
      GetProductRequest request = GetProductRequest.newBuilder().setName(productName).build();
      Product response = productsServiceClient.getProduct(request);
      System.out.println(response);
    } catch (Exception e) {
      System.out.println(e);
    }
  }
  // Filters the disapproved products for a given Merchant Center account using the Reporting API.
  // Then, it prints the product details for each disapproved product.
  public static void filterDisapprovedProducts(Config config) throws Exception {
    GoogleCredentials credential = new Authenticator().authenticate();
    ReportServiceSettings reportServiceSettings =
        ReportServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();
    try (ReportServiceClient reportServiceClient =
        ReportServiceClient.create(reportServiceSettings)) {
      // The parent has the format: accounts/{accountId}
      String parent = String.format("accounts/%s", config.getAccountId().toString());
      // The query below is an example of a query for the productView that gets product informations
      // for all disapproved products.
      String query =
          "SELECT offer_id,"
              + "id,"
              + "title,"
              + "price"
              + " FROM product_view"
              // aggregated_reporting_context_status can be one of the following values:
              // NOT_ELIGIBLE_OR_DISAPPROVED, ELIGIBLE, PENDING, ELIGIBLE_LIMITED,
              // AGGREGATED_REPORTING_CONTEXT_STATUS_UNSPECIFIED
              + " WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'";
      // Create the search report request.
      SearchRequest request = SearchRequest.newBuilder().setParent(parent).setQuery(query).build();
      System.out.println("Sending search report request for Product View.");
      // Calls the Reports.search API method.
      SearchPagedResponse response = reportServiceClient.search(request);
      System.out.println("Received search reports response: ");
      // Iterates over all report rows in all pages and prints each report row in separate line.
      // Automatically uses the `nextPageToken` if returned to fetch all pages of data.
      for (ReportRow row : response.iterateAll()) {
        System.out.println("Printing data from Product View:");
        System.out.println(row);
        // Optionally, you can get the full product details by calling the GetProduct method.
        String productName =
            "accounts/"
                + config.getAccountId().toString()
                + "/products/"
                + row.getProductView().getId();
        System.out.println("Getting full product details by calling GetProduct method:");
        getProduct(credential, config, productName);
      }
    } catch (Exception e) {
      System.out.println("Failed to search reports for Product View.");
      System.out.println(e);
    }
  }
  public static void main(String[] args) throws Exception {
    Config config = Config.load();
    filterDisapprovedProducts(config);
  }
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Products\V1\Client\ProductsServiceClient;
use Google\Shopping\Merchant\Products\V1\GetProductRequest;
use Google\Shopping\Merchant\Reports\V1\Client\ReportServiceClient;
use Google\Shopping\Merchant\Reports\V1\SearchRequest;
/**
 * This class demonstrates how to get the list of all the disapproved products for a given merchant
 * center account.
 */
class FilterDisapprovedProducts
{
    /**
     * Gets the product details for a given product using the GetProduct method.
     *
     * @param mixed $credentials The OAuth credentials.
     * @param array $config The configuration data, including 'accountId'.
     * @param string $productName The full resource name of the product to retrieve.
     *      Format: accounts/{account}/products/{product}
     */
    private static function getProduct(
        $credentials,
        array $config,
        string $productName
    ): void {
        // Creates options config containing credentials for the client to use.
        $options = ['credentials' => $credentials];
        // Creates a ProductsServiceClient.
        $productsServiceClient = new ProductsServiceClient($options);
        // Calls the API and catches and prints any network failures/errors.
        try {
            // Construct the GetProductRequest.
            // The name has the format: accounts/{account}/products/{productId}
            $request = new GetProductRequest(['name' => $productName]);
            // Make the API call.
            $response = $productsServiceClient->getProduct($request);
            // Prints the retrieved product.
            // Protobuf messages are printed as JSON strings for readability.
            print $response->serializeToJsonString() . "\n";
        } catch (ApiException $e) {
            // Prints any errors that occur during the API call.
            printf("ApiException was thrown: %s\n", $e->getMessage());
        }
    }
    /**
     * Filters disapproved products for a given Merchant Center account using the Reporting API,
     * then prints the details for each disapproved product.
     *
     * @param array $config The configuration data used for authentication and
     *      getting the account ID.
     */
    public static function filterDisapprovedProductsSample(array $config): void
    {
        // Gets the OAuth credentials to make the request.
        $credentials = Authentication::useServiceAccountOrTokenFile();
        // Creates options config containing credentials for the Report client to use.
        $reportClientOptions = ['credentials' => $credentials];
        // Creates a ReportServiceClient.
        $reportServiceClient = new ReportServiceClient($reportClientOptions);
        // The parent resource name for the report.
        // Format: accounts/{accountId}
        $parent = sprintf("accounts/%s", $config['accountId']);
        // The query to select disapproved products from the product_view.
        // This query retrieves offer_id, id, title, and price for products
        // that are 'NOT_ELIGIBLE_OR_DISAPPROVED'.
        $query = "SELECT offer_id, id, title, price FROM product_view"
            . " WHERE aggregated_reporting_context_status = 'NOT_ELIGIBLE_OR_DISAPPROVED'";
        // Create the search report request.
        $request = new SearchRequest([
            'parent' => $parent,
            'query' => $query
        ]);
        print "Sending search report request for Product View.\n";
        // Calls the Reports.search API method.
        try {
            $response = $reportServiceClient->search($request);
            print "Received search reports response: \n";
            // Iterates over all report rows in all pages.
            // The client library automatically handles pagination.
            foreach ($response->iterateAllElements() as $row) {
                print "Printing data from Product View:\n";
                // Prints the ReportRow object as a JSON string.
                print $row->serializeToJsonString() . "\n";
                // Get the full product resource name from the report row.
                // The `id` field in ProductView is the product's full resource name.
                // Format: `accounts/{account}/products/{product}`
                $productName = $parent . "/products/" . $row->getProductView()->getId();
                // OPTIONAL: Call getProduct to retrieve and print full product details.
                // Pass the original credentials and config.
                print "Getting full product details by calling GetProduct method:\n";
                self::getProduct($credentials, $config, $productName);
            }
        } catch (ApiException $e) {
            // Prints any errors that occur during the API call.
            printf("ApiException was thrown: %s\n", $e->getMessage());
        }
    }
    /**
     * Helper to execute the sample.
     */
    public function callSample(): void
    {
        $config = Config::generateConfig();
        self::filterDisapprovedProductsSample($config);
    }
}
// Run the script
$sample = new FilterDisapprovedProducts();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_products_v1 import GetProductRequest
from google.shopping.merchant_products_v1 import ProductsServiceClient
from google.shopping.merchant_reports_v1 import ReportServiceClient
from google.shopping.merchant_reports_v1 import SearchRequest
# Read the merchant account ID from the configuration file.
# This is a global variable used by the functions below.
_ACCOUNT_ID = configuration.Configuration().read_merchant_info()
def get_product(credentials, product_name: str):
  """Gets the product details for a given product name.
  Args:
    credentials: The OAuth2 credentials.
    product_name: The full resource name of the product, e.g.,
      "accounts/{account}/products/{product}".
  """
  # Create a Products API client.
  products_service_client = ProductsServiceClient(credentials=credentials)
  # Prepare the GetProduct request.
  # The name has the format: accounts/{account}/products/{productId}
  request = GetProductRequest(name=product_name)
  # Call the API and print the response or any errors.
  try:
    response = products_service_client.get_product(request=request)
    print(response)
  except RuntimeError as e:
    print(f"Failed to get product {product_name}:")
    print(e)
def filter_disapproved_products():
  """Filters disapproved products and prints their details."""
  # Get OAuth2 credentials.
  credentials = generate_user_credentials.main()
  # Create a Report API client.
  report_service_client = ReportServiceClient(credentials=credentials)
  # Construct the parent resource name for the account.
  # The parent has the format: accounts/{accountId}
  parent = f"accounts/{_ACCOUNT_ID}"
  # Define the query to select disapproved products.
  # This query retrieves product information for all disapproved products.
  # aggregated_reporting_context_status can be one of the following values:
  # NOT_ELIGIBLE_OR_DISAPPROVED, ELIGIBLE, PENDING, ELIGIBLE_LIMITED,
  # AGGREGATED_REPORTING_CONTEXT_STATUS_UNSPECIFIED
  query = (
      "SELECT offer_id, id, title, price "
      "FROM product_view "
      "WHERE aggregated_reporting_context_status ="
      "'NOT_ELIGIBLE_OR_DISAPPROVED'"
  )
  # Create the search report request.
  request = SearchRequest(parent=parent, query=query)
  print("Sending search report request for Product View.")
  try:
    # Call the Reports.search API method.
    response = report_service_client.search(request=request)
    print("Received search reports response: ")
    # Iterate over all report rows.
    # The client library automatically handles pagination.
    for row in response:
      print("Printing data from Product View:")
      print(row)
      # Construct the full product resource name using the product_view.id
      # (which is the REST ID like "online~en~GB~123") from the report.
      # The product_view.id from the report is the {product_id} part.
      product_name = (
          f"accounts/{_ACCOUNT_ID}/products/{row.product_view.id}"
      )
      # OPTIONAL, get full product details by calling the GetProduct method.
      print("Getting full product details by calling GetProduct method:")
      get_product(credentials, product_name)
  except RuntimeError as e:
    print(e)
if __name__ == "__main__":
  filter_disapproved_products()
Apps_Script
/**
 * Demonstrates how to filter disapproved products using the Merchant API Reports service.
 */
function filterDisapprovedProducts() {
  // IMPORTANT:
  // Enable the Merchant API Reports sub-API Advanced Service and call it
  // "MerchantApiReports"
  // Enable the Merchant API Products sub-API Advanced Service and call it
  // "MerchantApiProducts"
  // Replace this with your Merchant Center ID.
  const accountId = '<INSERT_MERCHANT_CENTER_ID>';
  // Construct the parent name
  const parent = 'accounts/' + accountId;
  try {
    console.log('Sending search Report request');
    // Set pageSize to the maximum value (default: 1000)
    let pageSize = 1000;
    let pageToken;
    // The query below is an example of a query for the productView that gets product informations
    // for all disapproved products.
    let query = 'SELECT offer_id,' +
        'id,' +
        'price,' +
        'title' +
        ' FROM product_view' +
        ' WHERE aggregated_reporting_context_status = "NOT_ELIGIBLE_OR_DISAPPROVED"';
    // Call the Reports.search API method. Use the pageToken to iterate through
    // all pages of results.
    do {
      response =
          MerchantApiReports.Accounts.Reports.search({query, pageSize, pageToken}, parent);
      for (const reportRow of response.results) {
        console.log("Printing data from Product View:");
        console.log(reportRow);
        // OPTIONALLY, you can get the full product details by calling the GetProduct method.
        let productName = parent + "/products/" + reportRow.getProductView().getId();
        product = MerchantApiProducts.Accounts.Products.get(productName);
        console.log(product);
      }
      pageToken = response.nextPageToken;
    } while (pageToken);  // Exits when there is no next page token.
  } catch (e) {
    console.log('ERROR!');
    console.log('Error message:' + e.message);
  }
}
cURL
curl -X POST "https://merchantapi.googleapis.com/reports/v1/accounts/{ACCOUNT_ID}/reports:search" \
-H "Authorization: Bearer <API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"query": "SELECT offer_id, id, title FROM product_view WHERE aggregated_reporting_context_status =  \"NOT_ELIGIBLE_OR_DISAPPROVED\""
}'