فهرست کردن داده‌های محصول و مشکلات محصول

پس‌از افزودن محصولات به حساب Merchant Center، می‌توانید وضعیت نهایی و پردازش‌شده آن‌ها را، ازجمله وضعیت فعلی و هرگونه مشکل کیفیت داده، بازیابی کنید. این کار به شما امکان می‌دهد موجودی محصولتان را پایش کنید، مشکلات را تشخیص دهید، و درستی‌سنجی کنید که محصولاتتان واجدشرایط نمایش در Google هستند.

این راهنما توضیح می‌دهد که چگونه محصولات خود و مشکلات مرتبط با آن‌ها را بااستفاده از زیرمیاناهای برنامه‌سازی کاربردی Products و Reports فهرست کنید.

پیش‌نیازها

باید در حساب Merchant Center خود محصول داشته باشید. برای آشنایی با نحوه افزودن محصولات، راهنمای افزودن و مدیریت محصولات را ببینید.

ملاحظات ویژه

  • تأخیر پردازش: تأخیری وجود دارد، معمولاً چند دقیقه، بین زمانی که یک productInput درج یا به‌روزرسانی می‌شود و زمانی که تغییرات در product پردازش‌شده نهایی منعکس می‌شوند، همان‌طور که توسط روش‌های بازیابی محصول برگردانده می‌شود.
  • محصولات بدون مقصد: محصولاتی که مقصد موردنظر ندارند تقریباً پس‌از یک هفته به‌طور خودکار برداشته می‌شوند. اگر فهرست destinationStatuses در فیلد productStatus محصول خالی باشد، آن محصول هیچ مقصد موردنظری ندارد. باید به‌طور منظم این وضعیت را بررسی کنید تا از حذف ناخواسته محصولات جلوگیری شود.

فهرست کردن همه محصولات پردازش‌شده

برای دریافت فهرست همه محصولات نهایی و پردازش‌شده‌تان، از روش products.list استفاده کنید. این روش منبع Product را برمی‌گرداند که نشان‌دهنده محصول است، همان‌طور که پس‌از اعمال همه قوانین و ادغام‌های منبع داده در Merchant Center ظاهر می‌شود.

پاسخ صفحه‌بندی شده است. از پارامتر 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.
    const pageSize = 1000;

    console.log('Retrieved products below:');
    // Call the Products.list API method. Use the pageToken to iterate through
    // all pages of results.
    do {
      const 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 برای دریافت نمای کلی سطح بالا از سلامت داده‌های محصولتان، ازجمله خلاصه‌ای از محصولاتتان براساس وضعیت و رایج‌ترین انواع مشکل استفاده کنید. برای اطلاعات بیشتر، مشاهده آمار و مشکلات محصول را ببینید.
  • فیلتر کردن محصولات براساس وضعیت: برای فیلتر کردن محصولات براساس وضعیت، productView را در reports.search پرسمان کنید. برای اطلاعات بیشتر، بخش فیلتر کردن محصولات را ببینید.
  • ارائه مشکلات حساب و محصول برای میانای کاربری: از renderaccountissue و renderproductissue استفاده کنید تا شرح دقیق و قابل‌خواندن برای انسان و پیوند مستندات را برای مشکل خاصی دریافت کنید. از این روش برای تولید میانای کاربری که مشکلات محصول و حساب را به کاربر نهایی نشان می‌دهد استفاده کنید. برای اطلاعات بیشتر، به نمایش مشکلات و راه‌حل‌ها برای کسب‌وکارها مراجعه کنید.
  • فهرست کردن مشکلات حساب: از accountissues.list برای بررسی مشکلاتی که بر کل حساب Merchant Center شما تأثیر می‌گذارند، مانند نقض خط‌مشی، استفاده کنید.

بررسی وضعیت محصول بااستفاده از productStatus

برای بررسی وضعیت محصول، فیلد productStatus را در منبع Product که توسط products.list یا products.get برگردانده شده است بررسی کنید. این فیلد حاوی اطلاعات وضعیت انبوهشی محصول در همه مقصدهای آن است. همچنین حاوی مشکلات مربوط به موجودی‌های (محلی و منطقه‌ای) پیوست‌شده به محصول موردنظر است.

فیلد productStatus شامل موارد زیر است:

  • destinationStatuses: آرایه‌ای که وضعیت تأیید محصول را برای هر مقصد (مانند SHOPPING_ADS) نشان می‌دهد. این آرایه کشورهایی را که محصول در آن‌ها تأییدشده، درانتظار، یا تأییدنشده است فهرست می‌کند.
  • itemLevelIssues: آرایه‌ای حاوی هرگونه مشکل اعتبارسنجی داده یا خط‌مشی که برای محصول پیدا شده است. هر مشکل شامل شرح، شدت، مشخصه تحت‌تأثیر، و اسنادی است که به شما کمک می‌کند آن را حل کنید.

در اینجا نمونه‌ای از productStatus برای محصولی که به‌دلیل GTIN نامعتبر برای آگهی‌های Shopping در ایالات متحده تأیید نشده است آورده شده است:

{
 "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.search از زیرمیانای برنامه‌سازی کاربردی «گزارش‌ها» فیلتر کنید، به‌جای اینکه همه محصولات را فهرست کنید و آن‌ها را در سمت خودتان فیلتر کنید.

برای مثال، برای بازیابی فهرستی از محصولات تأییدنشده‌تان، می‌توانید یک پُرسمان reports.search در جدول ProductView بسازید تا محصولاتی را انتخاب کنید که 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 "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)
    const pageSize = 1000;
    let pageToken;
    // The query below is an example of a query for the productView that gets product informations
    // for all disapproved products.
    const 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 {
      const 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.
        const productName = parent + '/products/' + reportRow.getProductView().getId();
        const 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\""
}'