Merchant API code sample to list products.

### C#

    // Copyright 2025 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.

    using System;
    using static MerchantApi.Authenticator;
    using Google.Api.Gax;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Auth.OAuth2.Flows;
    using Google.Apis.Auth.OAuth2.Responses;
    using Google.Apis.Http;
    using Newtonsoft.Json;
    using Google.Shopping.Merchant.Products.V1;


    namespace MerchantApi
    {
        public class ListProductsSample
        {
            public void ListProducts(string merchantId)
            {
                Console.WriteLine("=================================================================");
                Console.WriteLine("Listing all Products");
                Console.WriteLine("=================================================================");

                // Authenticate using either oAuth or service account
                ICredential auth = Authenticator.Authenticate(
                    MerchantConfig.Load(),
                    ProductsServiceClient.DefaultScopes[0]);

                // Create client
                ProductsServiceSettings productsServiceSettings = ProductsServiceSettings.GetDefault();

                // Create the ProductsServiceClient with the credentials
                ProductsServiceClientBuilder productsServiceClientBuilder = new ProductsServiceClientBuilder
                {
                    Credential = auth
                };
                ProductsServiceClient client = productsServiceClientBuilder.Build();

                // Initialize the parent
                // The parent has the format: accounts/{account}
                AccountName parent = AccountName.FromAccount(merchantId);
                Console.WriteLine($"Listing products for account: {parent}");

                // Initialize request argument(s)
                ListProductsRequest request = new ListProductsRequest
                {
                    Parent = parent.ToString(),
                    PageSize = 1000 // Optional: specify the maximum number of products to return per page
                };

                // List all products in the account
                // Note: The API may return fewer than 1000 products
                PagedEnumerable<ListProductsResponse, Product> response = client.ListProducts(request);
                // Print the paginated results. This automatically handles pagination
                // and retrieves all products in the account.
                foreach (ListProductsResponse page in response.AsRawResponses())
                {
                    Console.WriteLine("A page of results:");
                    foreach (Product item in page)
                    {
                        // Pretty print the products
                        Console.WriteLine(JsonConvert.SerializeObject(item, Formatting.Indented));

                    }
                }
            }


            internal static void Main(string[] args)
            {
                var config = MerchantConfig.Load();
                string merchantId = config.MerchantId.Value.ToString();
                var sample = new ListProductsSample();
                sample.ListProducts(merchantId);
            }
        }
    }

### AppsScript

    // Copyright 2025 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.


    /**
     * 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);
      }
    }

### Java

    // Copyright 2024 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.

    package shopping.merchant.samples.products.v1;
    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);
      }
    }

### Node.js

    // Copyright 2025 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     https://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.

    'use strict';
    const fs = require('fs');
    const authUtils = require('../../authentication/authenticate.js');
    const {ProductsServiceClient} = require('@google-shopping/products').v1;

    /**
     * Lists all products for a given merchant.
     */
    async function main() {
      try {
        const config = authUtils.getConfig();

        // Read merchant_id from merchant-info.json
        const merchant_info = JSON.parse(
          fs.readFileSync(config.merchantInfoFile, 'utf8'),
        );
        const merchant_id = merchant_info.merchantId;

        // Construct parent. Parent is in the format of accounts/{merchant_id}
        const parent = 'accounts/' + merchant_id;

        // Get credentials
        const authClient = await authUtils.getOrGenerateUserCredentials();

        // Create options object for the client
        const options = {authClient: authClient};

        // Create client
        const productsClient = new ProductsServiceClient(options);

        // Construct request. Set the page size to the maximum value.
        const request = {
          parent: parent,
          pageSize: 1000,
        };

        // Run request
        const iterable = productsClient.listProductsAsync(request);
        for await (const response of iterable) {
          console.log(response);
        }
      } catch (error) {
        console.error(error.message);
      }
    }

    main();

### PHP

    <?php
    /**
     * Copyright 2024 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    require_once __DIR__ . '/../../../vendor/autoload.php';
    require_once __DIR__ . '/../../Authentication/Authentication.php';
    require_once __DIR__ . '/../../Authentication/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

    # -*- coding: utf-8 -*-
    # Copyright 2024 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    """A module to list Products."""

    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()